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 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + +