Name
PREPAREFUNCTION

Syntax
PREPAREFUNCTION kanal, schlüsselwort, name, ""
[für Container] 

PREPAREFUNCTION kanal, schlüsselwort, name1, name2 [, variable1, ... variable6]
[für Polygone] 

Aufklappen Wertebereiche
kanal: positiver Integerwert
schlüsselwort: Textkonstante; Zulässige Werte: "CreateContainer", "DeleteContainer", "EmptyContainer", "SetSourceContainer", "SetDestinationContainer", "Store", "Dispose", "HalfPlaneParams" und "OffsetParams"
name1: String; Container- oder Poylgonname
name2: String/numerisch; Konstanter Wert (""), String (Containername) oder numerischer Wert
variablei: Numerisch; Variablen zur Werteübergabe

Aufklappen Erläuterung
Mit dem Befehl bereitet man die Polygonoperationen vor.

kanal ist der Kanal, auf dem die Instanz des AddOns angesprochen wird. Dieser muss mittels INITADDONSCOPE zuvor geöffnet werden.


1. CONTAINERVERWALTUNG

Zunächst können die Container, die anschließend die Polygone enthalten sollen, verwaltet werden:
PREPAREFUNCTION kanal, schlüsselwort, name, ""

Über schlüsselwort können für die Container folgende Funktionen aufgerufen werden:

"CreateContainer":
Legt einen neuen Container mit dem Namen name an.

"SetSourceContainer":
Definiert den Container mit dem Namen name als Container für Ursprungspolygone.

"SetDestinationContainer":
Definiert den Container mit dem Namen name als Container für berechnete Ergebnispolygone.

"EmptyContainer":
Löscht alle Polygone innerhalb des Containers mit dem Namen name.

"DeleteContainer":
Löscht einen bestehenden Container mit dem Namen name einschließlich aller enthaltener Polygone.


2. POLYGONVERWALTUNG

Anschließend werden die Polygone über folgenden Befehl an den Ursprungscontainer übergeben:
PREPAREFUNCTION kanal, schlüsselwort, polygon, anzahlEcken, abschnitte, kordinaten, index [, schnittstatus, kantenverlauf]

Über schlüsselwort können für die Polygone folgende Funktionen aufgerufen werden:

"Store":
Ãœbergibt ein Polygon an den aktuellen Eingangscontainer.
PREPAREFUNCTION kanal, "Store", name, anzahlEcken, abschnitte, koordinaten, index [, schnittstatus, kantenstatus]

Das Polygon kann aus mehreren Polygonzügen bestehen. Die Polygonabschnitte werden in der Reihenfolge der übergebenen Koordinaten erzeugt. Über Index werden die Trennpunkte der Züge untereinander angegeben. Übergibt man nur einen Polygonzug, ist abschnitte=1 und das Array index enthält nur 1 Element mit dem Wert anzahlEcken.
Der name (Typ string) des übergebenen Polygons muss eindeutig sein und darf in dem Container noch nicht verwendet werden.
Mit anzahlEcken wird die Anzahl aller Eckpunkte angegeben. Bei der Übergabe mehrerer Polygonzüge ist dies die Summe aller Eckpunkte zusammen.
Aus wievielen Polygonzügen das Polygon besteht wird mit abschnitte angegeben.

koordinaten ist ein zweidimensionales Array in den (exakten!) Abmessungen [anzahlEcken][3]. Die 1. Spalte enthält die X-Koordinaten, die 2. die Y-Koordinaten der Polygoneckpunkte. Die 3. Spalte gibt an, ob der nachfolgende Polygonabschnitt gerade ist (=0) oder zu einer Seite abweicht (+/- nach links/rechts). Dies entspricht NICHT dem Kantenstatus, wie er aus z.B. dem POLY_-Befehl bekannt ist. Dieser wird optional und separat im Array kantenstatus übergeben.
Alle Koordinaten aller Polygonzüge folgen in dieser Variablen nacheinander.

Das eindimensionale Array index mit der (exakten!) Größe [abschnitte] gibt den jeweils letzten Index eines jeden Polygonzuges im Koordinaten-Array an.

Optionale Angaben:
Alle Kanten, die als Schnittkanten des übergebenen Polygons durch die Operation im Ergebnispolygon erzeugt werden, erhalten den neuen Kantenstatus schnittstatus. Durch einen signifikanten Wert läßt sich nach der Operation so der veränderte Bereich ermitteln.
Das eindimensionale Array kantenstatus mit der (exakten!) Größe [anzahlEcken] gibt "parallel" zum koordinaten-Array die Statuswerte der Polygonabschnitte an. Diese werden auf diejenigen Kanten im Ergebnispolygon übertragen, die ganz oder teilweise auch nach der Operation erhalten bleiben.

"Dispose":
PREPAREFUNCTION kanal, schlüsselwort, polygon, container
Löscht ein Poylgon namens polygon aus einem Eingangs- oder Ergebniscontainer namens container.

"HalfPlaneParams":
PREPAREFUNCTION kanal, schlüsselwort, "", ca, cb, cc
Definiert über die Formel ca * x + cb * y > cc eine Halbebene. Diese wird bei der Operation "PolyCut" zum Beschneiden verwendet.

