понедельник, 24 июня 2013 г.

Адаптация Autocad Plant 3D: Создание нестандартных элементов. Скрипты Python

К сожалению, информации о написании скриптов для 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))
#----------------------------------------------------------------------------------------------------

Весь этот код рисует цилиндр и конус, объединённые в единое тело, и назначает два порта. Текст программы состоит из трех разделов.
  1. Импорт требуемых библиотек
  2. Описание метаинформации для Plant 3d
  3. Непосредственно, рисовалка
Подробнее о разделах.

Раздел 1


Здесь мне рассказать особо нечего. Библиотека  varmain.primitiv служит, видимо, для отрисовки, а varmain.custom - для создания именно нестандартных элементов. Можно использовать и другие библиотеки, но мне пока хватило этих.

Раздел 2


Здесь уже интереснее. Дело в том, что программе Plant 3d требуется рассказать, какие переменные, требуемые функции рисования, следует хранить в базе данных, показывать пользователю и запрашивать у пользователя при заполнении каталога. Если в вашей функции у переменных есть значения по-умолчанию, вы, возможно, не заметите отсутствия переменной в интерфейсе программы. Разве что размеры отрисованных тел будут одинаковыми там, где используется эта переменная.
Строка @activate говорит программе, что за элемент мы создаем.
Строка @group("MainDimensions") обозначает начало списка параметров.
Строка @param(DN1=LENGTH, TooltipLong="Length of the Cylinder") - это параметр. В данном случае, параметр DN1 с подсказкой, которая будет появляться в редакторе каталогов, "Length of the Cylinder".
Назначение группы параметров @group(Name="meaningless enum") мне пока непонятно. В инструкции говорится, что этот нумератор указывает вдоль какой оси чертить элемент. Может потом разберусь.

Раздел 3


Ну и самое интересное - рисование. Вычерчивание модели элемента происходит с помощью примитивов, с которыми можно производить операции сложения, вычитания и пересечения.
Список примитивов (насколько я понял, полный):
  1. Отвод
  2. Переходный отвод
  3. Сегментный отвод
  4. Коробка (точнее, параллелепипед)
  5. Конус
  6. Цилиндр
  7. Эллиптическое днище
  8. Эллиптическое днище 2
  9. Эллипсоид вращения
  10. Полусфера
  11. Пирамида
  12. Тело перехода от прямоугольника к кругу
  13. Сегмент сферы
  14. Тор-сферическое днище
  15. Тор-сферическое днище 2
  16. Тор-сферическое днище H
  17. Тор
