Autore |
Discussione  |
liber
Utente Master
1278 Messaggi |
Inserito il - 30 maggio 2006 : 07:17:42
|
ecco un utility che funziona praticamente con tutti i cad

comandi: fin fin1 porta porta1
inutile dire che funziona con autocad full , niente LT
Scarica allegato:
aperture.zip 2,15 KB
|
Modificato da - liber in Data 29 agosto 2007 20:49:35
|
|
zenobio
Utente Medio
Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento
33 Messaggi |
Inserito il - 29 dicembre 2010 : 12:23:06
|
ciao scusa se riapro questo vecchio post ma da poco mi sono interessato di nuovo ai programmi lisp ed ho trovato interessante il tuo, in parte sono riuscito modificarlo secondo le mie necessità. purtroppo le mie scarse conoscenze del linguaggio non mi permettono di capire dove sbaglio. di seguito la parte che ho modificato: ;______________________________________________________________________________ ;parte con fin3 (defun C:fin3 (/ larghezza zero primo secondo terzo quarto m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12 m13 m14 m15 m16 m17 m18 m19 m20 m21 m22 m23 m24
m25 m26 m27 m28 a angolo angolo1 piano angolo2 angolo3 gr midlarg terlarg qualarg x lf lx t1 t2 hf a aa) (PROMPT "\nFinestre\n") (setq piano (getvar "CLAYER")) (setvar "OSMODE" 33) ;Imposta Osnap Fine;Intersezione - Endpoint;Intersection (setq zero (getpoint "\nPunto di riferimento: ")) ;Individua Punto di riferimento per la distanza dal punto di inserimento della Finestra (command "_osnap" "_nearest") ;Imposta Osnap vicino (setq primo (getpoint zero "\nPunto di Inserimento interno: ")) (setvar "OSMODE" 128) (setq secondo (getpoint primo "\nLarghezza del muro: ")) (command "_osnap" "_nearest") (setq terzo (getpoint primo "\nLarghezza della finestra: ")) (setvar "OSMODE" 0) (setq larghezza (distance primo terzo)) (progn (setq angolo (angle primo terzo)) (setq quarto (polar secondo angolo larghezza)) (command "_break" primo terzo C:) (command "_break" secondo quarto C:) (command "_layer" "N" "MURI" "c" "3" "Muri" C:) (command "_layer" "_s" "MURI" C:) (command "-color" "256" C:) ;Imposta Colore da Layer (command "_line" primo secondo C:) (command "_line" terzo quarto C:) (command "-color" "7" C:) ;Imposta Colore Bianco (command "_line" primo terzo C:) (command "_line" quarto secondo C:) (command "_layer" "N" "INFISSI" "c" "2" "INFISSI" C:) (command "_layer" "_s" "INFISSI" C:) (command "-color" "256" C:) ;Imposta Colore da Layer (setq midlarg (/ larghezza 2)) (setq terlarg (/ larghezza 3)) (setq qualarg (/ larghezza 4)) (setq angolo1 (angle terzo primo)) (setq angolo2 (angle primo secondo)) (setq angolo3 (angle secondo primo)) (setq m1 (polar primo angolo2 0.05)) (setq m2 (polar terzo angolo2 0.05)) (command "_line" m1 m2 C:) (setq m4 (polar primo angolo 0.05)) (setq m5 (polar m4 angolo2 0.05)) (setq m8 (polar terzo angolo1 0.05)) (command "_line" m4 m5 C:) (command "_copy" "_L" "" m4 m8 C:) (setq m101 (polar secondo angolo1 0)) ;definisce primo punto davanzale esterno a sx di secondo (setq m102 (polar quarto angolo 0)) ;definisce ultimo punto davanzale esterno a dx di quarto (setq m103 (polar m101 angolo2 0.05)) ;definisce secondo punto davanzale esterno a sx di secondo (setq m104 (polar m102 angolo2 0.05)) ;definisce terzo punto davanzale a esterno dx di quarto (setq m105 (polar secondo angolo1 midlarg));definisce primo punto persiana a sx di secondo (setq m106 (polar quarto angolo midlarg));definisce ultimo punto persiana a dx di quarto (setq m107 (polar m105 angolo2 0.05)) ;definisce secondo punto persiana esterno a sx di secondo (setq m108 (polar m106 angolo2 0.05)) ;definisce terzo punto persiana esterno a dx di quarto (command "_line" m105 m107 m108 m106 C:) ;disegna la persiana ed il davanzale esterno (command "_line" m101 m103 C:) ;completa il davanzale esterno (command "_line" m102 m104 C:) ;completa il davanzale esterno (setq m109 (polar primo angolo1 0.025)) ;definisce primo punto davanzale interno a sx di secondo (setq m110 (polar terzo angolo 0.025)) ;definisce ultimo punto davanzale interno a dx di quarto (setq m111 (polar m109 angolo3 0.05)) ;definisce secondo punto davanzale interno a sx di secondo (setq m112 (polar m110 angolo3 0.05)) ;definisce terzo punto davanzale a interno dx di quarto (command "_line" m109 m111 m112 m110 C:) ;disegna il davanzale interno (setq m3 (polar primo angolo midlarg)) (cond (if (> larghezza 0.90) ;0.90 definisce la larghezza minima per una finestra a due volate (progn (setq m6 (polar m3 angolo1 0.05)) (setq m7 (polar m3 angolo 0.05)) (command "_copy" "_P" "" "M" m4 m3 m6 m7 C:)) (if (> larghezza 1.20) ;1.20 definisce la larghezza minima per una finestra a tre volate (progn (command "_erase" "_L" "") (command "_erase" "_L" "") (command "_erase" "_L" "") (setq m15 (polar primo angolo terlarg)) (setq m16 (polar m15 angolo2 0.05)) (setq m17 (polar m15 angolo1 0.05)) (setq m18 (polar m15 angolo 0.05)) (setq m19 (polar terzo angolo1 terlarg)) (setq m20 (polar m19 angolo1 0.05)) (setq m21 (polar m19 angolo 0.05)) (command "_line" m15 m16 C:) (command "_copy" "_L" "" "M" m15 m17 m18 m19 m20 m21 C:)) ) (if (> larghezza 1.50) ;1.50 definisce la larghezza minima per una finestra a tre volate (progn (command "_erase" "_L" "") (command "_erase" "_L" "") (command "_erase" "_L" "") (command "_erase" "_L" "") (command "_erase" "_L" "") (command "_erase" "_L" "") (setq m22 (polar primo angolo qualarg)) (setq m23 (polar m22 angolo2 0.05)) (setq m24 (polar m22 angolo1 0.05)) (setq m25 (polar m22 angolo 0.05)) (setq m26 (polar terzo angolo1 qualarg)) (setq m27 (polar m26 angolo1 0.05)) (setq m28 (polar m26 angolo 0.05)) (command "_line" m22 m23 C:) (command "_copy" "_L" "" "M" m22 m24 m25 m3 m6 m7 m26 m27 m28 C:)) ) ) ) ) (if (= gfix nil) (setq gfix 1)) (princ "\nQuotare finestra (S/N)? <") (if (= gfix 0) (princ "S")) (if (= gfix 1) (princ "N")) (princ ">") (setq gfiy (getstring)) (if (= (strcase gfiy) "S") (setq gfix 0)) (if (= (strcase gfiy) "N") (setq gfix 1)) (if (= gfix 0) (progn (command "_layer" "N" "QUOTE" "c" "2" "QUOTE" C:) (command "_layer" "_s" "QUOTE" C:) (setq gr (/ 180 PI)) (if(or(< (* gr angolo2) 95) (> (* gr angolo2) 310)) (progn (setq a (* gr angolo2)) (setq aa angolo2) (setq x 1)) (progn (setq a (* gr angolo3)) (setq aa angolo3) (setq x 0)) ) (setq m9 (polar secondo angolo midlarg)) (setq m10 (polar m9 angolo2 0.6)) (setq m11 (polar m3 angolo3 0.1)) (command "_pline" m10 m11 C:) (setq m12 (polar m9 angolo2 0.3)) (setq m13 (polar m12 (+ aa (/ 90 gr)) 0.125)) (setq m14 (polar m12 (+ aa (/ 270 gr)) 0.125)) (if (= ghf nil) (setq ghf 160)) (princ "\nAltezza finestra: <") (princ ghf) (princ ">") (setq hf (getint)) (if (= hf nil) (setq hf ghf)) (setq ghf hf) (setvar "luprec" 0) (setq lf (* larghezza 100)) (setq lx (strcat (rtos lf))) (setq t1 lx) (setq t2 hf) (command "_text" "m" m13 "0.15" a t1) (command "_text" "m" m14 "0.15" a t2) ) ) (command "_layer" "_s" "0" C:) (setvar "luprec" 2) (princ) ) ;______________________________________________________________________________
come potrai provare la finestra si suddivide in 3 da m 1.2 a 1.5 e in 4 oltre i m 1.5, ho anche aggiunto un davanzale interno ed uno esterno. la riga in mezzo mi descrive l'avvolgibile. fin qui tutto bene solo che mi fa un errore quando disegno una finestra con dimensione inferiore a m 0.90 che viene divisa lo stesso in due mentre con la tua lisp originale rimaneva ad una volata unica.
dove sbaglio ?????
mi servirebbe anche un ulteriore consiglio per eliminare tutte quelle righe
(command "_erase" "_L" "")
che cancellano le suddivisioni precedenti della finestra, non perché non funzionino ma mi piacerebbe sapere se c'è una forma più elegante per cancellare rispettivamente le ultime 3 e 6 righe disegnate
avrei voluto inserire un'immagine ma non so come si fa   
|
 |
