CADxp: Convertir une spline en polyligne - CADxp

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Convertir une spline en polyligne

#1 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11158
  • Inscrit(e) : 02-septembre 05

Posté 10 février 2008 - 15:55

Salut,

Il existe de nombreuses routines pour transformer des splines en polylignes. La plupart créent une polyligne constituée de nombreux segments droits. Plus ces segments sont courts, donc plus les sommets sont nombreux, plus la polyligne "suit" précisément les courbes de la spline source.

Voici un LISP qui crée une polyligne constitués de segments en arc de cercle. La longueur des segments est calculée en fonction des changement de courbure de la spline sans toutefois être inférieure à une longueur minimale.

Le LISP contient 2 routines et une fonction d'appel SPL2PL.
L'utilisateur sélectionne une spline, spécifie la longueur minimale pour les segments, une fois la polyligne créée, il peut valider le résultat ou spécifier une autre largeur minimale, enfin, il lui est proposé de conserver ou non la spline source.

EDIT : correction d'un dysfonctionnement dans le calcul du bulge du dernier segment dans des SCU non parallèle au SCG

;; SplineToPline (gile) 10/02/08
;; Crée une polyligne à partir d'une spline.
;; La polyligne est constituée exclusivement de segments en arc de cercle.
;; La longueur de chaque segment est calculée en fonction des changements
;; de courbure de la spline et de la longueur minimale des segments.
;;
;; Arguments
;; spl : le nom d'entité de la spline (ename)
;; seg : la longueur minimale des segments (entier ou réel)

