Aller au contenu

sélectionner des objets à partir d\'une Polyligne


Messages recommandés

Posté(e)

Bonjour à toutes et à tous,

 

Ce serait sympa de temps en temps de pouvoir sélectionner des objets à partir d'un polygone ou une polyligne, un cercle, etc. en mode capture et fenêtre...Exemple, je crée une polyligne, puis je la sélectionne et la sélection se ferait en mode capture ou fenêtre.

 

ce serait bien que ce genre de fonction fasse partie des options de sélection standard !

 

En attendant si quelqu'un avait une fonction équivalente ? ;)

 

Merci de vos réponses, ;)

 

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)

Ce serait sympa de temps en temps de pouvoir sélectionner des objets à partir d'un polygone ou une polyligne, un cercle, etc. en mode capture et fenêtre...Exemple, je crée une polyligne, puis je la sélectionne et la sélection se ferait en mode capture ou fenêtre.

 

Ben il y a quand même les modes CPolygone et SPolygone qui font à eu près ça

Il y a aussi la méthode par trajet qui est pratique

 

C'est vrai qu'il n'y a pas de sélection par cercle

Posté(e)

tu cherches la bagarre ????? :mad:

 

Fais gaffe Eric !!! on a la même ceinture !!!! ça va saigner !!! Espèce de breton... ;)

 

Mais ne l'oublions pas ITALIQUE = HUMOUR...

 

OUI je connais Eric ! mais le problème c'est qu'il faut à chaque fois recréer la forme de cette sélection... s'il y a 15 points tu imagines, même déjà avec 5-6 points !!!

 

L'idée c'est de garder à l'écran ce "polygone de sélection" et en Un Clic on obtient l'équivalent de 15 sommets, soit 15 Clics...

 

Je pense faire un petit LISP qui analyse les sommets et qui les renvoie à l'option de sélection CP = capturePolygone

 

Christian

 

[Edité le 18/1/2006 par rebcao]

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)

Il y avait ce SUJET que j'avais lancé, mais sans trop succés.

 

Il faut dire que les caractères " > " contenu dans le code, avaient "bouffés" des lignes (je viens de m'en apercevoir).

Ha-la-la ces symboles de balises " < > " en htlm posent problème... :mad:

 

Donc, j'ai corrigé le post pour que celui-ci ne soit pas tronqué.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

salut les ceintures noires

 

(defun c:selobj (/ ENT vlaobj pt_org pt_end param_strat param_end perim_obj esp X NB liste_pt ss)
 (vl-load-com)
 (setq ENT (car (entsel)))
 (setq
   vlaobj (vlax-ename->vla-object ent)
   pt_org (vlax-curve-getStartPoint vlaobj)
   pt_end (vlax-curve-getEndPoint vlaobj)
   param_start (vlax-curve-getStartParam vlaobj)
   param_end (vlax-curve-getEndParam vlaobj)
   perim_obj (vlax-curve-getDistAtParam vlaobj param_end)
 )
 (setq ESP 1) ;; précision
 (setq NB (fix (/ perim_obj ESP)))  ;; nb se sommets
 (setq X 0)
 (setq liste_pt nil) ;; liste des points à injecter au ssget
 (repeat NB
   (setq liste_pt (cons (trans (vlax-curve-getPointAtParam vlaobj (vlax-curve-getParamAtDist vlaobj x)) 0 1) liste_pt))
   (setq X (+ X ESP))
 )
 (setq ss (ssget "_wp" liste_pt))
 (sssetfirst nil ss)
 (princ)
)

 

Voilà, vite fait sans trop tester...

j'ai fixé la précision arbitrairement à 1 unité, à voir en fonction de la taille des objets utilisés.

 

Amicalement

 

Zebulon_

 

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)

Posté(e)

Mais ne l'oublions pas ITALIQUE = HUMOUR...

 

et de l'italique gras = humour gras ?

 

Amicalement

 

Zebulon_

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)

Posté(e)

 

Bonsoir Les Ceintures Noires qui se foutent sur la gueule

 

Sympa ces programmes, je vais les tester à l'occasion ... :)

 

Mais je suis un fanatique de MAP, et donc je dispose de cette fonction dans les requêtes

par "Emplacement géographique" sur un ou plusieurs DWGs du groupe de dessins.

 

- C un peu moins pratique, car je dois d'abord faire une 1ère requête "spécifique"

pour faire apparaître le / la cercle / polyligne qui m'intéresse. :o

 

- Puis une 2eme requete où je selectionne les objets précédents

soit pour une fenêtre "Normale", soit une fenêtre "Capture".

 

Par contre je peux chosir les objets qui SONT ou NE SONT PAS

dans le/la cercle/polyligne ! :)

