Aller au contenu

Changer la police d\'éléments imbriqués


Tagazin

Messages recommandés

Bonjour à Tous,

 

J'ai souvent le même problème, lorsque j'ouvre des fichiers, AutoCAD me demande de remplacer une police par une autre.

 

Nous avons tous été confrontés à ce problème, surtout dans le monde du BTP.

Car les Archi utilisent des Police qu'AutoCAD ne connait.

 

Je penses qu'il serait utile de créer un lisp pour palier à ce problème.

 

Il faudrait que ce lisp recherche tous les TXT, MTXT, ATTRIB, etc.

Bref tout ce qui est "texte" et même dans éléments imbriqués.

 

Puis il nous demanderait de piocher dans la liste de Police AutoCAD pour tout convertir en cette dernière.

Et purger ainsi tous les styles qui ne sont plus utilisés.

 

Mais voilà, j'ai un problème, pour moi, c'est plus facile à dire qu'à faire !

 

J'ai bien essayé de m'inspirer du lisp "EXP.LSP V1.01" de Patrick_35.

Mais, il est trop fort pour moi, car le Visual Lisp je m'y connais encore moins bien que le lisp.

 

J'en appel donc à toute la communauté : "Ah l'aide !"

 

Merci à Tous.

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut et bienvenue,

 

Ta demande est un peu confuse à mes yeux.

Puis il nous demanderait de piocher dans la liste de Police AutoCAD pour tout convertir en cette dernière.

Et purger ainsi tous les styles qui ne sont plus utilisés.

 

S'agit-il d'attribuer une police à tous les objets de type "texte" et aux styles de texte ?

Ou s'agit-il d'attribuer un style de texte existant à tous les objets "texte" ?

 

Seule la la seconde méthode permet de purger des style de texte devenus inutiles.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Et merci de me répondre.

Oui c'est ça c'est la 2ème.

 

En fait je reçois des plans d'archi qui ont été fait sous un autre soft.

Il faudrait donc tout convertir en Romand (par exemple) afin que l'on puisse tout purger, même les éléments imbriqués.

 

J'espère que je me suis bien exprimé...

Merci encore.

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Comme je ne comprends toujours pas bien, tu parles de style de texte et tu cites une police (romand), je donne 2 routines.

 

OneStyle : Attribue le style de texte sélectionné à tous les objets "texte" et purge les autres styles.

 

;;; OneStyle (gile)
;;; Attribue le style de texte sélectionné à tous les objets "texte"
;;; purge les autres styles

(defun c:OneStyle (/ TextStyles styles style ObjName)
 (vl-load-com)
 (or *acdoc*
 (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (setq TextStyles (vla-get-TextStyles *acdoc*))
 (vlax-for s TextStyles
   (setq styles (cons (vla-get-Name s) styles))
 )
 (setq	styles (acad_strlsort (vl-remove "" styles)))
 (if
   (setq
     style (listbox
      "Choisir le style de texte"
      nil
      (mapcar '(lambda (x) (cons x x)) styles)
      1
    )
   )
    (progn
      (vlax-for b (vla-get-Blocks *acdoc*)
 (vlax-for e b
   (setq ObjName (vla-get-ObjectName e))
   (cond
     ((member ObjName
	      '("AcDbAttributeDefinition"
		"AcDbText"
		"AcDbMText"
	       )
      )
      (vla-put-StyleName e style)
      (vla-update e)
     )
     ((= (vla-get-ObjectName e) "AcDbBlockReference")
      (foreach a (vlax-invoke e 'GetAttributes)
	(vla-put-StyleName a style)
      )
     )
   )
 )
      )
      (SetTextStyleToDimStyles style)
      (SetTextStyleToTableStyles style)
      (vla-put-ActiveTextStyle *acdoc* (vla-item TextStyles style))
      (vla-put-ActiveDimStyle *acdoc* (vla-get-ActiveDimStyle *acdoc*))
      (vlax-for ts TextStyles
 (or (= (vla-get-Name ts) style)
     (vl-catch-all-apply 'vla-delete (list ts))
 )
      )
      (vla-regen *acdoc* acAllViewports)
    )
 )
 (princ)
)

;; ListBox (gile)
;; Boite de dialogue permettant un ou plusieurs choix dans une liste
;;
;; Arguments
;; title : le titre de la boite de dialogue (chaîne)
;; msg ; message (chaîne), "" ou nil pour aucun
;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...)
;; flag : 0 = liste déroulante
;;        1 = liste choix unique
;;        2 = liste choix multipes
;;
;; Retour : la clé de l'option (flag = 0 ou 1) ou la liste des clés des options (flag = 2)
;;
;; Exemple d'utilisation
;; (listbox "Présentation" "Choisir une présentation" (layoutlist) 1)

(defun ListBox (title msg keylab flag / tmp file dcl_id choice)
 (setq	tmp  (vl-filename-mktemp "tmp.dcl")
file (open tmp "w")
 )
 (write-line
   (strcat "ListBox:dialog{label=\"" title "\";")
   file
 )
 (if (and msg (/= msg ""))
   (write-line (strcat ":text{label=\"" msg "\";}") file)
 )
 (write-line
   (cond
     ((= 0 flag) "spacer;:popup_list{key=\"lst\";")
     ((= 1 flag) "spacer;:list_box{key=\"lst\";")
     (T "spacer;:list_box{key=\"lst\";multiple_select=true;")
   )
   file
 )
 (write-line "}spacer;ok_cancel;}" file)
 (close file)
 (setq dcl_id (load_dialog tmp))
 (if (not (new_dialog "ListBox" dcl_id))
   (exit)
 )
 (start_list "lst")
 (mapcar 'add_list (mapcar 'cdr keylab))
 (end_list)
 (action_tile
   "accept"
   "(or (= (get_tile \"lst\") \"\")
   (if (= 2 flag) (progn
   (foreach n (str2lst (get_tile \"lst\") \" \")
   (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice)))
   (setq choice (reverse choice)))
   (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab)))))
   (done_dialog)"
 )
 (start_dialog)
 (unload_dialog dcl_id)
 (vl-file-delete tmp)
 choice
)

