Aller au contenu

Liste d'échelles prédéfinies dans lisp


David64

Messages recommandés

Bonjour à tous,

 

Aprés 15ans d'utilisation d' AutoCAD, pour finalement basculer sur Revit, je me retrouve aujourd'hui à créer mon premier lisp (enfin j'espère...).

Le but de ce lisp est d'automatiser une succession de commande, j'avance pas trop mal mais je me heurte à un problème. Dans le lisp, je suis amené à lancer la commande "Echelle", je reprends la main pour la saisie, je définis le point de base qui est le toujours le même, et arrivé à l'étape du facteur d'échelle je souhaiterai laissé le choix entre des échelles prédéfinies '(5 10 15 20 25 33.33333 40 50 75 100).

Est-il possible de faire affiché cette liste dans la ligne de commande (ou en saisie dynamique) de façon à ce qu'il n'y ait plus qu'à cliquer l'échelle voulue?

 

Merci par avance.

Lien vers le commentaire
Partager sur d’autres sites

Salut !

 

tu peux regarder du côté de (initget) et (getkword). Ces deux fonctions devraient résoudre ton soucis :)

 

initget affectera uniquement la fonction (get-...) qui le suit et (getkword) permet d'afficher des "key", des choix prédéfinis dans un message sur la ligne de commande.

 

donc dans l'idée tu aurais quelque chose comme ça :

(initget 1 "5 10 15 20 25 33.333 40 50 75 100")
(setq Echelle (getkword "\nChoisir échelle [5/10/15/20/25/33.333/40/50/75/100] : "))

 

Si je me souviens bien, il est possible que le 33.333 ne passe pas en raison de la virgule (".") donc à voir...

Ici, le 1 spécifié au niveau de (initget) permet d'interdire l'utilisateur de faire une validation à vide (ENTER) ce qui retourne alors nil et peut poser des soucis !!

Et surtout, (getkword) retourne une chaîne de caractère donc si jamais tu as besoin de l'échelle sous format numérique il faudra convertir la chaîne via (rtos) ou bien (itoa) :)

 

Voili voilou !!

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Les fonctions initget et getkword devraient répondre à ta demande (voir sections 7.0 et 7.1 de Introduction à AutoLISP).

(initget 1 "5 10 15 20 25 33.33333 40 50 75 100")
(setq option (getkword "\nChoisissez l'échelle [5/10/15/20/25/33.33333/40/50/75/100]:"))
(setq echelle
      (if (= option "33.33333")
 0.03
 (/ 1. (atof option))
      )
)

 

Coiffé au poteau par Luna....

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour et merci à tous les deux pour votre réactivité!

J'ai essayé d'intégrer dans mon lisp vos commandes, mais comme je vous le disais précédemment, c'est mon premier lisp et je loupe forcément quelque chose.

Je me permets de vous joindre le lisp que j'essaye de réaliser, il est fonctionnel pour moi à quelques détails prés...

Au lancement de Autocad, aprés chargement du lisp, je dois lancer une fois manuellement les commandes "inserclassique" et "-purger" un message "commande inconnue" apparait.

Je ne sais pas du tout où je dois insérer les lignes de commandes que vous m'avez indiquées (aprés plusieurs test rien de fonctionnel...)

Dans la liste, est-il possible d'afficher 33 et que la valeur appliquée soit 33.33333?

je n'ai pas trouvé la commande atof dans le guide "Introduction à Autolisp", à quoi correspond-elle?

J'en profite pour saluer tout ton travail (gile), je ne compte plus le nombre où je t'ai lu.

 

Ci-dessous mon lisp je suis bien sûr preneur de toutes améliorations de fonction ou de structure du code:

;;;Test Insérer DXF
(defun c:test (/ option echelle)
 ;;Définit la valeur des unités de contenu sources en cm
 (setvar "INSUNITSDEFSOURCE" 5)  
 ;;Définit la valeur des unités de dessin cible en m
 (setvar "INSUNITSDEFTARGET" 6)
 (command
   (getcname "ECHLTP") 7
   (getcname "inserclassique")
   (getcname "decompos") (ssget "_A")
   (getcname "-purger") "ca" "" "n"
   (getcname "-epurer") (ssget "_A") "" "Terminé"
   (initdia)
   (getcname "sauvenom"))
 (setvar "INSUNITSDEFSOURCE" 0)
 (alert "Sélectionner la(es) coupe(s)")
;;comment accéder à la liste d'échelle plutot que la saisie manuelle durant les pauses qui suivent?
 (command (getcname "_scale") (ssget) "" "0,0.18587899" pause)
   (command (getcname "_scale") (ssget "_W" '(1.3 1.3) '(-0.5 -0.5)) "" "0,0" pause)
 (princ)
 )

Lien vers le commentaire
Partager sur d’autres sites

Sumimasen (gile), tes explications resteront toujours un exemple de perfection ! :)

 

@David64, pour ce qui est de la fonction (atof) tu peux essayer de voir directement via l'aide d'autocad. Mais pour résumer, la fonction (atof) est l'inverse de la fonction (rtos). Donc en clair, cela permet de passer une chaîne de caractères de la forme "3.14" en un nombre réel 3.14

 

