rebcao Posté(e) le 4 novembre 2010 Posté(e) le 4 novembre 2010 Bonjour à Toutes et à Tous, Ce n'est pas la première fois que je suis confronté à ce genre de MACRO qui ne fonctionne correctement qu'après avoir cliqué une 2ème fois sur la MACRO pour que les calculs soient pris en compte... Vous constaterez en bas à gauche de la barre d'état s'affiche l'état des valeurs pour la variable USERI5 et la valeur de CTAB (onglet présentation en cours) Voici cette MACRO ^c^cuseri5;$m=$(getvar,ctab);_-layer;E;$m=$(getvar,useri5)-FIL;;modemacro;Useri=>$(getvar,useri5)---Présentation=>$(getvar,ctab); Pour pouvoir la tester, il faut créer une présentation et lui donner un NOM correspondant à un chiffre 1, 2, 3, etc. Se placer dans un des onglets et le BUT et de rendre courant le bon calque xx-FIL correspondant au N° de la présentation en cours... Changer d'onglet, cliquer sur la MACRO, regarder bien le nom du calque courant et l'info de la barre d'état, recliquer une 2ème fois et la c'est BON !!! Christian [Edité le 4/11/2010 par rebcao] 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 @)
lili2006 Posté(e) le 4 novembre 2010 Posté(e) le 4 novembre 2010 Bonjour à toutes et tous, Salut Christian, Pareil chez moi ! PS: Quel est le but de cette macro ? Merci d'avance, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
bryce Posté(e) le 4 novembre 2010 Posté(e) le 4 novembre 2010 Bonjour, Avec quelques guillemets, la solution : ^c^cuseri5;$m=$(getvar,ctab);_-layer;E;[surligneur]"[/surligneur]$m=$(getvar,useri5)[surligneur]"[/surligneur]-FIL;;modemacro;Useri=>[surligneur]"[/surligneur]$(getvar,useri5)[surligneur]"[/surligneur]---Présentation=>$(getvar,ctab); ;) [Edité le 4/11/2010 par bryce] Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
lili2006 Posté(e) le 4 novembre 2010 Posté(e) le 4 novembre 2010 Re, Brice, chez moi => Commande: useri5Entrez une nouvelle valeur pour USERI5 : Présentation1Nécessite un entier entre -32768 et 32767. Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
bryce Posté(e) le 4 novembre 2010 Posté(e) le 4 novembre 2010 Je cite Christian :Pour pouvoir la tester, il faut créer une présentation et lui donner un NOM correspondant à un chiffre 1, 2, 3, etc. :casstet: Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
lili2006 Posté(e) le 4 novembre 2010 Posté(e) le 4 novembre 2010 Re, Oups, désolé, j'avais changé de fichier test entre tps,... :cool: Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
rebcao Posté(e) le 4 novembre 2010 Auteur Posté(e) le 4 novembre 2010 Bonsoir, Effectivement avec les guillemets ça marche... Mais c'est pas logique ! Certaines MACROS ne présentent pas ce genre de défaut ... C'est comme les variables de chemin qui présente un \ la MACRO attend une suite... Merci Le but de la MACRO Lilian, c'est que l'utilisateur ne soit pas obligé de chercher dans sa liste de calques, le bon calque N° FOLIO-FIL en sachant que certains dessins contiennent jusqu'à 200 FOLIOS et pour chaque N° de FOLIO il y a 6 calques associés au N° de FOLIO... Le tout avec une version LT.... Tu vois le problème ? En fait y a pas de problème... Avec une LT, il n'y a que des solutions dans la mesure de ses très grandes possibilités... 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 @)
bryce Posté(e) le 4 novembre 2010 Posté(e) le 4 novembre 2010 Je dirais que c'est relativement logique une fois qu'on a compris comment fonctionne l'interpréteur DIESEL, ce qui n'est pas évident... :P La seule explication que j'ai trouvée et qui m'a aidé à piger le truc est en anglais sur cette page:http://members.iinet.net.au/~bigbyte/diesel.htm Evaluation Sequence If you start to write your own DIESEL macros sooner or later you will come across an extremely frustrating idiosyncrasy of the DIESEL macro language. That is the order in which DIESEL expressions are evaluated. As an example lets look at how DIESEL evaluates the following macro ^C^C_id;\_setenv;pt1;$m=$(getvar,lastpoint);_line;$(getenv,pt1);\; Looking at the above example one would expect it to be evaluated like this: * The _id command is issued with a backspace pausing the macro to allow the user to pick a point on the screen. * The _setenv command is then issued to save the value of the system variable lastpoint to a variable named pt1. * The _line command is the issued and the value of pt1 retrieved as the first point and another backspace pausing for the User to pick the second point. What actually happens can be seen by setting the system variable macrotrace to 1 (on). This displays all DIESEL expressions and there results on the command line. This is what would be seen if the above macro was run with macrotrace on. Command: _id Point: X = 5.8769 Y = 6.1587 Z = 0.0000 Command: _setenv Variable name: pt1 Value <6.22905364,5.59305622,0>: Eval: $(GETVAR, lastpoint) ===> 5.87689209,6.1586937,0 Eval: $(GETENV, pt1) ===> 6.22905364,5.59305622,0 5.87689209,6.1586937,0 Command: _line From point: 6.22905364,5.59305622,0 To point: What is all this telling us. Compare the co-ordinates returned by the _id command with the co-ordinates used as the from point in the _line command. It is a different point so what is going wrong. Nothing! This is how DIESEL macros are evaluated by AutoCAD. Let me explain * The macro is copied directly to the command processor until the charactors '$m=' are encountered which indicates that a DIESEL expression follows. The remainer of the macro is passed to the DIESEL interpreter and evaluated and the result passed to the command processor * The end result is that value of pt1 as used by the _line command is returned BEFORE pt1 has been set to the value of lastpoint. In actual fact the first time you run a example macro it will fail altogather because pt1 has not been initialised and will return null So if this is how DIESEL expressions are evaluated but it is not what we want what are we going to do about it. We enclose the second DIESEL function with quotes (") like so: ^C^C_id;\_setenv;pt1;$m=$(getvar,lastpoint);_line;"$m=$(getenv,pt1)";\; the output with macrotrace on would now be Command: _id Point: X = 6.2291 Y = 6.1740 Z = 0.0000 Command: _setenv Variable name: pt1 Value <11.69521383,5.71535621,0>: Eval: $(GETVAR, lastpoint) ===> 6.22905364,6.1739812,0 6.22905364,6.1739812,0 Command: _line From point: Eval: $(GETENV, pt1) ===> 6.22905364,6.1739812,0 6.22905364,6.1739812,0 To point: The addition of the pair of quotes prevents the DIESEL interpreter from evaluating the second expression. After evaluating the first expression the second expression is passed back to the command processor minus the pair of quotes. The command processor then continues with the _line command before the second '$m=' charactor sequence is encountered and the remainder of the macro is again passed the the DIESEL interpreter this time returning the new value of pt1 As a pair of quotes are discarded each time the macro is passed to the DIESEL interpreter each level of nesting requires an additional pair of quotes. Also you must preceed all nested DIESEL expressions with $m= to call the DIESEL interpreter unlike in the first example where the second DIESEL function opened with $( Note: I do not pretend to be an expert on this subject as I still find it very difficult to get complex macros to be evaluated in the sequence desired. The evaluation sequence I have explained here is merely my observations and will gladly stand corrected if I anyone has a better explanation. En gros, [surligneur]dès que l'interpréteur rencontre la première expression DIESEL, il évalue l'ensemble des expressions DIESEL suivantes avant de reprendre la macro après la première expression[/surligneur].Dans le cas de ta macro, il évalue donc $(getvar,ctab) ET $(getvar,useri5) AVANT de revenir renseigner useri5 et reprendre l'évaluation de la suite de la macro, d'où le décalage. Le fait de mettre $(getvar,useri5) entre guillemets empêche l'interpréteur d'évaluer l'expression la première fois; l'expression est renvoyée comme une simple chaîne, ce qui fait qu'elle ne sera évaluée qu'au 2nd passage, APRES que la variable useri5 ait été renseignée avec la valeur de ctab. Pas évident à expliquer... :casstet: Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
lili2006 Posté(e) le 4 novembre 2010 Posté(e) le 4 novembre 2010 Re, Tu vois le problème ? En fait y a pas de problème... Avec une LT, il n'y a que des solutions Avec toi ? Très vraisemblablement,.. :P @+, PS: Je te donne bientôt des nouvelles,.. Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
bonuscad Posté(e) le 4 novembre 2010 Posté(e) le 4 novembre 2010 une fois qu'on a compris comment fonctionne l'interpréteur DIESEL, ce qui n'est pas évident... En tout cas tes explications et ton lien peuvent bien expliquer des choses, voir ce sujet , que j'avais abordé, qui trouvait les constats. info à retenir, merci bryce (de nice) ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
bryce Posté(e) le 4 novembre 2010 Posté(e) le 4 novembre 2010 Oui, dans le sujet auquel tu fais référence, c'est exactement la même cause... et le même remède. :) Comme cette section du forum n'est pas la plus animée, je vais me permettre d'exhumer ce vieux sujet... :P Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
bonuscad Posté(e) le 4 novembre 2010 Posté(e) le 4 novembre 2010 ce qui fait qu'elle ne sera évaluée qu'au 2nd passage Ce qui fais me demander (sans avoir testé) si on peut ainsi doubler les guillemets pour s'imbriquer en profondeur d'exécution ?... et pour C'est comme les variables de chemin qui présente un \ la MACRO attend une suite... pour les paramètres de filtre sur des caractères spéciaux comme [surligneur]\ ou * [/surligneur] dans une chaine de caractère il faut quoter [surligneur] ' [/surligneur] (touche 4 du pavé alpha) le caractère.Peut être qu'en Diesel c'est le même principe !... par contre pour insérer ce caractère dans la variable :P J'ai pas essayé non plus mon dire . :exclam: bryce m'a un peu réconcilier avec le diesel :D encore merci à lui. [Edité le 4/11/2010 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
bryce Posté(e) le 4 novembre 2010 Posté(e) le 4 novembre 2010 Ce qui fais me demander (sans avoir testé) si on peut ainsi doubler les guillemets pour s'imbriquer en profondeur d'exécution ?...Oui, on peut. Exemple :^C^C_.snapang;\_.userr1;$M=$(getvar,snapang);_.snapang;\_.userr2;"$M=$(getvar,snapang)";_.snapang;\_.userr3;""$M=$(getvar,snapang)""; Pour ce qui est du \, c'est clair que c'est pénible.Par exemple, comme le dit Christian, pas moyen de faire fonctionner cette simple macro :^C^C-texte;\;;$M=$(getvar,dwgprefix); Par contre dans certains cas on peut utiliser le code %%92, par exemple :^C^C-texte;\;;oh le joli %%92; [Edité le 4/11/2010 par bryce] Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
rebcao Posté(e) le 22 novembre 2010 Auteur Posté(e) le 22 novembre 2010 Bonjour, Pas clair du tout cette syntaxe !!! Avec le " guillemet c'est comme le clignotant belge ! Parfois ça marche parfois ça marche pas ! En effet, à plusieurs reprise lorsque j'utilise des " la fonction DIESEL plante !!! Je pensais que l'informatique était basée le mode VRAI ou FAUX... des 0 et des 1... Il faut rajouter le mode PEUT ETRE ! 0 + 1 = 2... Christian [Edité le 22/11/2010 par rebcao] 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 @)
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