;;; SetTextStyleToDimStyles (gile)
;;; Attribue le style de texte à tous les styles de cote

(defun SetTextStyleToDimStyles (ts / ds)
 (setq ts (tblobjname "style" ts))
 (while (setq ds (tblnext "DIMSTYLE" (not ds)))
   (setq ds (entget (tblobjname "DIMSTYLE" (cdr (assoc 2 ds)))))
   (entmod (subst (cons 340 ts)
	   (assoc 340 ds)
	   ds
    )
   )
 )
)

;;; SetTextStyleToTableStyles (gile)
;;; Attribue le style de texte à tous les styles de tableaux

(defun SetTextStyleToTableStyles (ts)
 (vlax-for styl
    (vla-item (vla-get-Dictionaries *acdoc*) "ACAD_TABLESTYLE")
   (vla-setTextStyle styl 7 ts)
 )
) 

 

OneFont : attribue la police spécifiée à tous les styles de texte

 

EDIT : corrigé des oublis de définition de variables globales

 

;; OneFont (gile)
;; Attribue la police spécifiée à tous les style de texte

(defun c:OneFont (/ dir font)
 (vl-load-com)
 (or *acad*
       (setq *acad* (vlax-get-acad-object))
 )
 (or *acdoc*
      (setq *acdoc* (vla-get-ActiveDocument *acad*))
 )
 (and
   (setq dir
   (car
     (vl-member-if
       (function
	 (lambda (x)
	   (wcmatch x "*fonts")
	 )
       )
       (str2lst	(vla-get-SupportPath
		  (vla-get-Files
		    (vla-get-Preferences *acad*)
		  )
		)
		";"
       )
     )
   )
   )
   (setq font
   (listbox "Choisir un fichier"
	    nil
	    (mapcar '(lambda (x) (cons x x))
		    (vl-directory-files dir "*.shx" 1)
	    )
	    1
   )
   )
   (not
     (vlax-for	ts (vla-get-TextStyles *acdoc*)
(vla-put-FontFile ts font)
     )
   )
   (vla-regen *acdoc* acAllViewports)
 )
 (princ)
)

;; ListBox (gile)
;; Boite de dialogue permettant un ou plusieurs choix dans une liste
;;
;; Arguments
;; title : le titre de la boite de dialogue (chaîne)
;; msg ; message (chaîne), "" ou nil pour aucun
;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...)
;; flag : 0 = liste déroulante
;;        1 = liste choix unique
;;        2 = liste choix multipes
;;
;; Retour : la clé de l'option (flag = 0 ou 1) ou la liste des clés des options (flag = 2)
;;
;; Exemple d'utilisation
;; (listbox "Présentation" "Choisir une présentation" (layoutlist) 1)

(defun ListBox (title msg keylab flag / tmp file dcl_id choice)
 (setq	tmp  (vl-filename-mktemp "tmp.dcl")
file (open tmp "w")
 )
 (write-line
   (strcat "ListBox:dialog{label=\"" title "\";")
   file
 )
 (if (and msg (/= msg ""))
   (write-line (strcat ":text{label=\"" msg "\";}") file)
 )
 (write-line
   (cond
     ((= 0 flag) "spacer;:popup_list{key=\"lst\";")
     ((= 1 flag) "spacer;:list_box{key=\"lst\";")
     (T "spacer;:list_box{key=\"lst\";multiple_select=true;")
   )
   file
 )
 (write-line "}spacer;ok_cancel;}" file)
 (close file)
 (setq dcl_id (load_dialog tmp))
 (if (not (new_dialog "ListBox" dcl_id))
   (exit)
 )
 (start_list "lst")
 (mapcar 'add_list (mapcar 'cdr keylab))
 (end_list)
 (action_tile
   "accept"
   "(or (= (get_tile \"lst\") \"\")
   (if (= 2 flag) (progn
   (foreach n (str2lst (get_tile \"lst\") \" \")
   (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice)))
   (setq choice (reverse choice)))
   (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab)))))
   (done_dialog)"
 )
 (start_dialog)
 (unload_dialog dcl_id)
 (vl-file-delete tmp)
 choice
)

