Hallo Forum,
kennt jemand eine Möglichkeit, aus einem bestehenden TIN das Umringpolygon (Polygon zum Ausschneiden) zu extrahieren - bzw. die Dreieckspolygone, die eine Dreiecksseite besitzen, die an kein weiteres Dreieck grenzt.
Grüße Andreas
kennt jemand eine Möglichkeit, aus einem bestehenden TIN das Umringpolygon (Polygon zum Ausschneiden) zu extrahieren - bzw. die Dreieckspolygone, die eine Dreiecksseite besitzen, die an kein weiteres Dreieck grenzt.
Grüße Andreas
- Anmelden oder Registieren, um Kommentare verfassen zu können
Gespeichert von Andreas am Mi., 16.06.2004 - 15:53
PermalinkWer kann weiterhelfen?
theview=av.getactivedoc
thelist = {}
for each t in theview.getthemes
if (t.is(STheme)) then
thelist = thelist.add( t.getname)
end
end
talist = {}
thestheme = msgbox.listasstring ( thelist, "", "")
if (thestheme = nil) then
exit
end
thetin = theview.findtheme(thestheme).getsurface
anzahltri = thetin.getnumTriangles
for each i in 0 .. (anzahltri - 1)
thetrilist = thetin.NeighborTriangles(i)
anzahl = thetrilist.count
if (anzahl <> 3) then
talist.add(i)
end
end
msgbox.info("Fertig","Feritg")
msgbox.listasstring(talist,"","")
Gespeichert von Maxilla am Do., 24.06.2004 - 19:00
Permalinkdas Problem deines Skriptes hängt wohl mit den ominösen 'masked Triangles' zusammen. Ich hatte bisher keine besondere Veranlassung mich näher um Sinn und Zweck dieser Teile zu kümmern, weiß aber zumindest, dass es Sie gibt. Diese masked Triangles musst du auf jeden Fall als Nachbardreiecke ausschließen.
Deine Schleife könnte dann z.B. so aussehen :
for each i in 0 .. (anzahltri - 1)
if (thetin.IsTriangleMasked(i).not) then
thetrilist = thetin.NeighborTriangles(i)
thetrilist2 = List.Make
for each j in thetrilist
if (thetin.IsTriangleMasked(j).not) then
thetrilist2.add(j)
end
end
anzahl = thetrilist2.count
if (anzahl <> 3) then
talist.add(i)
end
end
end
(sollte so funktionieren ...)
Möglicherweise ist es aber einfacher, sich aus dem schönen Tool Convert TIN into 3D shapefiles von Monsieur Guillotin etwas zu basteln. Damit kannst du die Dreiecke in ein Polygonshape überführen, die Polygone überlagern und damit die Dreiecksformen für dein Umringpolygon erhalten.
Maxilla
Gespeichert von Andreas am Fr., 25.06.2004 - 14:03
Permalinkgenau das war der entscheidende Punkt. Jetzt klappt alles. Das von dir benannte Tool benutze ich auch bisweilen aber bei diesem Geländemodell (aufgeteilt in 7 TIN's insgesamt 130 MB) macht sich jede Bearbeitung der aller Dreiecke schwierig.
Habe nichts-desto-trotz eine ganz einfache Lösung gefunden. Einfach das TIN mit dem 3D-Analyst-Werkzeug "Interpolate Polygon" grob umfahren - das Ergebnis ist das benötigte Aussen(hüllen)polygon.
Gruß Andreas
Mein ErgebnisScript sieht übnrigens wie folgt aus:
'------------Input sammeln
theview=av.getactivedoc
thelist = {}
for each t in theview.getthemes
if (t.is(STheme)) then
thelist = thelist.add( t.getname)
end
end
talist = {}
thestheme = msgbox.listasstring ( thelist, "", "")
if (thestheme = nil) then
exit
end
thetin = theview.findtheme(thestheme).getsurface
anzahltri = thetin.getnumTriangles
'------------Input sammeln
'------------FileDialog
def = av.GetProject.MakeFileName("TIN3eck", "shp")
def = FileDialog.Put(def, "*.shp", "Neues 3D-Polythema für Dreiecke")
if (def = nil) then
exit
end
'------------FileDialog
'------------Erstellung Shape
theClass = PolyGonZ
theOutFTab = FTab.MakeNew(def, theClass)
fld = Field.Make("ID", #FIELD_DECIMAL, 8, 0)
fld.SetVisible(FALSE)
'hoehe = Field.make("Hoehe", #FIELD_DECIMAL, 11, 3)
theOutFTab.AddFields({fld})
theOutFTab.SetEditable(TRUE)
theTheme = FTheme.Make(theOutFTab)
theView.AddTheme(theTheme)
theTheme.SetActive(FALSE)
theTheme.SetVisible(FALSE)
shapeField = theOutFTab.FindField("Shape")
theOutFTab.BeginTransaction
'------------Erstellung Shape
'------------Schleife durch alle Dreiecke
for each i in 0 .. (anzahltri - 1)
if (thetin.IsTriangleMasked(i).not) then
thetrilist = thetin.NeighborTriangles(i)
thetrilist2 = List.Make
for each j in thetrilist
if (thetin.IsTriangleMasked(j).not) then
thetrilist2.add(j)
end
end
anzahl = thetrilist2.count
if (anzahl <> 3) then
talist.add(i)
end
end
end
'------------Schleife durch alle Dreiecke
ap = talist.count
msgbox.info("Liste ferig. Es werden nun "+ ap.asstring +" Dreiecke zu Polygonen konvertiert." ,"Liste ferig")
'------------Schreibe Dreiecke in Shape
for each tri in talist
rec = theOutFTab.AddRecord
tripoly = thetin.ReturnTriangle(tri)
theOutFTab.SetValue(shapeField, rec, tripoly)
end
theOutFTab.EndTransaction
theOutFTab.SetEditable(False)
'------------Schreibe Dreiecke in Shape
msgbox.info("Shape fertig.","Shape fertig")