Aller au contenu

Attribut de bloc variable et modification


Messages recommandés

Posté(e)

Bonjour à tous

Voila je cherche une astuce concernant les attributs de bloc.

Je cré des blocs avec des attributs contenant des variables.

Quand je modifie mon bloc d'origine, en changeant la hauteur ou la couleur de mon attribut variable, je souhaiterais que ces modifications soient prisent en compte dans les dessins ou j déja inséré ce bloc.

Suis je claire c pas sur , mais si vous avez compris et vous avez une idée.

Merci messieurs dames

Posté(e)

Ouaips !

 

Si j'ai bien compris, c'est la synchronisation des attributs qui va t'aider.

 

Seulement, je connais mal les différences entres AutoCAD et AutoCAD LT 2004 sur ce sujet.

 

Mais c'est bien la modif de la géométrie des attributs qui te préocuppe et non la modifi des valeurs d'étiquettes ?!

 

C'est bien ça ?

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Bonjour

Il y a bien la commande -attedit, mais c'est un peu lourd

 

La solution est de le faire sur une version pleine ou avec un add-on comme drcauto

 

Voici un lisp qui répond à ce problème, il n'est pas parfait à cause d’un bug qui est le calcul de la position et l'angle des attributs existants affairant à l’angle d'un bloc qui a été tourné, mais il répond à 90% des cas. Il reste encore à le finaliser.

Si j'ai un peu de temps ou si quelqu'un veut bien le finir.

 

(defun c:rat (/ att_bloc_ref att_bloc_sel bloc_ref cmd nom_bloc nxang nxpt nxpt1 p ptx1 pty1 ptz1 selection tbl_bloc_ref tbl_bloc_sel)

 (defun chg (code_groupe)
   (setq att_bloc_sel (subst (assoc code_groupe att_bloc_ref) (assoc code_groupe att_bloc_sel) att_bloc_sel))
 )

 (setq cmd (getvar "cmdecho"))                                      ; Ne pas voir les commandes
 (setvar "cmdecho" 0)
 (command "_.undo" "_group")                                        ; Pour faire un undo unique
 (setq p (getvar "pickadd"))                                        ; Sélection unique
 (setvar "pickadd" 0)
 (princ "\nChoisissez le type de bloc pour modifier les attributs.")
 (setq selection (ssget))                                           ; Sélection du bloc de réference
 (setvar "pickadd" p)
 (if (= (cdr (assoc 0 (entget (ssname selection 0)))) "INSERT")     ; Vérification que le choix est un bloc
   (progn
     (setq nom_bloc (cdr (assoc 2 (entget (ssname selection 0)))))
     (setq selection (ssget "_x" (list (cons 2 nom_bloc))))         ; Rechercher tous les blocs selon la réference dans le dessin
     (setq bloc_ref (tblsearch "block" nom_bloc))                   ; Récuperer les valeurs du bloc de réference
     (if (and selection bloc_ref)
       (if (cdr (assoc 66 (entget (ssname selection 0))))           ; Vérification si le bloc à des attributs
         (progn
           (setq n 0)
           (while (/= (ssname selection n) nil)                     ; Début de la boucle
             (setq tbl_bloc_ref (entget (cdr (assoc -2 bloc_ref)))) ; Table du bloc de réference
             (setq tbl_bloc_sel (entget (ssname selection n)))      ; Table du bloc du dessin
             (setq att_bloc_sel (entget (entnext (cdr (assoc -1 tbl_bloc_sel)))))
             (setq ptx1 (car   (cdr (assoc 10 tbl_bloc_sel))))      ; Point d'insertion x du bloc
             (setq pty1 (cadr  (cdr (assoc 10 tbl_bloc_sel))))      ; Point d'insertion y du bloc
             (setq ptz1 (caddr (cdr (assoc 10 tbl_bloc_sel))))      ; Point d'insertion z du bloc
             (setq att_bloc_ref tbl_bloc_ref)
             (while (/= (cdr (assoc 0 att_bloc_sel)) "SEQEND")      ; Vérification que l'on n'à pas atteint le dernier attribut
               (while (/= (cdr (assoc 0 att_bloc_ref)) "ATTDEF")    ; Vérification que l'entité est un attribut , sinon suivant
                 (setq att_bloc_ref (entget (entnext (cdr (assoc -1 att_bloc_ref)))))
               )
               (chg 2)(chg 7)(chg 8)  ; Mettre à jour la table des attibuts du bloc de dessin, les chiffres correspondent aux codes de groupe communs aux entités
               (setq nxpt (list (+ ptx1 (* (car   (cdr (assoc 10 att_bloc_ref)))(cdr (assoc 41 tbl_bloc_sel))))
                                (+ pty1 (* (cadr  (cdr (assoc 10 att_bloc_ref)))(cdr (assoc 42 tbl_bloc_sel))))
                                (+ ptz1 (* (caddr (cdr (assoc 10 att_bloc_ref)))(cdr (assoc 43 tbl_bloc_sel))))))
               (setq att_bloc_sel (subst (cons 10 nxpt) (assoc 10 att_bloc_sel) att_bloc_sel))
               (setq nxpt (list (+ ptx1 (* (car   (cdr (assoc 11 att_bloc_ref)))(cdr (assoc 41 tbl_bloc_sel))))
                                (+ pty1 (* (cadr  (cdr (assoc 11 att_bloc_ref)))(cdr (assoc 42 tbl_bloc_sel))))
                                (+ ptz1 (* (caddr (cdr (assoc 11 att_bloc_ref)))(cdr (assoc 43 tbl_bloc_sel))))))
               (setq att_bloc_sel (subst (cons 11 nxpt) (assoc 11 att_bloc_sel) att_bloc_sel))
               (setq att_bloc_sel (subst (cons 40 (* (cdr (assoc 40 att_bloc_ref)) (cdr (assoc 41 tbl_bloc_sel)))) (assoc 40 att_bloc_sel) att_bloc_sel))                         ; Mise à jour de la table de l'attribut
               (chg 41)(chg 50)(chg 51)
               (if (cdr (assoc 62 att_bloc_ref))
                 (if (cdr (assoc 62 att_bloc_sel))
                   (chg 62)
                   (setq att_bloc_sel (append att_bloc_sel (list (assoc 62 att_bloc_ref))))
                 )
               )
               (chg 67)(chg 70)(chg 73)(chg 74)
               (entmod att_bloc_sel)                                ; Mettre à jour la table de l'attribut dans la base
               (entupd (cdr (assoc -1 att_bloc_sel)))               ; Mettre à jour l'attibut dans le dessin
               (if (entnext (cdr (assoc -1 att_bloc_ref)))
                 (setq att_bloc_ref (entget (entnext (cdr (assoc -1 att_bloc_ref)))))
               )
               (setq att_bloc_sel (entget (entnext (cdr (assoc -1 att_bloc_sel)))))
             )
             (setq n (1+ n))
           )
           (princ (strcat "\n" (itoa n) " bloc(s) modifié(s)."))
         )
         (alert (strcat "Bloc " nom_bloc " sans attibuts"))
       )
       (alert (strcat "Pas de Bloc " nom_bloc " dans le dessin."))
     )
   )
   (alert "Veuillez sélectionner un bloc.")
 )
 (command "_.undo" "_end")
 (setvar "cmdecho" cmd)
 (princ)
)

