Numerazione sequenziale fili di uno schema elettrico

salmozzo

Utente poco attivo
Professione: disegnatore elettrico
Software: autocad
Regione: Como
#1
Salve,
sto cercando di compilare la mia funzione che mi serve per numerare i fili di uno schema elettrico in modo veloce.
in mente ho gia' tutto il programma perco' sto andando a piccoli step e testando ogni centimetro di codice perche' per non conoscendo il programma sbaglio anche le cose piu' semplici.

in poche parole il codice fa questo:
seleziono un punto su autocad (INPUT).
registra le coordinate
aggiunge a queste coordinate dei numeri x e y in modo da individuare i 4 punti dove andro ad inserire il testo (numerazione del filo)
poi inserisco il numero (input)
imposto il testo da stampare
stampo il testo elaborato nei 4 punti trovati.

l'obbiettivo finale e':
seleziono un punto , scrivo 15.
R15
S15
T15
N15

sono arrivato a questo punto:
(defun c:Silpi4 ()
;impostare le 4 coordinate dei testi
(setq p0 (getpoint "\n clicca")) ; punto di riferimento (input)
(setq x_p1234 (+ 30 (car p0))) ;coordinate x dei quattro punti
(setq y_p1 (+ 80 (cadr p0))) ;coordinata y primo punto
(setq y_p2 (+ 75 (cadr p0))) ;coordinata y secondo punto
(setq y_p3 (+ 70 (cadr p0))) ;coordinata y terzo punto
(setq y_p4 (+ 65 (cadr p0))) ;coordinata y quarto punto

;input numero
(setq NUM (getint "\n inserisci un numero"))

;impostare i 4 testi
(setq R_text "R")
(setq S_text "S")
(setq T_text "T")
(setq N_text "N")

;scrivere i 4 testi
(command "testo" (list x_p1234 y_p1) "2.5" "0" R_text "") ;scrivere testo nel punto 1
(command "testo" (list x_p1234 y_p2) "2.5" "0" S_text "") ;scrivere testo nel punto 2
(command "testo" (list x_p1234 y_p3) "2.5" "0" T_text "") ;scrivere testo nel punto 3
(command "testo" (list x_p1234 y_p4) "2.5" "0" N_text "") ;scrivere testo nel punto 4


poi ci sono molte altre cose che vorrei aggiungere:
per adesso ci ho lavorate 6 ore. ed e' circa 1 ora e mezza che sono fermo a trovare la soluzione di unire R con 15
Grazie a chi mi possa aiutare
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
#2
(command "testo" (list x_p1234 y_p1) "2.5" "0" (strcat "R" (rtos NUM 2 0)) "")
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
#3
Oppure

;impostare i 4 testi
(setq R_text (strcat "R" (rtos NUM 2 0)))
(setq S_text (strcat "S" (rtos NUM 2 0)))
(setq T_text (strcat "T" (rtos NUM 2 0)))
(setq N_text (strcat "N" (rtos NUM 2 0)))
 

salmozzo

Utente poco attivo
Professione: disegnatore elettrico
Software: autocad
Regione: Como
#4
grazie

cmq a lavoro ho autocad LT 2011, scoperto oggi che non posso caricare i LISP :(((((((((((((((((
percio' mi tocca imparare gli script e convertirlo in script.

avete guide da consigliarmi?
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
#5
Uno script è semplicemente una serie di comandi come se li dessi da tastiera.
Macchinoso far abbinare un numero ad una stringa con lo script.
 

salmozzo

Utente poco attivo
Professione: disegnatore elettrico
Software: autocad
Regione: Como
#6
ieri ho provato a fare qualcosa con gli script ma non da troppe soddisfazioni...
voglio proseguire la mia funzione con LISP.

sotto spoiler c'e' l'ultimo aggiornamento.
- inserito possibilita' di aggiungere un prefisso
- aggiunto ciclo while infinito per incrementare il numero del filo
Codice:
(defun c:Silpi7 ()
    (setq PREF (getstring "\n inserire un prefisso: "))
    (setq NUM (getint "\n inserire un numero: ")) ;input primo numero

    (while T ;inizio loop infinito
    
        ;;impostare le 4 coordinate dei testi
        (setq p0 (getpoint "\n clicca")) ; punto di riferimento (input)
        (setq x_p1234 (+ 10 (car p0))) ;coordinate x dei quattro punti
        (setq y_p1 (+ 30 (cadr p0))) ;coordinata y primo punto
        (setq y_p2 (- y_p1 5)) ;coordinata y secondo punto
        (setq y_p3 (- y_p2 5)) ;coordinata y terzo punto
        (setq y_p4 (- y_p3 5)) ;coordinata y quarto punto
          
        ;;imposto i quattro testi
        (setq R_text (strcat "R" PREF (rtos NUM 2 0)))
        (setq S_text (strcat "S" PREF (rtos NUM 2 0)))
        (setq T_text (strcat "T" PREF (rtos NUM 2 0)))
        (setq N_text (strcat "N" PREF (rtos NUM 2 0)))
      
        ;(setq RESTO (rem NUM_2poli 3)) ; calcolo fase 2 poli

        ;;scrivere i 4 testi
        (command "testo" (list x_p1234 y_p1)  "2.5" "0" R_text ) ;scrivere testo nel punto 1
        (command "testo" (list x_p1234 y_p2)  "2.5" "0" S_text ) ;scrivere testo nel punto 2
        (command "testo" (list x_p1234 y_p3)  "2.5" "0" T_text ) ;scrivere testo nel punto 3
        (command "testo" (list x_p1234 y_p4)  "2.5" "0" N_text ) ;scrivere testo nel punto 4

        (setq NUM (+ NUM 1 )) ;incremento il numero per il prossimo loop
    )
)

a questo punto vorrei creare un'opzione per mi permetta di suddividere il mio codice in 2 opzioni:
1) 4POLI ; il quale mi stampa i soliti 4 fili R,S,T,N
2) 2POLI
qua invece volgio che mi stampa solo R,N poi SN poi TN e poi riparte da R.

la parte di impostazione di testo ci sono:
quando sono in modalita' 2POLI iniziero' un nuovo conteggio "NUM_2POLI"
il quale mi calcolo il resto della diviseione con 3 per capire quale fase tra R,S,T devo stampare
(setq RESTO (rem NUM_2poli 3))

Il problema e' creare le due opzioni 4POLI e 2POLI
grazie
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
#7
devi attivare una scelta IF che tradotto significa letteralmente SE

(initget "4poli" "2poli") ;;;questo consente di limitare l'input successivo alle sole 2 stringe citate o ai numeri 4 e 2
(setq SCELTA (getkword "Tipo circuito: "))

(if (= SCELTA "2poli)
(progn
tutto il listato
);chiusura progn
);;chiusura if

(if (= SCELTA "4poli)
(progn
tutto il listato
);chiusura progn
);;chiusura if
 

salmozzo

Utente poco attivo
Professione: disegnatore elettrico
Software: autocad
Regione: Como
#8
funziona tutto perfettamente grazie mille
l'unica correzione che ti posso fare e' che il comando
(initget "4poli" "2poli")
hai messo troppe "
(initget "4poli 2poli")
così e' corretto

Codice:
;inserisco un numero e lo aggiungo a RSTN in modo progressivo
;aggiunto prefisso
;aggiunto scelta 2poli,3poli,4poli
 
(defun c:Silpi7 ()
    (setq PREF (getstring "\n inserire un prefisso: "))                ;INPUT prefisso
    (setq NUM (getint "\n inserire un numero: "))                     ;INPUT primo numero
    (setq NUM_2poli 0)
    
    (while T ;inizio loop infinito
            
        ;;impostare le 4 coordinate dei testi
        (setq p0 (getpoint "\n clicca"))         ;INPUT punto di riferimento
        (setq x_p1234 (+ 10 (car p0)))             ;coordinate x dei quattro punti 
        (setq y_p1 (+ 30 (cadr p0)))             ;coordinata y primo punto 
        (setq y_p2 (- y_p1 4))                     ;coordinata y secondo punto
        (setq y_p3 (- y_p2 4))                     ;coordinata y terzo punto
        (setq y_p4 (- y_p3 4))                     ;coordinata y quarto punto
        
        ;;imposto i quattro testi
        (setq R_text (strcat "R" PREF (rtos NUM 2 0)))
        (setq S_text (strcat "S" PREF (rtos NUM 2 0)))
        (setq T_text (strcat "T" PREF (rtos NUM 2 0)))
        (setq N_text (strcat "N" PREF (rtos NUM 2 0)))
        
        (initget "2poli 3poli 4poli")
        (setq SCELTA (getkword "Tipo circuito: "))
        
        (if (= SCELTA "2poli")
            (progn
                ;;calcolo fase 2 poli
                (setq RESTO (rem NUM_2poli 3))
                (setq NUM_2poli (+ NUM_2poli 1))               
                (cond
                    ((= RESTO 0)(setq 2poli_text R_text))
                    ((= RESTO 1)(setq 2poli_text S_text))
                    ((= RESTO 2)(setq 2poli_text T_text))
                )
                ;;scrivere i 2 testi
                (command "testo" (list x_p1234 y_p2)  "2.5" "0" 2poli_text )     ;scrivere testo nel punto 2
                (command "testo" (list x_p1234 y_p3)  "2.5" "0" N_text )         ;scrivere testo nel punto 3
            )
            
        );;chiusura if
        
        (if (= SCELTA "3poli")
            (progn
                ;;scrivere i 3 testi
                (command "testo" (list x_p1234 y_p1)  "2.5" "0" R_text )         ;scrivere testo nel punto 1
                (command "testo" (list x_p1234 y_p2)  "2.5" "0" S_text )         ;scrivere testo nel punto 2
                (command "testo" (list x_p1234 y_p3)  "2.5" "0" T_text )         ;scrivere testo nel punto 3
            )
        );;chiusura if
        
        (if (= SCELTA "4poli")
            (progn
                ;;scrivere i 4 testi
                (command "testo" (list x_p1234 y_p1)  "2.5" "0" R_text )         ;scrivere testo nel punto 1
                (command "testo" (list x_p1234 y_p2)  "2.5" "0" S_text )         ;scrivere testo nel punto 2
                (command "testo" (list x_p1234 y_p3)  "2.5" "0" T_text )         ;scrivere testo nel punto 3
                (command "testo" (list x_p1234 y_p4)  "2.5" "0" N_text )         ;scrivere testo nel punto 4
            )
        );;chiusura if
            
        (setq NUM (+ NUM 1 ))         ;incremento il numero per il prossimo loop
    )
)

se volessi modificare dei parametri?
ad esempio' l'altezza del testo, oppure le coordinate...

allinizio del programma vorrei avere la possibilita' di modificare questi parametri
MA che abbiano dei valori di defauf , in modo tale da non inserili ad ogni apertura del comando
e' possibile?
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
#9
(setq HTESTO nil)
(initget 6) ;; previene l'utilizzo di valore Zero e negativi
(setq HTESTO (getreal "Altezza del testo: <2.5> "))
(if (= HTESTO nil) (setq HTESTO 2.50))
 

salmozzo

Utente poco attivo
Professione: disegnatore elettrico
Software: autocad
Regione: Como
#10
grandissimo
mi hai aiutato tantissimo
questo e' il risultato finale

Codice:
;inserisco un numero e lo aggiungo a RSTN in modo progressivo
;aggiunto prefisso
;aggiunto scelta 2poli,3poli,4poli
;aggiunto possibilita' di modificare altezza testo
;aggiunto possibilita' di modificare la fase iniziale dei 2 poli
;aggiuto modifica parametri iniziale con valori preimpostati di default
 
(defun c:Silpi8 ()

    (setq PREF nil)
    (setq PREF (getstring "Prefeisso: <vuoto> "))
    (if (= PREF nil) (setq PREF ""))
    
    (setq NUM nil)
    (initget 6) ;; previene l'utilizzo di valore Zero e negativi
    (setq NUM (getint "La numerazione inizia dallo: <0> "))
    (if (= NUM nil) (setq NUM 0))
    
    (setq FASE_2poli nil)
    (initget "1 2")
    (setq FASE_2poli (getkword "\n Fase iniziale 2 poli: <R> \n premi 1 per fase S; premi 2 per fase T"))
    (if (= FASE_2poli nil) (setq FASE_2poli 0))
    
    (setq HTESTO nil)
    (initget 6) ;; previene l'utilizzo di valore Zero e negativi
    (setq HTESTO (getreal "Altezza del testo: <2.5> "))
    (if (= HTESTO nil) (setq HTESTO 2.50))
    
    (while T ;inizio loop infinito
            
        ;;impostare le 4 coordinate dei testi
        (initget 9 )                            ;previene il NON inserimento delle coordinate
        (setq p0 (getpoint "\n clicca"))         ;INPUT punto di riferimento
        (setq x_p1234 (+ 10 (car p0)))             ;coordinate x dei quattro punti 
        (setq y_p1 (+ 30 (cadr p0)))             ;coordinata y primo punto 
        (setq y_p2 (- y_p1 (* HTESTO 1.6)))     ;coordinata y secondo punto
        (setq y_p3 (- y_p2 (* HTESTO 1.6)))     ;coordinata y terzo punto
        (setq y_p4 (- y_p3 (* HTESTO 1.6)))     ;coordinata y quarto punto
        
        ;;imposto i quattro testi
        
        (setq R_text (strcat "R" PREF (rtos NUM 2 0)))
        (setq S_text (strcat "S" PREF (rtos NUM 2 0)))
        (setq T_text (strcat "T" PREF (rtos NUM 2 0)))
        (setq N_text (strcat "N" PREF (rtos NUM 2 0)))
        
        (initget 9 "2poli 3poli 4poli")                                            ;previene il NON inserimento del tipo di circito
        (setq SCELTA (getkword "Tipo circuito: "))
        
        (if (= SCELTA "2poli")
            (progn
                ;;calcolo fase 2 poli
                (setq RESTO (rem FASE_2poli 3))
                (setq FASE_2poli (+ FASE_2poli 1))               
                (cond
                    ((= RESTO 0)(setq 2poli_text R_text))
                    ((= RESTO 1)(setq 2poli_text S_text))
                    ((= RESTO 2)(setq 2poli_text T_text))
                )
                ;;scrivere i 2 testi
                (command "testo" (list x_p1234 y_p2)  HTESTO "0" 2poli_text )     ;scrivere testo nel punto 2
                (command "testo" (list x_p1234 y_p3)  HTESTO "0" N_text )         ;scrivere testo nel punto 3
            )
            
        );;chiusura if
        
        (if (= SCELTA "3poli")
            (progn
                ;;scrivere i 3 testi
                (command "testo" (list x_p1234 y_p1)  HTESTO "0" R_text )         ;scrivere testo nel punto 1
                (command "testo" (list x_p1234 y_p2)  HTESTO "0" S_text )         ;scrivere testo nel punto 2
                (command "testo" (list x_p1234 y_p3)  HTESTO "0" T_text )         ;scrivere testo nel punto 3
            )
        );;chiusura if
        
        (if (= SCELTA "4poli")
            (progn
                ;;scrivere i 4 testi
                (command "testo" (list x_p1234 y_p1)  HTESTO "0" R_text )         ;scrivere testo nel punto 1
                (command "testo" (list x_p1234 y_p2)  HTESTO "0" S_text )         ;scrivere testo nel punto 2
                (command "testo" (list x_p1234 y_p3)  HTESTO "0" T_text )         ;scrivere testo nel punto 3
                (command "testo" (list x_p1234 y_p4)  HTESTO "0" N_text )         ;scrivere testo nel punto 4
            )
        );;chiusura if
            
        (setq NUM (+ NUM 1 ))         ;incremento il numero per il prossimo loop
    )
)

l'ultima modifica che ho apportato e' stata questa sotto, mi permette di non premere ENTER se prima non ho cliccato (prima mi faceva crashare la funzione)
(initget 9 ) ;previene il NON inserimento delle coordinate
(setq p0 (getpoint "\n clicca")) ;INPUT punto di riferimento