Aller au contenu

Valeur initial d'un attribut qui modifie d'autre attirbuts


Messages recommandés

Posté(e)

Bonjours

 

Je suis entrain de réaliser un bornier et j'avais dans l'idée de remplir le premier attribut avec la valeur souhaité:1,26,105..ect pour qu'il remplisse automatiquement les autres attributs a l'aide des champs (rajouté +1 au première attribut).

 

Je suis donc parti sur mon premier attribut:

 

Etiquette -> X0

invite -> valeur initial

Par défaut -> 1

 

Et sur l'attribut suivant: X1:

 

Etiquette -> X1

invite -> X0+1

Par defaut -> insérer un champ -> Formule -> insérer un champ -> objet -> "Selection de l'attribut X0" -> Propriété: Valeur -> ok

 

Evaluer-> ok

 

Jusque la je pensé etre bon mais lors se que je teste mon bloc peut importe la valeur par defaut que je donne a X0 rien ne change sur X1

 

Alors j'ai teste METTREAJOURCHAMP OU BATTMAN mais rien ne change

 

Si vous voyez où je me suis trompé ?

AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo

Posté(e)

Bien j'ai compris que si je met le tous en bloc et que je lui assigne une action dynamique.

 

Après insertion, utilisation de la dynamique et une regen alors les attribut avec champ -> objet -> valeur, devienne fonctionnel.

 

Alors ma question est: n'y a t'il pas possibilité lors de l'utilisation d'un champs -> objet -> valeur sur d'autre attribut de mettre a jours les attribut sans faire une action dynamique ?

AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo

Posté(e)

Salut,

 

A tu regarder du coté des tables de blocs?

 

Car tu peux lier tes champs à une visibilité ou a un état.

 

Cordialement

"98% des soucis informatiques sont assis entre la chaise et le bureau !"

 

"C'est parce que la vitesse de la lumière est supérieure à celle du son que tant de gens paraissent brillants avant d'avoir l'air con."
Posté(e)

Bien j'ai compris que si je met le tous en bloc et que je lui assigne une action dynamique.

 

Après insertion, utilisation de la dynamique et une regen alors les attribut avec champ -> objet -> valeur, devienne fonctionnel.

 

Alors ma question est: n'y a t'il pas possibilité lors de l'utilisation d'un champs -> objet -> valeur sur d'autre attribut de mettre a jours les attribut sans faire une action dynamique ?

Bonjour,

 

Ton histoire m'a intrigué et j'ai essayé de reproduire ce que tu relate.

Effectivement le fait d'attribuer une action dynamique ET de l'activer au moins une fois après l'insertion rend les champs fonctionnel. (assez étrange ce comportement!)

 

Sans faire d'action dynamique, il y a peut être une solution..., va t-elle te convenir?

 

En fait il ne faut pas définir le champ dynamique pour l'étiquette X1 lors de la définition du bloc.

 

C'est après l'insertion du bloc que tu défini le champ en double-cliquant sur l'attribut X1 pour ouvrir l'éditeur d'attribut, et là tu défini ton champ dynamique (click-droit dans le champ valeur et "insérer un champ")

dans formule mettre 1+ (et refaire click-droit pour insérer encore un champ)

Choisir objet et sélectionner ton insertion de bloc et prendre X0 dans la liste proposée.

Retour à la formule (on peut faire évaluer pour voir le résultat) et OK.

 

