Skip to content
This repository has been archived by the owner on Feb 18, 2023. It is now read-only.

Commit

Permalink
Merge Dev in Master (V 0.0.3)
Browse files Browse the repository at this point in the history
This pull request contain commits for the V 0.0.3 update.

Release note:
- Fixing wrong group pivot in Maya.
- Fixing error when Popup is displayed on preference save.
- Now objects can be replaced with a newer version.
- Support for icons for PySide1.
- Fixing logging messages displayed two times.
- Load assigned assets to shot from Kitsu on shot setup.
  • Loading branch information
PiloeGAO authored May 19, 2021
2 parents 746ac75 + 98feb7b commit 2c62348
Show file tree
Hide file tree
Showing 44 changed files with 854 additions and 147 deletions.
8 changes: 6 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,13 @@ ENV/
env.bak/
venv.bak/
venv27_win64/
venv27_osx64
venv27_osx64/
venv27_macos64/
venv27_linux64/
venv38_win64/
venv38_osx64
venv38_osx64/
venv38_macos64/
venv38_linux64/

# Spyder project settings
.spyderproject
Expand Down
5 changes: 4 additions & 1 deletion Hestia/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,14 @@
print("Not executed in package.")
sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))

from Hestia.core.manager import Manager
from Hestia.mainWindow import MainWindow

app = QApplication(sys.argv)

window = MainWindow()
manager = Manager(integration="standalone")

window = MainWindow(manager=manager)
window.show()

