Aller au contenu

Sélection objets dans une fenêtre POLYGONALE


Messages recommandés

Posté(e)

Bonjour à Toutes et à Tous,

 

Je n'ai pas trouvé de LISP qui permette de sélectionner automatiquement les objets présent dans une fenêtre (FMULT).

 

L'idée serait une sélection des objets sur le principe d'un CONTROL + A mais uniquement des objets affichés ! En mode FENETRE ou CAPTURE

 

Merci pour votre aide.

 

Christian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Posté(e)

Hello Christian

 

Une idee (peut etre un peu debile) car je n'ai pas d'AutoCAD sous la main a l'instant !

 

1 - Sur le papier, tu dessines un rectangle (ou un polygone) par-dessus ta fenetre

2 - Un petit coup de CHSPACE ou CHMSPACE ('je ne sais plus)

maintenant ton objet Papier est DANS l'espace Objet

3 - Tu reviens dans l'Espace Objet

4 - Tu utilses un soupcon de Lisp ou tu fais une selection classique en accrochant

les 4 sommets de ton rectangle (ou N sommets de ton Polygone)

 

Qu'en penses tu ?

 

Le Decapode

 

Autodesk Expert Elite Team

Posté(e)

 

Hello

 

En principe dans les fameuses routines "Special_Selections" de Gilles

il y a une fonction SSOC et SSOF qui permettent de selectionner

un cercle, polyligne close, ellipse, etc

 

SSOC : Special Selection Objet Capture

SSOF : Special Selection Objet Fenetre

 

Donc en theorie ca devrait faire pour ton probleme !?

 

Le Decapode

 

 

Autodesk Expert Elite Team

Posté(e)

Salut,

 

Deux commandes SSVPC (capture) et SSVPW (fenêtre) qui sélectionnent les objets visibles dans la fenêtre sélectionnée.

La fenêtre est activée et les objets "grippés".

Fonctionne quelque soit la vue dans la fenêtre.

Fonctionne avec les fenêtres polygonales ou issues d'objets.

 

(or *acad* (setq *acad* (vlax-get-acad-object)))
(or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))

;; gc:SelectByVport
;; Retourne un jeu de sélection contenant les objets visibles dans
;; la fenêtre flottante en fonction du mode
;;
;; Arguments
;; vp : une fenêtre flottante (ename)
;; mode : mode de sélection ("_CP" ou "_WP")

(defun gc:SelectByVport	(vp mode / elst ss pl pts len inc wid ht xd)
 (setq elst (entget vp '("ACAD")))
 (if (setq pl (cdr (assoc 340 elst)))
   (if	(= "LWPOLYLINE" (cdr (assoc 0 (entget pl))))
     (foreach p (entget pl)
(if (= 10 (car p))
  (setq pts (cons (cdr p) pts))
)
     )
     (progn
(setq len (vlax-curve-getDistAtParam
	    pl
	    (vlax-curve-getEndParam pl)
	  )
      inc (/ len 120)
)
(while (	  (setq	pts
	 (cons
	   (vlax-curve-getPointAtDist pl (setq len (- len inc)))
	   pts
	 )
  )
)
     )
   )
   (setq cen (cdr (assoc 10 elst))
  wid (/ (cdr (assoc 40 elst)) 2.)
  ht  (/ (cdr (assoc 41 elst)) 2.)
  pts (list
	(list (- (car cen) wid) (- (cadr cen) ht) (caddr cen))
	(list (+ (car cen) wid) (- (cadr cen) ht) (caddr cen))
	(list (+ (car cen) wid) (+ (cadr cen) ht) (caddr cen))
	(list (- (car cen) wid) (+ (cadr cen) ht) (caddr cen))
      )
   )
 )
 (if (and (setq xd (cdadr (assoc -3 elst))) (assoc 1003 xd))
   (progn
     (setq str "")
     (foreach p xd
(if (= 1003 (car p))
  (setq str (strcat str (cdr p) ","))
)
     )
     (setq fltr
     (list '(410 . "Model")
	   '(-4 . "		   (cons 8 str)
	   '(-4 . "NOT>")
     )
     )
   )
   (setq fltr '((410 . "Model")))
 )
 (vla-ZoomExtents *acad*)
 (vla-put-Mspace *acdoc* :vlax-true)
 (setvar 'cvport (cdr (assoc 69 elst)))
 (setq	ss (ssget
     mode
     (mapcar (function (lambda (x) (trans (trans x 3 2) 2 1))) pts)
     fltr
   )
 )
 (vla-put-Mspace *acdoc* :vlax-false)
 (vla-ZoomPrevious *acad*)
 ss
)

;; gc:GetViewport
;; Invite l'utilisateur à sélectionner une fenêtre flottante
;; Retourne le nom d'entité de la fenêtre (ename) ou nil

(defun gc:GetViewport (/ vp typ)
 (if (/= (getvar 'cvport) 1)
   (vla-put-Mspace *acdoc* :vlax-false)
 )
 (while
   (not
     (and
(setq vp (car (entsel "\nSélectionnez la fenêtre: ")))
(setq typ (cdr (assoc 0 (setq elst (entget vp)))))
(or (= typ "VIEWPORT")
    (and (setq vp (cdr (assoc 330 elst)))
	 (= "VIEWPORT" (cdr (assoc 0 (entget vp))))
    )
)
     )
   )
    (princ
      (if vp
 "L'objet sélectionné n'est pas une fenêtre de présentation"
 "Aucun objet sélectionné"
      )
    )
    (setq vp nil)
 )
 vp
)

;; Commandes

;; Sélection par capture
(defun c:ssvpc (/ vp ss)
 (if (= (getvar 'tilemode) 1)
   (alert "Cette commande n'est disponible qu'en espace papier")
   (progn
     (setq ss (gc:SelectByVport (gc:GetViewport) "_CP"))
     (vla-put-Mspace *acdoc* :vlax-true)
     (sssetfirst nil ss)
   )
 )
 (princ)
)

;; Sélection par fenêtre
(defun c:ssvpw (/ vp ss)
 (if (= (getvar 'tilemode) 1)
   (alert "Cette commande n'est disponible qu'en espace papier")
   (progn
     (setq ss (gc:SelectByVport (gc:GetViewport) "_WP"))
     (vla-put-Mspace *acdoc* :vlax-true)
     (sssetfirst nil ss)
   )
 )
 (princ)
)

(princ "\nEntrez SSVPC pour une sélection par capture, SSVPW pour une sélection par fenêtre.")

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

Posté(e)

Dis moi (giles), n'y aurait-il pas moyen de compiler ton lisp avec celui de partick :

 

;;;=================================================================
;;;
;;; EXL.LSP V1.02
;;;
;;; Exporter des Présentations
;;;
;;; Copyright (C) Patrick_35
;;;
;;;=================================================================

(defun c:exl(/	act bou cal cod dbx def doc fen lay liste_lay lst lst_base nom obj res sel val
	bda)

 (defun bda (titre lst / dcl fic fil res txt val)
   (setq fic (vl-filename-mktemp "exl" nil ".dcl")
  fil (open fic "w")
   )
   (foreach txt '(	"exl : dialog {"
		"  key = \"titre\";"
		"  alignment = centered;"
		"  is_cancel = true;"
		"  allow_accept = true;"
		"  width = 50;"
		"  : list_box {label= \"Sélection\"; key=\"sel\"; height = 20; multiple_select=true;}"
		"  spacer;"
		"  ok_cancel;"
		"}"
	 )
     (write-line txt fil)
   )
   (close fil)
   (setq dcl (load_dialog fic))
   (new_dialog "exl" dcl "")
   (set_tile "titre" titre)
   (start_list "sel")
   (mapcar 'add_list lst)
   (end_list)
   (action_tile "sel"    "(setq val $value)")
   (action_tile "accept" "(done_dialog 1)")
   (action_tile "cancel" "(done_dialog 0)")
   (setq res (start_dialog))
   (unload_dialog dcl)
   (vl-file-delete  fic)
   (list res val)
 )

 (vl-load-com)
 (setq doc (vla-get-activedocument (vlax-get-acad-object))
def (vla-get-activelayout doc)
bou 1
 )
 (vla-startundomark doc)
 (acad-push-dbmod)
 (vlax-for lay (vla-get-layouts doc)
   (setq lst_base (cons (cons (vla-get-taborder lay) lay) lst_base ))
 )
 (while (assoc bou lst_base)
   (setq liste_lay (cons (vla-get-name (cdr (assoc bou lst_base))) liste_lay )
  bou (1+ bou)
   )
 )
 (and (= (car (setq res (bda "Exl 1.02" (reverse liste_lay)))) 1)
      (setq res (cadr res))
   (while (not (eq res ""))
     (setq lst nil
    obj nil
    val (read res)
    lay (cdr (assoc (1+ val) lst_base))
    act (vla-get-name lay)
     )
     (and (ssget "x" (list (cons 0 "viewport") (cons 410 act)))
(progn
  (princ (strcat "\nTraitement pour l'onglet : " act))(princ)
  (vlax-for fen (setq sel (vla-get-activeselectionset doc))
    (vla-getxdata fen "" 'cod 'cal)
    (setq cod (vlax-safearray->list cod)
	  cal (vlax-safearray->list cal)
	  bou 0
    )
    (while (setq nom (nth bou cal))
      (and (eq (nth bou cod) 1003)
	   (not (member nom lst))
	(setq lst (cons (vlax-variant-value nom) lst))
      )
      (setq bou (1+ bou))
    )
  )
  (vla-delete sel)
  (setq dbx (vlax-create-object (if (< (setq rel (atoi (getvar "ACADVER"))) 16)
				  "ObjectDBX.AxDbDocument"
				  (strcat "ObjectDBX.AxDbDocument." (itoa rel))
				)
	    )
  )
  (ssget "x" (list (cons 67 0)))
  (vlax-for ent (setq sel (vla-get-activeselectionset doc))
    (or (member (vla-get-layer ent) lst)
      (setq obj (cons ent obj))
    )
  )
  (vla-delete sel)
  (vla-copyobjects doc
		   (vlax-make-variant
		     (vlax-safearray-fill
		       (vlax-make-safearray vlax-vbobject (cons 0 (1- (length obj))))
		       obj
		     )
		   )
		   (vla-get-modelspace dbx)
  )
  (vla-copyobjects doc
		   (vlax-make-variant
		     (vlax-safearray-fill
		       (vlax-make-safearray vlax-vbobject (cons 0 0))
		       (list lay)
		     )
		   )
		   (vla-get-layouts dbx)
  )
  (vla-saveas dbx (setq nom (strcat (vla-get-path doc) "/" (vl-filename-base (vla-get-name doc)) " - " act ".dwg")))
  (vlax-release-object dbx)
  (setq dbx (vla-open (vla-get-documents (vlax-get-acad-object)) nom))
  (vlax-for ent (vla-get-layouts dbx)
    (cond
      ((eq (vla-get-name ent) act)
	(vla-put-activelayout dbx ent)
      )
      ((/= (vla-get-name ent) "Model")
	(vla-delete ent)
      )
    )
  )
  (vla-close dbx :vlax-true)
)
     )
     (setq res (substr res (+ 2 (strlen (itoa val))) (strlen res)))
   )
   (alert "Traitement des onglets terminés.")
 )
 (acad-pop-dbmod)
 (vla-endundomark doc)
 (princ)
)

(setq nom_lisp "EXL")
(if (/= app nil)
 (if (= (strcase (substr app (1+ (- (strlen app) (strlen nom_lisp))) (strlen nom_lisp))) nom_lisp)
   (princ (strcat "..." nom_lisp " chargé."))
   (princ (strcat "\n" nom_lisp ".LSP Chargé.....Tapez " nom_lisp " pour l'éxecuter.")))
 (princ (strcat "\n" nom_lisp ".LSP Chargé......Tapez " nom_lisp " pour l'éxecuter.")))
(setq nom_lisp nil)
(princ)

Raph.

Celui qui pose une question est bête 5 minutes, celui qui n'en pose pas l'est toute sa vie !

Posté(e)

Un petit UP pour savoir si un pro aurait la réponse à ma question ci-dessus ?

 

merci

Raph.

Celui qui pose une question est bête 5 minutes, celui qui n'en pose pas l'est toute sa vie !

  • 1 mois après...
Posté(e)

Salut

 

Dis moi (giles), n'y aurait-il pas moyen de compiler ton lisp avec celui de partick :

Je ne comprends pas bien le besoin entre exporter des présentations et le type de sélection de (gile) ?

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Salut patrick

 

Souviens toi, avec ton lisp on exporte la présentation mais avec tous les objets présents dans l'espace objet (excepté les objets sur les calques gelés)

 

en compilant les 2, on exporterait uniquement les éléments présents dans la fenêtre fmult.

 

[Edité le 7/9/2011 par neptune38]

Raph.

Celui qui pose une question est bête 5 minutes, celui qui n'en pose pas l'est toute sa vie !

Posté(e)
Souviens toi, avec ton lisp on exporte la présentation mais avec tous les objets présents dans l'espace objet (excepté les objets sur les calques gelés)

Ben non, avec Exl (v1.11), seuls les objets visibles dans la/les fenêtre(s) sont normalement exportés.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

  • 11 ans après...
Posté(e)

Bonjour,

Je remonte le sujet car je rencontre un problème de sélection d'objets dans les fmult.

image.thumb.jpeg.b4d816717beff78eb8afc725442bf3f0.jpeg

Dans le cas n°1, je peux :
- sélectionner tous les objets contenus dans la zone de dessin,
- sélectionner uniquement les objets (en magenta) sur le calque Pose,
- sélectionner uniquement les objets (en jaune) sur le calque Dépose,
- sélectionner uniquement les objets (en bleu) sur le calque Modification,
- sélectionner tous les objets contenus dans le cadre en bleu (en balayant un par un c'est bon).

Je ne peux pas :
- sélectionner tous les objets en dehors des cadres en bleu,
- et par conséquence sélectionner uniquement les objets (en magenta ou jaune) en dehors des cadres en bleu.

Dans le cas n°2, je peux (dans chacune des fmult) :
- sélectionner tous les objets,
- sélectionner uniquement les objets (en magenta),
- sélectionner uniquement les objets (en jaune),
- sélectionner uniquement les objets (en bleu).

Je ne peux pas (dans chacune des fmult) :
- sélectionner tous les objets contenus dans le cadre en bleu,
- sélectionner tous les objets en dehors des cadres en bleu,
- et par conséquence sélectionner uniquement les objets (en magenta ou en jaune) en dehors des cadres en bleu.

J'ai utilisé et modifié le lisp SelectByVport de (gile) et uniquement utilisé le lisp Special_selections toujours de (gile).

Dans SSOC, je pense (mais pas encore testé) qu'il faut modifier le nil afin de pouvoir sélectionner que les objets en rouge ou en jaune : 

(ssdel (ssname ss 0) (SelByObj (ssname ss 0) "Cp" nil))

Ci-dessous le lisp SelectByVport modifié :

(or *acad* (setq *acad* (vlax-get-acad-object)))
(or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))

;; gc:SelectByVport
;; Retourne un jeu de sélection contenant les objets visibles dans
;; la fenêtre flottante en fonction du mode
;;
;; Arguments
;; vp : une fenêtre flottante (ename)
;; mode : mode de sélection ("_CP" ou "_WP")

;; paramfltrlayercolor : sélection objets par calque (8) ou par couleur (62)
;; fltrlayercolor : nom du calque ou numéro de la couleur

(defun gc:SelectByVport	(vp mode paramfltrlayercolor fltrlayercolor / elst ss pl pts len inc wid ht xd)
 (setq elst (entget vp '("ACAD")))
  (if (setq pl (cdr (assoc 340 elst)))
    (if	(= "LWPOLYLINE" (cdr (assoc 0 (entget pl))))
      (foreach p (entget pl)
  (if (= 10 (car p))
    (setq pts (cons (cdr p) pts))
  )
       ) ; fin foreach
       (progn
  (setq len (vlax-curve-getDistAtParam
  	    pl
  	    (vlax-curve-getEndParam pl)
  	  )
        inc (/ len 120)
  )
  (while (	  (setq	pts
  	 (cons
  	   (vlax-curve-getPointAtDist pl (setq len (- len inc)))
  	   pts
  	 )
    ) ; fin setq pts
  )
       ) ; fin while
     ) ; fin progn

 ) ; fin if lwpolyline

   (setq cen (cdr (assoc 10 elst))
  wid (/ (cdr (assoc 40 elst)) 2.)
  ht  (/ (cdr (assoc 41 elst)) 2.)
  pts (list
	(list (- (car cen) wid) (- (cadr cen) ht) (caddr cen))
	(list (+ (car cen) wid) (- (cadr cen) ht) (caddr cen))
	(list (+ (car cen) wid) (+ (cadr cen) ht) (caddr cen))
	(list (- (car cen) wid) (+ (cadr cen) ht) (caddr cen))
      )
   )
  ) ; fin if 

(if (= paramfltrlayercolor "")
   (setq fltr '((410 . "Model")))
   (setq fltr (list '(410 . "Model") (cons paramfltrlayercolor fltrlayercolor)))
)

 (vla-ZoomExtents *acad*)
 (vla-put-Mspace *acdoc* :vlax-true)
 (setvar 'cvport (cdr (assoc 69 elst)))
 (setq	ss (ssget
     mode
     (mapcar (function (lambda (x) (trans (trans x 3 2) 2 1))) pts)
     fltr
   )
 )
 (vla-put-Mspace *acdoc* :vlax-false)
 (vla-ZoomPrevious *acad*)
 ss
)

;; gc:GetViewport
;; Invite l'utilisateur à sélectionner une fenêtre flottante
;; Retourne le nom d'entité de la fenêtre (ename) ou nil

(defun gc:GetViewport (/ vp typ)
 (if (/= (getvar 'cvport) 1)
   (vla-put-Mspace *acdoc* :vlax-false)
 )
 (while
   (not
     (and
(setq vp (car (entsel "\nSélectionnez la fenêtre: ")))
(setq typ (cdr (assoc 0 (setq elst (entget vp)))))
(or (= typ "VIEWPORT")
    (and (setq vp (cdr (assoc 330 elst)))
	 (= "VIEWPORT" (cdr (assoc 0 (entget vp))))
    )
)
     )
   )
    (princ
      (if vp
 "L'objet sélectionné n'est pas une fenêtre de présentation"
 "Aucun objet sélectionné"
      )
    )
    (setq vp nil)
 )
 vp
)

;; Commandes

;; Sélection par capture
(defun c:ssvpc ()
(ssvpc "" "")
)
(defun ssvpc (paramfltrlayercolor fltrlayercolor / vp ss)
 (if (= (getvar 'tilemode) 1)
   (alert "Cette commande n'est disponible qu'en espace papier")
   (progn
     (setq ss (gc:SelectByVport (gc:GetViewport) "_CP" paramfltrlayercolor fltrlayercolor))
     (vla-put-Mspace *acdoc* :vlax-true)
     (sssetfirst nil ss)
   )
 )
 (princ)
)


;; Sélection par fenêtre
(defun c:ssvpw ()
(ssvpw "" "")
)
(defun ssvpw (paramfltrlayercolor fltrlayercolor / vp ss)
 (if (= (getvar 'tilemode) 1)
   (alert "Cette commande n'est disponible qu'en espace papier")
   (progn
     (setq ss (gc:SelectByVport (gc:GetViewport) "_WP" paramfltrlayercolor fltrlayercolor))
     (vla-put-Mspace *acdoc* :vlax-true)
     (sssetfirst nil ss)
   )
 )
 (princ)
)

(princ "\nEntrez SSVPC pour une sélection par capture, SSVPW pour une sélection par fenêtre.")

;;; 
;;; Exemple d'utilisation
;;; (ssvpc 62 108) - Sélection d'objets dont la couleur est 108
;;; (ssvpc 62 42) - Sélection d'objets dont la couleur est 42
;;; (ssvpc 8 "Ief-modification-e") - Sélection d'objets dont le calque est Ief-modification-e
;;; (ssvpc 8 "Ief-depos-_-e") - Sélection d'objets dont le calque est Ief-depos-_-e
;;; (ssvpc 8 "Ief-pose-_-e") - Sélection d'objets dont le calque est Ief-pose-_-e
;;; 
;;; Puis utiliser Lisp Special_selections
;;; Lancer SSOC ou SSOF - fonctionne uniquement dans une seule fenêtre
;;; et il faut balayer les entités une par une 

 

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é