abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
Programmierung
Alles über Programmierung in GDL und Python

Ankerpunkt setzen

mac_martin
Newcomer
Hallo zusammen,

ich habe mir einige einfache GDL Objekte gebastelt und bin auf folgende Problem gestoßen.

Bei einem Objekt habe ich beispielsweise 6 Hotspots definiert.
Es besteht u. a. aus einem Rechteck und einem Text.
In der Mitte des Rechtecks habe ich einen Hotspot und einen weiteren als "Beweger" für den Text.

Wenn ich in der Vorschau den Objekteinstellungen den Mittelpunkt des Rechtecks aktiviere, sodass das Quadrat dort sitzt und dann die Parameter für Länge und Breite ändere, möchte ich logischerweise, dass sich die Größe des Rechtecks ändert und der aktivierte Mittelpunkt als Ankerpunkt verwendet wird.
Stattdessen wird aber der Bewegungspunkt des Textes als Ankerpunkt verwendet.
Dieser ist im 2D Skript als Basispunkt definiert.

Hier mal das Skrip (Achtung, ich bin noch bzw. wieder Anfänger)t.
Ich hab versucht, das fett zu machen, was mir wichtig erscheint.
! Variablen
laenge = groesse -0.020

! Start Rechteck zeichnen
PEN stift_rechteck
RECT2 0,0,laenge,laenge

! Achsen
PEN stift_achsen
LINE_TYPE linie_achsen
LINE2 laenge/2,0,laenge/2,laenge
LINE2 0,laenge/2,laenge,laenge/2

LINE_TYPE 1
diagonale=(laenge*SQR(2)/4)
LINE2 laenge/2+diagonale/4,laenge/2+diagonale/4,laenge-diagonale/4,laenge-diagonale/4
LINE2 laenge/2-diagonale/4,laenge/2+diagonale/4,diagonale/4,laenge-diagonale/4
LINE2 diagonale/4,diagonale/4,laenge/2-diagonale/4,laenge/2-diagonale/4
LINE2 laenge-diagonale/4,diagonale/4,laenge/2+diagonale/4,laenge/2-diagonale/4

! Hotspots
!Mitte
HOTSPOT2 laenge/2, laenge/2
!! Länge
!!! lu
HOTSPOT2 0, 0
!!! lo
HOTSPOT2 0, laenge
!!! ru
HOTSPOT2 laenge, 0
!!! ro
HOTSPOT2 laenge, laenge

! Ende Rechteck zeichnen

! Start Bezeichnung (Text)


IF seite="links" THEN
anker = 9
ELSE IF seite = "rechts" THEN
anker = 7
pos_x=-pos_x+laenge
ENDIF

DEFINE STYLE stil_bezeichung "Arial", 2, anker, 0
SET STYLE stil_bezeichung
PEN stift_bezeichung
gr=STR(groesse*1000,3,0)
bezeichnung="ZLDA\n" + gr
TEXT2 pos_x, pos_y, bezeichnung

!!Hotspots
HOTSPOT2 0, 0, 09, pos_x, 1 ! Basisfangpunkt
HOTSPOT2 pos_x, 0, 10, pos_x, 2 ! beweglicher Fangpunkt
!HOTSPOT2 0, 10, 11, pos_x, 3, pos_x !


Was muss ich machen, damit der in der Vorschau aktivierte Fangpunkt als Anker für Größenänderungen des Rechtecks benutzt wird?
iMac 27'' - 3,4 GHz - RAM 16/32 GB - VRAM 2 GB
AC 10-aktuell
3 ANTWORTEN 3
Ma_Scht
Advocate
Hallo Mac,
ich weiß was Du meinst. Ich mache das immer so:
Generell lasse ich alle Verschiebepunkte der dyn. HoSpos als Parameter im UI anzeigen. So kann man schnell bei 1000 Objekten den Text einheitlich verschieben.
Standardmäßig verschiebe ich den Text immer über den Mittelpunkt, läßt sich ja leicht mit o.g. Y-Verschiebungswerten des dyn. HoSpo schnell einstellen.
Generell mache ich Text in Objekten ausschaltbar, incl. deren HoSpos.
Gruß Mario
mac_martin
Newcomer
Vielen Dank für Dein Feedback.
Ich kann Dir aber nicht ganz folgen.

Was bedeutet "Generell lasse ich alle Verschiebepunkte der dyn. HoSpos als Parameter im UI anzeigen." Gehts es da um die pos_x und pos_y Werte im Einstellungen Fenster?
Das hab ich auch so.

Das hilft mir aber nicht dabei, dass Größenänderungen ab dem von mir angeklickten Ankerpunkt aus durchgeführt werden.

Gruß
Martin
iMac 27'' - 3,4 GHz - RAM 16/32 GB - VRAM 2 GB
AC 10-aktuell
Frank Beister
Mentor
Da geht etwas ein wenig durcheinander. V.a. bei den Fangpunkten.

Schau dir mal auf selfgdl den Teil über die zweidimensionalen Fangpunkte an. Ich muss das hier nicht wiederholen. Zu zwei Kernfehlern:

