; centre de gravité d'un solide
; barycentre d'une région

(defun c:CGS ()

  ; charge la connexion VBX
  (vl-load-com)

  ; Sélection d'un objet
  (setq ObjSelection (car (entsel "\nSélectionner un solide ou une région : ")))

  ; Mémorise le nom de l'objet
  (setq TypeObjet (cdr (assoc 0 (entget ObjSelection))))

  ; Vérifie que l'objet sélectionné soit bine un 3DSOLID ou une REGION
  (if (or (= TypeObjet "3DSOLID") (= TypeObjet "REGION"))
    (progn

; Mémorise la valeur de l'accrochage aux objets
(setq Osmode (getvar "Osmode"))
; Désactive les accrochages aux objets
(setvar "osmode" 0)
; Mémorise le nom du calque courant
(setq CalqueCourant (getvar "clayer"))
; Récupère le nom du calque de l'objet sélectionné et active le calque
;(command "_layer" "_m" (cdr (assoc 8 (entget ObjSelection))) "")

; crée un calque nommé "Centre de gravité" et le met courant
(command "_layer" "_m" "Centre de gravité" "")

; Active le SCU en mode général
  (command "_ucs" "")

; convertis l'objet en module VBX
  (setq ObjVBA (vlax-ename->Vla-Object ObjSelection))

; Mémorise la coordonnée du centre de gravité au format VBX
  (setq CentreDeGravite (vla-get-centroid ObjVBA))
; Convertis la coordonnée VBX en coordonnée LISP
  (setq CentreDeGravite (vlax-safearray->list (vlax-variant-value CentreDeGravite)) )

  ; Crée un objet point que l'on place à la coordonnée du centre de gravité
  (command "_Point" CentreDeGravite)
; On se replace sur le calque précédent
(command "_layer" "_m" CalqueCourant "")
; On réactive le mode d'accrochage aux objets
(setvar "osmode" Osmode)
; On revient sur le SCU précédent
 (command "_ucs" "_p")

  )
    ; si l'objet sélectionné n'est ni un 3DSOLID, ni une REGION on affiche une alerte
    (alert "Vous n'avez pas sélectionné un Solide ou une Region.")

    )
; on évite le retour de la dernière valeur
  (princ)
; fin du programme
  )


  