Aller au contenu

Extrait de routine qui ne fonctionne pas partout


Messages recommandés

Posté(e)

Bonjour à tous...

 

Voilà, aujourd'hui, je cherche à dessiner un "solid" sous en texte multiligne.

 

J'ai, pour cela, récupérer un bout de LISP, de Maître (gile), pour l'utiliser dans mon nouveau LISP. Mais ça ne fonctionne pas... J'ai donc ce code (avec un paquet de drapeaux placés vite-fait pour situer l'erreur plus vite) :

(defun c:TestTrameText (/ Select ent elst n nor ref rot wid jus hgt org plst box mat mxv Pt1 Pt2 Pt3 Pt4)
 (setq n 0)
 (if (setq Select (ssget "_X" '((0 . "MTEXT") (8 . "Coordonnées"))))
   (progn (while (setq ent (ssname Select n))
            (princ "\n...setq elst = \t")
            (princ elst)
            (setq elst (entget ent))
            (princ "\n...setq nor = \t")
            (setq nor (cdr (assoc 210 elst)))
            (princ nor)
            (princ "\n...setq ref = \t")
            (setq ref (trans (cdr (assoc 10 elst)) 0 nor))
            (princ ref)
            (princ "\n...setq rot = \t")
            (setq rot (angle '(0 0 0) (trans (cdr (assoc 11 elst)) 0 nor)))
            (princ rot)
            (princ "\n...setq wid = \t")
            (setq wid (cdr (assoc 42 elst)))
            (princ wid)
            (princ "\n...setq hgt = \t")
            (setq hgt (cdr (assoc 43 elst)))
            (princ hgt)
            (princ "\n...setq jus = \t")
            (setq jus (cdr (assoc 71 elst)))
            (princ jus)
            (princ "\n...setq org = \t")
            (setq org (list (cond ((member jus '(2 5 8)) (/ wid -2))
                                  ((member jus '(3 6 9)) (- wid))
                                  (T 0.0)
                            ) ;_ Fin de cond
                            (cond ((member jus '(1 2 3)) (- hgt))
                                  ((member jus '(4 5 6)) (/ hgt -2))
                                  (T 0.0)
                            ) ;_ Fin de cond
                      ) ;_ Fin de list
            ) ;_ Fin de setq
            (princ org)
            (princ "\n...setq plst")
            (setq plst (mapcar (function (lambda (p) (mapcar '+ org p)))
                               (list (list (- 0.1) (- 0.1))
                                     (list (+ wid 0.1) (- 0.1))
                                     (list (+ wid 0.1) (+ hgt 0.1))
                                     (list (- 0.1) (+ hgt 0.1))
                               ) ;_ Fin de list
                       ) ;_ Fin de mapcar
            ) ;_ Fin de setq
            (princ plst)
            (princ "\n...setq box = \t")
            (setq box (textbox elst))
            (princ box)
            (princ "\n...setq ref = \t")
            (setq ref (cdr (assoc 10 elst)))
            (princ ref)
            (princ "\n...setq rot = \t")
            (setq rot (cdr (assoc 50 elst)))
            (princ rot)
            (princ "\n...setq plst = \t")
            (setq plst (list (list (- (caar box) 0.1) (- (cadar box) 0.1))
                             (list (+ (caadr box) 0.1) (- (cadar box) 0.1))
                             (list (+ (caadr box) 0.1) (+ (cadadr box) 0.1))
                             (list (- (caar box) 0.1) (+ (cadadr box) 0.1))
                       ) ;_ Fin de list
            ) ;_ Fin de setq
          ) ;_ Fin de if
          (princ plst)
          (princ "\n...setq mat = \t")
          (setq mat (list (list (cos rot) (- (sin rot)) 0) (list (sin rot) (cos rot) 0) '(0 0 1)))
          (princ mat)
          (princ "\n...setq plst = \t")
          (setq plst (mapcar (function (lambda (p) (mapcar '+ (mxv mat p) (list (car ref) (cadr ref))))) plst))
          (princ plst)
          (princ "\nAttribution des quatre points")
          (setq Pt1 (list (car (nth 0 plst)) (cadr (nth 0 plst))))
          (setq Pt2 (list (car (nth 1 plst)) (cadr (nth 1 plst))))
          (setq Pt3 (list (car (nth 2 plst)) (cadr (nth 2 plst))))
          (setq Pt4 (list (car (nth 3 plst)) (cadr (nth 3 plst))))
;;;
          (command "_.solid" Pt1 Pt2 Pt4 Pt3 "")
          (setq n (1+ n))
   ) ;_ Fin de progn
 ) ;_ Fin de while
)

Et donc, AutoCAD me répond :

Commande: TESTTRAMETEXT

...setq elst = nil

...setq nor = (0.0 0.0 1.0)

...setq ref = (20.3199 17.4986 0.0)

...setq rot = 0.0

...setq wid = 1.26938

...setq hgt = 0.940205

...setq jus = 1

...setq org = (0.0 -0.940205)

...setq plst((-0.1 -1.04021) (1.36938 -1.04021) (1.36938 0.1) (-0.1 0.1))

...setq box = nil

...setq ref = (20.3199 17.4986 0.0)

...setq rot = 0.0

...setq plst = ; erreur: type d'argument incorrect: numberp: nil

Commande:

 

Je pense que l'erreur se situe au niveau du (setq box (textbox elst))qui est nil, donc, le (setq plst plante, mais je ne sais pas quoi faire...

 

Si quelqu'un a une astuce, un conseil... Je suis preneur...

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)

Posté(e)

Coucou

 

tu t'attaques à du "lourd",

il faut maîtriser les changements de base

pour toi c'est OK cette technique ?

 

c'est là qu'apparaît la limite du copier-coller !!!

ce que je veux dire par là (j'y ai été confronté)

il vaut mieux écrire ton code du début à la fin, tu pigeras bien mieux.

 

amicalement

Posté(e)

Salut didier, et merci pour ta réponse...

 

C'est du copier/coller, je ne le cache pas, ;) car je suis incapable d'écrire un tel code...

 

Oui, le copier/coller est parfois indispensable, un peu comme si on utilisait une DLL (on sait ce qu'elle fait, mais on ne sait pas comment).

 

Je l'utilise déjà ce code dans un autre LISP et il fonctionne très bien...

 

C'est juste que je ne pige pas pourquoi, en l’occurrence dans ce cas, il plante...?

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)

Posté(e)

En plus, dans ce code, un (mapcar (function (lambda (p) (mapcar...

 

Même le copier/coller me fait mal au crane... ;)

 

Hop, Aspirine...

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)

Posté(e)

Salut,

 

Émailler le code de print pour déboguer est la méthode utilisée quand on n'a pas d'IDE (Environnement de Dévelopement Intégré en français), autrement dit quand on code depuis un éditeir de texte.

Si tu utilises l'éditeur Visual LISP, serts toi des fonctions de débogage : tu mets un point d'arrêt au début de ta fonction et tu fais un "pas à pas" (touche F8), à tout moment tu pourras interroger la valeur actuelle des variables (ou le résultat d'expressions) dans la console.

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

Posté(e)

Salut (gile), et merci pour ton aide...

 

Oui, j'ai déjà essayé le mode pas à pas, mais je ne sais jamais où j'en suis dans l'exécution du code... A quelle ligne on en est...

 

En VBA, la ligne en cours est surlignée, mais là, je ne trouve rien qui me l'indique...

 

De plus, j'ai placer un point d'arrêt à la deuxième ligne du code (sous le defun) et mon code s'exécute en entier, sans rien me dire...

 

Il ne fait qu'activer la fenêtre de l'IDE mais AutoCAD m'a déjà répondu "Commande: TESTTRAMETEXT ; erreur: type d'argument incorrect: numberp: nil"

 

T'as une astuce ?

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)

Posté(e)

Et comment tu lances le mode "pas à pas" ?

 

Chez moi, c'est grisé...

 

Oops, j'avais oublié qu'on ne peut plus joindre de fichiers...

 

Je te fais une capture et un WeTransfer...

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)

Posté(e)

Il faut d'abord mettre un point d'arrêt : tu places ton curseur là où tu veux mettre le point d'arrêt (devant : (progn ... par exemple) et tu relances la routine. quand l'interprétation du code arrive au point d'arrêt, l'interprétation s'interrompt. Le focus passe de la fenêtre d'AutoCAD à l'éditeur Visual LISP où tu reprends la main pour évaluer des variables ou des expressions dans la console et/ou continuer l'évaluation "pas à pas" en faisant F8 ou Ctrl+F8 pour aller jusqu'au prochain point d'arrêt.

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é