Macro Site From Contours/pl

Macro Site From Contours

Opis
To makro pozwala wybrać serię obiektów zawierających linie poziomic i utworzyć na ich podstawie Arch Site. Linie poziomic mogą być pogrupowane w dowolną liczbę obiektów i nie muszą tworzyć zamkniętych przewodów — wszystko to zostanie automatycznie obsłużone przez makro. Wewnątrz makra z każdej poziomicy zostanie utworzona krzywa B-spline, następnie między poziomicami zostaną wygenerowane powierzchnie prostokreślne, które zostaną połączone w obiekt typu shell. Na koniec zostanie utworzony Arch Site, wykorzystujący tę powłokę jako teren.

Macro version: 1.0
Last modified: 2018-08-30
FreeCAD version: All
Download: Ikona paska narzędzi
Autor: yorik
Autor
yorik
Do pobrania
Ikona paska narzędzi
Odnośniki
Wersja Makrodefinicji
1.0
Data zmian
2018-08-30
Wersja FreeCAD
All
Domyślny skrót
Brak
Zobacz również
-

Opis

To makro pozwala wybrać serię obiektów zawierających linie poziomic i utworzyć na ich podstawie Arch Site. Poziomice mogą być pogrupowane w dowolną liczbę obiektów i nie muszą tworzyć zamkniętych przewodów — wszystko to zostanie automatycznie obsłużone przez makro. Wewnątrz makra z każdej poziomicy zostanie utworzona krzywa B-spline, następnie między poziomicami zostaną wygenerowane powierzchnie prostokreślne, które zostaną połączone w obiekt typu shell. Na końcu zostanie utworzony Arch Site, wykorzystujący tę powłokę jako teren.

Skrypt

Ikona paska narzędzi

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()

Łącze

Dyskusja na forum Create Toposurface from DXF