ldidber Posté(e) le 27 février 2008 Posté(e) le 27 février 2008 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....
rebcao Posté(e) le 27 février 2008 Posté(e) le 27 février 2008 Sans bidouille, Il faut utiliser des champs, mais ça reste fastidieux... Prendre le champ de TYPE OBJET, choisir l'objet et dans PROPRIETES choisir CALQUE. à creuser ! Christian Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)
ldidber Posté(e) le 27 février 2008 Auteur Posté(e) le 27 février 2008 Oui c'est ce que j'ai fait mais pas de mise à jour du champs...(les options de mise à jour de champs dans Autocad sont activées)
Patrick_35 Posté(e) le 27 février 2008 Posté(e) le 27 février 2008 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
ldidber Posté(e) le 28 février 2008 Auteur Posté(e) le 28 février 2008 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:
Patrick_35 Posté(e) le 28 février 2008 Posté(e) le 28 février 2008 SalutJe ne comprends plus ta demande :casstet: Tu es en contradiction.mais de façon très surprenanteje 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
ldidber Posté(e) le 28 février 2008 Auteur Posté(e) le 28 février 2008 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 ?
Patrick_35 Posté(e) le 28 février 2008 Posté(e) le 28 février 2008 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 = f819Ce 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 2130244872Maintenant, 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 identifierComme quoi, tout se recoupe :) Je tente de traduire la ligne de champAcObjProp --> Object Properties --> Propriétés de l'objetObject --> Object --> ObjetObjId --> Object identifier --> Identifiant de l'objet2130244872 --> Numéro de l'objetLayer --> 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant