Vous êtes sur la page 1sur 16

Jean-Pierre Couwenbergh

guide de rfrence

Programmer AutoCAD
avec DIESEL, AutoLISP, DLC et VBA

Groupe Eyrolles, 2006 ISBN 2-212-11597-0

Chapitre 2

Le langage DIESEL

Principe
Le langage DIESEL (Direct Interpretively Evaluated String Expression Language) permet dune part de modifier la ligne dtat dAutoCAD, laide de la variable systme MODEMACRO. Dautre part, dans les options de menu, on peut le substituer AutoLISP et sen servir comme langage de macro-commandes. Les expressions DIESEL reconnaissent les chanes et gnrent des rsultats.

Utilisation du langage DIESEL pour modifier la ligne dtat


La ligne dtat (fig.2.1) permet dindiquer lutilisateur des informations importantes sans interrompre le travail. La variable systme MODEMACRO contrle la zone dfinie par lutilisateur sur la ligne dtat. La valeur calcule de la variable systme MODEMACRO est affiche dans un panneau align gauche dans la barre dtat, au bas de la fentre dAutoCAD. Cette variable est une chane vide lorsque vous dmarrez AutoCAD. Sa valeur nest enregistre nulle part (dessin, fichier de configuration, etc.). Le nombre de caractres pouvant tre affichs sur la ligne dtat est limit uniquement par la taille de la fentre dAutoCAD (et de votre moniteur). Les panneaux par dfaut se dplacent vers la droite au fur et mesure que le contenu du panneau MODEMACRO saccrot. Il est possible de repousser hors de lcran les panneaux par dfaut. Vous pouvez utiliser la variable systme MODEMACRO pour afficher sur la ligne dtat la plupart des donnes connues dAutoCAD. Ses fonctionnalits de calcul, daide la dcision et ddition vous permettent dadapter la ligne dtat vos spcifications.
Ligne dtat standard

Fig.2.1

96

Programmer AutoCAD

MODEMACRO est une variable de chane dutilisateur. Elle peut tre affecte nimporte quelle valeur de chane. La longueur maximale de la chane est de 4095 caractres. Il est possible de dfinir MODEMACRO laide de la commande MODIFVAR ou en entrant MODEMACRO linvite de la ligne de commande. En modifiant la valeur de MODEMACRO, vous pourrez utiliser diffrents formats de ligne dtat. En revanche, le nombre maximal de caractres que vous pourrez alors entrer est de 255. Si vous dfinissez MODEMACRO sur une chane vide en entrant un point (.), AutoCAD affiche la ligne dtat standard. La variable MODEMACRO la plus simple (et la moins utile) correspond du texte constant. Par exemple, pour afficher un nom de socit sur la ligne dtat, on peut entrer :
Commande : modemacro

