Topheur Posté(e) le 24 mars 2019 Posté(e) le 24 mars 2019 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. Citer
lecrabe Posté(e) le 25 mars 2019 Posté(e) le 25 mars 2019 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 Citer Autodesk Expert Elite Team
didier Posté(e) le 25 mars 2019 Posté(e) le 25 mars 2019 Coucou J'ai fait un Lisp qui fait çaJe suis en attente de le déposer sur mon site, si tu peux patienter... Amicalement Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
bonuscad Posté(e) le 25 mars 2019 Posté(e) le 25 mars 2019 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) )) Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
lecrabe Posté(e) le 25 mars 2019 Posté(e) le 25 mars 2019 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 Citer Autodesk Expert Elite Team
Topheur Posté(e) le 25 mars 2019 Auteur Posté(e) le 25 mars 2019 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 Citer
didier Posté(e) le 25 mars 2019 Posté(e) le 25 mars 2019 Coucou Le code que j'ai écrit et que tu trouveras bientôt sur da-code tient compte de ta demandePour 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 Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
lecrabe Posté(e) le 25 mars 2019 Posté(e) le 25 mars 2019 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 Citer Autodesk Expert Elite Team
didier Posté(e) le 25 mars 2019 Posté(e) le 25 mars 2019 Coucou Pas de souci tu auras ça...Amicalement Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
bonuscad Posté(e) le 25 mars 2019 Posté(e) le 25 mars 2019 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. Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Topheur Posté(e) le 25 mars 2019 Auteur Posté(e) le 25 mars 2019 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). 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). 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 Citer
bonuscad Posté(e) le 26 mars 2019 Posté(e) le 26 mars 2019 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) ) Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
lecrabe Posté(e) le 26 mars 2019 Posté(e) le 26 mars 2019 Hello Maitre Bruno Et pour les POLYLIGNEs legeres 2D, je peux remplacer BETEMENT SPLINE par LWPOLYLINE ? Bye, lecrabe Citer Autodesk Expert Elite Team
bonuscad Posté(e) le 26 mars 2019 Posté(e) le 26 mars 2019 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 pinces 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. Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
didier Posté(e) le 26 mars 2019 Posté(e) le 26 mars 2019 Coucou Je me suis basé sur la même chose (sans se concerter)Je vais déposer mes exemples sur mon site avec des explicationsL'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 Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
Topheur Posté(e) le 26 mars 2019 Auteur Posté(e) le 26 mars 2019 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 Citer
bonuscad Posté(e) le 26 mars 2019 Posté(e) le 26 mars 2019 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é! Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Topheur Posté(e) le 26 mars 2019 Auteur Posté(e) le 26 mars 2019 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 Citer
bonuscad Posté(e) le 27 mars 2019 Posté(e) le 27 mars 2019 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 :PMoi aussi Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Topheur Posté(e) le 27 mars 2019 Auteur Posté(e) le 27 mars 2019 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 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 Citer
bonuscad Posté(e) le 28 mars 2019 Posté(e) le 28 mars 2019 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...! Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Topheur Posté(e) le 29 mars 2019 Auteur Posté(e) le 29 mars 2019 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...! 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 Citer
didier Posté(e) le 30 mars 2019 Posté(e) le 30 mars 2019 Coucou J'ai enfin posé ma copie à sa place : ICI Amicalement Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
Topheur Posté(e) le 30 mars 2019 Auteur Posté(e) le 30 mars 2019 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 Citer
didier Posté(e) le 30 mars 2019 Posté(e) le 30 mars 2019 Coucou Hors-sujet mais je te réponds tout de mêmeLa prochaine fois que tu détectes une erreur utilise le formulaire de contact... Pour pouvoir entrer une espace (ou plus) avec la fonction getstringIl 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 Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
Messages recommandés