; Axes sur cercles

(defun c:AxesCercles (
		     / OsmodeCourant CalqueCourant
		     	ChoixDeLaValeur Valeur ObjSelection
		     	NbreObjSelection index CentreDuCercle
		     	RayonDuCercle ValeurDeDecalage
		     	PT1 PT2 PT3 PT4
		    )
; Mémorise le mode d'accrochage courant
  (setq OsmodeCourant (getvar "Osmode"))
; Désactive le mode d'accrochage
  (setvar "osmode" 0)
; Mémorise le nom du calque courant
  (setq CalqueCourant (getvar "Clayer"))
; Crée le calque sur lequel les axes seront placés
  (command "_Layer" "_M" "AxesCercles" "_LT" "Axes" "" "")

; Définit une option de saisie lors du choix de la valeur
  (initget 7 "V P Valeur Pourcentage")
; Définit le choix de la valeur
  (setq ChoixDeLaValeur (getkword "\nValeur ou Pourcentage: "))
; Crée une condition selon le choix de la valeur
  (cond
    ; Condition si le choix de la valeur est égale à "V" 
    ((= ChoixDeLaValeur "V")
     ; controle si la valeur saisie n'est pas nulle, ni négative
     (Initget 7)
     ; Saisie de la valeur de décalage. La valeur sera de type réelle et pourra être définie par deux points
     (setq Valeur (getdist "\nValeur de décalage: "))

    )
; Condition si le choix de la valeur est égale à "P" 
    ((= ChoixDeLaValeur "P")
     ; controle si la valeur saisie n'est pas nulle, ni négative
     (Initget 7)
     ; Saisie de la valeur de décalage. La valeur sera de type réelle.
     (setq Valeur (getreal "\nPourcentage de décalage: "))
    )
  )
; Crée un jeu de sélection qui ne contiendra que des cercles
  (setq ObjSelection (ssget (list (cons 0 "Circle"))))
; Védrifie si la sélection contient des objets
  (if (/= ObjSelection nil)
    ; agrandi la zone de condition Vrai
    (progn
      ; Mémorise le nombre d'objet dans la sélection
      (setq NbreObjSelection (sslength ObjSelection))
      ; Définit une variable qui servira d'index pour le jeu de sélection
      ; dans le jeu de sélection le premier objet est à l'indice 0
      (setq Index 0)
; crée une boucle sur le nombre d'objet sélectionné
      (repeat NbreObjSelection
; Mémorise le centre du cercle de l'objet à l'indice de la valeur de l'index
	(setq CentreDuCercle
	       (cdr (assoc 10
			   (entget (ssname ObjSelection index))
		    )
	       )
	)
; Mémorise le rayon du cercle de l'objet à l'indice de la valeur de l'index
	(setq RayonDuCercle
	       (cdr (assoc 40
			   (entget (ssname ObjSelection index))
		    )
	       )
	)
; Calcule la valeur de décalage selon le choix de la valeur
	
	(if (= ChoixDeLaValeur "V")
	  (setq ValeurDeDecalage (+ RayonDuCercle Valeur))
	  (setq	ValeurDeDecalage
		 (+ RayonDuCercle
		    (/ (* RayonDuCercle Valeur) 100.0)
		 )
	  )
	)
; Mémorise les points de création des lignes
	(setq PT1 (polar CentreDuCercle 0 ValeurDeDecalage))
	(setq PT2 (polar CentreDuCercle PI ValeurDeDecalage))
	(setq PT3 (polar CentreDuCercle (/ pi 2.0) ValeurDeDecalage))
	(setq PT4 (polar CentreDuCercle (* 1.5 pi) ValeurDeDecalage))
	
; crée les lignes d'axes
	(command "_Line" PT1 PT2 "")
	(command "_line" PT3 PT4 "")

	; Incrémente la valeur de l'index
	(setq index (1+ index))
; fin de la boucle repeat
      )
      ; Fin du progn de la condition vrai
    )
    ; Affiche une alerte si aucun cercle n'est sélectionné
    (alert "Vous n'avez pas sélectionné de Cercles.")
    ; fin de la condition If
  )					

  ; réactive le mode d'accrochage précédent
  (setvar "osmode" OsmodeCourant)
; réactive le calque précédent
  (setvar "Clayer" CalqueCourant)



  (princ)
  ; fin du programme
)					
