Makrodefinicja: Teren z konturu
Appearance
This is the approved revision of this page, as well as being the most recent.
| 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 |
| Przepisy na makropolecenia Jak zainstalować makrodefinicje Dostosowanie pasków narzędzi |
| 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
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