et le tout combiné BIEN SUR avec d'autres critères plus ou moins compliqués ! :exclam:

 

Le Decapode "mappant"

 

  • Like 1

Autodesk Expert Elite Team

Posté(e)

Tout d'abord merci à Bonuscad et Zebulon,

 

Je vais de ce pas tester ces deux sources. Par contre ce serait pour une utilisation avec LT-EXTENDER, ça a des chances de fonctionner ? Je vous dirai quoi !

Sinon, mes chers Zebulon et Bonuscad avez-vous pensez à une union, un mariage, (oui ! oui ! humour gras)

 

car je constate dans beaucoup de sujet là où il y a Bonuscad il y a Zebulon et la ou il y a Zebulon il y a Bonucad.... Les Inséparables ! c'est très bien continuez ;)

 

Encore merci à vous pour les nombreux sources que vous nous proposez. :D

 

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)

car je constate dans beaucoup de sujet là où il y a Bonuscad il y a Zebulon et la ou il y a Zebulon il y a Bonucad.... Les Inséparables ! c'est très bien continuez

 

Unis par les liens du lisp, jusqu'à ce que la mort nous sépare...

 

La réponse de Serge, rappelée par ludwig, ne prend en compte que les sommets des polylignes. J'ai essayé de faire quelque chose de plus polyvalent, mais cela reste moins "précis" que ce que propose serge, puisque je fais un point toutes les 1 unité le long de l'objet, sans tenir compte d'éventuels sommets. Mais, de ce fait, mon lisp marche aussi pour des cercles, des ellipses, des polylignes avec des arcs et même des splines.

 

Mais dans une version prochaine, on aura peut-être la possibilité de sélectionner suivant un objet. Christian l'a rèvé, Autodesk l'a fait. (ou va le faire, pour être plus exact)

 

Amicalement

 

Zebulon_

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)

Posté(e)

 

Bonjour

 

Eh Oui pour Intellidesk, car les developpeurs d'Intellidesk France

sont des Pros AutoCADs et donc ils essayent (autant que faire se peut)

d'implanter des fonctionnalites utiles et subtiles ...

 

Le Decapode "Intellideskant"

 

Autodesk Expert Elite Team

Posté(e)

Comme je le craignais Zebulon lorsque je charge ton Programme via LT-EXTENDER j'ai un message d'erreur...!!!

 

[surligneur] ; error : no function definition at [EVAL][/surligneur]

 

J'ai donc vite réécrit un petit programme LISP qui permet de faire une sélection à l'aide d'une polyligne en Mode Capture ou Fenêtre...deux commandes sont créées SELCP et SELFP...

 

Merci pour ceux que ça intéressent de tester et de me dire quoi ?

 

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)

Salut Christian,

 

J'ai un peu testé ton LISP, çà marche fort bien (même sur Intellidesk).

 

J'ai juste une petite question, je ne comprends pas ce que tu fais avec CMDECHO ; pourquoi le désactives-tu à nouveau à la fin ?

Un oubli ou une subtilité que je ne connais pas ?

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

Posté(e)

Merci Giles pour avoir passé un peu de temps sur cette petite bidouille !

 

As-tu remarqué la structure du source ? J'aime bien commenter, ça me facilite la maintenance de mes programmes plus tard !!!

 

Pour le CMDECHO à 1 c'était juste pour qu'il m'affiche le nombre d'objets trouvés et je le remet à 0 par habitude, c'est tout. C'est vrai que dans un programme on a rarement besoin qu'il soit à 1.

 

Christian ;)

 

[Edité le 21/1/2006 par rebcao]

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)

C'est vrai que dans un programme on a rarement besoin qu'il soit à 1.

 

Entièrement d'accord, bien que j'ai lu quelque part dans un message sur ce site un exemple qui montrait un intérêt d'avoir CMDECHO à 1 (mais je ne le retrouve pas*).

 

Pour ma part je préfère, dans mes LISP, stocker la valeur initiale dans une variable pour la restituer à la fin de façon à ne pas perturber les habitudes d'autres utilisateurs éventuels dudit code.

 

Pour les commentaires, tu as raison je ne le fais pas (ou plus) assez souvent.

 

* Je l'ai retrouvé, c'est .

 

[Edité le 21/1/2006 par (gile)]

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

Posté(e)

Entièrement d'accord, bien que j'ai lu quelque part dans un message sur ce site un exemple qui montrait un intérêt d'avoir CMDECHO à 1

 

je le fais effectivement en phase développement et je remet 0 une fois le Programme au point !

 

Pour ma part je préfère, dans mes LISP, stocker la valeur initiale dans une variable pour la restituer à la fin de façon à ne pas perturber les habitudes d'autres utilisateurs éventuels dudit code.

 

c'est que je fais aussi et ici entre autre pour OSMODE

 

