-
TESTO GDL CENTRATO
da
Andrea1107
il 16 Giu, 2025 12:18
-
Buongiorno a tutti,
scusate per la richiesta, ma sono un principiante in questo settore.
Ho disegnato una trave parametrica ed ho bisogno in 2d di poter inserire un testo che si al centro di questa trave.
Ho provato in mille modi ma sicuramente sto sbagliando qualcosa... questo è il testo che dovrà comparire al centro del trave
"Trave" +" "+ str ("%#0.0mm",A) + "x" + str ("%#0.0mm",B) + " " + "h." + str ("%#0.0mm",ZZYZX)
Potete aiutarmi?
Grazie mille in anticipo
-
#1
da
ZioBob
il 18 Giu, 2025 09:51
-
Difficile dare una risposta puntuale senza vedere altre caratteristiche dello script.
Qui sotto un esempio di come potrebbe essere, vedi se puoi adattare queste istruzioni al tuo caso specifico
rect2 0,0, a,b ! Disegna a trave in pianta
add2 a/2, b/2 ! Posiziona l'origine al centro della trave
! definisce la frase che dovrà scrivere, assegnandola alla variabile "Testo"
testo = "Trave " + str ("%#0.0mm",A) + "x" + str ("%#0.0mm",B) + " h." + str ("%#0.0mm",ZZYZX)
define style "st5" "arial", .3, 5, 0 ! Definizione delle caratteristiche del testo (Font, altezza, allineamento e stile)
set style "st5" ! Imposta lo stile di testo corrente
text2 0, 0, testo ! Scrive la frase centrata sull'origine corrente
-
#2
da
Andrea1107
il 18 Giu, 2025 11:29
-
Grazie mille della risposta.
Adesso ho un altro problema, non riesco a far funzionare questa sintassi. Non capisco dove sbaglio perchè se faccio la verifica mi dice che il testo GDL è corretto, ma graficamente non cambia nulla.
Avrei bisogno che se il trave è inferiore a 1000mm il testo sia ancorato nella parte sotto, mentre se superiore a 1000 rimanga al centro.
Scusatemi nuovamente per le richieste magari banali.
di seguito lo script:
IF A <=1000 THEN
DEFINE STYLE "prova" "arial",
0.6, ! mm
5, ! in basso al centro
3 ! grassetto sottolineato
SET STYLE "prova"
TEXT2 a/2, b/2, "Travetto" +" "+ str ("%#0.0mm",A) + "x" + str ("%#0.0mm",B) + " " + "h." + str ("%#0.0mm",ZZYZX)
ELSE
DEFINE STYLE "prova2" "arial",
0.6, ! mm
5, ! in basso al centro
3 ! grassetto sottolineato
SET STYLE "prova2"
TEXT2 a/2, b, "Travetto" +" "+ str ("%#0.0mm",A) + "x" + str ("%#0.0mm",B) + " " + "h." + str ("%#0.0mm",ZZYZX)
ENDIF
ENDMDGDGU
-
#3
da
ZioBob
il 18 Giu, 2025 14:20
-
L'unico vero errore è che, anche se lavori in millimetri, il GDL usa sempre e solo il METRO come unità di misura.
Scrivendo IF a <= 1000 ... stai dicendo che questa condizione è valida per tutte le travi fino a un Km di lunghezza...
Il tuo testo potrebbe essere riscritto così:
IF a<=1 THEN ! per travi fino a 1 metro di lunghezza
ancoraggio = 5
posizione = b/2
ELSE ! per travi più lunghe
ancoraggio = 8
posizione = b
ENDIF
DEFINE STYLE "prova" "arial",
0.6, ! mm
ancoraggio, !
5 ! grassetto sottolineato
SET STYLE "prova"
TEXT2 a/2, posizione, "Travetto "+ str ("%#0.0mm",A) + "x" + str ("%#0.0mm",B) + " h." + str ("%#0.0mm",ZZYZX)
Usando una variabile definita in precedenza, puoi evitare di avere nello script più volte le stesse istruzioni. Quando sono complesse (come la riga di comando TEXT2...), soprattutto in caso di successive modifiche, il rischio di commettere errori viene molto ridotto. E ne guadagna anche la leggibilità.
(inoltre, nella costruzione della stringa, il carattere SPAZIO dopo la parola "Travetto", e quello prima di "h.", possono essere scritti direttamente, senza dover usare una concatenazione)
-
#4
da
Andrea1107
il 23 Giu, 2025 11:03
-
Grazie mille della pronta risposta.... tutto perfetto, proprio quello che mi serviva.
Un'ultima cosa posso gestire questi testi con delle boleane? se non erro poi possono essere gestite da "Impostazioni Selezione Oggetto" Giusto?
Grazie mille di tutto
-
#5
da
ZioBob
il 23 Giu, 2025 21:37
-
posso gestire questi testi con delle boleane?
Vuoi dire se è possibile far apparire le scritte oppure nasconderle in base ad un clic in una casella di controllo? Questo è possibile, certamente.
Occorre creare un nuovo parametro di tipo booleano, chiamato per esempio "Scritta".
Nel codice GDL poi si userà una forma del tipo:
IF Scritta=1 THEN TEXT2 a/2, ...ecc
-
#6
da
Andrea1107
il 24 Giu, 2025 09:09
-
proprio cosi, grazie mille. Il componente sta rispettando tutto quello che mi serve. Perfetto.
Mi sono accorto però di una cosa, quando ruoto il trave, anche il testo ruota, come posso fare per far si che il testo rimanga orientato alla vista?
E' possibile?
Mi scuso nuovamente per le mille richieste.
Grazie di tutto.
-
#7
da
ZioBob
il 25 Giu, 2025 00:10
-
E' normale che il testo segua la rotazione dell'oggetto, e probabilmente è anche giusto che sia così. D'altra parte non avrebbe senso inserire la scritta "dentro" o "fuori" in base alla lunghezza della trave, perché se l'orientamento della trave non è orizzontale, mentre il testo rimane sempre orizzontale, la scritta andrà sempre fuori, in qualche modo.
Se comunque vuoi provare, credo che dovresti usare la variabile "SYMB_ROTANGLE" che riporta il valore di rotazione corrente dell'oggetto. Mettendo un'istruzione tipo:
ROT2 -SYMB_ROTANGLE
si impone al sistema di coordinate una rotazione uguale e contraria a quella dell'oggetto, riportandolo quindi all'orientamento globale del progetto.
Per fare in modo che comunque la scritta resti centrata sulla trave occorrono anche altre modifiche...
-
#8
da
Andrea1107
il 25 Giu, 2025 07:53
-
Grazie mille, allora cerchero di utilizzare il trave in altro modo. Effettivamente è una cosa poco sensata, mi scusi.
Invece l'errore "usare un tipo reale può causare problemi di precisione" come posso risolverlo? (immagine allegata)
in pratica ho dei pannelli ed in base alla loro altezza vorrei che il retino sia di colore diverso, ma purtroppo mi da quell'errore.
questo è lo script:
FILL fillAttribute_1_mur
PEN penAttribute_3_mur
altezza = ZZYZX
if altezza = 2.800 then
sfondo_retino = fillTypeAttribute_1
altezza = 2.900 then
sfondo_retino = fillTypeAttribute_2
if altezza = 3.500 then
sfondo_retino = fillTypeAttribute_3
if altezza = 3.850 then
sfondo_retino = fillTypeAttribute_4
if altezza = 3.950 then
sfondo_retino = fillTypeAttribute_5
if altezza = 4.000 then
sfondo_retino = fillTypeAttribute_6
if altezza = 4.850 then
sfondo_retino = fillTypeAttribute_7
if altezza = 5.000 then
sfondo_retino = fillTypeAttribute_8
if altezza <> 2.800 and 2.900 and 3.500 and 3.850 and 3.950 and 4.000 and 4.850 and 5.000
sfondo_retino = fillTypeAttribute_9
endif
POLY2_B 5, 3,
penAttribute_1_mur, sfondo_retino,
0.00, 0.00, 1,
0.00, B, 1,
A, B, 1,
A, 0.00, 1,
0.00, 0.00, 1
Con questa veramente chiudo.
Grazie mille e mi scuso di nuovo.
-
#9
da
Andrea1107
il 25 Giu, 2025 07:54
-
-
#10
da
ZioBob
il 26 Giu, 2025 12:18
-
Quello che ricevi è solo un avviso generico che potresti ignorare perché in genere non crea problemi (*). Il resto dello script invece è così sbagliato che probabilmente non c'è modo di correggerlo senza riscriverlo completamente.
A parte che alla linea "Altezza = 2.900" mancherebbe l'IF iniziale, in ogni caso questa costruzione, con una serie di IF e un solo ENDIF alla fine non è ammessa.
Poi, il valore delle varie variabili "fillTypeAttribute_*" è definito da qualche parte dell'oggetto?
Anche la costruzione "if altezza <> 2.800 and 2.900 and ..." è sbagliata. Il GDL, come altri linguaggi formali, esige che si ripeta per intero la condizione da verificare, senza parti sottintese come si usa nel parlato. Quindi:
IF altezza <> 2.800 AND altezza <> 2.900 AND altezza <> ...
(*) L'avviso viene emesso quando si usa il confronto (con il segno "=") tra due numeri reali (non interi), perché uno di essi, o entrambi, potrebbero essere il risultato di operazioni con decimali arrotondati, e alla fine anche se "praticamente uguali", per il computer ci può essere una differenza infinitesimale che fa emettere la risposta "falso" quando gli si chiede se sono uguali.
Per esempio se chiedessimo di confrontare un numero inserito dall'utente con il valore di Pi greco, sarebbe sempre diverso, perché Pi greco ha una quantità infinita di decimali , quindi non è formalmente uguale a 3.14, né a 3.14159265358979...
La raccomandazione di Graphisoft è quella di evitare i confronti diretti. Invece di vedere se A è uguale a B suggerisce di valutare se la differenza fra A e B (in valore assoluto) è inferiore ad una tolleranza ammissibile che potrebbe essere, per esempio, 0.0001.
-
#11
da
Andrea1107
il 26 Giu, 2025 12:55
-
Ok, il resto dello script invece è così sbagliato che probabilmente non c'è modo di correggerlo senza riscriverlo completamente, purtroppo non capisco dov'è l'errore... scusatemi.
così può andare?
IF decre = 1 THEN
...istruzione 1
...istruzione 2
...
...istruzione n
ENDIF
fillTypeAttribute_* si è stato definito nei parametri (vedi foto allegata) Va bene così?
Grazie mille per la pazieza.
-
#12
da
ZioBob
il 26 Giu, 2025 21:58
-
La sintassi del comando IF ha due forme (sintassi) ben precise. Una "monoriga" che non richiede ENDIF:
IF (condizione) THEN (istruzione)
L'altra "multiriga" da usare quando al verificarsi della (condizione) si vogliono far seguire più (istruzioni):
IF (condizione) THEN
(istruzione1)
(istruzione2)
(istruzione3)
ENDIF
In questo caso la serie di istruzioni "condizionate" deve essere chiusa con ENDIF.
NON esiste invece una forma che preveda più condizioni, quindi per ogni condizione si deve usare un'istruzione IF distinta.
Uno script come quello che segue funziona senza generare errori (ovviamente i parametri filltypeattribute_ da 3 a 9, che nella tua schermata sono a zero, devono avere un numero di penna valido)
FILL fillAttribute_1_mur
PEN penAttribute_3_mur
altezza = ZZYZX
tollera=0.001
sfondo_retino = fillTypeAttribute_9
IF ABS(altezza - 2.800) < tollera THEN sfondo_retino = fillTypeAttribute_1
IF ABS(altezza - 2.900) < tollera THEN sfondo_retino = fillTypeAttribute_2
IF ABS(altezza - 3.500) < tollera THEN sfondo_retino = fillTypeAttribute_3
IF ABS(altezza - 3.850) < tollera THEN sfondo_retino = fillTypeAttribute_4
IF ABS(altezza - 3.950) < tollera THEN sfondo_retino = fillTypeAttribute_5
IF ABS(altezza - 4.000) < tollera THEN sfondo_retino = fillTypeAttribute_6
IF ABS(altezza - 4.850) < tollera THEN sfondo_retino = fillTypeAttribute_7
IF ABS(altezza - 5.000) < tollera THEN sfondo_retino = fillTypeAttribute_8
POLY2_B 5, 3,
penAttribute_1_mur, sfondo_retino,
0.00, 0.00, 1,
0.00, B, 1,
A, B, 1,
A, 0.00, 1,
0.00, 0.00, 1
Come noterai, ho attribuito PRIMA alla variabile "sfondo_retino" il valore che deve avere in tutti i casi in cui l'altezza NON è fra quelle standard.
Poi, se una delle condizioni seguenti risulta valida (misura standard) il valore viene modificato di conseguenza, altrimenti, finita senza successo la serie di confronti, il valore resta quello iniziale.
-
#13
da
Andrea1107
il 02 Lug, 2025 09:56
-
buongiorno,
grazie delle preziosissime informazioni, adesso sono davanti ad un nuovo problema.
come posso dire ad una istruzione che è nulla?
e poi in questo script cosa posso migliorare?
FILL fillAttribute_1
PEN penAttribute_4
POLY2_B 5, 3,
penAttribute_2, penAttribute_3,
0.00, 0.00, 1,
0.00, B, 1,
A, B, 1,
A, 0.00, 1,
0.00, 0.00, 1
if a<1.10 or b<0.3 then
!! TEXT2 NON VISIBILE
else
ancoraggio = 5
posizione1 = B/2+0.1
posizione2 = B/2-0.1
DEFINE STYLE "st5" "arial",
0.8, ! mm
ancoraggio,
3 ! grassetto sottolineato
SET STYLE "st5"
PEN penAttribute_5
text2 A/2, posizione1, "Truciolare"
text2 A/2, posizione2, str ("%#0.0mm",A) + " x " + str ("%#0.0mm",B) + " x " + "Sp." + str ("%#0.0mm",ZZYZX)
endif
END
Grazie mille per la pazienza
-
#14
da
ZioBob
il 02 Lug, 2025 17:13
-
Non c'è bisogno di avere una "istruzione nulla".
Invece di controllare se il rettangolo è troppo piccolo (in quel caso non fare niente / in caso contrario scrivi le misure), basta verificare che il rettangolo sia abbastanza grande (in quel caso scrivi le misure).
Io farei così:
FILL fillAttribute_1
PEN penAttribute_4
POLY2_B 5, 3,
penAttribute_2, penAttribute_3,
0.00, 0.00, 1,
0.00, B, 1,
A, B, 1,
A, 0.00, 1,
0.00, 0.00, 1
Lx = 1.10 ! Limite lunghezza
Ly = 0.30 ! Limite larghezza
Eps= 0.00001 ! Approssimazione al centesimo di mm
IF a>(Lx-Eps) and b>(Ly-Eps) THEN
ancoraggio = 5
posizione1 = B/2+0.1
posizione2 = B/2-0.1
DEFINE STYLE "st5" "arial",
0.8, ! mm
ancoraggio,
5 ! grassetto sottolineato
SET STYLE "st5"
PEN penAttribute_5
TEXT2 A/2, posizione1, "Truciolare"
TEXT2 A/2, posizione2, str ("%#0.0mm",A) + " x " + str ("%#0.0mm",B) + " x Sp. " + str ("%#0.0mm",ZZYZX)
ENDIF
END
Nella definizione dello stile, 3 equivale a grassetto(1) +corsivo(2). Grassetto sottolineato è 5 (1+4). I codici di stato possono essere un po' ostici.
il manuale li riporta così:
face_code: a combination of the following values:
face_code = j1 + 2*j2 + 4*j3 + 8*j4 + 16*j5, where each j can be 0 or 1.
j1: bold,
j2: italic,
j3: underline,
j4: outline,
j5: shadow,
If face_code = 0, then style is normal.
Nel nostro caso l'elenco ci dice che i codici di stato che vogliamo usare sono j1 e j3. Nella spiegazione della sintassi si vede che il codice j1 non ha moltiplicatori (vale 1) mentre j3 ha moltiplicatore 4. Quindi per attivare i bit 1 e 3, si deve inserire il numero 1+4, cioè 5... chiaro no? beh, so che non lo è, ma bisogna farci l'abitudine!
-
#15
da
Andrea1107
il 14 Lug, 2025 11:14
-
Grazie mille dei consigli mi sono stati utilissimi.
Adesso avrei un'altra domanda è possibile gestire le immagini 2D con la variabile angolo?
In allegato uno screen shot della richiesta.
Per quanto riguarda il discorso caricamento oggetti libreria, posso chiedere qui oppure potreste indicarmi il canale giusto?
Ho dei problemi ad importare un dwg 3d non lo carica. Ho provato anche con il formato fbx, ma anche questo non è completo.
Qual'è il miglior metodo per convertire file 3ds, dwg 3d, iges ecc. in formato gdl?
Grazie mille
-
#16
da
ZioBob
il 15 Lug, 2025 07:09
-
è possibile gestire le immagini 2D con la variabile angolo?
Puoi essere più chiaro?
Con il comando ROT2, qualsiasi porzione dello script 2D può essere ruotata.
Per quanto riguarda il discorso caricamento oggetti libreria, posso chiedere qui oppure
usa la sezione ARCHICAD[/quote]
-
#17
da
Andrea1107
il 15 Lug, 2025 14:44
-
Dovrei ruotare solo le parti evidenziate nel file allegato "ROT2" o meglio vorrei che un lato del retino e i relativi punti di ancoraggio ruotassero in base ai gradi indicati nella variabile.
E' possibile questo?
Inoltre sto impostando una distinta base su schemi di lista però avrei bisogno di sapere se è possibile le unità di misura e se c'è la possibilita di dare un codice ed una descrizione aggiuntiva al componente creato.
Grazie mille
Andrea
-
#18
da
ZioBob
il 15 Lug, 2025 17:17
-
Se non devi ruotare un intero elemento, ma solo la posizione di uno o più vertici all'interno di un poligono, come nel caso delle coordinate che hai evidenziato all'interno del comando POLY2_B, non è possibile usare il comando ROT2, ma è necessario CALCOLARE la nuova posizione di quel vertice, usando funzioni trigonometriche.
Nell'esempio che allego, per indicare la nuova posizione del punto 0,B si può usare la funzione trigonometrica TANGENTE (perché rimane alla stessa coordinata Y). In altri casi si deve usare SENO e COSENO