Aller au contenu

Routine de Selection subtile !


Messages recommandés

Posté(e)

 

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

Posté(e)

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

Posté(e)

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

Posté(e)

 

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

Posté(e)

 

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

Posté(e)

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

Posté(e)

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

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é