Arch structure : workflow with master sketch

* Add a command that creates multiple Arch Structure objects from a selected base, using each selected edge as an extrusion path. It creates one Arch Structure object from each edge. Therefore, the Arch Structure objects can then be individually edited if needed.
* Split the command Arch Structural System from Arch Structure. For backwards compatibility, the command Arch Structure will run the command Arch Structural System when the requirements for the Arch Structural System (Structure + Axis) are met.
This commit is contained in:
alafr
2020-04-08 22:54:04 +02:00
parent dba9585d89
commit f6e0638cab
2 changed files with 89 additions and 12 deletions

View File

@@ -185,6 +185,77 @@ def placeAlongEdge(p1,p2,horizontal=False):
return pl
class CommandStructuresFromSelection:
""" The Arch Structures from selection command definition. """
def __init__(self):
pass
def GetResources(self):
return {'Pixmap': 'Arch_MultipleStructures',
'MenuText': QT_TRANSLATE_NOOP("Arch_Structure", "Multiple Structures"),
'ToolTip': QT_TRANSLATE_NOOP("Arch_Structure", "Create multiple Arch Structure objects from a selected base, using each selected edge as an extrusion path")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
selex = FreeCADGui.Selection.getSelectionEx()
if len(selex) >= 2:
FreeCAD.ActiveDocument.openTransaction(translate("Arch", "Create Structures From Selection"))
FreeCADGui.addModule("Arch")
FreeCADGui.addModule("Draft")
base = selex[0].Object # The first selected object is the base for the Structure objects
for selexi in selex[1:]: # All the edges from the other objects are used as a Tool (extrusion paths)
if len(selexi.SubElementNames) == 0:
subelement_names = ["Edge" + str(i) for i in range(1, len(selexi.Object.Shape.Edges) + 1)]
else:
subelement_names = [sub for sub in selexi.SubElementNames if sub.startswith("Edge")]
for sub in subelement_names:
FreeCADGui.doCommand("structure = Arch.makeStructure(FreeCAD.ActiveDocument." + base.Name + ")")
FreeCADGui.doCommand("structure.Tool = (FreeCAD.ActiveDocument." + selexi.Object.Name + ", '" + sub + "')")
FreeCADGui.doCommand("structure.BasePerpendicularToTool = True")
FreeCADGui.doCommand("Draft.autogroup(structure)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
else:
FreeCAD.Console.PrintError(translate("Arch", "Please select the base object first and then the edges to use as extrusion paths") + "\n")
class CommandStructuralSystem:
""" The Arch Structural System command definition. """
def __init__(self):
pass
def GetResources(self):
return {'Pixmap': 'Arch_StructuralSystem',
'MenuText': QT_TRANSLATE_NOOP("Arch_Structure", "Structural System"),
'ToolTip': QT_TRANSLATE_NOOP("Arch_Structure", "Create a structural system object from a selected structure and axis")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
if sel:
st = Draft.getObjectsOfType(sel, "Structure")
ax = Draft.getObjectsOfType(sel, "Axis")
if ax:
FreeCAD.ActiveDocument.openTransaction(translate("Arch", "Create Structural System"))
FreeCADGui.addModule("Arch")
if st:
FreeCADGui.doCommand("obj = Arch.makeStructuralSystem(" + ArchCommands.getStringList(st) + ", " + ArchCommands.getStringList(ax) + ")")
else:
FreeCADGui.doCommand("obj = Arch.makeStructuralSystem(axes = " + ArchCommands.getStringList(ax) + ")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
else:
FreeCAD.Console.PrintError(translate("Arch", "Please select at least an axis object") + "\n")
class _CommandStructure:
"the Arch Structure command definition"
@@ -224,16 +295,7 @@ class _CommandStructure:
st = Draft.getObjectsOfType(sel,"Structure")
ax = Draft.getObjectsOfType(sel,"Axis")
if ax:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Structural System"))
FreeCADGui.addModule("Arch")
if st:
FreeCADGui.doCommand("obj = Arch.makeStructuralSystem(" + ArchCommands.getStringList(st) + "," + ArchCommands.getStringList(ax) + ")")
else:
FreeCADGui.doCommand("obj = Arch.makeStructuralSystem(axes=" + ArchCommands.getStringList(ax) + ")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
FreeCADGui.runCommand("Arch_StructuralSystem")
return
elif not(ax) and not(st):
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Structure"))
@@ -1395,4 +1457,19 @@ class _ViewProviderStructuralSystem(ArchComponent.ViewProviderComponent):
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Structure',_CommandStructure())
FreeCADGui.addCommand("Arch_Structure", _CommandStructure())
FreeCADGui.addCommand("Arch_StructuralSystem", CommandStructuralSystem())
FreeCADGui.addCommand("Arch_StructuresFromSelection", CommandStructuresFromSelection())
class _ArchStructureGroupCommand:
def GetCommands(self):
return ("Arch_Structure", "Arch_StructuralSystem", "Arch_StructuresFromSelection")
def GetResources(self):
return { "MenuText": QT_TRANSLATE_NOOP("Arch_Structure", "Structure tools"),
"ToolTip": QT_TRANSLATE_NOOP("Arch_Structure", "Structure tools")
}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
FreeCADGui.addCommand("Arch_StructureTools", _ArchStructureGroupCommand())

View File

@@ -57,7 +57,7 @@ class ArchWorkbench(FreeCADGui.Workbench):
import Arch
# Set up command lists
self.archtools = ["Arch_Wall", "Arch_Structure", "Arch_Rebar",
self.archtools = ["Arch_Wall", "Arch_StructureTools", "Arch_Rebar",
"Arch_CurtainWall","Arch_BuildingPart",
"Arch_Project", "Arch_Site", "Arch_Building",
"Arch_Floor", "Arch_Reference",