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
Mit der Interface-Methode ISS.SETACTIONCALLBACK() wird die Position des verschobenen Objektes in der angegebenen Prozedure zurückgegeben:
ISS.SETACTIONCALLBACK(<nObjID>, "objectmoved", "<Makroverzeichnis\Makroname.BAS>", "<Prozedurename>", "", "", "")
Beispiel:
ISS.SETACTIONCALLBACK(nID, "objectmoved", "HT\Grafik.BAS", "EventObjectMoved", "", "", "")
In der Prozedure "EventObjectMoved" wird uns mit der Interface-Methode die ID sowie die neue Position als String zurückgegeben. Als Trenner dient das Zeichen Pipe. (“ObjectID|X|Y|Z”)
Die Procedure könnte dann so aussehen:
PROCEDURE EventObjectMoved
DEFINE PARAMETER INPUT ObjPos
DEFINE VARIABLE cObjID, nPosX, nPosY, nPosZ
nObjID = VAL(ENTRY(1,ObjPos,"|"))
nPosX = VAL(ENTRY(2,ObjPos,"|"))
nPosY = VAL(ENTRY(3,ObjPos,"|"))
nPosZ = VAL(ENTRY(4,ObjPos,"|"))
RUN public\lib3D.TRANSLATETO(nObjID, nPosX, nPosY, nPosZ)
END
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"
Arbeitsebene
Wenn ein Objekt mit der Maus verschoben wird, muss die zweidimensionale Bewegung des Mauscursors auf dem Bildschirm in eine geeignete zweidimensionale Bewegung innerhalb der "Welt", in der sich die Grafik befindet, übertragen werden. Was geeignet ist, ist von verschiedenen Faktoren abhängig. Wenn sich ein Objekt an einer Mauer befindet, wird man im Allgemeinen das Objekt nur entlang der Mauer verschieben wollen. In anderen Fällen wird man die Verschiebung davon abhängig machen wollen, in welchem Winkel man zur Zeit auf die Grafik schaut.
Die Ebene, in der die Bewegung der Grafik stattfindet, ist die Arbeitsebene (Workplane)
Der GLB-Viewer kennt 5 Arten, wie die Arbeitsebene bestimmt werden kann:
- Automatic (0) 
- XY-Plane (1) 
- XZ-Plane (2) 
- YZ-Plane (3) 
- Dynamic (4) 
Die Modi verhalten sich wie folgt:
- XY-Plane: Die Verschiebung erfolgt in der XY-Ebene. Das ist die Ebene, auf die man normalerweise bei Frontansicht draufschaut. 
- XZ-Plane: Die Verschiebung erfolgt in der XZ-Ebene. Das ist normalerweise der Boden. 
- YZ-Plane: Die Verschiebung erfolgt in der YZ-Ebene. Das ist die Ebene, die rechtwinkelig zur XY- und XZ-Ebene liegt. 
- Dynamic: Die Wahl zwischen XY-, XZ- und YZ-Ebene erfolgt je nach Blickrichtung der Kamera. Es wird die Ebene genommen, auf die man "am senkrechtesten" draufschaut. 
- Automatic: Die Wahl der Arbeitsebene hängt davon ab, ob man sich ein Single-Mode oder in Multi-Mode befindet 
- Single-Mode: Es wird die XY-Ebene verwendet 
- Multi-Mode: Die Wahl der Ebene erfolgt dynamisch 
Standardmäßig ist der Arbeitsmodus "Automatic" eingestellt. Der Arbeitsmodus aber auch kann in den Makros explizit mit Hilfe des Attributs "_c3dGlbWorkplaneMode" bestimmt werden:
Kernel.SetLongAttributeValue(Kernel.GetActualRootItem(), "_c3dGlbWorkplaneMode", 2) ! Es wird die XZ-Ebene verwendet