Sorting di una lista di selezione

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
Ho una serie di oggetti semplici linee, polilinee che seleziono mediante SSGET (nell'immagine quelle di colore magenta).
Ottengo la brava lista di selezione dalla quale posso estrarre ogni singola entità per le mie operazioni, conoscerne il numero etc.

Dovendo costruire i segmenti in rosso ed in verde, posso sapere quante ne andranno a six e quante a destra e mediante il calcolo degli angoli disegnare i segmenti.
Il problema è che la lista di partenza dell'SSGET non è ordinata in base ad un parametro X-Y ma attraverso l'ordine di creazione nel disegno, che può tranquillamente non essere secondo X oppure Y.
L'alternativa è selezionare una per una le entità (che scomodità).

Esiste un modo "rapido" per fare il sorting della lista di selezione mediante un metodo tipo Coordinata X oppure Coordinata Y?
Ho cercato di utilizzare il VL-SORT ma ci sto solo sbattendo la testa da ieri...

Codice:
(SETQ P1 (GETPOINT "\nSeleziona Primo Punto: "))
(SETQ P2 (GETPOINT "\nSeleziona Secondo Punto: "))
  (setq OGGETTI (ssget '((0 . "LINE,*POLYLINE"))))
    (setq NUMERO (sslength OGGETTI))
     (setq INTERASSE (distance (cdr(assoc '10(entget(ssname OGGETTI 2)))) (cdr(assoc '10(entget(ssname OGGETTI 3)))) ))
  (setq SFASAMENTO (/ INTERASSE 2))
  (setq ANGOLOBASE (angle P1 P2))
  (setq MEZZALISTA (/ NUMERO 2))
immagine 1.jpg
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
Per un attimo mi sono illuso di poterti suggerire di usare INTERCETTA (FENCE).... ma poi da una rapida prova mi sono accorto che non ordina gli oggetti.
L'unica soluzione che mi viene in mente è quella di scorrere tutto il set di selezione, estrapolando le coordinate; ordinarle e ricreare il set di selezione con un SSADD
Per l'ordinamento di una lista in base ad un'altra lista puoi provare ad usare il mio file ORDINE.LSP lanciando la sub x11:ORDINE1
 

Allegati

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
Grazie X11, ci proverò.
Comunque è una bella rogna ordinare un set di selezione, eppure ci sono lisp di Acad che lo fanno egregiamente. Un esempio è il TCOUNT, ma è scritto in un LISP così affinato che diventa quasi impossibile capire come fa.
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
In effetti io mi sono fermato al lisp senza i vari VL-xxx : per questo talvolta sono costretto a trovare soluzioni kilometriche (o chiedere agli esperti del Forum!) anche per le cose più banali!
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
Prova a vedere qui:
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
In effetti io mi sono fermato al lisp senza i vari VL-xxx : per questo talvolta sono costretto a trovare soluzioni kilometriche (o chiedere agli esperti del Forum!) anche per le cose più banali!
Idem come te...
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
Premesso che le vie per arrivare ad una soluzione sono infinite, quella che mi viene in mente ora è questa:

Dopo SSGET ottieni l'elenco degli oggetti selezionati
Codice:
(setq selez (ssget))   

(repeat (setq n (sslength selez))
    (setq lista (cons (ssname selez (setq n (1- n))) lista))
)
ottieni: (<Nome entità: 21148ae8910> <Nome entità: 21148ae8900> <Nome entità: 21148ae88f0>)


Crea la lista degli oggetti con anteposto la coordinata X del relativo punto iniziale --> (car (vlax-curve-getStartPoint elem))
Codice:
(foreach elem lista
    (setq elenco (cons (list (car (vlax-curve-getStartPoint elem)) elem) elenco))
)
ottieni: ((212.453 <Nome entità: 21148ae88f0>) (197.518 <Nome entità: 21148ae8900>) (205.859 <Nome entità: 21148ae8910>))


Ordina la lista precedente in base alla X --> (< (car e1)(car e2))
Codice:
(setq elenco (vl-sort elenco '(lambda (e1 e2)(< (car e1)(car e2)))))
ottieni: ((197.518 <Nome entità: 21148ae8900>) (205.859 <Nome entità: 21148ae8910>) (212.453 <Nome entità: 21148ae88f0>))


Lista depurata del primo elemento, ovvero la coordinata X
Codice:
(foreach elem elenco
    (setq listadef (cons (cadr elem) listadef))
)
(setq listadef (reverse listadef))
ottieni: (<Nome entità: 21148ae8900> <Nome entità: 21148ae8910> <Nome entità: 21148ae88f0>)
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
Mo ce provo.
E se funziona... rischi grosso! Prendo un treno e te vengo a da un morso alla mano da vicino! :ROFLMAO: :ROFLMAO:
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
Ovviamente funziona... GRRRR :LOL:
L'unica veniale pecca è che (nun mi chiedere il perchè) il (foreach elem lista) non va, ma l'ho sostituito brutalmente con un (repeat (vl-list-length lista)
e che la lista finale (ovviamente) è una lista e non piu un selection set, per cui le entità le prelevi non piu via SSNAME, ma via NTH.

Io sono convinto che hai un futuro da programmatore. Un ottimo paracadute professionale.
Ormai ringraziarti è diventato obsoleto. Quando capiti qui ti sono debitore di una pizza.
 
  • Like
Reactions: GP.