Aller au contenu

incompréhension d\'erreur


Messages recommandés

Invité samuelM
Posté(e)

Cher(e)s lecteurs,

 

dans mon porgramme j'ai rajouté à la ligne "getstring" la possibilité d'utiliser l'entrée précédente. cependant, maintenant le programme n'exécute plus la suite du code (setq dims).

 

je pense que c'est dû au fait que "vlax-ename" est la réponse de getstring, mais comme il y a "strcat" en plus, "vlax-ename" ne trouve rien.

 

Est ce que c'est ça? comment y remédier?

 

         (setq ent (car (entsel "\nSélectionnez un solide (Echap pour terminer): ")))
  (setq entreprecedente "bibo")
  (setq nom (getstring (strcat "\nNommer l'objet sélectionné ou <"entreprecedente">:")))
  (if(not nom)(setq nom entreprecedente))
  (setq ent (vlax-ename->vla-object ent))	  
  (= (vla-get-ObjectName ent) "AcDb3dSolid")	  
  (not (vla-GetBoundingBox ent 'minpt 'maxpt))	  
  (setq dims		 
	 (append
	   (vl-sort
	     (mapcar '-
		     (vlax-safearray->list maxpt)

		     (vlax-safearray->list minpt)
		     )
	     '>
	     )
	   (list nom))
	);setq dims 

 

merci d'avance pour votre aide

Posté(e)

Je ne vois pas de raison pour que ton code s'arrête, cependant :

(= (vla-get-ObjectName ent) "AcDb3dSolid") 

ne sert à rien

