GDL
About building parametric objects with GDL.

Novice GDL question - which 3D object type to use?

Jim Allen
Advisor

Apologies if this has been covered elsewhere, I've been looking at a lot of GDL posts and documentation, and I've both learned a lot and been very confused, probably both in equal measure.

 

I want to create an object which is in effect a 2D and 3D gradient labelling tool. I want to insert it onto a mesh, and then stretch the length and rotate as required, then go to the 3D window and use a hotspot to anchor the non-base end of the symbol to a point on the mesh to give me the z height difference to calculate the slope, and have the gradient displayed in 2d and/or 3D with options for angle, percentage or slope ratio.

 

The purpose of this object is twofold, the first is simply to label gradients in 3D. Where I work, most of my sites have slopes and gradients. I often have deal with site gradients and cut and fill, so use terrain modelling on most projects. Designing ramps is a ball-ache, and they are expensive and ugly to construct. If I can design them out, so much the better.

 

Any slope shallower than 1:20 is a 'gradient path' and doesn't need all the complexity of a ramp.

 

I like to use meshes in 3D and push and pull the nodes to shape the terrain as part of my design approach. Having a tool like this would actually make the design process a lot easier because I could push and pull my mesh, adjust the label and check compliance. 

 

I started with the Archicad Slope 25 symbol which I have duplicated and edited. This is a screenshot of the modified object:

Screenshot 2023-01-13 at 10.49.53.png

 

This is broadly how it's scripted:

 

Screenshot 2023-01-12 at 16.25.24.png

 So far so good. I can take the values for the polyline and hotspots and translate them to 3D, and hopefully that will work except I'm not sure which script to use.

 

What I in effect want is to be able to define a 'slab' which will rotate in 3d (or 'tilt') when I move the editing hotspot in the z axis, so it looks something like this:

 

Screenshot 2023-01-13 at 10.27.20.png

Without the circles and labels obviously.

 

The 3D text will be in a similar position to the 2D text if things work out - but inclined in the plane of the arrow. I want the 2D and 3D appearance to be ostensibly the same.

 

There is a lot of information on GDL, but not all of it is clear, simple and comprehensive, and it doesn't seem to tell you what the properties of them all are, and what their limitations are, and what they are best suited to.

 