Entrez une nouvelle valeur pour MODEMACRO ou . pour aucune (Enter new value for MODEMACRO, or . for none () <""> : EYROLLES Le texte EYROLLES apparat prsent dans la barre dtat (fig.2.2).

Nouveau texte : EYROLLES

Fig.2.2

Cette valeur de MODEMACRO affiche toujours le mme texte ; la ligne dtat nindique pas les modifications internes apportes dans AutoCAD. Elle ne change pas tant que lon ne modifie pas MODEMACRO. Pour que cette ligne indique ltat actuel dun lment dAutoCAD, il convient dinsrer des expressions de type macro-commandes en utilisant le langage DIESEL. Ces expressions ont le format suivant :
$(fonction, arg1, arg2, ...)

Dans cette expression, fonction est le nom de la fonction DIESEL (semblable au nom dune fonction AutoLISP) et arg1, arg2, etc., sont des arguments de cette fonction, interprts suivant la dfinition de la fonction. Contrairement AutoLISP, les

2. Le langage DIESEL

97

expressions de macro DIESEL nacceptent quun seul type de donnes : des chanes de caractres. Les macros qui permettent de traiter des chiffres expriment ces derniers sous la forme de chanes de caractres et oprent les conversions ncessaires. En particulier, la fonction DIESEL $(getvar) rcupre la valeur de nimporte quelle variable systme et affiche les informations utiles sur la ligne dtat. Lutilisation de cette fonction permet dafficher par exemple le nom du style de texte courant tel quil est dfini dans TEXTSTYLE et ce dernier est mis jour chaque modification. Lexpression MODEMACRO scrit comme suit :
Commande : modemacro

Entrez une nouvelle valeur pour MODEMACRO, ou . pour aucune (Enter new value for MODEMACRO, or . for none) : $(getvar, textstyle) Cela donne laffichage du style gauche de lcran (fig.2.3). Pour rendre le message plus comprhensible, il suffit dajouter un texte avant la valeur affiche. Par exemple (fig.2.4) : Entrez une nouvelle valeur pour MODEMACRO, ou . pour aucune (Enter new value for MODEMACRO, or . for none) : Style :$(getvar, textstyle) Comme autre exemple, on peut demander laffichage sur la ligne dtat, de la distance entre deux points, lors de lutilisation de la commande DISTANCE. Dans ce cas, lexpression MODEMACRO scrit comme suit (fig.2.5) :
Commande : modemacro

Fig.2.3

Fig.2.4

Entrez une nouvelle valeur pour MODEMACRO, ou . pour aucune (Enter new value for MODEMACRO, or . for none) <""> : Distance : $(getvar, distance) Les expressions peuvent tre imbriques et tre aussi complexes que vous le dsirez. Lexemple qui suit permet par exemple dafficher le temps pass dans AutoCAD en minutes (fig.2.6) :
Dure :$(FIX,$(*,60,$(*,24,$(GETVAR,TDUSRTIMER))))

98

Programmer AutoCAD

La variable systme TDUSRTIMER donne la valeur en jours. Il faut donc faire une conversion en minutes : Lexpression devient : 0.0855362 jours x 24 : 2.052869 heures 2.052869 heures x 60 = 123.17216 minutes Valeur entire de 123.17216 = 123 minutes Un autre exemple permet dafficher sur la ligne dtat la valeur et langle (en degrs) de la grille daccrochage. Cet exemple contient des expressions imbriques qui permettent de convertir en degrs langle daccrochage (exprim en radians) et tronquent la valeur sous forme de nombre entier.
Fig.2.5
Commande : modemacro

Nouvelle valeur de MODEMACRO, ou . pour aucune <""> : Snap : $(getvar, snapunit) $(fix,$(*,$(getvar,snapang),$(/,180,3.14159)))

Fig.2.6

Vous pouvez galement afficher les valeurs dans les modes dunits linaires et dangle courants.
Commande : modemacro

Nouvelle valeur pour MODEMACRO, ou un point (.) pour aucune <""> :


Snap: $(rtos,$(index,0, $(getvar,snapunit))),$(rtos,$(index,1,$ (getvar,snapunit))) $(angtos, $(getvar,snapang))

DIESEL copie ses entres directement dans les sorties jusqu ce quil atteigne le signe de dollar ($) ou une chane entre guillemets. Vous pouvez utiliser les chanes entre guillemets pour empcher que certaines squences de caractres (qui autrement

2. Le langage DIESEL

99

seraient considres comme des fonctions du langage DIESEL) soient values. Vous pouvez inclure des guillemets dans des chanes entre guillemets en entrant des guillemets adjacents. Dans lexemple ci-dessous, le calque courant est paramtr sur PRESENTATION et MODEMACRO, sur la chane.
Commande : modemacro

Nouvelle valeur pour MODEMACRO, ou un point (.pour aucune <""> : "$(getvar,clayer)= """$(getvar,clayer)""" La ligne dtat affiche le texte suivant :
$(getvar,clayer)="PRESENTATION"

Remarque
Il est aussi possible dutiliser le langage DIESEL dans certaines fonctions AutoCAD, comme RTEXT, par exemple. Il sagit dune fonction issue des Express tools.

Entrez RTEXT au clavier Tapez le contenu (fig.2.7)


List of Xrefs : $(xrefs,3) Pointez lorigine du texte. Il affiche la liste des xrefs dans le dessin (fig.2.8)
Fig.2.7

Fig.2.8

100

Programmer AutoCAD

Utilisation de MODEMACRO avec AutoLISP


Vous pouvez enregistrer dans des fichiers texte ASCII les exemples de code illustrs prcdemment et les charger laide de la fonction AutoLISP CHARGER. Etant donn quune chane AutoLISP ne peut pas occuper plusieurs lignes, vous devez utiliser la fonction strcat pour rassembler les diffrentes chanes qui composent la chane MODEMACRO.
(defun c:mode ( ) (setvar "modemacro" (strcat "Style : $(getvar,textstyle)" "Taille : $(getvar,textsize)" "Dure : $(FIX,$(*,60,$(*,24,$(getvar,tdusrtimer)))) " ) ) )

Enregistrez cette routine AutoLISP dans un fichier appel mode.lsp. Lorsque vous chargez puis excutez la routine, des informations apparaissent sur la ligne dtat. Le fichier exemple acad.lsp suivant utilise la fonction S : :STARTUP pour attribuer la variable MODEMACRO une chane dfinie par le fichier AutoLISP mode.lsp.
(defun S::STARTUP() (load "mode") (princ) )

Cette fonction active automatiquement louverture dAutoCAD la fonction Modemacro et son paramtrage.

Utilisation du langage DIESEL dans les menus


Il est galement possible, pour crer des macros, dappliquer des expressions de chanes DIESEL dans les fichiers de menu. Ces expressions peuvent renvoyer des valeurs de chane en rponse aux commandes standard dAutoCAD, aux sousprogrammes AutoLISP et ObjectARX et aux autres macros de menu. Elles peuvent galement renvoyer des valeurs de chane au menu proprement dit et modifier ainsi laspect ou le contenu du libell dun menu.

2. Le langage DIESEL

101

Ainsi, dans lexemple qui suit, le menu droulant Variables systme affiche la valeur de certaines variables dAutoCAD (fig.2.9).
***POPxx [&Variables systme] [$(eval, Nom du dessin : $(getvar,dwgname))] [$(eval, Style du texte: $(getvar,textstyle))] [$(eval, Echelle type de ligne: $(getvar,ltscale))]

Fig.2.9

La fonction DIESEL eval permet dafficher le rsultat dune valuation. Dans lexemple qui suit, on va effectuer un zoom qui correspond aux limites dfinies par la commande LIMITS :
[ZOOM LIMITES]^c^c_zoom ;_w ;$M=$(getvar,limmin) ;$M=$(getvar,limmax)

avec : _zoom : la fonction zoom

_w : loption window limmin : variable qui contient les coordonnes de la limite infrieure gauche limmax : variable qui contient les coordonnes de la limite suprieure droite
Lexemple suivant illustre une procdure de numrotation automatique :
[NUM-AUTO]*^c^c_text ;_m ;\ ; ;$M=(getvar,USERI1) ;_setvar ;USERI1 ;+ $(+,1,$(getvar,USERI1))

avec : _text : la fonction texte

_m : loption de justification middle \ : arrt pour permettre lutilisateur de pointer la position du texte $M : fonction Diesel USERI1 : une variable utilisateur + : fonction addition pour ajouter la valeur 1 la variable USERI1

102

Programmer AutoCAD

Les fonctions DIESEL


Le langage DIESEL comprend les fonctions dcrites ci-aprs. Il est possible de les combiner pour raliser des oprations plus complexes. Le langage DIESEL est galement utilisable dans AutoCAD LT. Toutes les fonctions sont limites 10 paramtres, le nom de la fonction compris. Le systme affiche un message derreur DIESEL lorsque lon dpasse cette limite.
+ (addition)

Renvoie la somme des nombres val1, val2, ..., val9.


$(+, val1 [, val2, ..., val9])

Ex : Si lpaisseur courante est gale 5, la chane DIESEL renvoie 15.


$(+, $(getvar,thickness),10)

(soustraction)

Renvoie le rsultat de val2 val9 retranchs de val1.


$(, val1 [, val2 , ..., val9])

* (multiplication)

Renvoie le rsultat de la multiplication des nombres val1, val2, ..., val9.


$(*, val1 [, val2, ..., val9])

/ (division)

Renvoie le rsultat de la division des nombres val1 par val2, ..., val9.
$(/, val1 [, val2, ..., val9])

= (gal )

Si les nombres val1 et val2 sont gaux, la chane renvoie 1 ; sinon, elle renvoie 0.
$(=, val1, val2)

Ex :
$(=,5,5) renvoi 1 $(=,5,4.9) renvoi 0

< (infrieur )

Si le nombre val1 est infrieur val2, la chane renvoie 1 ; sinon, elle renvoie 0.
$(< , val1,val2)

2. Le langage DIESEL

103

> (suprieur )

Si le nombre val1 est suprieur val2, la chane renvoie 1 ; sinon, elle renvoie 0.
$(>, val1, val2)

!= (diffrent de)

Si les nombres val1 et val2 ne sont pas gaux, la chane renvoie 1 ; sinon, elle renvoie 0.
$(!=, val1, val2)

<= (infrieur ou gal )

Si le nombre val1 est infrieur ou gal val2, la chane renvoie 1 ; sinon, elle renvoie 0.
$(<=, val1, val2)

>= (suprieur ou gal )

Si le nombre val1 est suprieur ou gal val2, la chane renvoie 1 ; sinon, elle renvoie 0.
$(>=, val1, val2)

and

Renvoie le rsultat dune opration logique AND applique sur les entiers val1 val9.
$(and, val1 [, val2,..., val9])

angtos

Renvoie la valeur angulaire avec le format et le degr de prcision souhait.


$(angtos, valeur [, mode, prcision])

Si mode et prcision sont omis, les valeurs courantes choisies par la commande UNITES sont utilises.

104

Programmer AutoCAD

Valeurs des units angulaires Valeur Mode 0 1 2 3 4 Format de chane Degrs Degrs/minutes/secondes Gradients Radians Godsie

edtime

Renvoie la date et lheure formates dfinies daprs une image dtermine.


$(edtime, date, image)

Edite la date (calendrier julien) dAutoCAD renvoye par heure (obtenue par exemple partir de $(getvar, date) pour limage dsigne par largument image). Largument image est compos dexpressions de format qui sont remplaces par des reprsentations spcifiques de la date et de lheure. Les caractres qui ne peuvent pas tre interprts comme des expressions de format sont copis tels quels dans le rsultat de $(edtime). Les expressions de format sont dfinies comme indiqu dans le tableau ci-aprs. Supposons que nous soyons le samedi 5 septembre 1999 4 :53 :17.506.
Expressions de format edtime Format D JJ JJJ JJJJ M MO MOI MOIS AA AAAA Sortie 5 05 Sam Samedi 9 09 Sep Septembre 99 1999 Format H HH MM SS MSEC AM/PM am/pm A/P a/p Sortie 4 04 53 17 506 AM am A a

2. Le langage DIESEL

105

Lexemple ci-aprs reprend la date et lheure mentionnes dans le tableau prcdent. Notez que la virgule doit tre mise entre les guillemets, car elle est interprte comme un sparateur darguments.
$(edtime, $(getvar,date),DDD"," JJ MOI AAAA - H:MMam/pm)

Il renvoie les informations suivantes :


Sam, 5 Sep 1999 - 4:53am

Si largument heure est gal 0, la date et lheure qui sappliquent sont celles de lexcution de la macro la plus droite. Cela vite une perte de temps due de nombreux appels de $(getvar, date) et garantit que les chanes composes de plusieurs macros $(edtime) utilisent la mme heure.
eq

Si les nombres val1 et val2 ne sont pas gaux, la chane renvoie 1 ; sinon, elle renvoie 0.
$(eq, val1, val2)

Lexpression ci-aprs recherche le nom du calque courant. Si le nom correspond la valeur mmorise dans la variable systme USERS1, elle renvoie 1. Supposons que la chane PART12 soit enregistre dans USERS1 et que le nom du calque courant soit identique.
$(eq, $(getvar,users1),$(getvar,clayer)) renvoie 1

eval

Transmet la chane str lvaluateur DIESEL, puis renvoie le rsultat de lvaluation.


$(eval, str)

fix

Tronque la valeur relle val en supprimant sa partie fractionnaire afin dobtenir un nombre entier.
$(fix, val)

106

Programmer AutoCAD

getenv

Renvoie la valeur de la variable denvironnement nom_var.


$(getenv, nom_var)

Si aucune variable de ce nom nest dfinie, renvoie la chane nulle.


getvar

Renvoie la valeur de la variable systme portant le nom_var dfini.


$(getvar, nom_var)

if

Procde une interprtation conditionnelle des expressions.


$(if, expr, valeur_si_vrai [, valeur_si_faux])

Si expr est diffrent de 0, cette chane interprte et renvoie valeur_si_vrai. Sinon, elle interprte et renvoie valeur_si_faux. Remarquez que la branche non choisie par expr nest pas value. Ex :
$(if,$(=,7,7),vrai) renvoi vrai

index

Renvoie le membre spcifi dune chane dlimite par des virgules.


$(index, slection, chane)

Cette fonction suppose que largument chane contient une ou plusieurs valeurs dlimites par le caractre de sparation des arguments de macro, savoir la virgule. Largument slection choisit la valeur extraire, le premier lment tant de rang 0. En gnral, cette fonction sert extraire les coordonnes X, Y ou Z partir du point renvoy par $(getvar).
linelen

Renvoie la longueur, exprime en nombre de caractres, de la ligne dtat la plus longue pouvant tre affiche.
$(linelen)

On peut utiliser ces paramtres pour modifier le format de la ligne dtat, selon la capacit daffichage. Cela est utile uniquement pour configurer la ligne dtat MODEMACRO.

2. Le langage DIESEL

107

Lespace attribu MODEMACRO sur la ligne dtat est actuellement fix 240 caractres. Ainsi, la fonction $(linelen) renvoie toujours 240 caractres.
nth

Interprte et renvoie largument slectionn par slection.


$(nth, slection, arg0 [, arg1,..., arg7])

Si slection est gal 0, nth renvoie arg0, et ainsi de suite. Notez la diffrence entre $(nth) et $(index) ; $(nth) renvoie lun des arguments dune srie la fonction, tandis que $(index) extrait une valeur dune chane dlimite par des virgules et transmise sous forme dargument unique. Les arguments non slectionns par slection ne sont pas interprts.
or

Renvoie le rsultat dune opration logique or applique sur les entiers val1 val9.
$(or, val1 [, val2,..., val9])

rtos

Renvoie la valeur relle avec le format et le degr de prcision que vous avez dfinis.
$(rtos, valeur [, mode, prcision])

Edite la valeur sous la forme dun nombre rel, dans le format dfini par mode et prcision. Si mode et prcision sont omis, les valeurs courantes slectionnes par la commande UNITES sont utilises.
strlen

Renvoie la longueur de chane exprime en nombres de caractres.


$(strlen, chane)

substr

Renvoie la sous-chane de chane, en commenant au caractre dbut, sur toute la longueur spcifie.
$(substr, chane, dbut [, longueur])

Dans une chane, les caractres sont numrots partir de 1. Si largument longueur est omis, cette expression renvoie tout ce qui reste de la chane.

108

Programmer AutoCAD

upper

Renvoie la chane convertie en majuscules, conformment aux rgles locales.


$(upper, chane)

xor

Renvoie le rsultat dune opration logique XOR applique sur les entiers val1 val9.
$(xor, val1 [, val2,..., val9])

La correction des erreurs


La commande MACROTRACE est une variable systme AutoCAD qui permet de contrler une expression AutoLISP. Pour lactiver, il faut lui donner la valeur 1. Aprs son activation, vous pouvez entrer lexpression DIESEL. Par exemple :
Dure :$(FIX,$(*,60,$(*,24,$(GETVAR,TDUSRTIMER))))

Macrotrace affiche le contrle :


Eval: Eval: Eval: Eval: ===> ===> ===> ===> $(FIX, $(*,60,$(*,24,$(GETVAR,TDUSRTIMER)))) $(*, 60, $(*,24,$(GETVAR,TDUSRTIMER))) $(*, 24, $(GETVAR,TDUSRTIMER)) $(GETVAR, TDUSRTIMER) 0.00206073 0.04945752 2.9674512 2

Les messages derreur :

$ ? : erreur de syntaxe $ ?(func, ??) : argument de la fonction incorrecte $(func) ?? : fonction inconnue $(++) : chane de sortie trop longue