(defun c:SolidToUser ( / ss i ent obj hSpace hAngle count)
  (vl-load-com)
  
  ;; Astuce : on utilise un filtre de sélection pour ne prendre que les Hachures ET qui sont "SOLID"
  (prompt "\nSélectionnez les hachures SOLID à remplacer <Entrée pour traiter tout le dessin> : ")
  (if (not (setq ss (ssget '((0 . "HATCH") (2 . "SOLID")))))
    (setq ss (ssget "_X" '((0 . "HATCH") (2 . "SOLID")))) ; Sélection globale si l'utilisateur fait Entrée
  )

  (if ss
    (progn
      ;; On demande à l'utilisateur l'espacement et l'angle pour la nouvelle hachure
      (setq hSpace (getdist "\nSpécifiez l'espacement des lignes pour la hachure USER <1.0>: "))
      (if (not hSpace) (setq hSpace 1.0))
      
      (setq hAngle (getangle "\nSpécifiez l'angle (en degrés) pour la hachure USER <0>: "))
      (if (not hAngle) (setq hAngle 0.0))

      (setq count 0)
      ;; Boucle à travers la sélection
      (repeat (setq i (sslength ss))
        (setq ent (ssname ss (setq i (1- i))))
        (setq obj (vlax-ename->vla-object ent))

        ;; La méthode magique : vla-SetPattern (Objet TypeDeMotif "NomDuMotif")
        ;; Type 1 = acHatchPatternTypeUserDefined (Défini par l'utilisateur)
        ;; Le nom importe peu pour le type 1, on met conventionnellement "_USER"
        (vla-SetPattern obj 1 "_USER")
        
        ;; On applique le nouvel espacement et l'angle
        (vla-put-PatternSpace obj hSpace)
        (vla-put-PatternAngle obj hAngle)
        
        ;; On recalcule la géométrie et on met à jour l'affichage
        (vla-Evaluate obj)
        (vla-Update obj)
        
        (setq count (1+ count))
      )
      (princ (strcat "\nTerminé ! " (itoa count) " hachure(s) SOLID modifiée(s) en USER."))
    )
    (princ "\nAucune hachure SOLID n'a été trouvée ou sélectionnée.")
  )
  (princ)
)

(princ "\nCommande chargée. Tapez SOLIDTOUSER pour l'exécuter.")
(princ)