Skip to content

Commit

Permalink
Draft: Draft.move() support new objects (fix #3754)
Browse files Browse the repository at this point in the history
and small refactor consequent to the introduction of App.ActiveDocument.copyObject support in Draft.makeCopy()
  • Loading branch information
carlopav authored and yorikvanhavre committed Jul 7, 2020
1 parent e366a3a commit 9542e1b
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 48 deletions.
76 changes: 33 additions & 43 deletions src/Mod/Draft/draftfunctions/move.py
Expand Up @@ -35,12 +35,6 @@
from draftmake.make_line import make_line
from draftfunctions.join import join_wires

from draftobjects.dimension import LinearDimension
from draftobjects.text import Text
if App.GuiUp:
from draftviewproviders.view_text import ViewProviderText
from draftviewproviders.view_dimension import ViewProviderLinearDimension


def move(objectslist, vector, copy=False):
"""move(objects,vector,[copy])
Expand Down Expand Up @@ -70,84 +64,79 @@ def move(objectslist, vector, copy=False):
newobjlist = []
newgroups = {}
objectslist = utils.filter_objects_for_modifiers(objectslist, copy)

for obj in objectslist:
newobj = None
# real_vector have been introduced to take into account
# the possibility that object is inside an App::Part
# TODO: Make Move work also with App::Link
if hasattr(obj, "getGlobalPlacement"):
v_minus_global = obj.getGlobalPlacement().inverse().Rotation.multVec(vector)
real_vector = obj.Placement.Rotation.multVec(v_minus_global)
else:
real_vector = vector

if utils.get_type(obj) == "Point":
v = App.Vector(obj.X,obj.Y,obj.Z)
v = v.add(real_vector)
if copy:
newobj = make_copy(obj)
else:
newobj = obj
newobj.X = v.x
newobj.Y = v.y
newobj.Z = v.z
newobj.X = obj.X + real_vector.x
newobj.Y = obj.Y + real_vector.y
newobj.Z = obj.Z + real_vector.z

elif obj.isDerivedFrom("App::DocumentObjectGroup"):
pass

elif hasattr(obj,'Shape'):
if copy:
newobj = make_copy(obj)
else:
newobj = obj
pla = newobj.Placement
pla.move(real_vector)

elif utils.get_type(obj) == "Annotation":
if copy:
newobj = App.ActiveDocument.addObject("App::Annotation",
utils.getRealName(obj.Name))
newobj.LabelText = obj.LabelText
if App.GuiUp:
gui_utils.formatObject(newobj,obj)
newobj = make_copy(obj)
else:
newobj = obj
newobj.Position = obj.Position.add(real_vector)

elif utils.get_type(obj) == "Text":
if copy:
# TODO: Why make_copy do not handle Text object??
newobj = App.ActiveDocument.addObject("App::FeaturePython",
utils.getRealName(obj.Name))
Text(newobj)
if App.GuiUp:
ViewProviderText(newobj.ViewObject)
gui_utils.formatObject(newobj,obj)
newobj.Text = obj.Text
newobj.Placement = obj.Placement
if App.GuiUp:
gui_utils.formatObject(newobj,obj)
newobj = make_copy(obj)
else:
newobj = obj
newobj.Placement.Base = obj.Placement.Base.add(real_vector)
elif utils.get_type(obj) in ["Dimension","LinearDimension"]:

elif utils.get_type(obj) in ["Dimension", "LinearDimension"]:
if copy:
# TODO: Why make_copy do not handle Dimension object??
# TODO: Support also Label and Angular dimension
newobj = App.ActiveDocument.addObject("App::FeaturePython",
utils.getRealName(obj.Name))
LinearDimension(newobj)
if App.GuiUp:
ViewProviderLinearDimension(newobj.ViewObject)
gui_utils.formatObject(newobj,obj)
newobj = make_copy(obj)
else:
newobj = obj
newobj.Start = obj.Start.add(real_vector)
newobj.End = obj.End.add(real_vector)
newobj.Dimline = obj.Dimline.add(real_vector)
else:
if copy and obj.isDerivedFrom("Mesh::Feature"):
print("Mesh copy not supported at the moment") # TODO
newobj = obj
if "Placement" in obj.PropertiesList:
pla = obj.Placement
pla.move(real_vector)

elif utils.get_type(obj) in ["AngularDimension"]:
if copy:
newobj = make_copy(obj)
else:
newobj = obj
newobj.Center = obj.Start.add(real_vector)

elif "Placement" in obj.PropertiesList:
if copy:
newobj = make_copy(obj)
else:
newobj = obj
pla = obj.Placement
pla.move(real_vector)

if newobj is not None:
newobjlist.append(newobj)

if copy:
for p in obj.InList:
if p.isDerivedFrom("App::DocumentObjectGroup") and (p in objectslist):
Expand All @@ -156,6 +145,7 @@ def move(objectslist, vector, copy=False):
break
if utils.get_type(p) == "Layer":
p.Proxy.addObject(p,newobj)

if copy and utils.get_param("selectBaseObjects",False):
gui_utils.select(objectslist)
else:
Expand Down
15 changes: 10 additions & 5 deletions src/Mod/Draft/draftmake/make_copy.py
Expand Up @@ -57,12 +57,14 @@ def make_copy(obj, force=None, reparent=False, simple_copy=False):
App.Console.PrintError("No active document. Aborting\n")
return

newobj = None

if simple_copy and hasattr(obj, 'Shape'):
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject("Part::Feature", _name)
newobj.Shape = obj.Shape
gui_utils.format_object(newobj, obj)
elif not simple_copy and hasattr(obj, 'Shape'):
elif not simple_copy:
newobj = App.ActiveDocument.copyObject(obj)

if not newobj:
Expand All @@ -74,10 +76,13 @@ def make_copy(obj, force=None, reparent=False, simple_copy=False):
for par in parents:
if par.isDerivedFrom("App::DocumentObjectGroup"):
par.addObject(newobj)
else: # Carlo: when is it used?
for prop in par.PropertiesList:
if getattr(par, prop) == obj:
setattr(par, prop, newobj)
else:
# That's the case of Arch_BuildingParts or Draft_Layers for example
if "Group" in par.PropertiesList:
if obj in par.Group:
group = par.Group
group.append(newobj)
par.Group = group

return newobj

0 comments on commit 9542e1b

Please sign in to comment.