peut ainsi s'avérer très utile lors de l'utilisation de la fonction (/) puisque le résultat n'est pas le même si le dénominateur est un réel ou un entier ^^

(/ 5 2) -> 2
(/ 5 2.0) -> 2.5

 

si j'ai bien compris son utilisation, la fonction (/) renvoie toujours le résultat au même format que le dénominateur donc il arrive parfois que l'on soit obligé de passer par

(/ 5 (atof (rtos 2 2 1))) -> 2.5 (et non 2)

 

Bref. pour le code, je pense que ceci devrait fonctionner (non testé) :

;;;Test Insérer DXF
(defun c:test (/ echelle)
 ;;Définit la valeur des unités de contenu sources en cm
 (setvar "INSUNITSDEFSOURCE" 5)  
 ;;Définit la valeur des unités de dessin cible en m
 (setvar "INSUNITSDEFTARGET" 6)
 (command
   (getcname "ECHLTP") 7
   (getcname "inserclassique")
   (getcname "decompos") (ssget "_A")
   (getcname "-purger") "ca" "" "n"
   (getcname "-epurer") (ssget "_A") "" "Terminé"
   (initdia)
   (getcname "sauvenom"))
 (setvar "INSUNITSDEFSOURCE" 0)
 (alert "Sélectionner la(es) coupe(s)") ;; un (prompt) pourrait également faire l'affaire, en fonction de l'utilisation :)
 (progn
   (initget 1 "5 10 15 20 25 33 40 50 75 100")
   (if (= "33" (setq Echelle (getkword "\nChoisissez l'échelle [5/10/15/20/25/33/40/50/75/100]:")))
      (setq Echelle 0.033333)
      (setq Echelle (/ 1 (atof Echelle)))
   )
 )
 (command (getcname "_scale") (ssget) "" "0,0.18587899" Echelle)
   (command (getcname "_scale") (ssget "_W" '(1.3 1.3) '(-0.5 -0.5)) "" "0,0" Echelle)
 (princ)
 )

 

En prenant en compte

Dans la liste, est-il possible d'afficher 33 et que la valeur appliquée soit 33.33333?
... normalement ^^'

L'utilisation du (progn) n'est pas obligatoire, mais j'ai déjà eu quelques soucis de compatibilité entre plusieurs initget d'affilé alors, on n'est jamais trop prudente !! ^^

(voir ce sujet)

 

En espérant que cela fonctionne .. ;)

Lien vers le commentaire
Partager sur d’autres sites

Merci Luna !

J'ai un peu revu le code mais du coup grâce à ton aide, je suis parvenu ,à faire le lisp qui me change la vie!

Bon maintenant je vais plancher sur la deuxième partie, je risque donc d'être bientôt de retour! :P

 

 

Pour info ci-dessous le lisp opérationnel, il me permet de récupérer les ferraillages de poutres issus de Graitec, de les mettre à l'échelle 1=1m dans AutoCAD et de les retravailler pour avoir un rendu plus léché :

 

;;;Test Insérer DXF
(defun c:test (/ Echelle)
 ;;Définit la valeur des unités de contenu sources en cm
 (setvar "INSUNITSDEFSOURCE" 5)
 ;;Définit la valeur des unités de dessin cible en m
 (setvar "INSUNITSDEFTARGET" 6)
 (command
   (getcname "ECHLTP") 7
   (getcname "inserclassique")
   (getcname "decompos") (ssget "_A")
   (getcname "-purger") "ca" "" "n"
   (getcname "-epurer") (ssget "_A") "" "Terminé"
   (initdia)
   (getcname "sauvenom"))
 (setvar "INSUNITSDEFSOURCE" 0)
 (progn
   (initget 1 "10 20 25 33 40 50")
   (if (= "33" (setq Echelle (getkword "\nChoisissez l'échelle de la coupe [10/20/25/33/40/50]:")))
     (setq Echelle 33.33333)
     (setq Echelle (* 1 (atof Echelle)))
     )
   )
 (alert "Sélectionner la(es) coupe(s)")
 (command (getcname "_scale") (ssget) "" "0,0.18587899" Echelle)
 (progn
   (initget 1 "10 20 25 33 40 50 75 100")
   (if (= "33" (setq Echelle (getkword "\nChoisissez l'échelle de l'élévation [10/20/25/33/40/50/75/100]:")))
     (setq Echelle 33.33333)
     (setq Echelle (* 1 (atof Echelle)))
     )
   )
 (command (getcname "_scale") (ssget "_W" '(1.3 1.3) '(-0.5 -0.5)) "" "0,0" Echelle)
 (command (getcname "zoom") "et")
 (command (getcname "sauverap")
   (princ)
   )
 )

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

Salut à tous...

Et il fait quoi au juste ton programme ?

Car j'en ai fais un avec deux échelles "courantes"... Une pour un plan de situation et un pour un plan de détails...

Et toutes les autres routines que j'ai développées s'y réfèrent...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

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é