| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | """Provides functions to create Clone objects.""" |
| | |
| | |
| | |
| |
|
| | |
| | |
| | import FreeCAD as App |
| | from draftobjects.clone import Clone |
| | from draftutils import params |
| | from draftutils import utils |
| | from draftutils import gui_utils |
| |
|
| | if App.GuiUp: |
| | from draftviewproviders.view_clone import ViewProviderClone |
| |
|
| |
|
| | 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 = params.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") |
| | and utils.get_type(obj[0]) not in ["BezCurve", "BSpline", "Wire"] |
| | ): |
| | |
| | |
| | cl = App.ActiveDocument.addObject("Part::Part2DObjectPython", "Clone2D") |
| | cl.Label = prefix + obj[0].Label + " (2D)" |
| | elif ( |
| | len(obj) == 1 |
| | and (hasattr(obj[0], "CloneOf") or utils.get_type(obj[0]) == "BuildingPart") |
| | and not forcedraft |
| | ): |
| | |
| | try: |
| | import Arch |
| | except: |
| | |
| | pass |
| | else: |
| | if utils.get_type(obj[0]) == "BuildingPart": |
| | cl = Arch.makeComponent() |
| | else: |
| | try: |
| | cl = getattr(Arch, "make_" + obj[0].Proxy.Type.lower())() |
| | except Exception: |
| | try: |
| | cl = getattr(Arch, "make" + obj[0].Proxy.Type)() |
| | except Exception: |
| | pass |
| | if cl: |
| | base = utils.get_clone_base(obj[0]) |
| | cl.Label = prefix + base.Label |
| | cl.CloneOf = base |
| | if utils.get_type(obj[0]) != "BuildingPart": |
| | cl.Placement = obj[0].Placement |
| | for prop in ("Description", "IfcType", "Material", "Subvolume", "Tag"): |
| | try: |
| | setattr(cl, prop, getattr(base, prop)) |
| | except Exception: |
| | pass |
| | if App.GuiUp: |
| | gui_utils.format_object(cl, base) |
| | gui_utils.select(cl) |
| | return cl |
| |
|
| | |
| | if not cl: |
| | cl = App.ActiveDocument.addObject("Part::FeaturePython", "Clone") |
| | cl.addExtension("Part::AttachExtensionPython") |
| | cl.Label = prefix + obj[0].Label |
| | Clone(cl) |
| | cl.Objects = obj |
| | if delta: |
| | cl.Placement.move(delta) |
| | elif (len(obj) == 1) and hasattr(obj[0], "Placement"): |
| | cl.Placement = obj[0].Placement |
| | if hasattr(cl, "LongName") and hasattr(obj[0], "LongName"): |
| | cl.LongName = obj[0].LongName |
| | if App.GuiUp: |
| | ViewProviderClone(cl.ViewObject) |
| | gui_utils.format_object(cl, obj[0]) |
| | gui_utils.select(cl) |
| | return cl |
| |
|
| |
|
| | clone = make_clone |
| |
|
| | |
| |
|