Aller au contenu

selection blocs à attributs


Messages recommandés

Posté(e)

Bonjour

Je cherche à sélectionner les blocs à attributs à partir d'une sélection de bloc,

j'ai fait:

 

 (defun C:selblatt ()


 (setq sel1 (ssget))
 (setq compteur 0)
 (setq longsel1 (sslength sel1))
 (while (< compteur longsel1)
   (setq entite (ssname sel1 compteur))
   (setq blatt (cdr (assoc 66 (entget entite))))

   (if	(= blatt nil)
     (ssdel entite sel1)
   )
   (setq compteur (1+ compteur))

 )

)

 

mais ça marche pas, qu'est ce que j'ai oublié encore !?

Posté(e)

Bonjour,

 

Pourquoi ne pas utiliser tout simplement les possibilités de filtres de (ssget)? Cela serait plus simple et t'éviterais d'analyser ton jeu de sélection!

 

Exemple

(sssetfirst
nil
(ssget
	(list
		(cons 0 "INSERT")
		(cons 410 (getvar "CTAB"))
		(cons 66 1)
	)
)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

mais savez vous où etait mon erreur (par curiosité)

 

Tu as déclaré (setq longsel1 (sslength sel1)) et exécuté ta boucle (while (< compteur longsel1)

 

Le problème est que dans ta boucle tu modifie ton jeu de sélection si l'entité ne convient pas (ssdel entite sel1).

 

Donc longsel1 ne correspond plus à l'index de contenu de sel1 puisque tu as modifié celui-ci et par conséquence un (ssname sel1 compteur) risque d'échouer.

 

Il aurait fallu mettre longsel1 à jour dans ta boucle.

 

 

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

mais savez vous où etait mon erreur (par curiosité)

 

Bonjour,

 

il y a une boucle while dont le but est de parcourir les éléments du jeu de sélection sell les uns après les autres, par le biais de ssname. Mais, à l'intérieur de la boucle while, le jeu de sélection sell est modifié par un ssdel. Donc, à chaque ssdel, le jeu de sélection est amputé d'un élément et, au bout d'un moment, le compteur pointe au-delà du nombre de membres du jeu de sélection. Ce qui revient, en quelque sorte, à couper la branche sur laquelle on est assis.

 

Quand on veut parcourir un jeu de sélection, il vaut mieux créer une liste ou jeu de sélection dans lequel on met tout ce qui nous intéresse, sans toucher au jeu de sélection d'origine en cours de route, et exploiter le nouveau jeu de sélection (ou liste) par la suite.

 

(defun C:selblatt ()
 (setq sel1 (ssget))
 (if sel1
   (progn
     (setq compteur 0)
     (setq sel2 (ssadd))
     (repeat (sslength sel1)
       (setq entite (ssname sel1 compteur))
       (setq blatt (cdr (assoc 66 (entget entite))))
       (if blatt
         (ssadd entite sel2)
       )
       (setq compteur (1+ compteur))
     )
   )
 )
)

 

Par ailleurs, dans ce qu'il y a ci-dessus, on ne vérifie pas si le code dxf 66 provient d'un bloc. Il se pourrait très bien que d'autres types d'entités utilisent également ce code pour désigner autre chose que le "drapeau attributs suivent". Je connais au moins un type d'entité qui utilise ce code : la polyligne (pas la lwpolyline) où le code 66 signifie "drapeau sommets suivent". Alors, soit il faut utiliser à la source les possibilités de filtres de ssget, comme le suggère très justement bonuscad, soit faire un test par la suite et s'assurer qu'il s'agit bien d'une entité de type INSERT. Il va sans dire que la première méthode est bien plus efficace.

 

Amicalement

Vincent

 

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)

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é