Flobott Posté(e) le 14 février 2017 Posté(e) le 14 février 2017 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 -> X0invite -> valeur initialPar défaut -> 1 Et sur l'attribut suivant: X1: Etiquette -> X1invite -> X0+1Par 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é ? Citer AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo
Flobott Posté(e) le 15 février 2017 Auteur Posté(e) le 15 février 2017 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 ? Citer AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo
nG! Hebus Posté(e) le 16 février 2017 Posté(e) le 16 février 2017 Salut, A tu regarder du coté des tables de blocs? Car tu peux lier tes champs à une visibilité ou a un état. Cordialement Citer "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."
bonuscad Posté(e) le 16 février 2017 Posté(e) le 16 février 2017 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. Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Flobott Posté(e) le 20 février 2017 Auteur Posté(e) le 20 février 2017 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. Citer AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo
nG! Hebus Posté(e) le 21 février 2017 Posté(e) le 21 février 2017 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 Citer "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."
Flobott Posté(e) le 21 février 2017 Auteur Posté(e) le 21 février 2017 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. Citer AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo
bonuscad Posté(e) le 21 février 2017 Posté(e) le 21 février 2017 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) ) Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Flobott Posté(e) le 22 février 2017 Auteur Posté(e) le 22 février 2017 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" ? Citer AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo
bonuscad Posté(e) le 22 février 2017 Posté(e) le 22 février 2017 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. Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Messages recommandés