Tramber Posté(e) le 16 octobre 2004 Posté(e) le 16 octobre 2004 Avec entsel, on obtient bien le vertex de poly3D cliqué. Mais ca ne marche pas sur une poly, comment fait-on ? Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
didier Posté(e) le 16 octobre 2004 Posté(e) le 16 octobre 2004 hello Tramber,pas clair, mais bon, on va essayer de comprendre.que souhaites tu obtenir ?la définition du segment de polylignesur lequel tu cliques au message "choix des objets"ça doit être ça, car j'ai testé, et je ne vois pas de VRAIE différence.voir peut être du côté de PLINETYPE à suivre ...amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Tramber Posté(e) le 16 octobre 2004 Auteur Posté(e) le 16 octobre 2004 Salut Didier ! Je cherche le numéro du segment de polyligne surlequel je clique. En fait, j'y arrive, mais ca ne m'a pas l'air très catholique. En particulier ca ne marche pas pour une poly à 2 segments. Pourvu que je dorme cette nuit ! :P (entget (car(setq Ent (entsel )))) (setq pointpro (cadr ent)) (setq listedpoin(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (car ent))))) (trouvepres pointpro listedpoin) avec (defun trouvepres (pt1 vlist / a li poinba repere) (setq pt1 pointpro vlist listedpoin a 0 li (list 120000) poinba (list 1200000 1200000) repere 0) (repeat (1- (length vlist)) (setq tmpPt (nth a vlist)) (setq li (append li (list (distance pt1 tmpPt)))) (if ( (progn (setq poinba tmpPt) (setq repere a))) (setq a (1+ a)))repere) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
didier Posté(e) le 17 octobre 2004 Posté(e) le 17 octobre 2004 je te salue l'ami,voilà ma solution,il doit y en avoir d'autres, mais celle ci a deux mériteselle existe et elle fonctionne.le principe est le suivantje liste la polyligne,je choisis un point sur un segment quelconque,je calcule l'angle du premier segmentje calcule l'angle entre le point du premier segment et le point choisisi c'est bon, (à la sixième décimale, faut bien filtrer), ça s'arrêteavec une indication du numéro du segment,si c'est pas bon je passe au suivant et je fais le même test,et ainsi de suite.tiens moi au courant.bonsoir(setq ent (car (entsel)))(setvar "osmode" 512)(setq pt (getpoint "\nchoix du segment ...\n"))(setq pt (list (car pt) (cadr pt)))(setvar "osmode" 0)(setq lc (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10))(entget ent))))(setq lon (length lc))(setq n 0)(setq segment 1)(setq test1 0 test2 200)(repeat lon (setq tempo1 (nth n lc) n (+ 1 n) tempo2 (nth n lc) test1 (rtos (angle tempo1 tempo2) 2 6) test2 (rtos (angle tempo1 pt) 2 6)) (if ( = test1 test2) (progn (alert (strcat "il s'agit du segment : " (itoa segment))) (quit) ) ) (setq segment (+ segment 1)) )ben voilà, c'est tout ce que j'avais à direamicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
bonuscad Posté(e) le 18 octobre 2004 Posté(e) le 18 octobre 2004 Salut Tramber, En regardant le fil http://www.cadxp.com/sujetXForum-3162.htm Je trouve que la demande est similaire et pourrait être aussi résolue par la même démarche. La solution de Didier est bonne (mais plante sur le vertex qui peut clore une polyligne)Avec ces 2 dicussions tu trouveras certainement la solution que tu désire. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Tramber Posté(e) le 18 octobre 2004 Auteur Posté(e) le 18 octobre 2004 Merci bien les gars ! C'est un vrai problème quand les poly contiennent des arcs ! Non ? Je me suis même demandé à un moment, s'il ne fallait pas mieux transformer en polyligne ancienne génération, car là, entsel renvoie le vertex sur lequel on clique, celui qu'on cherche. C'est ce que me propose Didier avec PLINETYPE, il me semble. Mais j'ai de la matière pour la semaine maintenant. [Edité le 18/10/2004 par Tramber] Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
bonuscad Posté(e) le 18 octobre 2004 Posté(e) le 18 octobre 2004 Tu peux utiliser PLINETYPE en effet mais, à ce moment là, ce n'est plus (entsel) mais (nentsel) qu'il faut utiliser.Tu as certainement penser juste mais écrit faux ;) Mais si tu utilise cet accés direct aux sous-entité, la procédure pour identifier le numéro de segment va devenir difficile, mais c'est peut être un faux problème par rapport a ce que tu veux obtenir (identifier le segment ou obtenir ses points de définition ?)En effet la routine de Didier ne fonctionne pas avec des arcs. La routine sur laquelle je te renvoie assume les arcs mais pas les splines. Elles te retourne les sommets précédent et suivant. (tu peux la modifier pour obtenir la position du segment si c'est vraiment ça que tu cherche) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
didier Posté(e) le 18 octobre 2004 Posté(e) le 18 octobre 2004 bonsoir les furieux,ben je vais regarder de près la routine de Serge,car ce que j'ai pondu, c'est perfectible,c'est vrai que je n'ai pas pensé aux arcs éventuels.Une preuve de plus,qu' à plusieurs têteson pense plusieurs fois ... et on se sent moins seul,Einstein devait se sentir terriblement seul, lui ... à bientôt Éternel débutant... Mon site perso : Programmer dans AutoCAD
Serge Posté(e) le 22 octobre 2004 Posté(e) le 22 octobre 2004 Tramber, Il y a aussi ce code (ne s'applique qu'aux polylignes optimisées). Tient compe des arcs. À noter une variante pour la détection des sommets. (defun c:test ( / dist n place pline plinesel point selectedDist sommet sommets vlaPline ) (setq plinesel (entsel "\nSélectionnez la polyligne:")) (setq pline (car plinesel)) (setq point (osnap (cadr plinesel) "_nearest")) (setq vlaPline (vlax-ename->vla-object pline)) (if (= (vla-get-objectname vlaPline) "AcDbPolyline") (progn (setq selectedDist (vlax-curve-getDistAtPoint vlaPline point)) (setq sommets (safearray-value (variant-value (vla-get-Coordinates vlaPline)))) (setq n (1- (length sommets))) (setq place nil) (while (> n 0) (setq sommet (list (nth (1- n) sommets) (nth n sommets))) (setq dist (vlax-curve-getDistAtPoint vlaPline sommet)) (if (and (not place) (< dist selectedDist)) (setq place (/ (1+ n) 2))) (setq n (- n 2)) ) ;; Note: L'index du premier sommet est 1. (princ (strcat "\nLe point choisi se situe entre les sommets " (itoa place) " et " (itoa (1+ place)) " de " (itoa (/ (length sommets) 2)) " sommets." )) )) (princ)) Tout ce que j'ignore, je le dois à mes connaissances (l'inverse se dit aussi). Serge
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant