Macro Site From Contours/de

Makro Site From Contours

Beschreibung
Mit diesem Makro kann eine Reihe von Objekten ausgewählt werden, die Höhenkonturen enthalten, und daraus einen Arch Grundstück erstellt werden. Die Konturen können in einer beliebigen Anzahl von Objekten gruppiert werden und müssen keine geschlossenen Linien bilden. All dies wird vom Makro übernommen. Intern wird aus jeder Kontur eine B-Spline erstellt, dann werden zwischen den Konturen Regelflächen erstellt, diese Regelflächen werden zu einem Hüllen-Objekt zusammengefasst und schließlich wird ein Arch Grundstück erstellt, die diese Shell als Terrain verwendet.

Versionsmakro : 1.0
Datum der letzten Änderung : 2018-08-30
FreeCAD version : Alle
Herunterladen : ToolBar Icon
Autor: yorik
Autor
yorik
Herunterladen
ToolBar Icon
Links
Macro-Version
1.0
Datum der letzten Änderung
2018-08-30
FreeCAD-Version(s)
Alle
Standardverknüpfung
None
Siehe auch
None

Beschreibung

Mit diesem Makro kann man eine Reihe von Objekten auswählen, die Höhenkonturen enthalten, und daraus eine Bogenfläche erstellen. Die Konturen können in einer beliebigen Anzahl von Objekten gruppiert werden und müssen keine geschlossenen Linien bilden. All dies wird vom Makro übernommen. Intern wird aus jeder Kontur eine B-Spline erstellt, dann werden zwischen den Konturen Regelflächen erstellt, diese Regelflächen werden zu einem Shell-Objekt zusammengefasst und schließlich wird eine Arch Site erstellt, die diese Shell als Terrain verwendet.

Skript

Werkzeugleistensymbol

Macro Site From Contours.FCMacro

# This macro builds an Arch Site object out of different level curves.
# It doesn't matter how many object contain the curves or if they
# are connected into wires or not.

import FreeCAD,FreeCADGui,Part,Draft,DraftGeomUtils,Arch

# first build a list of edges from selected objects

edges = []
for obj in FreeCADGui.Selection.getSelection():
    edges.extend(obj.Shape.Edges)

# sort our edges into connected wires

wires = DraftGeomUtils.findWires(edges)

# build a bspline for each wire

bsplines = []
for wire in wires:
    points = []
    for vert in wire.Vertexes:
        points.append(vert.Point)
    bspline = Draft.makeBSpline(points)
    bsplines.append(bspline)

# hide the bsplines

for bspline in bsplines:
    bspline.ViewObject.hide()

# sort the bsplines by elevation (we use the z of their first point to sort)

bsplines.sort(key=lambda b: b.Points[0].z)

# build one ruled surface from each pair of bsplines

ruledsurfaces = []
for i in range(len(bsplines)-1):
    ruled = FreeCAD.ActiveDocument.addObject('Part::RuledSurface', 'TerrainSection')
    ruled.Curve1 = (bsplines[i],[''])
    ruled.Curve2 = (bsplines[i+1],[''])
    ruledsurfaces.append(ruled)

# hide the ruled surfaces

for ruled in ruledsurfaces:
    ruled.ViewObject.hide()

# at this stade we need to recompute to build all the shapes before getting the faces

FreeCAD.ActiveDocument.recompute()

# make a shell object out of all the ruled surfaces

faces = []
for ruled in ruledsurfaces:
    faces.extend(ruled.Shape.Faces)
shell = Part.Shell(faces)
terrain = FreeCAD.ActiveDocument.addObject('Part::Feature', 'Terrain')
terrain.Shape = shell

# make a site object using our shell as terrain

site = Arch.makeSite()
site.Terrain = terrain

# recompute one last time

FreeCAD.ActiveDocument.recompute()

Verweis

Die Diskussion im Forum Create Toposurface from DXF