Aller au contenu

coupure de polyligne a une certaine distance


Messages recommandés

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 dessus

un deuxième point (sommet) pour donner le sens

je 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

Lien vers le commentaire
Partager sur d’autres sites

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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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)
)

Lien vers le commentaire
Partager sur d’autres sites

(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

Lien vers le commentaire
Partager sur d’autres sites

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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é