|
liber
Utente Master
1278 Messaggi |
Inserito il - 29 dicembre 2010 : 12:44:37
|
questi lisp sono stati scritti a 6 mani nel lontano 1989 quando per invidia abbiamo visto su un pc di un ing il software arten90a, purtroppo fra i 3 per me il lisp non è come andare in bicicletta, cioè basta trovare un pò di equilibrio e poi tutto va da sè, non avendo più sprone e voglia sono regredito alla fase iniziale. Anque questi lisp cmq non sono l'eccelso. L'unico che può darti una mano per il momento è GP che magari potrebbe anche ottimizzarlo.
che ne pensi GP potresti darci una mano? |
Modificato da - liber in data 29 dicembre 2010 12:45:06 |
 |
|
zenobio
Utente Medio
Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento
33 Messaggi |
Inserito il - 29 dicembre 2010 : 13:08:15
|
grazie per la tempestiva risposta
ho posto qui la mia domanda perché il problema mi è sorto tentando di modificare questo lisp diciamo che più generalmente si potrebbe tradurre un una mia scarsa conoscenza del comando "if". ho cercato vari esempi in rete ma non ho trovato nessun esempio valido per il comando if in serie per valori compresi "A < X < B" sempre per variabili =.
se qualcuno mi sa indicare la via ogni suggerimento verrà ben accettato.
P.S.: avevo dimenticato di scrivere che ho inserito all'inizio un p.to "zero" di riferimento per l'inserimento del serramento.
|
 |
