Год назад я написал статью о том, как использовать скрипты в среде nanoCAD на примере перевода LISP-программы на Visual Basiс Script: достаточно подробно показал как организовать взаимодействие с пользователем, создавать новые объекты, раскладывать их по слоям и как вызвать скрипт на исполнение в среде nanoCAD. Надеюсь, что вы пользовались этой замечательной возможностью простейшей автоматизации.
Этой статьей я хотел бы продолжить цикл публикаций, связанных с программированием под nanoCAD. В частности, пришло время узнать как вашему скрипту назначить команду, включить ее в интерфейс nanoCAD (пункт меню, кнопка на панели инструментов и сочетания клавиш). Добро пожаловать в мир безграничного программирования под nanoCAD.

Для того, чтобы практически выполнить то, что тут написано, вам необходимо сделать две вещи:
Собственно интеграция скриптов в среде nanoCAD состоит из трех шагов: регистрация новых команд, загрузка этих команд в среду nanoCAD и привязка команд к элементам интерфейса. Последний шаг можно не делать – в этом случае свои команды вы можете вызывать с командной строки. Рассмотрим каждый шаг подробнее.
Регистрация новой команды в nanoCAD осуществляется через специализированный nsf-файл, который по сути является xml-файлом. Его структура хорошо описана в справочном руководстве по ActiveX API – посмотрите раздел «Регистрация скриптов в качестве команд». Если говорить кратко, то команда описывается в файле с рамках тегов: ‹command›‹/command›, у которой есть четыре атрибута: name, weight, cmdtype и caps. Если с «name» и «weight», надеюсь, все понятно («name» — это собственно имя нашей команды, которое мы будем набирать в командной строке, а «weight» – вес команды, параметр опциональный, по умолчанию равен 30), то с двумя другими надо разобраться поближе.
Атрибут «cmdtype» определяет область действия скрипта – может иметь два значения:
Атрибут «caps» управляет выбором объектов при запуске скрипта:
Понятно, что имя команды должно быть уникальным – по неосторожности можно переопределить базовые команды платформы. Например конструкция:
В одном nsf-файле можно определять несколько команд. И все это структурируется следующим образом:
В рамках тегов ‹command›‹/command› можно располагать еще два тега: ‹description›‹/description› и ‹script›‹/script›. Опять же с первым, надеюсь, все понятно – это описание команды. Тег ‹script›‹/script› определяет язык, на котором написан скрипт – либо VBScript, либо JScript. Например, вот так:
Теперь вооружившись этими знаниями вы без проблем сможете составить свой первый nsf-файл, обертывающий ваш скрипт в команду и регистрирующий его в среде nanoCAD:
Описанная здесь команда hello выводит в командную строку классическое приветствие. Сохраним этот xml-файл с именем «userdata.nsf» и первый шаг мы сделали.
NSF-файл загружается в среду nanoCAD одноименной командной – nsf. Введите ее в командной строке запущенного nanoCAD, укажите путь до созданного на предыдущем шаге файла «userdata.nsf» и можно запускать описанные в нем команды – например, созданную на предыдущем шаге команду hello:

Рис. 1. Простейшая команда hello и наш первый результат.
Конечно проделывать подобные шаги каждый раз, когда нам нужна своя команда – удовольствие ниже среднего. Автоматизируем…
Внимание! Начиная с nanoCAD 4.5 NSF-файлы можно загружать при помощи команды APPLOAD, для автоматической загрузки достаточно поместить файл в «Чемодан автозагрузки», расположенный на диалоге APPLOAD. В nanoCAD 4.5 и выше создавать команду загрузки NSF-файла и прописывать её в автозагрузку не нужно.
Сначала нам нужно создать свою команду, которая запускает заданными нами nsf-файл (т.е. запускает команду nsf с параметрами). Для этого создаем текстовый файл «userdata.cfg» (этот файл нам понадобится в дальнейшем) и описываем в нем команду «load_userdata_nsf»:
Этим шагом мы создали свой файл конфигураций, в котором описали новую команду с внутренним именем load_userdata_nsf, которая вызывает команду nsf (RealCommandName=snsf) с опциями, описанными в строке Keyword. Обратите внимание на символ «s», который идет после знака равно («=») – это обязательный символ необходимый интерпритатору nanoCAD для работы с cfg-файлом.
Всевозможные опции команд я не буду описывать, иначе статья превратиться в книгу (интересующиеся могут самостоятельно изучить файл «nCad.cfg» — это файл конфигураций для nanoCAD), но наиболее интересные и частоиспользуемые опции мы изучим ниже.
Например, обратите внимание на конструкцию
Она означает, что после вызова команды (в данном случае «nsf») в командную строку подается команда «userdata.nsf» и Enter (т.е. загружается файл «userdata.nsf»), потом команда CloseDocument+Enter (т.е. закрывается текущий документ) и, наконец, команда NewDocument+Enter (т.е. создается новый документ). Думаю, что вы догодались, что символы «^M» означают Enter.
Теперь нам надо при запуске nanoCAD автоматически загружать команду load_userdata_nsf. Тут все просто – создаем текстовый файл «userdata.ini» со следующими строчками:
Шаг 2 сделан – нам остается положить в папку, в которую установлен nanoCAD три созданных нами файла: userdata.nsf, userdata.ini и userdata.cfg и запустить программу. Теперь, если вы все сделали правильно, то при запуске в среду nanoCAD будет подгружаться файл userdata.nsf, а вслед за этим регистрироваться новая команда hello. Если в nsf-файле при запуске будет прописано больше команд, то все они будут доступны из командной строки.
За интеграцию команд с интерфейсом nanoCAD отвечает уже знакомый нам файл «userdata.cfg». Этот файл имеет определенную структуру описания – фактически все элементы интерфейса nanoCAD прописаны в файлах с таким расширением. Боюсь, что в рамках статьи я не смогу рассказать все многочисленные варианты и опции этого файла, но минимально-необходимый набор следующий (все команды надо прописывать в файле «userdata.cfg»):
Осуществляется следующим способом:
После этого в nanoCAD появится новый пункт меню Мои команды с одним пунктом меню Новая команда HELLO, которая вызывает команду hello. Добавляя новые строчки, вы будете расширять свой пункт меню командами.
Осуществляется следующим способом:
После этого появится новая панель инструментов Мои команды и на ней одна новая команда hello. Опция InitialVisible отвечает за видимость панели при запуске (f1 – видима, f0 — невидима).
Для того, чтобы у команды появилась своя иконка, вам надо еще раз переопределить команду, указав dll с ресурсами изображения. В частности, вы можете использовать файл newbtns.dll, который устанавливается вместе с nanoCAD (посмотрите с помощью программы ресурс-менеджера зарегистрированные в dll файлы изображений):
Команду можно вызывать и с помощью горячих клавиш. Для этого необходимо зарегистрировать их на новую команду следующим образом:
Теперь нашу простую команду hello можно вызвать через сочетание клавиш Ctrl+Shift+1.
На данный момент любые изменения интерфейса в nanoCAD применяюся только после однократного сброса настроек программы и очистки реестра. Поэтому нам необходимо добавить в userdata.ini следующие строчки:
Теперь, запустив программу через ncad.exe (важно!), мы получим в среде новую команду HELLO, новый пункт меню, новую панель инструментов и горячие клавиши. После обнократного запуска останавливаем сброс настроек, закомментировав строку «ClearRegistry=f1» в файле userdata.ini:
Почему важно запускать программу напрямую через ncad.exe? Дело в том, что штатный ярлык программы при запуске проверяет целостность установки программы, и, если мы внесли свои изменения в интерфейс, то ярлык будет стараться восстановить файлы и реестр nanoCAD, запуская установщик Windows. Это не очень удобно, когда вы тренируетесь со скриптами.
Но если ваше приложение оттестировано и зарегистрировано в системе, то в дальнейшем программу можно по-прежнему запускать через ярлык – программа, один раз проверив целостность ключевых файлов, будет запускаться корректно.
Итак, мы получили то, что хотели: через три настроечных файла (userdata.nsf, userdata.cfg и userdata.ini) мы получили возможность расширять функционал бесплатной платформы nanoCAD. При этом новые команды добавляются в nsf-файл, а настройки интерфейса – в cfg-файл. Все вместе это увязывает ini-файл.