Ce que je suggére alors et de ne plus utiliser inserer (car tu serais obligé de refaire la manip ci-dessus à chaque fois, fastidieux!...), mais de copier ton bloc (avec copier ou l'utilisation des grips)

 

Une fois les copies faites tu double-clique sur l'attribut X0 pour mettre la valeurs qui t'intéresse, X1 suivra lors de la mise à jour du champ ou un regen.

Cette méthode peut bien faire l'affaire et être aussi rapide qu'une insertion si les échelles/orientations sont toujours les mêmes.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Nkz69

 

A tu regarder du coté des tables de blocs?

 

Car tu peux lier tes champs à une visibilité ou a un état.

 

Je voudrais juste lier le champs "objet-> valeur" sans utiliser de dynamique, et je ne vois pas en quoi une table de consultation me permettra de simplifié par rapport a une action déplacé ou visuel car mon objectif et juste d'utilisé se champ sans dynamique.

 

bonuscad

 

En fait il ne faut pas définir le champ dynamique pour l'étiquette X1 lors de la définition du bloc.

 

Je vois le principe, c'est applicable mais pas utilisable pour mes collègues, mon but était juste de faire une bornier facile d'utilisation par n'importe qui. Merci de l'information je vais voire si je peut en faire quelque chose mais je ne pense pas l'utilisé en entreprise.

 

Cela me bloque qu'un champs "d'objet -> valeur" ne soit pas actualisable autrement dans un bloc, comme si dans excel je faisais cellules A1=Z1 et que je doive changer de feuille pour actualiser la saisie.

AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo

Posté(e)

Salut Flobott,

 

Je ne suis pas sur qu'intervenir sur un objet puisse faire que ta valeur change automatiquement... Ou alors avec une routine qui mettrai à jour les champs une fois ton nombre d'objets mis en place.

 

Sinon en plus simple tu a le LISP de "Grand master Jedi du LISP (Gile)" qui te permet d'incrémenter tes valeurs, mais si tu veux un truc automatique qui change les champs tout seul en fonction d'une action sur un objet de "base", je ne vois pas...

 

 

Cordialement

 

 

EDIT : Je viens de faire ce que tu demande, mais avec deux blocs. Un qui pilote et plusieurs qui sont pilotés et ça fonctionne très bien :o , par contre tu ne pas faire cela avec un seul bloc sinon il boucle sur lui même et du coup (comme dans excel puisque c'est ton repère) il t'affiche un soucis :) Normal, tu ne peux pas mettre à la fois le bloc en référence et mettre cette référence par rapport à ce même bloc sinon il tourne en rond (o_O')

 

Donc t'était bien partis avec ton idée de départ mais faut juste deux blocs :) Puis tu modifie ton bloc "pilote" et un coup de RGT pour mettre à jour les autres champs ;)

 

Lien de l'exemple : https://we.tl/x2yOQvfjbv

"98% des soucis informatiques sont assis entre la chaise et le bureau !"

 

"C'est parce que la vitesse de la lumière est supérieure à celle du son que tant de gens paraissent brillants avant d'avoir l'air con."
Posté(e)

Ok je commence a comprendre le principe, le bouclage est rompus avec le fait d'utiliser la dynamique et cela doit redéfinir le bloc, c'est pour cela que je peut utilisé le champs d'objet avec valeur après action dynamique.

 

Je viens de tester avec deux blocs cela fonction parfaitement après une regen.

 

Donc j'ai soit la possibilité d'utiliser un bloc dynamique ou l'interaction des champs entre deux blocs

 

Je viens de me rendre compte qu'avec ma façon d’intégré les blocs (je glisse mon fichier bloc.dwg sur mon écran AutoCAD) il me recrée un bloc de ces deux bloc donc je suis obligé de décomposé une fois avant d’effectuer ma manipulation et de regen se qui reviens au même nombre de manipulation qu'avec la dynamique. Donc même si j’intègre les deux bloc séparément cela me donne tjrs un nombre d'action supérieur à: j'insert, je rempli, je regen.

 

Merci NKz69 pour la réflexion et l’approfondissement des champs d'attribut, je vais continué a chercher une solution en trois actions car sinon je vais passé plus de temps a expliqué, là il faut faire ainsi, là c'est différent, multiplié par le nombres de blocs et de personnes, faut que cela soit plus simple.

 

NKz69

 

Sinon en plus simple tu a le LISP de "Grand master Jedi du LISP (Gile)" qui te permet d'incrémenter tes valeurs, mais si tu veux un truc automatique qui change les champs tout seul en fonction d'une action sur un objet de "base", je ne vois pas...

 

J'ai déjà un lisp d'incrémentation fait maison, et je fait avec, je voulais juste pouvoir placer dans mes blocs câble déjà existant une numérisation automatique ou je n'est plus qu'a remplir un champ pour que les autres se remplisse automatiquement.

 

Que je n'ai plus qu'à poser mon bloc, le renseigner et le regen.

AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo

Posté(e)

Comme suggéré, le lisp peut enlever cette barrière.

Je te donne un code en exemple et comme j'ai voulu faire un exemple qui fonctionne (même dans un nouveau dessin vierge), il peut sembler complexe car je fabrique tout (du bloc aux insertions) par (entmake) mais en fait la partie intéressante est celle-ci:

 

(foreach a (vlax-invoke (vlax-ename->vla-object (entlast)) 'GetAttributes)
   (cond
     ((= (vla-get-TagString a) "X0")
       (setq
         val_tagX (vla-get-TextString a)
         id_att (vla-get-ObjectID a)
       )
     )
     ((= (vla-get-TagString a) "X1")
       (vla-put-TextString a
         (strcat
           "%<\\AcExpr (1+"
           "%<\\AcObjProp Object(%<\\_ObjId "
           (itoa id_att)
           ">%).TextString>%"
           ")>%"
         )
       )
     )
   )
 )

 

Pour toi, il peut être très simple d'utiliser la commande inserer (donc sans utiliser entmake) dans le lisp avec ton propre bloc et de prendre la suite donnée ci dessus. (il faut juste veiller à prendre la bonne valeur d'étiquette "X0" et "X1")

LE LISP DE TEST

(defun make_blk_bornier ( / )
 (if (not (tblsearch "STYLE" "$BLK_BORNIER"))
   (entmake 
     '(
       (0 . "STYLE")
       (5 . "40")
       (100 . "AcDbSymbolTableRecord")
       (100 . "AcDbTextStyleTableRecord")
       (2 . "$BLK_BORNIER")
       (70 . 0)
       (40 . 0.0)
       (41 . 1.0)
       (50 . 0.0)
       (71 . 0)
       (42 . 0.1)
       (3 . "ARIAL.TTF")
       (4 . "")
     )
   )
 )
 (if (not (tblsearch "BLOCK" "BORNIER"))
   (progn
     (entmake
       '(
         (0 . "BLOCK")
         (8 . "0")
         (2 . "BORNIER")
         (70 . 2)
         (4 . "")
         (8 . "0")
         (62 . 0)
         (6 . "ByBlock")
         (370 . -2)
         (10 0.0 0.0 0.0)
       )
     )
     (entmake
       '(
         (0 . "LWPOLYLINE")
         (100 . "AcDbEntity")
         (67 . 0)
         (410 . "Model")
         (8 . "0")
         (62 . 0)
         (6 . "ByBlock")
         (370 . -2)
         (100 . "AcDbPolyline")
         (90 . 4)
         (70 . 1)
         (43 . 0.0)
         (38 . 0.0)
         (39 . 0.0)
         (10 -0.5 -0.5)
         (40 . 0.0)
         (41 . 0.0)
         (42 . 0.0)
         (91 . 0)
         (10 0.5 -0.5)
         (40 . 0.0)
         (41 . 0.0)
         (42 . 0.0)
         (91 . 0)
         (10 0.5 0.5)
         (40 . 0.0)
         (41 . 0.0)
         (42 . 0.0)
         (91 . 0)
         (10 -0.5 0.5)
         (40 . 0.0)
         (41 . 0.0)
         (42 . 0.0)
         (91 . 0)
         (210 0.0 0.0 1.0)
       )
     )
     (entmake
       '(
         (0 . "ATTDEF")
         (100 . "AcDbEntity")
         (67 . 0)
         (410 . "Model")
         (8 . "0")
         (62 . 0)
         (6 . "ByBlock")
         (370 . -2)
         (100 . "AcDbText")
         (10 -0.170873 0.209209 0.0)
         (40 . 0.2)
         (1 . "1")
         (50 . 0.0)
         (41 . 1.0)
         (51 . 0.0)
         (7 . "$BLK_BORNIER")
         (71 . 0)
         (72 . 1)
         (11 0.0 0.15 0.0)
         (210 0.0 0.0 1.0)
         (100 . "AcDbAttributeDefinition")
         (280 . 0)
         (3 . "valeur initial")
         (2 . "X0")
         (70 . 0)
         (73 . 0)
         (74 . 1)
         (280 . 1)
       )
     )
     (entmake
       '(
         (0 . "ATTDEF")
         (100 . "AcDbEntity")
         (67 . 0)
         (410 . "Model")
         (8 . "0")
         (62 . 0)
         (6 . "ByBlock")
         (370 . -2)
         (100 . "AcDbText")
         (10 -0.170873 -0.35 0.0)
         (40 . 0.2)
         (1 . "")
         (50 . 0.0)
         (41 . 1.0)
         (51 . 0.0)
         (7 . "$BLK_BORNIER")
         (71 . 0)
         (72 . 1)
         (11 0.0 -0.15 0.0)
         (210 0.0 0.0 1.0)
         (100 . "AcDbAttributeDefinition")
         (280 . 0)
         (3 . "X0+1")
         (2 . "X1")
         (70 . 0)
         (73 . 0)
         (74 . 3)
         (280 . 1)
       )
     )
     (entmake
       '(
         (0 . "ENDBLK")
         (8 . "0")
         (62 . 0)
         (6 . "ByBlock")
         (370 . -2)
       )
     )
   )
 )
)
(defun c:bornier ( / pt_ins scal_ins ang_ins value_tag val_tagX id_att)
 (if (not (tblsearch "BLOCK" "BORNIER"))
   (make_blk_bornier)
 )
 (initget 9)
 (setq pt_ins (getpoint "\nPoint d'insertion du bloc bornier?: "))
 (initget 6)
 (setq scal_ins (getdist pt_ins "\nEchelle d'insertion du bloc? <1>: "))
 (if (not scal_ins) (setq scal_ins 1.0))
 (setq ang_ins (getangle pt_ins "\nAngle d'insertion du bloc? <0>: "))
 (if (not ang_ins) (setq ang_ins 0.0))
 (setq ang_ins (+ ang_ins (angle '(0 0 0) (getvar "UCSXDIR"))))
 (initget 1)
 (setq value_tag (getint "\nValeur Entière de l'attribut?: "))
 (entmake
   (list
     (cons 0 "INSERT")
     (cons 100 "AcDbEntity")
     (cons 67 (getvar "TILEMODE"))
     (cons 410 (getvar "CTAB"))
     (cons 8 (getvar "CLAYER"))
     (cons 100 "AcDbBlockReference")
     (cons 66 1)
     (cons 2 "BORNIER")
     (cons 10 (trans pt_ins 1 0))
     (cons 41 scal_ins)
     (cons 42 scal_ins)
     (cons 43 scal_ins)
     (cons 50 ang_ins)
     (cons 210 (trans '(0 0 1) 1 0 T))
   )
 )
 (entmake
   (list
     (cons 0 "ATTRIB")
     (cons 100 "AcDbEntity")
     (cons 67 (getvar "TILEMODE"))
     (cons 410 (getvar "CTAB"))
     (cons 8 (getvar "CLAYER"))
     (cons 100 "AcDbText")
     (cons 10 (polar (trans pt_ins 1 0) (+ ang_ins (/ pi 2)) (* 0.15 scal_ins)))
     (cons 40 (* scal_ins (getvar "TEXTSIZE")))
     (cons 1 (itoa value_tag))
     (cons 50 ang_ins)
     (cons 41 1.0)
     (cons 51 0.0)
     (cons 7 "$BLK_BORNIER")
     (cons 71 0)
     (cons 72 1)
     (cons 11 (polar (trans pt_ins 1 0) (+ ang_ins (/ pi 2)) (* 0.15 scal_ins)))
     (cons 210 (trans '(0 0 1) 1 0 T))
     (cons 100 "AcDbAttribute")
     (cons 2 "X0")
     (cons 70 0)
     (cons 73 0)
     (cons 74 1)
   )
 )
 (entmake
   (list
     (cons 0 "ATTRIB")
     (cons 100 "AcDbEntity")
     (cons 67 (getvar "TILEMODE"))
     (cons 410 (getvar "CTAB"))
     (cons 8 (getvar "CLAYER"))
     (cons 100 "AcDbText")
     (cons 10 (polar (trans pt_ins 1 0) (- ang_ins (/ pi 2)) (* 0.15 scal_ins)))
     (cons 40 (* scal_ins (getvar "TEXTSIZE")))
     (cons 1 "")
     (cons 50 ang_ins)
     (cons 41 1.0)
     (cons 51 0.0)
     (cons 7 "$BLK_BORNIER")
     (cons 71 0)
     (cons 72 1)
     (cons 11 (polar (trans pt_ins 1 0) (- ang_ins (/ pi 2)) (* 0.15 scal_ins)))
     (cons 210 (trans '(0 0 1) 1 0 T))
     (cons 100 "AcDbAttribute")
     (cons 2 "X1")
     (cons 70 0)
     (cons 73 0)
     (cons 74 3)
   )
 )
 (entmake
   (list
     (cons 0 "SEQEND")
     (cons 8 (getvar "CLAYER"))
     (cons 62 0)
     (cons 6 "ByBlock")
     (cons 370 -2)
   )
 )
 (foreach a (vlax-invoke (vlax-ename->vla-object (entlast)) 'GetAttributes)
   (cond
     ((= (vla-get-TagString a) "X0")
       (setq
         val_tagX (vla-get-TextString a)
         id_att (vla-get-ObjectID a)
       )
     )
     ((= (vla-get-TagString a) "X1")
       (vla-put-TextString a
         (strcat
           "%<\\AcExpr (1+"
           "%<\\AcObjProp Object(%<\\_ObjId "
           (itoa id_att)
           ">%).TextString>%"
           ")>%"
         )
       )
     )
   )
 )
 (prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Aoutch, mais merci :)

 

Bonuscad

 

Comme suggéré, le lisp peut enlever cette barrière.

Je te donne un code en exemple et comme j'ai voulu faire un exemple qui fonctionne (même dans un nouveau dessin vierge), il peut sembler complexe car je fabrique tout (du bloc aux insertions) par (entmake) mais en fait la partie intéressante est celle-ci:

 

Je te remercie, je t'avouerai que j'ai trouvais la suite impressionnante, je ne m'attendais pas a se que l'on me sorte un lisp d'exemple ^^

 

Je vais voire car comme NKz69 m'avais dit de voire du cote lisp, j'ai commencé a chercher comment faire un lisp et j'ai attaqué "Introduction à AutoLISP" de Gilles hier un peu avant ton message, alors je vais terminer l'introduction et je pourrais surement faire se que je souhaite grâce a ton exemple de lisp.

 

Car la actuellement a par charger un lisp je n'avais jamais eu le temps d’approfondir le sujet.

 

PS: Qu'est-ce que: "entmake" ?

AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo

Posté(e)
PS: Qu'est-ce que: "entmake" ?

"entmake" que l'on pourrait comprendre "entities make" -> Créer une entité/objet

 

Elle permet de créer directement dans la base de données (sans passer par l'interface graphique) un objet du dessin (une ligne, un cercle, un calque, un style de texte etc..)

C'est le substitut de la commande de création d'objet que tu lance a travers la ligne de commande, palette, menu.

L'avantage est la rapidité d'exécution et que tu t’affranchis de contrôler l'environnement du dessin actuel (état des variables qui peuvent avoir une influence lorsque tu utilise les commandes natives.) car j'aurais pus utiliser par exemple (command "ligne" '(0.0 0.0 0.0) '(1.0 5.0 0.0) "")

A la différence est qu'avec command la ligne aurait été crée dans le calque courant. Il aurait fallu que j'utilise avant (command "calque"...) avec les bonnes options pour me positionner comme il faut, avec entmake tout est fixé dans la liste soumise à l'exécution.

La liste soumise est pratiquement identique à la liste retournée par la fonction

(entget (car (entsel)))

(choisir un objet dessiné.)

 

J'ai fais cela, mais j'aurais pu joindre un DWG à la place de faire des entmake :(rires forts):

Mais là pas de pièce jointe, tout est dans le code!

 

(entmake) est la méthode de création depuis qu'autolisp existe. Depuis il y a d'autre méthode (vla-add[type d'objet à créer] ....). Personnellement j'utilise les deux, elles ont chacune leur avantages/inconvénients.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é