diff --git a/src/Mod/Arch/ArchAxis.py b/src/Mod/Arch/ArchAxis.py index a2ea310331..5bd132941b 100644 --- a/src/Mod/Arch/ArchAxis.py +++ b/src/Mod/Arch/ArchAxis.py @@ -59,7 +59,13 @@ class _CommandAxis: def Activated(self): FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Axis"))) FreeCADGui.doCommand("import Arch") - FreeCADGui.doCommand("Arch.makeAxis()") + sel = FreeCADGui.Selection.getSelection() + st = Draft.getObjectsOfType(sel,"Structure") + if st: + FreeCADGui.doCommand("axe = Arch.makeAxis()") + FreeCADGui.doCommand("Arch.makeStructuralSystem(" + ArchCommands.getStringList(st) + ",[axe])") + else: + FreeCADGui.doCommand("Arch.makeAxis()") FreeCAD.ActiveDocument.commitTransaction() class _Axis: diff --git a/src/Mod/Arch/ArchCommands.py b/src/Mod/Arch/ArchCommands.py index 66babfc7c4..f98c61c88c 100644 --- a/src/Mod/Arch/ArchCommands.py +++ b/src/Mod/Arch/ArchCommands.py @@ -32,6 +32,17 @@ __url__ = "http://free-cad.sourceforge.net" # module functions ############################################### +def getStringList(objects): + '''getStringList(objects): returns a string defining a list + of objects''' + result = "[" + for o in objects: + if len(result) > 1: + result += "," + result += "FreeCAD.ActiveDocument." + o.Name + result += "]" + return result + def addComponents(objectsList,host): '''addComponents(objectsList,hostObject): adds the given object or the objects from the given list as components to the given host Object. Use this for @@ -53,11 +64,18 @@ def addComponents(objectsList,host): host.Group = c elif tp in ["Wall","Structure"]: a = host.Additions + if hasattr(host,"Axes"): + x = host.Axes for o in objectsList: - if not o in a: + if Draft.getType(o) == "Axis": + if not o in x: + x.append(o) + elif not o in a: if hasattr(o,"Shape"): a.append(o) host.Additions = a + if hasattr(host,"Axes"): + host.Axes = x elif tp in ["SectionPlane"]: a = host.Objects for o in objectsList: diff --git a/src/Mod/Arch/ArchStructure.py b/src/Mod/Arch/ArchStructure.py index b63853fe1a..d249a8a837 100644 --- a/src/Mod/Arch/ArchStructure.py +++ b/src/Mod/Arch/ArchStructure.py @@ -21,7 +21,7 @@ #* * #*************************************************************************** -import FreeCAD,FreeCADGui,Draft,ArchComponent,DraftVecUtils +import FreeCAD,FreeCADGui,Draft,ArchComponent,DraftVecUtils,ArchCommands from FreeCAD import Vector from PyQt4 import QtCore from DraftTools import translate @@ -52,6 +52,18 @@ def makeStructure(baseobj=None,length=1,width=1,height=1,name=str(translate("Arc obj.ViewObject.ShapeColor = (r,g,b,1.0) return obj +def makeStructuralSystem(objects,axes): + '''makeStructuralSystem(objects,axes): makes a structural system + based on the given objects and axes''' + result = [] + if objects and axes: + for o in objects: + s = makeStructure(o) + s.Axes = axes + result.append(s) + FreeCAD.ActiveDocument.recompute() + return result + class _CommandStructure: "the Arch Structure command definition" def GetResources(self): @@ -65,8 +77,15 @@ class _CommandStructure: FreeCADGui.doCommand("import Arch") sel = FreeCADGui.Selection.getSelection() if sel: - for obj in sel: - FreeCADGui.doCommand("Arch.makeStructure(FreeCAD.ActiveDocument."+obj.Name+")") + # if selection contains structs and axes, make a system + st = Draft.getObjectsOfType(sel,"Structure") + ax = Draft.getObjectsOfType(sel,"Axis") + if st and ax: + FreeCADGui.doCommand("Arch.makeStructuralSystem(" + ArchCommands.getStringList(st) + "," + ArchCommands.getStringList(ax) + ")") + else: + # else, do normal structs + for obj in sel: + FreeCADGui.doCommand("Arch.makeStructure(FreeCAD.ActiveDocument." + obj.Name + ")") else: FreeCADGui.doCommand("Arch.makeStructure()") FreeCAD.ActiveDocument.commitTransaction() diff --git a/src/Mod/Arch/InitGui.py b/src/Mod/Arch/InitGui.py index 7f4c510795..523fc2352b 100644 --- a/src/Mod/Arch/InitGui.py +++ b/src/Mod/Arch/InitGui.py @@ -58,27 +58,36 @@ class ArchWorkbench(Workbench): def Initialize(self): import DraftTools,DraftGui,Arch_rc,Arch + + # arch tools self.archtools = ["Arch_Wall","Arch_Structure", "Arch_Floor","Arch_Building","Arch_Site", "Arch_Window","Arch_Roof","Arch_Axis", "Arch_SectionPlane","Arch_Add","Arch_Remove"] - self.drafttools = ["Draft_Line","Draft_Wire","Draft_Rectangle", - "Draft_Polygon","Draft_Arc", - "Draft_Circle","Draft_Dimension", - "Draft_Move","Draft_Rotate", - "Draft_Offset","Draft_Upgrade", - "Draft_Downgrade","Draft_Trimex"] - self.draftcontexttools = ["Draft_ApplyStyle","Draft_ToggleDisplayMode", - "Draft_AddToGroup","Draft_SelectGroup", - "Draft_SelectPlane","Draft_ToggleSnap", - "Draft_ShowSnapBar","Draft_ToggleGrid"] self.meshtools = ["Arch_SplitMesh","Arch_MeshToShape", "Arch_SelectNonSolidMeshes","Arch_RemoveShape"] + + # draft tools + self.drafttools = ["Draft_Line","Draft_Wire","Draft_Circle","Draft_Arc", + "Draft_Polygon","Draft_Rectangle", "Draft_Text", + "Draft_Dimension", "Draft_BSpline","Draft_Point"] + self.draftmodtools = ["Draft_Move","Draft_Rotate","Draft_Offset", + "Draft_Trimex", "Draft_Upgrade", "Draft_Downgrade", "Draft_Scale", + "Draft_Drawing","Draft_Edit","Draft_WireToBSpline","Draft_AddPoint", + "Draft_DelPoint","Draft_Shape2DView","Draft_Draft2Sketch","Draft_Array", + "Draft_Clone"] + self.draftcontexttools = ["Draft_ApplyStyle","Draft_ToggleDisplayMode","Draft_AddToGroup", + "Draft_SelectGroup","Draft_SelectPlane","Draft_ToggleSnap", + "Draft_ShowSnapBar","Draft_ToggleGrid","Draft_UndoLine", + "Draft_FinishLine","Draft_CloseLine"] + self.appendToolbar(str(DraftTools.translate("arch","Arch tools")),self.archtools) self.appendToolbar(str(DraftTools.translate("arch","Draft tools")),self.drafttools) + self.appendToolbar(str(DraftTools.translate("arch","Draft mod tools")),self.draftmodtools) self.appendMenu([str(DraftTools.translate("arch","&Architecture")),str(DraftTools.translate("arch","Conversion Tools"))],self.meshtools) self.appendMenu(str(DraftTools.translate("arch","&Architecture")),self.archtools) - self.appendMenu(str(DraftTools.translate("arch","&Draft")),self.drafttools+self.draftcontexttools) + self.appendMenu(str(DraftTools.translate("arch","&Draft")),self.drafttools+self.draftmodtools) + self.appendMenu([str(DraftTools.translate("arch","&Draft")),str(DraftTools.translate("arch","Context Tools"))],self.draftcontexttools) FreeCADGui.addIconPath(":/icons") FreeCADGui.addLanguagePath(":/translations") FreeCADGui.addPreferencePage(":/ui/archprefs-base.ui","Arch") diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index aa5aeb18e2..200e9fbbd4 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -173,6 +173,15 @@ def getType(obj): return "Group" return "Unknown" +def getObjectsOfType(objectslist,typ): + """getObjectsOfType(objectslist,typ): returns a list of objects of type "typ" found + in the given object list""" + objs = [] + for o in objectslist: + if getType(o) == typ: + objs.append(o) + return objs + def get3DView(): "get3DView(): returns the current view if it is 3D, or the first 3D view found, or None" v = FreeCADGui.ActiveDocument.ActiveView