We value your input! Please participate in Archicad 28 Home Screen and Tooltips/Quick Tutorials survey
2024-02-08 05:57 PM - last edited on 2024-09-24 10:23 AM by Doreena Deng
Hi,
I am having an issue in GDL. I wanted to set up some 2D hotspots that would allow me to stretch a corner of a rectangle in both the X and Y directions at the same time. I have done this a lot of times before, and it was working fine, but in this specific case it doesn't seem to be working, and I don't know why.
In the attached test GDL object you can see that I am using A and B to define a rectangle at an angle in 3D (the rotation axis is the X axis).
rotx angle
addx -A_half
rect A, B
In 2D, I wanted to set up some hotspots for the stretching. A is the same projected as it is in 3D, so I used A for the X direction (or actually A/2, because my origin is in the center of the A edge), but B is in an angle, so when it is projected, it shortens. Thus, I set up a parameter for the projected length of B (B_projected), and in the parameter script I set up a connection between B and B_projected (as well as between A and A_half).
if GLOB_MODPAR_NAME = "A_half" then
parameters a = 2 * A_half
else
parameters A_half = a / 2
endif
if GLOB_MODPAR_NAME = "B_projected" then
parameters b = B_projected / cos(angle)
else
parameters B_projected = b * cos(angle)
endif
Now, if I set up the X-direction hotspots and comment out the Y direction hotspots, the stretching works. If I do the opposite, and have the Y-direction hotspots only, the stretching also works. If I comment out the B - B_projected connection in the parameter script, then the stretching works in both directions. but with everything there, the stretching will only work in the X/A direction, and not the Y/B direction.
rect2 -A_half, 0, A_half, B_projected
! -------------------------------
! --- 2D hotspots for editing ---
! -------------------------------
_unID = 0
! --- horizontal ---
! bottom right
hotspot2 0, 0, _unID, A_half, 1 + 128, a: _unID = _unID + 1 ! Base
hotspot2 A_half, 0, _unID, A_half, 2, a: _unID = _unID + 1 ! Moving
hotspot2 -A_half, 0, _unID, A_half, 3, a: _unID = _unID + 1 ! Reference
! bottom left
hotspot2 0, 0, _unID, A_half, 1 + 128, a: _unID = _unID + 1 ! Base
hotspot2 -A_half, 0, _unID, A_half, 2, a: _unID = _unID + 1 ! Moving
hotspot2 A_half, 0, _unID, A_half, 3, a: _unID = _unID + 1 ! Reference
! top right
hotspot2 0, B_projected, _unID, A_half, 1 + 128, a: _unID = _unID + 1 ! Base
hotspot2 A_half, B_projected, _unID, A_half, 2, a: _unID = _unID + 1 ! Moving
hotspot2 -A_half, B_projected, _unID, A_half, 3, a: _unID = _unID + 1 ! Reference
! top left
hotspot2 0, B_projected, _unID, A_half, 1 + 128, a: _unID = _unID + 1 ! Base
hotspot2 -A_half, B_projected, _unID, A_half, 2, a: _unID = _unID + 1 ! Moving
hotspot2 A_half, B_projected, _unID, A_half, 3, a: _unID = _unID + 1 ! Reference
! --- vertical ---
! right
hotspot2 A_half, 0, _unID, B_projected, 1 + 256, b: _unID = _unID + 1 ! Base
hotspot2 A_half, B_projected, _unID, B_projected, 2, b: _unID = _unID + 1 ! Moving
hotspot2 A_half, -B_projected, _unID, B_projected, 3, b: _unID = _unID + 1 ! Reference
! left
hotspot2 -A_half, 0, _unID, B_projected, 1 + 256, b: _unID = _unID + 1 ! Base
hotspot2 -A_half, B_projected, _unID, B_projected, 2, b: _unID = _unID + 1 ! Moving
hotspot2 -A_half, -B_projected, _unID, B_projected, 3, b: _unID = _unID + 1 ! Reference
Weirdly enough, you can still see the B value in the tracker, but it just simply won't work.
Can someone shed a light on why this specific arrangement won't work for me? What am I doing wrong?
Thanks!
Solved! Go to Solution.
2024-02-09 02:47 AM - edited 2024-02-09 03:04 AM
My guess would be your false GLOB_MODPAR_NAME? In your code, as soon as you start modifying A, your second statement fixes B, and viceversa.
IF GLOB_MODPAR_NAME = "A_half" THEN
parameters A = 2 * A_half
endIF
IF GLOB_MODPAR_NAME = "A" then
parameters A_half = A / 2
endif
IF GLOB_MODPAR_NAME = "B_projected" THEN
parameters B = B_projected / cos(angle)
endIF
IF GLOB_MODPAR_NAME = "B" | GLOB_MODPAR_NAME = "angle" THEN
parameters B_projected = B * cos(angle)
endif
AC22-23 AUS 7000 | Help Those Help You - Add a Signature |
Self-taught, bend it till it breaks | Creating a Thread |
Win11 | i9 10850K | 64GB | RX6600 | Win10 | R5 2600 | 16GB | GTX1660 |
2024-02-09 02:47 AM - edited 2024-02-09 03:04 AM
My guess would be your false GLOB_MODPAR_NAME? In your code, as soon as you start modifying A, your second statement fixes B, and viceversa.
IF GLOB_MODPAR_NAME = "A_half" THEN
parameters A = 2 * A_half
endIF
IF GLOB_MODPAR_NAME = "A" then
parameters A_half = A / 2
endif
IF GLOB_MODPAR_NAME = "B_projected" THEN
parameters B = B_projected / cos(angle)
endIF
IF GLOB_MODPAR_NAME = "B" | GLOB_MODPAR_NAME = "angle" THEN
parameters B_projected = B * cos(angle)
endif
AC22-23 AUS 7000 | Help Those Help You - Add a Signature |
Self-taught, bend it till it breaks | Creating a Thread |
Win11 | i9 10850K | 64GB | RX6600 | Win10 | R5 2600 | 16GB | GTX1660 |
2024-02-09 01:34 PM
Hi,
Yep, that was it. I didn't consider that they would be interpreted like that (running the param script for one modified parameter at a time), but it makes perfect sense.
Thanks a lot!