Рис. 2. Интерфейс nanoCAD, настроенный на новые команды.
Команды, которые вы можете использовать в nanoCAD, описаны в справке по ActiveX API – она устанавливается в папку с программой по пути: %product_dir%\help\api\ncX_devguide.chm.
В принципе, ActiveX API предоставляет пользователю огромные возможности – небольшие инструменты автоматизации позволяют обходится без платных приложений, избавляют от рутины и ускоряют работу. На мой взгляд, must have для студентов и настоятельно рекомендуется для опытных САПР-пользователей.
На нашем форуме вы можете скачать демонстрационные файлы userdata.nsf, userdata.cfg и userdata.ini. В этом случае вам не надо создавать эти файлы: можете использовать и редактировать наши.
Кстати, на форуме уже начали появляться полезные команды, которые расширяют функционал nanoCAD: включение\отключение рамки вокруг растра, построение касательных к двум окружностям и т.д. Там же вы можете выложить свои наработки. Приходите-обсуждайте-делитесь и давайте получать удовольствие от проектирования!
Этой статьей я хотел бы продолжить цикл публикаций, связанных с программированием под nanoCAD. В частности, пришло время узнать как вашему скрипту назначить команду, включить ее в интерфейс nanoCAD (пункт меню, кнопка на панели инструментов и сочетания клавиш). Добро пожаловать в мир безграничного программирования под nanoCAD.

