def __init__(self, dotted=False, scolor=None, swidth=None, children=[], ontop=False, name=None): global Part, DraftGeomUtils import Part, DraftGeomUtils self.ontop = ontop color = coin.SoBaseColor() color.rgb = scolor or FreeCADGui.draftToolBar.getDefaultColor("ui") drawstyle = coin.SoDrawStyle() if swidth: drawstyle.lineWidth = swidth if dotted: drawstyle.style = coin.SoDrawStyle.LINES drawstyle.lineWeight = 3 drawstyle.linePattern = 0x0f0f # 0xaa node = coin.SoSeparator() for c in [drawstyle, color] + children: node.addChild(c) self.switch = coin.SoSwitch() # this is the on/off switch if name: self.switch.setName(name) self.switch.addChild(node) self.switch.whichChild = -1 self.Visible = False ToDo.delay(self._insertSwitch, self.switch)
def make_clone(obj, delta=None, forcedraft=False): """clone(obj,[delta,forcedraft]) Makes a clone of the given object(s). The clone is an exact, linked copy of the given object. If the original object changes, the final object changes too. Parameters ---------- obj : delta : Base.Vector Delta Vector to move the clone from the original position. forcedraft : bool If forcedraft is True, the resulting object is a Draft clone even if the input object is an Arch object. """ prefix = get_param("ClonePrefix", "") cl = None if prefix: prefix = prefix.strip() + " " if not isinstance(obj, list): obj = [obj] if (len(obj) == 1) and obj[0].isDerivedFrom("Part::Part2DObject"): cl = App.ActiveDocument.addObject("Part::Part2DObjectPython", "Clone2D") cl.Label = prefix + obj[0].Label + " (2D)" elif (len(obj) == 1) and (hasattr(obj[0], "CloneOf") or (get_type( obj[0]) == "BuildingPart")) and (not forcedraft): # arch objects can be clones import Arch if get_type(obj[0]) == "BuildingPart": cl = Arch.makeComponent() else: try: clonefunc = getattr(Arch, "make" + obj[0].Proxy.Type) except: pass # not a standard Arch object... Fall back to Draft mode else: cl = clonefunc() if cl: base = getCloneBase(obj[0]) cl.Label = prefix + base.Label cl.CloneOf = base if hasattr(cl, "Material") and hasattr(obj[0], "Material"): cl.Material = obj[0].Material if get_type(obj[0]) != "BuildingPart": cl.Placement = obj[0].Placement try: cl.Role = base.Role cl.Description = base.Description cl.Tag = base.Tag except: pass if App.GuiUp: format_object(cl, base) cl.ViewObject.DiffuseColor = base.ViewObject.DiffuseColor if get_type(obj[0]) in ["Window", "BuildingPart"]: ToDo.delay(Arch.recolorize, cl) select(cl) return cl # fall back to Draft clone mode if not cl: cl = App.ActiveDocument.addObject("Part::FeaturePython", "Clone") cl.addExtension("Part::AttachExtensionPython", None) cl.Label = prefix + obj[0].Label Clone(cl) if App.GuiUp: ViewProviderClone(cl.ViewObject) cl.Objects = obj if delta: cl.Placement.move(delta) elif (len(obj) == 1) and hasattr(obj[0], "Placement"): cl.Placement = obj[0].Placement format_object(cl, obj[0]) if hasattr(cl, "LongName") and hasattr(obj[0], "LongName"): cl.LongName = obj[0].LongName if App.GuiUp and (len(obj) > 1): cl.ViewObject.Proxy.resetColors(cl.ViewObject) select(cl) return cl
def finalize(self): """Finish the command by removing the switch.""" ToDo.delay(self._removeSwitch, self.switch) self.switch = None