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
 Funzione lista dati polilinea
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Autore Discussione Precedente Discussione Discussione Successiva  

Terminator
Utente Master



725 Messaggi

Inserito il - 26 novembre 2010 : 12:52:47  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Normalmente da una polilinea bisogna estrapolare i suoi vertici e la curvatura ad ogni vertice. Questi dati sono sempre annidati e ogni volta bisogna usare le solite funzioni di ricerca car, cadr, nth, ecc...
A questo scopo ho creato una nuova funzione che mi restituisce una lista dati sintetica della polilinea, contenente solo le coordinate dei vertici e la curvatura ad ogni vertice, che poi, fra l'altro, sono i dati più usati. L'ultimo codice 42 viene inserito solo se la polilinea è chiusa e l'ultimo elemento è la direzione di estrusione che mi aiuta a capire in quale UCS è stata creata la polilinea. Le coordinate dei punti sono infatti quelli dell'UCS di costruzione della polilinea.

Sintassi:
(listpoly entità_polilinea)
Argomento:
entità_polilinea - una polilinea selezionata

(defun listpoly	(poly / index lispoly lispoly2 ultimo)
 (setq lispoly (member (assoc 10 (entget poly)) (entget poly))
       lispoly (vl-remove (assoc 40 lispoly) lispoly)
       lispoly (vl-remove (assoc 41 lispoly) lispoly)
 )

 (if (assoc 91 lispoly)
  (setq lispoly (vl-remove (assoc 91 lispoly) lispoly))
 )

 (setq index 0)
 (repeat (cdr (assoc 90 (entget poly)))
  (setq	lispoly2 (vl-remove (car (nth index lispoly)) (nth index lispoly))
	lispoly2 (consr (cdr (assoc 38 (entget poly))) lispoly2)
	lispoly	 (subst lispoly2 (nth index lispoly) lispoly)
  )
  (setq index (+ index 2))
 )

 (if (or (= (cdr (assoc 70 (entget poly))) 0)
	 (= (cdr (assoc 70 (entget poly))) 128)
     )
  (progn
   (setq ultimo (last lispoly))
   (setq lispoly (reverse (cons ultimo (cddr (reverse lispoly)))))
  )
  lispoly
 )

)


Come si è potuto notare c'è anche un'altra funzione, la funzione consr:

Sintassi:
(consr elemento lista)

argomenti:
elemento - elemento da aggiungere alla lista
lista - una lista...

(defun consr (elemento lista)
 (reverse(cons elemento (reverse lista)))
)

la funzione cons mi inserisce l'elemento sempre all'inizio della lista e questo non mi serve quasi mai, dopo devo fare ulteriori manipolazioni per avere l'elemento alla fine.
La semplice funzione consr, invece, mi inserisce direttamente l'elemento alla fine senza bisogno di ulteriori modifiche.
Spero che il tutto possa tornare utile anche a qualcun altro e se c'è già qualche altra funzione che svolge questo compito fra le vlax-, vla, vl, vorrà dire che non me ne sono accorto!

Modificato da - Terminator in Data 26 novembre 2010 17:26:58

Terminator
Utente Master



725 Messaggi

Inserito il - 07 dicembre 2010 : 09:54:19  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Approfitto per inserire nella funzione anche il trattamento sulle polilinee 3D, ovviamente in questo caso manca il codice 42 e i punti sono restituiti sulle ccoordinate globali. In caso di entità diverse dalla polilinea e dalla polilinea 3D la funzione restituisce nil.

(defun listpoly	(poly / index lispoly lispoly2 ultimo vertex)
 (cond
  ((equal (cdr (assoc 0 (entget poly))) "LWPOLYLINE")
   (setq lispoly (member (assoc 10 (entget poly)) (entget poly))
	 lispoly (vl-remove (assoc 40 lispoly) lispoly)
	 lispoly (vl-remove (assoc 41 lispoly) lispoly)
   )
   (if (assoc 91 lispoly)
    (setq lispoly (vl-remove (assoc 91 lispoly) lispoly))
   )
   (setq index 0)
   (repeat (cdr (assoc 90 (entget poly)))
    (setq lispoly2 (vl-remove (car (nth index lispoly)) (nth index lispoly))
          ;;;lispoly2 (nth index lispoly)
	  lispoly2 (consr (cdr (assoc 38 (entget poly))) lispoly2)
	  lispoly  (subst lispoly2 (nth index lispoly) lispoly)
    )
    (setq index (+ index 2))
   )
   (if (or (= (cdr (assoc 70 (entget poly))) 0)
	   (= (cdr (assoc 70 (entget poly))) 128)
       )
    (progn
     (setq ultimo (last lispoly))
     (setq lispoly (reverse (cons ultimo (cddr (reverse lispoly)))))
    )
    lispoly
   )
  )
  ((equal (cdr (assoc 0 (entget poly))) "POLYLINE")
   (setq lispoly '())
   (setq vertex (entnext poly))
   (while (/= (cdr (assoc 0 (entget vertex))) "SEQEND")
    (progn
     (setq lispoly (consr (cdr (assoc 10 (entget vertex))) lispoly)
	   vertex  (entnext vertex)
     )
    )
   )
   lispoly
  )
  (T
   nil
  ) 
 )
)
Torna all'inizio della Pagina

TheGrey61
Utente Master


Regione: Piemonte
Prov.: Torino
Città: Rivalta di Torino


1039 Messaggi

Inserito il - 06 aprile 2011 : 08:21:10  Mostra Profilo Invia a TheGrey61 un Messaggio Privato  Rispondi Quotando
Salve volevo chiedervi se questa richiesta si può soddisfare con il lisp qui sopra descritto.
"Auto Number Cables: A tool that let me select cables and enter cable numbers at both end of the cable. It should have a prefix/suffix option, an increment value option, and direction option ( if I want to start from the top of the selection and go down, or go from bottom up)."

in Italiano:
Auto Cavi Numero: uno strumento che mi permette di selezionare i cavi ed inserire i numeri di cavo da entrambe le estremità del cavo. Esso dovrebbe avere un prefisso / suffisso opzione, un'opzione di valore di incremento, e l'opzione di direzione (se voglio iniziare dalla parte superiore della selezione e scendere, o andare dal basso verso l'alto).
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 18 maggio 2011 : 14:41:46  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Approfondendo le potenzialità delle funzioni mapcar e lambda, ho ridotto le righe di codice migliorando l'efficenza della funzione e riducendo a una il numero di variabili locali utilizzate:

(defun listpoly	(poly / lispoly)
(vl-load-com)
 (setq lispoly
       (reverse	(vl-remove nil
			   (mapcar '(lambda (vert)
				     (cond
				      ((= (car vert) 10)
				       (append (cdr vert) (list (cdr (assoc 38 (entget poly)))))
				      )
				      ((= (car vert) 42)
				       vert
				      )
				     )
				    )
				   (entget poly)
			   )
		)
       )
 )
 (if (or (= (cdr (assoc 70 (entget poly))) 0)
	 (= (cdr (assoc 70 (entget poly))) 128)
     )
   (setq lispoly (append (reverse (cdr lispoly))(list (assoc 210 (entget poly)))))
   (setq lispoly (append (reverse lispoly)(list(assoc 210 (entget poly)))))
 )
)

Modificato da - Terminator in data 18 maggio 2011 15:07:50
Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione 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 4,08 secondi.