|
|
||
|---|---|---|
| templates | ||
| .gitignore | ||
| README.md | ||
| doc_replace.py | ||
| dxf_replace.json | ||
| dxf_replace.py | ||
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, не ModelLayout.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).