lecrabe Posté(e) le 5 octobre 2006 Posté(e) le 5 octobre 2006 Bonjour Les Pros de la Prog J'ai un dessin avec des polylignes closes ou cercles et a l'interieur de ces polylignes / closes, j'ai parfois d'autres objets:points, blocs, textes, lignes, polylignes, etc J'ai besoin d'isoler ces objets "A l'interieur" mais aussi de connaitre quels sont les polylignes / cercles qui ont ou qui n'ont pas des objets a l'interieur pour les isoler aussi ... Je pense qu'il faut une routine Lisp/V-Lisp pour faire cette manipulation ... En resume, soit un dessin avec des polylignes closes et des cercles.- Dessiner a l'interieur de CERTAINS de ces polylignes / cercles des points, textes, blocs, etc A la sortie de la routine, je veux pouvoir selectionner : - Tous les polylignes / cercles qui N'ONT PAS d'objet a l'interieur pour les transferer EVENTUELLEMENT sur un autre calque. - Tous les polylignes / cercles qui ONT des objets a l'interieur pour les transferer EVENTUELLEMENT sur un autre calque. - Tous les objets qui SONT a l'interieur de ces memes polylignes / cercles pour les transferer EVENTUELLEMENT sur un autre calque. Me suis je bien exprime ? Cela doit fonctionner sur un AutoCAD 2004-2007 ! (Si possible) Le Decapode Autodesk Expert Elite Team
(gile) Posté(e) le 5 octobre 2006 Posté(e) le 5 octobre 2006 Salut, Un petit truc vite fait, avec la fonction SelByObj. Il faut d'abord lancer ss123 pour créer les 3 jeux de sélection qui seront conservés dans des variables globales (*ss1* *ss2* *ss3*).Ensuite, lancer contenu sélectionne tous les objets contenus dans les cercles et polylignes, contenant les cercles et polylignes qui contiennnent des objets, et vide les cercles et polylignes vides. Désolé, j'avais encore oublié de mettre des espaces à enlever entre ;;; SelByObj -Gilles Chanteau- 04/10/06 ;;; Crée un jeu de sélection avec tous les objets contenus ou ;;; capturés par le polygone créé à partir de l'objet sélectionné ;;; Les courbes (cercles, ellipses, arcs de polylignes) sont segmentés ;;; Arguments : ;;; - un nom d'entité (ename) -cercle, ellipse, polyligne fermée- ;;; - un mode de sélection (Cp ou Wp) ;;; - un filtre de sélection (defun SelByObj (ent opt fltr / obj dist n lst prec dist p_lst) (vl-load-com) (setq obj (vlax-ename->vla-object ent)) (cond ((member (cdr (assoc 0 (entget ent))) '("CIRCLE" "ELLIPSE")) (setq dist (/ (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj) ) 50 ) n 0 ) (repeat 50 (setq lst (cons (trans (vlax-curve-getPointAtDist obj (* dist (setq n (1+ n)))) 0 1 ) lst ) ) ) ) (T (setq p_lst (vl-remove-if-not '(lambda (x) (or (= (car x) 10) (= (car x) 42) ) ) (entget ent) ) ) (while p_lst (setq lst (append lst (list (cdr (assoc 10 p_lst))))) (if (/= 0 (cdadr p_lst)) (progn (setq prec (fix (* 50 (abs (cdadr p_lst)))) dist (/ (- (if (cdaddr p_lst) (vlax-curve-getDistAtPoint obj (cdaddr p_lst) ) (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj) ) ) (vlax-curve-getDistAtPoint obj (cdar p_lst) ) ) prec ) n 0 ) (repeat (1- prec) (setq lst (append lst (list (trans (vlax-curve-getPointAtDist obj (+ (vlax-curve-getDistAtPoint obj (cdar p_lst) ) (* dist (setq n (1+ n))) ) ) 0 1 ) ) ) ) ) ) ) (setq p_lst (cddr p_lst)) ) (setq lst (mapcar '(lambda (x) (trans x 0 1)) lst)) ) ) (ssget (strcat "_" opt) lst fltr) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:ss123 (/ ss n sstemp ent n2) (setq *ss1* (ssadd) *ss2* (ssadd) *ss3* (ssadd) ss (ssget "_X" '((-4 . "[color=#CC0000] (0 . "CIRCLE") (-4 . "[color=#CC0000] (0 . "LWPOLYLINE") (-4 . "&") (70 . 1) (-4 . "AND>") (-4 . "OR>") ) ) ) (if ss (repeat (setq n (sslength ss)) (if (setq sstemp (SelByObj (setq ent (ssname ss (setq n (1- n)))) "Wp" nil ) ) (progn (repeat (setq n2 (sslength sstemp)) (ssadd (ssname sstemp (setq n2 (1- n2))) *ss1*) ) (ssadd ent *ss2*) ) (ssadd ent *ss3*) ) ) ) (alert "La sélection est terminée") (princ) ) (defun c:contenu () (sssetfirst nil nil) (sssetfirst nil *ss1*) (princ) ) (defun c:contenant () (sssetfirst nil nil) (sssetfirst nil *ss2*) (princ) ) (defun c:vide () (sssetfirst nil nil) (sssetfirst nil *ss3*) (princ) ) [Edité le 5/10/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 5 octobre 2006 Posté(e) le 5 octobre 2006 Re, Et si des polylignes fermées ou des cercles sont contenus dans d'autres polylignes ou cercles, faut il les écarter du jeu de sélection des objets "contenus" ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 5 octobre 2006 Auteur Posté(e) le 5 octobre 2006 Hello (gile) Merci beaucoup Oh Grand Maître, je vais tester ta routine ! :) :D :cool: On supposera que des raisons de simplification, il n'y a AUCUN niveau d'imbrication des cercles / polylignes closes extérieures et que DONC les objets EUX-MEMES éventuellement à l'intérieur NE SONT PAS des cercles / polylignes closes / etc ... :P mais seulement des Points, Textes, Blocs, Arcs, ... ;) Le Decapode "testeur" Autodesk Expert Elite Team
(gile) Posté(e) le 5 octobre 2006 Posté(e) le 5 octobre 2006 Sinon ce n'est vraiment pas grand chose à faire, SelByObj est prévue pour fonctionner avec un filtre de sélection. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 5 octobre 2006 Auteur Posté(e) le 5 octobre 2006 Hello (gile) Ta routine est EXCELLENTE - Mille MERCIs !!! :) :D :cool: Elle marche SUPER :P :P :P Si tu penses qu'il est possible de la modifier FACILEMENT pour avoir dans CONTENANT ou VIDE - QUE des Cercles / Polylignes EXTERIEURES ! Et que dans CONTENU on aura TOUS les objets intérieurs quelqu'ils soient y compris des imbrications de Polylignes / Cercles ... Je suis preneur si bien sur c'est pas trop de boulot ! Le Decapode "impressionné par le gars du Sud" Autodesk Expert Elite Team
(gile) Posté(e) le 5 octobre 2006 Posté(e) le 5 octobre 2006 Si j'ai bien compris, toujours avec SelByObj et après avoir supprimé les espaces : (defun c:ss123 (/ ss n sstemp ent n2) (setq *ss1* (ssadd) *ss2* (ssadd) *ss3* (ssadd) ss (ssget "_X" '((-4 . "[color=#CC0000] (0 . "CIRCLE") (-4 . "[color=#CC0000] (0 . "LWPOLYLINE") (-4 . "&") (70 . 1) (-4 . "AND>") (-4 . "OR>") ) ) ) (if ss (progn (repeat (setq n (sslength ss)) (if (setq sstemp (SelByObj (setq ent (ssname ss (setq n (1- n)))) "Wp" nil ) ) (progn (repeat (setq n2 (sslength sstemp)) (ssadd (ssname sstemp (setq n2 (1- n2))) *ss1*) ) (ssadd ent *ss2*) ) (ssadd ent *ss3*) ) ) (repeat (setq n (sslength *ss2*)) (if (member (setq ent (ssname *ss2* (setq n (1- n)))) (mapcar 'cadr (ssnamex *ss1*)) ) (ssdel ent *ss2*) ) ) (repeat (setq n (sslength *ss3*)) (if (member (setq ent (ssname *ss3* (setq n (1- n)))) (mapcar 'cadr (ssnamex *ss1*)) ) (ssdel ent *ss3*) ) ) ) ) (alert "La sélection est terminée") (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 5 octobre 2006 Posté(e) le 5 octobre 2006 Une version un peu plus concise : (defun c:ss123 (/ ss sstemp) (setq *ss1* (ssadd) *ss2* (ssadd) *ss3* (ssadd) ss (ssget "_X" '((-4 . "[color=#CC0000] (0 . "CIRCLE") (-4 . "[color=#CC0000] (0 . "LWPOLYLINE") (-4 . "&") (70 . 1) (-4 . "AND>") (-4 . "OR>") ) ) ) (if ss (progn (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))) (if (setq sstemp (SelByObj ent "Wp" nil)) (progn (foreach n (vl-remove-if 'listp (mapcar 'cadr (ssnamex sstemp)) ) (ssadd n *ss1*) ) (ssadd ent *ss2*) ) (ssadd ent *ss3*) ) ) (foreach ent (mapcar 'cadr (ssnamex *ss2*)) (if (member ent (mapcar 'cadr (ssnamex *ss1*))) (ssdel ent *ss2*) ) ) (foreach ent (mapcar 'cadr (ssnamex *ss3*)) (if (member ent (mapcar 'cadr (ssnamex *ss1*))) (ssdel ent *ss3*) ) ) ) ) (alert "La sélection est terminée") (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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