Aller au contenu

Sélection par volume


NANARD

Messages recommandés

Sans programmation je ne crois pas.

Avec programation, il est "relativement" simple de sélectionner tous les objets dont la "bounding box" (emprise de l'objet suivant les axes X, Y et Z du SCG) est contenue dans une "boite" défine par deux coins opposés (les arrêtes de cette "boite" étant eux aussi parallèle aux axes du SCG).

 

Sur l'image (cliquer dessus pour l'agrandir), les bounding box sont en gris, la boite de sélection en gris interrompu.

http://xs309.xs.to/xs309/06461/ssbb.PNG.xs.jpg

 

Tu peux essayer le LISP suivant (taper ssbb pour lancer la commande)

 

(defun c:ssbb (/ p1 p2 pt1 pt2)
 (initget 1)
 (setq p1 (trans (getpoint "\nPremier coin de la boite: ") 1 0))
 (initget 1)
 (setq p2 (trans (getpoint p1 "\nCoin opposé de la boite: ") 1 0))
 (setq	pt1 (apply 'mapcar (cons 'min (list p1 p2)))
pt2 (apply 'mapcar (cons 'max (list p1 p2)))
 )
 (sssetfirst nil (selbybox pt1 pt2))
 (princ)
)

(defun SelByBox	(p1 p2)
 (vl-load-com)
 (setq ss (ssget "_X" '((410 . "Model"))))
 (foreach ent (mapcar 'cadr (ssnamex ss))
   (vla-getBoundingBox (vlax-ename->vla-object ent) 'minpt 'maxpt)
   (if	(or (member T (apply 'mapcar (cons 'list minpt) p1))))
    (member T (apply 'mapcar (cons 'list maxpt)))))
)
     (ssdel ent ss)
   )
 )
 ss
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Pour un peu plus de souplesse et de polyvalence, le même mais par rapport au SCU courant.

 

(defun c:ssbb (/ p1 p2 pt1 pt2)
 (initget 1)
 (setq p1 (getpoint "\nPremier coin de la boite: "))
 (initget 1)
 (setq p2 (getpoint p1 "\nCoin opposé de la boite: "))
 (setq	pt1 (apply 'mapcar (cons 'min (list p1 p2)))
pt2 (apply 'mapcar (cons 'max (list p1 p2)))
 )
 (sssetfirst nil (selbybox pt1 pt2))
 (princ)
)

(defun SelByBox	(p1 p2)
 (vl-load-com)
 (setq ss (ssget "_A" '((410 . "Model"))))
 (foreach ent (mapcar 'cadr (ssnamex ss))
   (setq obj (vlax-ename->vla-object ent))
 (vla-TransformBy obj (UCS2WCSMatrix))
   (vla-getBoundingBox obj 'minpt 'maxpt)
   (vla-TransformBy obj (WCS2UCSMatrix))
   (if	(or (member T (apply 'mapcar (cons 'list minpt) p1))))
    (member T (apply 'mapcar (cons 'list maxpt)))))
)
     (ssdel ent ss)
   )
 )
 ss
)

;; Doug C. Broad, Jr.
;; can be used with vla-transformby to
;; transform objects from the UCS to the WCS
(defun UCS2WCSMatrix ()
 (vlax-tmatrix
   (append
     (mapcar
'(lambda (vector origin)
   (append (trans vector 1 0 t) (list origin))
 )
(list '(1 0 0) '(0 1 0) '(0 0 1))
(trans '(0 0 0) 0 1)
     )
     (list '(0 0 0 1))
   )
 )
)
;; transform objects from the WCS to the UCS
(defun WCS2UCSMatrix ()
 (vlax-tmatrix
   (append
     (mapcar
'(lambda (vector origin)
   (append (trans vector 0 1 t) (list origin))
 )
(list '(1 0 0) '(0 1 0) '(0 0 1))
(trans '(0 0 0) 1 0)
     )
     (list '(0 0 0 1))
   )
 )
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é