Aller au contenu

Selection blocs touchés par x splines


Messages recommandés

Posté(e)

Bonjour les lispeuses et les lispeurs :)

 

Petit défis du jour :P , quelqu'un aurait il un lisp pour sélectionner les blocs touchés par des splines d'un même calque.

 

Je m'explique :

J'ai un calque SPLINE.

Sur celui-ci je relis différents blocs (ma spline par d'un bloc et va sur un autre et cela plusieurs fois et aléatoirement), les blocs sont sur des calques différents.

Pour être sur de ne pas avoir oublier un bloc, je cherche un lisp qui sélectionne tous les blocs touché par mes splines du calque SPLINE uniquement(ensuite je mettrez ces blocs dans une couleur).

Pour info, la spline commence au point d'insertion d'un bloc et touche un autre bloc sur son point d'insertion (je ne sais pas si cela à une importance...)

 

Voilà, je sais qu'il existe de nombreux lisp de sélection mais il faut un cercle, un rectangle ou une polyligne fermé...

 

Merci de votre aide.

Posté(e)

Hello

 

1) Tu parles de Polylignes 2D Splinees ou de vraies SPLINEs ou les DEUX ?

 

2) Si j'ai bien compris, il te faudrait une sorte de selection par trajet en s'appuyant sur les Polylignes/Splines de ton calque SPLINE !?

 

3) ET combien de Polylignes/Splines a traiter sur ton calque SPLINE ?

 

4) As tu un AutoCAD MAP 201X (ou un AutoCAD CIVIL 201X) ??

 

Bye, lecrabe

Autodesk Expert Elite Team

Posté(e)

Bonjour,

On pourrait penser utiliser la sélection en mode trajet (_fence), mais j'ai peur qu'avec les spline (surtout les vraies et non des polylignes splinées), cela ne fonctionne pas.

