Aller au contenu

gestion d\'erreur


LUDWIG

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

[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

Lien vers le commentaire
Partager sur d’autres sites

je ne savais pas qu'il y avait aussi des commandes de gestion d'erreur en autolisp

C'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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

(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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

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 à tester

Tu fais comment pour une lwpolyligne avec seulement deux sommets (ce qui revient à une droite)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

;)

 

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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

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é