Pour info ce petit bijou va permettre à mes stagiaires de préparer dans des plans bâtiment les contours des différentes pièces avec la commande contour, puis ils n'auront plus qu'à faire une sélection de la polylgine pour connaitre le quantitatif de tous les BLOCS dans la pièce (si blocs il y a bien sûr !!!)

 

Christian

 

 

 

[Edité le 21/1/2006 par rebcao]

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 @)

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

Je réveille cette discussion un peu ancienne parce que je me suis penché sur ce sujet à propos de celui-ci.

 

Je propose donc ici ma version, avec une routine qui peut être appelée depuis d'autres LISP et comme exemple une fonction d'appel.

 

La routine permet de créer un jeu de sélection avec tous les objets contenus ou capturés par la polyligne, le cercle ou l'ellipse sélectionné.

 

Le polygone de sélection est constitué de 50 sommets pour les coubes fermées (cercles ellipses), le nombre de sommets est calculé en fonction de la courbure des arc de polylignes dans les mêmes proportions.

 

La routine nécessite 3 arguments :

- le nom d'entité de l'objet (ename)

- le mode de sélection Fenêtre ou Capture (Wp Cp)

- un filtre de sélecion (liste ssget) si aucun filtre n'est utilisé cet argument doit être nil.

 

La routine :

(bug du filtre de sélection corrigé)

 

Version corrigée le 04/10/06

 

;;; 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)
) 

 

Une fonction d'appel (supprimer les espaces entre

 

;;; SSO
;;; Grippe les objets contenus ou capturés par l'objet sélectionné

(defun c:sso (/ ss opt)
 (sssetfirst nil nil)
 (if (setq ss (ssget "_:S:E"
	      (list
		'(-4 . "[color=#CC0000]			'(0 . "CIRCLE")
		'(-4 . "[color=#CC0000]			'(0 . "ELLIPSE")
		'(41 . 0.0)
		(cons 42 (* 2 pi))
		'(-4 . "AND>")
		'(-4 . "[color=#CC0000]			'(0 . "LWPOLYLINE")
		'(-4 . "&")
		'(70 . 1)
		'(-4 . "AND>")
		'(-4 . "OR>")
	      )
       )
     )
   (progn
     (initget "Cp Wp")
     (setq
opt (getkword "\nChoisir une méthode de sélection [Cp/Wp]: ")
     )
     (sssetfirst nil (SelByObj (ssname ss 0) opt nil))
   )
 )
 (princ)
) 

[Edité le 3/10/2006 par (gile)]

 

[Edité le 4/10/2006 par (gile)]

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

Posté(e)

Re,

 

Pour les non lispeurs, deux fonctions d'appel : SSOC pour une sélection par capture et SSOF pour une sélection par fenêtre.

 

Comme précédemment, supprimer les espaces entre

SelByObj doit, bien sûr, être chargé.

 

(defun c:ssoc (/ ss opt)
 (sssetfirst nil nil)
 (if (setq ss (ssget "_:S:E"
	      (list
		'(-4 . "[color=#CC0000]			'(0 . "CIRCLE")
		'(-4 . "[color=#CC0000]			'(0 . "ELLIPSE")
		'(41 . 0.0)
		(cons 42 (* 2 pi))
		'(-4 . "AND>")
		'(-4 . "[color=#CC0000]			'(0 . "LWPOLYLINE")
		'(-4 . "&")
		'(70 . 1)
		'(-4 . "AND>")
		'(-4 . "OR>")
	      )
       )
     )
   (sssetfirst nil (SelByObj (ssname ss 0) "Cp" nil))
 )
 (princ)
)

(defun c:ssof (/ ss opt)
 (sssetfirst nil nil)
 (if (setq ss (ssget "_:S:E"
	      (list
		'(-4 . "[color=#CC0000]			'(0 . "CIRCLE")
		'(-4 . "[color=#CC0000]			'(0 . "ELLIPSE")
		'(41 . 0.0)
		(cons 42 (* 2 pi))
		'(-4 . "AND>")
		'(-4 . "[color=#CC0000]			'(0 . "LWPOLYLINE")
		'(-4 . "&")
		'(70 . 1)
		'(-4 . "AND>")
		'(-4 . "OR>")
	      )
       )
     )
   (sssetfirst nil (SelByObj (ssname ss 0) "Wp" nil))
 )
 (princ)
) 

 

[Edité le 4/10/2006 par (gile)]

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

Posté(e)

Des tests plus poussés ont fait apparaître un dysfonctionnement avec des SCU différents du SCG, le bug est corrigé.

 

 

Avec SSOC, si on veut exclure du jeu de sélection l'objet ayant servi à le faire, on peut remplacer :

 

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

 

par :

 

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

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é