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:
This is broadly how it's scripted:
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:
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!
! 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.
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.
Yes, I saw that.
I really hope it does happen.
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...
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
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
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.