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
 Evidenziare la linea piu' lunga in una selezione
 Nuova Discussione  Discussione Bloccata
 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

n/a
deleted

Prov.: Estero
Città: Sieradz (PL)


5926 Messaggi

Inserito il - 16 novembre 2010 : 08:59:46  Mostra Profilo
In un altro forum, e' emersa la necessita' di evidenziare, all'interno di una selezione multipla, l'oggetto "linea" avente la lunghezza maggiore.

Per "evidenziare" intendo, chesso', farlo lampeggiare oppure dargli un colore sgargiante magari con uno spessore, insomma: metterlo in evidenza in maniera univoca.

Ovviamente, le linee di identica lunghezza massima possono essere piu' di una: come fare?

Grazie per l'attenzione, buona giornata a tutti!


Giuseppe Mauro
Amministratore



Regione: Campania
Prov.: Napoli


2705 Messaggi

Inserito il - 16 novembre 2010 : 10:11:21  Mostra Profilo Invia a Giuseppe Mauro un Messaggio Privato
(DEFUN C:MAXLINE (/ gruppo NUMERO CONT LUNMAX ENT LUNG)
(setvar "CMDECHO" 0)
(princ "\nSelezionare il gruppo di linee: ")
(setq GRUPPO (ssget '((0 . "LINE")) ))
(setq NUMERO (sslength gruppo))
(setq CONT 0 LUNMAX 0.00 numero 0)

(vl-load-com)
(repeat NUMERO
(setq ENT (ssname GRUPPO CONT))
(setq Lung(vla-get-length (vlax-ename->vla-object ENT)))
(if (> LUNG LUNMAX) (setq ENTMAX ENT))
(setq CONT (+ 1 CONT))
);;chiusura repeat

(command "_change" ENTMAX "" "_prop" "_color" "30" "")


)
(princ "\nEvidenzia la linea piu lunga - USARE MAXLINE")



Gestisce pero' una sola linea piu lunga. Se ce ne sono 2 o piu, ne evidenzia solo una.
Non ho tempo di fare la routine per piu di una linea (di sicuro terminator mi bruciera' sul tempo)

Modificato da - Giuseppe Mauro in data 16 novembre 2010 10:23:31
Torna all'inizio della Pagina

n/a
deleted

Prov.: Estero
Città: Sieradz (PL)


5926 Messaggi

Inserito il - 16 novembre 2010 : 10:28:07  Mostra Profilo
Grazie Peppe,
ma purtroppo non funge: prova tu stesso con questo esempio.

Se gli chiedi di selezionare la piu' lunga delle linee all'interno della poly rossa, lui ne marca una piccolina sulla sinistra...


Torna all'inizio della Pagina

Giuseppe Mauro
Amministratore



Regione: Campania
Prov.: Napoli


2705 Messaggi

Inserito il - 16 novembre 2010 : 10:53:13  Mostra Profilo Invia a Giuseppe Mauro un Messaggio Privato
Hai ragione. Ho pasticciato con l'ordine delle var e mi ero dimenticato di aggiornare la Lmax. Ecco il nuovo listato
(DEFUN C:MAXLINE (/ GRUPPO NUMERO LUNMAX LUNG ENTMAX CONT)
(setvar "CMDECHO" 0)
(princ "\nSelezionare il gruppo di linee: ")
(setq GRUPPO (ssget '((0 . "LINE")) ))
(setq CONT 1 LUNMAX 0.00 numero 0)
(setq NUMERO (sslength gruppo))

(vl-load-com)
(repeat NUMERO
(setq ENT (ssname GRUPPO (- CONT 1)))
(setq Lung(vla-get-length (vlax-ename->vla-object ENT)))
(if (> LUNG LUNMAX)
(PROGN
(setq ENTMAX ENT)
(SETQ LUNMAX LUNG)
);;CHIUSURA PROGN
);; CHIUSURA IF

(setq CONT (+ 1 CONT))
);;chiusura repeat

(command "_change" ENTMAX "" "_prop" "_color" "30" "")


)
(princ "\nEvidenzia la linea piu lunga - USARE MAXLINE")
Torna all'inizio della Pagina

n/a
deleted

Prov.: Estero
Città: Sieradz (PL)


5926 Messaggi

Inserito il - 16 novembre 2010 : 11:02:54  Mostra Profilo
Bella Pe'

Resta aperto il problema della coesistenza di piu' linee di lunghezza max: aspettiamo le lisposte di Terminator, GP, Joseph &Co.

Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 16 novembre 2010 : 12:20:28  Mostra Profilo Invia a Terminator un Messaggio Privato
Una possibile soluzione potrebbe essere questa:

(defun C:MAXLINE (/ gruppo index lista gruppo2 lung)
 (setvar "CMDECHO" 0)
 (vl-load-com)
 (princ "\nSelezionare il gruppo di linee: ")
 (setq gruppo  (ssget '((0 . "LINE")))
       index   -1
       lista   '()
       gruppo2 (ssadd)
 )
 (repeat (sslength gruppo)
  (setq ent (ssname gruppo (setq index (1+ index))))
  (setq lung (vla-get-length (vlax-ename->vla-object ent)))
  (setq lista (cons (list lung ent) lista))
 )
 (setq lista (vl-sort lista (function (lambda (elem1 elem2) (> (car elem1) (car elem2))))))
 (setq index -1)
 (while	(= (caar lista) (car (nth (setq index (1+ index)) lista)))
  (ssadd (cadr (nth index lista)) gruppo2)
 )
 (command "_CHPROP" gruppo2 "" "CO" "30" "")
)
(princ "\nEvidenzia la linea piu lunga - USARE MAXLINE")
Torna all'inizio della Pagina

n/a
deleted

Prov.: Estero
Città: Sieradz (PL)


5926 Messaggi

Inserito il - 16 novembre 2010 : 12:32:24  Mostra Profilo
Bella T

Il cerchio si sta chiudendo: che tu sappia, esiste un modo piu' spettacolare per evidenziare le linee di massima lunghezza?

Un effetto "blinking" tipo questo, per intenderci:



Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 16 novembre 2010 : 14:03:34  Mostra Profilo Invia a Terminator un Messaggio Privato
Avviso subito che non c'è "effetto blink" ma è comunque un po' più evidente...

Aggiungi dopo la riga (command "_CHPROP" ...):

(setq index -1)
(repeat (sslength gruppo2)
(redraw (ssname gruppo2 (setq index (1+ index))) 3)
)
(command "_SELECT" gruppo2 "")
(sssetfirst nil gruppo2)
Torna all'inizio della Pagina

n/a
deleted

Prov.: Estero
Città: Sieradz (PL)


5926 Messaggi

Inserito il - 16 novembre 2010 : 14:55:58  Mostra Profilo
Ho solo fatto questa correzione:

(command "_CHPROP" gruppo2 "" "_C" "30" "")

anche per le versioni nazionalizzate.

Giuseppe&Terminator, grazie di esistere.




Torna all'inizio della Pagina

Roberto07
Utente Master



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


1042 Messaggi

Inserito il - 16 novembre 2010 : 16:01:47  Mostra Profilo Invia a Roberto07 un Messaggio Privato
Mi associo. Bravissimi!!

Grazie soprattutto perché mettete a disposizione di tutti il vs. lavoro.



Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 16 novembre 2010 : 16:14:44  Mostra Profilo Invia a Terminator un Messaggio Privato

Messaggio inserito da antoniovinci
Ho solo fatto questa correzione:

(command "_CHPROP" gruppo2 "" "_C" "30" "")

anche per le versioni nazionalizzate.


Hai fatto bene, di solito metto sempre l'underscore prima del comando, stavolta me ne sono dimenticato. Chiedo perdono!

Modificato da - Terminator in data 16 novembre 2010 18:21:44
Torna all'inizio della Pagina

GP
Utente Master


Regione: Piemonte
Prov.: Vercelli


2776 Messaggi

Inserito il - 16 novembre 2010 : 18:43:51  Mostra Profilo Invia a GP un Messaggio Privato
Purtroppo in questo periodo non riesco ad essere della partita se non "fuori tempo".

Ho apportato una piccola modifica al codice di Terminator in quanto, stranamente, in alcuni casi non venivano recepite tutte le linee di lunghezza massima.





Ho aggiunto anche un alert per la segnalazione della misura massima trovata, un ulteriore passo, volendo, potrebbe essere la cancellazione delle inutili linee "minori".

(defun C:MAXLINE (/ gruppo index lista gruppo2 lung)
(setvar "CMDECHO" 0)
(vl-load-com)
(princ "\nSelezionare il gruppo di linee: ")
(setq gruppo (ssget '((0 . "LINE")))
index -1
lista '()
gruppo2 (ssadd)
)
(repeat (sslength gruppo)
(setq ent (ssname gruppo (setq index (1+ index))))
(setq lung (vla-get-length (vlax-ename->vla-object ent)))
(setq lista (cons (list lung ent) lista))
)
(setq lista (vl-sort lista (function (lambda (elem1 elem2) (> (car elem1) (car elem2))))))
(setq index -1)
(while (equal (caar lista) (car (nth (setq index (1+ index)) lista)) 0.000001)
(ssadd (cadr (nth index lista)) gruppo2)
)
(command "_CHPROP" gruppo2 "" "_C" "30" "")
(alert (strcat "Lunghezza massima = " (rtos (caar lista)) " unità."
"\n " "\nTrovate n° " (itoa (sslength gruppo2)) " linee"

)
)

)
(princ "\nEvidenzia la linea più lunga - USARE MAXLINE")


Torna all'inizio della Pagina

n/a
deleted

Prov.: Estero
Città: Sieradz (PL)


5926 Messaggi

Inserito il - 16 novembre 2010 : 18:48:38  Mostra Profilo
Facciamo cosi': prima di postare la versione finale nell'altro forum, aspetto sino a domani a mezzogiorno, in attesa di eventuali miglioramenti e/o debug.




Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 16 novembre 2010 : 22:02:21  Mostra Profilo Invia a Terminator un Messaggio Privato
Mi limito solo ad aggiungere l'opzione cancellazione linee suggerita da GP.

(defun C:MAXLINE (/ gruppo index lista gruppo2 lung)
 (setvar "CMDECHO" 0)
 (vl-load-com)
 (princ "\nSelezionare il gruppo di linee: ")
 (setq gruppo  (ssget '((0 . "LINE")))
       index   -1
       lista   '()
       gruppo2 (ssadd)
 )
 (repeat (sslength gruppo)
  (setq ent (ssname gruppo (setq index (1+ index))))
  (setq lung (vla-get-length (vlax-ename->vla-object ent)))
  (setq lista (cons (list lung ent) lista))
 )
 (setq lista (vl-sort lista
		      (function	(lambda (elem1 elem2) (> (car elem1) (car elem2)))
		      )
	     )
 )
 (setq index -1)
 (while	(equal (caar lista)
	       (car (nth (setq index (1+ index)) lista))
	       0.000001
	)
  (ssadd (cadr (nth index lista)) gruppo2)
 )
 (command "_CHPROP" gruppo2 "" "_C" "30" "")
 (alert	(strcat	"Lunghezza massima = "
		(rtos (caar lista))
		" unità."
		"\n "
		"\nTrovate n° "
		(itoa (sslength gruppo2))
		" linee"

	)
 )

 (setq pass "N")
 (setq prova "PROVA")
 (while	prova
  (princ "\nVuoi cancellare le altre linee? (S/N)<")
  (princ pass)
  (setq pass (strcase (getstring ">: ")))
  (cond
   ((= (strcase pass) "S")
    (setq index -1)
    (repeat (sslength gruppo2)
     (ssdel (ssname gruppo2 (setq index (1+ index))) gruppo)
    )
    (setq lunggruppo (sslength gruppo))
    (command "_ERASE" gruppo "")
    (alert
     (strcat "    n° " (itoa lunggruppo) " linee cancellate")
    )
    (setq prova nil)
   )
   ((= (strcase pass) "N")
    (princ)
    (setq prova nil)
   )
   ((= pass "")
    (princ)
    (setq prova nil)
   )
   (T
    (princ "\nOpzione non valida!")
   )
  )
 ) 

(princ)
)

(princ "\nEvidenzia la linea piu lunga - USARE MAXLINE")

Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 17 novembre 2010 : 06:04:40  Mostra Profilo Invia a Terminator un Messaggio Privato
Piccolissimo bug:

(setq prova "PROVA")
 (while	prova
  (princ "\nVuoi cancellare le altre linee? (S/N)<")
  (setq pass "N")(princ pass)
  (setq pass (strcase (getstring ">: ")))

Spostato (setq pass "N") dalla posizione precedente (prima della riga setq prova "PROVA"). Se l'opzione di scelta cancellazione è sbagliata, ora mi ripropone la N.
Torna all'inizio della Pagina

n/a
deleted

Prov.: Estero
Città: Sieradz (PL)


5926 Messaggi

Inserito il - 17 novembre 2010 : 07:41:30  Mostra Profilo
Scusa T, mi sono perso: potresti gentilmente riassemblare la versione ultima, completa di effetti speciali?

Grazie
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 17 novembre 2010 : 08:02:47  Mostra Profilo Invia a Terminator un Messaggio Privato
Messaggio inserito da antoniovinci

Scusa T, mi sono perso: potresti gentilmente riassemblare la versione ultima, completa di effetti speciali?

Ecco qua l'ultima release assemblata con gli effetti speciali, salvo altri miglioramenti, features, aggiornamenti, debug, ecc...

(defun C:MAXLINE (/ gruppo index lista gruppo2 lung lunggruppo prova)
 (setvar "CMDECHO" 0)
 (vl-load-com)
 (princ "\nSelezionare il gruppo di linee: ")
 (setq gruppo  (ssget '((0 . "LINE")))
       index   -1
       lista   '()
       gruppo2 (ssadd)
 )
 (repeat (sslength gruppo)
  (setq ent (ssname gruppo (setq index (1+ index))))
  (setq lung (vla-get-length (vlax-ename->vla-object ent)))
  (setq lista (cons (list lung ent) lista))
 )
 (setq lista (vl-sort lista
		      (function	(lambda (elem1 elem2) (> (car elem1) (car elem2)))
		      )
	     )
 )
 (setq index -1)
 (while	(equal (caar lista)
	       (car (nth (setq index (1+ index)) lista))
	       0.000001
	)
  (ssadd (cadr (nth index lista)) gruppo2)
 )
 (command "_CHPROP" gruppo2 "" "_CO" "30" "")
 (alert	(strcat	"Lunghezza massima = "
		(rtos (caar lista))
		" unità."
		"\n "
		"\nTrovate n° "
		(itoa (sslength gruppo2))
		" linee"

	)
 )

 (setq index -1)
 (repeat (sslength gruppo2)
  (redraw (ssname gruppo2 (setq index (1+ index))) 3)
 )
 (command "_SELECT" gruppo2 "")
 (sssetfirst nil gruppo2)

 (setq prova "PROVA")
 (while	prova
  (princ "\nVuoi cancellare le altre linee? (S/N)<")
  (setq pass "N")
  (princ pass)
  (setq pass (strcase (getstring ">: ")))
  (cond
   ((= (strcase pass) "S")
    (setq index -1)
    (repeat (sslength gruppo2)
     (ssdel (ssname gruppo2 (setq index (1+ index))) gruppo)
    )
    (setq lunggruppo (sslength gruppo))
    (command "_ERASE" gruppo "")
    (alert
     (strcat "    n° " (itoa lunggruppo) " linee cancellate")
    )
    (setq prova nil)
   )
   ((= (strcase pass) "N")
    (princ)
    (setq prova nil)
   )
   ((= pass "")
    (princ)
    (setq prova nil)
   )
   (T
    (princ "\nOpzione non valida!")
   )
  )
 )

 (princ)
)

(princ "\nEvidenzia la linea più lunga - USARE MAXLINE")
Torna all'inizio della Pagina

n/a
deleted

Prov.: Estero
Città: Sieradz (PL)


5926 Messaggi

Inserito il - 17 novembre 2010 : 08:56:24  Mostra Profilo
T,
col mio Autocad in inglese non funge l'opzione di cancellare le restanti linee...

Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 17 novembre 2010 : 10:21:58  Mostra Profilo Invia a Terminator un Messaggio Privato
Così dovrebbe andare:

(defun C:MAXLINE (/ gruppo index lista gruppo2 lung lunggruppo prova)
 (setvar "CMDECHO" 0)
 (vl-load-com)
 (princ "\nSelezionare il gruppo di linee: ")
 (setq gruppo  (ssget '((0 . "LINE")))
       index   -1
       lista   '()
       gruppo2 (ssadd)
 )
 (repeat (sslength gruppo)
  (setq ent (ssname gruppo (setq index (1+ index))))
  (setq lung (vla-get-length (vlax-ename->vla-object ent)))
  (setq lista (cons (list lung ent) lista))
 )
 (setq lista (vl-sort lista
		      (function	(lambda (elem1 elem2) (> (car elem1) (car elem2)))
		      )
	     )
 )
 (setq index -1)
 (while	(equal (caar lista)
	       (car (nth (setq index (1+ index)) lista))
	       0.000001
	)
  (ssadd (cadr (nth index lista)) gruppo2)
 )
 (command "_CHPROP" gruppo2 "" "_CO" "30" "")
 (alert	(strcat	"Lunghezza massima = "
		(rtos (caar lista))
		" unità."
		"\n "
		"\nTrovate n° "
		(itoa (sslength gruppo2))
		" linee"

	)
 )

 (setq index -1)
 (repeat (sslength gruppo2)
  (redraw (ssname gruppo2 (setq index (1+ index))) 3)
 )
 (command "_SELECT" gruppo2 "")
 (sssetfirst nil gruppo2)

 (setq prova "PROVA")
 (while	prova
  (princ "\nVuoi cancellare le altre linee? (S/N)<")
  (setq pass "N")
  (princ pass)
  (setq pass (strcase (getstring ">: ")))
  (cond
   ((= (strcase pass) "S")
    (setq index -1)
    (repeat (sslength gruppo2)
     (ssdel (ssname gruppo2 (setq index (1+ index))) gruppo)
    )
    (setq lunggruppo (sslength gruppo))
    (setq index -1)
    (repeat lunggruppo
     (entdel (ssname gruppo (setq index (1+ index))))
    )
    (setq prova nil)
   )
   ((= (strcase pass) "N")
    (princ)
    (setq prova nil)
   )
   ((= pass "")
    (princ)
    (setq prova nil)
   )
   (T
    (princ "\nOpzione non valida!")
   )
  )
 )

 (princ)
)

(princ "\nEvidenzia la linea più lunga - USARE MAXLINE")
Torna all'inizio della Pagina

n/a
deleted

Prov.: Estero
Città: Sieradz (PL)


5926 Messaggi

Inserito il - 17 novembre 2010 : 11:00:41  Mostra Profilo
Va alla stra-grande, perfino su Autocad "wersja polska"...

Ecco qua il topic dell'altro forum: se ci fossero novita', mi bastera' cambiare lo .ZIP sul mio server FTP.

Grazie ancora a tutti per la splendida sinergia, tipica di Cadlandia!



Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 17 novembre 2010 : 11:13:47  Mostra Profilo Invia a Terminator un Messaggio Privato
Quello che ancora non riesco a capire è perché non funzionava l'opzione cancella. Eppure il comando ERASE aveva l'underscore davanti...
Torna all'inizio della Pagina
Pagina: di 2 Discussione Precedente Discussione Discussione Successiva  
Pagina Successiva
 Nuova Discussione  Discussione Bloccata
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 0,64 secondi.