this explanation will go in reverse. final result > back to the data

i got a bunch of contours by applying 200 cross sections to a shell object (single GUI operation) with 1 unit separation if you look at it from the top, it is a contour map. it's ugly because it is only as good as the shell being cut

i got the shell by joining a bunch of triangular faces (this was a TON of work. i picked point pairs for each line and line triples for each face) you need to keep the triangles small and as equal sided as possible.

lots and lots of lines radiating from a single point is a bad sign in a triangular mesh, it indicate the result won't be very realistic. i did my best to make the triangles not too skinny by choosing the right groups of three, but you can see there are spots i didn't have much of a choice. for any quadrangle, there are two ways to cut it into two triangles. sometimes one is clearly better, sometimes not, can't spend forever on it. more points, well spread out, helps a lot.

i drew the triangles on top of your data, after i had rotated and aligned it. the colors match your set.

each data point has a circle at 0 elev, and a line going from the center of the circle to the data point elevation.

data set 1 and 3 each have a triangle for connecting datasets, dataset 2 has a single line for connecting datasets. (dataset 3 is basically just the triangle). this was really annoying to track, i had to count the data points a few times to match 3, 5,17, and 34. since it all fits, i think this is right. not sure. for the skae of this exercise, it's not super important

to move the points as a group, i made a compound object out of all the circles and lines in each group. i moved the yellow triangle to the green dataset by matching the red circles using Draft Move. then i used Draft Rotate to spin it. only one side of the triangles was even close in length, so lined up that side.

same thing with the orange line, there was only one place it would fit. Draft move, Draft Rotate.

you can use the Draft Point tool and enter x,y,z directly one at a time. i did it with a script, to draw the ground circle and the vertical lines, because i wanted those to help me align things.

i created the objects one set at a time like so:

Code: Select all

```
import FreeCAD, Part, math
from FreeCAD import Base
from FreeCAD import Gui
#put raw data in here
roo_raw_set_1 = [[5818,-10495,100],
[-4294,7909,100],
[1890,-3146,142],
[1169,-1733,143.7],
[-88,431,135.3],
[240,163,141.3],
[530,883,136.5],
[126,1595,141.5],
[779,450,142.2],
[1106,664,137],
[1983,1145,121.2],
[2221,1272,117.7],
[2864,1640,112],
[3751,2122,105.1],
[4613,2610,90.7],
[0,1250,144.1],
[4874,2758,97]]
roo_elev_set_1 = [Base.Vector(0,0,0)]*len(roo_raw_set_1)
roo_ground_set_1 = [Base.Vector(0,0,0)]*len(roo_raw_set_1)
for i in range(0,len(roo_elev_set_1)):
roo_elev_set_1[i] = Base.Vector(roo_raw_set_1[i][0],roo_raw_set_1[i][1],roo_raw_set_1[i][2])
for i in range(0,len(roo_ground_set_1)):
roo_ground_set_1[i] = Base.Vector(roo_raw_set_1[i][0],roo_raw_set_1[i][1],0)
for i in range(0,len(roo_ground_set_1)):
Part.show(Part.Circle(roo_ground_set_1[i], Base.Vector(0,0,1), 50).toShape())
for i in range(0,len(roo_ground_set_1)):
Part.show(Part.LineSegment(roo_ground_set_1[i], roo_elev_set_1[i]).toShape())
#ref triangle for set 1 <3,5,17> = [2],[4],[16]
Part.show(Part.LineSegment(roo_ground_set_1[2], roo_ground_set_1[4]).toShape())
Part.show(Part.LineSegment(roo_ground_set_1[4], roo_ground_set_1[16]).toShape())
Part.show(Part.LineSegment(roo_ground_set_1[16], roo_ground_set_1[2]).toShape())
```

then i ran the next data set

Code: Select all

```
roo_raw_set_2 = [[1500,0,97],
[757,386,108.8],
[1085,-803,79.9],
[891,-1483,53.1],
[1231,-1860,7.2],
[84,-1207,66.7],
[-1300,-2990,44.4],
[-571,-2884,36.4],
[-550,-3284,-199.1],
[-527,-2842,10.2],
[-1778,-2317,75.2],
[-1220,-1404,61.2],
[-268,80,76.2],
[-1698,89,72.4],
[-1223,1181,94.7],
[-2021,1820,128.3],
[-2167,1490,100.5]]
roo_elev_set_2 = [Base.Vector(0,0,0)]*len(roo_raw_set_2)
roo_ground_set_2 = [Base.Vector(0,0,0)]*len(roo_raw_set_2)
for i in range(0,len(roo_elev_set_2)):
roo_elev_set_2[i] = Base.Vector(roo_raw_set_2[i][0],roo_raw_set_2[i][1],roo_raw_set_2[i][2])
for i in range(0,len(roo_ground_set_2)):
roo_ground_set_2[i] = Base.Vector(roo_raw_set_2[i][0],roo_raw_set_2[i][1],0)
for i in range(0,len(roo_ground_set_2)):
Part.show(Part.Circle(roo_ground_set_2[i], Base.Vector(0,0,1), 50).toShape())
for i in range(0,len(roo_ground_set_2)):
Part.show(Part.LineSegment(roo_ground_set_2[i], roo_elev_set_2[i]).toShape())
#ref line for set 2 <17,34> = [0],[16]
Part.show(Part.LineSegment(roo_ground_set_2[0], roo_ground_set_2[16]).toShape())
```

Code: Select all

```
roo_raw_set_3 = [[0,-3200,100.5],
[-258,29,141.3],
[3801,-266,134.1]]
roo_elev_set_3 = [Base.Vector(0,0,0)]*len(roo_raw_set_3)
roo_ground_set_3 = [Base.Vector(0,0,0)]*len(roo_raw_set_3)
for i in range(0,len(roo_elev_set_3)):
roo_elev_set_3[i] = Base.Vector(roo_raw_set_3[i][0],roo_raw_set_3[i][1],roo_raw_set_3[i][2])
for i in range(0,len(roo_ground_set_3)):
roo_ground_set_3[i] = Base.Vector(roo_raw_set_3[i][0],roo_raw_set_3[i][1],0)
for i in range(0,len(roo_ground_set_3)):
Part.show(Part.Circle(roo_ground_set_3[i], Base.Vector(0,0,1), 50).toShape())
for i in range(0,len(roo_ground_set_3)):
Part.show(Part.LineSegment(roo_ground_set_3[i], roo_elev_set_3[i]).toShape())
#ref triangle for set 1 <3,5,17> = [2],[4],[16]
Part.show(Part.LineSegment(roo_ground_set_3[0], roo_ground_set_3[1]).toShape())
Part.show(Part.LineSegment(roo_ground_set_3[1], roo_ground_set_3[2]).toShape())
Part.show(Part.LineSegment(roo_ground_set_3[2], roo_ground_set_3[0]).toShape())
```