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
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
- Anmelden oder Registieren, um Kommentare verfassen zu können
Gespeichert von Maxilla am Mo., 15.11.2004 - 09:33
Permalinkwenn 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.
Gespeichert von Michaela am Mo., 15.11.2004 - 13:10
Permalinkich 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.
Gespeichert von Jörg Thomsen am Mo., 15.11.2004 - 14:06
Permalink1. 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
Gespeichert von Maxilla am Mo., 15.11.2004 - 14:31
PermalinkEs 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.
...
Gespeichert von Michaela am Di., 16.11.2004 - 19:59
PermalinkHat prima geklappt, vielen Dank.
Was macht man dann eigentlich mit einer VTabSort?
Michaela
Gespeichert von Gast am Mi., 17.11.2004 - 10:01
PermalinkGespeichert von Maxilla am Mi., 17.11.2004 - 10:56
PermalinkDanke für den Hinweis!
Gespeichert von Michaela am Do., 18.11.2004 - 11:26
PermalinkGespeichert von uwelangehh am Do., 18.11.2004 - 11:47
Permalink>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
Gespeichert von Maxilla am Do., 18.11.2004 - 11:47
PermalinkEine ganz ähnliche Request gibt es auch für Strings: "String.SetCaseSensitiveCompare (useCase)"
...
Gespeichert von Michaela am Do., 18.11.2004 - 12:42
Permalinkdanke
Michaela