(terpri)
(princ "\nATTENTION")
(princ "\nCette commande peut se relever dangereuse. Lors de la décomposition du bloc, puis des modifications, il faut absolument que les attributs, lors de la re-création du bloc, soit au même nombre, et re-sélectionnés dans le même ordre qu'à l'origine !!!")
(princ "\nPour lancer la commande, tapez RAT")
(princ)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Quel est la commande que tu utilises ?

 

Et d'ailleursn utilises-tu une commande d'édition des attributs ou redéfinis-tu ton bloc (moyennant quoi, si tu avais la version pleine, le LSP de Patrick_35 t'aiderait sans doute) ?

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Tu as bien compris mon probléme je veux redéfinir la géométrie de mon attribut

J d'ailleurs essayer de redéfinir mon bloc (mais cela ne marche pas avec les attributs variables)

J essayer attedit et -attedit ( modidification d'attribut global et unique) mais le problème c k'il me modifie un à un les attributs. Moi j'aimerais bien les changer tous d'un coup

 

Au fait merci patrick pour le programme mais sous LT c difficile.et je nai pas les plug comme LT extender ou autre

 

Posté(e)

J’ai bien vu que c’était sous LT mais je me suis dit que cela pouvait aussi intéresser d’autres personnes vu que le sujet était lancé. Je viens de penser que pour t’aider, il est possible de programmer tout simplement un bouton avec les options de la commande –attedit. Il suffirait juste de sélectionner les attributs, puis de cliquer autant de fois que nécessaire

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

une macro c pas une mauvaise idée, mais bon c dommage de pas pouvoir le faire tous d'un coup. (comme un bloc tout bete koi, mais bon)

Au fait ton programme je me le garde au chaud, si une version complète venait a me tomber sous la main.

En tout cas merci de vos réponses. :thumbup:

Posté(e)

J d'ailleurs essayer de redéfinir mon bloc (mais cela ne marche pas avec les attributs variables)

 

Ca me surprend, qu'entends-tu par ATT variable ?!

 

Maintenant les attributs se synchronisent (sur LT2004, je sais pas, suis pas sur).

 

Donc, il n'est pas nécessaire d'exploser pour refaire car on peut répercuter les modifs géométriques en synchronisant (entre nous, c'est un peu l'usine à gaz).

 

Tu l'as pas la synchro (menu Modif -> Objets -> Attributs -> Synchro) ?

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

En fait sous LT il n'ya pas la synchro (dommage)

Par contre je n'expose pas mes blocs. Attribut variable pour moi (je m'exprime mal je sais, moi néofite d'acad) c les att pour lesquel l'on modifie la valeur lors de l'insertion du bloc, un attribut koi (modifiable par la commande Attedit par exemple).

A mon avis le Lt est trop limité pour ce que je veux faire.

En tout cas merci pour l'info

Posté(e)

Si j’ai bien compris !?

Il faut que ton BLOC soit un WBLOC (un fichier DWG sur le disque)

IMPORTANT : en utilisant la commande INSERER il faut donner le chemin du fichier (sinon il prend celui présent dans le dessin), si le Bloc existe il propose de le REDEFINIR. ce qui n’est pas le cas avec design center ou le cliquer/glisser.

Il faut que le BLOC du même nom soit présent dans tous les dessins pour pouvoir faire un SCRIPT.

 

 

Posté(e)

En réponse à CDL

 

Un bloc qui est redéfinit ne l ‘est que pour la partie graphique. Il ne touche absolument pas aux attributs. Il est possible de modifier ses attributs avec –attedit ou encore avec les grips. Si maintenant j’insère un bloc avec des attributs qui a été redéfinit, il sera différent de ceux que je peux voir à l’écran pour ses attributs.

Pour tester, il suffit juste de décomposer un bloc, de changer la couleur des attributs, de le recrée, puis de l’insérer et de voir le résultat.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

 

Bonjour

 

Attention: si on recrée un bloc avec des attributs en plus ou en moins et que l'on insère (par un "Parcourir ...") à nouveau ce bloc/symbole, seulement les nouvelles insertions du bloc/symboles auront les nouveaux attributs (en + ou en -).

 

D'ou l'intérêt de la routine "ATTREDEF.LSP" qui existe depuis AutoCAD R12 et surtout son pendant BATTMAN (Synchroniser) que nous avons depuis la 2000 ...

 

Ces routines/fonctions n'existent pas (A ma connaissance) dans AutoCAD LT (quelle que soit la version) ...

 

Peut être que des outils comme LT-Extender peuvent le faire ???

 

Quelqu'un peut il répondre à ce sujet ???

 

Bye

 

Autodesk Expert Elite Team

Posté(e)

Peut être que des outils comme LT-Extender peuvent le faire ???

 

Quelqu'un peut il répondre à ce sujet ???

 

Je crois qu'il y a (un) peu d'utilisateurs d'extender sur ce site, mais ca doit surement le faire.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Salut Tramber

 

Exact, j’ai oublié le (vl-load-com)

Mais en ce qui concerne le forum, il me semble avoir répondu à la question de notre ami augure

C’est juste pour montrer le principe et qu’on peut accéder d’une autre manière aux propriétés d’un objet avec en plus des fonctionnalités qu’il n’y a pas dans autolisp

 

@+

 

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Oups... mauvais forum pour le post précédent, désolé

 

Bonjour à tous

je suis sur une 2000 avec les express tools et je ne connais pas la commande battman et la commande attredef bug en en disant une fois mes blocs sélectionnées qu'il est sans attributs alors qu'il en possède ou alors je m'y prend mal.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

ATTREDEF, c'est un peu comme redéfinir un bloc à la main ou utiliser EDITREF.

 

Mais ca ne concerne que les blocs avec attributs.

 

Le truc, c'est quand on a plein de bloc dans un dessin (avec attributs mais je suis même pas sur que ca soit une condition sine-qua-non) et qu'on veut le redéfinir en y ajoutant un ou plusieurs attributs, mais aussi de la géométrie.

 

En pratique.

 

Je prends un bloc, je le mets dans un coin et je l'explose. Je redéfini.

Et je ne perds pas les valeurs d'attributs.

 

Si vous faites la même manip avec EDITREF, les anciens blocs ne bougent pas, au niveau des attribut, ainsi vous vous trouvez dans le dessin avec un bloc "monbloc" qui 2 attributs par ci et 3 par là.

 

Mais attention, il faut un nombre minimum d'instance non-explosées, sinon autant redéfinir à l main puisqu'on a aucune valeur à perdre.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité