| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | """Provides the object code for the Layer object.""" |
| | |
| | |
| | |
| |
|
| | |
| | |
| | from PySide.QtCore import QT_TRANSLATE_NOOP |
| |
|
| | import FreeCAD as App |
| | from draftutils import gui_utils |
| | from draftutils import utils |
| | from draftutils.messages import _log |
| |
|
| |
|
| | class Layer: |
| | """The Layer object. |
| | |
| | This class is normally used to extend a base `App::FeaturePython` object. |
| | """ |
| |
|
| | def __init__(self, obj): |
| | self.Type = "Layer" |
| | self.Object = obj |
| | self.set_properties(obj) |
| |
|
| | obj.Proxy = self |
| |
|
| | def set_properties(self, obj): |
| | """Set properties only if they don't exist.""" |
| | if "Group" not in obj.PropertiesList: |
| | _tip = QT_TRANSLATE_NOOP("App::Property", "The objects that are part of this layer") |
| | |
| | |
| | |
| | obj.addProperty("App::PropertyLinkListHidden", "Group", "Layer", _tip, locked=True) |
| |
|
| | def onDocumentRestored(self, obj): |
| | """Execute code when the document is restored.""" |
| | |
| | if obj.getTypeIdOfProperty("Group") != "App::PropertyLinkListHidden": |
| | grp = obj.Group |
| | group_removed = obj.removeProperty("Group") |
| | self.set_properties(obj) |
| | if group_removed: |
| | obj.Group = grp |
| | _log("v1.0, " + obj.Name + ", changed 'Group' property type") |
| |
|
| | gui_utils.restore_view_object( |
| | obj, vp_module="view_layer", vp_class="ViewProviderLayer", format=False |
| | ) |
| |
|
| | if not getattr(obj, "ViewObject", None): |
| | return |
| | vobj = obj.ViewObject |
| |
|
| | if self.Type == "VisGroup": |
| | self.Type = "Layer" |
| | |
| | for prop in ("DrawStyle", "LineColor", "LineWidth", "ShapeColor", "Transparency"): |
| | vobj.setGroupOfProperty(prop, "Layer") |
| |
|
| | if not hasattr(vobj, "ShapeAppearance"): |
| | vobj.Proxy.set_properties(vobj) |
| | material = App.Material() |
| | material.DiffuseColor = vobj.ShapeColor |
| | material.Transparency = vobj.Transparency / 100 |
| | vobj.ShapeAppearance = (material,) |
| | vobj.setPropertyStatus("ShapeColor", "Hidden") |
| | if hasattr(vobj, "OverrideShapeColorChildren"): |
| | vobj.OverrideShapeAppearanceChildren = vobj.OverrideShapeColorChildren |
| | vobj.removeProperty("OverrideShapeColorChildren") |
| | _log("v1.0, " + obj.Name + ", updated view properties") |
| |
|
| | def dumps(self): |
| | """Return a tuple of objects to save or None.""" |
| | return self.Type |
| |
|
| | def loads(self, state): |
| | """Set the internal properties from the restored state.""" |
| | if state: |
| | self.Type = state |
| |
|
| | def execute(self, obj): |
| | """Execute when the object is created or recomputed. Do nothing.""" |
| | pass |
| |
|
| | def _get_other_layers(self, obj, child): |
| | other_lyrs = [] |
| | for find in child.Document.findObjects(Type="App::FeaturePython"): |
| | if utils.get_type(find) == "Layer" and find != obj and child in find.Group: |
| | other_lyrs.append(find) |
| | return other_lyrs |
| |
|
| | def onBeforeChange(self, obj, prop): |
| | if prop == "Group": |
| | self.oldGroup = obj.Group |
| |
|
| | def onChanged(self, obj, prop): |
| | if prop != "Group": |
| | return |
| | vobj = getattr(obj, "ViewObject", None) |
| | old_grp = getattr(self, "oldGroup", []) |
| | for child in obj.Group: |
| | if child in old_grp: |
| | continue |
| | for other_lyr in self._get_other_layers(obj, child): |
| | other_grp = other_lyr.Group |
| | other_grp.remove(child) |
| | other_lyr.Group = other_grp |
| | if vobj is None: |
| | continue |
| | for prop in ("LineColor", "ShapeAppearance", "LineWidth", "DrawStyle", "Visibility"): |
| | vobj.Proxy.change_view_properties(vobj, prop, old_prop=None, targets=[child]) |
| |
|
| | def addObject(self, obj, child): |
| | if utils.get_type(child) in ("Layer", "LayerContainer"): |
| | return |
| | grp = obj.Group |
| | if child in grp: |
| | return |
| | grp.append(child) |
| | obj.Group = grp |
| |
|
| | def removeObject(self, obj, child): |
| | grp = obj.Group |
| | if not child in grp: |
| | return |
| | grp.remove(child) |
| | obj.Group = grp |
| |
|
| |
|
| | |
| | _VisGroup = Layer |
| |
|
| |
|
| | class LayerContainer: |
| | """The container object for layers. |
| | |
| | This class is normally used to extend |
| | a base `App::DocumentObjectGroupPython` object. |
| | """ |
| |
|
| | def __init__(self, obj): |
| | self.Type = "LayerContainer" |
| | obj.Proxy = self |
| |
|
| | def onDocumentRestored(self, obj): |
| | gui_utils.restore_view_object( |
| | obj, vp_module="view_layer", vp_class="ViewProviderLayerContainer", format=False |
| | ) |
| |
|
| | def execute(self, obj): |
| | """Execute when the object is created or recomputed. |
| | |
| | Update the value of `Group` by sorting the contained layers |
| | by `Label`. |
| | """ |
| | grp = obj.Group |
| | grp.sort(key=lambda layer: layer.Label) |
| | obj.Group = grp |
| |
|
| | def dumps(self): |
| | """Return a tuple of objects to save or None.""" |
| | if hasattr(self, "Type"): |
| | return self.Type |
| |
|
| | def loads(self, state): |
| | """Set the internal properties from the restored state.""" |
| | if state: |
| | self.Type = state |
| |
|
| |
|
| | def get_layer(obj): |
| | """Get the layer the object belongs to.""" |
| | finds = obj.Document.findObjects(Name="LayerContainer") |
| | if not finds: |
| | return None |
| | |
| | for layer in finds[0].Group: |
| | if utils.get_type(layer) == "Layer" and obj in layer.Group: |
| | return layer |
| | |
| | for find in obj.Document.findObjects(Type="App::FeaturePython"): |
| | if utils.get_type(find) == "Layer" and obj in find.Group: |
| | return find |
| | return None |
| |
|
| |
|
| | |
| |
|