de même que le (NOT sur le boundingbox.

 

Alors je te propose plutôt :

 (if(= (vla-get-ObjectName ent) "AcDb3dSolid")
 (progn(vla-GetBoundingBox ent 'minpt 'maxpt)
   (setq dims
   (append
     (vl-sort
       (mapcar '-
	       (vlax-safearray->list maxpt)
	       
	       (vlax-safearray->list minpt)
	       )
       '>
       )
     (list nom))
  );setq dims
   )
 )

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Invité samuelM
Posté(e)

Merci Tramber pour ta réponse j'essaye cela tout de suite.

 

Voici le programme complet si tu veux essayer pour voir.

 

(defun c:a1 (/ *error* file ent minpt maxpt dims dim i nom entreprecedente)  

 (vl-load-com)

 (defun *error* (msg)

   (and msg

 (or

   (member (strcase msg) '("FUNCTION CANCELLED" "QUIT / EXIT ABORT" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON"))	   

   (princ (strcat "\nErreur : " msg))

   )

 )

   (if file

     (close file)

     )

   (princ)

   );;defunerror

 (initget "Oui Non")  

 (if (= (getkword "\nEnregistrer dans un fichier ? [Oui/Non] : ") "Oui")    

   (progn      

     (setq file	     

     (open	       

       (getfiled "Créez ou sélectionnez un fichier" "" "csv" 1)	       

       "w"

       )

    )

     )

   )

 (while T    

   (if (and	  

  (setq ent (car (entsel "\nSélectionnez un solide (Echap pour terminer): ")))

  (setq entreprecedente "bibo")

  (setq nom (getstring (strcat "\nNommer l'objet sélectionné ou <"entreprecedente">:")))

  (if(not nom)(setq nom entreprecedente))

  (setq ent (vlax-ename->vla-object ent))	  

  (= (vla-get-ObjectName ent) "AcDb3dSolid")	  

  (not (vla-GetBoundingBox ent 'minpt 'maxpt))	  

  (setq dims		 

	 (append

	   (vl-sort

	     (mapcar '-

		     (vlax-safearray->list maxpt)

		     (vlax-safearray->list minpt)

		     )

	     '>

	     )

	   (list nom))

	);setq dims 

  )    

     (progn

(setq i (length dims))	

(foreach dim dims	  

  (if file	    

    (progn	      

      (princ dim file)	      

      (if (= i 1)		

	(princ "\n" file)		

	(princ ";" file)	

	)	      

      (setq i (1- i))	      

      )	    

    )	  

  (princ (strcat " " (VL-PRINC-TO-STRING dim)))))))

 (*error* nil)

 

 ) 

 

Il y a une autre modif que je voulais apporter mais je n'y arrive pas du tout :(

Invité samuelM
Posté(e)

Tramber,

 

En insérant ton code comme ceci :

 

(setq ent (car (entsel "\nSélectionnez un solide (Echap pour terminer): ")))
  (setq entreprecedente "bibo")
  (setq nom (getstring (strcat "\nNommer l'objet sélectionné ou <"entreprecedente">:")))
  (if(not nom)(setq nom entreprecedente))
  (setq ent (vlax-ename->vla-object ent))
  (if(= (vla-get-ObjectName ent) "AcDb3dSolid")
  (progn(vla-GetBoundingBox ent 'minpt 'maxpt)
    (setq dims
	   (append
	     (vl-sort
	       (mapcar '-
		       (vlax-safearray->list maxpt)

		       (vlax-safearray->list minpt)
	       )
       '>
       )
     (list nom))
  );setq dims
   )

 ) 

 

Il me dit qu'il y a une erreur : structure incorrecte de la liste d'entrée.

 

 

Posté(e)

Si le programme s'arrête (sans erreur), c'est probablement que la condition du (if ...) n'est pas remplie.

Cette condition est une expression (and ...) et il suffit qu'une des expressions qu'elle contient retourne nil pour que (and ...) retourne nil et que, donc, le programme s'arrête.

Fais un pas à pas de toutes les expressions dans le (and ...), tu devrais trouver d'où vient le problème.

 

structure incorrecte de la liste d'entrée = problème de parenthèse.

 

Encore une fois, utilise l'éditeur Visual LISP (double clic, formatage du code, fonctions de débogage, ...) tu as là tous les outils pour corriger ton code.

 

PS : j'ai cru comprendre que tu étais payé pour faire ce programme, si je veux bien t'aider à apprendre le LISP, ne compte pas sur moi pour faire ton travail gratuitement à ta place.

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

Invité samuelM
Posté(e)

Gile,

 

En effet je sais que le problème venait vraisemblablement des parenthèses mais je voulais savoir si ça pouvait venir d'ailleurs.

 

Pour l'autre erreur je vais y regarder alors, je ne comprends pas tout mais je vais me débrouiller.

 

Pour ton PS, je fais ça pour apprendre de nouvelles choses, et je dis que je termine aujourd'hui mais tout simplement parce que après j'ai autre chose de prévu et donc je n'aurai pas la possibilité d'y retoucher. mais merci quand même.

Posté(e)

La programmation LISP est (relativement) facile parce qu'on peut évaluer directement une expression dans la console de l'éditeur Visual LISP ou en ligne de commande, ce qui aide grandement à comprendre comment fonctionne le code.

 

Essaye d'évaluer :

(setq nom (getstring (strcat "\nNommer l'objet sélectionné ou :")))

en entrant un nom et en faisant 'Entrée'.

Quels sont les résultats retournés ?

 

Et ensuite, si tu fais :

(if(not nom)(setq nom entreprecedente))

Quel sont les résultats retournés ?

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

Invité samuelM
Posté(e)
La programmation LISP est (relativement) facile parce qu'on peut évaluer directement une expression dans la console de l'éditeur Visual LISP ou en ligne de commande, ce qui aide grandement à comprendre comment fonctionne le code.

 

Essaye d'évaluer :

(setq nom (getstring (strcat "\nNommer l'objet sélectionné ou <"entreprecedente">:")))

en entrant un nom et en faisant 'Entrée'.

Quels sont les résultats retournés ?

 

 

 

Et ensuite, si tu fais :

(if(not nom)(setq nom entreprecedente))

Quel sont les résultats retournés ?

 

 

Pour la première il me retourne :

il me retourne :

 

Nommer l'objet sélectionné ou :

 

et la deuxième:

 

impossible d'entrer à nouveau lisp

nil.

 

 

Si tu veux bien continuer à m'aider, que me conseil tu au plus simple pour la réalisation?

 

mon objetif :

extraire dans une feuille exel les sections de solide 3D

 

deux méthodes :

- faire une selection global avec "ssget" et traiter le programme extraction sur les éléments de la liste (tu m'as déjà orienté sur ce sujet mais je n'arrive pas a faire le lien avec le reste du programme)

-faire comme ici, exécuter le programme sur chaque pièce mais en utilisant la fonction que j'essaye (entreprecedent) pour éviter de recopier le nom quand c'est le même?(bien sur celle-ci va moins vite à exécuter.

 

 

 

[Edité le 17/6/2011 par samuelM]

Posté(e)

Je t'ai dis que je ne ferais pas le programme à ta place, je suis au chômage et, toi, tu sembles avoir la chance d'être payé pour apprendre AutoLISP, alors profites-en pour apprendre vraiment, pas faire du patchwork avec des bouts de codes glanés ici ou là...

 

Quelle est la valeur de la variable nom après que tu aies fait :

(setq nom (getstring (strcat "\nNommer l'objet sélectionné ou :")))

et entré un nom ?

 

Que retourne :

(if(not nom)(setq nom entreprecedente))

avec cette valeur ?

 

Quelle est la valeur de la variable nom après que tu aies fait :

(setq nom (getstring (strcat "\nNommer l'objet sélectionné ou :")))

et fait 'Entrée' ?

 

Que retourne :

(if(not nom)(setq nom entreprecedente))

avec cette valeur ?

 

Quelles conclusions peut tu tirer de ces retours ?

Partant de là, comment corriger ton code pour qu'il ne s'interrompe pas ?

Avec un peu de logique, tu devrais y arriver.

 

 

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

Invité samuelM
Posté(e)

 (setq nom (getstring (strcat "\nNommer l'objet sélectionné ou <" entreprecedente ">:")))

avec un nom retourne :

 

nommer l'objet sélectionné ou

 

valeur avec (if(not nom....)

 

Impossible d'entrer à nouveau LISP.

nil

 

 

---------------------------------------------------------------------

 

 

valeur de la variable nom après avoir fait entrée :

 (setq nom (getstring (strcat "\nNommer l'objet sélectionné ou <" entreprecedente ">:")))

 

avec entrée retourne :

 

nommer l'objet sélectionné ou

 

valeur avec (if(not nom....)

 

Impossible d'entrer à nouveau LISP.

"(if(not nom)(setq nom entreprecedente))"

 

 

je pense que la deuxième n'est pas du tout bonne. mais qu'il faut travailler sur la première. il faut renseigner le nil. il faut que l'entrée précédente soit enregistré

 

 

 

Posté(e)

Il semble qu'au lieu de répondre à l'invite "Nommer l'objet sélectionné ou :" en entrant un nom ou en faisant 'Entrée' tu entre l’expression : (if(not nom)(setq nom entreprecedente)).

 

Comment veux tu évaluer correctement ton code si tu ne fais pas ce que tu attends que l'utilisateur fasse en utilisant ton programme ?

 

Il me semblait pourtant avoir été clair :

Quelle est la valeur de la variable nom après que tu aies fait :

(setq nom (getstring (strcat "\nNommer l'objet sélectionné ou :")))

et entré un nom ?

 

Que retourne :

(if(not nom)(setq nom entreprecedente))

avec cette valeur ?

 

et de même en faisant 'Entrée' au lieu d'entrer un nom...

 

Si tu avais suivi ces instructions, tu aurais pu voir qu'en entrant un nom "toto" par exemple, cette chaîne aurait été affecté à la variable 'nom' et qu'en faisant 'Entrée' c'est une chaîne vide ("") qui est affecté à 'nom'.

 

Tu aurais aussi noté que dans les deux cas, (if(not nom)(setq nom entreprecedente)) retourne nil parce que dans les deux cas une valeur : "toto" ou "" est affectée à 'nom'.

C'est ce qui fait que ton code s'arrêtait immanquablement ici.

 

Ce qui veut dire qu'il faut remplacer (not nom) par (= nom "") et alors, en refaisant les tests ci-dessus tu aurais pu voir que si l'utilisateur fait 'Entrée',

(if(not nom)(setq nom entreprecedente)) retourne "bibo" (qui est affecté à 'nom').

Mais si l'utilisateur entre nom, cette expression retourne nil (comme précédemment). Ceci aura aussi pour effet d'arrêter l'évaluation de l'expression (and ...) et retourner nil, le programme s'arrête encore.

Il faudrait donc écrire :

(if (= nom "") (setq nom entreprecedente) T)

pour que si une valeur autre que "" est affectée à 'nom' cette expression ne retourne pas nil.

Ceci n'est pas très élégant mais fonctionnera...

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

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é