|
Roberto07
Utente Master

Regione: Lazio
Prov.: Roma
Città: Sabina Italia
1042 Messaggi |
Inserito il - 29 dicembre 2010 : 15:48:10
|
GP va bene. Ma terminator dove lo lasciamo?!
Da quando bazzico in questo forum i lisp di Terminator li trovo eccelsi.....  |
 |
|
zenobio
Utente Medio
Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento
33 Messaggi |
Inserito il - 30 dicembre 2010 : 19:29:35
|
ciao ho fatto alcune prove e sono riuscito ad eliminare una parte dei problemi, ma essendo un testardo me ne sto creando di nuovi, ho modificato un po' la lisp dividendola in + parti visto che poi ho intenzione di reinserirla in quella originale postata da liber così ho riunito in una sotto routine alcune parti comuni. di seguito il succo delle mie vecchie ed aride meningi ;Disegno "dinamico" di una finestra nato da un idea By LIBER (http://www.cadlandia.com) ; (defun myerror (s) ; Definizione errori e salvataggio impostazioni By Claudio Piccini (if (/= s "Function cancelled") (princ (strcat "\nError: " s)) ) (ripVar) (princ) )
(defun salVar () (setq orto (getvar "orthomode")) (setq snapp (getvar "osmode")) (setq snm (getvar "snapmode")) (setq piano (getvar "clayer")) (setq raggio (getvar "filletrad")) (setq decim (getvar "luprec")) (setq bm (getvar "blipmode")) (setq nomeDir (getvar "dwgprefix")) )
(defun ripVar () (command "_redraw") (setvar "cmdecho" 1) (setvar "osmode" snapp) (setvar "snapmode" snm) (setvar "orthomode" orto) (setvar "clayer" piano) (setvar "blipmode" bm) (setvar "filletrad" raggio) (setvar "luprec" decim) (setvar "cecolor" "BYLAYER") (setq *error* olderr) (princ) ) ;______________________________________________________________________________ (defun QuoFi () (if (= gfix nil) (setq gfix 1)) (princ "\nQuotare finestra (S/N)? <") (if (= gfix 0) (princ "S")) (if (= gfix 1) (princ "N")) (princ ">") (setq gfiy (getstring)) (if (= (strcase gfiy) "S") (setq gfix 0)) (if (= (strcase gfiy) "N") (setq gfix 1)) (if (= gfix 0) (progn (command "_layer" "N" "QUOTE" "c" "2" "QUOTE" C:) (command "_layer" "_s" "QUOTE" C:) (setq gr (/ 180 PI)) (if(or(< (* gr angolo2) 95) (> (* gr angolo2) 310)) (progn (setq a (* gr angolo2)) (setq aa angolo2) (setq x 1)) (progn (setq a (* gr angolo3)) (setq aa angolo3) (setq x 0)) ) (setq m9 (polar secondo angolo midlarg)) (setq m10 (polar m9 angolo2 10)) ;Imposta la lunghezza esterna la muro della linea di quota (setq m11 (polar m3 angolo3 60)) ;Imposta la lunghezza interna la muro della linea di quota (command "_line" m10 m11 C:) ; (setq m12 (polar m11 angolo2 30)) ;m11 imposta come interna la quota della finestra cambiare con m9 per quote esterne (setq m13 (polar m12 (+ aa (/ 90 gr)) 12.5)) (setq m14 (polar m12 (+ aa (/ 270 gr)) 12.5)) (if (= ghf nil) (setq ghf 160)) (princ "\nAltezza finestra: <") (princ ghf) (princ ">") (setq hf (getint)) (if (= hf nil) (setq hf ghf)) (setq ghf hf) (setvar "luprec" 0) (setq lf (* larghezza 1)) (setq lx (strcat (rtos lf))) (setq t1 lx) (setq t2 hf) (command "_text" "m" m13 "15" a t1) (command "_text" "m" m14 "15" a t2) ) ) ) ;______________________________________________________________________________ (defun DavEs () ;Disegna Davanzale Esterno (setq m100 (polar secondo angolo1 5)) ;definisce primo punto davanzale esterno a sx di secondo (setq m101 (polar quarto angolo 5)) ;definisce ultimo punto davanzale esterno a dx di quarto (setq m102 (polar m100 angolo2 5)) ;definisce secondo punto davanzale esterno a sx di secondo (setq m103 (polar m101 angolo2 5)) ;definisce terzo punto davanzale a esterno dx di quarto (command "_line" m100 m102 m103 m101 C:));disegna il davanzale esterno ;______________________________________________________________________________ (defun DavIn () ;Disegna Davanzale Interno (setq m110 (polar primo angolo1 2.5)) ;definisce primo punto davanzale interno a sx di secondo (setq m111 (polar terzo angolo 2.5)) ;definisce ultimo punto davanzale interno a dx di quarto (setq m112 (polar m110 angolo3 5)) ;definisce secondo punto davanzale interno a sx di secondo (setq m113 (polar m111 angolo3 5)) ;definisce terzo punto davanzale a interno dx di quarto (command "_line" m110 m112 m113 m111 C:));disegna il davanzale interno ;______________________________________________________________________________ (defun Avvol () ;Disegna (setq spessore (distance primo secondo)) ;imposta spessore muro come "spessore" (setq terspes (/ spessore 3)) ;imposta terspes 1/3 "spessore" (setq m120 (polar m1 angolo2 terspes)) ;Definisce 1° p.to Avvolgibile (setq m121 (polar m2 angolo2 terspes)) ;Definisce 2° p.to Avvolgibile (command "-color" "3" C:) ;Imposta Colore Verde (command "_line" m120 m121 C:) ;Disegna Avvolgibile (command "-color" "256" C:)) ;Imposta Colore da Layer ;______________________________________________________________________________ ;Disegno "dinamico" di una finestra nato da un idea By LIBER (http://www.cadlandia.com) ;parte con fin3 (defun C:fin3 (/ larghezza zero primo secondo terzo quarto m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12 m13 m14 m15 m16 m17 m18 m19 m20 m21 m22 m23 m24 m25 m26 m27 m28 a angolo angolo1 piano angolo2 angolo3 gr midlarg terlarg qualarg x lf lx t1 t2 hf a aa) (PROMPT "\nFinestre\n") (setq olderr *error* *error* myerror) ;Salvataggio impostazioni in caso di errore (setvar "cmdecho" 0) ; (salVar) ; (setvar "OSMODE" 33) ;Imposta Osnap Fine;Intersezione - Endpoint;Intersection (setq zero (getpoint "\nPunto di riferimento: ")) ;Individua Punto di riferimento per la distanza dal punto di inserimento della Finestra (command "_osnap" "_nearest") ;Imposta Osnap vicino (setq primo (getpoint zero "\nPunto di Inserimento interno: ")) (setvar "OSMODE" 128) (setq secondo (getpoint primo "\nLarghezza del muro: ")) (command "_osnap" "_nearest") (setq terzo (getpoint primo "\nLarghezza della finestra: ")) (setvar "OSMODE" 0) (setq larghezza (distance primo terzo)) (progn (setq angolo (angle primo terzo)) (setq quarto (polar secondo angolo larghezza)) (command "_break" primo terzo C:) (command "_break" secondo quarto C:) (command "_layer" "N" "MURI" "c" "3" "Muri" C:) (command "_layer" "_s" "MURI" C:) (command "-color" "256" C:) ;Imposta Colore da Layer (command "_line" primo secondo C:) (command "_line" terzo quarto C:) (command "-color" "7" C:) ;Imposta Colore Bianco (command "_line" primo terzo C:) (command "_line" quarto secondo C:) (command "_layer" "N" "INFISSI" "c" "2" "INFISSI" C:) (command "_layer" "_s" "INFISSI" C:) (command "-color" "256" C:) ;Imposta Colore da Layer (setq midlarg (/ larghezza 2)) (setq terlarg (/ larghezza 3)) (setq qualarg (/ larghezza 4)) (setq angolo1 (angle terzo primo)) (setq angolo2 (angle primo secondo)) (setq angolo3 (angle secondo primo)) (setq m1 (polar primo angolo2 5)) (setq m2 (polar terzo angolo2 5)) (command "_line" m1 m2 C:) (setq m4 (polar primo angolo 5)) (setq m5 (polar m4 angolo2 5)) (setq m8 (polar terzo angolo1 5)) (command "_line" m4 m5 C:) (command "_copy" "_L" "" m4 m8 C:) (setq m3 (polar primo angolo midlarg)) (if (> larghezza 70) (cond (if (and (> larghezza 70) (< larghezza 120)) ;70 definisce la larghezza minima per una finestra a due volate (progn (setq m6 (polar m3 angolo1 5)) (setq m7 (polar m3 angolo 5)) (command "_copy" "_P" "" "M" m4 m3 m6 m7 C:)) (if (and (> larghezza 120) (<= larghezza 150)) ;120 definisce la larghezza minima per una finestra a tre volate (progn (command "_erase" "_L" "") (command "_erase" "_L" "") (command "_erase" "_L" "") (setq m15 (polar primo angolo terlarg)) (setq m16 (polar m15 angolo2 5)) (setq m17 (polar m15 angolo1 5)) (setq m18 (polar m15 angolo 5)) (setq m19 (polar terzo angolo1 terlarg)) (setq m20 (polar m19 angolo1 5)) (setq m21 (polar m19 angolo 5)) (command "_line" m15 m16 C:) (command "_copy" "_L" "" "M" m15 m17 m18 m19 m20 m21 C:)) (if (> larghezza 150) ;150 definisce la larghezza minima per una finestra a tre volate (progn (command "_erase" "_L" "") (command "_erase" "_L" "") (command "_erase" "_L" "") (setq m22 (polar primo angolo qualarg)) (setq m23 (polar m22 angolo2 5)) (setq m24 (polar m22 angolo1 5)) (setq m25 (polar m22 angolo 5)) (setq m26 (polar terzo angolo1 qualarg)) (setq m27 (polar m26 angolo1 5)) (setq m28 (polar m26 angolo 5)) (command "_line" m22 m23 C:) (command "_copy" "_L" "" "M" m22 m24 m25 m3 m6 m7 m26 m27 m28 C:)))) ) ;fine If ) ;fine Cond ) ;fine if ) ;fine Progn (DavEs) (DavIn) (Avvol) (QuoFi) (ripVar) (princ) ) ;;;eof
come si può constatare gran poca farina del mio sacco ma un gran lavoro per i sig.ri Copia e Incolla.
ora però mi sono intestardito riuscire ad inserire la finestra partendo dall'asse e dare da tastiera la larghezza ovvero mi piacerebbe quando arrivo al rigo 123
(setq terzo (getpoint primo "\nLarghezza della finestra: ")) (setvar "OSMODE" 0) (setq larghezza (distance primo terzo))
inserire oltre che da video (trascinando il puntatore e poi cliccare) o da distanza (es. @90<90) poter dare "i numeri" da tastiera (es. 90) ma non so come combinare i comandi getpoint e getdist in modo che la variabile "larghezza" mi dia sempre lo stesso risultato.
spero che non pensiate che il tutto sia dovuto a pura pazzia ciò a mio parere mi semplificherebbe la stesura di rilievi di case vecchie dove le aperture a volte dal lato interno hanno delle svasature come la finestra che si disegna con il comando "fin1" della lisp di Liber ma non sempre così perfette ed eguali e l'unico modo per posizionarle correttamente rimane l'asse dopo aver preso anche le misure sull'altro lato.
vista l'ora auguro buona cena a tutti
|
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 30 dicembre 2010 : 20:09:22
|
Intanto potresti eliminare un bel po' di if e sostituirli tutti con la funzione cond, più versatile:
(cond
((< (distance primo terzo) 0.90) ;0.90 definisce la larghezza minima per una finestra a una volata
nil
)
((and (>= (distance primo terzo) 0.90)
(< (distance primo terzo) 1.20)
) ;0.90 definisce la larghezza minima per una finestra a due volate
...
)
((and (>= (distance primo terzo) 1.20)
(< (distance primo terzo) 1.50)
) ;1.20 definisce la larghezza minima per una finestra a tre volate
...
)
((>= (distance primo terzo) 1.50) ;1.50 definisce la larghezza minima per una finestra a tre volate
...
)
)
La prima condizione viene soddisfatta quando la finestra è < di 0.90 e quindi non costruisce volate supplementari. |
 |
|
zenobio
Utente Medio
Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento
33 Messaggi |
Inserito il - 31 dicembre 2010 : 09:35:41
|
grazie a Terminator, che dal Collio mi da una buona indicazione, ora provo, non piacevano neanche a me gli if in sequenza. quando ho letto che sei di Gradisca mi son tornati alla mente ricordi di un'altra vita quando portavo lì il vino che facevo, per la gara, invece di tirare righe.... al pc, che avevate capito.

|
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 31 dicembre 2010 : 13:11:55
|
Per evitare tanti (command "_ERASE" "_L" ""), potresti cambiare le linee in polilinee, così:
Invece di:
(command "_line" m105 m107 m108 m106 "")
(command "_line" m109 m111 m112 m110 "") scrivere:
(command "_pline" m105 m107 m108 m106 "")
(command "_pline" m109 m111 m112 m110 "")
Dato che quello che cancellavi erano spezzoni di linea, in questo modo, usando un solo (command "_ERASE" "_L" ""), viene cancellata un'entità unica, la polilinea. In ogni caso disegnare un'entità per dopo cancellarla non mi sembra il massimo. Meglio disegnarla con le condizioni del post precedente. (se la finestra è < 1.50 allora disegna il davanzale, altrimenti no)
Un'altra cosa: Probabilmente ti arrivava un messaggio che un layer era già esistente. Si potrebbe scrivere una cosa di questo tipo:
(if (tblsearch "LAYER" "INFISSI")
(command "_layer" "_SET" "INFISSI" "")
(command "_layer" "_MAKE" "INFISSI" "_CO" "2" "INFISSI" "")
)
In questo modo, se il layer esiste, viene reso corrente, altrimenti viene creato e reso corrente. Notare la differenza fra i sottocomandi del comando -layer: def o _make crea un layer e lo rende corrente nuovo o _new crea un layer ma non lo rende corrente
Per quanto riguarda l'inserimento da tastiera della larghezza finestra io procederei così:
(defun C:fin3 (/ larghezza zero primo secondo terzo quarto m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12 m13 m14 m15 m16 m17 m18 m19 m20 m21 m22 m23 m24 m25 m26 m27 m28 a angolo angolo1 piano angolo2 angolo3 gr midlarg terlarg qualarg x lf lx t1 t2 hf a aa)
(PROMPT "\nFinestre\n")
(setq olderr *error* *error* myerror) ;Salvataggio impostazioni in caso di errore
(setvar "cmdecho" 0) ;
(salVar) ;
(setvar "OSMODE" 33) ;Imposta Osnap Fine;Intersezione - Endpoint;Intersection
(setq zero (getpoint "\nPunto di riferimento: ")) ;Individua Punto di riferimento per la distanza dal punto di inserimento della Finestra
(command "_osnap" "_nearest") ;Imposta Osnap vicino
(setq primo (getpoint zero "\nPunto di Inserimento interno: "))
(setvar "OSMODE" 128)
(setq secondo (getpoint primo "\nLarghezza del muro: "))
(setvar "OSMODE" 0)
(setq larghezza (getdist primo "\nLarghezza della finestra: "))
;;;(setq larghezza (distance primo terzo)) RIGA ELIMINATA
(progn
(setq terzo (polar primo (angle zero primo) larghezza))
(setq quarto (polar secondo (angle zero primo) larghezza)) In questo modo puoi inserire la larghezza anche da tastiera e graficamente anche senza rispettare l'angolo di costruzione |
Modificato da - Terminator in data 01 gennaio 2011 04:01:25 |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 01 gennaio 2011 : 19:46:26
|
Un primo tentativo di ottimizzazione potrebbe essere così: NB: ho lavorato sul primo file
(defun C:fin3 (/ zero primo secondo terzo quarto m1 m2 m3 m4 m5 m6 m7 m8 m9
m10 m11 m12 m13 m14 m15 m16 m17 m18 m19 m20 m21 m22 m23 m24 m25 m26
m27 m28 a piano gr x lf lx t1 t2 hf a aa
)
(prompt "\nFinestre\n")
(setq piano (getvar "CLAYER"))
(setvar "OSMODE" 33) ;Imposta Osnap Fine;Intersezione - Endpoint;Intersection
(setq zero (getpoint "\nPunto di riferimento: "))
;Individua Punto di riferimento per la distanza dal punto di inserimento della Finestra
(setvar "OSMODE" 512) ;Imposta Osnap vicino
(setq primo (getpoint zero "\nPunto di Inserimento interno: "))
(setvar "OSMODE" 128)
(setq secondo (getpoint primo "\nLarghezza del muro: "))
(setvar "OSMODE" 0)
(setq larghezza (getdist primo "\nLarghezza della finestra: ")
terzo (polar primo (angle zero primo) larghezza)
quarto (polar secondo (angle zero primo) larghezza)
)
(command "_BREAK" primo terzo "_BREAK" secondo quarto)
(if (tblsearch "LAYER" "MURI")
(command "_LAYER" "_SET" "MURI" "")
(command "_LAYER" "_MAKE" "MURI" "_CO" "3" "MURI" "")
)
(command "_COLOR" "_BYLAYER") ;Imposta Colore da Layer
(command "_LINE" primo secondo "" "_LINE" terzo quarto "")
;;;(command "_COLOR" "7") ;Imposta Colore Bianco
(command "_LINE" primo terzo "" "_LINE" quarto secondo "")
(if (tblsearch "LAYER" "INFISSI")
(command "_LAYER" "_SET" "INFISSI" "")
(command "_LAYER" "_MAKE" "INFISSI" "_CO" "2" "INFISSI" "")
)
(if (not (tblsearch "LAYER" "QUOTE"))
(command "_LAYER" "_NEW" "QUOTE" "_CO" "2" "QUOTE" "")
)
(setq m1 (polar primo (angle primo secondo) 0.05)
m2 (polar terzo (angle primo secondo) 0.05)
)
(command "_LINE" m1 m2 "")
(setq m4 (polar primo (angle primo terzo) 0.05)
m5 (polar m4 (angle primo secondo) 0.05)
m8 (polar terzo (angle terzo primo) 0.05)
)
(command "_LINE" m4 m5 "")
(command "_COPY" "_L" "" m4 m8)
(setq m101 (polar secondo (angle terzo primo) 0) ;definisce primo punto davanzale esterno a sx di secondo
m102 (polar quarto (angle primo terzo) 0) ;definisce ultimo punto davanzale esterno a dx di quarto
m103 (polar m101 (angle primo secondo) 0.05) ;definisce secondo punto davanzale esterno a sx di secondo
m104 (polar m102 (angle primo secondo) 0.05) ;definisce terzo punto davanzale a esterno dx di quarto
m105 (polar secondo
(angle terzo primo)
(/ (distance primo terzo) 2)
) ;definisce primo punto persiana a sx di secondo
m106 (polar quarto
(angle primo terzo)
(/ (distance primo terzo) 2)
) ;definisce ultimo punto persiana a dx di quarto
m107 (polar m105 (angle primo secondo) 0.05) ;definisce secondo punto persiana esterno a sx di secondo
m108 (polar m106 (angle primo secondo) 0.05) ;definisce terzo punto persiana esterno a dx di quarto
)
(command "_PLINE" m105 m107 m108 m106 "") ;disegna la persiana ed il davanzale esterno
(command "_LINE" m101 m103 "" "_LINE" m102 m104 "") ;completa il davanzale esterno
(setq m109 (polar primo (angle terzo primo) 0.025) ;definisce primo punto davanzale interno a sx di secondo
m110 (polar terzo (angle primo terzo) 0.025) ;definisce ultimo punto davanzale interno a dx di quarto
m111 (polar m109 (angle secondo primo) 0.05) ;definisce secondo punto davanzale interno a sx di secondo
m112 (polar m110 (angle secondo primo) 0.05) ;definisce terzo punto davanzale a interno dx di quarto
)
(setq m3 (polar primo
(angle primo terzo)
(/ (distance primo terzo) 2)
)
)
(cond
((< (distance primo terzo) 0.90)
;;;0.90 definisce la larghezza massima per una finestra a una volata
(command "_PLINE" m109 m111 m112 m110 "") ;disegna il davanzale interno
)
((and (>= (distance primo terzo) 0.90)
;;;0.90 definisce la larghezza minima per una finestra a due volate
(< (distance primo terzo) 1.20)
)
(setq m6 (polar m3 (angle terzo primo) 0.05)
m7 (polar m3 (angle primo terzo) 0.05)
)
(command "_PLINE" m109 m111 m112 m110 "")
(command "_COPY" "_P" "" "M" m4 m3 m6 m7 "")
)
((and (>= (distance primo terzo) 1.20)
;;;1.20 definisce la larghezza minima per una finestra a tre volate
(< (distance primo terzo) 1.50)
)
(setq m15 (polar primo
(angle primo terzo)
(/ (distance primo terzo) 3)
)
m16 (polar m15 (angle primo secondo) 0.05)
m17 (polar m15 (angle terzo primo) 0.05)
m18 (polar m15 (angle primo terzo) 0.05)
m19 (polar terzo
(angle terzo primo)
(/ (distance primo terzo) 3)
)
m20 (polar m19 (angle terzo primo) 0.05)
m21 (polar m19 (angle primo terzo) 0.05)
)
(command "_LINE" m15 m16 "")
(command "_COPY" "_L" "" "M" m15 m17 m18 m19 m20 m21 "")
)
((>= (distance primo terzo) 1.50)
;;;1.50 definisce la larghezza minima per una finestra a quattro volate
(setq m22 (polar primo
(angle primo terzo)
(/ (distance primo terzo) 4)
)
m23 (polar m22 (angle primo secondo) 0.05)
m24 (polar m22 (angle terzo primo) 0.05)
m25 (polar m22 (angle primo terzo) 0.05)
m26 (polar terzo
(angle terzo primo)
(/ (distance primo terzo) 4)
)
m27 (polar m26 (angle terzo primo) 0.05)
m28 (polar m26 (angle primo terzo) 0.05)
)
(command "_LINE" m22 m23 "")
(command "_COPY" "_L" "" "M" m22 m24 m25 m3 m6 m7 m26 m27 m28)
)
)
(initget "S N")
(setq gfix (strcase (getkword "\nQuotare finestra (S/N)? : ")))
(cond
((= gfix "S")
(command "_LAYER" "_SET" "QUOTE" "")
(setq gr (/ 180 PI))
(if (or (< (* gr (angle primo secondo)) 95)
(> (* gr (angle primo secondo)) 310)
)
(progn
(setq a (* gr (angle primo secondo)))
(setq aa (angle primo secondo))
(setq x 1)
)
(progn
(setq a (* gr (angle secondo primo)))
(setq aa (angle secondo primo))
(setq x 0)
)
)
(setq m9 (polar secondo
(angle primo terzo)
(/ (distance primo terzo) 2)
)
)
(setq m10 (polar m9 (angle primo secondo) 0.6))
(setq m11 (polar m3 (angle secondo primo) 0.1))
(command "_PLINE" m10 m11 "")
(setq m12 (polar m9 (angle primo secondo) 0.3))
(setq m13 (polar m12 (+ aa (/ 90 gr)) 0.125))
(setq m14 (polar m12 (+ aa (/ 270 gr)) 0.125))
(if (= ghf nil)
(setq ghf 160)
)
(princ "\nAltezza finestra: <")
(princ ghf)
(princ ">")
(setq hf (getint))
(if (= hf nil)
(setq hf ghf)
)
(setq ghf hf)
(setvar "LUPREC" 0)
(setq lf (* (distance primo terzo) 100))
(setq lx (strcat (rtos lf)))
(setq t1 lx)
(setq t2 hf)
(command "_TEXT" "M" m13 "0.15" a t1)
(command "_TEXT" "M" m14 "0.15" a t2)
)
((= gfix "N")
(princ)
)
)
(command "_LAYER" "_SET" "0" "")
(setvar "LUPREC" 2)
(princ)
) |
 |
|
zenobio
Utente Medio
Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento
33 Messaggi |
Inserito il - 03 gennaio 2011 : 18:30:06
|
grazie Terminator per i tuoi consigli mi sono veramente utili per fare le modifiche che ho in mente e grazie anche per avermi fatto capire come rendere + leggibile la lisp. vorrei però spiegare che la mia reticenza ad usare PLINE e di conseguenza dover mettere tanti troppi ERASE è dovuta al fatto che spesso i rilievi sono poi destinati ad essere usati nel DOCFA che per le polilinee sopratutto aperte ha una certa antipatia.
quando avrò finito di modificare il tutto posterò il risultato.
visto le date dei tuoi post spero di non averti rovinato ben 2 anni in un colpo solo con la mia ignoranza
A TE E A TUTTI L'AUGURIO DI BUON PROSEGUIMENTO |
Modificato da - zenobio in data 03 gennaio 2011 18:38:00 |
 |
|
zenobio
Utente Medio
Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento
33 Messaggi |
Inserito il - 06 gennaio 2011 : 11:57:40
|
vi ringrazio tutti molto ed in particolare Teminator per i consigli e la partecipazione, sono quasi riuscito nel mio intento mi servirebbe però un ulteriore aiuto. nel mio "parto" alla riga 53 ho inserito un "erase" che mi cancella la linea di costruzione dell'asse della finestra purtroppo ho notato nelle prove fatte che se questa non c'è mi cancella il muro interno qualcuno sa indicarmi una routine per cancellare una linea "se esiste" passante per due punti P1 e P2
Immagine inserita:
 10,82 KB
Scarica allegato:
fin4.zip 2,41 KB
P.S.: premetto che prima di postare le mie richieste faccio sempre delle ricerche per vedere se trovo qualcosa che faccia al mio caso o che riesco a capire e modificare.  |
Modificato da - zenobio in data 06 gennaio 2011 12:03:43 |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 06 gennaio 2011 : 12:48:20
|
Senza fare prove ulteriori al momento, direi che, una volta disegnata la linea di costruzione, potresti memorizzarla:
(setq lineacostr (entlast))
Successivamente:
(if lineacostr (command "_ERASE" lineacostr "") )
|
 |
|
zenobio
Utente Medio
Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento
33 Messaggi |
Inserito il - 08 gennaio 2011 : 13:11:44
|
Buon giorno a tutti sto procedendo con la mia lisp ma nell'ampliarla e nel fare le prove mi succede una cosa strana che non so a cosa imputare ovvero sembra che tra il disegno di una finestra e l'altra rimangano in memoria dei punti della prima finestra disegnata che vengono uniti da linee con la nuova finestra da cosa può dipendere. ho controllato se nei "setq" ci sono dei punti con lo stesso identificativo e non ne ho trovati. sembra proprio che alla fine del disegno non vengano cancellati dalla memoria. |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 08 gennaio 2011 : 15:26:44
|
Posta, se possibile, l'ultima versione del lisp che hai elaborato. |
 |
|
zenobio
Utente Medio
Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento
33 Messaggi |
Inserito il - 08 gennaio 2011 : 17:45:02
|
certo eccola
Scarica allegato:
Finestre.zip 4,75 KB
forse il problema è che l'ho suddivisa in più sub routine ma l'ho fatto perchè diversamente diventava lunghissima e non ho ancora inserito tutte le varianti che ho in mente
Immagine inserita:
 18,77 KB
le linee in rosso sono quelle in più
|
Modificato da - zenobio in data 08 gennaio 2011 17:50:54 |
 |
|
zenobio
Utente Medio
Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento
33 Messaggi |
Inserito il - 08 gennaio 2011 : 17:59:30
|
Forse ho risolto indicando le variabili dopo
(defun c:mionome (/ var 1 var2 ....) .... )
prima era
(defun c:mionome () .... )
può essere quello ?? e se si riferito alla versione del post precedente mi conviene inserirle direttamente nelle sub routine o nel comando principale ?
|
Modificato da - zenobio in data 08 gennaio 2011 18:11:27 |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 08 gennaio 2011 : 18:38:18
|
Mi era sfuggito che non le avevi inserite come variabili locali, comunque è giusto come hai scritto e inseriscile nel comando principale |
 |
|
zenobio
Utente Medio
Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento
33 Messaggi |
Inserito il - 11 gennaio 2011 : 13:49:41
|
ad oggi il sudore della mi fronte mi hanno portato a quanto sotto ora mi sorge però un nuovo problema la finestra di dialogo del cad mi mostra le slide troppo piccole non avendo mai provato a compilare file dcl e non trovando esempi con finestre di dialogo come quella automatica del cad
Immagine inserita:
 38,45 KB
chiedo se qualcuno mi sa indicare una lisp con dcl di tale formato in modo che possa copiarla e modificarla
Scarica allegato:
Finestre.zip 56,8 KB
P.S.: per quanto riguarda la risposta di Terminator del 6 gennaio penso che non sia una strada percorribile visto che di solito le lineee dell'asse delle finestre le disegno tutte prima di inserire le finestre |
Modificato da - zenobio in data 11 gennaio 2011 14:03:06 |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 11 gennaio 2011 : 16:24:28
|
Lo zip da errore. |
 |
|
zenobio
Utente Medio
Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento
33 Messaggi |
Inserito il - 11 gennaio 2011 : 17:59:11
|
lo ricarico
Scarica allegato:
Finestre1.zip 56,84 KB
ho provato non funziona neanche questo dopo riscaricato che problema può essere??
Scarica allegato:
Finestre1.rar 56,77 KB
Il rar sembra funzionare |
Modificato da - zenobio in data 11 gennaio 2011 19:59:32 |
 |
|
Discussione  |
|