; Coordonnées des sommets d'une polyligne

(defun c:CSP ( / ObjSelection Index index1 VLAObj NomObj PTDepart ValCoord)

  (vl-load-com)

  (setq Osmode (getvar "osmode"))

  (setvar "osmode" 0)

  (setq CalqueCourant (getvar "Clayer"))
  

; sous-programme pour définir la hauteur du texte si elle n'est pas définie
(HauteurTexte)
  ; Sélection des objets Polylignes
  (setq	ObjSelection
	 (ssget
	   (list
	     (cons
	       0
	       "LWPOLYLINE,POLYLINE" )))
  )
; teste si des objets polylignes ont été sélectionnés
  (if (/= ObjSelection nil)
    (progn
; incrémente l'index des objets dans la sélection
    (setq Index 0)
; boucle sur le nombre d'objet trouvé
      (repeat (sslength ObjSelection)
; récupère les propriétés de l'objet à l'indice ...
	(setq
	  VLAObj (vlax-ename->vla-object (ssname ObjSelection index))
	)
; récupère le nom de l'objet
	(Setq NomObj (vla-get-objectname VLAObj))

; récupère les coordonnées de tous les sommets sous la forme d'une liste
; (x y xy xy xy ...) ou (x y z x y z x y z ...) selon le type de polyligne
	   (setq PTDepart (vlax-safearray->list
			    (vlax-variant-value
			      (vla-get-Coordinates VLAObj)
			    )
			  )
	   )
; Incrémente un index pour passer un à un tous les sommets
	   (setq index1 0)

; Teste le type d'objet polyligne
	; si c'est une polyligne optimisée "AcDbPolyline" alors dans ses coordonnées ne figure pas le Z
	; si c'est une polyligne non optimsée "AcDB2dPolyline" alors ses coordonnées sont X Y et Z
	 (if (= (vla-get-objectname VLAObj) "AcDbPolyline")
	   (setq ValCoord 2)
	   (setq ValCoord 3)
	   )

	(setvar "clayer" (vla-get-layer VLAObj))

	; boucle sur la longueur des la liste des sommets
	; cette longueur est divisée par 2 ou par 3 selon le type de polyligne
	   (repeat (/ (length PTDepart) ValCoord)

	     ; sous-programme pour écrire la coordonnée X
	     (EcritureCoordonnees_x
	       (list (nth index1 PTDepart)
		     (nth (1+ index1) PTDepart)
	       )
	     )
; sous-programme pour écrire la coordonnée Y
	(EcritureCoordonnees_y
	       (list (nth index1 PTDepart)
		     (nth (1+ index1) PTDepart)
	       )
	     )
	     ; incrémente le compteur de sommets
	     (setq index1 (+ index1 ValCoord))
	   )
; on écrémente le compteur des objets dans le jeu de sélection
(setq index (1+ index))
	
	  ) ; fin de la boucle Repeat
    ) ; fin du Progn
      ) ; Fin du If

  (setvar "osmode" osmode)

  (setvar "Clayer" CalqueCourant)
  
    (princ)
  
) ; fin du Defun du programme principal


; ======== SOUS-PROGRAMMES ==========================

    (defun EcritureCoordonnees_X (XY)

      (if (= HauteurStyleCourant 0)
	(command "_text"
		 xy
		 HauteurDuTexte
		 90
		 (rtos (car XY) 2 (getvar "luprec"))
	)
	(command "_text" xy 90 (rtos (car XY) 2 (getvar "luprec")))
      )
    )


(defun EcritureCoordonnees_Y (XY)

  (if (= HauteurStyleCourant 0)
   (command "_text" xy HauteurDuTexte 0 (rtos (cadr XY) 2  (getvar "luprec")))
	(command "_text" xy 0 (rtos (cadr XY) 2  (getvar "luprec")))
      )
  )

(defun HauteurTexte ()

  ; récupère le nom du style de texte courant
  (setq NomStyleTexteCourant (getvar "TextStyle"))
; récupère la hauteur du style de texte courant
  (setq HauteurStyleCourant (cdr (assoc 40 (tblsearch "Style" NomStyleTexteCourant))))
; texte la hauteur du style de texte courant
  ; si la hauteur est égale = 0 alors on demande à l'utilisateur d'entrer une hauteur
  (if (= HauteurStyleCourant 0)
    (progn
     ; la valeur est obligatoire et non négative 
    (initget 7)
    (setq HauteurDuTexte (getreal "\nHauteur du texte : "))
    )
    ; sinon on récupère la hauteur définit dans le style de texte courant
    (setq HauteurDuTexte HauteurStyleCourant)
    )
  )