Donc avec de vraies SPLINE, je procéderais comme suit (à voir s'il ne faut pas ajuster le fuzz de la fonction equal, ici -1E8)

A tester

((lambda ( / js obj_spl ss js_blk n ent obj_vlax pt_ins)
 (princ "\nChoix d'une spline: ")
 (while
(null
 	(setq js
   	(ssget "_+.:E:S"
     	(list
       	'(0 . "SPLINE")
       	(cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
       	(cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
     	)
   	)
 	)
)
(princ "\nN'est pas une spline")
 )
 (setq obj_spl (vlax-ename->vla-object (ssname js 0)))
 (setq ss (ssadd))
 (setq js_blk (ssget "_X" '((0 . "INSERT"))))
 (cond
(js_blk
 	(repeat (setq n (sslength js_blk))
   	(setq obj_vlax (vlax-ename->vla-object (setq ent (ssname js_blk (setq n (1- n))))))
   	(setq pt_ins (vlax-get obj_vlax 'InsertionPoint))
   	(if (equal (distance (vlax-curve-getClosestPointTo obj_spl pt_ins) pt_ins) 0.0 1E-8)
     	(setq ss (ssadd ent ss))
   	)
 	)
)
 )
 (sssetfirst nil ss)
 (prin1)
))

 

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

Posté(e)

Hello

 

PERSO : j'interdis les vraies SPLINEs sauf dans la Mecanique !

 

Et pour les vraies Ellipses (DE MEME) mais en travaillant avec PELLIPSE = 1

On obtient des simulations d'Ellipses en Polylignes ...

 

Les Polylignes splinees sont plus simples a gerer ...

 

Bye, lecrabe

Autodesk Expert Elite Team

Posté(e)

Bonjour à toutes et à tous,

 

Je ne pensais pas que ma demande ferais autant d'émule :P

 

Pour répondre aux premières questions :

- Les splines sont des vrais, tracé avec le bouton spline (2D).

- Je ne dispose pas d'AUTOCAD MAP.

- Le nombre de spline est aléatoire mais très souvent plus de 200 par dessins.

- Et les splines sont obligatoire pour des raisons de reprise de dessins et de process interne.

 

Concernant le code de bonuscad, c'est ce que je cherche !

Bon j'avoue que si la spline n'est pas sur le point d'insertion du bloc (mais qu'elle le touche quand même) ça ne sélectionne pas le bloc.

C'est dommage MAIS (en théorie) les splines sont reliées via les points de centre des blocs donc je valide (et dans le cas contraire, il faudra vérifier les quelques splines restantes).

Seul bémol, je ne voudrais pas sélectionner UNE spline mais toutes les splines du calque SPLINE :P .

 

Encore un coup de pouce bonuscad (ou un(e) autre) et tu sera mon sauveur(se) :P

Posté(e)

Coucou

 

Le code que j'ai écrit et que tu trouveras bientôt sur da-code tient compte de ta demande

Pour des raisons personnellement personnelles je n'ai pas envie de poster mes exemples sur CadXP.

À moins que tu me joignes par le formulaire du site da-code.fr et je te ferai passer en avant-première le lisp qui va bien

 

Amicalement

 

 

Posté(e)

Hello Bruno et Didier

 

SVP je suis preneur de la routine sur TOUTES les Polylignes 2D/3D (splinees ou non, courbees ou non) et les Vraies Splines ...

 

A mon avis le problème principal, c sans doute de retrouver l éventuel Bloc a l Extrémité Depart ou Arrivée des Canas / Cables ...

 

Par exemple si le Bloc est un "gros" cercle, triangle, carré, rectangle, etc ...

 

Bonne soirée, Bye, lecrabe

Autodesk Expert Elite Team

Posté(e)

Bonjour à toutes et à tous,

 

Je ne pensais pas que ma demande ferais autant d'émule :P

 

Pour répondre aux premières questions :

- Les splines sont des vrais, tracé avec le bouton spline (2D).

- Je ne dispose pas d'AUTOCAD MAP.

- Le nombre de spline est aléatoire mais très souvent plus de 200 par dessins.

- Et les splines sont obligatoire pour des raisons de reprise de dessins et de process interne.

 

Concernant le code de bonuscad, c'est ce que je cherche !

Bon j'avoue que si la spline n'est pas sur le point d'insertion du bloc (mais qu'elle le touche quand même) ça ne sélectionne pas le bloc.

C'est dommage MAIS (en théorie) les splines sont reliées via les points de centre des blocs donc je valide (et dans le cas contraire, il faudra vérifier les quelques splines restantes).

Seul bémol, je ne voudrais pas sélectionner UNE spline mais toutes les splines du calque SPLINE :P .

 

Encore un coup de pouce bonuscad (ou un(e) autre) et tu sera mon sauveur(se) :P

 

Prendre toutes les splines du calque SPLINE n'est pas un problème.

Ce que fait le code que j'ai proposé?

Il sélectionne tous les blocs du dessin et un par un il vérifie que le POINT D'INSERTION correspond à la projection de celui-ci sur la spline à un fuzz d’imprécision près. (vlax-curve-getClosestPointTo), si c'est le cas le bloc et ajouté au jeu de sélection (ssadd).

Bon j'avoue que si la spline n'est pas sur le point d'insertion du bloc (mais qu'elle le touche quand même) ça ne sélectionne pas le bloc.

Ça je ne comprends pas bien, cela veut-il dire que le point d'insertion n'est pas forcément sur la spline mais que sa boite d'encombrement coupe celle-ci? (boundingbox)

Si c'est le cas, effectivement le code n'a pas été conçu dans cette optique, ça se complique...

 

Donc des précisions seraient le bienvenue, et même un petit extrait du dessin (_wblock) pour mettre au point.

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

Posté(e)

Prendre toutes les splines du calque SPLINE n'est pas un problème.

Ce que fait le code que j'ai proposé?

Il sélectionne tous les blocs du dessin et un par un il vérifie que le POINT D'INSERTION correspond à la projection de celui-ci sur la spline à un fuzz d’imprécision près. (vlax-curve-getClosestPointTo), si c'est le cas le bloc et ajouté au jeu de sélection (ssadd).

Bon j'avoue que si la spline n'est pas sur le point d'insertion du bloc (mais qu'elle le touche quand même) ça ne sélectionne pas le bloc.

Ça je ne comprends pas bien, cela veut-il dire que le point d'insertion n'est pas forcément sur la spline mais que sa boite d'encombrement coupe celle-ci? (boundingbox)

Si c'est le cas, effectivement le code n'a pas été conçu dans cette optique, ça se complique...

 

Donc des précisions seraient le bienvenue, et même un petit extrait du dessin (_wblock) pour mettre au point.

 

Je n'ai pas autocad sous la main donc petit dessin sous paint :P

 

Dans le cas 1 se que nous devrions faire (la croix rouge pour le point d'insertion des blocs représentés par des ronds).

mini_190325103944570600.gif

 

Les splines partent d'un point d'insertion de bloc vers un autre (ce qui me va si on sélectionne toutes les splines du calque SPLINE uniquement (il peut y avoir d'autre spline sur d'autre calque à ne pas prendre en compte)

 

Dans le cas 2 se qui arrive sur quelques blocs (peut être 2% sur le dessin entier).

mini_190325104029867413.gif

 

On part d'un bloc vers un autre MAIS pas forcement sur le point d'insertion des blocs.

 

Le cas 1 me conviendrais parfaitement, il faut bien qu'il me reste un peu de travail :P

 

Et comme dans la gêne il n'y a pas de plaisir :P , sur ces spline je met un bloc INFO_SP(à un endroit au hasard mais qui touche la spline), y a t-il possibilité de sélectionner toutes les splines touché par un bloc INFO_SP(pour vérifier que toutes les splines ont un bloc INFO_SP)

 

Merci de ton aide

Posté(e)

Alors voici (avec ce que j'ai compris), avec possibilité de donner une distance de tolérance pour la proximité aux splines.

 

NB: Tu pourras accélérer le code si à la ligne 23 tu force avec des noms de blocs car dans l'état il prend TOUS les blocs

Exemple:

js_blk (ssget "_X" '((0 . "INSERT") (2 . "TOTO,TITI,TATA"))) ; les caractères génériques sont possible; voir l'aide de (wcmatch)

 

(defun C:TOPHEUR ( / js_spl ss_blk tol_dist n_spl obj_spl js_blk n_blk ent_blk obj_blk pt_ins)
(princ "\nSelectionner des Splines: ")
(setq
	js_spl
	(ssget
		(list
			'(0 . "SPLINE")
			'(8 . "SPLINE")
			(cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
			(cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
		)
	)
	ss_blk (ssadd)
)
(cond
	(js_spl
		(initget 4)
		(setq tol_dist (getdist "\nDistance de tolérance de recherche? <0.0>: "))
		(if (not tol_dist) (setq tol_dist 1E-8))
		(repeat (setq n_spl (sslength js_spl))
			(setq
				obj_spl (vlax-ename->vla-object (ssname js_spl (setq n_spl (1- n_spl))))
				js_blk (ssget "_X" '((0 . "INSERT")))
			)
			(cond
				(js_blk
					(repeat (setq n_blk (sslength js_blk))
						(setq
							ent_blk (ssname js_blk (setq n_blk (1- n_blk)))
							obj_blk (vlax-ename->vla-object ent_blk)
							pt_ins (vlax-get obj_blk 'InsertionPoint)
						)
						(if (equal (distance (vlax-curve-getClosestPointTo obj_spl pt_ins T) pt_ins) 0.0 tol_dist)
							(setq ss_blk (ssadd ent_blk ss_blk))
						)
					)
				)
			)
		)
	)
	(T (princ "\nAucune spline sélectionnée."))
)
(if (not (zerop (sslength ss_blk)))
	(sssetfirst nil ss_blk)
	(princ "\nPas de blocs trouvés.")
)
(prin1)
) 

Pour la vérification, sur le même principe

(defun C:TOPHEUR-TEST ( / js_spl ss_spl tol_dist n_spl ent_spl obj_spl js_blk n_blk ent_blk obj_blk pt_ins)
(princ "\nSelectionner des Splines: ")
(setq
	js_spl
	(ssget
		(list
			'(0 . "SPLINE")
			'(8 . "SPLINE")
			(cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
			(cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
		)
	)
	ss_spl (ssadd)
)
(cond
	(js_spl
		(initget 4)
		(setq tol_dist (getdist "\nDistance de tolérance de recherche? <0.0>: "))
		(if (not tol_dist) (setq tol_dist 1E-8))
		(repeat (setq n_spl (sslength js_spl))
			(setq
				ent_spl (ssname js_spl (setq n_spl (1- n_spl)))
				obj_spl (vlax-ename->vla-object ent_spl)
				js_blk (ssget "_X" '((0 . "INSERT") (2 . "INFO_SP")))
			)
			(cond
				(js_blk
					(repeat (setq n_blk (sslength js_blk))
						(setq
							ent_blk (ssname js_blk (setq n_blk (1- n_blk)))
							obj_blk (vlax-ename->vla-object ent_blk)
							pt_ins (vlax-get obj_blk 'InsertionPoint)
						)
						(if (equal (distance (vlax-curve-getClosestPointTo obj_spl pt_ins T) pt_ins) 0.0 tol_dist)
							(setq ss_spl (ssadd ent_spl ss_spl))
						)
					)
				)
			)
		)
	)
	(T (princ "\nAucune spline sélectionnée."))
)
(if (not (zerop (sslength ss_spl)))
	(sssetfirst nil ss_spl)
	(princ "\nPas de spline trouvés.")
)
(prin1)
)

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

Posté(e)

Hello Maitre Bruno

 

Et pour les POLYLIGNEs legeres 2D, je peux remplacer BETEMENT SPLINE par LWPOLYLINE ?

 

Bye, lecrabe

 

Je pense que oui car (vlax-curve-getClosestPointTo) fonctionne aussi pour ce type d'entité.

Comme tu es le roi de la micro-modif, je te laisse utiliser tes pincestongue.gif

N'oublie pas quand même l'adaptation du calque (8 . "....") ou le mettre en commentaire.

 

NB: pour des polylignes sans arcs, je pense que l'utilisation de "trajet" serais plus adaptée et plus rapide.

Cette routine dans un gros fichier peut avoir un process un peu long (pas testé), mais l'avantage est que tu peut donner une tolérance.

 

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

Posté(e)

Coucou

 

Je me suis basé sur la même chose (sans se concerter)

Je vais déposer mes exemples sur mon site avec des explications

L'avantage de cette méthode par rapport à la sélection "trajet" est qu'elle est plus "numérique" que "graphique"

Du coup si certaines entités ne sont pas visibles à l'écran ou si les blocs sont des points (avec pdmode 1) ça fonctionne encore mais pas le "trajet"

 

Amicalement

 

Posté(e)

Bonjour,

 

Je vais faire le rabats joie, c'est presque ça.

J'aimerais seulement qu'au lieu de me demander de sélectionner les splines, que le Lisp sélectionne de lui même toutes les splines du calque SPLINE (ou que je sélectionne une spline du calque SPLINE et que le Lisp sélectionne toutes les splines du calque SPLINE).

 

Sinon c'est exactement ce que je cherche :P

Posté(e)

Comme pour lecrabe, je te laisse faire la micro-modif, à savoir remplacer:

(setq js_spl (ssget (list ....

par

(setq js_spl (ssget "_X" (list ....

 

 

Pas trop compliqué!

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

Posté(e)

C'est parfais !

 

Sujet clos

 

UN GRAND MERCI POUR TON AIDE :)

 

Et si on est complètement fou et que l'on veut mettre selectionner un bloc qui touche un autre bloc

 

J'ai essayé

 

(ssget "_X"

(list

'(0 . "INSERT")

'(2 . "00_CPR_LD_LFA")

 

Mais ça ne marche pas erreur AcDbCurve 4658

 

Après j'arrête :P

Posté(e)

Et si on est complètement fou et que l'on veut mettre selectionner un bloc qui touche un autre bloc

 

J'ai essayé

 

(ssget "_X"

(list

'(0 . "INSERT")

'(2 . "00_CPR_LD_LFA")

 

Mais ça ne marche pas erreur AcDbCurve 4658

 

Une insertion de bloc n'a pas les propriétés curviligne d'une entité filaire, donc (vlax-curve-getClosestPointTo ne fonctionne pas!

Ce que tu peux tenter et de remplacer en ligne 33:

(if (equal (distance (vlax-curve-getClosestPointTo obj_spl pt_ins T) pt_ins) 0.0 tol_dist)

par

(if (equal (distance (vlax-get obj_spl 'InsertionPoint) pt_ins) 0.0 tol_dist)

Après j'arrête :P
Moi aussi laugh.gif

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

Posté(e)

Une insertion de bloc n'a pas les propriétés curviligne d'une entité filaire, donc (vlax-curve-getClosestPointTo ne fonctionne pas!

Ce que tu peux tenter et de remplacer en ligne 33:

(if (equal (distance (vlax-curve-getClosestPointTo obj_spl pt_ins T) pt_ins) 0.0 tol_dist)

par

(if (equal (distance (vlax-get obj_spl 'InsertionPoint) pt_ins) 0.0 tol_dist)

Moi aussi laugh.gif

 

Bonjour bonuscad,

 

Je crois que tu vas devoir m'aider encore un peu :(

 

J'ai modifier le Lisp comme tu me l'a dit et cela marche parfaitement SAUF si le bloc est un bloc dynamique :(

Pourtant il se nomme correctement (pas de *U...) mais cela ne fonctionne pas.

Une idée ? :P

Posté(e)

En reprenant ton exemple précédent, en plus du nom correct, il faut bien mettre aussi *U (mais précédé d'une apostrophe inverse)

exemple:

(ssget "_X" (list '(0 . "INSERT") '(2 . "00_CPR_LD_LFA,`*U*")))

En effet même si à l'insertion du bloc dynamique avec ses valeurs paramétriques par défaut à bien son nom, dès l'édition de l'insertion avec attribution d'autres valeurs paramétrées, celui-ci va changer de nom (par contre dans la palette de propriété, c'est toujours l'effectivename qui s'affiche)

Pour t'en assurer fais un (entget (car (entsel))) sur un bloc dynamique où tu as appliqué d'autre valeurs paramétrique que celle par défaut et regarde ce qui associé au code DXF 2.

 

Ah les blocs dynamiques...! huh.gif

 

 

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

Posté(e)

En reprenant ton exemple précédent, en plus du nom correct, il faut bien mettre aussi *U (mais précédé d'une apostrophe inverse)

exemple:

(ssget "_X" (list '(0 . "INSERT") '(2 . "00_CPR_LD_LFA,`*U*")))

En effet même si à l'insertion du bloc dynamique avec ses valeurs paramétriques par défaut à bien son nom, dès l'édition de l'insertion avec attribution d'autres valeurs paramétrées, celui-ci va changer de nom (par contre dans la palette de propriété, c'est toujours l'effectivename qui s'affiche)

Pour t'en assurer fais un (entget (car (entsel))) sur un bloc dynamique où tu as appliqué d'autre valeurs paramétrique que celle par défaut et regarde ce qui associé au code DXF 2.

 

Ah les blocs dynamiques...! huh.gif

 

Bonjour bonuscad,

 

Désolé de ne pas avoir répondu hier...

C'est parfait, ça marche.

Il ne me reste plus qu'à adapter le tout.

 

Sujet clos.

 

Je te dis au prochain Lisp :P

Posté(e)

Merci didier,

 

J'en ai profité pour regarder ton site et celui-ci m'a permis de trouver un début de réponse sur la commande getstring.

 

J'ai besoin d'une variable n_CLIENT (nom du client) qui peut comporter un espace.

 

j'ai donc écrit la ligne suivante

(setq n_CLIENT (getstring  "Cr" "\nEntrer le nom du client :"))

 

L'espace fonctionne MAIS en question utilisateur j'ai Cr au lieu de ma question Entrer le nom du client.

 

J'ai essayé avec des parenthèses, sans les "", avec des [] mais rien ni fait :(

 

Un coup de pouce :P

Posté(e)

Coucou

 

Hors-sujet mais je te réponds tout de même

La prochaine fois que tu détectes une erreur utilise le formulaire de contact...

 

Pour pouvoir entrer une espace (ou plus) avec la fonction getstring

Il faut utiliser la syntaxe (avec un T)

 

(setq var (getstring T "\nbla bla ...\n"))

 

Merci de ta remarque je vais corriger l'erreur sur ma page da-code..

 

Amicalement

 

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é