Расширение к nanoCAD для поддержки скриптов на IronPython 3.4.1 (доступ к NET API)
Настоящий исходный код является переработкой известного плагина к AutoCAD CadPythonShell
от Chuong Ho (https://github.com/chuongmep/CadPythonShell).
По сравнению с оригинальной версией:
- Удалены проекты, относящиеся к MgdDbg (обозреватель классов объектов). Эта функциональность будет распространяться в рамках иного решения от nanosoft;
- Удален проект инсталлятора (пока будет распространяться без оного);
- Все библиотеки изменены для поддержки nanoCAD 22 и старше и nanoCAD 23 и новее (2 разные конфигурации), так как до nanoCAD 23 библиотеки были на .NET Framework; позже -- на .NET6 (этим обусловлен и отказ от некоторых пакетов из оригинальной версии);
- Для возможности запуска скриптов на .NET6 (nc23+) введена дополнительная библиотека
CADCommands
(см. разделПроблемы работы на nanoCAD 23+ (.NET 6)
)
Из раздела Releases скачайте последнюю версию надстройки и распакуйте в любую папку. В зависимости от использования для nanoCAD 22 и старше - ваша версия будет Nc_22
, для 23 и новее -- Nc_23
.
Поставьте в автозагрузку nanoCAD файл nCADPythonShell.package
.
Из новой ленты в nanoCAD nCAD Python Shell
запустить команду Run NPS
Наиболее стабильно работает на 22 версии nanoCAD (до миграции на .NET6). Здесь любые ошибки будут отображаться в "верхней" форме окна и не приводить к фатальному вылету.
См. в папке \Script Examples\ironpython3.4\
Строки ниже необходимо добавлять в шапку каждого из скриптов. Если код предполагает обращение к классам вне упомянутых пространств имен, то их также необходимо будет указать через директивы import
.
import clr
#Import nanoCAD's libraries
clr.AddReference('hostmgd')
clr.AddReference('hostdbmgd')
#Import auxiliary library (look chapter below, exception for 23+ versions)
clr.AddReference('CADCommands')
#Import namespaces for nanoCAD and CADCommands
from Teigha.Runtime import *
from HostMgd.ApplicationServices import *
from HostMgd.EditorInput import *
from Teigha.DatabaseServices import *
from Teigha.Geometry import *
from CADCommands import *
Настоящие проблемы возможно будут решены, как автор надстройки адаптирует её для AutoCAD 2025 (где появился .NET8).
- Неверная интерпретация enum: например, частая конструкция
OpenMode.ForRead
и т.д. Может быть решена вводом вспомогательного класса, например, AuxiliaryCommands из CADCommands.То есть вводится следующее соответствие:
OpenMode.ForRead = AuxiliaryCommands.OpenModeRead
OpenMode.ForWrite = AuxiliaryCommands.OpenModeWrite
OpenMode.ForNotify = AuxiliaryCommands.OpenModeNotify
- Неверная интерпретация наследуемых классов: когда какой-либо метод в API ожидает "базовый" класс, а ему подается наследник. Например, популярная процедура AppendEntity (добавление созданного объекта в чертеж) ожидает тип
Entity
, а все объекты имеют свои классы: Circle, Polyline и т.д. Решение: пока отсутствует. Принудительная конфертация через библиотеку clr не работает:
centerPt = Point3d(0,0,0)
circle = Circle(centerPt, Vector3d.ZAxis, 2)
circle_as_entity = clr.Convert(circle, Entity)
btr.AppendEntity(circle_as_entity)
#Error: expected Entity, got Circle
- локализация на русский (включая инструкции) и воможность выбора языка локализации;
- решение проблемы работоспособности на NC23+;
- добавление примеров;
- добавление вспомогательных конструкций, позволяющих взаимодействовать с nanoCAD ActiveX API;
- добавление примеров и описание действий для других Python-пакетов;
- ...