Should I use a PRISM for this, or can I use an EXTRUDE instead? I just want to translate the 2d xy coordinates to 3D (because it seems easiest and I'm very new at this, and still a bit of a GDL idiot) and have the geometry update itself when I move the 3d hotspot.

 

Alternatively - is there a better option available that I have missed. Aligning the 3d text will require some head-scratching, but one thing at a time.

 

Any help and guidance would be greatly appreciated!

Archicad 27 UKI | OS X 12.7.1 Monterey
40 REPLIES 40
Jorge_Arreguin
Booster
! first in PARAMETER section add "angle" like an angle (not distance)

! TRY THIS IN YOU 3D SCRIPT
!----------- ADD THIS IN 3D-------------

!add a hotspot in the plane XZ

HOTSPOT A*0.5, 0, 0, 1,angle,4 !base
HOTSPOT A*COS(angle), 0, A*SIN(angle), 2,angle,5, angle !move
HOTSPOT 0, 0, 0, 3,angle,6 !center
HOTSPOT 0, -A*0.1, 0, 4,angle,7 !reference add a vector in the Y axis to make correct rotation


MATERIAL 60 !first material
ROTY -angle !this rotation in the Axis Y is equal to the hotspot
PRISM_ 7, 0.01,
0,0,15,
B/2, -B/2, 15,
A-B/2, -B/2, 15,
A, 0, 15,
A-B/2, B/2, 15,
B/2, B/2, 15,
0, 0, 15

MATERIAL 2 !second material
ADDX A/2 !we move the text to the center because in our style the anchor is at the center (5)
ADDZ 0.015 ! just move up the text over the slope
DEFINE STYLE "mytext" "Arial", B*600, 5, 0 !we define out style for 3d , 60% of B will be the height
SET STYLE "mytext"
TEXT 0, 0, "text or data for the slope" !you can change this text for any data you choose like in your 2D
DEL 2 !we erase transformations of text
DEL 1 !erase transformation of rotation


! with the variable "angle" you obtain the data for your script in 2D that its working

 

 


@A_ Smith wrote:

You can't write

IF condition THEN

...

ELSE condition ...

 

and so on. You must use instead

IF condition THEN

....

ENDIF - 3 times for three different conditions

 


That is fine if you only have three conditions to be met, and it can't be anything else.

But what happens if there is another.

 

You can nest IF/THEN.

 

IF condition THEN
    ...
ELSE
    IF condition THEN
        ...
    ELSE
        IF condition THEN
            ...
        ELSE
            ...
        ENDIF
    ENDIF
ENDIF

 

This way, if it does not meet the first condition, it will check the second condition.

If it doesn't meet the second condition, it will check the third.

It it doesn't meet the third condition (i.e. it does not meet any of the previous conditions) then it will apply the last condition.

 

You can keep going if that are more possible conditions you want to catch.

 

Barry.

 

 

One of the forum moderators.
Versions 6.5 to 27
i7-10700 @ 2.9Ghz, 32GB ram, GeForce RTX 2060 (6GB), Windows 10
Lenovo Thinkpad - i7-1270P 2.20 GHz, 32GB RAM, Nvidia T550, Windows 11
Lingwisyer
Guru

Just make sure you indent everything properly, as it becomes very easy to lose track of the number of IF statements. The same for transformations.

AC22-23 AUS 7000Help Those Help You - Add a Signature
Self-taught, bend it till it breaksCreating a Thread
Win11 | i9 10850K | 64GB | RX6600 Win10 | R5 2600 | 16GB | GTX1660

@Lingwisyer wrote:

Just make sure you indent everything properly, as it becomes very easy to lose track of the number of IF statements. The same for transformations.


Yes, it is important to set the scripts out legibly - and add comments.

 

I am still waiting for colour coded scripts.

One day!

 

Barry.

One of the forum moderators.
Versions 6.5 to 27
i7-10700 @ 2.9Ghz, 32GB ram, GeForce RTX 2060 (6GB), Windows 10
Lenovo Thinkpad - i7-1270P 2.20 GHz, 32GB RAM, Nvidia T550, Windows 11

Re: GDL Syntax Highlight for VSCode  @Barry Kelly see PB's last comment. Fingers crossed!

Apple iMac Intel i9 / macOS Sonoma / AC27UKI (most recent builds.. if they work)

Yes, I saw that.

I really hope it does happen.

 

Barry.

One of the forum moderators.
Versions 6.5 to 27
i7-10700 @ 2.9Ghz, 32GB ram, GeForce RTX 2060 (6GB), Windows 10
Lenovo Thinkpad - i7-1270P 2.20 GHz, 32GB RAM, Nvidia T550, Windows 11

Ideally yes, nested IF-else statements are definitely better. Though, tbh i make just IF, in case of many IF, otherwise will be hard to read - there no CASE statement and sometimes i have more than 40 IFs... I don't want to imagine how it will look like properly nested, though caution needed indeed + it's not effective coding - if IF condition finds its match, others IF still will be checked. I haven't found better option than independent IFs if there's a lot of conditions...

AC 22, 24 | Win 10

40 IF statements... If you're going that far I feel like you should be using numerical strings and comparing ranges in order to reduce the number of possible operations.

 

IF x > 20 then
      IF x < 10 then
            IF x = 1...
            IF x = 2...
            ...
         ELSE
            ...
      endIF
   ELSE
      IF x ≥ 10 then
         ...
      endIF
endIF

 

 

Ling.

AC22-23 AUS 7000Help Those Help You - Add a Signature
Self-taught, bend it till it breaksCreating a Thread
Win11 | i9 10850K | 64GB | RX6600 Win10 | R5 2600 | 16GB | GTX1660

About 40 IF - towel rails (warmer) object which has many models. All IF are compared via equal sign with variable, which is integer.

I mean in Master script modelName1=1, in other scripts IF model=modelName1 THEN...

And ofc to ease process i didn't do 40 nests

AC 22, 24 | Win 10

If you have 40 specific model names (in a list), then 40 separate IF statements is fine.

If you were allowing the user to type in a model name, then that is when you need the IF/THEN/ELSE, so you can catch the name that does not match what you are expecting.

 

Speed wise, yes it will check each of the separate IFs and it will stop in the nested ones when it finds a match and will ignore the rest.

But I don't think you will notice much of a difference from the users view point.

 

Barry.

 

One of the forum moderators.
Versions 6.5 to 27
i7-10700 @ 2.9Ghz, 32GB ram, GeForce RTX 2060 (6GB), Windows 10
Lenovo Thinkpad - i7-1270P 2.20 GHz, 32GB RAM, Nvidia T550, Windows 11