Problème de condition dans LISP

Problème de condition dans LISP

Romain.R
Contributor Contributor
574 Visites
5 Réponses
Message 1 sur 6

Problème de condition dans LISP

Romain.R
Contributor
Contributor

Bonjour à toutes et à tous,

 

Avant d'exposer mon problème, je tiens à préciser que je suis débutant dans le monde du lisp et que le fichier joint n'est surement pas conforme à la façon de faire. Je l'ai construit au fur et à mesure que je trouvais les informations sur le net. Je vous remercie par avance si vous avez des conseils ou des remarques qui me permettront de m'améliorer. 

 

Le but du LISP est de pouvoir insérer une présentation depuis un gabarit va un initget getkword puis de basculer sur la présentation créée. A la suite de ça un  2e initget getkword se lance pour choisir un groupe d'état de calque à sélectionner, une fois le choix fait un 3e getkword est lancé pour sélectionner un des états de calque du groupe afin de l'appliquer à la présentation.

 

Mon problème est que les conditions affectées au getkword ne se lancent pas après avoir choisit l'état de calque à appliquer à la présentation. Ou alors il n'est appliquer que la 1er condition peu importe le choix (je ne sais plus dans quel contexte j'ai essayer de placer des conditions un peu partout)

 

Je vous remercie par avance pour votre aide.

0 J'aime
Solutions acceptées (1)
575 Visites
5 Réponses
Replies (5)
Message 2 sur 6

_gile
Consultant
Consultant
Solution acceptée

Salut,

En regardant ton code, je vois une erreur dans l'expression :

	(command
		"zoom" "et"
		"zoom" "f"
		(while (> (getvar "cmdactive") 0)
		(command pause))
	);_ command

qu'il faut écrire:

  (command "zoom" "et" "zoom" "f")
  (while (> (getvar "cmdactive") 0)
    (command pause)
  ) ;_ while

Il y a aussi des doubles parenthèses dans les expressions :

((layerstate-restore "Test 1" (acet-currentviewport-ename) 5))

 

À part ça je te conseillerais :

  • d'utiliser l'éditeur Visual LISP (VLIDE) qui, avec ses fonctionnalités de débogage, permet de trouver facilement les erreurs ;
  • de déclarer localement les variables ;
  • de ne pas compliquer inutilement le code (par exemple les expressions lambda dans ton code).

J'ai essayé de ré-écrire ton code, mais je ne l'ai pas testé.

(defun C:LMAN (/ a b c) ;_ déclaration des variables locales
  (initget 1 "A4H A4V A3H A3V A2H A2V A1 A0")
  (setq a (getkword "\nChoix du format de présentation : [A4H/A4V/A3H/A3V/A2H/A2V/A1/A0]: "))
  (command "_layout" "g" "C:\\ProgramData\\Autodesk\\******************************.dwt" a "ctab" a "_.mspace" "cvport"	"2")
  (command "zoom" "et" "zoom" "f")
  (while (> (getvar "cmdactive") 0)
    (command pause)
  ) ;_ while
  (initget 1 "EXISTANT ARCHITECTURE TECHNIQUE")
  (setq	b getkword "\nChoix de l'état de calque EXISTANT : [EXISTANT/ARCHITECTURE/TECHNIQUE]: " )
  (cond
    ((= b "EXISTANT")
     (initget "BATIMENT TEST1 TEST2")
     (setq c (getkword "\nChoix de l'état de calque à appliquer [BATIMENT/TEST1/TEST2]: "))
     (cond
       ((= c "BATIMENT")
	(layerstate-restore "E1000_Batiment existant" (acet-currentviewport-ename) 5)
       )
       ((= c "TEST1")
	(layerstate-restore "Test 1"  (acet-currentviewport-ename) 5)
       )
       ((= c "TEST2")
	(layerstate-restore "Test 2" (acet-currentviewport-ename) 5)
       )
     ) ;_ cond
    )
    ((= b "ARCHITECTURE")
     (initget "AMENAGEMENT TEST1 TEST2")
     (setq c (getkword "\nChoix de l'état de calque à appliquer [AMENAGEMENT/TEST1/TEST2]: "))
     (cond
       ((= c "AMENAGEMENT") (layerstate-restore "A2000_Amenagement projet" (acet-currentviewport-ename) 5)
       )
       ((= c "TEST1")
	(layerstate-restore "Test 1" (acet-currentviewport-ename) 5)
       )
       ((= c "TEST2")
	(layerstate-restore"Test 2"(acet-currentviewport-ename) 5)
       )
     ) ;_ cond
    )
    ((= b "TECHNIQUE")
     (initget "AMENAGEMENT TEST1 TEST2")
     (getkword "\nChoix de l'état de calque à appliquer [CFO-HAUT/TEST1/TEST2]: ")
    )
    (cond
     ((= c "CFO-HAUT")
       (layerstate-restore "T2000_CFO haut projet" (acet-currentviewport-ename) 5)
     )
     ((= c "TEST1")
       (layerstate-restore "Test 1" (acet-currentviewport-ename) 5)
     )
     ((= c "TEST2")
       (layerstate-restore "Test 2" (acet-currentviewport-ename) 5)
     )
    ) ;_ cond
  ) ;_ cond
  (command "regen" "._pspace")
  (princ)
) ;_ defun

 

 

 

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

0 J'aime
Message 3 sur 6

Romain.R
Contributor
Contributor

Bonjour Mr.CHANTEAU,

 

Merci pour vos réponses.

Je vais trouver de quoi me familiariser avec VLIDE.

 

Concernant les doubles parenthèses des expressions 

((layerstate-restore "Test 1" (acet-currentviewport-ename) 5))

Je l'ai mises car sans elles, ça m'affichais un message d'erreur, je ne sais plus si c'était pour la syntaxe ou pour des arguments car j'ai fais des essais dans tous les sens.

 

Concernant le lisp il y a le message erreur de syntaxe lors du chargement, je vais essayer de trouver le problème.

0 J'aime
Message 4 sur 6

Romain.R
Contributor
Contributor

Pour ceux qui en ont besoin le LISP est en PJ

Dans le code les ******** sont à remplacer par le chemin de votre fichier dwt.

Tous les noms GROUPE1/2/3 , les lettres A/B/C et les NOM_ETAT_DE_CALQUE sont à remplacer par ce que vous souhaitez afficher et le nom de vos états de calque.

 

Encore merci pour votre aide Mr.CHANTEAU

0 J'aime
Message 5 sur 6

-didier-
Advisor
Advisor

Bonjour @Romain.R 

 

Je me permets une petite auto-promo (voir ma signature)
J'ai souhaité faire ce site pour les francophones qui veulent débuter en programmation pour AutoCAD

 

Mon conseil, sans doute ringard, est de ne pas mettre la barre trop haut pour débuter.

 

Amicalement

 

Éternel débutant.. my site for learning : Programmer dans AutoCAD

DA

EESignature

0 J'aime
Message 6 sur 6

Romain.R
Contributor
Contributor

Bonjour,

Vous avez raison de partager votre site LIEN , il est déjà dans mes onglets web. J'ai également le document PDF de Mr.CHANTEAU "Introduction à Autolisp".

Je suis d'accord avec vous, qu'il faut commencer avec de bonnes bases et par étapes, ce que je vais reprendre depuis le début.

Je met en place actuellement un nouveau gabarit pour mon entreprise et par manque de temps je me focalisais sur les problèmes que je rencontrais.

 

Merci d'avoir accordé du temps à mon problème.

0 J'aime