Aller au contenu

Je boucle !


LUDWIG

Messages recommandés

rebonjour,

 

mon [surligneur] mégalisp [/surligneur]est bientôt prêt. Mais en testant différente configuration, je m'aperçois d'une erreur dans un bout de code.

 

 (setq bloc_prop (tblnext "block" T))
(setq constituant_id (cdr (assoc -2 bloc_prop)))


(while constituant_id
(if (vl-catch-all-error-p (vl-catch-all-apply '(lambda ()(vla-GetBoundingBox (vlax-ename->vla-object constituant_id) 'mini 'maxi))))(setq RIEN "VRAI")(setq RIEN "FAUX")	
)
(setq constituant_id (entnext constituant_id))
)
[b] En plus clair : si j'ai au moins un objet dans mon bloc avec une GetBoundingBox alors RIEN=FAUX sinon RIEN=VRAI[/b]

 

Ceci marche pour :

- un bloc avec 2 lignes

- un bloc avec 1 ligne et une droite (qui n'a pas de GBB)

 

Mais quand j'ai un bloc constitué uniquement de droite, je ne m'arrête jamais de boucler. Quelqu'un voit mon erreur ?

 

Merci d'avance.

Autocad 2021 - Revit 2022 - Windows 10

Lien vers le commentaire
Partager sur d’autres sites

:)

 

Ben rien ne t'arrêtes !

 

J'ai jamais vu de blocs constitués uniquement de droites, mais bon.......

 

faut que tu fasses une sous-routine qui regarde si ce bloc malin n'est pas constitué de droite.

 

en bouclant les entités constituant ton bloc

 

Attention, ton tblnext est à T,....sauf erreur tu vas boucler sur le même bloc

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Autant pour moi

j'ai mal lu pour tblnext

 

Ton problème n'est pas si simple et difficile à décoder avec les fonctions vl d'erreur.

 

Je paris que ta déf de bloc avec 1 ligne et 1 droite, tu l'as pas essayé avec 1 droite puis une ligne.

 

Me trompe-je ?

 

Je rappelle que tu as un (while id_truc

donc ca boucle tant qu'il n'est pas nul

 

Peut être en le setq nil dans la gestion d'erreur ca marcherait mieux, mais ca bricole.

 

[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

Bonsoir Ludwig.

 

je viens te demander des précisions,

car je ne vois pas la finalité de ce code,

que recherches tu en cherchant la bounding box ?

surtout dans un bloc, si j'ai bien compris

 

et enfin c'est quoi la différence entre une Droite et une Ligne dans ton vocabulaire ?

 

amicalement

Lien vers le commentaire
Partager sur d’autres sites

[surligneur] TRAMBER : [/surligneur]tu as juste je n'ai pas essayé d'inverser l'ordre des entités. J'ai peut être un problème lors de la lecture de la dernière entité justement. Et si ça se trouve, l'erreur n'était pas dans le bout de code que j'ai présenté ( :mad2: )... Je testerais ça demain au boulot...

 

[surligneur] DIDIER : [/surligneur]

Je fais un lisp qui "normalise" les blocs d"un dessin quand le point d'insertion est à Pétaouchnok (c'est-à-dire hors de l'emprise du bloc). Les blocs redéfinis sont replacés correctement, et conserve les mêmes rotation et échelle.

 

pour répondre à ta question, je cherche la getboundingbox d'un bloc de la table des blocs (c'est à dire une entité " block" pas forcement insérée dans le dessin et non une entité " insert"). Or la getboundingbox ne fonctionne pas pour un " block" (ou alors je me suis mal débrouillé ?) mais fonctionne pour CERTAINES entités qui sont à l'intérieur... donc en testant chacune des entités, je peux obtenir les points extrêmes du " block". Certaines entités pouvant être contenues dans un " block" n'ont pas de getboundingbox et la recherche de cette gbb sur ces entités renvoies une erreur. Donc quand je trouve une entité sans gbb dans le bloc, j'analyse aussitôt l'entité suivante. Mais je peux aussi avoir le cas (rarissime mais pas impossible) d'un bloc constitué uniquement d'entité sans gbb (c'est le bout de code que j'ai mis dans ce post)... auquel cas je dois ignorer le bloc (en définissant ma variable RIEN sur VRAI)... et c'est ce bout de code qui me pose problème. Ouf ! J'espère que tu as compris mes élucubrations.

 

Quand à la différence entre ligne et droite, je serais tenter de te dire de regarder dans l'aide (haha)...

La signification géométrique d'une ligne autocad, c'est un segment.

La signification géométrique d'une droite autocad, c'est une droite : elle est donc illimitée et n'a pour conséquent pas de GetBoundingBox !

 

Je n'ai pas vraiment testé les autres entités pour voir lesquelles n'ont pas de gbb

Autocad 2021 - Revit 2022 - Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Or la getboundingbox ne fonctionne pas pour un " block" (ou alors je me suis mal débrouillé ?)

 

En effet, je viens d'essayer, ca ne marche pas, même si

(tblobjname "block" "nomdubloc")

renvoie l'entité BLOCK mais n'est pas analysable par la gbb.

contrairement à ce que j'ai voulu nous faire penser dans ton message précédent.

 

Un conseil;

 

fais un lisp + simple avec des boucles imbriquées qui parcourent les blocs et les éléments du blocs.

Tu n'auras aucune difficulté à éviter la gbb sur un bloc constitué de droites,

+ simple encore à sauter au dessus de tout élément non compatible.

 

Vaincre les problèmes avec la gestion d'erreur me parait "chaud" (parce que je n'ai pas la maitrise moi-même), d'autres verrons peut-être la solution dans ce sens...

 

 

[Edité le 24/4/2005 par Tramber]

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Je n'ai pas tout bien compris, mais moi quand je veux dépiauter un bloc, je fais une boucle while jusqu'à tomber sur SEQEND

 

 

(setq bloc_prop (tblnext "block" T))

(while bloc_prop

(setq constituant_id (cdr (assoc -2 bloc_prop)))

 

(setq AC (entget constituant_id))

(while (/= (cdr (assoc 0 AC)) "SEQEND")

....

(setq constituant_id (entnext constituant_id))

(setq AC (entget constituant_id))

)

(setq bloc_prop (tblnext "block"))

)

 

 

en résumé, d'abord je défile la liste des blocs dans la table des blocs, puis pour chaque bloc je dépiaute chaque élément avec une autre boucle while.

 

A propos des blocs, les xrefs sont définis comme des blocs, ne faudrait-il pas les exclure ??

 

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

TRAMBER : tu avais raison, c'est l'ordre des entités qui cause mon problème --> si la dernière entité scannée n'a pas de gbb, c'est là ou sa plante. Donc je vais chercher la correction.

 

ZEBULON_ : moi je fais une boucle sur les entités tant que constituant_id n'est pas nul ("while constituant_id"). Je ne sais pas la recherche du SEQEND va changer quelque chose, je vais essayer. Par contre, très bonne remarque sur les Xref ! Il vaut mieux que je les filtre... Mon code pourrait marcher sur eux (quoique je viens d'essayer et j'ai une erreur) mais les Xref sont souvent lourds (plan archi entier par ex).

 

Merci

Autocad 2021 - Revit 2022 - Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Mais tel c'est écrit, j'ai l'impression que constituant_id ne devient nil que quand tu arrives à la fin du fichier et non à la fin de la définition du block ???

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

J'ai vérifié : je tourne en boucle quand mon dernier objet scanné n'a pas de gbb (droite en l'occurrence).

 

Par contre je n'ai pas réussi à me servir de SEQEND, j'obtiens une erreur "ltypentity nil" ou un truc du style...

Autocad 2021 - Revit 2022 - Windows 10

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é