Draft: support for Document.copyObject() API

Now Draft can copy every FreeCAD object that have a shape.
This commit is contained in:
carlopav
2020-06-27 18:33:46 +02:00
committed by Yorik van Havre
parent 8d9fb3e173
commit 7e72d0778d
2 changed files with 15 additions and 129 deletions

View File

@@ -141,10 +141,8 @@ def rotate(objectslist, angle, center=App.Vector(0,0,0),
g = newgroups.setdefault(p.Name, App.ActiveDocument.addObject(p.TypeId, p.Name))
g.addObject(newobj)
break
if copy and utils.getType("selectBaseObjects"): # was utils.getType("selectBaseObjects", False)
gui_utils.select(objectslist)
else:
gui_utils.select(newobjlist)
gui_utils.select(newobjlist)
if len(newobjlist) == 1: return newobjlist[0]
return newobjlist

View File

@@ -50,7 +50,7 @@ if App.GuiUp:
from draftviewproviders.view_wire import ViewProviderWire
def make_copy(obj, force=None, reparent=False):
def make_copy(obj, force=None, reparent=False, simple_copy=False):
"""makeCopy(object, [force], [reparent])
Make an exact copy of an object and return it.
@@ -61,152 +61,40 @@ def make_copy(obj, force=None, reparent=False):
Object to copy.
force :
TODO: Describe.
Obsolete, not used anymore.
reparent :
TODO: Describe.
Group the new object in the same group of the old one.
simple_copy :
Create a simple copy of the object (a new non parametric
Part::Feature with the same Shape as the given object).
"""
if not App.ActiveDocument:
App.Console.PrintError("No active document. Aborting\n")
return
if (utils.get_type(obj) == "Rectangle") or (force == "Rectangle"):
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
Rectangle(newobj)
if App.GuiUp:
ViewProviderRectangle(newobj.ViewObject)
elif (utils.get_type(obj) == "Point") or (force == "Point"):
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
Point(newobj)
if App.GuiUp:
ViewProviderPoint(newobj.ViewObject)
elif (utils.get_type(obj) in ["Dimension",
"LinearDimension"]) or (force == "Dimension"):
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
LinearDimension(newobj)
if App.GuiUp:
ViewProviderLinearDimension(newobj.ViewObject)
elif (utils.get_type(obj) == "Wire") or (force == "Wire"):
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
Wire(newobj)
if App.GuiUp:
ViewProviderWire(newobj.ViewObject)
elif (utils.get_type(obj) == "Circle") or (force == "Circle"):
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
Circle(newobj)
if App.GuiUp:
ViewProviderDraft(newobj.ViewObject)
elif (utils.get_type(obj) == "Polygon") or (force == "Polygon"):
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
Polygon(newobj)
if App.GuiUp:
ViewProviderDraft(newobj.ViewObject)
elif (utils.get_type(obj) == "BSpline") or (force == "BSpline"):
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
BSpline(newobj)
if App.GuiUp:
ViewProviderWire(newobj.ViewObject)
elif (utils.get_type(obj) == "Block") or (force == "BSpline"):
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
Block(newobj)
if App.GuiUp:
ViewProviderDraftPart(newobj.ViewObject)
# drawingview became obsolete with v 0.19
# TODO: uncomment after splitting DrawingView object from draft py
#elif (utils.get_type(obj) == "DrawingView") or (force == "DrawingView"):
#_name = utils.get_real_name(obj.Name)
#newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
#DrawingView(newobj)
elif (utils.get_type(obj) == "Structure") or (force == "Structure"):
import ArchStructure
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
ArchStructure._Structure(newobj)
if App.GuiUp:
ArchStructure._ViewProviderStructure(newobj.ViewObject)
elif (utils.get_type(obj) == "Wall") or (force == "Wall"):
import ArchWall
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
ArchWall._Wall(newobj)
if App.GuiUp:
ArchWall._ViewProviderWall(newobj.ViewObject)
elif (utils.get_type(obj) == "Window") or (force == "Window"):
import ArchWindow
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
ArchWindow._Window(newobj)
if App.GuiUp:
ArchWindow._ViewProviderWindow(newobj.ViewObject)
elif (utils.get_type(obj) == "Panel") or (force == "Panel"):
import ArchPanel
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject(obj.TypeId, _name)
ArchPanel._Panel(newobj)
if App.GuiUp:
ArchPanel._ViewProviderPanel(newobj.ViewObject)
elif (utils.get_type(obj) == "Sketch") or (force == "Sketch"):
_name = utils.get_real_name(obj.Name)
newobj = App.ActiveDocument.addObject("Sketcher::SketchObject", _name)
for geo in obj.Geometry:
newobj.addGeometry(geo)
for con in obj.Constraints:
newobj.addConstraint(con)
elif hasattr(obj, 'Shape'):
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
elif not simple_copy and hasattr(obj, 'Shape'):
newobj = App.ActiveDocument.copyObject(obj)
else:
print("Error: Object type cannot be copied")
if not newobj:
return None
for p in obj.PropertiesList:
if not p in ["Proxy", "ExpressionEngine"]:
if p in newobj.PropertiesList:
if not "ReadOnly" in newobj.getEditorMode(p):
try:
setattr(newobj, p, obj.getPropertyByName(p))
except AttributeError:
try:
setattr(newobj, p, obj.getPropertyByName(p).Value)
except AttributeError:
pass
if reparent:
parents = obj.InList
if parents:
for par in parents:
if par.isDerivedFrom("App::DocumentObjectGroup"):
par.addObject(newobj)
else:
else: # Carlo: when is it used?
for prop in par.PropertiesList:
if getattr(par, prop) == obj:
setattr(par, prop, newobj)
gui_utils.format_object(newobj, obj)
# gui_utils.format_object(newobj, obj) seems not necessary with copyObject()
return newobj