Инициализация
Для того, чтобы практически выполнить то, что тут написано, вам необходимо сделать две вещи:
- установить систему автоматизированного проектирования nanoCAD;
- загрузить любой текстовый редактор для написания скриптов (я использую Notepad++, можно использовать обычный Блокнот Windows);
Собственно интеграция скриптов в среде nanoCAD состоит из трех шагов: регистрация новых команд, загрузка этих команд в среду nanoCAD и привязка команд к элементам интерфейса. Последний шаг можно не делать – в этом случае свои команды вы можете вызывать с командной строки. Рассмотрим каждый шаг подробнее.
Шаг 1. Регистрация команды в nanoCAD
Регистрация новой команды в nanoCAD осуществляется через специализированный nsf-файл, который по сути является xml-файлом. Его структура хорошо описана в справочном руководстве по ActiveX API – посмотрите раздел «Регистрация скриптов в качестве команд». Если говорить кратко, то команда описывается в файле с рамках тегов: ‹command›‹/command›, у которой есть четыре атрибута: name, weight, cmdtype и caps. Если с «name» и «weight», надеюсь, все понятно («name» — это собственно имя нашей команды, которое мы будем набирать в командной строке, а «weight» – вес команды, параметр опциональный, по умолчанию равен 30), то с двумя другими надо разобраться поближе.
Атрибут «cmdtype» определяет область действия скрипта – может иметь два значения:
0 | — скрипт приложения: т.е. из скрипта есть доступ к глобальному имени ThisApplication |
1 | — скрипт документа: т.е. из скрипта есть доступ только к глобальному имени ThisDrawing |
Атрибут «caps» управляет выбором объектов при запуске скрипта:
0 | — сохранить селекцию (PickfirstSelectionSet) перед началом команды |
1 | — сохранить селекцию после исполнения команды |
Понятно, что имя команды должно быть уникальным – по неосторожности можно переопределить базовые команды платформы. Например конструкция:
‹command name="save" weight="30" cmdtype="1" caps="0"›
...
‹/command›
переопределит команду сохранения документа.В одном nsf-файле можно определять несколько команд. И все это структурируется следующим образом:
‹?xml version="1.0" encoding="utf-8"?›
‹package›
‹command name="cmd1" weight="30" cmdtype="1" caps="0"›
...
‹/command›
‹command name="cmd2" weight="30" cmdtype="1" caps="0"›
...
‹/command›
‹command name="cmd3" weight="30" cmdtype="1" caps="0"›
...
‹/command›
...
‹/package›
Здесь, как в уже наверное поняли, определяется три команды cmd1, cmd2 и cmd3.В рамках тегов ‹command›‹/command› можно располагать еще два тега: ‹description›‹/description› и ‹script›‹/script›. Опять же с первым, надеюсь, все понятно – это описание команды. Тег ‹script›‹/script› определяет язык, на котором написан скрипт – либо VBScript, либо JScript. Например, вот так:
‹command name="mycommand" weight="30" cmdtype="1" caps="0"›
‹description›‹/description›
‹script lang="JScript"›‹![CDATA[
...здесь расположен код скрипта...
]]›‹/script›
‹/command›
Обратите внимание на конструкцию ‹![CDATA[]]› — именно в ней прописывается код скрипта.Теперь вооружившись этими знаниями вы без проблем сможете составить свой первый nsf-файл, обертывающий ваш скрипт в команду и регистрирующий его в среде nanoCAD:
‹?xml version="1.0" encoding="utf-8"?›
‹package›
‹command name="hello" weight="30" cmdtype="1" caps="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. Простейшая команда hello и наш первый результат.
Конечно проделывать подобные шаги каждый раз, когда нам нужна своя команда – удовольствие ниже среднего. Автоматизируем…
Создание команды загрузки nsf-файла
Внимание! Начиная с nanoCAD 4.5 NSF-файлы можно загружать при помощи команды APPLOAD, для автоматической загрузки достаточно поместить файл в «Чемодан автозагрузки», расположенный на диалоге APPLOAD. В nanoCAD 4.5 и выше создавать команду загрузки 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-файлом.
Всевозможные опции команд я не буду описывать, иначе статья превратиться в книгу (интересующиеся могут самостоятельно изучить файл «nCad.cfg» — это файл конфигураций для nanoCAD), но наиболее интересные и частоиспользуемые опции мы изучим ниже.
Например, обратите внимание на конструкцию
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
Осуществляется следующим способом:
[\menu\mycommans] |name=sМои команды
[\menu\mycommans\hello] |name=sНовая команда HELLO |intername=shello
После этого в nanoCAD появится новый пункт меню Мои команды с одним пунктом меню Новая команда HELLO, которая вызывает команду hello. Добавляя новые строчки, вы будете расширять свой пункт меню командами.
Регистрация панели инструментов в 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
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, новый пункт меню, новую панель инструментов и горячие клавиши. После обнократного запуска останавливаем сброс настроек, закомментировав строку «ClearRegistry=f1» в файле userdata.ini:
[\Configuration]
;ClearRegistry=f1
Почему важно запускать программу напрямую через ncad.exe? Дело в том, что штатный ярлык программы при запуске проверяет целостность установки программы, и, если мы внесли свои изменения в интерфейс, то ярлык будет стараться восстановить файлы и реестр nanoCAD, запуская установщик Windows. Это не очень удобно, когда вы тренируетесь со скриптами.
Но если ваше приложение оттестировано и зарегистрировано в системе, то в дальнейшем программу можно по-прежнему запускать через ярлык – программа, один раз проверив целостность ключевых файлов, будет запускаться корректно.
Заключение
Итак, мы получили то, что хотели: через три настроечных файла (userdata.nsf, userdata.cfg и userdata.ini) мы получили возможность расширять функционал бесплатной платформы nanoCAD. При этом новые команды добавляются в nsf-файл, а настройки интерфейса – в cfg-файл. Все вместе это увязывает ini-файл.

Рис. 2. Интерфейс nanoCAD, настроенный на новые команды.
Команды, которые вы можете использовать в nanoCAD, описаны в справке по ActiveX API – она устанавливается в папку с программой по пути: %product_dir%\help\api\ncX_devguide.chm.
В принципе, ActiveX API предоставляет пользователю огромные возможности – небольшие инструменты автоматизации позволяют обходится без платных приложений, избавляют от рутины и ускоряют работу. На мой взгляд, must have для студентов и настоятельно рекомендуется для опытных САПР-пользователей.
На нашем форуме вы можете скачать демонстрационные файлы userdata.nsf, userdata.cfg и userdata.ini. В этом случае вам не надо создавать эти файлы: можете использовать и редактировать наши.
Кстати, на форуме уже начали появляться полезные команды, которые расширяют функционал nanoCAD: включение\отключение рамки вокруг растра, построение касательных к двум окружностям и т.д. Там же вы можете выложить свои наработки. Приходите-обсуждайте-делитесь и давайте получать удовольствие от проектирования!