Тема: Как сделать автоматическую замену одного шрифта другим?

Решил поменять шрифты, старые снёс, теперь проблема в старых чертежах всё, что набрано старыми шрифтами, в том числе и атрибуты в блоках, не отображаются.
При попытке изменения шрифта для конкретного стиля слетает выравнивание текста.
Как сделать, чтобы при открытии чертежа происходила автозамена дного шрифта на другой с сохранением выравнивания.

Re: Как сделать автоматическую замену одного шрифта другим?

Похоже, что по поводу выравнивания - это глюк.
При изменении шрифта в стиле всё нормально.
Как сделать, чтобы при открытии чертежа происходила автозамена одного шрифта на другой?

Re: Как сделать автоматическую замену одного шрифта другим?

Для лиспа:

;|=======================================================================================
*    Функция создает текстовый стиль. Создание идет через (entmake).
*    Созданный стиль делается активным
*    Параметры вызова:
*   нет
*    Примеры вызова:
(_kpblc-create-textstyle)
=======================================================================================|;
(defun _kpblc-create-textstyle (/ ent_list font_filename exist_style)
  (if (findfile "spds.shx")
    (setq font_filename (strcat (vl-filename-base (findfile "spds.shx")) ".shx"))
    (setq font_filename (strcat (vl-filename-base (findfile "simplex.shx")) ".shx"))
    ) ;_ end of if
  (setq   ent_list
    (list
      '(0 . "STYLE")
      '(100 . "AcDbSymbolTableRecord")
      '(100 . "AcDbTextStyleTableRecord")
      '(2 . "SPDS")      ; text style name
      '(70 . 0)         ;
      '(40 . 0.0)         ; text height
      '(41 . 0.8)         ; width factor
      '(50 . 0.0)         ; oblique angle
      '(71 . 0)         ; not backwatf, not upside down
      '(42 . 2.5)         ; last height used
      (cons 3 font_filename)   ; primary font file name
      '(4 . "")         ; big font file name
      ) ;_ end of list
   ) ;_ end of setq
               ;(entmake ent_list)
  (if (setq exist_style (tblobjname "style" "SPDS"))
    ;; Стиль есть, возвращаем стандартный вид
    (foreach item ent_list
      (_kpblc-ent-modify exist_style (car item) (cdr item))
      ) ;_ end of foreach
    ;; Стиля нет, делаем его и нормализуем все примитивы
    (entmake ent_list)
    ) ;_ end of if
  (setvar "textstyle" "SPDS")
               ;(princ)
  ) ;_ end of defun

Тут в принципе все понятно. Если что - пиши.

Re: Как сделать автоматическую замену одного шрифта другим?

Упс, забыл одну функцию:

;|=======================================================================================
*    Функция модификации указанного бита примитива
*    Параметры вызова:
*   entity   - примитив, полученный через (entsel), (entlast) etc
*   bit   - dxf-код, значение которого надо установить
*   value   - новое значение
*    Примеры вызова:
(_kpblc-ent-modify (entlast) 8 "0")   ; перенести последний примитив на слой 0
(_kpblc-ent-modify (entsel) 62 10)   ; установить выбранному примитиву цвет 10
*    Возвращаемое значение:
*   примитив с модифицированным dxf-списком. Примитив автоматически перерисовывается.
=======================================================================================|;
(defun _kpblc-ent-modify (ent bit value / ent_list old_dxf new_dxf)
  (if (not
   (and
     (or
       (= (cdr (assoc 0 (entget ent))) "STYLE")
       (= (cdr (assoc 0 (entget ent))) "DIMSTYLE")
       ) ;_ end of or
     (= bit 100)
     ) ;_ end of and
   ) ;_ end of not
    (progn
      (setq ent_list (entget ent)
       new_dxf  (cons bit
            (if (and (= bit 62) (= (type value) 'str))
              (if (= (strcase value) "BYLAYER")
                256
                0
                ) ;_ end of if
              value
              ) ;_ end of if
            ) ;_ end of cons
       ) ;_ end of setq
      (if (not (equal new_dxf (setq old_dxf (assoc bit ent_list))))
   (progn (entmod (if old_dxf
          (subst new_dxf old_dxf ent_list)
          (append ent_list (list new_dxf))
          ) ;_ end of if
             ) ;_ end of entmod
          (entupd ent)
          (redraw ent)
          ) ;_ end of progn
   ) ;_ end of if
      ) ;_ end of progn
    ) ;_ end of if
  ent
  ) ;_ end of defun

Re: Как сделать автоматическую замену одного шрифта другим?

Лиспик попробую познее.
Может есть вариант в каком-нибудь *.ini прописать, допустим, шрифт 1 заменять на шрифт 2 и AutoCAD сам при отсутствии шрифта 1 заменяет его шрифтом 2?

Re: Как сделать автоматическую замену одного шрифта другим?

Ну такого не знаю. Дело в том, что лично мне удобнее, используя эти два лиспа, сделать нечто типа такого:

(defun kpblc-normalize-text (/ selset item)
  (_kpblc-create-textstyle)
  (setq    selset "_X"
    '((-4 . "<OR") (0 . "TEXT") (0 . "MTEXT") (-4 . "OR>"))
    ) ;_ end of setq
  (while (and
       selset
       (> (sslength selset) 0)
       ) ;_ end of and
    (setq item (ssname selset 0))
    (ssdel item selset)
      (vlax-put-property (vlax-ename->vla-object item) "stylename" "spds")
    ) ;_ end of while
  ) ;_ end of defun

Хотя это не обработает размеры. Для размеров песенка немного иная.

Re: Как сделать автоматическую замену одного шрифта другим?

> Nino
Системная переменная FONTALT позволет заменить все ненайденные шрифты на заданный в этой переменной. Может это поможет? Правда с выравниванием могут быть проблемы.

Re: Как сделать автоматическую замену одного шрифта другим?

А еще есть системная переменная FONTMAP, которая указывает на файл в котором можно делать подмену шрифтов (посмотри в Help'е как это делается).

Re: Как сделать автоматическую замену одного шрифта другим?

Всем привет!
Подскажите! Каким образом автоматизировать замену шрифта (гарнитуры) во всех размерных стилях?
Спасибо.

(изменено: SteelNut, 2 июня 2010г. 11:37:26)

Re: Как сделать автоматическую замену одного шрифта другим?

Доброго времени суток! Насчет FONTALT и FONTMAP как-то они странно работают... Внешне шрифт изменяется, в командной строке пишет что и на что меняет, но в формат->текстовый->  шрифт тот же, кроме того при выводе на печать шрифт не изменяется вообще.

А насчет вышеприведенных листингов функций - при попытке запуска пишет функция неопределена, сразу говорю я в лиспе полный ноль, может чего не так сделал: код засунул в редактор лиспа, сохранил, добавил в автозагрузку автокада.

Кстати, если кто-нибудь является счастливым обладателем шрифта gost_energo.shx поделитесь, пожалуйста и тогда мои мучения с автоподстановкой закончатся =-)