LUDWIG Posté(e) le 19 avril 2005 Posté(e) le 19 avril 2005 Bonjour, L'aide du développeur propose des méthodes de gestion d'erreur que j'ai du mal a mettre en application... Je souhaite tester si une manipulation renvoie une erreur ou non (en l'occurrence un getboundingbox sur un objet). Si une erreur est revoyée, je passe à l'objet suivant... [b] CE CODE RENVOIE UNE ERREUR SI L'OBJET CHOISIE N'A PAS DE GETBOUNDINGBOX (une droite par exemple)[/b] (defun c:gbb () (vla-GetBoundingBox (vlax-ename->vla-object (cdr (assoc -1 (entget (car (entsel)))))) 'mini 'maxi) (setq maxi (vlax-safearray->list maxi)) (setq mini (vlax-safearray->list mini)) (command "rectang" mini maxi) (print "emprise (2D uniquement) tracée")(princ) ) Je tente donc d erajouter 2 lignes après le defun : (defun c:gbb () [b](setq err (vl-catch-all-apply '(vla-GetBoundingBox (vlax-ename->vla-object (cdr (assoc -1 (entget (car (entsel)))))) 'mini 'maxi))) (if (=(vl-catch-all-error-p err)nil)(progn[/b] (vla-GetBoundingBox (vlax-ename->vla-object (cdr (assoc -1 (entget (car (entsel)))))) 'mini 'maxi) (setq maxi (vlax-safearray->list maxi)) (setq mini (vlax-safearray->list mini)) (command "rectang" mini maxi) (print "emprise (2D uniquement) tracée")(princ) ))) Mais mon erreur est toujours renvoyée... Y-at'il quelqu'un qui pourrait me guider ? Autocad 2021 - Revit 2022 - Windows 10
LUDWIG Posté(e) le 21 avril 2005 Auteur Posté(e) le 21 avril 2005 Personne pour m'aider dans la gestion d'erreur ? :calim: :calim: :calim: :calim: Autocad 2021 - Revit 2022 - Windows 10
bonuscad Posté(e) le 21 avril 2005 Posté(e) le 21 avril 2005 Peut être, j'ai pas fait le test, la variable "ERRNO" Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Tramber Posté(e) le 21 avril 2005 Posté(e) le 21 avril 2005 Oh, oh, doucement. C'est déjà bien que je me mette à la gestion d'erreurs en Autolisp,...alors en Vlisp ;) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 21 avril 2005 Posté(e) le 21 avril 2005 Peut-être de cette manière (setq err (vl-catch-all-apply '(lambda ()(vla-GetBoundingBox (vlax-ename->vla-object (car (entsel))) 'mini 'maxi)))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
LUDWIG Posté(e) le 21 avril 2005 Auteur Posté(e) le 21 avril 2005 [surligneur] TRAMBER : [/surligneur]je ne savais pas qu'il y avait aussi des commandes de gestion d'erreur en autolisp, s'est pourquoi je suis parti sur les vl-... [surligneur] Patrick_35 :[/surligneur] Yes, c'est ça ! je n'ai pas vraiment compris la fonction de lambda (même avec l'aide en français) mais je vais pouvoir me débrouiller ! Merci beaucoup à tous, je vous ferais part de mon super lisp (!) Autocad 2021 - Revit 2022 - Windows 10
Patrick_35 Posté(e) le 21 avril 2005 Posté(e) le 21 avril 2005 je ne savais pas qu'il y avait aussi des commandes de gestion d'erreur en autolispC'est la fonction *error*, fais une recherche dessus La fonction lambda permet de définir une fonction anonyme Tu noteras aussi que je t'ai simplifié la transformation d'une entité en objet je vous ferais part de mon super lisp (!)Je sens qu'on ne va même plus réfléchir, tout sera automatique ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Tramber Posté(e) le 21 avril 2005 Posté(e) le 21 avril 2005 (setq rep(vlax-ename->vla-object (cdr (assoc -1 (entget (car (entsel))))))) (if(vlax-method-applicable-p rep "GetBoundingBox")....bla bla Je viens d'essayer ça. C'est fou qu'une droite renvoie T alors que la méthode n'est pas valable (juste applicable !). donc il te reste à filtrer : (setq rep(vlax-ename->vla-object(setq donc(cdr (assoc -1 (entget (car (entsel))))))) typeu(cdr(assoc 0(entget donc)))) (cond((or (= typeu "LWPOLYLINE") (= typeu "CIRCLE") (= typeu "ARC") (= typeu "INSERT")) (progn (vla-GetBoundingBox rep 'mini 'maxi) (setq maxi (vlax-safearray->list maxi)) (setq mini (vlax-safearray->list mini)) (command "rectang" mini maxi) (print "emprise (2D uniquement) tracée"))) (T(princ"Cet objet ne peut donner des limites"))) ici les LWpoly, les arcs, cercles et blocs Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 21 avril 2005 Posté(e) le 21 avril 2005 Tramber, je ferai la même remarque que pour Ludwig en ce qui concerne la transformation d'une entité en objet Et j'ai juste une question concernant ton lisp, un peu vicieuse je le reconnais et à testerTu fais comment pour une lwpolyligne avec seulement deux sommets (ce qui revient à une droite) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
LUDWIG Posté(e) le 22 avril 2005 Auteur Posté(e) le 22 avril 2005 C'est la fonction *error*Ah oui d'accord, je connaissais mais j'ai préféré ne pas m'en servir : j'ai un seul fichier lsp avec une quarantaine de "defun", et une erreur sur n'importe quelle fonction m'aurait renvoyé vers cette fonction error. [surligneur] Patrick_35[/surligneur] Pour la simplification (cdr (assoc -1 (entget (car (entsel))))) [b] -->[/b] (car (entsel))C'est clair c'est carrément plus simple. [surligneur] Tramber[/surligneur]J'avais cette option, de tester le type d'entité, mais je ne l'ai pas retenu :y en a tellement, et je ne sais pas lesquelles n'ont pas de GetBoundingBox (atribut, etc). En plus je suis sur Autodesk Architectural Desktop donc j'ai aussi tout les objets murs, poteaux, fenetres, portes, toits, dalles, aires, espaces, blocs à vues multiples, etc qui peuvent aussi être contenu dans un bloc. Comme ça, si Autodesk rajoute des types d'entités dans Autocad 2049, mes petits enfants pourront toujours profiter de mon lisp (haha). Je sens qu'on ne va même plus réfléchir, tout sera automatique Il n'y aura même plus besoin de dessinateur derrière l'écran !Non, mon lisp servira juste àredéfinir tous les blocs du dessin pour lesquels le point d'insertion n'est pas dans la GetBoundingBox. Les blocs resteront sagement à leur place (même position des entités dans le dessin, même rotation et échelles) avec le bon nom malgré le changement de point d'insertion... Autocad 2021 - Revit 2022 - Windows 10
Tramber Posté(e) le 22 avril 2005 Posté(e) le 22 avril 2005 Patrick_35 Quel est le problème avec une poly à 2 points ?!Qui n'est toujours pas une droite. Ludwig Tu peux faire un filtre négatif avec NOT mais tu as raison, j'ai déjà rencontré un cas où seul une fonction d'erreur me convenait.il s'agissait de la fonction Offset (décaler) qui ne peut pas toujours marcher. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 22 avril 2005 Posté(e) le 22 avril 2005 Laisse tomber, je devais être fatigué hier soir. Un poly reste une poly @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Tramber Posté(e) le 22 avril 2005 Posté(e) le 22 avril 2005 ;) Au fait, Ludwig, tu sais qu'il n'est pas necessaire de rentrer dans les definitions de blocs (BLOC). Tu prends 1 objet bloc (INSERT) existant dans le dessin, tu vérifies qu'il a des bonnes échelles X=Y...=Z, et tu fais ton bounding sur l'objet INSERT, comme dans mon code. Remarque : le vice serait un bloc contenant une droite, mais je suis sur que ca marcherait. [Edité le 22/4/2005 par Tramber] Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
LUDWIG Posté(e) le 22 avril 2005 Auteur Posté(e) le 22 avril 2005 Tramber, c'est ce que j'avais fait au début mais justement, si aucun des blocs n'est à l'échelle 1 rotation 0, ça pose problème. Et comme je suis perfectionniste (mais pas parfait), j'ai préféré m'attaquer à la table des blocs... Autocad 2021 - Revit 2022 - Windows 10
Tramber Posté(e) le 22 avril 2005 Posté(e) le 22 avril 2005 Tramber, c'est ce que j'avais fait au début mais justement, si aucun des blocs n'est à l'échelle 1 rotation 0, ça pose problème. Ben t'en fais un et tu l'effaces aussi sec ! **********************Mais que dis-je, (tblobjname "block" "nomdubloc") marchera très bien et y a pas besoin d'avoir un INSERT. T'as essayé ca ? [Edité le 22/4/2005 par Tramber] Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
LUDWIG Posté(e) le 29 avril 2005 Auteur Posté(e) le 29 avril 2005 C'est vrai que j'aurais été moins embetté en insérant le bloc dans le dessin, en faisant la gbb puis en le supprimant... Mais je ne vois pas en quoi (tblobjname "block" "nomdubloc") peut m'aider ? Autocad 2021 - Revit 2022 - Windows 10
Tramber Posté(e) le 29 avril 2005 Posté(e) le 29 avril 2005 Salut, j'ai répondu à la question que tu viens de poser dans la suite de ton message (c'est un autre sujet de ce forum). Comme dit là-bas, ca renvoit le nom de l'ENTITE bloc, mais après vérif, la GBB n'est pas acceptée dessus. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
LUDWIG Posté(e) le 29 avril 2005 Auteur Posté(e) le 29 avril 2005 J'ai fini mon lisp grace à votre aide: Redéfinir les points d'insertion mal placés des blocs Autocad 2021 - Revit 2022 - Windows 10
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