Autore |
Discussione |
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 16 novembre 2010 : 08:59:46
|
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
|
(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 |
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 16 novembre 2010 : 10:28:07
|
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...
|
|
|
Giuseppe Mauro
Amministratore
Regione: Campania
Prov.: Napoli
2705 Messaggi |
Inserito il - 16 novembre 2010 : 10:53:13
|
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") |
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 16 novembre 2010 : 11:02:54
|
Bella Pe'
Resta aperto il problema della coesistenza di piu' linee di lunghezza max: aspettiamo le lisposte di Terminator, GP, Joseph &Co.
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 16 novembre 2010 : 12:20:28
|
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")
|
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 16 novembre 2010 : 12:32:24
|
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:
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 16 novembre 2010 : 14:03:34
|
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) |
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 16 novembre 2010 : 14:55:58
|
Ho solo fatto questa correzione:
(command "_CHPROP" gruppo2 "" "_C" "30" "")
anche per le versioni nazionalizzate.
Giuseppe&Terminator, grazie di esistere.
|
|
|
Roberto07
Utente Master
Regione: Lazio
Prov.: Roma
Città: Sabina Italia
1042 Messaggi |
Inserito il - 16 novembre 2010 : 16:01:47
|
Mi associo. Bravissimi!!
Grazie soprattutto perché mettete a disposizione di tutti il vs. lavoro.
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 16 novembre 2010 : 16:14:44
|
| 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 |
|
|
GP
Utente Master
Regione: Piemonte
Prov.: Vercelli
2776 Messaggi |
Inserito il - 16 novembre 2010 : 18:43:51
|
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")
|
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 16 novembre 2010 : 18:48:38
|
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.
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 16 novembre 2010 : 22:02:21
|
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")
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 17 novembre 2010 : 06:04:40
|
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. |
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 17 novembre 2010 : 07:41:30
|
Scusa T, mi sono perso: potresti gentilmente riassemblare la versione ultima, completa di effetti speciali?
Grazie |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 17 novembre 2010 : 08:02:47
|
| 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")
|
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 17 novembre 2010 : 08:56:24
|
T, col mio Autocad in inglese non funge l'opzione di cancellare le restanti linee...
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 17 novembre 2010 : 10:21:58
|
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")
|
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 17 novembre 2010 : 11:00:41
|
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!
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 17 novembre 2010 : 11:13:47
|
Quello che ancora non riesco a capire è perché non funzionava l'opzione cancella. Eppure il comando ERASE aveva l'underscore davanti... |
|
|
Discussione |
|