Список операций над примитивами:
  1. Объединение (obj.uniteWith)
  2. Вычитание (obj.subtractFrom)
  3. Пересечение (obj.intersectWith)
  4. Удаление (obj.erase)
  5. Поворот вокруг оси X (obj.rotateX)
  6. Поворот вокруг оси Y (obj.rotateY)
  7. Поворот вокруг оси Z (obj.rotateZ)
  8. Перенос (obj.translate)
  9. Задать матрицу трансформации (obj.setTransformationMatrix)
  10. Задать порт (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. При вызове этой команды происходит следущее:
  1. Файл скрипта компилируется и создается файл .pyc (в нашем случае TESTSCRIPT.pyc) в папке CustomScripts
  2. Метаданные о скрипте вносятся в файл ScriptGroup.xml. Если этот файл отсутствует - он создается. Этот файл содержит информацию о всех созданных нестандартных скриптах и к каким группам они относятся.
  3. Создается файл TestScript.xml в папке CustomScripts. Этот файл содержит метаданные о скрипте и используемых в нем переменных.
  4. Создается или обновляется файл variants.xml. Он содержит подсказки скрипта, используемых в нем параметров, значения нумераторов.
  5. Создается или обновляется файл variants.map. Содержит служебную информацию.

 Тестирование скриптов - последовательность действий


Набив шишки на том, что скрипты не загружаются повторно, если автокад не закрывался, выработал для себя следующий алгоритм:
  1. Внести изменения в файл .py.
  2. Открыть Plant 3d
  3. Выполнить команду PLANTREGISTERCUSTOMSCRIPTS
  4. Закрыть Plant 3d
  5. Открыть Plant 3d
  6. Загрузить библиотеку для тестирования.  (arxload "PnP3dACPAdapter.arx")
  7. Выполнить скрипт (TESTACPSCRIPT "TESTSCRIPT")
  8. Если скрипт требует доработки, повторить с пункта 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
В учебнике об этом ни слова, но если вы хотите создать эскиз для своей детали, чтобы он отображался в редакторе каталогов на странице с типоразмерами, следует его сохранить в размере 640px. Соответственно, название файла будет выглядеть так:

  • TESTSCRIPT_640.png

Заполнение каталога 


Теперь, создав скрипт, протестировав его, создав все требуемые изображения, мы можем добавить новый элемент в каталог.
 Я не создал снимки для детали TESTSCRIPT, поэтому она здесь без рисунка, но, тем не менее, её можно выбрать и внести для неё сведения. Далее работа с каталогами и миникаталогами происходит по обычным сценариям.

Спасибо за внимание. Буду рад комментариям, вопросам.

четверг, 20 июня 2013 г.

Адаптация Autocad Plant 3D: Создание нестандартных элементов. СППК

Мой предыдущий пост был об основных возможностях редактора спецификаций. Я постарался осветить те моменты, о которые спотыкался неоднократно, вырабатывая свою методику работы. Но, работая со стандартными элементами, не давал мне покоя вопрос: можно ли создавать нестандартные? Как оказалось, этим вопросом задавался не только я. +Александр Щетинин предложил попробовать добавить СППК в базу оборудования.

Итак. Представим ситуацию: в Plant 3d необходимо создать базу, содержащую предохранительные клапаны Благовещенского Арматурного завода. 

На мой взгляд, блок предохранительных клапанов не является оборудованием. Да и не встретил я в Plant 3d базы оборудования. Потому добавлять элементы будем в каталог.
Реализовать эту задачу можно двумя путями: используя разработанные в Autocad модели и используя программирование.
 

Путь Первый 


В стандартных обучающих роликах и материалах рассказывается, как можно создать элемент каталога из трехмерной модели, выполненной в Autocad. У этого подхода есть очевидные плюсы - добавить в каталог новый элемент может любой, кто умеет хоть сколько-нибудь работать с редактором каталогов и Autocad. Минусы тоже есть - процесс получается очень трудоёмкий.

Мне не удалось хоть сколь-нибудь продвинуться в процессе создания параметрических моделей и использования их совместно с редактором спецификаций. В стандартном варианте со статическими моделями набор работ выглядит так:
  1. Создать модель элемента
  2. Преобразовать элемент в блок
  3. Назначить в Plant 3d порты
  4. Добавить блок в редакторе спецификаций в новый каталог и назначить ему атрибутивную информацию
  5. Добавить элемент из каталога в миникаталог
  6. Можно тестировать и вставлять в модели новый элемент
Требуется также учесть, что каждый элемент обладает уникальным набором параметров, и с каждым должна быть проведена работа по указанному списку. Не думаю, что большим преувеличением будет сказать, что подобная работа может отнимать от 1 до 4 часов на элемент, в зависимости от опыта исполнителя. 

Путь Второй


Оказывается Plant 3d всё же обладает расширяемостью большей, чем об этом говорится в продающих буклетах. 

Дело в том, что все "рисовалки" в Plant 3d выполнены скриптами на языке Python.
Последовательность работ в этом случае такова:
  1. Создание скрипта для рисования модели элемента.
  2. Регистрация скрипта в Plant 3d. При этом создается ряд вспомогательных файлов.
  3. Наполнение каталога.
  4. Добавление элемента из каталога в миникаталог
  5. Использование в модели
Информации по этой теме мне удалось найти крайне мало. С этим языком сталкиваюсь впервые. Но кое-чего добиться удалось.

На рисунке представлен результат вставки элемента  БПУ 50-40 из миникаталога.
 

На панели инструментов появляется новый элемент.

В редакторе каталогов можно добавлять новый элемент - Блок предохранительных клапанов.

В каталоге можно редактировать свойства элементов и портов.


Что с трудозатратами?  На разработку скрипта мне потребовалось 4 дня. Но, нужно иметь в виду, что модель не тривиальна, язык не знаком, информации мало. Думаю, сейчас подобная задача заняла бы 1-2 дня.

О том, как писать скрипты и использовать их в Plant3d расскажу в следующий раз.

четверг, 13 июня 2013 г.

Адаптация Autocad Plant 3D: заметки о Spec Editor

Чтобы не искать, выкладываю ссылку на обучающие ролики по Plant 3d.

Итак, попробуем создать новый компонент, например, задвижку.
Просмотрев видео, мы знаем, что можно создавать новые компоненты трубопроводов и задвижки из блоков. Попробуем создать стандартную задвижку.
Первое, с чем сталкиваемся, это УЖАСНО НЕ ДОРАБОТАННЫЙ ИНТЕРФЕЙС. Это и качество перевода (в справке приведён такой же скриншот, но названия классов переведены в тексте. Зачем, спрашивается? Для дополнительной путаницы?)
С проблемами в интерфейсе сталкиваемся на протяжении всей работы с Plant 3d. Но работать-то надо. Продолжим.
Выбираем категорию компонента - Valves (Задвижки). Далее следует указать свойство Piping Component, но что это за свойство такое? Смотрим в справке:
Компонент трубопровода
Указывает класс Plant 3D из списка. AutoCAD Plant 3D не поддерживает добавление классов в список.
Примечание Тип КорпусКлапана поддерживает подстановку исполнительного механизма.
И всё. Без подробностей. Какой вывод можно сделать? Класс Valve (Клапан) можно использовать для элементов без привода, а ValveBody (КорпусКлапана) для элементов, для которых впоследствии будут приводы.
Чтобы не путаться, мы всегда будем выбирать ValveBody.
Реляционная модель базы данных каталога настроена таким образом, что в создаваемом элементе должен быть хотя бы один размер. Поэтому выбор из списков размеров обязателен. Свойства Primary End Type и Short Description можно будет заполнить в окне редактирования элемента.

Нажимаем Создать. Ну, то есть Create.

И снова пару слов про интерфейс. Если вы твёрдо решили работать с Plant 3d - у вас должен быть широкоформатный монитор, чем больше - тем лучше. Ещё лучше, если их два.
Наш компонент уже отображается в нижней части окна - Обозревателе каталогов. Значит он уже в каталоге? ЕЩЁ НЕТ. Для того, что бы компонент сохранился в каталоге следует нажать кнопку "Сохранить в каталоге". Но при попытке сохранения у нас возникнет ошибка - мы ведь заполнили не все поля.
Начинаем заполнять:
 Вкладка Основные свойства
Область Свойства компонента трубопровода
Полное описание (семейство): Задвижка клиновая ЗКЛП2 PN=1,6МПа
Изготовитель: Благовещенский Арматурный Завод
Материал: Сталь 20
Краткое описание: Задвижка клиновая

Область Параметры подключения порта
 Прежде всего, если у вашего элемента порты подключения одинаковы, установите флаг Все порты обладают одинаковыми свойствами. Это позволит внести данные в области только один раз для всех портов одновременно. К сожалению, это флаг сбрасывается после сохранения элемента в базу данных, и его, для внесения изменений в этой области может потребоваться установить заново.
Единицы: Мм
Тип соединения: FL - фланцевое
Обработка: FL1 - первое исполнение
Класс давления: 1.6
Что ещё требуется знать для правильного заполнения? Свойство Класс давления представляет собой не число с плавающей точкой, как можно было бы предположить (ведь это вроде логично), а строку. Как следствие, нет проверки на корректность введенных данных. К чему это может привести? В Plant 3d вы вставляете задвижку на трубу, а вместо фланцев соответствующего исполнения система вставляет местозаполнители из миникаталога Placeholder. То есть система не может понять какие фланцы стоит применять с вашей задвижкой. Вывод: проверяйте, чтобы ваш класс давления совпадал с классом давления фланцев. "4" не равно "4,0" или "4.0".

Вкладка Размеры
Мы заполнили все необходимые свойства семейства для работы системы Plant 3d с нашим компонентом. Теперь переходим на вкладку Размеры и заносим информацию для каждого типоразмера.
Область Список размеров
Область Размеры отображает список типоразмеров. К сожалению, не предусмотрены никакие сортировки или групповые операции. Есть только три неудобно расположенные кнопки добавления, удаления и дублирования типоразмера.

Область Параметры подключения порта
Как и на вкладке Основные свойства, здесь имеется флаг Все порты обладают одинаковыми свойствами, значение которого, как и на вкладке Основные свойства, сбрасывается при сохранении элемента в каталог. Помните, если этот флаг не установлен, вводя данные в этой области вы редактируете только один порт. Для редактирования других портов следует воспользоваться одной из двух стрелок в верхнем правом углу области.
Основные свойства, требуемые для вставки элемента в модель являются:
Номинальный диаметр: 50
Наружный диаметр: 57

Область Свойства компонента трубопровода
Здесь требуется заполнить:
Полное описание (Размер): Задвижка клиновая ЗКЛП2 PN=1,6МПа DN=50
Вес: 15
Свойство Вес, в отличии от Класса давления, является числом с плавающей точкой, то есть выполняется проверка на корректность.

Область Размеры
Здесь следует заполнять свойства в соответствии с эскизом. Причем, если парные свойства равны, не обязательно вносить оба значения. Достаточно указать первое, а второе приравнять нулю. Например, если D1 = 57, а D2 = 0, Plant 3d вычертит задвижку у которой оба фланцевых соединения по 57 мм. Если у вас центр задвижки не смещён, не обязательно указывать  LS.
 Итак, все самые необходимые свойства введены, нажимаем Сохранить в каталоге.

Теперь задвижка будет корректно вставлять в Plant 3d. Конечно, для этого следует её добавить в миникаталог.
Но, задвижка еще не имеет привода. Об этом в следующий раз.