Go to file
Nail Sagitov bad6d4f8ad Замены в параметрах не обязательны, в этом случае просто печать в pdf 2026-09-03 20:33:53 +05:00
templates Добавлена печать pdf 2026-08-18 14:34:30 +05:00
.gitignore Скрипт замены в doc 2026-08-27 11:53:29 +05:00
README.md Изменения json 2026-08-18 15:10:58 +05:00
doc_replace.py Замены в параметрах не обязательны, в этом случае просто печать в pdf 2026-09-03 20:33:53 +05:00
dxf_replace.json Изменения json 2026-08-18 15:10:58 +05:00
dxf_replace.py Изменения json 2026-08-18 15:10:58 +05:00

README.md

dxf_replace

Скрипт замены плейсхолдеров вида {{ ИМЯ }} (или экранированных \{\{ ИМЯ \}\}) в DXF-файлах с последующей печатью в PDF через AutoCAD.

Использование

python dxf_replace.py НАЗВАНИЕ_ГРУППЫ [НАЗВАНИЕ_ПОДГРУППЫ] [--config ПУТЬ]
  • Группа — обязательный аргумент.
  • Подгруппа — необязательный; без неё обрабатываются все подгруппы группы.
  • --config — путь к файлу настроек (по умолчанию dxf_replace.json рядом со скриптом).

Структура dxf_replace.json

{
  "groups": [
    {
      "name": "имя_группы",
      "source": "файл.dxf",
      "pdf_suffix": "",
      "pdf_format": "A3",
      "replacements": { "{{ ОБЩИЙ_1 }}": "значение" },
      "subgroups": [
        {
          "name": "имя_подгруппы",
          "output": "выходной_файл.dxf",
          "replacements": { "{{ СВОЙ_1 }}": "значение" }
        }
      ]
    }
  ]
}
  • Группа: name, source (исходный DXF в templates/), pdf_suffix, pdf_format, общие replacements, subgroups.
  • Подгруппа: name, output (выходной DXF в output/SRC/), свои replacements.

Логика замен

  • Группа — общие замены, применяются ко всем подгруппам.
  • Подгруппа — свои замены перекрывают и дополняют список группы:
    replacements = dict(group_replacements)
    replacements.update(subgroup_replacements)
    
  • Если плейсхолдер не найден ни в группе, ни в подгруппе — в подгруппу добавляется пустая замена "", файл JSON автосохраняется.

Печать в PDF (через AutoCAD COM)

  • Имя PDF: имя_выходного_DXF + pdf_suffix + _ + pdf_format + .pdf → output/PDF/.
  • Подключение: сначала GetActiveObject("AutoCAD.Application") (к уже запущенному), иначе Dispatch.
  • Открывает DXF только для чтения (Documents.Open(path, 1)).
  • Переключается на первый лист (Layout), если активна модель — иначе печатается модель, а не лист:
    doc.ActiveLayout = layouts.Item(i)  # первый Layout, не Model
    
    (метод Layout.Activate() в COM не поддерживается — только присваивание ActiveLayout).
  • Плоттер: RefreshPlotDeviceInfo().
  • Plot.PlotToFile(pdf_path) — печать в файл; перед печатью удаляется старый PDF.
  • Plot.QuietErrorMode = 1 — без диалоговых окон.
  • После печати документ закрывается без сохранения.

Ключевые детали реализации

  • PLACEHOLDER_RE — регулярка для плейсхолдеров с учётом экранирования скобок \.
  • canonical_key() — канонический ключ "{{ ИМЯ }}" (нормализует пробелы и скобки).
  • find_replacement() — поиск значения по каноническому ключу, устойчив к разным написаниям ключа в JSON.
  • escape_value() — экранирование значения, если плейсхолдер в исходнике был экранирован.
  • Чтение исходника: пробует utf-8 → cp1251 → latin-1; запись — в той же кодировке.
  • Консоль Windows переключается на UTF-8 для корректного вывода.
  • Если файл настроек не существует — создаётся шаблон {"groups": []}.

Зависимости

  • pywin32 (для COM-доступа к AutoCAD).
  • Установленный AutoCAD (проверено на AutoCAD 2024).