;; str2lst
;; Transforme un chaine avec séparateur en liste de chaines
;;
;; Arguments
;; str : la chaine à transformer en liste
;; sep : le séparateur
;;
;; Exemples
;; (str2lst "a b c" " ") -> ("a" "b" "c")
;; (str2lst "1,2,3" ",") -> ("1" "2" "3")
;; (mapcar 'read (str2lst "1,2,3" ",")) -> (1 2 3)

(defun str2lst (str sep / pos)
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
  (str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )
   (list str)
 )
) 

 

[Edité le 8/10/2008 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta réponse, c'est super sympa.

 

En fait, c'est vrais que je confond un peu les 2, et je m'en excuse.

C'est au niveau des styles de textes que ça coince sur mes fichiers.

 

Mais je vais tester tes lisp et je te dirai lequel est adéquate.

 

Merci.

A+.

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile),

 

Le premier marche bien.

Mais ne répond pas à mon problème car j'ai toujours cette maudite question au démarrage du fichier.

 

http://www.favoriscad.com/Photos/PrbAcad.jpg

 

Là, je répond annulé et le fichier s'ouvre.

 

Pour le 2ème lisp, je n'ai pas testé car j'ai un problème, AutoCAD me retourne :

 

; erreur: no function definition: VLA-GET-PREFERENCES

 

 

Merci.

A+.

Lien vers le commentaire
Partager sur d’autres sites

Merci Gile,

 

Après rajout d'une parenthèse manquante à la fin, le lisp fonctionne.

 

Mais je suis désolé, mais aucun des deux répond à mon problème.

Je sèches, je ne sais pas comment faire, et à quel niveau il faut attaquer le fichier.

 

J'ai toujours cette maudite question au démarrage.

 

http://www.favoriscad.com/Photos/PrbAcad.jpg

 

A+.

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Les formes sont employées, soit pour les polices propre à autocad mais aussi pour des type de lignes complexes.

 

Une forme est un peu assimilable à un bloc mais ne peut pas contenir d'attribut et n'est pas décomposable.

 

Si les routines fournies ne donnent rien pour les style de texte, je pense qu'il faut que tu regarde vers les types de ligne utilisés.

 

Voir si le type de ligne a été appliqué par calque ou par entités. Dans le dernier cas, tu peux utiliser FILTER ou QSELECT pour sélectionner l'ensemble des objets concernés et leur affecter un type de ligne autre.

 

Pour le premier cas tu passe simplement par le gestionnaire de calque pour affecter un autre type de ligne.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

J'ai corrigé le code (parenthèse manquante).

Pour ton problème (que je n'avais pas compris) est tu sûr d'avoir une police de remplacement définie (variable FONTALT). Je dis ça à tout hasard, je n'ai jamais été confronté à ce problème.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

bonjour,

 

Une petite recherche de dgnlstyle.shx et ses variantes avec google indique comme on peut s'y attendre, qu'il s’agit du fichier de définition des formes shx utilisé par microstation quand il produit du dwg.

 

La boite de dialogue "sélectionner le fichier formes" s'affiche quand il manque un fichier de forme pour les types de ligne. Quand une fonte est manquante et que la variable FONTALT n'est pas définie alors AutoCAD affiche une boite de dialogue différente proposant de sélectionner une fonte pour le style de texte en question.

Effectivement, le fait d'afficher le type de fichier "Polices de forme (*.shx)" induit les utilisateurs en erreur quant à l'origine de leur problème. La boite de dialogue proposée par AutoCAD est dans le principe similaire à celle de Gile, si ce n'est qu'AutoCAD vérifie que la fonte n'est pas disponible avant d'en proposer son remplacement. Gile, j'ai lu rapidement ton code, j'ai l'impression que c'est un remplacement global pour tous les styles, mes excuses si ce n'est pas le cas.

 

Pour remplacer les types de ligne posant des problèmes, on peut utiliser les outils de "norme CAO", ils sont accessibles à tous les utilisateurs, naturellement on peut aussi programmer une solution plus efficace.

 

 

Bruno Toniutti

 

 

[Edité le 21/10/2008 par Bruno_T]

Lien vers le commentaire
Partager sur d’autres sites

  • 2 ans après...

Et donc, quelqu'un a une solution ??

 

Une solution pour quoi ?

 

- le premier LISP (OneStyle) attribue le style de texte sélectionné à tous les objets textes et purge les autres styles

- le second LISP attribue la police (fonte) sélectionnées à tous les styles de texte

- s'il s'agit d'un problème de fichier SHX utilisé dans un type de ligne, on peut essayer rform

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité