pascal19 Posté(e) le 15 septembre 2010 Posté(e) le 15 septembre 2010 BonjourJe 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 !?
bonuscad Posté(e) le 15 septembre 2010 Posté(e) le 15 septembre 2010 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
pascal19 Posté(e) le 15 septembre 2010 Auteur Posté(e) le 15 septembre 2010 en effet, c'est beaucoup mieux et en plus ça marche!merci beaucoup mais savez vous où etait mon erreur (par curiosité)
bonuscad Posté(e) le 15 septembre 2010 Posté(e) le 15 septembre 2010 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
zebulon_ Posté(e) le 15 septembre 2010 Posté(e) le 15 septembre 2010 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. AmicalementVincent 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)
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