Когда в ноябре прошлого года вышел бесплатный nanoCAD 2.0, мы говорили, что в выпускаемой версии уже заложены инструменты для разработки приложений. В частности, для основной массы пользователей предоставляется возможность быстрого написания утилит и небольших приложений с помощью сценариев (скриптов) на базе ActiveX Automation (Java-script или VB-script). Но кто знает, как воспользоваться этой возможностью? :-)
Предлагаю сделать совместные первые шаги в мир программирования под nanoCAD и создать небольшую программу, которая взаимодействует с пользователем через командную строку и автоматически вычерчивает линии в заданном порядке на рабочем чертеже nanoCAD. Отталкиваясь от этого скрипта и дав волю фантазии, вы сможете сделать свое приложение, которое, например, автоматически делает за вас диплом :-)
В этом демонстрационном примере мы должны получить примерно вот такое:
А понадобится нам для этого следующее:
Кстати, ищете интересную работу, связанную с программированием? У нас открыты вакансии: http://habrahabr.ru/company/nanosoft/vacancies/
На каком языке писать выполняемый скрипт в общем-то не важно: nanoCAD поддерживает как Java-script, так и Visual Basic Script. Для данной статьи я выбрал VB, так как в последнее время я его чаще использую.
Когда я размышлял на основе чего продемонстрировать работу VB-скрипта, у меня возникло желание перевести какой-либо LISP-скрипт на VB-скрипт, продемонстрировав таким образом, что это возможно. Поискав в Интернет, я наткнулся на курсовой проект «Разработка программы на языке LISP для построения кривых Серпинского i-го порядка». В нем приведен достаточно подробный алгоритм, объясняющий как с помощью рекурсивных функций построить фигуру, приведенную на рисунке 1. Давайте сделаем то же самое, но на VBS.
VBS-программа под nanoCAD не подразумевает никакой входной функции – скрипт начинает исполняться с первых строчек и до конца. Основная процедура программы достаточно простая – один цикл. С него и начнем:
Из кода (да и из описания курсового проекта) мы видим, что кривая Серпинского строится четырьмя рекурсивными функциями: они названы A(), B(), C() и D() функциями. Плюс к этому существует специализированная функция Line(Direction, Size), которая просто рисует обычную линию в нужном масштабе и под нужным углом. Определения этих функций осуществляется обычными средствами VBS – например, вот так будет выглядеть функция A() на LISP и на VBS:
Эти дополнительные пять функций размещаем в конце основного скрипта. Осталось только узнать, как выводить графику в nanoCAD и как взаимодействовать с пользователем.
Во-первых, VB-скрипт – это обычный текстовый файл с расширением .vbs. Он может быть вызван в среде nanoCAD с помощью команды VBS (см. рисунок 2, соответственно Java-скрипт с помощью команды JS). Все просто — указываем путь до скрипта и, если он написан без ошибок, то он выполняется. Если в скрипте допущены ошибки, то сообщение об этом появится в командной строке.
VB-синтаксис абсолютно стандартный, поэтому смело используем DIM, SET, FOR-NEXT, IF-THEN-ELSE, объявления переменных, массивы, стандартные функции (типа, CStr() или MsgBox()), объявления функций и/или операции целочисленного деления. Все должно работать и особо этому учить не буду :-)
Для доступа к текущему открытому чертежу используем ThisDrawing. При этом если мы планируем чертить в пространстве модели (т.е. в основном чертеже, закладка Модель), то определяем коллекцию ModelSpace через вот такую конструкцию:
Доступ к командной строке осуществляется через объект Utility. В частности, нижеприведенный скрипт выводит в командную строку классическое приветствие:
С помощью функций GetInteger(), GetPoint(), GetString(), GetReal(), GetEntity(), GetDistance(), GetAngle() и некоторых других можно запросить данные из командной строки. Например, вот так:
Зная куда выводить данные и как взаимодействовать с пользователем, мы можем приступить к созданию более осмысленной программы.
Какие еще функции можно использовать в программе под nanoCAD? В общем-то все те, что определены структурой DWG файла: создание линии, дуги, окружности, штриховки, получение точки, полярных координат, операции с открытие/закрытием файла, работа со слоями, переменными и т.д. Эти функции обычно описаны в SDK-документации к DWG: либо Autodesk (www.autodesk.com, раздел Developer Center), либо Open Design Alliance (http://www.opendwg.org/, раздел DWGdirect).
Мы будем активно использовать функцию AddLine(startpoint, endpoint), которая создает обычную 2D линию. Также в своих скриптах вы можете воспользоваться:
Все координаты, которые вы передаете в nanoCAD могут быть трехмерными. При этом изначально это должен быть трехмерный массив, но удобнее передавать строчку вида «x,y,z», где – x, y, z трехмерные координаты. Т.е. вот таким образом:
Еще в своем скрипте я решил раскладывать линии по различным слоям. Для этого я создал два новых слоя в начале программы, а затем менял активный слой:
Вот что мы получаем в результате – см. рисунок 3. Конечно, практической полезности (кроме как эстетического удовольствия) этот результат не дает, но дает пищу для размышления и самосовершенствования.
Демонстрационный скрипт можно скачать здесь: demoscript.rar. Скачайте, разархивируйте, например, на C:\, откройте в текстовом редакторе, изучите и запустите на исполнение в nanoCAD 2.0. И небольшой совет: не задавайте порядок кривых выше 4 — подвиснете :-)
Предлагаю сделать совместные первые шаги в мир программирования под nanoCAD и создать небольшую программу, которая взаимодействует с пользователем через командную строку и автоматически вычерчивает линии в заданном порядке на рабочем чертеже nanoCAD. Отталкиваясь от этого скрипта и дав волю фантазии, вы сможете сделать свое приложение, которое, например, автоматически делает за вас диплом :-)
В этом демонстрационном примере мы должны получить примерно вот такое:
А понадобится нам для этого следующее:
- nanoCAD 2.0 (можно скачать на сайте nanocad.ru или
torrents.rurutracker.org); - любой текстовый редактор (я использую Notepad++).
Кстати, ищете интересную работу, связанную с программированием? У нас открыты вакансии: http://habrahabr.ru/company/nanosoft/vacancies/
Постановка задачи
На каком языке писать выполняемый скрипт в общем-то не важно: nanoCAD поддерживает как Java-script, так и Visual Basic Script. Для данной статьи я выбрал VB, так как в последнее время я его чаще использую.
Когда я размышлял на основе чего продемонстрировать работу VB-скрипта, у меня возникло желание перевести какой-либо LISP-скрипт на VB-скрипт, продемонстрировав таким образом, что это возможно. Поискав в Интернет, я наткнулся на курсовой проект «Разработка программы на языке LISP для построения кривых Серпинского i-го порядка». В нем приведен достаточно подробный алгоритм, объясняющий как с помощью рекурсивных функций построить фигуру, приведенную на рисунке 1. Давайте сделаем то же самое, но на VBS.
Рисунок 1. Кривая Серпинского 4-го порядка, на примере которой рассмотрим принципы программирования под nanoCAD. |
Структура программы
VBS-программа под nanoCAD не подразумевает никакой входной функции – скрипт начинает исполняться с первых строчек и до конца. Основная процедура программы достаточно простая – один цикл. С него и начнем:
Код на LISP | Код на VBS |
---|---|
( setq h ( div *SquareSize* 4 ) ) |
h = SquareSize \ 4 |
Из кода (да и из описания курсового проекта) мы видим, что кривая Серпинского строится четырьмя рекурсивными функциями: они названы A(), B(), C() и D() функциями. Плюс к этому существует специализированная функция Line(Direction, Size), которая просто рисует обычную линию в нужном масштабе и под нужным углом. Определения этих функций осуществляется обычными средствами VBS – например, вот так будет выглядеть функция A() на LISP и на VBS:
Код на LISP | Код на VBS |
---|---|
defun A ( k ) |
Sub A(k) |
Эти дополнительные пять функций размещаем в конце основного скрипта. Осталось только узнать, как выводить графику в nanoCAD и как взаимодействовать с пользователем.
Первые шаги
Во-первых, VB-скрипт – это обычный текстовый файл с расширением .vbs. Он может быть вызван в среде nanoCAD с помощью команды VBS (см. рисунок 2, соответственно Java-скрипт с помощью команды JS). Все просто — указываем путь до скрипта и, если он написан без ошибок, то он выполняется. Если в скрипте допущены ошибки, то сообщение об этом появится в командной строке.
Рисунок 2. Java и Visual Basic скрипты вызываются командами JS и VBS, соответственно. |
VB-синтаксис абсолютно стандартный, поэтому смело используем DIM, SET, FOR-NEXT, IF-THEN-ELSE, объявления переменных, массивы, стандартные функции (типа, CStr() или MsgBox()), объявления функций и/или операции целочисленного деления. Все должно работать и особо этому учить не буду :-)
Для доступа к текущему открытому чертежу используем ThisDrawing. При этом если мы планируем чертить в пространстве модели (т.е. в основном чертеже, закладка Модель), то определяем коллекцию ModelSpace через вот такую конструкцию:
Dim ms |
Доступ к командной строке осуществляется через объект Utility. В частности, нижеприведенный скрипт выводит в командную строку классическое приветствие:
Dim ut |
С помощью функций GetInteger(), GetPoint(), GetString(), GetReal(), GetEntity(), GetDistance(), GetAngle() и некоторых других можно запросить данные из командной строки. Например, вот так:
Do |
Зная куда выводить данные и как взаимодействовать с пользователем, мы можем приступить к созданию более осмысленной программы.
Базовые функции
Какие еще функции можно использовать в программе под nanoCAD? В общем-то все те, что определены структурой DWG файла: создание линии, дуги, окружности, штриховки, получение точки, полярных координат, операции с открытие/закрытием файла, работа со слоями, переменными и т.д. Эти функции обычно описаны в SDK-документации к DWG: либо Autodesk (www.autodesk.com, раздел Developer Center), либо Open Design Alliance (http://www.opendwg.org/, раздел DWGdirect).
Мы будем активно использовать функцию AddLine(startpoint, endpoint), которая создает обычную 2D линию. Также в своих скриптах вы можете воспользоваться:
- AddCircle(center, radius) – окружность;
- AddArc(center, radius, startangle, endangle) – дуга;
- AddEllipse(center, majoraxis, radiusratio) – эллипс;
- AddPolyline(verticeslist) – полилиния;
- AddText(textstring, insertionpoint, height) – однострочный текст;
- AddMText(insertionpoint, width, text) – многострочный текст;
Все координаты, которые вы передаете в nanoCAD могут быть трехмерными. При этом изначально это должен быть трехмерный массив, но удобнее передавать строчку вида «x,y,z», где – x, y, z трехмерные координаты. Т.е. вот таким образом:
Dim ms |
Еще в своем скрипте я решил раскладывать линии по различным слоям. Для этого я создал два новых слоя в начале программы, а затем менял активный слой:
Set oLyrLine1 = ThisDrawing.Layers.Add("Связи") |
Результат
Вот что мы получаем в результате – см. рисунок 3. Конечно, практической полезности (кроме как эстетического удовольствия) этот результат не дает, но дает пищу для размышления и самосовершенствования.
Рисунок 3. Java и Visual Basic скрипты вызываются командами JS и VBS, соответственно. |
Демонстрационный скрипт можно скачать здесь: demoscript.rar. Скачайте, разархивируйте, например, на C:\, откройте в текстовом редакторе, изучите и запустите на исполнение в nanoCAD 2.0. И небольшой совет: не задавайте порядок кривых выше 4 — подвиснете :-)