sys.exit(app.exec_())
21 changes: 20 additions & 1 deletion Hestia/core/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,16 @@ def __init__(self, manager, entityType = "Assets", id = "", name = "", descripti
self.__frameNumber = 0
if("frameNumber" in kwargs):
self.__frameNumber = int(kwargs["frameNumber"])
self.__assignedAssets = kwargs["assignedAssets"] if "assignedAssets" in kwargs else []

@property
def type(self):
"""Get the type of entity.
Returns:
str: Entity type.
"""
return self.__type

@property
def id(self):
Expand Down Expand Up @@ -130,4 +140,13 @@ def frameNumber(self):
Returns:
int: Shot duration.
"""
return self.__frameNumber
return self.__frameNumber

@property
def assignedAssets(self):
"""Get assigned to the shot.
Returns:
list: str: Assets IDs.
"""
return self.__assignedAssets
49 changes: 45 additions & 4 deletions Hestia/core/links/dccs/mayaIntegration.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,42 @@ def loadAsset(self, asset=None, version=None):
self.__manager.logging.error("File not found.")
return False

# Looking for asset replacement.
currentSelection = cmds.ls(sl=True)
if(len(currentSelection) > 0):
currentSelection = currentSelection[0]
if(cmds.attributeQuery("isHestiaAsset", node=currentSelection, exists=True)):
if(cmds.getAttr(currentSelection+".hestiaAssetID") == str(asset.id)):
if(cmds.objectType(currentSelection) == "reference" and self.isInstanceImport(version=version)):
# Updating reference is done with the file function. From: https://stackoverflow.com/a/44718215
referenceToUpdate = cmds.referenceQuery(currentSelection, referenceNode=True)
cmds.file(version.outputPath, loadReference=referenceToUpdate)
elif(cmds.objectType(currentSelection) == "transform" and not self.isInstanceImport(version=version)):
# Delete objects inside of the selected group.
oldObjects = cmds.listRelatives(currentSelection, children=True)
cmds.delete(oldObjects)

# Importing the asset and getting the transform node.
before = set(cmds.ls(type="transform"))

self.importAsset(asset=asset, version=version)

after = set(cmds.ls(type="transform"))
imported = after - before

# Reparent new objects.
cmds.parent(imported, currentSelection, relative=True)

#Rename each object to avoid duplication on second import.
for object in imported:
cmds.rename(object, "%s_%s" % (currentSelection, object))
else:
self.__manager.logging.warning("Reference and traditional import can't be mixed together.")
return False

return True

# If nothing is selected or asset isn't the same, start import procedure.
currentAsset = None
# Create a group that will contain asset except for instances.
if(not self.isInstanceImport(version=version)):
Expand All @@ -101,12 +137,18 @@ def loadAsset(self, asset=None, version=None):
imported = after - before

staticAsset = 1
groupName = asset.name
groupName = asset.name.replace(" ", "_").replace("-", "_")

while(cmds.objExists(groupName)):
while(cmds.objExists(groupName) or groupName in cmds.namespaceInfo(listNamespace=True)):
groupName = groupName + "_bis"

cmds.group(imported, n=groupName)
# Group need to be created as empty to make sure pivot is in the center of the scene.
cmds.group(empty=True, name=groupName, absolute=True)
cmds.parent(imported, groupName, relative=True)

#Rename each object to avoid duplication on second import.
for object in imported:
cmds.rename(object, "%s_%s" % (groupName, object))

cmds.select(groupName, r=True)
currentAsset = cmds.ls(sl=True)[0]
Expand All @@ -129,7 +171,6 @@ def loadAsset(self, asset=None, version=None):
cmds.getAttr(currentAsset + ".locked")
cmds.lockNode(currentAsset,q=1,lock=1)
cmds.lockNode(currentAsset,lock=0)


# Setting needed attributes for shot assembly.
cmds.addAttr(attributeType="bool", hidden=0,
Expand Down
6 changes: 5 additions & 1 deletion Hestia/core/links/projectManagers/kitsuWrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,9 @@ def getDatasFromProject(self, project):
if(nb_frames == 0 and
shotData["frame_in"] != None and shotData["frame_out"] != None):
nb_frames = int(shotData["frame_out"]) - int(shotData["frame_in"])

# Get Assets assigned in the shot.
assignedAssets = [str(asset["id"]) for asset in gazu.asset.all_assets_for_shot(shotData)]

# Output versionning.
versions = self.getVersions(shotData)
Expand All @@ -186,7 +189,8 @@ def getDatasFromProject(self, project):
description=shot["description"],
icon="",
versions=versions,
frameNumber=nb_frames)
frameNumber=nb_frames,
assignedAssets=assignedAssets)

shotSequence = [sequence for sequence in newProject.categories if sequence.name == shotData["sequence_name"]][0]
shotSequence.addEntity(newShot)
Expand Down
3 changes: 0 additions & 3 deletions Hestia/core/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,6 @@ def __init__(self, integration = "standalone", projects = [Project(name="local",
self.__preferences.generatePreferences()
self.__preferences.savePreferences()

# Setting up the logging display.
logging.basicConfig(format="HESTIA | %(levelname)s @ %(asctime)s | %(message)s")

self.__debugMode = bool(int(self.__preferences.getValue("MANAGER", "debugMode")))

# Initialize the custom logging system.
Expand Down
17 changes: 16 additions & 1 deletion Hestia/core/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,4 +185,19 @@ def addCategory(self, newCategory):
Args:
newCategory (class: "Category"): New category to add.
"""
self.__categories.append(newCategory)
self.__categories.append(newCategory)

@property
def entities(self):
"""Get all entities stored in the project.
Returns:
list:`class:Entity`: Entities from the project.
"""
# TODO: Move to comprehensive list.
entities = []
if(len(self.categories) > 0):
for category in self.categories:
for entity in category.entities:
entities.append(entity)
return entities
10 changes: 5 additions & 5 deletions Hestia/dccs/maya/scripts/launchHestiaBrowser.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from maya import OpenMayaUI
from shiboken2 import wrapInstance
from PySide2 import QtWidgets
from PySide2 import QtWidgets, QtCore

from Hestia.mainWindow import MainWindow
from Hestia.core.manager import Manager
Expand All @@ -19,7 +19,7 @@ def launchBrowser():
ptr = OpenMayaUI.MQtUtil.mainWindow()
mainWindow = wrapInstance(long(ptr), QtWidgets.QWidget)

hestiaManager = Manager(integration="Maya")

browser = MainWindow(manager=hestiaManager)
browser.show()
browser = MainWindow(manager=Manager(integration="Maya"), parent=mainWindow)
browser.setWindowFlags(QtCore.Qt.Window)
browser.show()
browser = None
19 changes: 13 additions & 6 deletions Hestia/loginWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@
"""
import os

global pysideVers
try:
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
pysideVers = 2
except:
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtCore import *
from PySide.QtGui import *
pysideVers = 1

from .ui.widgets.lineEdit import LineEdit
from .ui.widgets.iconButton import IconButton
Expand Down Expand Up @@ -98,7 +101,11 @@ def initUI(self):
self.mainLayout.addWidget(self.errorLabel, 4, 0)

# Create the login button.
self.loginButton = IconButton(name="Login", description="Login", iconPath=self.__rootPath + "/ui/icons/check-square.svg", iconScale=64, status=1, functionToInvoke=self.login)
if(pysideVers == 2):
iconPath = self.__rootPath + "/ui/icons/check-square.svg"
else:
iconPath = self.__rootPath + "/ui/icons/check-square.png"
self.loginButton = IconButton(name="Login", description="Login", iconPath=iconPath, iconScale=64, status=1, functionToInvoke=self.login)
self.mainLayout.addWidget(self.loginButton, 5, 0)

# Set main layout to the window.
Expand Down
31 changes: 14 additions & 17 deletions Hestia/mainWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,31 @@
:brief: Class to create the main window based on QtWidgets.
"""
try:
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
except:
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtCore import *
from PySide.QtGui import *

from .core.manager import Manager
from .core.manager import Manager

from .loginWindow import LoginWindow
from .preferencesWindow import PreferencesWindow
from .loginWindow import LoginWindow
from .preferencesWindow import PreferencesWindow

from .ui.header import Header
from .ui.folderTreeView import FolderTreeView
from .ui.contentView import ContentView
from .ui.footer import Footer
from .ui.header import Header
from .ui.folderTreeView import FolderTreeView
from .ui.contentView import ContentView
from .ui.footer import Footer

class MainWindow(QWidget):
"""Main Window class.
Args:
manager (class: "Manager", optional): Manager of Hestia. Defaults to Manager().
mode (str, optional): Manager mode. Defaults to "local".
winW (int, optional): Window width. Defaults to 640.
winH (int, optional): Window height. Defaults to 480.
manager (class: "Manager"): Manager of Hestia.
parent (class: "QtWidgets", optional): PyQt parent. Defaults to None.
"""
def __init__(self, manager=Manager(integration="standalone"), parent=None):
def __init__(self, manager, parent=None):
super(MainWindow, self).__init__(parent=parent)
# Defining the Manager.
self.__manager = manager
Expand Down
22 changes: 11 additions & 11 deletions Hestia/preferencesWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@
:brief: Class to create the preferences window based on QtWidgets.
"""
try:
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
except:
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtCore import *
from PySide.QtGui import *

from .ui.widgets.dropDown import DropDown

Expand All @@ -20,8 +20,6 @@ class PreferencesWindow(QWidget):
Args:
manager (class: "Manager", optional): Manager of Hestia. Defaults to Manager().
winW (int, optional): Window width. Defaults to 640.
winH (int, optional): Window height. Defaults to 480.
parent (class: "QtWidgets", optional): PyQt parent. Defaults to None.
"""
def __init__(self, manager, parent=None):
Expand Down Expand Up @@ -91,9 +89,11 @@ def savePreferences(self):
self.__manager.preferences.setValue("MANAGER", "loadPreviews", str(int(self.loadPreviews.isChecked())))
self.__manager.preferences.savePreferences()

# Shwo information message.
infoPopup = QMessageBox("Hestia | Warning")
infoPopup.setText("Please restart Hestia.")
infoPopup.exec_()
# Show information message.
QMessageBox.warning(self, self.tr("Hestia"),
self.tr("Preferences has been modified.\n" + \
"Please restart Hestia."),
QMessageBox.NoButton,
QMessageBox.Ok)

self.hide()
10 changes: 5 additions & 5 deletions Hestia/ui/contentView.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
import os

try:
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
except:
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtCore import *
from PySide.QtGui import *

from ..core.category import Category

Expand Down
10 changes: 5 additions & 5 deletions Hestia/ui/folderTreeView.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@
:brief: Class to create the folder tree of the window.
"""
try:
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
except:
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtCore import *
from PySide.QtGui import *

from .widgets.dropDown import DropDown
from .widgets.categoryWidget import CategoryWidget
Expand Down
Loading

0 comments on commit 2c62348

Please sign in to comment.