К сожалению, информации о написании скриптов для Plant 3d очень мало. Основной учебник по созданию скриптов можно найти здесь.
Начинаем писать скрипты
Первое, что нужно знать - все нестандартные скрипты должны быть сохранены в папке "C:\AutoCAD Plant 3D 2013 Content\CPak Common\CustomScripts\". По-умолчанию папка CustomScripts не создается при установке, её требуется создать.
Пока не будем изобретать велосипед и возьмём пример из учебника. Создадим в папке CustomScripts текстовый файл TestScript.py и запишем в него следующее:
#----------------------------------------------------------------------------------------------------
#Раздел 1
from varmain.primitiv import *
from varmain.custom import *
#Раздел 2
@activate(Group="Valve", Ports="2", TooltipShort="Test script", TooltipLong="This is a custom Testscript", LengthUnit="mm")
@group("MainDimensions")
@param(DN1=LENGTH, TooltipLong="Length of the Cylinder")
@param(DN2=LENGTH, TooltipLong="Length of the Cylinder")
@param(D=LENGTH, TooltipShort="Cylinder Diameter", Ask4Dist=True)
@param(L=LENGTH, TooltipLong="Length of the Cylinder")
@param(OF=LENGTH0)
@group(Name="meaningless enum")
@param(K=ENUM)
@enum(1, "align X")
@enum(2, "align Y")
@enum(3, "align Z")
#Раздел 3
def TESTSCRIPT(s,DN1=30.0, DN2=50.0, D=80.0, L=150.0, OF=-1, K=1, **kw):
o1=CYLINDER(s, R=DN1/2, H=L, O=0.0).rotateY(90)
o2=CONE(s, R1=DN2/2, R2=0, H=L, E=0)
o1.uniteWith(o2)
o2.erase()
s.setPoint((0,0,0),(-1,0,0))
s.setPoint((L,0,0),(1,0,0))
#----------------------------------------------------------------------------------------------------
Весь этот код рисует цилиндр и конус, объединённые в единое тело, и назначает два порта. Текст программы состоит из трех разделов.
- Импорт требуемых библиотек
- Описание метаинформации для Plant 3d
- Непосредственно, рисовалка
Раздел 1
Здесь мне рассказать особо нечего. Библиотека varmain.primitiv служит, видимо, для отрисовки, а varmain.custom - для создания именно нестандартных элементов. Можно использовать и другие библиотеки, но мне пока хватило этих.
Раздел 2
Здесь уже интереснее. Дело в том, что программе Plant 3d требуется рассказать, какие переменные, требуемые функции рисования, следует хранить в базе данных, показывать пользователю и запрашивать у пользователя при заполнении каталога. Если в вашей функции у переменных есть значения по-умолчанию, вы, возможно, не заметите отсутствия переменной в интерфейсе программы. Разве что размеры отрисованных тел будут одинаковыми там, где используется эта переменная.
Строка @group("MainDimensions") обозначает начало списка параметров.
Строка
@param(DN1=LENGTH, TooltipLong="Length of the Cylinder") - это
параметр. В данном случае, параметр DN1 с подсказкой, которая будет
появляться в редакторе каталогов, "Length of the Cylinder".
Назначение группы параметров @group(Name="meaningless enum") мне пока непонятно. В инструкции говорится, что этот нумератор указывает вдоль какой оси чертить элемент. Может потом разберусь.Раздел 3
Ну и самое интересное - рисование. Вычерчивание модели элемента происходит с помощью примитивов, с которыми можно производить операции сложения, вычитания и пересечения.
Список примитивов (насколько я понял, полный):
- Отвод
- Переходный отвод
- Сегментный отвод
- Коробка (точнее, параллелепипед)
- Конус
- Цилиндр
- Эллиптическое днище
- Эллиптическое днище 2
- Эллипсоид вращения
- Полусфера
- Пирамида
- Тело перехода от прямоугольника к кругу
- Сегмент сферы
- Тор-сферическое днище
- Тор-сферическое днище 2
- Тор-сферическое днище H
- Тор
- Объединение (obj.uniteWith)
- Вычитание (obj.subtractFrom)
- Пересечение (obj.intersectWith)
- Удаление (obj.erase)
- Поворот вокруг оси X (obj.rotateX)
- Поворот вокруг оси Y (obj.rotateY)
- Поворот вокруг оси Z (obj.rotateZ)
- Перенос (obj.translate)
- Задать матрицу трансформации (obj.setTransformationMatrix)
- Задать порт (obj.setPoint)
Тестирование скриптов - немного теории
Итак, скрипт есть. Нужно его протестировать.
Для тестирования скриптов на Python в Plant 3d используется библиотека "PnP3dACPAdapter.arx". Для её загрузки можно использовать команду _appload в командной строке Autocad, использовать меню или ленту, или команду lisp:
(arxload "PnP3dACPAdapter.arx")
Только после загрузки этой библиотеки можно проводить тестирование скрипта. Для этого используется команда lisp TESTACPSCRIPT с параметрами или без них:
(TESTACPSCRIPT "TESTSCRIPT")
(TESTACPSCRIPT "TESTSCRIPT" "D1" "300.5")
(TESTACPSCRIPT "TESTSCRIPT" "L" "40" "D1" "300.5" "D2" "88.9")
В начале разработки у меня постоянно выходила ошибка в командной строке:
(TESTACPSCRIPT "TESTSCRIPT")
Traceback (most recent call last):
File ".\variants\varmain\__init__.py", line 94, in create
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
nil
Оказалось, что это единственная ошибка, которая выводится (может есть и ещё, но мне выходила только эта). Забыл переменную, не поставил запятую, ошибка ли логики или синтаксиса - ошибка всегда одна и та же. Без подробностей.
Plant 3d устроен таким образом, что раз загруженный скрипт остается в памяти до окончания сеанса.
Но, прежде чем вы приступили к тестированию, скрипт должен быть зарегистрирован. Это выполняется с помощью команды Plant 3d PLANTREGISTERCUSTOMSCRIPTS. При вызове этой команды происходит следущее:
- Файл скрипта компилируется и создается файл .pyc (в нашем случае TESTSCRIPT.pyc) в папке CustomScripts
- Метаданные о скрипте вносятся в файл ScriptGroup.xml. Если этот файл отсутствует - он создается. Этот файл содержит информацию о всех созданных нестандартных скриптах и к каким группам они относятся.
- Создается файл TestScript.xml в папке CustomScripts. Этот файл содержит метаданные о скрипте и используемых в нем переменных.
- Создается или обновляется файл variants.xml. Он содержит подсказки скрипта, используемых в нем параметров, значения нумераторов.
- Создается или обновляется файл variants.map. Содержит служебную информацию.
Тестирование скриптов - последовательность действий
Набив шишки на том, что скрипты не загружаются повторно, если автокад не закрывался, выработал для себя следующий алгоритм:
- Внести изменения в файл .py.
- Открыть Plant 3d
- Выполнить команду PLANTREGISTERCUSTOMSCRIPTS
- Закрыть Plant 3d
- Открыть Plant 3d
- Загрузить библиотеку для тестирования. (arxload "PnP3dACPAdapter.arx")
- Выполнить скрипт (TESTACPSCRIPT "TESTSCRIPT")
- Если скрипт требует доработки, повторить с пункта 1 (если вносить изменения в скрипт не закрывая Plant 3d, то шаг 2 можно исключить)
^C^C^P(arxload "PnP3dACPAdapter.arx")(TESTACPSCRIPT "TESTSCRIPT")
Это позволило объединить шаги 6 и 7 в один шаг.
Подготовка скриншотов
Для создания изображений тела или блок в Plant 3d служит команда PlantSnapShot. После её запуска следует указать, что нам нужен снимок детали, далее выбрать саму деталь, указать размер снимка и сохранить его в png с тем же именем, что и файл скрипта + окончание в зависимости от размера снимка. Например:
- TESTSCRIPT_32.png
- TESTSCRIPT_64.png
- TESTSCRIPT_200.png
- TESTSCRIPT_640.png
Заполнение каталога
Теперь, создав скрипт, протестировав его, создав все требуемые изображения, мы можем добавить новый элемент в каталог.
Я не создал снимки для детали TESTSCRIPT, поэтому она здесь без рисунка, но, тем не менее, её можно выбрать и внести для неё сведения. Далее работа с каталогами и миникаталогами происходит по обычным сценариям.
Спасибо за внимание. Буду рад комментариям, вопросам.
Спасибо! По-ходу, это - единственный на всю Россию пример использования данных скриптов хоть с какими-то пояснениями.
ОтветитьУдалить