Pull to refresh
100.67
Нанософт разработка
Инженерная экосистема

Первые шаги в мир программирования под nanoCAD

Reading time 5 min
Views 24K
Когда в ноябре прошлого года вышел бесплатный nanoCAD 2.0, мы говорили, что в выпускаемой версии уже заложены инструменты для разработки приложений. В частности, для основной массы пользователей предоставляется возможность быстрого написания утилит и небольших приложений с помощью сценариев (скриптов) на базе ActiveX Automation (Java-script или VB-script). Но кто знает, как воспользоваться этой возможностью? :-)
Предлагаю сделать совместные первые шаги в мир программирования под nanoCAD и создать небольшую программу, которая взаимодействует с пользователем через командную строку и автоматически вычерчивает линии в заданном порядке на рабочем чертеже nanoCAD. Отталкиваясь от этого скрипта и дав волю фантазии, вы сможете сделать свое приложение, которое, например, автоматически делает за вас диплом :-)
В этом демонстрационном примере мы должны получить примерно вот такое:

А понадобится нам для этого следующее:
  • nanoCAD 2.0 (можно скачать на сайте nanocad.ru или torrents.ru rutracker.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 ) )
( setq x0 ( div *MaxX* 2 ) )
( setq y0 ( + ( div *MaxY* 2 ) h ) )

do (( i 1 ))
(( eql i ( + Count 1 ) ) 'Done )
( setq x0 ( - x0 h ) )
( setq h ( div h 2 ) )
( setq y0 ( + y0 h ) )
( setq Px x0 Py y0 )

( A i )
( Line 1 h )
( B i )
( Line 3 h )
( C i )
( Line 5 h )
( D i )
( Line 7 h )
( setq i ( + i 1 )) )

h = SquareSize \ 4
x0 = MaxX \ 2
y0 = h + MaxY \ 2

for i = 1 to count

    x0 = x0 - h
    h = h \ 2
    y0 = y0 + h
    Px = x0
    Py = y0
    A(i)
    Line 1, h
    B(i)
    Line 3, h
    C(i)
    Line 5, h
    D(i)
    Line 7, h
next


Из кода (да и из описания курсового проекта) мы видим, что кривая Серпинского строится четырьмя рекурсивными функциями: они названы A(), B(), C() и D() функциями. Плюс к этому существует специализированная функция Line(Direction, Size), которая просто рисует обычную линию в нужном масштабе и под нужным углом. Определения этих функций осуществляется обычными средствами VBS – например, вот так будет выглядеть функция A() на LISP и на VBS:
Код на LISP Код на VBS
defun A ( k )
( cond ( ( > k 0 )
( A ( - k 1 ) )
( Line 1 h )
( B ( - k 1 ) )
( Line 0 ( * 2 h ) )
( D ( - k 1 )
( Line 7 h )
( A ( - k 1 ) )
) )

Sub A(k)
    if k > 0 then
        A(k-1)
        Line 1, h
        B(k-1)
        Line 0, 2 * h
        D(k-1)
        Line 7, h
        A(k-1)
    End If
End Sub


Эти дополнительные пять функций размещаем в конце основного скрипта. Осталось только узнать, как выводить графику в 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
Set ms = ThisDrawing.ModelSpace

Доступ к командной строке осуществляется через объект Utility. В частности, нижеприведенный скрипт выводит в командную строку классическое приветствие:
Dim ut
Set ut = ThisDrawing.Utility
ut.Prompt("Привет, мир!")

С помощью функций GetInteger(), GetPoint(), GetString(), GetReal(), GetEntity(), GetDistance(), GetAngle() и некоторых других можно запросить данные из командной строки. Например, вот так:
Do
    count = ThisDrawing.Utility.GetInteger("Задайте положительное число (>=1)")
Loop While count <= 0

For i = 1 to count
    point = ThisDrawing.Utility.GetPoint("0,0,0", "Укажите точку №" & i)
Next

Зная куда выводить данные и как взаимодействовать с пользователем, мы можем приступить к созданию более осмысленной программы.

Базовые функции


Какие еще функции можно использовать в программе под 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 ptStr = CStr(x)+","+CStr(y)+","+CStr(y)

Еще в своем скрипте я решил раскладывать линии по различным слоям. Для этого я создал два новых слоя в начале программы, а затем менял активный слой:
Set oLyrLine1 = ThisDrawing.Layers.Add("Связи")
Set oLyrLine2 = ThisDrawing.Layers.Add("Квадраты")
...
case 5:
    Set oLyr = oLyrLine1
case 6:
    Set oLyr = oLyrLine2
...
oLine.Layer = oLyr.Name

Результат


Вот что мы получаем в результате – см. рисунок 3. Конечно, практической полезности (кроме как эстетического удовольствия) этот результат не дает, но дает пищу для размышления и самосовершенствования.
Рисунок 3. Java и Visual Basic скрипты вызываются командами JS и VBS, соответственно.


Демонстрационный скрипт можно скачать здесь: demoscript.rar. Скачайте, разархивируйте, например, на C:\, откройте в текстовом редакторе, изучите и запустите на исполнение в nanoCAD 2.0. И небольшой совет: не задавайте порядок кривых выше 4 — подвиснете :-)
Tags:
Hubs:
+18
Comments 25
Comments Comments 25

Articles

Information

Website
www.nanocad.ru
Registered
Founded
Employees
Unknown
Location
Россия