thierry.garré Posté(e) le 30 août 2009 Posté(e) le 30 août 2009 Olah Les Lispeurs, j'aurai besoin d'un petit coup de main. je cherche une routine qui me permettrai l'opération suivante: je choisis une polyligne (2d)je sélectionne un emplacement dessusun deuxième point (sommet) pour donner le sensje fixe une distance au clavier la routine effectue une coupure de la polyligne à la distance du premier point dans le sens du deuxième point en suivant la polyligne c'est imaginable ???? Merci d'avance Cordialement Thierry Garré Géorail-Covadis-Autopiste-Autocad-Autocad Map-Infraworks 360- Navisworks -Recap
Invité Patrick Posté(e) le 30 août 2009 Posté(e) le 30 août 2009 La difficulté d'une telle programmation va dépendre pour partie du fait que la polyligne comporte ou non des arcs.
Tramber Posté(e) le 30 août 2009 Posté(e) le 30 août 2009 Non, pas du tout. Y'aura pas de problème avec les parties courbes. Il faut que ce soit une LWPOLYLINE, c'est tout. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Tramber Posté(e) le 30 août 2009 Posté(e) le 30 août 2009 Voici un petit code : (defun c:cpo( / vpoly poly longueur distdep dist2 dist *osnap* dern) (vl-load-com) (setq vpoly(vlax-ename->vla-object (setq poly(car(entsel"\nSelectionnez la polyligne"))))) (if(=(vla-get-ObjectName vpoly)"AcDbPolyline") (if (and(setq longueur(vlax-curve-getDistAtParam vpoly(vlax-curve-getEndParam vpoly))) (setq distdep(vlax-curve-getDistAtPoint vpoly (getpoint"\nSpécifiez un point sur la polyligne :" ))) (setq dist2(vlax-curve-getDistAtPoint vpoly (getpoint"\nSpécifiez un point de direction :" ))) (setq dist(initget 4)dist(getreal"\nDistance de coupe :")) ) (cond((= distdep dist2)(princ "\nLa direction n'est pas clairement spécifiée")) (( (if( (progn (vl-cmdf "_break" (vlax-vla-object->ename vpoly)(vlax-curve-getpointatdist vpoly distdep) (vlax-curve-getpointatdist vpoly distdep)) (vl-cmdf "_break" (setq dern(entlast))(vlax-curve-getpointatdist(vlax-ename->vla-object(entlast))dist) (vlax-curve-getpointatdist(vlax-ename->vla-object(entlast))dist)) (entdel dern) ) (princ "\nLa distance de coupe maxi est dépassée")) (setvar "osmode" *osnap*)) ((> distdep dist2)(setq *osnap*(getvar "osmode"))(setvar "osmode" 0) (if(>(- distdep dist)0.0) (progn (vl-cmdf "_break" (vlax-vla-object->ename vpoly)(vlax-curve-getpointatdist vpoly distdep) (vlax-curve-getpointatdist vpoly distdep)) (vl-cmdf "_break" (vlax-vla-object->ename vpoly)(vlax-curve-getpointatdist vpoly(- distdep dist)) (vlax-curve-getpointatdist vpoly(- distdep dist))) (entdel(entlast)) ) (princ "\nLa distance de coupe maxi est dépassée")) *osnap*) ) (princ "\nDonnées insuffisantes") ) (princ "\nL'objet n'est pas une LWpolyligne") ) ) [Edité le 31/8/2009 par Tramber] Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 30 août 2009 Posté(e) le 30 août 2009 Tramber a été plus rapide ;) PS, si tu pouvais formater ton code... Avec les fonctions vlax-curve* (qui n'ont pas d'équivalent en VBA, je crois), on pourrait le faire sur tout type d'objet curviligne. La commande suivante accepte les arcs, les lignes et les polylignes ou les splines ouvertes. (defun c:CutAtDist (/ ent elst p1 d1 p2 d2 dist pt) (vl-load-com) (if (and (setq ent (car (entsel "\nSélectionnez l'objet à couper: "))) (setq elst (entget ent)) (or (member (cdr (assoc 0 elst)) '("ARC" "LINE")) (and (member (cdr (assoc 0 elst)) '("LWPOLYLINE" "POLYLINE" "SPLINE")) (zerop (logand 1 (cdr (assoc 70 elst)))) ) ) ) (if (and (setq p1 (getpoint "\nSpécifiez le point de base: ")) (setq p1 (trans p1 1 0)) (setq d1 (vlax-curve-getDistAtPoint ent p1)) (setq p2 (getpoint "\nSpécifiez un point dans la direction de la coupure: ")) (setq d2 (vlax-curve-getDistAtPoint ent p2)) ) (if (and (setq dist (getdist "\Spécifiez la distance depuis le point de base: ")) (setq pt (vlax-curve-getPointAtDist ent ((if ( ) (command "_.break" ent "_non" (trans pt 0 1) "_non" "@") (princ "\nLa distance spécifiée est trop grande.") ) (princ "\nLe point spécifié n'est pas sur la polyligne.") ) (princ "\nL'entité sélectionnée n'est pas valide.") ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
usegomme Posté(e) le 30 août 2009 Posté(e) le 30 août 2009 Salut Tramber et tout le monde. Voici un petit code Et bien masette c'est un impressionnant petit code , mais je pense qu' il va faire peur aux aspirants lispeurs. En comparaison j'ai fait un lispounet tout bête qui doit aussi faire l'affaire , reste à lui apporter quelques aménagements suivant l'utilisateur. ;; cptg coupure pour Thierry Garré (defun c:cptg (/ o p1 a l p2) (setq o (entsel "\n Coupure selectionnez l'objet: ")) (redraw (car o) 3) (setq p1 (getpoint "\n 1er point de coupure :") a (getangle p1 "\n orientation coupure :") l (getdist "\n longueur de la coupure :") p2 (polar p1 a l)) (command "_break" o "_f" "_none" p1 "_none" p2) )
(gile) Posté(e) le 30 août 2009 Posté(e) le 30 août 2009 Salut usegome, Le problème avec ta routine est que tu utilises polar, pour qu'il fonctionne, il faut donc que le segment soit rectiligne du point de base jusqu'au point de coupure. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
usegomme Posté(e) le 30 août 2009 Posté(e) le 30 août 2009 Tu as tout à fait raison (gile) , j'ai mal interprété le sujet.
(gile) Posté(e) le 30 août 2009 Posté(e) le 30 août 2009 Je ne suis pas sûr d'avoir bien compris non plus, la routine de Tramber coupe du premier point au point à la distance spécifiée, la mienne coupe au point à la distance spécifiée depuis le premier point ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
usegomme Posté(e) le 30 août 2009 Posté(e) le 30 août 2009 (gile) ! Aprés un bref essai Il y a un problème avec ton code ,celui de Tramber marche bien .
usegomme Posté(e) le 30 août 2009 Posté(e) le 30 août 2009 On "parle" en même temps , ta coupure démarre au sommet qui suit le premier point sur mon test et fini à la bonne distance du premier point à priori.
(gile) Posté(e) le 30 août 2009 Posté(e) le 30 août 2009 (gile) ! Aprés un bref essai Il y a un problème avec ton code ,celui de Tramber marche bien . N'est-ce pas dû à ce que je disais plus haut, concernant une interprétation différente de la demande ?Ma routine coupe la courbe en un seul point. pour couper du premier point au point à la distance spécifiée, il faut remplacer :(command "_.break" ent "_non" (trans pt 0 1) "_non" "@")par(command "_.break" ent "_non" (trans pt 0 1) "_non" (trans p1 0 1)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 31 août 2009 Posté(e) le 31 août 2009 Coucou, Mon code est un peu bizarre mais, au départ je n'avais pas contrôlé les OSNAP. Sinon, j'aurais pu l'écrire plus simple avec un seul break. Mais de la manière faite, on peut garder celle qui se nomme VPOLY en mémoire pour post-traitement. Hop, la semaine commence. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
thierry.garré Posté(e) le 31 août 2009 Auteur Posté(e) le 31 août 2009 Et bien merci de l'intérët que vous portez à ma demande !!! la demande est bien telle que tu l'as analysé Gile coupure de la polyligne à une certaine distance en un point. pour le Lisp de Tramber: j'ai un massage d'erreurlors de la selection de la polyligne: [surligneur]Selectionnez la polyligne; erreur: no function definition: VLAX-ENAME->VLA-OBJECT [/surligneur] pour le lisp de Gile: j'ai un message d'erreur lors de la selection du premier point: [surligneur]Spécifiez le point de base: _endp de ; erreur: no function definition: VLAX-CURVE-GETDISTATPOINT [/surligneur] pour le lisp de Usegomme: il fonctionne mais la coupure se fait au niveau du premier point indiqué, pas à la distance souhaitée Cordialement Le neuneu de service en Lisp Thierry Garré Géorail-Covadis-Autopiste-Autocad-Autocad Map-Infraworks 360- Navisworks -Recap
Tramber Posté(e) le 31 août 2009 Posté(e) le 31 août 2009 Pour les 2, il faut ajouter un (vl-load-com) au tout début des programmes. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 31 août 2009 Posté(e) le 31 août 2009 Salut, J'ai ajouté le (vl-load-com) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
thierry.garré Posté(e) le 31 août 2009 Auteur Posté(e) le 31 août 2009 Merci beaucoup, les deux fonctionnent parfaitement cordialement Thierry Garré Géorail-Covadis-Autopiste-Autocad-Autocad Map-Infraworks 360- Navisworks -Recap
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