Aller au contenu

Utilisation de la fonction IF


ALEX-_-45

Messages recommandés

Bonjour,

C’est la première fois que je poste un message, car j’ai toujours réussi à trouver une raiponce avec c’eux des autres ou par moi-même, mais là ça fait un moment que je cherche et a par avoir réussi à faire planter AuoCAD je n’arrive pas à grand-chose bref.

 

Je souhaiterais effectuer une commande si j’ai un ou plusieurs objets de sélectionner et une autre si rien ne l’ai.

 

Exemple 1 objet sélectionner

^C^C_CHPROP CA "-EAS-Attente de validation"^M; ^C^C_CLAYER "-EAS-Attente de validation"

 

Exemple 2 pas d’objet sélectionner

^C^C_CLAYER "-EAS-Attente de validation"

 

Par avance merci de vos raiponces.

Lien vers le commentaire
Partager sur d’autres sites

Hello,

Déja, bienvenue sur le forum....

 

Ensuite, peux-tu être un peu plus précis dans ta demande? Tu souhaites créer une nouvelle commande via une icône,un raccourcie clavier, une palette, etc...

Car je viens de tester tes macros dans une palette, et pas de problème, ça marche.

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

Hello,

Déja, bienvenue sur le forum....

 

Ensuite, peux-tu être un peu plus précis dans ta demande? Tu souhaites créer une nouvelle commande via une icône,un raccourcie clavier, une palette, etc...

Car je viens de tester tes macros dans une palette, et pas de problème, ça marche.

 

Merci de ta raiponce aussi rapide :)

 

Oui c’est pour une palette et raccourci clavier, effectivement elle fonctionne très bien si ont n’a un objet de sélectionner, mais si on veut juste changer de calque elle reste bloqué sur la première commande et demande de sélection un d’objet.

Lien vers le commentaire
Partager sur d’autres sites

Je ne vois pas trop, car chez moi pas de problèmes.

Mais comme tu dis:

Je souhaiterais effectuer une commande si j’ai un ou plusieurs objets de sélectionner et une autre si rien ne l’ai.

En lisant ça, on parle de 2 commandes, donc j'ai créé 2 commandes dans ma palette. Là pas de soucis.

 

Après ta demande ne serait-elle pas: une commande qui agit différemment suivant si oui ou non un/des objet(s) est/sont préalablement sélectionné(s)?

 

Sinon, je ne vois pas. Désolé, il faudrait que tu soit un peu plus précis.

 

Et ensuite pour une raccourci clavier, la démarches est pas la même.

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Si tu as une version pleine, c'est assez facile à faire en LISP (si c'est faisable en Diesel, je ne sais pas le faire).

 

^C^C((lambda (c s) (if s (command "_.chprop" s "" "_layer" c "")) (setvar 'clayer c)) "-EAS-Attente de validation" (cadr (ssgetfirst)))

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Si tu as une version pleine, c'est assez facile à faire en LISP (si c'est faisable en Diesel, je ne sais pas le faire).

 

^C^C((lambda (c s) (if s (command "_.chprop" s "" "_layer" c "")) (setvar 'clayer c)) "-EAS-Attente de validation" (cadr (ssgetfirst)))

 

salut,

 

Un grand merci ça fonctionne !!!

 

Par contre je ne comprends pas c’est une commande Diesel que tu ma donner, un LISP c’est pas un programme avec une extension .lsp qu’il faut charger dans AutoCAD ?

Lien vers le commentaire
Partager sur d’autres sites

AutoLISP est un langage de programmation embarqué dans AutoCAD, c'est à dire que AutoCAD intègre un interpréteur LISP et que cet interpréteur est accessible directement depuis ligne de commande.

 

Si tu entres (+ 2 3) en ligne de commande, AutoCAD détecte une parenthèse et passe l'expression à l'interpréteur LISP. Celui-ci évalue l'expression et renvoie le résultat à AutoCAD : la ligne commande affiche 5.

On peut donc utiliser des expressions LISP en ligne de commande pour répondre à des invites mais aussi dans les macros de commande et dans les scripts.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Un peu de théorie fondamentale

 

Une expression LISP (ou appel de fonction) a la forme :

(fonction [arguments ...])

Elle commence par une parenthèse ouvrante, immédiatement suivie par une fonction puis, optionnellement, un ou plusieurs arguments et enfin une parenthèse fermante.

 

(+ 2 3)

+ est la fonction

2 et 3 sont les arguments.

 

La fonction, comme les arguments peuvent aussi être des appels de fonctions (d'où les imbrications et les nombreuses parenthèses typiques du LISP).

 

nil est une expression particulière du LISP qui signifie à la fois rien, une liste vide ou faux (false).

 

 

Dans le cas qui nous concerne (en reformatant le code pour qu'il soit plus lisible).

 

(
(lambda (c s)
  (if s
    (command "_.chprop" s "" "_layer" c "")
  )
  (setvar 'clayer c)
)
 "-EAS-Attente de validation"
 (cadr (ssgetfirst))
)

 

 (lambda (c s)
  (if s
    (command "_.chprop" s "" "_layer" c "")
  )
  (setvar 'clayer c)
)

est la fonction. Ici une fonction anonyme qu'on décortiquera plus bas.

 

"-EAS-Attente de validation"

et

(cadr (ssgetfirst))

sont les arguments. Le second est un appel de fonction.

cadr est la fonction, (ssgetfirst) est l'argument, et c'est encore un appel de fonction (sans argument lui).

ssgetfirst renvoie une liste dont le premier élément est toujours nil et le second élément est le jeu de sélection actif s'il y en a un ; sinon, nil.

cadr renvoie le second élément d'une liste, donc ici, un jeu de sélection ou nil.

 

Une fonction anonyme (ou expression lambda) est une définition de fonction qui utilise la fonction lambda suivie de la liste des arguments et variables locales puis des expressions à évaluer.

Ici la liste des arguments (c s) définit deux arguments c et s qui seront utilisés dans les expressions de la fonction lambda en prenant respectivement les valeurs de "-EAS-Attente de validation" et du résultat de l'évaluation de (cadr (ssgetfirst)).

 

En résumé, on va évaluer les expressions contenues dans le corps de l'expression lambda avec :

c = "-EAS-Attente de validation"

s = le jeu de sélection actif ou nil s'il n'y en a pas.

Le corps de l'expression lambda ne contient que deux expressions :

 

   (if s
    (command "_.chprop" s "" "_layer" c "")
  )

qui est une "expression conditionnelle" de la forme :

(if condition then [else])condition, then et, optionnellement, else sont des expressions qui peuvent aussi être des appels de fonction.

En LISP, toute condition est considérée comme vraie (true) si elle n'est pas nil.

Dans notre cas, la condition est s qui sera considérée comme vraie s'il y a une sélection active.

Si c'est le cas l'expression then sera exécutée, à savoir :

(command "_.chprop" s "" "_layer" c "")

qui est simplement un appel de la fonction command qui lance une commande AutoCAD et lui passe ses options dont le jeu de sélection s et le nom du calque c.

Si ce n'est pas le cas, il n'y a pas ici d'expression then donc on ne fait rien.

 

   (setvar 'clayer c)

sera exécutée dans tous les cas puisqu'elle est en dehors de l'expression (if ...). Cette expression rend le calque c courant.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

c’est un langage qui se li un peu à l’envers

 

J'ammène mon grain de sel...

 

Je ne pense pas qu'il y ai d'endroit et d'envers en programmation.

Mais une orientation.

Le lisp est un langage procédurale, et commence par une fonction qui s'applique à un objet.

en langage orienté objet, on commence par l'objet auquel on va appliqué une méthode.

 

Bonne nuit

Lien vers le commentaire
Partager sur d’autres sites

Je crains qu'il n'y ait là quelque confusion entre ce qu'on appelle les paradigmes des langages de programmation (orienté objet, fonctionnel, impératif/procédural) et leur syntaxe.

La plupart des langages de programmations sont multi-paradigmes et tous (excepté certains langages purement fonctionnels) supportent la programmation impérative/procédurale : AutoLISP (dialecte du plus ancien langage fonctionnel) tout comme Java ou C# (langages typiquement orientés objet).

 

Le fait d'écrire :

objet.methode(arguments)

ou :

methode(objet, argument)

ne définit en rien un paradigme de programmation, c'est uniquement une question de syntaxe (avec support de l'opérateur '.' ou pas). D'ailleurs la plupart des langages qui utilisent cet opérateur, supportent aussi l'autre syntaxe.

 

Ce qui fait la particularité du LISP c'est : la notation préfixe (on écrit (+ 2 3) au lieu de 2 + 3) ainsi qu'une tendance culturelle intrinsèque à l'imbrication d'appels de fonction.

Intrinsèque parce que LISP se définit récursivement : une expression LISP est : soit un atome ; soit une liste d'expressions LISP.

Culturelle parce que, en programmation fonctionnelle, on a tendance à préférer utiliser des appels de fonction plutôt que des variables.

 

Je pense que c'est à cette imbrication d'appels de fonctions et à leur évaluation depuis l'expression la plus imbriquée que ALEX-_-45 fait allusion quand il parle de lecture "à l'envers".

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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é