- Fangpunkte benötigen einen Index. Dieser muss im Skript eindeutig sein.
- Bewegliche Fangpunkte brauchen eine Referenzrichtung. Bei der Länge=0 "rät" AC sonst in welche Richtung plus ist.
- Eine ganz schlechte Idee ist es den Parameter, der beweglich sein soll im Skript zu ändern (Hier: pos_x).
- Man kann in AC keinen Basispunkt definieren. Der Basispunkt, den Du meinst ist der Basispunkt für den beweglichen Fangpunkt.

Dein IF - THEN Konstrukt ist zwar zulässig, aber etwas unüblich. Wahrscheinlich ist der 2. Teil auch überflüssig, denn wenn die Ausrichtung nicht "rechts" oder "links" ist, kommt es zum Fehler. Besser ist es wie korrigiert.

Zu Deinem eigentlichen Problem: Mario hat das schon korrekt gesagt: Das Objekt ist genau an einem Punkt im Projekt verankert. Nimm alle Bibliotheken aus dem Bib-Manager und Du siehst die EInsetzpunkte. Im Objekt selbst ist dieser Punkt der Nullpunkt des Objektes. In der ersten Zeile in 2D und 3D (bzw. bis zur ersten Systemtransformation) ist die Kordinate 0/0 genau dieser Punkt.

Im Einstellungsdialog kannst Du zwar eine Referenz auf einen anderen Punkt setzen, das ändert aber nichts an der Systematik. Lediglich versucht AC bei Größenänderungen zu berücksichtigen, dass es das Objekt nach der Änderung so verschiebt, dass das Objekt an dem Punkt im Projekt fixiert bleibt. Das ist aber nicht sicher, dass AC das auch schafft, wenn genau dieser Punkt sich auch innerhalb des Objektes in der Position verändert. Jedenfalls versetzt das das Objekt. Also seinen Einsetzpunkt im Projekt. Alles innerhalb des Objektes bleibt aber auf den internen Objektnullpunkt bezogen. Weswegen z.B. auch Dein Text (bezogen auf die linke untere Ecke) mitrutscht und nicht fixiert bleibt.

Welcher Hotspot im Dialog als Referenz/Anker ausgewählt wurde, lässt sich im Skript übrigens nicht abfragen.

Hier Dein etwas redigierter Quelltext:

! Variablen
laenge = groesse -0.020
halb = laenge / 2
htspt = 1 ! Zähler Fangpunktindex


! Start Rechteck zeichnen
PEN stift_rechteck
RECT2 0,0,laenge,laenge

! Achsen
PEN stift_achsen
LINE_TYPE linie_achsen

LINE2 halb, 0, halb, laenge
LINE2 0 , halb, laenge, halb

! Innereien des Rechtecks

LINE_TYPE 1
diagonale = laenge * 0.088 ! ~ * SQR(2) / 4 / 4 ! Sinn?

LINE2 halb+diagonale, halb+diagonale, laenge-diagonale, laenge-diagonale
LINE2 halb-diagonale, halb+diagonale, diagonale, laenge-diagonale
LINE2 diagonale, diagonale, halb-diagonale, halb-diagonale
LINE2 laenge-diagonale, diagonale, halb+diagonale, halb-diagonale

! Hotspots
! Mitte
htspt = htspt + 1 : HOTSPOT2 halb, halb, htspt

! Ecken
htspt = htspt + 1 : HOTSPOT2 0, 0, htspt !!! lu
htspt = htspt + 1 : HOTSPOT2 0, laenge, htspt !!! lo
htspt = htspt + 1 : HOTSPOT2 laenge, 0, htspt !!! ru
htspt = htspt + 1 : HOTSPOT2 laenge, laenge, htspt !!! ro

! Ende Rechteck zeichnen


! Start Bezeichnung (Text)

IF seite="links" THEN
anker = 9
ADD2 0,0 : rtg = 1
ELSE
! IF seite = "rechts" THEN
anker = 7
ADD2 laenge,0 : rtg = -1
! ELSE
! ADD2 0,0 : rtg = 1
! ENDIF
ENDIF

! Text
DEFINE STYLE stil_bezeichung "Arial", 2, anker, 0
SET STYLE stil_bezeichung
PEN stift_bezeichung

gr = STR(groesse*1000,3,0)

bezeichnung="ZLDA\n" + gr
TEXT2 pos_x*rtg, pos_y, bezeichnung

!!Hotspots
MUL2 rtg,1
htspt = htspt + 1 : HOTSPOT2 0, 0, htspt, pos_x, 1 ! Basisfangpunkt
htspt = htspt + 1 : HOTSPOT2 pos_x, 0, htspt, pos_x, 2 ! beweglicher Fangpunkt
htspt = htspt + 1 : HOTSPOT2 -0.1, 0, htspt, pos_x, 3, pos_x ! Referenzpunkt
DEL 2
bim author since 1994 | bim manager since 2018 | author of selfGDL.de | openGDL | skewed archicad user hall of fame | author of bim-all-doors.gsm