Interaktive Grafik
  • 13 May 2024
  • 4 Minuten zu lesen
  • Dunkel
    Licht
  • pdf

Interaktive Grafik

  • Dunkel
    Licht
  • pdf

Artikel-Zusammenfassung

Verschiebung in X-, Y- und Z-Richtung erlauben

Es gibt Situationen, in denen es erwünscht ist, dass Teile einer Grafik, verschoben werden können. Beispiele sind Regalböden und Schubladen. Standardmäßig sind Grafiken nicht verschiebbar. Durch das Setzen von Attributen in der A3D-Grafik können aber Verschiebungen in X-, Y- und Z-Richtung erlaubt werden. Zudem können die erlaubten Werte und Wertbereiche für die X-, Y- und Z-Koordinate eines Objekts angegeben werden.

Folgende zentrale Proceduren erlauben die Verschiebung entlang der drei Achsen:

SetEventMoveObjectX
Ein Objekt oder eine Gruppe von Objekten kann in der X-Achse verschoben werden.

Aufruf:
RUN public\lib3D.SetEventMoveObjectX(nId,"500|600|700","1000:2000")

Parameters:
NUM | ID des Objekts, das verschoben wird
CHAR | Positionen, auf welche das Objekt verschoben werden kann [Optional]
CHAR | Wertebereich, in welche das Objekt verschoben werden kann [Optional]

SetEventMoveObjectY
Ein Objekt oder eine Gruppe von Objekten kann in der Y-Achse verschoben werden.

Aufruf:
RUN public\lib3D.SetEventMoveObjectY(nId,"500|600|700","1000:2000")

Parameters:
NUM | ID des Objekts, das verschoben wird
CHAR | Positionen, auf welche das Objekt verschoben werden kann [Optional]
CHAR | Wertebereich, in welche das Objekt verschoben werden kann [Optional]

SetEventMoveObjectZ
Ein Objekt oder eine Gruppe von Objekten kann in der Z-Achse verschoben werden.

Aufruf:
RUN public\lib3D.SetEventMoveObjectZ(nId,"500|600|700","1000:2000")

Parameters:
NUM | ID des Objekts, das verschoben wird
CHAR | Positionen, auf welche das Objekt verschoben werden kann [Optional]
CHAR | Wertebereich, in welche das Objekt verschoben werden kann [Optional]

Folgendes ist dabei zu beachten:
Die Werte beziehen sich auf die linke untere vordere Ecke der Objektbox, sofern nicht explizit eine andere Position definiert ist, wie unten beschrieben. Die Werte und Wertbereiche sind nicht absolut zu verstehen, sondern bezüglich eines Referenzobjektes. Wie das Referenzobjekt bestimmt wird, ist im Abschnitt "Referenzobjekte für Verschiebungen" erklärt.

Wenn z.B. für einen Regalboden ein erlaubter Wert von 1000 mm in Z-Richtung angegeben ist, heißt das, dass die Unterseite des Regalbodens auf eine Entfernung von 1000 mm von der Unterseite des übergeordneten Objekts gesetzt werden kann. Dabei wird das übergeordnete Objekt bei einem Regalboden in der Regel der Korpus sein.

Beispiel:
Ein Regalboden soll auf die Werte 750 mm und 1000 mm gesetzt werden sowie im Wertbereich von 1250 mm bis 1750 mm kontinuierlich verschoben werden können. Die Definition lautet wie folgt:
RUN public\lib3D.SetEventMoveObjectZ(nId,"750|1000","1250:1750")

Rückgabe der Position in die Konfiguration

Wurde das Objekt verschoben wird ein Attribut mit der neuen Position in die Variablentabelle geschrieben:

InteractiveGraphic.ID<objID>.X
InteractiveGraphic.ID<objID>.Y
InteractiveGraphic.ID<objID>.Z

Mit DEFINED kann man nun feststellen, ob ein bestimmtes Objekt verschoben wurde. Die neue Position sollte in eigene Attribute geschrieben werden, damit anschließend mit DELETE das Attribut InteractiveGraphic wieder gelöscht wird, und man auf ein erneutes verschieben des Objekts entsprechend reagieren kann.

Beispiel:

IF DEFINED InteractiveGraphic THEN

IF DEFINED interactiveGraphic.ATTRIBUTES("ID"+STR$(oS.nLineal.nGesamtID)) THEN

oS.nLineal.nGesamtID.nCurrentPos.x = interactiveGraphic.attributes("ID"+STR$(oS.nLineal.nGesamtID)).x

oS.nLineal.nGesamtID.nCurrentPos.Y = interactiveGraphic.attributes("ID"+STR$(oS.nLineal.nGesamtID)).y

oS.nLineal.nGesamtID.nCurrentPos.Z = interactiveGraphic.attributes("ID"+STR$(oS.nLineal.nGesamtID)).z

ENDIF

ENDIF

DELETE InteractiveGraphic

Referenzpositionen

