diff --git a/src/Mod/Arch/ArchCommands.py b/src/Mod/Arch/ArchCommands.py index 77c5f3f04d48..6395213981f3 100644 --- a/src/Mod/Arch/ArchCommands.py +++ b/src/Mod/Arch/ArchCommands.py @@ -66,6 +66,9 @@ def getDefaultColor(objectType): c = p.GetUnsigned("RebarColor",3111475967) elif objectType == "Panel": c = p.GetUnsigned("PanelColor",3416289279) + elif objectType == "Construction": + c = Draft.getParam("constructioncolor",746455039) + transparency = 0.80 else: c = p.GetUnsigned("WindowsColor",810781695) r = float((c>>24)&0xFF)/255.0 @@ -85,6 +88,7 @@ def addComponents(objectsList,host): c = host.Group for o in objectsList: if not o in c: + setAsSubcomponent(o) c.append(o) host.Group = c elif hostType in ["Wall","Structure","Window","Roof","Stairs","StructuralSystem","Panel"]: @@ -97,12 +101,15 @@ def addComponents(objectsList,host): if DraftGeomUtils.isValidPath(o.Shape) and (hostType == "Structure"): if o.Support == host: o.Support = None + setAsSubcomponent(o) host.Tool = o elif Draft.getType(o) == "Axis": if not o in x: + setAsSubcomponent(o) x.append(o) elif not o in a: if hasattr(o,"Shape"): + setAsSubcomponent(o) a.append(o) host.Additions = a if hasattr(host,"Axes"): @@ -111,12 +118,14 @@ def addComponents(objectsList,host): a = host.Objects for o in objectsList: if not o in a: + setAsSubcomponent(o) a.append(o) host.Objects = a elif host.isDerivedFrom("App::DocumentObjectGroup"): c = host.Group for o in objectsList: if not o in c: + setAsSubcomponent(o) c.append(o) host.Group = c @@ -141,6 +150,7 @@ def removeComponents(objectsList,host=None): s = host.Subtractions for o in objectsList: if not o in s: + setAsSubcomponent(o) s.append(o) fixDAG(o) if FreeCAD.GuiUp: @@ -201,6 +211,17 @@ def makeComponent(baseobj=None,name="Component",delete=False): obj.Shape = baseobj return obj +def setAsSubcomponent(obj): + '''Sets the given object properly to become a subcomponent (addition, subtraction) + of an Arch component''' + Draft.ungroup(obj) + if FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch").GetBool("applyConstructionStyle",True): + if FreeCAD.GuiUp: + color = getDefaultColor("Construction") + obj.ViewObject.LineColor = color + obj.ViewObject.ShapeColor = color + obj.ViewObject.Transparency = int(color[3]*100) + def fixDAG(obj): '''fixDAG(object): Fixes non-DAG problems in windows and rebars by removing supports and external geometry from underlying sketches''' @@ -1275,6 +1296,32 @@ def Activated(self): FreeCAD.ActiveDocument.commitTransaction() FreeCAD.ActiveDocument.recompute() + +class _ToggleSubcomponentDisplay: + "the Toggle SubcomponentDisplay command definition" + def GetResources(self): + return {'Pixmap' : 'Arch_ToggleSubcomponentDisplay', + 'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_ToggleSubcomponentDisplay","Toggle subcomponents"), + 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_ToggleSubcomponentDisplay","Shows or hides the subcomponents of this object")} + + def IsActive(self): + return bool(FreeCADGui.Selection.getSelection()) + + def Activated(self): + mode = None + for obj in FreeCADGui.Selection.getSelection(): + if hasattr(obj, "Subtractions"): + for sub in obj.Subtractions: + if not (Draft.getType(sub) in ["Window","Roof"]): + if mode == None: + # take the first sub as base + mode = sub.ViewObject.isVisible() + if mode == True: + sub.ViewObject.hide() + else: + sub.ViewObject.show() + + if FreeCAD.GuiUp: FreeCADGui.addCommand('Arch_Add',_CommandAdd()) FreeCADGui.addCommand('Arch_Remove',_CommandRemove()) @@ -1289,3 +1336,4 @@ def Activated(self): FreeCADGui.addCommand('Arch_ToggleIfcBrepFlag',_ToggleIfcBrepFlag()) FreeCADGui.addCommand('Arch_Component',_CommandComponent()) FreeCADGui.addCommand('Arch_IfcSpreadsheet',_CommandIfcSpreadsheet()) + FreeCADGui.addCommand('Arch_ToggleSubcomponentDisplay',_ToggleSubcomponentDisplay()) diff --git a/src/Mod/Arch/ArchComponent.py b/src/Mod/Arch/ArchComponent.py index b321773da18b..ad2dff97fb90 100644 --- a/src/Mod/Arch/ArchComponent.py +++ b/src/Mod/Arch/ArchComponent.py @@ -31,7 +31,7 @@ 'Member','Plate','Railing','Ramp','Ramp Flight','Rebar','Pile','Roof','Shading Device','Slab','Space', 'Stair','Stair Flight','Tendon','Wall','Wall Layer','Window'] -import FreeCAD,Draft +import FreeCAD,Draft,ArchCommands from FreeCAD import Vector if FreeCAD.GuiUp: import FreeCADGui @@ -77,6 +77,7 @@ def addToComponent(compobject,addobject,mod=None): l.append(addobject) setattr(compobject,mod,l) if mod != "Objects": + ArchCommands.setAsSubcomponent(addobject) addobject.ViewObject.hide() else: for a in attribs[:3]: @@ -116,6 +117,7 @@ def removeFromComponent(compobject,subobject): l.append(subobject) compobject.Subtractions = l if (Draft.getType(subobject) != "Window") and (not Draft.isClone(subobject,"Window",True)): + ArchCommands.setAsSubcomponent(subobject) subobject.ViewObject.hide() diff --git a/src/Mod/Arch/InitGui.py b/src/Mod/Arch/InitGui.py index 1243de2b2c10..61a18c71f223 100644 --- a/src/Mod/Arch/InitGui.py +++ b/src/Mod/Arch/InitGui.py @@ -44,7 +44,7 @@ def Initialize(self): "Arch_SelectNonSolidMeshes","Arch_RemoveShape", "Arch_CloseHoles","Arch_MergeWalls","Arch_Check", "Arch_IfcExplorer","Arch_ToggleIfcBrepFlag","Arch_3Views", - "Arch_Bimserver","Arch_Git","Arch_IfcSpreadsheet"] + "Arch_Bimserver","Arch_Git","Arch_IfcSpreadsheet","Arch_ToggleSubcomponentDisplay"] # draft tools self.drafttools = ["Draft_Line","Draft_Wire","Draft_Circle","Draft_Arc","Draft_Ellipse", diff --git a/src/Mod/Arch/Resources/Arch.qrc b/src/Mod/Arch/Resources/Arch.qrc index fe187c3b84ae..3157d714f782 100644 --- a/src/Mod/Arch/Resources/Arch.qrc +++ b/src/Mod/Arch/Resources/Arch.qrc @@ -70,6 +70,7 @@ icons/Arch_Pipe.svg icons/Arch_Pipe_Tree.svg icons/Arch_PipeConnector.svg + icons/Arch_ToggleSubcomponentDisplay.svg ui/ParametersWindowDouble.svg ui/ParametersWindowSimple.svg ui/ParametersWindowFixed.svg diff --git a/src/Mod/Arch/Resources/icons/Arch_ToggleSubcomponentDisplay.svg b/src/Mod/Arch/Resources/icons/Arch_ToggleSubcomponentDisplay.svg new file mode 100644 index 000000000000..3de5fc3b580c --- /dev/null +++ b/src/Mod/Arch/Resources/icons/Arch_ToggleSubcomponentDisplay.svg @@ -0,0 +1,473 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/src/Mod/Arch/Resources/ui/preferences-arch.ui b/src/Mod/Arch/Resources/ui/preferences-arch.ui index 55b013bfabf3..b171a4109d61 100644 --- a/src/Mod/Arch/Resources/ui/preferences-arch.ui +++ b/src/Mod/Arch/Resources/ui/preferences-arch.ui @@ -6,8 +6,8 @@ 0 0 - 407 - 646 + 396 + 638 @@ -86,6 +86,26 @@ + + + + + + If this is checked, when an object becomes Subtraction or Addition of an Arch object, it will receive the Draft Construction color. + + + Apply Draft construction style to subcomponents + + + applyconstructionStyle + + + Mod/Arch + + + + +