Name
CALLFUNCTION
Syntax
anzahl = CALLFUNCTION (kanal, operation, polygon, ergebnis)
operation: Typ string; Konstantes Schlüsselwort, das die Operation festlegt. Bei Operationen zwischen zwei Polygonen setzt sich das Schlüsselwort aus den Namen und dem Operatorzeichen zusammen.
polygon: Typ string; Name des Polygons
ergebnis: Integer-Array
polygon: Typ string; Name des Polygons
ergebnis: Integer-Array
Die Funktion gibt in der Arrayvariable ergebnis alle ID-Namen der anzahl Ergebnispolygone aus der Operation im Ergebniscontainer wider. Die Variable muss zuvor mit DIM defniert worden sein.
Ergebnispolygone werden automatisch mit "resPolygon", gefolgt von einer aufsteigenden Nummer, beginnend mit 1, fortlaufend benannt.
1. Operation zwischen 2 Polygonen
anzahl = CALLFUNCTION (kanal, name1+ operator + name2, "", ergebnis)
name1, name2:
Ursprungpolygone aus dem Quellcontainer.
operator:
Operationszeichen (string mit führendem und nachfolgendem Leerzeichen). Folgende Operationen sind möglich:
"+" Polygone vereinigen. (siehe Abb. 1)
"-" Polygone2 von Polygon1 abziehen. (siehe Abb. 2+3)
"/" Beide Polygone miteinander verschneiden; =OR-Verknüpfung. (siehe Abb. 4)
2. Operation auf 1 Polygon
anzahl = CALLFUNCTION (kanal, operation, polygon, ergebnis)
Über operation können für die Polygone folgende Funktionen aufgerufen werden:
"CopyPolygon"
Kopiert das Polygon mit dem Namen polygon in den Ergebniscontainer. Dort erhält es eine automatische Benennung.
"Regularize"
Regulieren (geometrische Korrektur) des Polygons mit dem Namen polygon.
Die Operation stellt folgende Eigenschaften des Polygons her:
- Der erste Polygonzug umfasst alle nachfolgenden dieses Polygons
- Korrekte Orientierung des Zuges: (Hauptbegrezungskante positiv, der Rest negativ=Uhrzeigersinn)
- keine Selbstverschneidungen der Kanten des kompletten Zuges
- Fläche#0
- Keine Kanten mit Länge 0
"PolyCut"
Schneidet das Polygon mit dem Namen polygon mit einer zuvor mit PREPAREFUNCTION ("HalfPlaneParams") definierten Halbebene. Das Zielpolygon wird automatisch reguliert und landet im Ergebniscontainer. Dort erhält es eine automatische Benennung.
"OffsetEdge"
Versetzt eine Kante des Polygons mit dem Namen polygon um einen bestimmten Wert. Die betroffene Kante (Index) und der Versatzwert muss zuvor mit PREPAREFUNCTION ("OffsetParams") festgelegt werden. Das Zielpolygon wird automatisch reguliert und landet im Ergebniscontainer. Dort erhält es eine automatische Benennung.
"ResizeContour"
Vergrößert alle Kanten des Polygons mit dem Namen polygon um einen bestimmten Wert. Der Versatzwert muss zuvor mit PREPAREFUNCTION ("OffsetParams") festgelegt werden. Der dort festgelegte Indexwert wird ignoriert. Das Zielpolygon wird automatisch reguliert und landet im Ergebniscontainer. Dort erhält es eine automatische Benennung.
3. Auslesen der Ergebnisse
"GetSourcePolygons"
Übergibt alle Namen der Quellpolygone aus dem Quellcontainer in das Array ergebnis. Die Variable muss zuvor mit DIM defniert worden sein. anzahl enthält die Anzahl der übergebenen Namen.
"GetDestinationPolygons"
Übergibt alle Namen der Ergebnispolygone aus dem Ergebniscontainer in das Array ergebnis. Die Variable muss zuvor mit DIM defniert worden sein. anzahl enthält die Anzahl der übergebenen Namen.
"GetVertices"
Übergibt alle Eckpunkte des Ergebnispolygons mit dem Namen polygon an das Array ergebnis. Die Variable muss zuvor mit DIM defniert worden sein. anzahl enthält die Anzahl der übergebenen Punkte. Das Array ist allerdings entgegen der Übergabe der Eingangspolygone mit PREPAREFUNCTION nicht mehrdimensional ([i][3]), sondern eindimensional. Jede Koordinate belegt damit immer 3 Stellen (X, Y, Richtungsstatus) nebeneinander im Array. Die Anzahl der Koordinaten ist daher anzahl/3
"GetContourEnds"
Übergibt alle Indizes auf die Endpunkte der einzelnen Polygonzüge des Ergebnispolygons mit dem Namen polygon an das Array ergebnis. Die Indizes beziehen sich auf die Nummer des tatsächlichen Eckpunktes, nicht auf die Position im Array, das mit der Operation "GetVertices" ausgelesen wurde. Die Variable ergebnis muss zuvor mit DIM definiert worden sein. anzahl enthält die Anzahl der übergebenen Indizes der Endpunkte (= Anzahl Polygonzüge in dem Polygon).
Bis ArchiCAD 15 ist hier nach Auffassung der Autoren ein Fehler. Tatsächlich soll der Index des ersten Punktes des Polygonzuges angegeben werden, aber auch das ist fehlerhaft: Der Wert von ergebnis[1] ist immer 0 und mit jedem Polygonzug schleicht sich ein kumulierender Fehler von +1 ein.
Ein Beispiel:
Angenommen das Ergebnispolygon besteht aus 3 Polygonzügen mit 15 Eckpunkten. Die Polygonzüge seien 4, 6 und 5 Punkte lang. So sollte das Array der Endpunkte 4, 10 und 15 beinhalten (entspricht 4, 4+6, 4+6+5). Sollte der Index nicht auf die Endpunkte, sondern auf die Anfangspunkte zeigen, so wären dies die Werte 1, 5 und 11 (entspricht 1, 1+4, 1+4+6).
Das Auslesen der Endindizes ergibt aber tatsächlich 0, 5 und 12.
"GetInhEdgeInfos"
Übergibt den Kantenstatus jeder Kante des Ergebnispolygons mit dem Namen polygon an das Array ergebnis. Die Variable muss zuvor mit DIM defniert worden sein. anzahl enthält die Anzahl der übergebenen Statuswerte.
Ergebnispolygone werden automatisch mit "resPolygon", gefolgt von einer aufsteigenden Nummer, beginnend mit 1, fortlaufend benannt.
1. Operation zwischen 2 Polygonen
anzahl = CALLFUNCTION (kanal, name1+ operator + name2, "", ergebnis)
name1, name2:
Ursprungpolygone aus dem Quellcontainer.
operator:
Operationszeichen (string mit führendem und nachfolgendem Leerzeichen). Folgende Operationen sind möglich:
"+" Polygone vereinigen. (siehe Abb. 1)
"-" Polygone2 von Polygon1 abziehen. (siehe Abb. 2+3)
"/" Beide Polygone miteinander verschneiden; =OR-Verknüpfung. (siehe Abb. 4)
2. Operation auf 1 Polygon
anzahl = CALLFUNCTION (kanal, operation, polygon, ergebnis)
Über operation können für die Polygone folgende Funktionen aufgerufen werden:
"CopyPolygon"
Kopiert das Polygon mit dem Namen polygon in den Ergebniscontainer. Dort erhält es eine automatische Benennung.
"Regularize"
Regulieren (geometrische Korrektur) des Polygons mit dem Namen polygon.
Die Operation stellt folgende Eigenschaften des Polygons her:
- Der erste Polygonzug umfasst alle nachfolgenden dieses Polygons
- Korrekte Orientierung des Zuges: (Hauptbegrezungskante positiv, der Rest negativ=Uhrzeigersinn)
- keine Selbstverschneidungen der Kanten des kompletten Zuges
- Fläche#0
- Keine Kanten mit Länge 0
"PolyCut"
Schneidet das Polygon mit dem Namen polygon mit einer zuvor mit PREPAREFUNCTION ("HalfPlaneParams") definierten Halbebene. Das Zielpolygon wird automatisch reguliert und landet im Ergebniscontainer. Dort erhält es eine automatische Benennung.
"OffsetEdge"
Versetzt eine Kante des Polygons mit dem Namen polygon um einen bestimmten Wert. Die betroffene Kante (Index) und der Versatzwert muss zuvor mit PREPAREFUNCTION ("OffsetParams") festgelegt werden. Das Zielpolygon wird automatisch reguliert und landet im Ergebniscontainer. Dort erhält es eine automatische Benennung.
"ResizeContour"
Vergrößert alle Kanten des Polygons mit dem Namen polygon um einen bestimmten Wert. Der Versatzwert muss zuvor mit PREPAREFUNCTION ("OffsetParams") festgelegt werden. Der dort festgelegte Indexwert wird ignoriert. Das Zielpolygon wird automatisch reguliert und landet im Ergebniscontainer. Dort erhält es eine automatische Benennung.
3. Auslesen der Ergebnisse
"GetSourcePolygons"
Übergibt alle Namen der Quellpolygone aus dem Quellcontainer in das Array ergebnis. Die Variable muss zuvor mit DIM defniert worden sein. anzahl enthält die Anzahl der übergebenen Namen.
"GetDestinationPolygons"
Übergibt alle Namen der Ergebnispolygone aus dem Ergebniscontainer in das Array ergebnis. Die Variable muss zuvor mit DIM defniert worden sein. anzahl enthält die Anzahl der übergebenen Namen.
"GetVertices"
Übergibt alle Eckpunkte des Ergebnispolygons mit dem Namen polygon an das Array ergebnis. Die Variable muss zuvor mit DIM defniert worden sein. anzahl enthält die Anzahl der übergebenen Punkte. Das Array ist allerdings entgegen der Übergabe der Eingangspolygone mit PREPAREFUNCTION nicht mehrdimensional ([i][3]), sondern eindimensional. Jede Koordinate belegt damit immer 3 Stellen (X, Y, Richtungsstatus) nebeneinander im Array. Die Anzahl der Koordinaten ist daher anzahl/3
"GetContourEnds"
Übergibt alle Indizes auf die Endpunkte der einzelnen Polygonzüge des Ergebnispolygons mit dem Namen polygon an das Array ergebnis. Die Indizes beziehen sich auf die Nummer des tatsächlichen Eckpunktes, nicht auf die Position im Array, das mit der Operation "GetVertices" ausgelesen wurde. Die Variable ergebnis muss zuvor mit DIM definiert worden sein. anzahl enthält die Anzahl der übergebenen Indizes der Endpunkte (= Anzahl Polygonzüge in dem Polygon).
Bis ArchiCAD 15 ist hier nach Auffassung der Autoren ein Fehler. Tatsächlich soll der Index des ersten Punktes des Polygonzuges angegeben werden, aber auch das ist fehlerhaft: Der Wert von ergebnis[1] ist immer 0 und mit jedem Polygonzug schleicht sich ein kumulierender Fehler von +1 ein.
Ein Beispiel:
Angenommen das Ergebnispolygon besteht aus 3 Polygonzügen mit 15 Eckpunkten. Die Polygonzüge seien 4, 6 und 5 Punkte lang. So sollte das Array der Endpunkte 4, 10 und 15 beinhalten (entspricht 4, 4+6, 4+6+5). Sollte der Index nicht auf die Endpunkte, sondern auf die Anfangspunkte zeigen, so wären dies die Werte 1, 5 und 11 (entspricht 1, 1+4, 1+4+6).
Das Auslesen der Endindizes ergibt aber tatsächlich 0, 5 und 12.
"GetInhEdgeInfos"
Übergibt den Kantenstatus jeder Kante des Ergebnispolygons mit dem Namen polygon an das Array ergebnis. Die Variable muss zuvor mit DIM defniert worden sein. anzahl enthält die Anzahl der übergebenen Statuswerte.
! --- OPERATION
anzahlPolygone = CALLFUNCTION (kanal, "BasisPolygon_1" + " + " + "BasisPolygon_2", "", namen)
! --- AUSLESEN
FOR p=1 TO anzahlPolygone
! --- p. POLYGON AUSLESEN
ordinaten = CALLFUNCTION (kanal,"GetVertices",namen[p],eckenZiel)
anzahlZuege = CALLFUNCTION (kanal,"GetContourEnds",namen[p],zugZiel)
anzVerlauf=CALLFUNCTION(kanal,"GetInhEdgeInfos",namen[p],verlaufZiel)
z=z-0.4 : TEXT2 0,z,'"'+namen[p]+'" ('+str(p,1,0)+'/'+str(anzahlPolygone,1,0)+'): '+str(anzahlZuege,1,0)+' Züge'
! --- AUSGABE ERGEBNIS
s=0 ! Index Ende des letzten Zuges
anzahlEcken=INT(ordinaten/3) ! Gesamtzahl Ecken des Polygons
FOR i=1 to anzahlZuege
! Letzte Koordinate des Zuges
IF i < anzahlZuege THEN n=zugZiel[i+1]-i ELSE n=anzahlEcken
! Eckpunkte und Verlauf auslesen
FOR j=s+1 TO n
k=(j-1)*3+1
PUT eckenZiel[ k ],eckenZiel[k+1],verlaufZiel[j]
NEXT j
k=s*3+1
! Letzter Punkt = erster Punkt
PUT eckenZiel[ k ],eckenZiel[k+1],-1
! Endpunkt-Index für nächsten Zug merken
s=n
NEXT i
! Ausgabe im Grundriss
POLY2_ nsp/3, 1+2+4, GET(nsp)
NEXT p
anzahlPolygone = CALLFUNCTION (kanal, "BasisPolygon_1" + " + " + "BasisPolygon_2", "", namen)
! --- AUSLESEN
FOR p=1 TO anzahlPolygone
! --- p. POLYGON AUSLESEN
ordinaten = CALLFUNCTION (kanal,"GetVertices",namen[p],eckenZiel)
anzahlZuege = CALLFUNCTION (kanal,"GetContourEnds",namen[p],zugZiel)
anzVerlauf=CALLFUNCTION(kanal,"GetInhEdgeInfos",namen[p],verlaufZiel)
z=z-0.4 : TEXT2 0,z,'"'+namen[p]+'" ('+str(p,1,0)+'/'+str(anzahlPolygone,1,0)+'): '+str(anzahlZuege,1,0)+' Züge'
! --- AUSGABE ERGEBNIS
s=0 ! Index Ende des letzten Zuges
anzahlEcken=INT(ordinaten/3) ! Gesamtzahl Ecken des Polygons
FOR i=1 to anzahlZuege
! Letzte Koordinate des Zuges
IF i < anzahlZuege THEN n=zugZiel[i+1]-i ELSE n=anzahlEcken
! Eckpunkte und Verlauf auslesen
FOR j=s+1 TO n
k=(j-1)*3+1
PUT eckenZiel[ k ],eckenZiel[k+1],verlaufZiel[j]
NEXT j
k=s*3+1
! Letzter Punkt = erster Punkt
PUT eckenZiel[ k ],eckenZiel[k+1],-1
! Endpunkt-Index für nächsten Zug merken
s=n
NEXT i
! Ausgabe im Grundriss
POLY2_ nsp/3, 1+2+4, GET(nsp)
NEXT p
ab 12.0