Bonjour,
Pour travailler sur un topographie, j'ai récupéré un lisp pour extraire des altimétries ALT et les réinjecter dans le Z autocad. Cependant quand je fais le commande ALTZ, j'ai le message d'erreaur suivant qui apaprait :
error: bad argument type: VLA-OBJECT nil
Comment réparer l'erreur ?
Voici le lisp en question :
(defun c:altz(/ doc ent pts sel)
(vl-load-com)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark doc)
(and (ssget "x" (list (cons 0 "insert") (cons 2 "points") (cons 66 1)))
(progn
(vlax-for ent (setq sel (vla-get-activeselectionset doc))
(setq pts (vlax-get ent 'insertionpoint))
(vlax-put ent 'insertionpoint (list (car pts) (cadr pts) (atof (vla-get-textstring (nth 1 (vlax-invoke ent 'getattributes))))))
)
(vla-delete sel)
)
)
(vla-endundomark doc)
(princ)
)
Merci d'avance
Résolu ! Accéder à la solution.
Résolu par _gile. Accéder à la solution.
Bonjour @lauren.tubertTEJ25
par exemple si c'est écrit z=32.12 ça peut pas marcher
Envoyez sur le site un extrait du dessin, je vais regarder ça de plus près
Amicalement
Didier Aveline
Bonjour Didier,
L'attribut ALT est une valeur numérique sous la forme : 25.69
Je vous joins mon fichier autocad,
Merci 🙂
Dans le fichier attaché, 25 blocs n'ont pas d'attribut ALT.
J'ai réécris une routine plus robuste avec une gestion d'erreur qui permet de ne pas bloquer en cas d'erreur et qui met les blocs incriminés en couleur orange (30). Une sélection rapide en filtrant sur la couleur permet de les retrouver.
(defun c:altz (/ doc ss i try)
(vl-load-com)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark doc)
(if
(setq
ss (ssget "x"
(list (cons 0 "insert") (cons 2 "points") (cons 66 1))
)
)
(repeat (setq i (sslength ss))
(setq try
(vl-catch-all-apply
'(lambda (/ ent pt)
(setq ent (ssname ss (setq i (1- i)))
pt (getpropertyvalue ent "Position")
)
(setpropertyvalue
ent
"Position"
(list (car pt)
(cadr pt)
(atof (getpropertyvalue ent "ALT"))
)
)
)
)
)
(if (vl-catch-all-error-p try)
(setpropertyvalue ent "Color" 30)
)
)
)
(vla-endundomark doc)
(princ)
)
Bonjour
Grillé par (gile), j'aurais dû l'en douter
Toutefois j'en suis arrivé aux mêmes conclusions
J'ai lu la réponse de (gile) mais je suis surpris de recevoir
; erreur: Demande ADS erronée
Je ne vois pas dans les lignes de code la raison...
Amicalement
Amicalement
Didier Aveline
Bonjour @lauren.tubertTEJ25
Il y avait deux blocs de même nom,
Un avec un seul attribut MAT et l'autre avec deux attributs MAT et ALT
Après la synchronisation le message d'erreur disparaît.
La programmation ne peut pas grand-chose avec des dessins contenant des aberrations
Le programme peut avoir prévu plein de contrôle, mais l'imagination des utilisateurs est sans limite, et il m'arrive souvent d'écrire des programmes ne prévoyant pas tous les cas qui se présentent, c'est, entre autre, à ça qu'on détecte le "développeur".
Amicalement
Didier Aveline
Toutes mes excuses je me suis embrouillé les pinceaux et n'avais posté la bonne version.
(defun c:altz (/ doc ss i ent pt try)
(vl-load-com)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark doc)
(if
(setq
ss (ssget "x"
(list (cons 0 "insert") (cons 2 "points") (cons 66 1))
)
)
(repeat (setq i (sslength ss))
(setq ent (ssname ss (setq i (1- i)))
pt (getpropertyvalue ent "Position")
)
(setq try
(vl-catch-all-apply
'(lambda ()
(setpropertyvalue
ent
"Position"
(list (car pt)
(cadr pt)
(atof (getpropertyvalue ent "ALT"))
)
)
)
)
)
(if (vl-catch-all-error-p try)
(setpropertyvalue ent "Color" 30)
)
)
)
(vla-endundomark doc)
(princ)
)
Bonjour @_gile
Je te remercie de ta réponse,
le message est laconique pour une marque commerciale iconique
Amicalement
Didier Aveline
Bonjour @lauren.tubertTEJ25
Si une des réponses résout votre problème ou vous a permis de mieux le comprendre, voulez vous avoir l'amabilité de cliquer sur le bouton APPROUVER LA SOLUTION en bas de la réponse qui apporte une solution?
Merci de ne pas accepter comme solution le message que vous êtes en train de lire.
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.