Adattare gruppo con testi di dimensioni e superficie a polilinee quadrilatere chiuse più grandi con solo un click (selezione multipla)

Mano63

Utente re-attivo
professione: fast designer
software: autocad 2023
regione: lombardia
Buongiorno a tutti,
ho creato un blocco (nominato post2021, v. allegato) con vincoli che funziona in questo modo (v. immagini qui sotto):

OPERAZIONE "A" - selezionando il blocco si evidenzia il vertice in alto a destra, si trascina al vertice corrispondente della polilinea più grande (sempre in alto a destra) e il blocco si adatta alle dimensioni della polilinea più grande (salvando si aggiornano i testi costituiti da campi dati che riportano dimensioni e superfice).

Nella pratica, avendo planimetrie con centinaia di polilinee:
1 - con un lisp introduco il blocco post2021 nel centro geometrico di ogni polilinea che popola la mia planimetria (comando che introduce il blocco in tutte le polilinee con un'unica selezione)
2 - ripeto l'operazione "A" per ogni polilinea contenuta nel disegno

Chiedo il vostro aiuto per riuscire (con un lisp di vostra creazione) ad eseguire gli adattamenti con un'unica operazione.
Ritengo utile, una volta inseriti i blocchi (punto 1) esploderli tutti con lisp apposito (di cui dispongo) in gruppi. I gruppi sono vincolati in modo che tutti gli elementi "seguono il movimento della polilinea contenuta in essi.
Il comando che vi chiedo dovrebbe fare in modo che i quattro vertici della polilinea interna al gruppo vadano a sovrapporsi ai quattro vertici della polilinea più grande (vertice della polilinea del gruppo con vertice della polilinea più grande più vicino). Gli altri elementi del gruppo seguiranno la polilinea del gruppo stesso.

Concetto semplice, spiegazione forse più complessa... se qualcuno ha capito e vuole provare ad aiutarmi lo ringrazio anticipatamente.


1634983020236.png

1634985237854.png
 

Allegati

  • 1634983073030.png
    1634983073030.png
    10 KB · Views : 2
  • ADATTA GRUPPO A POLILINEA.dwg
    56.9 KB · Views : 2

GP.

Utente Senior
professione: Nientologo
software: uozapp
regione: Vercelli
Inserisci i blocchi, li trasformi in gruppi e poi prova questo lisp.
Con tutti quei vincoli l'operazione risulta molto lenta, perciò ho previsto la selezione dei rettangoli da trattare, ma puoi sempre digitare T (tutto) alla richiesta di selezione oggetti.
Un lisp unico a partire dall'inserimento dei blocchi darebbe risultati più veloci in quanto ad ogni inserimento si saprebbero già gli identificativi del rettangolo e del blocco inserito, mentre ora la routine cerca tutte le polilinee chiuse sul layer "TRACCIA" e poi cerca all'interno di ognuna se vi sono polilinee chiuse (perciò i blocchi devono già essere esplosi) sul layer "post".
Spero che funzioni perchè il tempo per adattarlo manca.

Codice:
(defun c:test ( / poly r1 r2 p_or v_r1 v_r2 p_dest )
    (setq pks (getvar 'pickstyle))
    (setvar 'pickstyle 0)
    (princ "\Selezionare i rettangoli da trattare")
    (setq poly (ssget '((0 . "LWPOLYLINE") (8 . "TRACCIA") (-4 . "&=") (70 . 1))))
    (repeat (setq n (sslength poly))
        (setq r2 (ssname poly (setq n (1- n))))
        (setq v_r2 (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget r2))))
        (setq r1 (ssget "_WP" v_r2  '((0 . "LWPOLYLINE") (8 . "post") (-4 . "&=") (70 . 1))))
        (if (and r1 (= 1 (sslength r1)))
            (progn
                (setq r1 (ssname r1 0))
                (setq v_r1 (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget r1))))
                (setq p_or (cadr v_r1))
                (setq p_dest
                         (car
                             (vl-sort v_r2
                                 '(lambda (x1 x2)
                                     (<
                                         (distance p_or (list (car x1) (cadr x1) ))
                                         (distance p_or (list (car x2) (cadr x2) ))
                                     )
                                 )
                             )
                         )
                )
                (entmod (subst (cons 10 p_dest) (cons 10 p_or) (entget r1)))
            )
        )
    )
    (setvar 'pickstyle pks)
    (princ)
)
 

Mano63

Utente re-attivo
professione: fast designer
software: autocad 2023
regione: lombardia
Grazie GP.!!
devo selezionare i gruppi o le polilinee all'interno di essi?
...mi esce questo messaggio:
1635143323310.png
 

Mano63

Utente re-attivo
professione: fast designer
software: autocad 2023
regione: lombardia
Scusa GP.,
ora ho capito.. devo selezionare i rettangoli a cui i gruppi si devono adattare. Provando con 3 rettangoli il comando funziona perfettamente su 2:
1635144384628.png

..ora provo su una quantità maggiore...

ancora Grazie!
 

Mano63

Utente re-attivo
professione: fast designer
software: autocad 2023
regione: lombardia
..selezionandone una quantità maggiore funziona comunque su tutti tranne 1, ma poco importa, il grosso è fatto!
1635145771635.png
grazie 1000!
 

Allegati

  • 1635145714945.png
    1635145714945.png
    32.3 KB · Views : 1

GP.

Utente Senior
professione: Nientologo
software: uozapp
regione: Vercelli
Boh, non so perché su un rettangolo (che poi è il primo che il lisp processa) non funziona.
Alla fine ridai il comando e prova a riselezionare solo quello.
 

Mano63

Utente re-attivo
professione: fast designer
software: autocad 2023
regione: lombardia
Va bene così. Il vero problema, in fondo, sono tutti quei blocchi/gruppi ognuno con 27 vincoli. Per una planimetria con 160 rettangoli impiego max 15 min (e direi che va bene - i miei colleghi non meno di 2 h!).. ho tutto il tempo per il caffè...non credi?
Grazie
Marco
 

Statistiche forum

Discussioni
59,286
Messaggi
506,305
Utenti registrati
111,427
Ultimo utente registrato
Sopra95

Utenti online

Nessun utente è online al momento.
Top