CADxp: Selection blocs touchés par x splines - CADxp

Aller au contenu

  • 2 Pages +
  • 1
  • 2

Selection blocs touchés par x splines

#1 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 24 mars 2019 - 21:18

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.
0

#2 L'utilisateur est hors-ligne   lecrabe 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8549
  • Inscrit(e) : 10-décembre 03
  • LocationLoire (42)

Posté 25 mars 2019 - 10:31

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
0

#3 L'utilisateur est hors-ligne   didier 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8329
  • Inscrit(e) : 18-décembre 02
  • LocationPlanète : Terre

Posté 25 mars 2019 - 10:58

Coucou

J
'ai fait un Lisp qui fait ça
J
e suis en attente de le déposer sur mon site, si tu peux patienter...

Amicalement
Éternel débutant ...
Programmer AutoCAD
0

#4 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4670
  • Inscrit(e) : 20-juin 03

Posté 25 mars 2019 - 11:21

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
0

#5 L'utilisateur est hors-ligne   lecrabe 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8549
  • Inscrit(e) : 10-décembre 03
  • LocationLoire (42)

Posté 25 mars 2019 - 11:59

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
0

#6 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 25 mars 2019 - 18:54

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
0

#7 L'utilisateur est hors-ligne   didier 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8329
  • Inscrit(e) : 18-décembre 02
  • LocationPlanète : Terre

Posté 25 mars 2019 - 19:21

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


Éternel débutant ...
Programmer AutoCAD
0

#8 L'utilisateur est hors-ligne   lecrabe 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8549
  • Inscrit(e) : 10-décembre 03
  • LocationLoire (42)

Posté 25 mars 2019 - 19:29

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
0

#9 L'utilisateur est hors-ligne   didier 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8329
  • Inscrit(e) : 18-décembre 02
  • LocationPlanète : Terre

Posté 25 mars 2019 - 20:30

Coucou

P
as de souci tu auras ça...
A
micalement


Éternel débutant ...
Programmer AutoCAD
0

#10 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4670
  • Inscrit(e) : 20-juin 03

Posté 25 mars 2019 - 21:17

Voir le messageTopheur, le 25 mars 2019 - 18:54 , dit :

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
0

#11 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 25 mars 2019 - 22:44

Voir le messagebonuscad, le 25 mars 2019 - 21:17 , dit :

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).
Image IPB

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).
Image IPB

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
0

#12 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4670
  • Inscrit(e) : 20-juin 03

Posté 26 mars 2019 - 10:40

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
0

#13 L'utilisateur est hors-ligne   lecrabe 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8549
  • Inscrit(e) : 10-décembre 03
  • LocationLoire (42)

Posté 26 mars 2019 - 12:11

Hello Maitre Bruno

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

Bye, lecrabe
Autodesk Expert Elite Team
0

#14 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4670
  • Inscrit(e) : 20-juin 03

Posté 26 mars 2019 - 15:28

Voir le messagelecrabe, le 26 mars 2019 - 12:11 , dit :

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 pincesImage IPB
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
0

#15 L'utilisateur est hors-ligne   didier 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8329
  • Inscrit(e) : 18-décembre 02
  • LocationPlanète : Terre

Posté 26 mars 2019 - 18:15

Coucou

Je me suis basé sur la même chose (sans se concerter)
J
e 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


Éternel débutant ...
Programmer AutoCAD
0

#16 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 26 mars 2019 - 19:07

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
0

#17 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4670
  • Inscrit(e) : 20-juin 03

Posté 26 mars 2019 - 21:14

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
0

#18 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 26 mars 2019 - 22:02

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
0

#19 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4670
  • Inscrit(e) : 20-juin 03

Posté 27 mars 2019 - 09:40

Voir le messageTopheur, le 26 mars 2019 - 22:02 , dit :

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)

Citation

Après j'arrête :P
Moi aussi Image IPB
Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
0

#20 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 27 mars 2019 - 18:22

Voir le messagebonuscad, le 27 mars 2019 - 09:40 , dit :

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 Image IPB


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
0

Partager ce sujet :


  • 2 Pages +
  • 1
  • 2


Réponse rapide

  

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)