Программирование в nanoCAD: как зарегистрировать свою команду в среде nanoCAD?
Год назад в статье, посвященной использованию скриптов в среде nanoCAD на примере перевода LISPпрограммы на Visual Basiс Script1, я достаточно подробно рассказал, как организовывать взаимодействие с пользователем, создавать новые объекты, раскладывать их по слоям и вызывать скрипт на исполнение в среде nanoCAD. Надеюсь, вы воспользовались этой замечательной возможностью простейшей автоматизации.
Данная статья продолжает цикл публикаций, связанных с программированием в среде nanoCAD. В частности, пришло время узнать, как вашему скрипту назначить команду и включить ее в интерфейс nanoCAD (пункт меню, кнопка на панели инструментов и сочетания клавиш). Добро пожаловать в мир безграничного программирования под nanoCAD!
Инициализация
Чтобы практически выполнить поставленные задачи, необходимо предварительно предпринять следующие действия:
- установить систему автоматизированного проектирования nanoCAD;
- загрузить любой текстовый редактор для написания скриптов (я использую Notepad++, но вполне можно ограничиться и обычным Блокнотом Windows).
Конечно, вы вправе задать резонный вопрос: «Зачем? Ведь можно всё изучить и теоретически!» Однако согласитесь: осваивать новые знания на практике не только продуктивнее, но и гораздо интереснее. Поэтому — поехали…
Собственно интеграция скриптов в среде nanoCAD состоит из трех шагов: регистрация новых команд, загрузка их в среду nanoCAD и привязка к элементам интерфейса. Последний шаг необязателен: вы можете вызывать свои команды непосредственно с командной строки. Рассмотрим каждый шаг подробнее.
Шаг 1. Регистрация команды в nanoCAD
Регистрация новой команды в nanoCAD осуществляется посредством специализированного nsfфайла, который, по сути, является xmlфайлом. Его структура хорошо разъяснена в разделе «Регистрация скриптов в качестве команд» справочного руководства по ActiveX API. Если кратко, то команда описывается в файле в рамках тегов <command></command> и имеет четыре атрибута: «name», «weight», «cmdtype» и «capsdisable». Если с «name» и «weight», надеюсь, всё понятно («name» — это собственно имя нашей команды, которое мы будем набирать в командной строке, а «weight» — вес команды, параметр опциональный, по умолчанию равный 30), то о двух других следует рассказать подробнее.
Атрибут «cmdtype» определяет область действия скрипта и может иметь два значения:
- 0 — скрипт приложения: из скрипта есть доступ к глобальному имени ThisApplication;
- 1 — скрипт документа: из скрипта есть доступ только к глобальному имени ThisDrawing.
Атрибут «capsdisable» управляет выбором объектов при запуске скрипта:
- 0 — сохранить селекцию (PickfirstSelectionSet) перед началом команды;
- 1 — сохранить селекцию после исполнения команды.
Понятно, что имя команды должно быть уникальным — по неосторожности можно переопределить базовые команды платформы. Например, конструкция:
<command name=»save» weight=»30» cmdtype=»1» capsdisable=»0»>
…
</command>
переопределит команду сохранения документа.
В одном nsfфайле можно определять несколько команд. И все это структурируется следующим образом:
<?xml version=»1.0» encoding=»utf8»?>
<package>
<command name=»cmd1» weight=»30» cmdtype=»1» capsdisable=»0»>
…
</command>
<command name=»cmd2» weight=»30» cmdtype=»1» capsdisable=»0»>
…
</command>
<command name=»cmd3» weight=»30» cmdtype=»1» capsdisable=»0»>
…
</command>
…
</package>
Здесь, как вы уже, наверное, поняли, определяются три команды: cmd1, cmd2 и cmd3.
В рамках тегов <command></command> можно располагать еще два тега: <description></description> и <script></script>. Опять же с первым, надеюсь, всё понятно — это описание команды. Тег <script></script> определяет язык, на котором написан скрипт: либо VBScript, либо JScript. Например, вот так:
<command name=»mycommand» weight=»30» cmdtype=»1» capsdisable=»0»>
<description></description>
<script lang=»JScript»><![CDATA[
…здесь расположен код скрипта…
]]></script>
</command>
Обратите внимание на конструкцию <![CDATA[]]>: именно в ней прописывается код скрипта.
Теперь, вооружившись этими знаниями, вы без проблем сможете составить свой первый nsfфайл, превращающий ваш скрипт в команду и регистрирующий его в среде nanoCAD:
<?xml version=»1.0» encoding=»utf8»?>
<package>
<command name=»hello» weight=»30» cmdtype=»1» capsdisable=»0»>
<description>Классическая программа «Привет, мир!»</description>
<script lang=»JScript»><![CDATA[
ThisDrawing.Utility.Prompt(«Привет, мир!»)
]]></script>
</command>
</package>
Описанная здесь команда hello выводит в командную строку классическое приветствие. Сохраним этот xmlфайл с именем userdata.nsf. Первый шаг мы сделали.
Шаг 2. Загрузка файла команд при запуске nanoCAD
nsfфайл загружается в среду nanoCAD одноименной командой — nsf. Введите ее в командной строке запущенного nanoCAD, укажите путь до сформированного на предыдущем шаге файла userdata.nsf — и можно запускать описанные в нем команды, например, созданную на предыдущем шаге команду hello (рис. 1).
Конечно, проделывать подобные шаги каждый раз, когда нам нужна своя команда, — удовольствие ниже среднего. Автоматизируем…
Рис. 1. Простейшая команда hello и наш первый результат
Создание команды загрузки nsfфайла
Сначала нужно создать свою команду, которая запускает заданный нами nsfфайл (то есть запускает команду nsf с параметрами). Для этого создаем текстовый файл userdata.cfg (который понадобится нам в дальнейшем) и описываем в нем команду load_userdata_nsf:
[\configman\commands\sload_userdata_nsf]
weight=i30 |cmdtype=i0 | intername=sload_userdata_nsf
RealCommandName=snsf
Keyword=suserdata.nsf^MCloseDocument^MNewDocument^M
Этим шагом мы создали свой файл конфигураций, где описали новую команду с внутренним именем load_userdata_nsf, которая вызывает команду nsf (RealCommandName=snsf) с опциями, описанными в строке Keyword. Обратите внимание на символ s, который идет после знака «равно» (=), — это обязательный символ, необходимый интерпретатору nanoCAD для работы с cfgфайлом.
Все возможности команд я описывать не буду, иначе статья превратится в книгу (интересующиеся могут самостоятельно изучить файл конфигураций для nanoCAD — nCad.cfg), но наиболее интересные и часто используемые опции мы всё же рассмотрим.
Например, обратите внимание на следующую конструкцию:
Keyword=suserdata.nsf^MCloseDocument^MNewDocument^M
Она означает, что после вызова команды (в данном случае — nsf) в командную строку подается следующая команда — userdata.nsf + ENTER (то есть загружается файл userdata.nsf), затем — CloseDocument + ENTER (закрывается текущий документ) и, наконец, — NewDocument + ENTER (создается новый документ). Думаю, вы уже догадались, что символы «^M» означают ENTER.
Автоматическая загрузка nsfфайла
Теперь нам требуется при запуске nanoCAD автоматически загружать команду load_userdata_nsf. Тут всё просто: создаем текстовый файл userdata.ini со следующими строками:
; Регистрация файла с командами при запуске nanoCAD
[\DefProf\Startup\load_userdata_nsf]
Шаг 2 завершен, нам остается положить в папку, в которую установлен nanoCAD, три созданных нами файла — userdata.nsf, userdata.ini и userdata.cfg — и запустить программу. Теперь, если вы всё сделали правильно, при запуске в среду nanoCAD будет подгружаться файл userdata.nsf, а вслед за этим — регистрироваться новая команда hello. Если в nsfфайле при запуске будет прописано больше команд, то все они будут доступны из командной строки.
Шаг 3. Интеграция скрипткоманд с интерфейсом nanoCAD
За интеграцию команд с интерфейсом nanoCAD отвечает уже знакомый нам файл userdata.cfg. Он имеет определенную структуру описания — фактически все элементы интерфейса nanoCAD прописаны в файлах с таким расширением. Боюсь, что в рамках журнальной публикации я не смогу раскрыть все многочисленные варианты и опции этого файла, но минимально необходимый набор их мы всетаки рассмотрим (отметим, что все команды надо прописывать в файле userdata.cfg).
Регистрация меню в nanoCAD
Регистрация меню в nanoCAD осуществляется следующим способом:
[\menu\mycommans] |name=sМои команды
[\menu\mycommans\hello] |name=sНовая команда HELLO |intername=shello
После этого в nanoCAD появится новый пункт меню Мои команды с одним элементом — Новая команда hello, вызывающим команду hello. Добавляя новые строки, вы будете расширять свой пункт меню другими командами.
Регистрация панели инструментов в nanoCAD
Регистрация панели инструментов в nanoCAD осуществляется следующим способом:
[\toolbars\mycommans] |InitialVisible=f1 |name=sМои команды
[\toolbars\mycommans\hello] |intername=shello
После этого появится новая панель инструментов Мои команды с одной новой командой — hello. Опция InitialVisible отвечает за видимость панели при запуске (f1 — видима, f0 — невидима).
Присвоение команде специализированной иконки
Чтобы у команды появилась своя иконка, вам надо еще раз переопределить команду, указав dll с ресурсами изображения. В частности, вы можете использовать файл newbtns.dll, устанавливаемый вместе с nanoCAD (просмотрите зарегистрированные в dll файлы изображений с помощью любого ресурсменеджера):
[\configman\commands\hello]
weight=i30 |cmdtype=i0 |CapsDisable = W0xFF
intername=shello
BitmapDll=snewbtns.dll | icon=sPENCIL
Горячие клавиши
Команду можно вызывать и с помощью горячих клавиш. Для этого необходимо зарегистрировать их на новую команду следующим образом:
[\Accelerators]
hello=sCtrl+Shift+1
Теперь нашу простую команду hello можно вызвать сочетанием клавиш CTRL + SHIFT + 1.
Финальные шаги: особенности регистрации интерфейса
На данный момент любые изменения интерфейса в nanoCAD применяются только после однократного сброса настроек программы и очистки реестра. Поэтому необходимо добавить в userdata.ini следующие строчки:
[\Configuration]
ClearRegistry=f1
Теперь, запустив программу посредством ncad.exe (важно!), мы получим в среде новую команду hello, новый пункт меню, новую панель инструментов и горячие клавиши (рис. 2). После однократного запуска останавливаем сброс настроек, закомментировав строку «ClearRegistry=f1» в файле userdata.ini:
[\Configuration]
;ClearRegistry=f1
Почему важно запускать программу напрямую через ncad.exe? Дело в том, что штатный ярлык программы при запуске проверяет целостность установки программы, и если мы внесли в интерфейс свои изменения, то ярлык будет стараться восстановить файлы и реестр nanoCAD, запуская установщик Windows. Это не очень удобно, когда вы тренируетесь со скриптами.
Рис. 2. Интерфейс nanoCAD, настроенный на новые команды
Но если ваше приложение оттестировано и зарегистрировано в системе, то в дальнейшем программу можно попрежнему запускать через ярлык — программа, один раз проверив целостность ключевых файлов, будет запускаться корректно.
Заключение
Итак, мы добились того, чего хотели: с помощью трех настроечных файлов (userdata.nsf, userdata.cfg и userdata.ini) получили возможность расширять функционал бесплатной платформы nanoCAD. При этом новые команды добавляются в nsfфайл, а настройки интерфейса — в cfgфайл. Всё вместе это увязывает iniфайл.
Команды, которые вы можете использовать в nanoCAD, описаны в справочном руководстве по ActiveX API, установленном в папку с программой по следующему пути: %product_dir%\help\api\ncX_devguide.chm.
Нельзя не отметить, что ActiveX API предоставляет пользователю огромные возможности: небольшие инструменты автоматизации позволяют обходиться без платных приложений, избавляют от рутинных операций и ускоряют работу. На мой взгляд, это must have для студентов и настоятельно рекомендуется для опытных САПРпользователей.
На нашем форуме вы можете скачать демонстрационные файлы userdata.nsf, userdata.cfg и userdata.ini2, что избавит вас от необходимости создавать их самостоятельно.
Кстати, на форуме уже начали появляться полезные команды, которые расширяют функционал nanoCAD: включение/отключение рамки вокруг растра, построение касательных к двум окружностям и т.д. Там же вы можете выложить свои наработки. Приходите, обсуждайте, делитесь и получайте удовольствие от проектирования!
1 Ожигин Д. Первые шаги в мир программирования под nanoCAD // http://habrahabr.ru/company/nanosoft/blog/86970/.
http://forum.nanocad.ru/index.php?showtopic=4026