Skip to content

Commit

Permalink
Merge pull request #2052 from alicevision/dev/imageSemanticIcon3D
Browse files Browse the repository at this point in the history
[ui] Display an icon on nodes that have viewable 3D outputs
  • Loading branch information
fabiencastan committed Jun 14, 2023
2 parents 0c137a1 + b5638fe commit 73b9ccf
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 13 deletions.
18 changes: 17 additions & 1 deletion meshroom/core/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -1124,11 +1124,27 @@ def canBeCanceled(self):
self.globalExecMode == "LOCAL" and self.statusInThisSession())

def hasImageOutputAttribute(self):
"""
Return True if at least one attribute has the 'image' semantic (and can thus be loaded in the 2D Viewer), False otherwise.
"""
for attr in self._attributes:
if attr.enabled and attr.isOutput and attr.desc.semantic == "image":
return True
return False

def has3DOutputAttribute(self):
"""
Return True if at least one attribute is a File that can be loaded in the 3D Viewer, False otherwise.
"""
# List of supported extensions, taken from Viewer3DSettings
supportedExts = ['.obj', '.stl', '.fbx', '.gltf', '.abc']
for attr in self._attributes:
# If the attribute is a File attribute, it is an instance of str and can be iterated over
hasSupportedExt = isinstance(attr.value, str) and any(ext in attr.value for ext in supportedExts)
if attr.enabled and attr.isOutput and hasSupportedExt:
return True
return False


name = Property(str, getName, constant=True)
nodeType = Property(str, nodeType.fget, constant=True)
Expand Down Expand Up @@ -1174,7 +1190,7 @@ def hasImageOutputAttribute(self):

outputAttrEnabledChanged = Signal()
hasImageOutput = Property(bool, hasImageOutputAttribute, notify=outputAttrEnabledChanged)

has3DOutput = Property(bool, has3DOutputAttribute, notify=outputAttrEnabledChanged)

class Node(BaseNode):
"""
Expand Down
13 changes: 10 additions & 3 deletions meshroom/ui/qml/GraphEditor/Node.qml
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,8 @@ Item {

MaterialLabel {
id: nodeImageOutput
visible: node.hasImageOutput && ["SUCCESS"].includes(node.globalStatus) && node.chunks.count > 0
visible: (node.hasImageOutput || node.has3DOutput)
&& ["SUCCESS"].includes(node.globalStatus) && node.chunks.count > 0
text: MaterialIcons.visibility
padding: 2
font.pointSize: 7
Expand All @@ -317,8 +318,14 @@ Item {
id: nodeImageOutputTooltip
parent: header
visible: nodeImageOutputMA.containsMouse && nodeImageOutput.visible
text: "This node has at least one output that can be loaded in the 2D Viewer.\n" +
"Double-clicking on this node will load it in the 2D Viewer."
text: {
if (node.hasImageOutput && !node.has3DOutput)
return "Double-click on this node to load its outputs in the Image Viewer."
else if (node.has3DOutput && !node.hasImageOutput)
return "Double-click on this node to load its outputs in the 3D Viewer."
else // Handle case where a node might have both 2D and 3D outputs
return "Double-click on this node to load its outputs in the Image or 3D Viewer."
}
implicitWidth: 500
delay: 300

Expand Down
10 changes: 1 addition & 9 deletions meshroom/ui/qml/Viewer/Viewer2D.qml
Original file line number Diff line number Diff line change
Expand Up @@ -181,15 +181,7 @@ FocusScope {
}

// node must have at least one output attribute with the image semantic
var hasImageOutputAttr = false;
for (var i = 0; i < node.attributes.count; i++) {
var attr = node.attributes.at(i);
if (attr.isOutput && attr.desc.semantic === "image" && attr.enabled) {
hasImageOutputAttr = true;
break;
}
}
if (!hasImageOutputAttr) {
if (!node.hasImageOutput) {
return false;
}

Expand Down

0 comments on commit 73b9ccf

Please sign in to comment.