Aller au contenu

La MACRO qui ne marche qu\'après DEUX clics ???


Messages recommandés

Posté(e)

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 @)

Posté(e)

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]

Posté(e)

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 @)

Posté(e)

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:

Posté(e)

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

Posté(e)

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

Posté(e)
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]

  • 3 semaines après...
Posté(e)

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 @)

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é