Newsgroup: it.comp.software.cad
Titolo: LISP modifica polilineee

Salve a tutti, sto cercando di scrivere un lisp che assegni a ogni polilinea 3D un nuovo layer che abbia il nome della quota della polilinea stessa; finora sono riuscita a creare il layer, ma la poly è rimasta dov'era! Il codice (sicuramente molto primitivo perchè non sono un'esperta) che sto usando è:
(defun c:cambialayerpoly (/ nomEnt elemento coord quota)
(setq nomEnt (car (entsel "Selezionare Polilinea:")))
(if nomEnt ;se è stato selezionato un oggetto procede
(progn
(setq elemento (entget nomEnt)) ;estrazione lista dell'entità
(if (= (cdr (assoc 0 elemento)) "POLYLINE")
(progn
(while (/= (cdr (assoc 0 elemento)) "SEQEND")
(princ elemento)
(setq nomEnt (entnext nomEnt))
(setq elemento (entget nomEnt))
(setq coord (cdr (assoc 10 elemento)))
(setq quota (caddr coord))
(setq elemento 
(subst (cons 8 (rtos quota)) (assoc 8 elemento) elemento)) ;cambia il gruppo layer  nel layer nuovo
(entmod elemento) ;modifica il layer nel disegno
(entupd elemento)
) ;endw
(princ elemento) ;stampa SEQEND
(princ "\n\nFINE Definizione oggetto selezionato\n")
) ;endp
(progn ;else
(alert "L'elemento indicato non è una polilinea 3D!")
) ;endp
) ;endif
) ;endp
(progn
(alert "Non è stato selezionato alcun oggetto!")
) ;endp
) ;endif
) ;enddef
l'errore è: numerp:nil
oppure, se metto (< (cdr (assoc 0 elemento)) "SEQEND") mi dà: bad error lentitype: (-1 ecc..
grazie per l'aiuto
saluti
-- 
Ughetta 
------------------------------------------------------------------------
View this thread: 
http://www.itsistemi.net/viewtopic-778685.html
Inviato via 
http://www.itsistemi.net

 stessa
Il problema più grosso era dovuto al fatto che non si può assegnare un layer
ad un vertice della polilinea, con questa modifica il layer assegnato alla
polilinea sarà uguale alla quota Z del primo vertice trovato.
(defun C:CambiaLayerPoly (/ EntNam EntDat nomEnt elemento coord quota)
  (if (setq EntNam (car (entsel "\nSelezionare Polilinea:  ")))
    (if (= (cdr (assoc 0 (setq EntDat (entget EntNam)))) "POLYLINE")
      (progn
        (setq
          nomEnt   (entnext EntNam)
          elemento (entget nomEnt)
          coord    (cdr (assoc 10 elemento))
          quota    (strcat "Quota_" (rtos (caddr coord) 2 1));nome con un 
decimale
        ; quota    (strcat "Quota_" (rtos (caddr coord) 2 2));nome con due 
decimali
        )
        (command "_.LAYER" "_MAKE" quota "");qui potresti assegnare il 
colore
                                            ;al layer un base alla sua quota 
Z
        (setq EntDat (subst (cons 8 quota) (assoc 8 EntDat) EntDat))
        (or (entmod EntDat) (alert "La polilinea non è stata modificata!"))
        (entupd EntNam)
        (princ "\n") (princ EntDat)
        (princ "\nFINE Definizione oggetto selezionato.\n")
      )
      (alert "L'elemento indicato non è una polilinea 3D!")
    )
    (alert "Non è stato selezionato alcun oggetto!")
  )
  (princ)
)
-- 
----------------------------------------------------------
Marc'Antonio Alessi - 
http://xoomer.virgilio.it/alessi
Per AutoCAD:
- Travi 2D: disegno automatico travi e pilastri in C.A.,
  relativi ferri e staffe, report peso ferri e C.A.
  su Excel
- Calcolo automatico aree su planimetrie: report su Excel
  per locale altezza, piano con descrizioni locali e piani
- Elaborazione dati from/to Excel
- Librerie manufatti in assonometria
- Autolayers: gestione automatica dei layers
- Elaborazioni e stampe multiple e automatiche
- Parametrico 2D, Viterie 2D/3D, Esplosi 2D/3D
- AutoGroups: gestione automatica gruppi di layers
- SetUp del disegno con gestione automatica DimStyles
- Conversione automatica files Inventor a DWG e viceversa
  anche senza avere Inventor installato
- ...
----------------------------------------------------------

non va :-( 

 non va :-(
Premetto che non l'ho provato, ma hai fatto attenzione alle righe che sono 
andate a capo automaticamente?
-- 
Ste. 
http://www.feonast.tk
__________________________________ 
Usa l'indirizzo Reply-to e avvisa

> non va :-( 
Bene, a me funziona, come pensi che ti possa aiutare con una
risposta simile?
P.S.: ti faccio notare che la domanda riguardava le polilinee 3D.

quando lo carico da errore...
cmq non fa niente
saluti 

Copia questo, l'ho provato e sembra funzionare.
Devi stare attento perche' i newsreader spezzano le righe. Ora dovrebbe
andare bene.



Grazie

Grazie a tutti!
Purtroppo mi sono potuta riconnettere solo oggi.. :-(
ora proverò tutti i vostri consigli, nel frattempo ho risolto il problema in modo forse un po' più artigianale e non completamente automatico.. ma ha funzionato ;-)
(defun c:cambialayerpoly (/ poly en ed e1 quota)
(setq gruppo (ssget "P")) 
(if gruppo ;se è stato selezionato un oggetto procede
(progn
(setq poly (1-(sslength gruppo))) ;estrazione numero elementi dell'entità
(while (> poly -1)
(setq en (ssname gruppo poly)) ;ottengo il nome entità
(setq ed (entget en)) ;imposta per ed i dati dell'entità per il nome di entità en
(setq e1 (entnext en))
(setq proped (entget e1))
 (listp proped)
(cdr (assoc 10 proped))
(setq quota (caddr (cdr (assoc 10 proped))))
(setq ed 
(subst (cons 8 (rtos quota))
(assoc 8 ed) ;cambia il gruppo layer in ed nel layer nuovo
ed)
)
(entmod ed) ;modifica il layer en nel disegno
(princ "\n\nFINE Definizione oggetto selezionato\n")
(setq poly (1- poly))
) ;endw
(progn ;else
(alert "L'elemento indicato non è una polilinea 3D!")
) ;endp
) ;endif
) ;endp
(progn
(alert "Non è stato selezionato alcun oggetto!")
) ;endp
) ;endif
 ;enddef
Naturalmente prima accendo solo i layer con le curve di livello, poi le seleziono tutte, poi lancio il lisp!
grazie mille ancora a tuttti !
