Pagina 1 di 2 12 UltimaUltima
Risultati da 1 a 10 di 18
  1. #1
    Utente Standard
    Iscritto dal
    2012
    Messaggi
    702
    Professione
    Leggo e confronto
    Regione
    Fuori dalla cerchia
    Software
    Lettura critica

    Predefinito Aggiungi valore in attributo blocco

    Allora, mi è partito l'embolo e vorrei scrivere una routine che selezionati una serie di blocchi (che contengono una quota altimetrica sotto forma di valore di un attributo) possa aggiungere/sottrarre un delta specifico.
    L'idea è semplice, una sorta di AddVal già presente sul sito, ma che agisca sui valori degli attributi.

    Ma mi sono scontrato con Acad gia al primo step, e cioè ottenere il valore dell'attributo contenuto nel blocco.
    Ottengo la lista blocco, ne cercho le sotto entità, le scorro tutte (tutto questo a linea di comando quindi se presente vedo ciò che sto cercando), ma in nessuna riesco a trovare un gruppo che contenga l'attuale valore dell'attributo.

    Qualcuno mi da una dritta?

  2. #2
    Utente Senior L'avatar di GP.
    Iscritto dal
    2008
    Messaggi
    2097
    Professione
    Nientologo
    Regione
    Vercelli
    Software
    uozapp

    Predefinito

    Inserisci il nome del blocco e il nome dell'etichetta nelle variabili all'inizio.

    Codice:
    (defun c:cambiaquota ( / NB NE blk n BL listATT attVAL)
        
        (setq NB "QUOTA") ;nome blocco
        (setq NE "ALTIM") ;nome etichetta
    
        (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
        (if (and
                (princ "\nSelezionare i Blocchi da modificare ")
                (setq blk (ssget (list '(0 . "INSERT") (cons 2 NB))))
                (setq delta (cond
                                ( (getdist (strcat "\nDelta QUOTA" (if delta (strcat " <" (rtos delta 2 2) ">: ")": "))) )
                                ( delta )
                )           )
            )
            (repeat (setq n (sslength blk))
                (setq BL (ssname blk (setq n (1- n))))
                (foreach listATT (vlax-invoke (vlax-ename->vla-object BL) 'getattributes)
                    (if (= (strcase (vla-get-tagstring listATT)) NE)
                        (progn
                            (setq attVAL (+ (atof (vla-get-textstring listATT)) delta))
                            (vla-put-textstring listATT (rtos attVAL 2 (getvar 'luprec)))
                        )
                    )
                )
            )
        )
        (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
        (princ)
    )

  3. Il seguente utente ha ringraziato GP. per questo post

    Cristallo (28-01-2018)

  4. #3
    Utente Standard
    Iscritto dal
    2012
    Messaggi
    702
    Professione
    Leggo e confronto
    Regione
    Fuori dalla cerchia
    Software
    Lettura critica

    Predefinito

    E che ne parliamo a fare? Qui posso solo ringraziarti.
    Ovviamente il tuo codice fa esattamente quello che cercavo, adesso mi devo solo applicare un po per affinarlo.
    Grazie ancora.

  5. #4
    Utente Senior L'avatar di GP.
    Iscritto dal
    2008
    Messaggi
    2097
    Professione
    Nientologo
    Regione
    Vercelli
    Software
    uozapp

    Predefinito

    Prego

    Se preferisci in vanilla il loop sui singoli blocchi si potrebbe impostare così:

    Codice:
            (repeat (setq n (sslength blk))
                (setq BL (ssname blk (setq n (1- n))))
                (if (setq ent1 (entnext (cdr (car (entget BL)))))
                    (while (= (cdr (assoc 0 (entget ent1))) "ATTRIB")
                        (if (= (strcase (cdr (assoc 2 (entget ent1)))) NE)
                            (progn
                                (setq attVAL (cdr (assoc 1 (entget ent1))))
                                (setq NewAttVAL (rtos (+ (atof attVAL) delta) 2 (getvar 'luprec)))
                                (entmod (subst (cons 1 NewAttVAL) (assoc 1 (entget ent1)) (entget ent1)))
                            )
                        )
                        (setq ent1 (entnext ent1))
                    )
                )
            )

  6. #5
    Utente Senior L'avatar di GP.
    Iscritto dal
    2008
    Messaggi
    2097
    Professione
    Nientologo
    Regione
    Vercelli
    Software
    uozapp

    Predefinito

    Altra cosa, se non vuoi limitare il lisp ad un solo NOMEBLOCCO, puoi selezionarli con un filtro sul DXF 66

    (ssget "X" '((0 . "INSERT") (66 . 1)))

    Se il valore è 1 l'entità INSERT è seguita da una serie di entità ATTRIB, che terminano con un'entità SEQEND.

  7. Il seguente utente ha ringraziato GP. per questo post

    Cristallo (28-01-2018)

  8. #6
    Utente Standard
    Iscritto dal
    2012
    Messaggi
    702
    Professione
    Leggo e confronto
    Regione
    Fuori dalla cerchia
    Software
    Lettura critica

    Predefinito

    Domani me li studio, adesso sono cotto.
    Tank You !!

  9. #7
    Utente Standard
    Iscritto dal
    2012
    Messaggi
    702
    Professione
    Leggo e confronto
    Regione
    Fuori dalla cerchia
    Software
    Lettura critica

    Predefinito

    Allora...
    ho preso il nome blocco (poco flessibile doverlo indicare nel listato) mediante una semplice associazione al gruppo 2
    (setq NB (cdr (assoc '2 (entget (car (entsel "Selezionare uno dei blocchi da aggiornare: "))))))

    Adesso, se volessi ottenere il tag dell'unico attributo presente nel blocco?
    Maledetti attributi, si nascondo ben bene!

  10. #8
    Utente Senior L'avatar di GP.
    Iscritto dal
    2008
    Messaggi
    2097
    Professione
    Nientologo
    Regione
    Vercelli
    Software
    uozapp

    Predefinito

    Se il blocco ha attributi questo frammento ti restituisce il nome dell'etichetta e il valore del primo attributo.

    (setq BL (car (entsel "Selezionare uno dei blocchi da aggiornare: ")))
    (setq ent1 (entget (entnext (cdr (car (entget BL))))))
    (setq etichetta (cdr (assoc 2 ent1)))
    (setq valore (cdr (assoc 1 ent1)))

  11. Il seguente utente ha ringraziato GP. per questo post

    Cristallo (29-01-2018)

  12. #9
    Utente Standard
    Iscritto dal
    2012
    Messaggi
    702
    Professione
    Leggo e confronto
    Regione
    Fuori dalla cerchia
    Software
    Lettura critica

    Predefinito

    Sempre sul pezzo. Funziona alla grande ed il fatto che lo hai splittato in più passaggi mi consente di ragionare su un'altro aspetto, e cioè che se il valore dell'attributo ha altri caratteri oltre il numeretto della quota posso stralciarli prima e ricostruirli dopo (una cosa del tipo "-5.70 q.p.f.") o addirittura scegliere di saltare quell'entità.

    Giusto per cultura mia, se ripeto l'entnext, passo all'attributo successivo, fino ad incontrare un SEQUEND?

  13. #10
    Utente Senior L'avatar di GP.
    Iscritto dal
    2008
    Messaggi
    2097
    Professione
    Nientologo
    Regione
    Vercelli
    Software
    uozapp

    Predefinito

    Ogni entnext scorre gli attributi, fino a nil


  • Pagina 1 di 2 12 UltimaUltima

    Discussioni Simili

    1. Risposte: 7
      Ultimo Messaggio: 11-04-2017, 15: 41
    2. Risposte: 3
      Ultimo Messaggio: 28-09-2013, 11: 19
    3. Ricerca di blocchi con un determinato valore di attributo
      Di zintonio nel forum Lisp per Autocad
      Risposte: 2
      Ultimo Messaggio: 20-04-2010, 15: 41
    4. Scelta multipla valore attributo
      Di battiesgiuscia nel forum Lisp per Autocad
      Risposte: 1
      Ultimo Messaggio: 17-10-2009, 12: 51

    Segnalibri

    Segnalibri

    Permessi di Scrittura

    • Tu non puoi inviare nuove discussioni
    • Tu non puoi inviare risposte
    • Tu non puoi inviare allegati
    • Tu non puoi modificare i tuoi messaggi
    •  





    CAD3D.it - la community dei progettisti