diff --git a/src/Mod/Arch/ArchCommands.py b/src/Mod/Arch/ArchCommands.py
index 92bbbd02c..999f39f95 100644
--- a/src/Mod/Arch/ArchCommands.py
+++ b/src/Mod/Arch/ArchCommands.py
@@ -212,6 +212,13 @@ def makeComponent(baseobj=None,name="Component",delete=False):
elif isinstance(baseobj,Part.Shape):
obj.Shape = baseobj
return obj
+
+def cloneComponent(obj):
+ '''cloneComponent(obj): Creates a clone of an object as an undefined component'''
+ c = makeComponent()
+ c.CloneOf = obj
+ c.Placement = obj.Placement
+ c.Label = obj.Label
def setAsSubcomponent(obj):
'''Sets the given object properly to become a subcomponent (addition, subtraction)
@@ -1283,6 +1290,30 @@ class _CommandComponent:
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
+
+class _CommandCloneComponent:
+ "the Arch Clone Component command definition"
+ def GetResources(self):
+ return {'Pixmap' : 'Arch_Component_Clone',
+ 'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_CloneComponent","Clone component"),
+ 'Accel': "C, C",
+ 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_CloneComponent","Clones an object as an undefined architectural component")}
+
+ def IsActive(self):
+ return not FreeCAD.ActiveDocument is None
+
+ def Activated(self):
+ sel = FreeCADGui.Selection.getSelection()
+ if sel:
+ FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Component"))
+ FreeCADGui.addModule("Arch")
+ FreeCADGui.Control.closeDialog()
+ for o in sel:
+ FreeCADGui.doCommand("Arch.cloneComponent(FreeCAD.ActiveDocument."+o.Name+")")
+ FreeCAD.ActiveDocument.commitTransaction()
+ FreeCAD.ActiveDocument.recompute()
+
+
def makeIfcSpreadsheet(archobj=None):
ifc_container = None
for obj in FreeCAD.ActiveDocument.Objects :
@@ -1371,5 +1402,6 @@ if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Survey',_CommandSurvey())
FreeCADGui.addCommand('Arch_ToggleIfcBrepFlag',_ToggleIfcBrepFlag())
FreeCADGui.addCommand('Arch_Component',_CommandComponent())
+ FreeCADGui.addCommand('Arch_CloneComponent',_CommandCloneComponent())
FreeCADGui.addCommand('Arch_IfcSpreadsheet',_CommandIfcSpreadsheet())
FreeCADGui.addCommand('Arch_ToggleSubs',_ToggleSubs())
diff --git a/src/Mod/Arch/ArchComponent.py b/src/Mod/Arch/ArchComponent.py
index 0a9bbc071..e7b05090e 100644
--- a/src/Mod/Arch/ArchComponent.py
+++ b/src/Mod/Arch/ArchComponent.py
@@ -361,10 +361,7 @@ class Component:
pl = obj.Placement
obj.Shape = obj.CloneOf.Shape.copy()
obj.Placement = pl
- if hasattr(obj,"BaseMaterial"):
- if hasattr(obj.CloneOf,"BaseMaterial"):
- obj.BaseMaterial = obj.CloneOf.BaseMaterial
- for prop in ["Length","Width","Height","Thickness","Area","PerimeterLength","HorizontalArea","VerticalArea"]:
+ for prop in ["Length","Width","Height","Thickness","Area","PerimeterLength","HorizontalArea","VerticalArea","BaseMaterial","IfcAttributes"]:
if hasattr(obj,prop) and hasattr(obj.CloneOf,prop):
setattr(obj,prop,getattr(obj.CloneOf,prop))
return True
@@ -632,9 +629,9 @@ class ViewProviderComponent:
#print obj.Name," : updating ",prop
if prop == "BaseMaterial":
if obj.BaseMaterial:
- if 'Color' in obj.BaseMaterial.Material:
- if "(" in obj.BaseMaterial.Material['Color']:
- c = tuple([float(f) for f in obj.BaseMaterial.Material['Color'].strip("()").split(",")])
+ if 'DiffuseColor' in obj.BaseMaterial.Material:
+ if "(" in obj.BaseMaterial.Material['DiffuseColor']:
+ c = tuple([float(f) for f in obj.BaseMaterial.Material['DiffuseColor'].strip("()").split(",")])
if obj.ViewObject:
obj.ViewObject.ShapeColor = c
elif prop == "Shape":
@@ -654,6 +651,10 @@ class ViewProviderComponent:
def getIcon(self):
import Arch_rc
+ if hasattr(self,"Object"):
+ if hasattr(self.Object,"CloneOf"):
+ if self.Object.CloneOf:
+ return ":/icons/Arch_Component_Clone.svg"
return ":/icons/Arch_Component.svg"
def onChanged(self,vobj,prop):
diff --git a/src/Mod/Arch/InitGui.py b/src/Mod/Arch/InitGui.py
index 49a2c601f..2d096138d 100644
--- a/src/Mod/Arch/InitGui.py
+++ b/src/Mod/Arch/InitGui.py
@@ -40,7 +40,7 @@ class ArchWorkbench(Workbench):
"Arch_PanelTools","Arch_Equipment",
"Arch_Frame","Arch_Material","Arch_Schedule","Arch_PipeTools",
"Arch_CutPlane","Arch_Add","Arch_Remove","Arch_Survey"]
- self.utilities = ["Arch_Component","Arch_SplitMesh","Arch_MeshToShape",
+ self.utilities = ["Arch_Component","Arch_CloneComponent","Arch_SplitMesh","Arch_MeshToShape",
"Arch_SelectNonSolidMeshes","Arch_RemoveShape",
"Arch_CloseHoles","Arch_MergeWalls","Arch_Check",
"Arch_IfcExplorer","Arch_ToggleIfcBrepFlag","Arch_3Views",
diff --git a/src/Mod/Arch/Resources/Arch.qrc b/src/Mod/Arch/Resources/Arch.qrc
index 2cb830ae3..1308c77cd 100644
--- a/src/Mod/Arch/Resources/Arch.qrc
+++ b/src/Mod/Arch/Resources/Arch.qrc
@@ -60,6 +60,7 @@
icons/Arch_Bimserver.svg
icons/Git.svg
icons/Arch_Component.svg
+ icons/Arch_Component_Clone.svg
icons/Arch_Material.svg
icons/Arch_Material_Group.svg
icons/Arch_Schedule.svg
diff --git a/src/Mod/Arch/Resources/icons/Arch_Component_Clone.svg b/src/Mod/Arch/Resources/icons/Arch_Component_Clone.svg
new file mode 100644
index 000000000..4c3455bf5
--- /dev/null
+++ b/src/Mod/Arch/Resources/icons/Arch_Component_Clone.svg
@@ -0,0 +1,182 @@
+
+
+
+