Invité samuelM Posté(e) le 17 juin 2011 Posté(e) le 17 juin 2011 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
Tramber Posté(e) le 17 juin 2011 Posté(e) le 17 juin 2011 Je ne vois pas de raison pour que ton code s'arrête, cependant : (= (vla-get-ObjectName ent) "AcDb3dSolid") ne sert à riende 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) le 17 juin 2011 Posté(e) le 17 juin 2011 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) le 17 juin 2011 Posté(e) le 17 juin 2011 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.
(gile) Posté(e) le 17 juin 2011 Posté(e) le 17 juin 2011 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) le 17 juin 2011 Posté(e) le 17 juin 2011 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.
(gile) Posté(e) le 17 juin 2011 Posté(e) le 17 juin 2011 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) le 17 juin 2011 Posté(e) le 17 juin 2011 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 lispnil. 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]
(gile) Posté(e) le 17 juin 2011 Posté(e) le 17 juin 2011 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) le 17 juin 2011 Posté(e) le 17 juin 2011 (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é
(gile) Posté(e) le 17 juin 2011 Posté(e) le 17 juin 2011 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant