Tagazin Posté(e) le 4 octobre 2008 Posté(e) le 4 octobre 2008 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.
(gile) Posté(e) le 5 octobre 2008 Posté(e) le 5 octobre 2008 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
Tagazin Posté(e) le 5 octobre 2008 Auteur Posté(e) le 5 octobre 2008 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.
(gile) Posté(e) le 6 octobre 2008 Posté(e) le 6 octobre 2008 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
Tagazin Posté(e) le 8 octobre 2008 Auteur Posté(e) le 8 octobre 2008 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+.
Tagazin Posté(e) le 8 octobre 2008 Auteur Posté(e) le 8 octobre 2008 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+.
lili2006 Posté(e) le 8 octobre 2008 Posté(e) le 8 octobre 2008 Bonjour à toutes et tous, Un oubli "classqiue", peut-être ? A mettre en début de lisp, par exemple => (vl-load-com), Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
Tagazin Posté(e) le 8 octobre 2008 Auteur Posté(e) le 8 octobre 2008 Merci Lili2006. J'ai encore un message d'erreur : ; erreur: type d'argument incorrect: VLA-OBJECT nil Merci encore pour votre aide.
lili2006 Posté(e) le 8 octobre 2008 Posté(e) le 8 octobre 2008 Re, Ton lisp est bien reconnu par un dossier support de AutoCAD je suppose ? Sinon, il y a peut-être une erreur dans le lisp,... Attendons alors la réponse de (gile) Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 8 octobre 2008 Posté(e) le 8 octobre 2008 Toutes mes excuses, j'avais encore oublié, outre le vl-load-com (bien vu lili2006 !), de définir certaines variables globales (automatiquement définies à chaque démarrage chez moi). Le code est corrigé. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tagazin Posté(e) le 8 octobre 2008 Auteur Posté(e) le 8 octobre 2008 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+.
Tagazin Posté(e) le 8 octobre 2008 Auteur Posté(e) le 8 octobre 2008 c'est quoi une police de forme ?
bonuscad Posté(e) le 8 octobre 2008 Posté(e) le 8 octobre 2008 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
(gile) Posté(e) le 8 octobre 2008 Posté(e) le 8 octobre 2008 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
Bruno_T Posté(e) le 21 octobre 2008 Posté(e) le 21 octobre 2008 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]
(gile) Posté(e) le 7 janvier 2011 Posté(e) le 7 janvier 2011 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant