Aller au contenu

Mise à jour champs dans bloc


Messages recommandés

Posté(e)

Bonjour

 

J'ai déjà cherché sur le forum mais je n'ai pas trouvé de réponse à mon sujet.

 

Pour mes cycles, j'aimerais créer un bloc composé:

- d'un texte "PP"

- d'un champ "calque" rattaché à ce texte.

 

Comme ça dès que je change mon bloc de calque, le champ prend la valeur du calque de "PP".

 

Mais ça ne fonctionne pas....

J'ai aussi essayé de créer un attribut , mais sans plus de réussite....

 

 

Posté(e)

Salut

 

Je pense que ce lisp devrait t'aider

 

(defun c:chat(/ *errchat* cmd ent err obj sel)

 (defun *errchat* (msg)
   (or (member msg '("Function cancelled" "quit / exit abort" "Fonction annulée"))
     (princ (strcat "\nErreur : " msg))
   )
   (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
   (setq *error* err)
   (setvar "cmdecho" cmd)
   (princ)
 )

 (vl-load-com)
 (setq err *error*
*error* *errchat*
cmd (getvar "cmdecho")
 )
 (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
 (setvar "cmdecho" 0)
 (while (setq ent (nentsel))
   (and (setq sel (vlax-ename->vla-object (car ent)))
 (eq (vla-get-objectname sel) "AcDbAttribute")
 (not (vl-catch-all-error-p (setq obj (vl-catch-all-apply 'vla-objectidtoobject (list (vla-get-database sel) (vla-get-ownerid sel))))))
 (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-textstring (list sel (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-objectid obj)) ">%).Layer>%")))))
     (vl-cmdf "_.UPDATEFIELD" (car ent) "")
   )
 )
 (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
 (setq *error* err)
 (setvar "cmdecho" cmd)
 (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)

Merci Patrick

 

En effet celà fonctionne...mais de façon très surprenante. Je m'explique:

 

- je crée mon bloc avec un attribut "champ" type "calque".

- Si je change le bloc de calque et que je fais regen, rien ne change.

- Je lance le lisp, le champ se met à jour

- je rechange le bloc de calque et je refais un regen et là, miracle, le champ se met à jour !!

 

Je pense que le lisp doit modifier quelque chose dans mon bloc mais qu'est-ce donc ??? :exclam:

 

 

Posté(e)

Salut

Je ne comprends plus ta demande :casstet:

 

Tu es en contradiction.

mais de façon très surprenante
je rechange le bloc de calque et je refais un regen et là, miracle, le champ se met à jour !!

 

 

Je pense que le lisp doit modifier quelque chose dans mon bloc mais qu'est-ce donc ???

Il fait la manip que t'a décrit Rebcao, mais de manière plus simple pour l'utilisateur.

 

@+

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)

Alors je la refais:

 

J'ai un bloc comprenant 2 objets:

- un texte "Jour"

- un champ de type calque qui me donne le calque de l'objet texte "jour".

 

J'ai crée un bloc PP de ces 2 objets.

 

Etape 1: Quand je mets le bloc dans un calque, que je régénère, le champ ne se modifie pas.

Par exemple je mets ce bloc dans le calque "01" et je voudrais avoir "Jour 01".

 

Je lance le lisp de Patrick, je clique sur le bloc dans le calque 01 et là effectivement l'attribut se met à jour et j'obtiens bien "Jour 01".

 

Etape 2: maintenant je change le bloc de calque et je le mets dans "02". Si je régénère là l'attribut se met à jour !!!

 

Le lisp intervient de façon permanente sur le bloc car entre l'étape 1 et 2, je ne fais que charger et appliquer le lisp. Et une fois que le lisp a été exécuté une fois dans le dessin, l'Etape 1 me donne bien le résultat attendu, c'est à dire la modification du champ.

 

Suis-je clair ?

Posté(e)

C'est magique le lisp ;)

 

Il fait simplement la manip que tu ne fais pas. Donner le bon Identifiant, car tu restes sur l'ancien.

 

Démonstration un peu technique :

Quand tu regardes le résultat de la commande liste sur un objet (on peut prendre le bloc qui t'intéresse comme exemple), tu pourras remarquer que tu as un numéro de maintien.

Choix des objets:

REFERENCE DE BLOC Calque: "Test"

Espace: Espace objet

Maintien = f819

Nom du bloc: "ReTest"

en point, X= 853.6884 Y=-109.3230 Z= 0.0000

 

Ce numéro est unique et permet de distinguer chaque objet.

Donc, tu trouves par exemple Maintien = f819

Ce chiffre, tu le convertis avec l'instruction lisp (à taper sur la ligne de commande) (handent "f819"), ce qui donne <Nom d'entité: 7ef8f508>, qui est donc l'identifiant de ton objet (parfois, tu peux lire qu'on parle d'handle ou d'ID, en voici un)

Petite précision pour ceux qui nous lisent, ce résultat est exactement le même qu'avec l'instruction lisp (car (entsel)) sur le même objet.

Ce chiffre hexadécimal, tu le convertis en numérique, ce qui donne 2130244872

Maintenant, quand tu édites ton champ, tu trouveras par exemple comme expression de champ

%<\AcObjProp Object(%<\_ObjId 2130244872>%).Layer>%

Tu dois retrouver le même numéro et tu remarqueras que tu peux aussi lire dans le champ ObjID comme Object identifier

Comme quoi, tout se recoupe :)

 

Je tente de traduire la ligne de champ

AcObjProp --> Object Properties --> Propriétés de l'objet

Object --> Object --> Objet

ObjId --> Object identifier --> Identifiant de l'objet

2130244872 --> Numéro de l'objet

Layer --> Layer --> Calque

 

Donc le champ se comporte en disant qu'il indique le calque de l'objet n°2130244872

 

J'espére avoir été assez clair et que tu n'as pas eu besoin d'aspro ;)

 

@+

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

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é