Bewegungseinschränkungen verstehen sich in Bezug auf Referenzpositionen. Sowohl das zu verschiebende Objekt als auch das Referenzobjekt haben jeweils 1 Referenzposition. Wenn z.B. für ein Objekt in X-Richtung eine Bewegungseinschränkung von 1250 mm bis 1750 mm definiert ist, bedeutet das, dass die Entfernung der zwei Referenzpunkte, ermittelt im Koordinatensystem des Referenzobjektes, zwischen 1250 mm und 1750 mm betragen muss.

Standardmäßig liegt die Referenzposition eines Objektes im Koordinatenursprung (0, 0, 0) des jeweiligen Objektkoordinatensystems. Das ist die linke, vordere, untere Ecke der Objektbox.

Es kann sinnvoll sein, die Referenzposition eines Objektes an eine andere Stelle zu setzten. Wenn z.B. Objekte an einer Mauer positioniert werden sollen, ist es vorteilhaft, die Referenzposition an die Rückseite des Objektes zu setzen, anstatt an die Vorderseite. Eine Bewegunseinschränkung der Y-Koordinate auf 0 setzt dann automatisch die Objekte an die Wand.

Dafür steht folgende zentrale Procedure zur Verfügung:

SetReferencePoint
Ändert den Referenzpunkt eines Objektes

Aufruf:
RUN public\lib3D.SetReferencePoint(nObjID,"0:0:0+100")

Parameters:
NUM | ID des Objekts
CHAR | Faktor und Offset

Beispiele:
"0:0:0": Die Referenzpositon ist die linke, vordere, untereck Ecke der Objektbox; das ist der Standardwert.
"1:1:1": Die Referenzposition ist die rechte, hintere, obere Ecke der Objektbox.
"0.5:0.5:0.5": Die Referenzposition liegt in der Mitte des Objekts.

Verhindern von Kollisionen

In der Realität ist es nicht möglich, dass sich z.B. zwei Regalböden überlappen. Der Kollisionstest für ein Objekt wird aktiviert, indem folgende zentrale Procedure verwendet wird:

SetEventDisallowOverlap
Ein Objekt oder eine Gruppe von Objekten kann nicht in ein anderes Objekt verschoben werden.

Aufruf:
RUN public\lib3D.SetEventDisallowOverlap(nId)

Parameter:
NUM | ID des Objekts

Dadurch wird die Verschiebung eines Objekts wird nur dann durchgeführt, wenn dabei keine Kollisionen mit anderen Objekten auftreten.

Der Test ist vergleichsweise aufwendig. Es macht dabei keinen Sinn, z.B. einen Regalboden auf eine Kollision mit einem Seitenteil des Korpus zu testen, wenn aufgrund der Beschränkung der Verschiebung auf die Z-Achse eine Überlappung ohnedies nicht möglich ist. Daher wir bei dem Test nur auf solche Objekte hin geprüft, in denen das Attribut "c3dAttribDisallowOverlap" auf einen Wert ungleich 0 gesetzt ist.

Fangpunkte

Um ein genaues Positionieren von Objekten zu erleichtern, können Fangpunkte definiert werden. Wird ein Objekt mit Fangpunkten verschoben und gerät dabei ein Fangpunkt in die Nähe eines Fangpunktes eines anderen Objekts, wird das verschobene Objekt so gesetzt, dass sich beide Fangpunkt überlagern.

In vielen Fällen wird es ausreichen, wenn die Ecken der Objektbox als Fangpunkte dienen. Um diese Standard-Fangpunkte zu aktivieren, muss folgende zentrale Procedure verwendet werden:

SetStandardSnapPoint
Aktiviert an den Ecken Snappoints

Aufruf:
RUN public\lib3D.SetStandardSnapPoint(nObjID)

Parameter:
NUM | ID des Objekts

Es können für ein Objekt aber auch andere Fangpunkte definiert werden. Diese Fangpunkte kann man in folgender zentralen Procedure setzen:

SetSnapPoint
Aktiviert benutzerdefinierte Snappoints

Aufruf:
RUN public\lib3D.SetSnapPoint(nObjID,"0:0:0|1:0:0")

Parameter:
NUM | ID des Objekts
CHAR | Faktor und Offset

Beispiele:
"0.5:0.5:0.5" (ergibt den Mittelpunkt der Objektbox)
"0.5,0.5:0.5-100" (ergibt den um 100 mm nach unten verschobenen Mittelpunkt der Objektbox)
"1:1:1" (ergibt die Ecke der Objektbox rechts hinten oben)
"1-50:1:1+50" (ergibt die um 50 mm nach links und um 50 mm nach oben verschobene Ecke der Objektbox rechts hinten oben)

Sollen in einem Objekt zwei Fangpunkte definiert werden, nämlich der Mittelpunkt der Objektbox und der um 100 mm nach unten verschobene Mittelpunkt der Objektbox, dann folgende Definition zu schreiben:
"0.5:0.5:0.5|0.5:0.5:0.5-100"


War dieser Artikel hilfreich?

What's Next