Рано или поздно у опытного пользователя появляется необходимость расширить штатный функционал САПР своими скриптами и командами, автоматизирующими каждодневную рутину – мы регулярно получаем запросы на тему «как создать свое меню?», «как зарегистрировать свою команду?», «как прописать скрипт в среде nanoCAD?». В этой статье мы решили объединить типовые вопросы и подробно продемонстрировать на несложном примере как пользователь может настроить платформу nanoCAD под себя и сделать ее чуть более функциональной.
В качестве примера возьмем задачку по организации библиотеки .dwg-файлов — у каждого пользователя за время работы накапливается достаточно материалов, которые в последующей работе используются как типовые решения: элементы из старых чертежей, базы блоков и т.д. Мы рассмотрим один из возможных вариантов организации своей библиотеки блоков в среде nanoCAD, и параллельно покажем как зарегистрировать произвольную скрипт-функцию в меню и командной строке. По аналогии вы сможете написать более сложные скрипты и автоматизировать работу по другим направлениям (например, по расчетам, по графическим построениям, по связи с базой данных и т.п.)...
Данная статья ориентирована в первую очередь на продвинутых пользователей, системных администраторов и специалистов, не боящихся программирования – тех, кто сейчас хочет автоматизировать и упростить свою работу.
Графику блока мы вычертили в нулевых координатах, т.к. именно нулевая точка будет базовой (точкой вставки) будущего блока. Поэтому ваш блок лучше начинать вычерчивать с координат x = 0, у = 0. Если блок уже вычерчен, то просто размещаем его так, чтобы в координатах 0, 0 располагалась удобная с вашей точки зрения точка вставки. Смотрите на примере ниже (рис. 1): слева – расположение автомобиля в файле BlueCar.dwg, справа – блок после вставки с базовой точкой:
Также мы используем правило: один блок – один .dwg-файл. В этом случае мы сможем создать на каждый блок отдельную команду вставки.
Далее: все блоки собираем в папке MyBlocks, которую либо сохраняем локально на своем диске (например, мы будем использовать путь C:\MyBlocks\), либо размещаем папку в локальной сети. В последнем случае нашей библиотекой смогут воспользоваться и ваши коллеги (т.е. путь будет что-то типа \\MYSERVER\MyBlocks\).
Ок, теперь мы готовы оборачивать это все кодом…
Откуда мы это знаем? Это все описано в стандартном SDK (Software Developer Kit) к nanoCAD; приведенные в скрипте команды – это стандартные API-функции САПР, основанных на .dwg (см. рис.2). Скачать последнюю версию SDK можно на developer.nanocad.ru. Там же можно получить примеры скриптов, выполняющие другие интересные задачи в nanoCAD.
Теперь скрипту по вставке блока надо присвоить имя-команду (чтобы вызывать этот скрипт из командной строки nanoCAD). И сделать это надо для каждого блока: один блок – одна команда. Для этого упакуем наш скрипт в специальный xml, который зарегистрирует в nanoCAD две новые команды – BlueCar и GreenCar, которые вставляют «BlueCar.dwg» и «GreenCar.dwg», соответственно. Возможно, это не самое рациональное решение с точки зрения «правильности» оформления кода, но мы же сейчас не оптимизацией занимаемся, правда? В итоге получаем следующее:
Вроде данный скрипт также не требует пояснений – xml определяет имя команды, а исполняемый код мы помещаем в теги
В качестве примера возьмем задачку по организации библиотеки .dwg-файлов — у каждого пользователя за время работы накапливается достаточно материалов, которые в последующей работе используются как типовые решения: элементы из старых чертежей, базы блоков и т.д. Мы рассмотрим один из возможных вариантов организации своей библиотеки блоков в среде nanoCAD, и параллельно покажем как зарегистрировать произвольную скрипт-функцию в меню и командной строке. По аналогии вы сможете написать более сложные скрипты и автоматизировать работу по другим направлениям (например, по расчетам, по графическим построениям, по связи с базой данных и т.п.)...
Данная статья ориентирована в первую очередь на продвинутых пользователей, системных администраторов и специалистов, не боящихся программирования – тех, кто сейчас хочет автоматизировать и упростить свою работу.
Вступление: подготовка .dwg-файлов
Т.к. в нашем примере мы работаем с отдельными .dwg-файлами, давайте чуть-чуть проговорим как эти блоки лучше подготовить и где хранить. Понятно, что вы можете использовать свой набор блоков, а мы в качестве примера будем использовать два .dwg-файла: BlueCar.dwg и GreenCar.dwg (можно взять из наших файлов, которые мы приводим в конце статьи).Графику блока мы вычертили в нулевых координатах, т.к. именно нулевая точка будет базовой (точкой вставки) будущего блока. Поэтому ваш блок лучше начинать вычерчивать с координат x = 0, у = 0. Если блок уже вычерчен, то просто размещаем его так, чтобы в координатах 0, 0 располагалась удобная с вашей точки зрения точка вставки. Смотрите на примере ниже (рис. 1): слева – расположение автомобиля в файле BlueCar.dwg, справа – блок после вставки с базовой точкой:
Рис. 1. Вставляемые блоки – в идеале их вычертить в нулевых координатах, чтобы была понятна точка вставки блока.
Также мы используем правило: один блок – один .dwg-файл. В этом случае мы сможем создать на каждый блок отдельную команду вставки.
Далее: все блоки собираем в папке MyBlocks, которую либо сохраняем локально на своем диске (например, мы будем использовать путь C:\MyBlocks\), либо размещаем папку в локальной сети. В последнем случае нашей библиотекой смогут воспользоваться и ваши коллеги (т.е. путь будет что-то типа \\MYSERVER\MyBlocks\).
Ок, теперь мы готовы оборачивать это все кодом…
Создание команд для вставки блоков
Простейший скрипт для вставки блока, написанный на Visual Basic, представлен ниже – нам кажется, что текст скрипта не требует подробных разъяснений. Он просто размещает блок «BlueCar.dwg» в текущий чертеж в бездиалоговом режиме по координатам, указанным пользователем:Dim ms
Dim ut
Dim ptInsert
Set ms = ThisDrawing.ModelSpace REM доступ к пространству Модели текущего документа
Set ut = ThisDrawing.Utility REM доступ к командной строке текущего документа
ptInsert = ut.GetPoint("0,0,0", "Укажите точку вставки") REM запрос к пользователю координат точки вставки блока
ms.InsertBlock ptInsert," C:\MyBlocks\GreenCar.dwg",1,1,1,0 REM вставляем блок в пространство модели
Откуда мы это знаем? Это все описано в стандартном SDK (Software Developer Kit) к nanoCAD; приведенные в скрипте команды – это стандартные API-функции САПР, основанных на .dwg (см. рис.2). Скачать последнюю версию SDK можно на developer.nanocad.ru. Там же можно получить примеры скриптов, выполняющие другие интересные задачи в nanoCAD.
Рис. 2. Документация разработчика nanoCAD подробно описывает все необходимые функции для работы со средой nanoCAD посредством языков C++, .NET, Visual Basic Script, Java Script и LISP.
Теперь скрипту по вставке блока надо присвоить имя-команду (чтобы вызывать этот скрипт из командной строки nanoCAD). И сделать это надо для каждого блока: один блок – одна команда. Для этого упакуем наш скрипт в специальный xml, который зарегистрирует в nanoCAD две новые команды – BlueCar и GreenCar, которые вставляют «BlueCar.dwg» и «GreenCar.dwg», соответственно. Возможно, это не самое рациональное решение с точки зрения «правильности» оформления кода, но мы же сейчас не оптимизацией занимаемся, правда? В итоге получаем следующее:
<?xml version="1.0" encoding="utf-8"?>
<package>
<command name="BlueCar" weight="30" cmdtype="1">
<script lang="VBS"><![CDATA[
Dim ms
Dim ut
Dim ptInsert
Set ms = ThisDrawing.ModelSpace
Set ut = ThisDrawing.Utility
ptInsert = ut.GetPoint("0,0,0", "Укажите точку вставки")
ms.InsertBlock ptInsert,"C:\MyBlocks\BlueCar.dwg",1,1,1,0
]]></script>
</command>
<command name="GreenCar" weight="30" cmdtype="1">
<script lang="VBS"><![CDATA[
Dim ms
Dim ut
Dim ptInsert
Set ms = ThisDrawing.ModelSpace
Set ut = ThisDrawing.Utility
ptInsert = ut.GetPoint("0,0,0", "Укажите точку вставки")
ms.InsertBlock ptInsert,"C:\MyBlocks\GreenCar.dwg",1,1,1,0
]]></script>
</command>
</package>
Вроде данный скрипт также не требует пояснений – xml определяет имя команды, а исполняемый код мы помещаем в теги
. Сейчас мы не будем подробно расписывать другие параметры xml-файла – если вас интересуют подробности, то опять же обратитесь в SDK к платформе nanoCAD (см. Руководство разработчика nanoCAD ActiveX API, раздел «Регистрация скриптов в качестве команд»).
Сохраняем xml под именем «MyBlocks.nsf» и будем использовать его при загрузке nanoCAD. Обращаем ваше внимание, что кодировка сохраненного файла должна совпадать с описанием заголовка xml-файла. В нашем случае это «UTF-8» - не забудьте выставить эту кодировку при сохранении (см. рис.3):
Рис.3. При сохранении «MyBlocks.nsf» будьте внимательны с кодировками файла – это важно!
Добавление и регистрация команд в командной строке nanoCAD
В простейшем случае, для использования новых команд через командную строку, файл «MyBlocks.nsf» нужно подгрузить в среду nanoCAD через диалог «Загрузка\выгрузка приложений» из меню Сервис\Приложения\Загрузка приложений (рис.4). И понятно, что файл со скриптами также как и блоки может лежать в локальной сети в общей папке (например, в той же папке с блоками \\MYSERVER\MyBlocks\):
Рис.4. Загрузка своих команд в среду nanoCAD
Также рекомендуем файл «MyBlocks.nsf» положить в автозагрузку – скрипт будет автоматически загружаться при каждом старте программы. При этом если вы хотите прописать файл «MyBlocks.nsf» в автозагрузку на каждом рабочем месте пользователя автоматически, то вам нужно с помощью доменных политик инициировать реестр nanoCAD по пути: HKEY_CURRENT_USER\Software\Nanosoft\nanoCAD Plus\6.0\Profile\Appload\Startup.
А теперь давайте научимся создавать свои пункты меню, горячие клавиши, панели инструментов под наши команды вставки блоков и интегрируем библиотеку с интерфейсом nanoCAD более тесно. Эта интеграция сейчас описывается с помощью CFG-файла – обычного текстового файла, имеющего несколько специализированных разделов. Рассмотрим их…
Добавляем описания команды запуска скриптов BlueCar и GreenCar
Для того, чтобы наши команды «красиво» описывались в командной строке, строке состояния и всплывающих подсказках, добавим к ним более подробную информацию для nanoCAD:
[\configman\commands\BlueCar]
weight=i30 |cmdtype=i0
intername=sBlueCar
DispName=sВставка блока BlueCar
StatusText=sПример вставки блока BlueCar, основанной на VBS
[\configman\commands\GreenCar]
weight=i30 |cmdtype=i0
intername=sGreenCar
DispName=sВставка блока GreenCar
StatusText=sПример вставки блока GreenCar, основанной на VBS
где DispNamе – описание команды отображаемое в командной строке, а StatusText - всплывающий текст-подсказка при наведении курсора на иконку на панели инструментов (рис.5).
Рис. 5. Все команды, зарегистрированные в nanoCAD, можно «обернуть» дополнительной информацией.
Регистрация команд в меню Мои команды
Далее создадим выпадающее меню Мои команды, в котором зарегистрируем наши новые команды. Добавим в него подменю с именем Вставка блоков и наши команды BlueCar и GreenCar. Присвоим подпунктам имена - Вставка BlueCar и Вставка GreenCar соответственно:
[\menu\mycommands] |name=sМои команды
[\menu\mycommands\InsertBlock] |name=sВставка блоков
[\menu\mycommands\InsertBlock\BlueCar] |name=sВставка BlueCar |InterName=sBlueCar
[\menu\mycommands\InsertBlock\GreenCar] |name=sВставка GreenCar |intername=sGreenCar
Результат на рисунке 6:
Рис. 6. Добавляем команды в меню…
Отображение пользовательской панели инструментов
Отлично, мы добавили выпадающее меню с собственными командами! Давайте по аналогии с меню добавим ещё и панель инструментов:
[\toolbars\mycommands] |InitialVisible=f1 |name=sМои команды
[\toolbars\mycommands\BlueCar] |intername=sBlueCar
[\toolbars\mycommands\GreenCar] |intername=sGreenCar
[\toolbarspos\mycommands] |DockPosition=sTop |row=i1 |pos=i2
Здесь мы описали свою панель инструментов «Мои команды» с двумя кнопками, включили ее по умолчанию плюс указали, где по умолчанию эта панель будет отображаться в интерфейсе nanoCAD - вверху во втором ряду третьей.
Теперь добавим панель «Мои команды» в список панелей инструментов nanoCAD: в штатное место меню Вид\Панели и в контекстное меню:
[\menu\View\toolbars\My_toolbars] |Name=sМои панели
[\menu\View\toolbars\My_toolbars\ShowToolbar_mycommands] |Name=sМои команды |InterName=sShowToolbar_mycommands
[\ToolbarPopupMenu\My_toolbars] |Name=sМои панели
[\ToolbarPopupMenu\My_toolbars\ShowToolbar_mycommands] |Name=sМои команды |InterName=sShowToolbar_mycommands
Плюс нужная функция, которая включает\выключает новую панель инструментов - иначе скроем панель и открыть ее сможем только из диалога Интерфейс:
[\configman\commands\sShowToolbar_MyCommands]
weight=i10 |cmdtype=i0
intername=sShowToolbar_MyCommands
StatusText=sПоказать/скрыть панель Мои команды
ToolTipText=sПоказать/скрыть панель Мои команды
DispName=sПоказать/скрыть панель Мои команды
Теперь наша панель полностью прописалась в интерфейсе nanoCAD - для того что бы увидеть весь список Панелей инструментов нужно зайти в Настройки интерфейса. А для быстрого включения/отключения нашей новой панели можно зайди в контекстное меню - клик ПКМ на поле панелей инструментов (рис. 7).
Рис. 7. Управление панелью инструментов.
Добавление горячих клавиш
И на финал – для удобства и быстроты использования наших новых команд, добавим горячие клавиши. Для синего автомобиля - Ctrl+B, для зеленого - Ctrl+G:
[\Accelerators]
BlueCar=sCtrl+B
GreenCar=sCtrl+G
Результат на рисунке 8:
Рис. 8. …и назначаем горячие клавиши.
Завершаем работы с нашим CFG-файлом и сохраняем его под именем «userdata.сfg». Внимание: при сохранение файла нужно выбрать кодировку ANSI (рис.9)
Рис. 9. Сохранение «userdata.сfg» с кодировкой ANSI
Сброс настроек пользовательского интерфейса nanoCAD
Осталось совсем немного – переместить файл «userdata.cfg» в папку с установленным nanoCAD. Причем очень важно, чтобы файл с настройками интерфейса назывался именно «userdata.cfg»: дело в том, что все настройки стандартного интерфейса nanoCAD хранятся в файле «nCad.cfg» и в конце это файла происходит автоматическая подгрузка пользовательского файла настроек «userdata.cfg» - поэтому в простейшем случае для того, чтобы подгрузить настройки пользователя, достаточно просто положить соответствующий файл в папку к nanoCAD. Если же вы хотите использовать свои файлы, то не забудьте прописать их по аналогии в «nCad.cfg» - см. рис. 10.
Рис. 10. nanoCAD позволяет подгружать любое количество файлов настроек интерфейса – каждый под свою задачу.
Кстати, для саморазвития рекомендуем изучить файл «nCad.cfg» - в нем полностью описан интерфейс программы nanoCAD и там можно найти все приемы описания под свое приложение.
Напоследок нам надо один раз сбросить настройки интерфейса - nanoCAD заново подгрузить описание интерфейса из нашего файла и пропишет его в реестре Windows под текущего пользователя. Поэтому запускаем nanoCAD, заходим в Сервис > Настройка интерфейса > Интерфейс и нажимаем кнопку Сбросить всё (рис. 11) – при следующем запуске в среде nanoCAD появятся ваши пункты меню, панель инструментов и другие настройки.
Рис. 11. Для изменения интерфейса надо один раз сбросить настройки nanoCAD через диалог Настройка интерфейса.
Заключение
Поздравляем! Теперь вы можете наслаждаться новым возможностями в nanoCAD, избавляя себя от рутинной работы (рис. 12). Понятно, что сложность скриптов можно увеличивать, поручая им более серьезные задачи и таким образом существенно расширять возможности платформы nanoCAD, затачивая САПР под свои цели.
Рис. 12. Пример работающего приложения в среде nanoCAD со своими командами в меню, на панелях инструментов и командной строке.
Напоследок хотелось бы еще раз подчеркнуть, что это лишь один из способов пользовательской организации интерфейса nanoCAD, ориентированный на тех, кто желает заглянуть вглубь. В ближайшее время мы планируем включить в nanoCAD визуальный редактор, позволяющий работать с интерфейсом более дружелюбным по отношению к пользователю способом, совместимый как с .cfg-файлами, так и .cuix-файлами. Да и для организации библиотек будет более удобный инструмент аналогичный инструментальным палитрам AutoCAD. Но вариант приведенный в статье удобен тем, что позволяет не просто понять «как все устроено», но и выйди за границы штатных возможностей продукта. Плюс вы можете попробовать автоматизировать распространение настроек nanoCAD с вашими скриптами по рабочим местам пользователей с помощью (например) доменных политик – в статью мы включили несколько намеков на это.
В общем мы призываем почитать, проанализировать и самостоятельно поэкспериментировать с этими знаниями. Попытайтесь создать файлы «MyBlocks.nsf» и «userdata.cfg» по инструкциям из этой статьи либо скачайте уже готовые файлы примеров по этой ссылке, вложите их в папку с установленным nanoCAD, а затем подумайте как эти знания вы можете применить к своим задачам.
Дополнительно обращаем ваше внимание, что по аналогии вы можете добавить свои настройки в любое вертикальное приложение, построенное на базе nanoCAD. Т.е. если в диалог Загрузка\Выгрузка приложений добавить файл «MyBlocks.nsf», файл «userdata.cfg» положить в папку с установленным nanoCAD СПДС или Механика и один раз сбросить интерфейс, то ваши команды появятся и в приложениях!
Удачной автоматизации!
Сергей Спирин, mahbak
Денис Ожигин, dows
ЗАО Нанософт