in einem Script erzeugte FTab sortieren

Hallo forum!

Ich habe in einem Script in ArcView 3.2 ein neues FTheme erzeugt. Ich möchte die FTab des Themas aber nach einem Feld sortiern, bevor ich das FTheme zum View hinzufüge. Die Funktion "sort" funktioniert leider nur für Tables. Hat dazu vielleicht jemand eine Idee? Würde mich sehr freuen. Schon mal vielen Dank.

Michaela
Hallo Michaela,

wenn du eine permanente Sortierung der Tabelle anstrebst, ist es sicherlich am Günstigsten, die Tabelle von vorneherein sortiert zu erstellen, anstatt sie nach der Erstellung zu sortieren (zumal die 'aTable.Sort' Request auch nur eine temporäre Sortierung vornimmt). Um dazu etwas sagen zu können, müsste ich mal deinen Erstellungscode sehen.

Falls du aber wirklich nur eine temporäre Sortierung haben willst, ist es einfacher, das FTheme erst hinzuzufügen und die Tabelle dann zu sortieren.
Hallo Maxilla,

ich erzeuge in meinem Code Polygone aus Polylinien und speichere diese dann in einer neuen FTab, aus der ich dann ein FTheme mache.

der Code geht etwa so:


FN_Default = FileName.Make("$HOME").MakeTmp("shape","shp")
FN_output = FileDialog.Put(FN_Default,"*.shp","Output Shape File")

if (FN_output = nil) then exit
end

FN_output.SetExtension("shp")

polyFTab = FTab.MakeNew(FN_Default,POLYGON)
polyFTab.SetEditable(true)
[...]
polyTheme = FTheme.Make(polyFTab)
[...]
polyShape = polyFTab.FindField("Shape")

thePolygon = [Polygone erzeugen]

[...]
polyFTab.SetValue(polyShape,newRec,thePolygon)
[...]



[i][/i]

Es geht darum, dass die Polygone in der Reihenfolge, in der sie erzeugt werden, in die FTab eingefügt werden. Jedoch werden kleinere von größeren darüberliegenden Polygonen verdeckt, wenn sie weiter oben in der Tabelle stehen, deswegen möchte ich die Polygone der Größe nach sortiert in der Tabelle stehen haben. Hoffe, der Code genügt. Wäre sonst so lang, wenn ich ihn hier komplett reinschreibe.
Ich denke ich müßte das irgendwie mit VTabSort machen, weiß nur nicht genau, wie ich aus dieser VTAbSort eine FTab machen kann.
Hallo Michaela,

1. Wenn Du das wirklich tun willst, dann bleibt Dir kaum etwas anderes übrig, als die Polygone in der entsprechenden Reihenfolge zu schreiben (kleinstes Polygon suchen und schreiben, zweitkleinstes Polygon suchen und schreiben ....).

2. Hört sich das nach einer schlechten Idee an und ich würde das Datenmodell so nicht benutzen.

Jörg
Falls du das also tun möchtest:

Es ist ein bissl schwierig, weil du ja erst die Fläche für die noch nicht fertigen Polygone berechnen musst.

Ich würde das über ein temporäres Thema machen, weiß allerdings nicht, ob das der beste oder einfachste Weg ist. Hier ein bisschen Code zum Einbauen:

Also, erstmal das Polygonthema auf temporärer Basis erstellen (ich nenn das hier mal "TEMP_Poly.shp"), und laden. DANN:

' Fläche berechnen, z.B.:

theView = av.GetActiveDoc

theTmpThm = theView.FindTheme("TEMP_Poly.shp")

theTmpVTab = theTmpThm.GetFTab
theTmpVTab.SetEditable (TRUE)
theTmpAreaFld = Field.Make("Area",#FIELD_DOUBLE,16,4)
theTmpVTab.AddFields({theTmpAreaFld})

theTmpVTab.Calculate("[Shape].ReturnArea",theTmpAreaFld)

' Nach Flächengröße absteigend sortieren, z.B.:

theTmpTable = Table.Make(theTmpVTab)
theTmpTable.GetWin.Open

theTmpTable.Sort(theTmpAreaFld, TRUE)

' Sortiert in neues Shape schreiben (Peter Girard):

outName = FileName.GetCWD.MakeTmp("Poly","shp")

outVTab = FTab.MakeNew(outName,theTmpVTab.GetShapeClass)
fInShape = theTmpVTab.FindField("shape")
fOutShape = outVTab.FindField("shape")

outVTab.SetEditable(true)

inFields = List.Make
for each f in theTmpVTab.GetFields
if ((f.IsVisible) and(f.IsTypeShape.Not)) then
inFields.Add(f)
end
end

outFields = inFields.DeepClone
outVTab.AddFields(outFields)
theFieldCount = outFields.Count

av.ShowMsg("Exporting to " + outName.AsString + " ...")
av.SetStatus(0)

theRecNum = theTmpVTab.GetNumRecords
i = 0
for each row in theTmpVTab
inRec = theTmpTable.ConvertRowToRecord(row)
outRec = outVTab.AddRecord
outVTab.SetValue(fOutShape,outRec,theTmpVTab.ReturnValue(fInShape,inRe c))
for each i in 0..(theFieldCount - 1)
outVTab.SetValue(outFields.Get(i),outRec,theTmpVTab.ReturnValue(inFiel ds.Get(i),inRec))
end
i = i + 1
av.SetStatus((i / theRecNum) * 100)
end

outVTab.SetEditable(false)
theTmpTable.GetWin.Close

av.ClearStatus

Jetzt noch Temp-Thema aus dem View und von der Platte löschen und fertiges Thema zum View hinzufügen.
...
Hallo...

Hat prima geklappt, vielen Dank.

Was macht man dann eigentlich mit einer VTabSort?

Michaela
Man kann das Ganze natürlich auch mit VTabSort machen, genau dafür gibt es das Objekt :-) Guck mal in der Hilfe bei der Export-Methode von VTabSort. Da gibt es ein Beispiel für Shapefiles.
Schon lustig, wie ich immer mal wieder um solche nützlichen aber unbekannten Klassen herumprogrammiere. Das geht mir schon seit meinem ersten Skriptchen so ;o)

Danke für den Hinweis!
Was hat bei VTabSort der Parameter IsCaseSensitive zu bedeuten? Kann das aus dem Hilfetext nicht so ganz verstehen.
Hallo Michaela,

>If IsCaseSensitive is TRUE, then case is considered in defining the sort order.

bedeutet:

Bei IsCaseSensitiv = True wird die Gross-/Kleinschreibung beim Sortieren beruecksichtigt.

Gruss

Uwe
Wenn du "IsCaseSensitive" auf TRUE setzt dann ist "Michaela" <> "michaela", die Einträge werden getrennt sortiert und die Request aVTabSort.IsSortCaseSensitive gibt TRUE zurück. Setzt du "IsCaseSensitive" " auf FALSE dann ist "Michaela" = "michaela", die Einträge werden beim Sortieren nicht unterschieden und die Request aVTabSort.IsSortCaseSensitive gibt FALSE zurück

Eine ganz ähnliche Request gibt es auch für Strings: "String.SetCaseSensitiveCompare (useCase)"
...
aha... dann werd ich das für das sortieren nach der Fläche nicht brauchen...

danke

Michaela