"OffsetParams":
PREPAREFUNCTION kanal, schlüsselwort, "", index, wert
Festlegung von Versatzwerten auf einzelne Kanten. Diese Werte werden von den Operationen "OffsetEdge" und "ResizeContour" verwendet.
Es kann ein Zeiger auf eine einzelne Kante (index) eines Polygonsangegeben werden, die per Operation verschoben werden soll. Die Länge um die die Kante(n) verschoben werden soll(en) wird mit wert definiert. Positive Werte verschieben die Kanten nach außen, negative nach innen. Durch die Operationen können benachbarte Kanten "geschluckt" werden. Sie fehlen dann im Ergebnispolygon.

Aufklappen Beispiel

! --- QUELL- + ZIELCONTAINER ERZEUGEN
PREPAREFUNCTION kanal, "CreateContainer", "Eingang", ""
PREPAREFUNCTION kanal, "SetSourceContainer", "Eingang", ""

PREPAREFUNCTION kanal, "CreateContainer", "Ergebnis", ""
PREPAREFUNCTION kanal, "SetDestinationContainer", "Ergebnis", ""


! --- VARIABLEN

DIM ecken[][], zug[], verlauf[]
DIM namen[], eckenZiel[], zugZiel[], verlaufZiel[]
DIM setdim1[1], setDIM2[1][1]


! --- 1. EINGANGSPOLYGON

! "Alles auf Anfang"

nZug=0
i=0

! - Polygonzug 1 - Ecken

i=i+1 : ecken[i][1]=0 : ecken[i][2]=0 : ecken[i][3]=0 : verlauf[i]=1
i=i+1 : ecken[i][1]=X : ecken[i][2]=0 : ecken[i][3]=0 : verlauf[i]=1
i=i+1 : ecken[i][1]=X : ecken[i][2]=Y : ecken[i][3]=0 : verlauf[i]=1
i=i+1 : ecken[i][1]=0 : ecken[i][2]=Y : ecken[i][3]=0 : verlauf[i]=1
i=i+1 : ecken[i][1]=0 : ecken[i][2]=0 : ecken[i][3]=0 : verlauf[i]=-1

! - Polygonzug 1 - Endeindex

nZug=nZug+1 : zug[nZug]=i

! - Polygonzug 2 - Ecken

i=i+1:ecken[i][1]=X*.3:ecken[i][2]=Y*.3:ecken[i][3]=0:verlauf[i]=1
i=i+1:ecken[i][1]=X*.3:ecken[i][2]=Y*.9:ecken[i][3]=0:verlauf[i]=1
i=i+1:ecken[i][1]=X*.9:ecken[i][2]=Y*.9:ecken[i][3]=0:verlauf[i]=1
i=i+1:ecken[i][1]=X*.9:ecken[i][2]=Y*.3:ecken[i][3]=0:verlauf[i]=1
i=i+1:ecken[i][1]=X*.3:ecken[i][2]=Y*.3:ecken[i][3]=0:verlauf[i]=-1

! - Polygonzug 2 - Endeindex

nZug=nZug+1 : zug[nZug]=i

! - Polygoneckenanzahl

nEcken=i

! - Ãœbergabe ans Addon

PREPAREFUNCTION kanal, "Store", "BasisPolygon_1", nEcken,nZug, ecken,zug, 0,verlauf


! --- 2. EINGANGSPOLYGON

! Arraydimensionen wieder zurücksetzen

ecken = setDIM2
zug = setDIM1
verlauf = setDIM1

! "Alles auf Anfang"

nZug=0
i=0

dx=x*0.6 : dy=y*0.6

! - Polygonzug - Ecken

i=i+1 :ecken[i][1]=dx :ecken[i][2]=dy :ecken[i][3]=0 :verlauf[i]=1
i=i+1 :ecken[i][1]=dx+X :ecken[i][2]=dy :ecken[i][3]=0 :verlauf[i]=1
i=i+1 :ecken[i][1]=dx :ecken[i][2]=dy+Y :ecken[i][3]=0 :verlauf[i]=1
i=i+1 :ecken[i][1]=dx :ecken[i][2]=dy :ecken[i][3]=0 :verlauf[i]=-1

! - Polygonzug - Endeindex

nZug=nZug+1 : zug[nZug]=i

! - Polygoneckenanzahl

nEcken=i

! - Ãœbergabe ans Addon

PREPAREFUNCTION kanal, "Store", "BasisPolygon_2", nEcken,nZug, ecken,zug, 0,verlauf


Aufklappen Tipps und Tricks
Die Koordinatenübergabe muss mit einem exakt passenden Array erfolgen. Ist das Array größer als die Anzahl der zu übergebenden Werte kommt es zu Fehlermeldungen. Folgender Trick kann dies bei der Verwendung dynamischer Arraygrößen umgehen:

Definieren sie sich 2 Arrays der Göße 1. Also z.B. setDIM1[1] bzw. setDIM2[1][1].
Bevor sie ihrem Koordinatenarray (z.B. Namens "ecken" und "zuege") die (neuen) Punkte zuweisen setzen sie es durch folgenden Befehl wieder auf die Größe 1:
ecken=setDIM2 : zuege=setDIM1

Aufklappen ArchiCAD
ab 12.0