Skip to content

Commit

Permalink
Merge pull request #60 from kwokcb/definition_creation_fixes
Browse files Browse the repository at this point in the history
Definition Creation Fixes
  • Loading branch information
manuelkoester authored Apr 20, 2024
2 parents 6f49742 + 7abb257 commit 0f73f0d
Showing 1 changed file with 72 additions and 19 deletions.
91 changes: 72 additions & 19 deletions src/QuiltiX/quiltix.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
QDialogButtonBox,
QGridLayout,
QSizePolicy,
QComboBox,
)

from pxr import UsdShade, Usd
Expand Down Expand Up @@ -275,7 +276,7 @@ def apply_material(self, mat_type, selection=False):
def save_as_definition(self):
action = self.save_def_cmd.qaction
node = self.qx_node_graph.get_node_by_id(action.node_id)
dlg_save = SaveDefinitionDialog(node, self)
dlg_save = SaveDefinitionDialog(node, self.qx_node_graph.mx_library_doc, self)
dlg_save.signal_saved_def.connect(self.on_defitintion_saved)
dlg_save.show()

Expand Down Expand Up @@ -763,20 +764,43 @@ class SaveDefinitionDialog(QDialog):

signal_saved_def = QtCore.Signal(object)

def __init__(self, node, parent):
def build_category(self, mx_def):
category_string = 'NODE_' + mx_def.getNodeString() + '_VERSION_' + mx_def.getVersionString()
for input in mx_def.getActiveInputs():
category_string += 'IN_' + input.getName() + '_' + input.getType()
for output in mx_def.getActiveOutputs():
category_string += 'OUT_' + output.getName() + '_' + output.getType()
return category_string

def setup_definition_dict(self):
self.categories = set()
self.nodegroups = set()
mx_defs = self.mx_library_doc.getNodeDefs()
for mx_def in mx_defs:
self.categories.add(self.build_category(mx_def))
self.nodegroups.add(mx_def.getNodeGroup())
self.nodegroups = sorted(self.nodegroups, key=lambda x: x.lower())

def __init__(self, node, mx_library_doc, parent):
super(SaveDefinitionDialog, self).__init__(parent)
self.node = node
self.mx_library_doc = mx_library_doc
self.setup_definition_dict()
self.setup_ui()

def category_exists(self, mx_def):
return self.build_category(mx_def) in self.categories

def setup_ui(self):
self.setWindowTitle("Save Node Definition")

self.l_nodegroup = QLabel("Node Group:")
self.e_nodegroup = QComboBox()
self.e_nodegroup.addItems(self.nodegroups)
self.l_category = QLabel("Category:")
self.e_category = QLineEdit("Custom")
self.l_name = QLabel("Name:")
self.e_name = QLineEdit(self.node.NODE_NAME)
self.e_category = QLineEdit(self.node.NODE_NAME)
self.l_path = QLabel("Save Path: ")
path = os.path.join(os.environ["USERPROFILE"], "custom_mtlx_defs", self.node.NODE_NAME + ".mtlx")
path = os.path.join(os.environ["USERPROFILE"], "custom_mtlx_defs", self.node.NODE_NAME+ ".mtlx")
self.e_path = QLineEdit(path)
self.b_path = QPushButton("...")
self.bb_main = QDialogButtonBox()
Expand All @@ -786,32 +810,34 @@ def setup_ui(self):
self.bb_main.accepted.connect(self.on_accepted)
self.bb_main.rejected.connect(self.reject)

self.e_category.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
self.e_nodegroup.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)

self.lo_main = QGridLayout(self)
self.lo_main.addWidget(self.l_category, 0, 0)
self.lo_main.addWidget(self.e_category, 0, 1, 1, 3)
self.lo_main.addWidget(self.l_name, 1, 0)
self.lo_main.addWidget(self.e_name, 1, 1, 1, 3)
self.lo_main.addWidget(self.l_nodegroup, 0, 0)
self.lo_main.addWidget(self.e_nodegroup, 0, 1, 1, 3)
self.lo_main.addWidget(self.l_category, 1, 0)
self.lo_main.addWidget(self.e_category, 1, 1, 1, 3)
self.lo_main.addWidget(self.l_path, 2, 0)
self.lo_main.addWidget(self.e_path, 2, 1, 1, 2)
self.lo_main.addWidget(self.b_path, 2, 3)
self.lo_main.setRowStretch(3, 100)
self.lo_main.setColumnStretch(1, 100)
self.lo_main.addWidget(self.bb_main, 4, 2, 1, 2)
self.e_name.setFocus()
self.e_category.setFocus()

def sizeHint(self):
return QtCore.QSize(580, 175)

def on_accepted(self):
nodegroup = self.e_category.text()
def on_accepted(self):

# get nodegroup from e_nodegroup QComboBox
nodegroup = self.e_nodegroup.currentText()
if not nodegroup:
QMessageBox.warning(self, "Warning", "Invalid category.")
return

nodename = self.e_name.text()
if not nodegroup:
nodename = self.e_category.text()
if not nodename:
QMessageBox.warning(self, "Warning", "Invalid name.")
return

Expand All @@ -820,7 +846,6 @@ def on_accepted(self):
QMessageBox.warning(self, "Warning", "Invalid Save Path.")
return

node_name = self.node.NODE_NAME
doc = mx.createDocument()

graph_doc = mx.createDocument()
Expand All @@ -833,7 +858,7 @@ def on_accepted(self):
version = "1.0.0"
defaultversion = False
nodedefName = 'ND_' + nodename
nodegraphName = 'NG_' + nodename # not working?
nodegraphName = 'NG_' + nodename
ng.setName(nodegraphName)

definition = doc.addNodeDefFromGraph(
Expand All @@ -845,20 +870,48 @@ def on_accepted(self):
nodegroup,
nodegraphName
)

if self.category_exists(definition):
# Warn but allow to continue
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Warning)
msgBox.setText("This category already exists!")
msgBox.setWindowTitle("Warning")
msgBox.addButton('Proceed', QMessageBox.AcceptRole)
cancelButton = msgBox.addButton('Abort', QMessageBox.RejectRole)
msgBox.exec()
if msgBox.clickedButton() == cancelButton:
return

ng = doc.getNodeGraph(nodegraphName)

ng_input_names = []
for ng_input in ng.getInputs():
ndef_input = definition.addInput(ng_input.getName(), ng_input.getType())
ng_input_name = ng_input.getName()
ng_input_names.append(ng_input_name)
ndef_input = definition.addInput(ng_input_name, ng_input.getType())
if ndef_input:
ndef_input.copyContentFrom(ng_input)
ndef_input.setSourceUri('')
for ng_input_name in ng_input_names:
ng.removeInput(ng_input_name)

defDoc = mx.createDocument()
newDef = defDoc.addNodeDef(definition.getName(), '', definition.getCategory())
newDef.copyContentFrom(definition)
newGraph = defDoc.addNodeGraph(ng.getName())
newGraph.copyContentFrom(ng)

treeIter = defDoc.traverseTree()
for elem in treeIter:
elem.removeAttribute('xpos')
elem.removeAttribute('ypos')

result = defDoc.validate()
if (result[0] == False):
QMessageBox.warning(self, "Warning", "Definition created is invalid.")
return

outdir = os.path.dirname(outpath)
if not os.path.exists(outdir):
os.makedirs(outdir)
Expand Down

0 comments on commit 0f73f0d

Please sign in to comment.