(defun SplineToPline (spl    seg    /	   dis	  nor	 len	ptg1   pto1
		      elv    lsto   deriv1 n	  loop	 ptg2	pto2   deriv2
		      ang    blst   pl
		     )
  (vl-load-com)
  (or *acdoc*
      (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
  )
  (setq	dis    (float seg)
	nor    (cdr (assoc 210 (entget spl)))
	len    (vlax-curve-getDistAtParam spl (vlax-curve-getEndParam spl))
	ptg1   (vlax-curve-getPointAtDist spl 0)
	pto1   (trans ptg1 0 nor)
	elv    (caddr pto1)
	lsto   (cons pto1 lsto)
	deriv1 (angle '(0 0)
		      (trans (vlax-curve-getFirstDeriv
			       spl
			       (vlax-curve-getParamAtPoint spl ptg1)
			     )
			     0
			     nor
		      )
	       )
	n      0
  )
  (while (< dis len)
    (setq loop T)
    (while loop
      (if (and (< dis len)
	       (setq ptg2 (vlax-curve-getPointAtDist spl dis))
	       (setq pto2 (trans ptg2 0 nor))
	       (equal (- (setq deriv2
				(angle
				  '(0 0)
				  (trans (vlax-curve-getFirstDeriv
					   spl
					   (vlax-curve-getParamAtPoint spl ptg2)
					 )
					 0
					 nor
				  )
				)
			 )
			 (setq ang (angle pto1 pto2))
		      )
		      (- ang deriv1)
		      0.01
	       )
	  )
	(setq dis (+ dis seg))
	(setq loop nil)
      )
    )
    (setq lsto	 (cons pto2 lsto)
	  blst	 (cons (cons n (tan (/ (- ang deriv1) 2.0))) blst)
	  ptg1	 ptg2
	  pto1	 pto2
	  deriv1 deriv2
	  dis	 (+ dis seg)
	  n	 (1+ n)
    )
  )
  (setq	lsto (cons (trans (vlax-curve-getEndPoint spl) 0 nor) lsto)
	blst (cons
	       (cons
		 n
		 (tan
		   (/ (- (angle (cadr lsto) (car lsto))
			 (angle	'(0 0)
				(trans
				  (vlax-curve-getFirstDeriv
				    spl
				    (vlax-curve-getParamAtPoint spl ptg1)
				  )
				  0
				  nor
				)
			 )
		      )
		      2.0
		   )
		 )
	       )
	       blst
	     )
	lsto (reverse (mapcar '(lambda (p) (list (car p) (cadr p)))
			      (if (vlax-curve-isClosed spl)
				(cdr lsto)
				lsto
			      )
		      )
	     )
  )
  (setq	pl (vlax-invoke
	     (vla-get-ModelSpace *acdoc*)
	     'addLightWeightPolyline
	     (apply 'append lsto)
	   )
  )
  (mapcar '(lambda (x) (vla-setBulge pl (car x) (cdr x)))
	  blst
  )
  (if (vlax-curve-IsClosed spl)
    (vla-put-Closed pl :vlax-true)
  )
  (vla-put-Normal pl (vlax-3d-point nor))
  (vla-put-Elevation pl elv)
  (princ)
)

;; Tan
;; Retourne la tangente de l'angle

(defun tan (a) (/ (sin a) (cos a)))

;; SPL2PL
;; Fonction principale

(defun c:spl2pl	(/ spl seg loop)
  (vl-load-com)
  (while (not
	   (and
	     (setq spl (car (entsel "\nSélectionnez une spline: ")))
	     (= (cdr (assoc 0 (entget spl))) "SPLINE")
	     (vlax-curve-IsPlanar spl)
	   )
	 )
  )
  (setq loop T)
  (while loop
    (initget 7)
    (setq seg (getdist "\nSpécifiez la longueur minimum des segments: "))
    (SplineToPline spl seg)
    (initget "Oui Non")
    (if	(= (getkword "\nConserver le résultat ? [Oui/Non] [b]<[/b]Oui>: ")
	   "Non"
	)
      (entdel (entlast))
      (setq loop nil)
    )
  )
  (initget "Oui Non")
  (if (/= (getkword "\nSupprimer la spline ? [Oui/Non] [b]<[/b]Oui>: ")
	  "Non"
      )
    (entdel spl)
  )
  (princ)
) 
<font class=edite>[Edité le 10/2/2008 par (gile)]</font>
<font class=edite>[Edité le 11/2/2008 par (gile)]</font>
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#2 L'utilisateur est en ligne   lili2006 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11918
  • Inscrit(e) : 21-décembre 05

Posté 10 février 2008 - 16:58

Bonjour à toutes et tous,

ça marche super (gile) !

Merci pour cet utilitaire.
0

#3 L'utilisateur est hors-ligne   Bred 

  • ceinture noire 5em dan
  • Groupe : Membres
  • Messages : 2721
  • Inscrit(e) : 07-mars 06
  • LocationAntibes

Posté 11 février 2008 - 09:56

Salut,
chez moi ça ne fonctionne pas, désolé....

Citation

Commande: spl2pl
Sélectionnez une spline:
Spécifiez la longueur minimum des segments: 0.01
; erreur: type d'argument incorrect: VLA-OBJECT nil
Commande:

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
0

#4 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11158
  • Inscrit(e) : 02-septembre 05

Posté 11 février 2008 - 10:31

Salut,

J'avais oublié de définir *acdoc* (défini chez moi dans le fichier acaddoc.lsp)

C'est réparé.
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#5 L'utilisateur est en ligne   lili2006 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11918
  • Inscrit(e) : 21-décembre 05

Posté 11 février 2008 - 11:54

Bonjour à toutes et tous,

Chez moi, ça fonctionne sans avoir redéfini *acdoc* (V2008), bizarre,non ?
0

#6 L'utilisateur est hors-ligne   Bred 

  • ceinture noire 5em dan
  • Groupe : Membres
  • Messages : 2721
  • Inscrit(e) : 07-mars 06
  • LocationAntibes

Posté 11 février 2008 - 12:33

Re,
merci (gile) !

Citation

Chez moi, ça fonctionne sans avoir redéfini *acdoc* (V2008), bizarre,non ?

... c'est que *acdoc* doit être défini dans un autre lisp que tu as, est pas déclaré en variable locale...

Si tu tapes !acdoc en ligne de commande, tu dois avoir un retour différent de nil.

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
0

#7 L'utilisateur est hors-ligne   goufis 

  • ceinture blanche
  • Groupe : Membres
  • Messages : 1
  • Inscrit(e) : 14-juillet 08

Posté 14 juillet 2008 - 12:24

merci çà marche super et j'en avais vraiment besoin
0

#8 L'utilisateur est hors-ligne   philsogood 

  • ceinture noire 4em dan
  • Groupe : Membres
  • Messages : 2315
  • Inscrit(e) : 03-mars 10

Posté 12 avril 2019 - 10:08

hello
j'ai un bug qund j'utilise cette fonction depuis que je suis en V2019
des fois ça amrche et souvent ça amrche aps
quand je précise une longueur pour l'édition de ma PL j'ai ce message qui s'afficeh :
erreur: type d'argument incorrect: numberp: nil

ça vient d'ou??
Phil
Projeteur Revit - traitement des eaux
0

#9 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11158
  • Inscrit(e) : 02-septembre 05

Posté 12 avril 2019 - 10:21

Depuis plusieurs version déjà (2013 ?), l'option Polyligne de la commande native EDITSPLINE (accessible par le menu contextuel quand une spline est sélectionnée) permet de convertir une spline en polyligne et rend donc ce LISP obsolète.
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#10 L'utilisateur est hors-ligne   COME 

  • ceinture noire
  • Groupe : Membres
  • Messages : 396
  • Inscrit(e) : 16-septembre 13

Posté 12 avril 2019 - 10:52

Voir le message(gile), le 12 avril 2019 - 10:21 , dit :

Depuis plusieurs version déjà (2013 ?), l'option Polyligne de la commande native EDITSPLINE (accessible par le menu contextuel quand une spline est sélectionnée) permet de convertir une spline en polyligne et rend donc ce LISP obsolète.


Merci merci merci beaucoup !

Dernièrement j'ai reçu un plan de cheminement piéton avec des splines pour les contours au lieu de polylignes ce qui m'a franchement compliqué la vie pour la poursuite du projet. Maintenant je serai plus serein devant un tel cas de figure.

Je confirme pour la V2013 !
COME

La vie sans musique est tout simplement une erreur, une fatigue, un exil. »
Friedrich Nietzsche
0

#11 L'utilisateur est hors-ligne   philsogood 

  • ceinture noire 4em dan
  • Groupe : Membres
  • Messages : 2315
  • Inscrit(e) : 03-mars 10

Posté 12 avril 2019 - 11:13

arf... j'avais oublié... mais ton lisp faisait des arcs et c'était plus joli!
bref
merci pour l'info
++
Phil
Projeteur Revit - traitement des eaux
0

#12 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11158
  • Inscrit(e) : 02-septembre 05

Posté 12 avril 2019 - 11:22

Voir le messagephilsogood, le 12 avril 2019 - 11:13 , dit :

arf... j'avais oublié... mais ton lisp faisait des arcs et c'était plus joli!


Regarde la variable PLINECONVERTMODE...
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

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