Skip to content

Commit 89095c7

Browse files
committed
[core] attribute & desc: Introduce GeometryAttribute & update ShapeAttribute
1 parent e13747c commit 89095c7

File tree

12 files changed

+552
-455
lines changed

12 files changed

+552
-455
lines changed

meshroom/core/attribute.py

Lines changed: 148 additions & 109 deletions
Large diffs are not rendered by default.

meshroom/core/desc/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,14 @@
1111
PushButtonParam,
1212
StringParam,
1313
)
14+
from .geometryAttribute import (
15+
Geometry,
16+
Size2d,
17+
Vec2d,
18+
)
1419
from .shapeAttribute import (
1520
Shape,
1621
ShapeList,
17-
Size2d,
1822
Point2d,
1923
Line2d,
2024
Rectangle,
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from meshroom.core.desc import GroupAttribute, FloatParam
2+
3+
class Geometry(GroupAttribute):
4+
"""
5+
Base attribute for all Geometry attribute.
6+
Countains several attributes (inherit from GroupAttribute).
7+
"""
8+
def __init__(self, groupDesc, name, label, description, group="allParams", advanced=False, semantic="",
9+
enabled=True, visible=True, exposed=False):
10+
# GroupAttribute constructor
11+
super(Geometry, self).__init__(groupDesc=groupDesc, name=name, label=label, description=description,
12+
group=group, advanced=advanced, semantic=semantic,
13+
enabled=enabled, visible=visible, exposed=exposed)
14+
15+
def getInstanceType(self):
16+
"""
17+
Return the correct Attribute instance corresponding to the description.
18+
"""
19+
# Import within the method to prevent cyclic dependencies
20+
from meshroom.core.attribute import GeometryAttribute
21+
return GeometryAttribute
22+
23+
class Size2d(Geometry):
24+
"""
25+
Size2d is a Geometry attribute that allows to specify a 2d size.
26+
"""
27+
def __init__(self, name, label, description, width, height, widthRange=None, heightRange=None,
28+
keyable=False, keyType=None, group="allParams", advanced=False, semantic="",
29+
enabled=True, visible=True, exposed=False):
30+
# Geometry group desciption
31+
groupDesc = [
32+
FloatParam(name="width", label="Width", description="Width size.", value=width, range=widthRange,
33+
keyable=keyable, keyType=keyType, group=group, advanced=advanced,
34+
enabled=enabled, visible=visible, exposed=exposed),
35+
FloatParam(name="height", label="Height", description="Height size.", value=height, range=heightRange,
36+
keyable=keyable, keyType=keyType, group=group, advanced=advanced,
37+
enabled=enabled, visible=visible, exposed=exposed)
38+
]
39+
# GeometryAttribute constructor
40+
super(Size2d, self).__init__(groupDesc, name, label, description, group=None, advanced=advanced,
41+
semantic=semantic, enabled=enabled, visible=visible, exposed=exposed)
42+
43+
class Vec2d(Geometry):
44+
"""
45+
Vec2d is a Geometry attribute that allows to specify a 2d vector.
46+
"""
47+
def __init__(self, name, label, description, x, y, xRange=None, yRange=None,
48+
keyable=False, keyType=None, group="allParams", advanced=False, semantic="",
49+
enabled=True, visible=True, exposed=False):
50+
# Geometry group desciption
51+
groupDesc = [
52+
FloatParam(name="x", label="X", description="X coordinate.", value=x, range=xRange,
53+
keyable=keyable, keyType=keyType, group=group, advanced=advanced,
54+
enabled=enabled, visible=visible, exposed=exposed),
55+
FloatParam(name="y", label="Y", description="Y coordinate.", value=y, range=yRange,
56+
keyable=keyable, keyType=keyType, group=group, advanced=advanced,
57+
enabled=enabled, visible=visible, exposed=exposed)
58+
]
59+
# GeometryAttribute constructor
60+
super(Vec2d, self).__init__(groupDesc, name, label, description, group=None, advanced=advanced,
61+
semantic=semantic, enabled=enabled, visible=visible, exposed=exposed)
Lines changed: 43 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
1-
from meshroom.core.desc import ListAttribute, GroupAttribute, FloatParam
1+
from meshroom.core.desc import ListAttribute, GroupAttribute, StringParam, FloatParam, Geometry, Size2d, Vec2d
22

33
class Shape(GroupAttribute):
44
"""
55
Base attribute for all Shape attribute.
66
Countains several attributes (inherit from GroupAttribute).
77
"""
8-
def __init__(self, groupDesc, name, label, description, group="allParams", advanced=False, semantic="",
8+
def __init__(self, geometryGroupDesc, name, label, description, group="allParams", advanced=False, semantic="",
99
enabled=True, visible=True, exposed=False):
10+
# Shape group desciption
11+
groupDesc = [
12+
StringParam(name="userName", label="User Name", description="User shape name.", value="",
13+
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed),
14+
StringParam(name="userColor", label="User Color", description="User shape color.", value="#2a82da",
15+
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed),
16+
Geometry(geometryGroupDesc, name="geometry", label="Geometry", description="Shape geometry.",
17+
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed)
18+
]
1019
# GroupAttribute constructor
1120
super(Shape, self).__init__(groupDesc=groupDesc, name=name, label=label, description=description,
1221
group=group, advanced=advanced, semantic=semantic,
@@ -40,42 +49,23 @@ def getInstanceType(self):
4049
from meshroom.core.attribute import ShapeListAttribute
4150
return ShapeListAttribute
4251

43-
class Size2d(Shape):
44-
"""
45-
Size2d is a Shape attribute that allows to specify a 2d size.
46-
Note: This attribute is not displayable.
47-
"""
48-
def __init__(self, name, label, description, keyable=False, keyType=None,
49-
group="allParams", advanced=False, semantic="",
50-
enabled=True, visible=True, exposed=False):
51-
# Shape group desciption
52-
groupDesc = [
53-
FloatParam(name="width", label="Width", description="Width size.", value=-1.0, keyable=keyable, keyType=keyType,
54-
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed),
55-
FloatParam(name="height", label="Height", description="Height size.", value=-1.0, keyable=keyable, keyType=keyType,
56-
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed)
57-
]
58-
# ShapeAttribute constructor
59-
super(Size2d, self).__init__(groupDesc, name, label, description, group=None, advanced=advanced, semantic=semantic,
60-
enabled=enabled, visible=visible, exposed=exposed)
61-
6252
class Point2d(Shape):
6353
"""
6454
Point2d is a Shape attribute that allows to display and modify a 2d point.
6555
"""
6656
def __init__(self, name, label, description, keyable=False, keyType=None,
6757
group="allParams", advanced=False, semantic="",
6858
enabled=True, visible=True, exposed=False):
69-
# Shape group desciption
70-
groupDesc = [
59+
# Geometry group desciption
60+
geometryGroupDesc = [
7161
FloatParam(name="x", label="X", description="X coordinate.", value=-1.0, keyable=keyable, keyType=keyType,
7262
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed),
7363
FloatParam(name="y", label="Y", description="Y coordinate.", value=-1.0, keyable=keyable, keyType=keyType,
7464
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed)
7565
]
7666
# ShapeAttribute constructor
77-
super(Point2d, self).__init__(groupDesc, name, label, description, group=None, advanced=advanced, semantic=semantic,
78-
enabled=enabled, visible=visible, exposed=exposed)
67+
super(Point2d, self).__init__(geometryGroupDesc, name, label, description, group=None, advanced=advanced,
68+
semantic=semantic, enabled=enabled, visible=visible, exposed=exposed)
7969

8070
class Line2d(Shape):
8171
"""
@@ -84,16 +74,16 @@ class Line2d(Shape):
8474
def __init__(self, name, label, description, keyable=False, keyType=None,
8575
group="allParams", advanced=False, semantic="",
8676
enabled=True, visible=True, exposed=False):
87-
# Shape group desciption
88-
groupDesc = [
89-
Point2d(name="a", label="A", description="Line A point.", keyable=keyable, keyType=keyType,
90-
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed),
91-
Point2d(name="b", label="B", description="Line B point.", keyable=keyable, keyType=keyType,
92-
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed)
77+
# Geometry group desciption
78+
geometryGroupDesc = [
79+
Vec2d(name="a", label="A", description="Line A point.", x=-1.0, y=-1.0, keyable=keyable, keyType=keyType,
80+
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed),
81+
Vec2d(name="b", label="B", description="Line B point.", x=-1.0, y=-1.0, keyable=keyable, keyType=keyType,
82+
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed)
9383
]
9484
# ShapeAttribute constructor
95-
super(Line2d, self).__init__(groupDesc, name, label, description, group=None, advanced=advanced, semantic=semantic,
96-
enabled=enabled, visible=visible, exposed=exposed)
85+
super(Line2d, self).__init__(geometryGroupDesc, name, label, description, group=None, advanced=advanced,
86+
semantic=semantic, enabled=enabled, visible=visible, exposed=exposed)
9787

9888
class Rectangle(Shape):
9989
"""
@@ -102,16 +92,18 @@ class Rectangle(Shape):
10292
def __init__(self, name, label, description, keyable=False, keyType=None,
10393
group="allParams", advanced=False, semantic="",
10494
enabled=True, visible=True, exposed=False):
105-
# Shape group desciption
106-
groupDesc = [
107-
Point2d(name="center", label="Center", description="Rectangle center.", keyable=keyable, keyType=keyType,
108-
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed),
109-
Size2d(name="size", label="Size", description="Rectangle size.", keyable=keyable, keyType=keyType,
110-
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed)
95+
# Geometry group desciption
96+
geometryGroupDesc = [
97+
Vec2d(name="center", label="Center", description="Rectangle center.", x=-1.0, y=-1.0,
98+
keyable=keyable, keyType=keyType, group=group, advanced=advanced,
99+
enabled=enabled, visible=visible, exposed=exposed),
100+
Size2d(name="size", label="Size", description="Rectangle size.", width=-1.0, height=-1.0,
101+
keyable=keyable, keyType=keyType, group=group, advanced=advanced,
102+
enabled=enabled, visible=visible, exposed=exposed)
111103
]
112104
# ShapeAttribute constructor
113-
super(Rectangle, self).__init__(groupDesc, name, label, description, group=None, advanced=advanced, semantic=semantic,
114-
enabled=enabled, visible=visible, exposed=exposed)
105+
super(Rectangle, self).__init__(geometryGroupDesc, name, label, description, group=None, advanced=advanced,
106+
semantic=semantic, enabled=enabled, visible=visible, exposed=exposed)
115107

116108
class Circle(Shape):
117109
"""
@@ -120,13 +112,15 @@ class Circle(Shape):
120112
def __init__(self, name, label, description, keyable=False, keyType=None,
121113
group="allParams", advanced=False, semantic="",
122114
enabled=True, visible=True, exposed=False):
123-
# Shape group desciption
124-
groupDesc = [
125-
Point2d(name="center", label="Center", description="Circle center.", keyable=keyable, keyType=keyType,
126-
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed),
127-
FloatParam(name="radius", label="Radius", description="Circle radius.", value=-1.0, keyable=keyable, keyType=keyType,
128-
group=group, advanced=advanced, enabled=enabled, visible=visible, exposed=exposed)
115+
# Geometry group desciption
116+
geometryGroupDesc = [
117+
Vec2d(name="center", label="Center", description="Circle center.", x=-1.0, y=-1.0,
118+
keyable=keyable, keyType=keyType, group=group, advanced=advanced,
119+
enabled=enabled, visible=visible, exposed=exposed),
120+
FloatParam(name="radius", label="Radius", description="Circle radius.", value=-1.0,
121+
keyable=keyable, keyType=keyType, group=group, advanced=advanced,
122+
enabled=enabled, visible=visible, exposed=exposed)
129123
]
130124
# ShapeAttribute constructor
131-
super(Circle, self).__init__(groupDesc, name, label, description, group=None, advanced=advanced, semantic=semantic,
132-
enabled=enabled, visible=visible, exposed=exposed)
125+
super(Circle, self).__init__(geometryGroupDesc, name, label, description, group=None, advanced=advanced,
126+
semantic=semantic, enabled=enabled, visible=visible, exposed=exposed)

meshroom/ui/commands.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -377,49 +377,49 @@ def __init__(self, graph, attribute, key, observation, parent=None):
377377
self.attrName = attribute.fullName
378378
self.key = key
379379
self.observation = observation.toVariant()
380-
self.oldObservation = attribute.getObservation(key)
380+
self.oldObservation = attribute.geometry.getObservation(key)
381381
self.setText(f"Set observation for shape attribute '{attribute.fullName}' at key: '{key}'")
382382

383383
def redoImpl(self):
384384
if self.graph.attribute(self.attrName) is not None:
385-
self.graph.attribute(self.attrName).setObservation(self.key, self.observation)
385+
self.graph.attribute(self.attrName).geometry.setObservation(self.key, self.observation)
386386
else:
387-
self.graph.internalAttribute(self.attrName).setObservation(self.key, self.observation)
387+
self.graph.internalAttribute(self.attrName).geometry.setObservation(self.key, self.observation)
388388
return True
389389

390390
def undoImpl(self):
391391
if self.graph.attribute(self.attrName) is not None:
392392
if self.oldObservation is None:
393-
self.graph.attribute(self.attrName).removeObservation(self.key)
393+
self.graph.attribute(self.attrName).geometry.removeObservation(self.key)
394394
else:
395-
self.graph.attribute(self.attrName).setObservation(self.key, self.oldObservation)
395+
self.graph.attribute(self.attrName).geometry.setObservation(self.key, self.oldObservation)
396396
else:
397397
if self.oldObservation is None:
398-
self.graph.internalAttribute(self.attrName).removeObservation(self.key)
398+
self.graph.internalAttribute(self.attrName).geometry.removeObservation(self.key)
399399
else:
400-
self.graph.internalAttribute(self.attrName).setObservation(self.key, self.oldObservation)
400+
self.graph.internalAttribute(self.attrName).geometry.setObservation(self.key, self.oldObservation)
401401
return True
402402

403403
class RemoveObservationCommand(GraphCommand):
404404
def __init__(self, graph, attribute, key, parent=None):
405405
super().__init__(graph, parent)
406406
self.attrName = attribute.fullName
407407
self.key = key
408-
self.oldObservation = attribute.getObservation(key)
408+
self.oldObservation = attribute.geometry.getObservation(key)
409409
self.setText(f"Remove observation for shape attribute '{attribute.fullName}' at key: '{key}'")
410410

411411
def redoImpl(self):
412412
if self.graph.attribute(self.attrName) is not None:
413-
self.graph.attribute(self.attrName).removeObservation(self.key)
413+
self.graph.attribute(self.attrName).geometry.removeObservation(self.key)
414414
else:
415-
self.graph.internalAttribute(self.attrName).removeObservation(self.key)
415+
self.graph.internalAttribute(self.attrName).geometry.removeObservation(self.key)
416416
return True
417417

418418
def undoImpl(self):
419419
if self.graph.attribute(self.attrName) is not None:
420-
self.graph.attribute(self.attrName).setObservation(self.key, self.oldObservation)
420+
self.graph.attribute(self.attrName).geometry.setObservation(self.key, self.oldObservation)
421421
else:
422-
self.graph.internalAttribute(self.attrName).setObservation(self.key, self.oldObservation)
422+
self.graph.internalAttribute(self.attrName).geometry.setObservation(self.key, self.oldObservation)
423423
return True
424424

425425
class AddEdgeCommand(GraphCommand):

meshroom/ui/components/shapes/shapeFile.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,16 @@ def hasObservation(self, key: str) -> bool:
8484
label = Property(str, lambda self: self._name, constant=True)
8585
# The shape type (Point2d, Line2d, Rectangle, Circle, etc.).
8686
type = Property(str, lambda self: self._type, constant=True)
87-
# Whether the shape is keyabale (multiple observations).
88-
shapeKeyable = Property(bool,lambda self: self._keyable, constant=True)
8987
# The shape properties (color, stroke, etc.).
9088
properties = Property(Variant, lambda self: self._properties, constant=True)
9189
# The shape current observation.
9290
observation = Property(Variant, _getObservation, notify=viewIdChanged)
91+
# Whether the shape is keyabale (multiple observations).
92+
observationKeyable = Property(bool,lambda self: self._keyable, constant=True)
9393
# The shape list of observation keys.
9494
observationKeys = Property(Variant, lambda self: [key for key in self._observations], constant=True)
9595
# The number of observation defined.
96-
nbObservations = Property(int, _getNbObservations, constant=True)
96+
nbObservations = Property(int, _getNbObservations, constant=True)
9797
# Whether the shape is displayable.
9898
isVisible = Property(bool, _getVisible, _setVisible, notify=visibleChanged)
9999

meshroom/ui/qml/Shapes/Editor/Items/ShapeAttributeItem.qml

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,11 @@ Column {
1919
property var shapeAttribute
2020
property alias isNeasted: itemHeader.isNeasted
2121
property alias isLinkChild: itemHeader.isLinkChild
22-
23-
24-
function hasCurrentObservation() {
25-
return shapeAttribute ? shapeAttribute.hasObservation(_reconstruction ? _reconstruction.selectedViewId : "-1") : false
26-
}
27-
28-
// Reload hasObservation property
29-
// When shape attribute observations changed (signal)
30-
Connections {
31-
target: shapeAttribute
32-
function onObservationsChanged() { itemHeader.hasShapeObservation = hasCurrentObservation() }
33-
}
34-
// When reconstruction view id changed (signal)
35-
Connections {
36-
target: _reconstruction
37-
function onSelectedViewIdChanged() { itemHeader.hasShapeObservation = hasCurrentObservation() }
38-
}
3922

4023
// Item Header
4124
ItemUtils.ItemHeader {
4225
id: itemHeader
4326
model: shapeAttribute
44-
hasShapeObservation: hasCurrentObservation()
4527
isShape: true
4628
isAttribute: true
4729
}

meshroom/ui/qml/Shapes/Editor/Items/ShapeDataItem.qml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ Column {
2323
ItemUtils.ItemHeader {
2424
id: itemHeader
2525
model: shapeData
26-
hasShapeObservation: shapeData.hasObservation(_reconstruction.selectedViewId)
2726
isShape: true
2827
isAttribute: false
2928
}

0 commit comments

Comments
 (0)