TuttoCAD Forum

TuttoCAD Forum
[ Home | Registrati | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Album Fotografico | Download | | Cerca | FAQ ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 1 - TuttoCAD Software
 AutoLISP
 porte e finestre 2d
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Pagina Successiva
Autore Discussione Precedente Discussione Discussione Successiva
Pagina: di 2

liber
Utente Master



1278 Messaggi

Inserito il - 30 maggio 2006 : 07:17:42  Mostra Profilo Invia a liber un Messaggio Privato  Rispondi Quotando
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  Mostra Profilo Invia a zenobio un Messaggio Privato  Rispondi Quotando
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



Torna all'inizio della Pagina

liber
Utente Master



1278 Messaggi

Inserito il - 29 dicembre 2010 : 12:44:37  Mostra Profilo Invia a liber un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

zenobio
Utente Medio


Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento


33 Messaggi

Inserito il - 29 dicembre 2010 : 13:08:15  Mostra Profilo Invia a zenobio un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

Roberto07
Utente Master



Regione: Lazio
Prov.: Roma
Città: Sabina Italia


1042 Messaggi

Inserito il - 29 dicembre 2010 : 15:48:10  Mostra Profilo Invia a Roberto07 un Messaggio Privato  Rispondi Quotando
GP va bene. Ma terminator dove lo lasciamo?!

Da quando bazzico in questo forum i lisp di Terminator li trovo eccelsi.....
Torna all'inizio della Pagina

zenobio
Utente Medio


Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento


33 Messaggi

Inserito il - 30 dicembre 2010 : 19:29:35  Mostra Profilo Invia a zenobio un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 30 dicembre 2010 : 20:09:22  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

zenobio
Utente Medio


Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento


33 Messaggi

Inserito il - 31 dicembre 2010 : 09:35:41  Mostra Profilo Invia a zenobio un Messaggio Privato  Rispondi Quotando
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.


Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 31 dicembre 2010 : 13:11:55  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 01 gennaio 2011 : 19:46:26  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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)
)
Torna all'inizio della Pagina

zenobio
Utente Medio


Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento


33 Messaggi

Inserito il - 03 gennaio 2011 : 18:30:06  Mostra Profilo Invia a zenobio un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

zenobio
Utente Medio


Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento


33 Messaggi

Inserito il - 06 gennaio 2011 : 11:57:40  Mostra Profilo Invia a zenobio un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 06 gennaio 2011 : 12:48:20  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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 "")
)

Torna all'inizio della Pagina

zenobio
Utente Medio


Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento


33 Messaggi

Inserito il - 08 gennaio 2011 : 13:11:44  Mostra Profilo Invia a zenobio un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 08 gennaio 2011 : 15:26:44  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Posta, se possibile, l'ultima versione del lisp che hai elaborato.
Torna all'inizio della Pagina

zenobio
Utente Medio


Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento


33 Messaggi

Inserito il - 08 gennaio 2011 : 17:45:02  Mostra Profilo Invia a zenobio un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

zenobio
Utente Medio


Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento


33 Messaggi

Inserito il - 08 gennaio 2011 : 17:59:30  Mostra Profilo Invia a zenobio un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 08 gennaio 2011 : 18:38:18  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Mi era sfuggito che non le avevi inserite come variabili locali, comunque è giusto come hai scritto e inseriscile nel comando principale
Torna all'inizio della Pagina

zenobio
Utente Medio


Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento


33 Messaggi

Inserito il - 11 gennaio 2011 : 13:49:41  Mostra Profilo Invia a zenobio un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 11 gennaio 2011 : 16:24:28  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Lo zip da errore.
Torna all'inizio della Pagina

zenobio
Utente Medio


Regione: Veneto
Prov.: Venezia
Città: san michele al tagliamento


33 Messaggi

Inserito il - 11 gennaio 2011 : 17:59:11  Mostra Profilo Invia a zenobio un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina
Pagina: di 2 Discussione Precedente Discussione Discussione Successiva  
Pagina Successiva
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 0,7 secondi.