Arch: Axis-bbased structural systems are now a separate object - fixes #1486

This commit is contained in:
Yorik van Havre 2014-03-28 18:31:22 -03:00
parent 4f008b36f8
commit 08d2121334
7 changed files with 684 additions and 76 deletions

View File

@ -81,7 +81,7 @@ def addComponents(objectsList,host):
if not o in c:
c.append(o)
host.Group = c
elif hostType in ["Wall","Structure","Window","Roof","Stairs"]:
elif hostType in ["Wall","Structure","Window","Roof","Stairs","StructuralSystem"]:
import DraftGeomUtils
a = host.Additions
if hasattr(host,"Axes"):
@ -122,7 +122,7 @@ def removeComponents(objectsList,host=None):
if not isinstance(objectsList,list):
objectsList = [objectsList]
if host:
if Draft.getType(host) in ["Wall","Structure","Window","Roof","Stairs"]:
if Draft.getType(host) in ["Wall","Structure","Window","Roof","Stairs","StructuralSystem"]:
if hasattr(host,"Tool"):
if objectsList[0] == host.Tool:
host.Tool = None

View File

@ -309,17 +309,27 @@ def makeStructure(baseobj=None,length=0,width=0,height=0,name=translate("Arch","
obj.ViewObject.ShapeColor = ArchCommands.getDefaultColor("Structure")
return obj
def makeStructuralSystem(objects,axes):
def makeStructuralSystem(objects,axes,name=translate("Arch","StructuralSystem")):
'''makeStructuralSystem(objects,axes): makes a structural system
based on the given objects and axes'''
result = []
if objects and axes:
if not isinstance(objects,list):
objects = [objects]
for o in objects:
s = makeStructure(o)
s.Axes = axes
result.append(s)
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name)
_StructuralSystem(obj)
_ViewProviderStructuralSystem(obj.ViewObject)
obj.Base = o
obj.Axes = axes
result.append(obj)
o.ViewObject.hide()
Draft.formatObject(obj,o)
FreeCAD.ActiveDocument.recompute()
return result
if len(result) == 1:
return result[0]
else:
return result
def makeProfile(W=46,H=80,tw=3.8,tf=5.2,name="Profile"):
'''makeProfile(W,H,tw,tf): returns a shape with one face describing
@ -336,7 +346,6 @@ def makeProfile(W=46,H=80,tw=3.8,tf=5.2,name="Profile"):
Draft._ViewProviderDraft(obj.ViewObject)
return obj
class _CommandStructure:
"the Arch Structure command definition"
def GetResources(self):
@ -354,19 +363,20 @@ class _CommandStructure:
self.continueCmd = False
sel = FreeCADGui.Selection.getSelection()
if sel:
if Draft.getType(sel[0]) != "Structure":
# direct creation
st = Draft.getObjectsOfType(sel,"Structure")
ax = Draft.getObjectsOfType(sel,"Axis")
if st and ax:
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Structural System")))
FreeCADGui.doCommand("import Arch")
FreeCADGui.doCommand("Arch.makeStructuralSystem(" + ArchCommands.getStringList(st) + "," + ArchCommands.getStringList(ax) + ")")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
elif not(ax) and not(st):
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Structure")))
FreeCADGui.doCommand("import Arch")
# 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 + ")")
for obj in sel:
FreeCADGui.doCommand("Arch.makeStructure(FreeCAD.ActiveDocument." + obj.Name + ")")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
@ -530,10 +540,8 @@ class _Structure(ArchComponent.Component):
obj.addProperty("App::PropertyLength","Length","Arch",translate("Arch","The length of this element, if not based on a profile"))
obj.addProperty("App::PropertyLength","Width","Arch",translate("Arch","The width of this element, if not based on a profile"))
obj.addProperty("App::PropertyLength","Height","Arch",translate("Arch","The height or extrusion depth of this element. Keep 0 for automatic"))
obj.addProperty("App::PropertyLinkList","Axes","Arch",translate("Arch","Axes systems this structure is built on"))
obj.addProperty("App::PropertyLinkList","Armatures","Arch",translate("Arch","Armatures contained in this element"))
obj.addProperty("App::PropertyVector","Normal","Arch",translate("Arch","The normal extrusion direction of this object (keep (0,0,0) for automatic normal)"))
obj.addProperty("App::PropertyIntegerList","Exclude","Arch",translate("Arch","The element numbers to exclude when this structure is based on axes"))
obj.addProperty("App::PropertyEnumeration","Role","Arch",translate("Arch","The role of this structural element"))
obj.addProperty("App::PropertyVectorList","Nodes","Arch",translate("Arch","The structural nodes of this element"))
self.Type = "Structure"
@ -638,36 +646,17 @@ class _Structure(ArchComponent.Component):
base = self.processSubShapes(obj,base,pl)
if base:
# applying axes
pts = self.getAxisPoints(obj)
apl = self.getAxisPlacement(obj)
if pts:
fsh = []
for i in range(len(pts)):
if hasattr(obj,"Exclude"):
if i in obj.Exclude:
continue
sh = base.copy()
if apl:
sh.Placement.Rotation = apl.Rotation
sh.translate(pts[i])
fsh.append(sh)
obj.Shape = Part.makeCompound(fsh)
# finalizing
else:
if base:
if not base.isNull():
if base.isValid() and base.Solids:
if base.Volume < 0:
base.reverse()
if base.Volume < 0:
FreeCAD.Console.PrintError(translate("Arch","Couldn't compute a shape"))
return
base = base.removeSplitter()
obj.Shape = base
if not pl.isNull():
obj.Placement = pl
if not base.isNull():
if base.isValid() and base.Solids:
if base.Volume < 0:
base.reverse()
if base.Volume < 0:
FreeCAD.Console.PrintError(translate("Arch","Couldn't compute a shape"))
return
base = base.removeSplitter()
obj.Shape = base
if not pl.isNull():
obj.Placement = pl
def onChanged(self,obj,prop):
self.hideSubobjects(obj,prop)
@ -694,27 +683,7 @@ class _Structure(ArchComponent.Component):
self.nodes = [p1,p2]
#print "calculating nodes: ",self.nodes
obj.Nodes = self.nodes
def getAxisPoints(self,obj):
"returns the gridpoints of linked axes"
import DraftGeomUtils
pts = []
if len(obj.Axes) == 1:
for e in obj.Axes[0].Shape.Edges:
pts.append(e.Vertexes[0].Point)
elif len(obj.Axes) >= 2:
set1 = obj.Axes[0].Shape.Edges
set2 = obj.Axes[1].Shape.Edges
for e1 in set1:
for e2 in set2:
pts.extend(DraftGeomUtils.findIntersection(e1,e2))
return pts
def getAxisPlacement(self,obj):
"returns an axis placement"
if obj.Axes:
return obj.Axes[0].Placement
return None
class _ViewProviderStructure(ArchComponent.ViewProviderComponent):
"A View Provider for the Structure object"
@ -782,7 +751,6 @@ class _ViewProviderStructure(ArchComponent.ViewProviderComponent):
self.pointstyle.pointSize = vobj.NodeSize
ArchComponent.ViewProviderComponent.onChanged(self,vobj,prop)
class _Profile(Draft._DraftObject):
"A parametric beam profile object"
@ -813,5 +781,92 @@ class _Profile(Draft._DraftObject):
obj.Shape = p
obj.Placement = pl
class _StructuralSystem(ArchComponent.Component):
"The Structural System object"
def __init__(self,obj):
ArchComponent.Component.__init__(self,obj)
obj.addProperty("App::PropertyLinkList","Axes","Arch",translate("Arch","Axes systems this structure is built on"))
obj.addProperty("App::PropertyIntegerList","Exclude","Arch",translate("Arch","The element numbers to exclude when this structure is based on axes"))
self.Type = "StructuralSystem"
def execute(self,obj):
"creates the structure shape"
import Part, DraftGeomUtils
# creating base shape
pl = obj.Placement
if obj.Base:
if obj.Base.isDerivedFrom("Part::Feature"):
if obj.Base.Shape.isNull():
return
if not obj.Base.Shape.Solids:
return
base = None
# applying axes
pts = self.getAxisPoints(obj)
apl = self.getAxisPlacement(obj)
if pts:
fsh = []
for i in range(len(pts)):
sh = obj.Base.Shape.copy()
if hasattr(obj,"Exclude"):
if i in obj.Exclude:
continue
if apl:
sh.Placement.Rotation = sh.Placement.Rotation.multiply(apl.Rotation)
sh.translate(pts[i])
fsh.append(sh)
if fsh:
base = Part.makeCompound(fsh)
base = self.processSubShapes(obj,base,pl)
if base:
if not base.isNull():
if base.isValid() and base.Solids:
if base.Volume < 0:
base.reverse()
if base.Volume < 0:
FreeCAD.Console.PrintError(translate("Arch","Couldn't compute a shape"))
return
base = base.removeSplitter()
obj.Shape = base
if not pl.isNull():
obj.Placement = pl
def getAxisPoints(self,obj):
"returns the gridpoints of linked axes"
import DraftGeomUtils
pts = []
if len(obj.Axes) == 1:
for e in obj.Axes[0].Shape.Edges:
pts.append(e.Vertexes[0].Point)
elif len(obj.Axes) >= 2:
set1 = obj.Axes[0].Shape.Edges
set2 = obj.Axes[1].Shape.Edges
for e1 in set1:
for e2 in set2:
pts.extend(DraftGeomUtils.findIntersection(e1,e2))
return pts
def getAxisPlacement(self,obj):
"returns an axis placement"
if obj.Axes:
return obj.Axes[0].Placement
return None
class _ViewProviderStructuralSystem(ArchComponent.ViewProviderComponent):
"A View Provider for the Structural System object"
def getIcon(self):
import Arch_rc
return ":/icons/Arch_StructuralSystem_Tree.svg"
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Structure',_CommandStructure())

File diff suppressed because one or more lines are too long

View File

@ -42,6 +42,8 @@
<file>icons/Arch_Frame_Tree.svg</file>
<file>icons/Arch_Survey.svg</file>
<file>icons/IFC.svg</file>
<file>icons/Arch_StructuralSystem.svg</file>
<file>icons/Arch_StructuralSystem_Tree.svg</file>
<file>ui/archprefs-base.ui</file>
<file>ui/archprefs-import.ui</file>
<file>ui/ParametersWindowDouble.svg</file>

View File

@ -0,0 +1,279 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64px"
height="64px"
id="svg2985"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="Arch_Structure.svg">
<defs
id="defs2987">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-99.221344 : 76.178092 : 1"
inkscape:vp_y="0 : 1102.1522 : 0"
inkscape:vp_z="237.30654 : 103.20253 : 1"
inkscape:persp3d-origin="37.520737 : 45.960393 : 1"
id="perspective2993" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-56.67589 : 60.541728 : 1"
inkscape:vp_y="0 : 1102.1522 : 0"
inkscape:vp_z="125.67018 : 63.747989 : 1"
inkscape:persp3d-origin="37.520737 : 35.960393 : 1"
id="perspective2993-4" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-46.892514 : 61.217294 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="95.652941 : 64.126385 : 1"
inkscape:persp3d-origin="26.74385 : 38.914263 : 1"
id="perspective2993-7" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-49.818182 : 58.545455 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="92.727273 : 61.454546 : 1"
inkscape:persp3d-origin="23.818182 : 36.242424 : 1"
id="perspective2993-3" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-56.67589 : 60.541728 : 1"
inkscape:vp_y="0 : 1102.1522 : 0"
inkscape:vp_z="125.67018 : 63.747989 : 1"
inkscape:persp3d-origin="37.520737 : 35.960393 : 1"
id="perspective2993-9" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-194.65743 : 117.57652 : 1"
inkscape:vp_y="0 : 1102.1522 : 0"
inkscape:vp_z="141.87045 : 144.60095 : 1"
inkscape:persp3d-origin="-57.915345 : 87.358818 : 1"
id="perspective2993-0" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-99.221344 : 76.178092 : 1"
inkscape:vp_y="0 : 1102.1522 : 0"
inkscape:vp_z="237.30654 : 103.20253 : 1"
inkscape:persp3d-origin="37.520737 : 45.960393 : 1"
id="perspective4189" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-99.221344 : 76.178092 : 1"
inkscape:vp_y="0 : 1102.1522 : 0"
inkscape:vp_z="237.30654 : 103.20253 : 1"
inkscape:persp3d-origin="37.520737 : 45.960393 : 1"
id="perspective4191" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.5"
inkscape:cx="4.3186643"
inkscape:cy="35.73977"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1053"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata2990">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
style="fill:none;stroke:#000eb3;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:5,2.5;stroke-dashoffset:0"
d="M 62.647595,15.862456 0.82766681,34.839131"
id="path4150"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000eb3;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:5,2.5;stroke-dashoffset:0"
d="M 1.324571,27.300026 62.044877,50.657313"
id="path4152"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000eb3;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:5,2.5;stroke-dashoffset:0"
d="M 1.7272727,48 62.727273,25.181818"
id="path4156"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000eb3;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:5,2.5;stroke-dashoffset:0"
d="M 62.545455,38.636364 17.818182,58.909091"
id="path4158"
inkscape:connector-curvature="0" />
<g
sodipodi:type="inkscape:box3d"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="g3223"
inkscape:perspectiveID="#perspective2993"
inkscape:corner0="-0.016852246 : 0.0023248852 : 0 : 1"
inkscape:corner7="-0.079977241 : -0.024748012 : 0.049480549 : 1">
<path
sodipodi:type="inkscape:box3dside"
id="path3233"
style="fill:#afafde;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="13"
d="M 39.864648,46.30119 49.407676,50.313596 58.997472,45.74496 49.32549,42.2041 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3225"
style="fill:#353564;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="6"
d="m 39.864648,15.951273 0,30.349917 9.460842,-4.09709 0,-28.895637 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3235"
style="fill:#e9e9ff;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="11"
d="m 49.32549,13.308463 9.671982,1.659446 0,30.777051 -9.671982,-3.54086 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3227"
style="color:#000000;fill:#774901;fill-opacity:1;fill-rule:evenodd;stroke:#473400;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:box3dsidetype="5"
d="m 39.864648,15.951273 9.543028,1.930024 9.589796,-2.913388 -9.671982,-1.659446 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3231"
style="color:#000000;fill:#fff14a;fill-opacity:1;fill-rule:evenodd;stroke:#473400;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:box3dsidetype="14"
d="m 49.407676,17.881297 0,32.432299 9.589796,-4.568636 0,-30.777051 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3229"
style="color:#000000;fill:#ffc900;fill-opacity:1;fill-rule:evenodd;stroke:#473400;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:box3dsidetype="3"
d="m 39.864648,15.951273 9.543028,1.930024 0,32.432299 -9.543028,-4.012406 z" />
</g>
<g
sodipodi:type="inkscape:box3d"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="g3237"
inkscape:perspectiveID="#perspective2993"
inkscape:corner0="0.13775877 : 0.002304779 : 0 : 1"
inkscape:corner7="0.068199756 : -0.024658264 : 0.045542488 : 1">
<path
sodipodi:type="inkscape:box3dside"
id="path3247"
style="fill:#afafde;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="13"
d="m 20.964133,38.267451 7.826236,3.284912 8.52652,-3.302181 -8.026244,-2.964369 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3239"
style="fill:#353564;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="6"
d="m 20.964133,12.148226 0,26.119225 8.326512,-2.981638 0,-25.113957 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3249"
style="fill:#e9e9ff;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="11"
d="m 29.290645,10.171856 8.026244,1.395871 0,26.682455 -8.026244,-2.964369 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3241"
style="color:#000000;fill:#774901;fill-opacity:1;fill-rule:evenodd;stroke:#473400;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:box3dsidetype="5"
d="m 20.964133,12.148226 7.826236,1.584081 8.52652,-2.16458 -8.026244,-1.395871 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3245"
style="color:#000000;fill:#fff14a;fill-opacity:1;fill-rule:evenodd;stroke:#473400;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:box3dsidetype="14"
d="m 28.790369,13.732307 0,27.820056 8.52652,-3.302181 0,-26.682455 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3243"
style="color:#000000;fill:#ffc900;fill-opacity:1;fill-rule:evenodd;stroke:#473400;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:box3dsidetype="3"
d="m 20.964133,12.148226 7.826236,1.584081 0,27.820056 -7.826236,-3.284912 z" />
</g>
<g
sodipodi:type="inkscape:box3d"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="g3279"
inkscape:perspectiveID="#perspective2993"
inkscape:corner0="0.32700775 : 0.0021012907 : 0 : 1"
inkscape:corner7="0.24805774 : -0.024670458 : 0.046124332 : 1">
<path
sodipodi:type="inkscape:box3dside"
id="path3289"
style="fill:#afafde;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="13"
d="M 3.8240836,31.083372 10.342562,33.820019 18.431503,31.217513 11.6669,28.722427 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3281"
style="fill:#353564;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="6"
d="m 3.8240836,8.8479772 0,22.2353948 7.8428164,-2.360945 0,-21.4884952 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3291"
style="fill:#e9e9ff;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="11"
d="m 11.6669,7.2339318 6.764603,1.184207 0,22.7993742 -6.764603,-2.495086 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3283"
style="color:#000000;fill:#774901;fill-opacity:1;fill-rule:evenodd;stroke:#473400;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:box3dsidetype="5"
d="M 3.8240836,8.8479772 10.342562,10.178051 18.431503,8.4181388 11.6669,7.2339318 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3287"
style="color:#000000;fill:#fff14a;fill-opacity:1;fill-rule:evenodd;stroke:#473400;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:box3dsidetype="14"
d="m 10.342562,10.178051 0,23.641968 8.088941,-2.602506 0,-22.7993742 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3285"
style="color:#000000;fill:#ffc900;fill-opacity:1;fill-rule:evenodd;stroke:#473400;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:box3dsidetype="3"
d="m 3.8240836,8.8479772 6.5184784,1.3300738 0,23.641968 -6.5184784,-2.736647 z" />
</g>
<path
style="fill:none;stroke:#000eb3;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:5, 2.5;stroke-dashoffset:0"
d="M 1.6398471,39.594083 43.269244,61.496825"
id="path4152-0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<g
id="g3223-6"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<g
id="g3237-6"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,267 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64px"
height="64px"
id="svg2985"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="Arch_StructuralSystem.svg">
<defs
id="defs2987">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-99.221344 : 76.178092 : 1"
inkscape:vp_y="0 : 1102.1522 : 0"
inkscape:vp_z="237.30654 : 103.20253 : 1"
inkscape:persp3d-origin="37.520737 : 45.960393 : 1"
id="perspective2993" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-56.67589 : 60.541728 : 1"
inkscape:vp_y="0 : 1102.1522 : 0"
inkscape:vp_z="125.67018 : 63.747989 : 1"
inkscape:persp3d-origin="37.520737 : 35.960393 : 1"
id="perspective2993-4" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-46.892514 : 61.217294 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="95.652941 : 64.126385 : 1"
inkscape:persp3d-origin="26.74385 : 38.914263 : 1"
id="perspective2993-7" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-49.818182 : 58.545455 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="92.727273 : 61.454546 : 1"
inkscape:persp3d-origin="23.818182 : 36.242424 : 1"
id="perspective2993-3" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-56.67589 : 60.541728 : 1"
inkscape:vp_y="0 : 1102.1522 : 0"
inkscape:vp_z="125.67018 : 63.747989 : 1"
inkscape:persp3d-origin="37.520737 : 35.960393 : 1"
id="perspective2993-9" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-194.65743 : 117.57652 : 1"
inkscape:vp_y="0 : 1102.1522 : 0"
inkscape:vp_z="141.87045 : 144.60095 : 1"
inkscape:persp3d-origin="-57.915345 : 87.358818 : 1"
id="perspective2993-0" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-99.221344 : 76.178092 : 1"
inkscape:vp_y="0 : 1102.1522 : 0"
inkscape:vp_z="237.30654 : 103.20253 : 1"
inkscape:persp3d-origin="37.520737 : 45.960393 : 1"
id="perspective4189" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-99.221344 : 76.178092 : 1"
inkscape:vp_y="0 : 1102.1522 : 0"
inkscape:vp_z="237.30654 : 103.20253 : 1"
inkscape:persp3d-origin="37.520737 : 45.960393 : 1"
id="perspective4191" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.75"
inkscape:cx="-7.5598237"
inkscape:cy="24.178318"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1053"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata2990">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
style="fill:none;stroke:#000eb3;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:8,4;stroke-dashoffset:0"
d="M 62.647595,15.862456 0.82766681,34.839131"
id="path4150"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000eb3;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:8,4;stroke-dashoffset:0"
d="M 1.7272727,48 62.727273,25.181818"
id="path4156"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000eb3;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:8,4;stroke-dashoffset:0"
d="M 62.545455,38.636364 17.818182,58.909091"
id="path4158"
inkscape:connector-curvature="0" />
<g
sodipodi:type="inkscape:box3d"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="g3223"
inkscape:perspectiveID="#perspective2993"
inkscape:corner0="-0.016852246 : 0.0023248852 : 0 : 1"
inkscape:corner7="-0.079977241 : -0.024748012 : 0.049480549 : 1">
<path
sodipodi:type="inkscape:box3dside"
id="path3233"
style="fill:#afafde;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="13"
d="M 39.864648,46.30119 49.407676,50.313596 58.997472,45.74496 49.32549,42.2041 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3225"
style="fill:#353564;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="6"
d="m 39.864648,15.951273 0,30.349917 9.460842,-4.09709 0,-28.895637 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3235"
style="fill:#e9e9ff;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="11"
d="m 49.32549,13.308463 9.671982,1.659446 0,30.777051 -9.671982,-3.54086 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3227"
style="color:#000000;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-start:none;marker-mid:none;marker-end:none"
inkscape:box3dsidetype="5"
d="m 39.864648,15.951273 9.543028,1.930024 9.589796,-2.913388 -9.671982,-1.659446 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3231"
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-start:none;marker-mid:none;marker-end:none"
inkscape:box3dsidetype="14"
d="m 49.407676,17.881297 0,32.432299 9.589796,-4.568636 0,-30.777051 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3229"
style="color:#000000;fill:#bfbfbf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-start:none;marker-mid:none;marker-end:none"
inkscape:box3dsidetype="3"
d="m 39.864648,15.951273 9.543028,1.930024 0,32.432299 -9.543028,-4.012406 z" />
</g>
<g
sodipodi:type="inkscape:box3d"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="g3237"
inkscape:perspectiveID="#perspective2993"
inkscape:corner0="0.13775877 : 0.002304779 : 0 : 1"
inkscape:corner7="0.068199756 : -0.024658264 : 0.045542488 : 1">
<path
sodipodi:type="inkscape:box3dside"
id="path3247"
style="fill:#afafde;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="13"
d="m 20.964133,38.267451 7.826236,3.284912 8.52652,-3.302181 -8.026244,-2.964369 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3239"
style="fill:#353564;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="6"
d="m 20.964133,12.148226 0,26.119225 8.326512,-2.981638 0,-25.113957 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3249"
style="fill:#e9e9ff;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="11"
d="m 29.290645,10.171856 8.026244,1.395871 0,26.682455 -8.026244,-2.964369 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3241"
style="color:#000000;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-start:none;marker-mid:none;marker-end:none"
inkscape:box3dsidetype="5"
d="m 20.964133,12.148226 7.826236,1.584081 8.52652,-2.16458 -8.026244,-1.395871 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3245"
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-start:none;marker-mid:none;marker-end:none"
inkscape:box3dsidetype="14"
d="m 28.790369,13.732307 0,27.820056 8.52652,-3.302181 0,-26.682455 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3243"
style="color:#000000;fill:#bfbfbf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-start:none;marker-mid:none;marker-end:none"
inkscape:box3dsidetype="3"
d="m 20.964133,12.148226 7.826236,1.584081 0,27.820056 -7.826236,-3.284912 z" />
</g>
<g
sodipodi:type="inkscape:box3d"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="g3279"
inkscape:perspectiveID="#perspective2993"
inkscape:corner0="0.32700775 : 0.0021012907 : 0 : 1"
inkscape:corner7="0.24805774 : -0.024670458 : 0.046124332 : 1">
<path
sodipodi:type="inkscape:box3dside"
id="path3289"
style="fill:#afafde;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="13"
d="M 3.8240836,31.083372 10.342562,33.820019 18.431503,31.217513 11.6669,28.722427 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3281"
style="fill:#353564;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="6"
d="m 3.8240836,8.8479772 0,22.2353948 7.8428164,-2.360945 0,-21.4884952 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3291"
style="fill:#e9e9ff;fill-rule:evenodd;stroke:none"
inkscape:box3dsidetype="11"
d="m 11.6669,7.2339318 6.764603,1.184207 0,22.7993742 -6.764603,-2.495086 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3283"
style="color:#000000;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-start:none;marker-mid:none;marker-end:none"
inkscape:box3dsidetype="5"
d="M 3.8240836,8.8479772 10.342562,10.178051 18.431503,8.4181388 11.6669,7.2339318 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3287"
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:box3dsidetype="14"
d="m 10.342562,10.178051 0,23.641968 8.088941,-2.602506 0,-22.7993742 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3285"
style="color:#000000;fill:#bfbfbf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-start:none;marker-mid:none;marker-end:none"
inkscape:box3dsidetype="3"
d="m 3.8240836,8.8479772 6.5184784,1.3300738 0,23.641968 -6.5184784,-2.736647 z" />
</g>
<g
id="g3223-6"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<g
id="g3237-6"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -331,10 +331,15 @@ class Snapper:
snaps.append([obj.ViewObject.Proxy.p3,'endpoint',self.toWP(obj.ViewObject.Proxy.p3)])
#for pt in [obj.Start,obj.End,obj.Dimline]:
# snaps.append([pt,'endpoint',self.toWP(pt)])
elif Draft.getType(obj) == "Axis":
for edge in obj.Shape.Edges:
snaps.extend(self.snapToEndpoints(edge))
elif Draft.getType(obj) == "Mesh":
# for meshes we only snap to vertices
snaps.extend(self.snapToEndpoints(obj.Mesh))
elif Draft.getType(obj) == "Points":
# for points we only snap to points
snaps.extend(self.snapToEndpoints(obj.Points))