Компания
35,81
рейтинг
10 марта 2010 в 11:17

Разработка → Первые шаги в мир программирования под nanoCAD

Когда в ноябре прошлого года вышел бесплатный 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 — подвиснете :-)
Автор: @dows

Комментарии (25)

  • +1
    Спасибо, интересный тутор :)
  • 0
    Отлично, очень пригодилось!
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Эм, хоть бы кто-нибудь написал — сложно или просто написали? Надо или не надо на подобные темы писать? оО
    • +1
      Написано хорошо, писать на подобные темы надо. Я вот например изучаю данный софт и возможность перевода на него своей компании.
      • +1
        Поддерживаю, обязательно пишите, тоже собираюсь всех переводить на нанокад
  • –1
    папоКад! ;) отцовый САПР! ;)
  • 0
    Надеюсь, за nanoCAD torrents.ru rutracker.org в этот раз не закроют.
    • 0
      nanoCAD — молодцы! nanoCAD на rutracker.org — авторская раздача.

      З.Ы. Или вы так тонко намекаете на Autodesk, что вроде как они и не предъявляли претензий к torrents.ru.
    • 0
      У нас там авторская раздача наша. Да и у нас ПО столько не стоит, чтобы за ним гоняться, от 7 до 22 тысяч рублей, до планки в 50 тысяч не догятиваем. :))) И взламывать нас бесполезно, платформа бесплатная, остальные в демках работают нормально.
  • 0
    не совсем понятно… нанокад для организации бесплатен или нет?
    • 0
      nanocad бесплатен для всех — организаций, частных лиц, студентов, ВУЗов, российских граждан и граждан из других стран…
  • 0
    >>>> как Java-script, так и Visual Basic script

    смешно и грустно. а есть биндинги к нормальным языкам типа lua или python?
  • 0
    Когда уже будет студенческая версия…
    • 0
      а можно узнать, что вы особенного ждете от студенческой версии?..

      почему нельзя использовать текущую БЕСПЛАТНУЮ версию nanoCAD для задач студентов и преподавателей? Учитесь — скачайте nanoCAD, установите на своем домашнем компьютере/ноутбуке, выполняйте домашние задания, свои проекты, курсовые, дипломные… Обучаете — скачайте nanoCAD, поставьте в учебном классе, разработайте учебные курсы и преподавайте на здоровье.

      Регистрация на сайте nanoCAD — добровольная и НЕ обязательная! Любая установленная копия nanoCAD является лицензионной и она разрешена для коммерческой, учебной и другой проектной деятельности.

      Какое особое приглашение вам необходимо?
      • 0
        У меня такое ощущение, что если бы мы распространяли nanoCAD вместе с приложенным файлом crack.exe — он был бы ближе к народу :-) Когда говоришь, что программа бесплатна, люди сразу ищут, а в чем ограничения :-)

        nanoCAD ничем не ограничен, бесплатен и легален. Используйте, пожалуйста. Все регистрации на сайте — нужны только для того, чтобы особо недоверчивым сказать об этом с помощью официального сертификата. Но эта бумага не обязательна!
      • 0
        дада, я уже скачал, протащился и записался в «евангелисты».
        кстати, а у вас нет тем, чтобы быть максимально похожими на компас/акад? исключительно в цветовых гаммах
        • 0
          Средства -> Адаптация -> закладка Параметры -> раздел Стиль… Выбираете стиль и кнопку Установить стиль.

          Я использую «Windows по умолчанию» — похоже на AutoCAD средних версий…
          • 0
            спасибо.
            попробовал скормить акадовский файл скриптов — не съел.
            Судя по этому посту, скрипты есть, и даже в более расширенном варианте
            • 0
              без творческой переработки VB-скрипт от AutoCAD скорее всего «в лоб» не пойдет. А уж LISP — точно не пойдет :-)

              У нас пока нет диалогов (только командная строка), хорошей документации и т.д. Но все будет в дальнейшем. А сейчас можно делать первые шаги немного хакерскими способами (шевелить мозгами, пробуя «работает-не работает»). Есть большой шанс, что многое будет работать :-)
              • 0
                в силу специфики специальности в ВУЗЕ написал программу на ruby, которая на выходе выдаёт автокадовский скрипт. нужны только линии, дуги да сплайны.

                PS. В меню средств нет вкладки адаптация… версия 2.0.1541.779 сборка 1195 Механика
                • 0
                  она тогда еще называлась Настройка :-) т.е. Средства -> Настройка -> Настройка… закладка Параметры -> раздел Стиль…
  • 0
    1. Вы не собираетесь встраивать поддержку Лиспа и VBA? Ну чтобы автокадовские наработки можно было портировать с меньшим усилием. Вообще в принципе, будет какая то среда разработки с отладчиком, подсветкой и т.п.?
    2. Где то есть хелп с объектной моделью и свойствами и методами всех объектов?

    ЗЫ. К программированию уже не относится. В автокаде по правой кнопке мыши можно настроить повтор последней команды (с 2004го можно в зависимости от времени нажатия) — у вас только контекстное меню вылезает, можно «допилить»? И сделайте чтобы тулбары можно было закреплять. И еще как убрать вкладочки с именами чертежей?

    А вообще удачи — хорошая вещь получается.
    • 0
      1. Есть мнение, что LISP в его текущей реализации скоро исчезнет — либо вообще, либо трансформируется в LISP.NET. В любом случае воспроизводить язык, который может претерпеть изменения по желанию одной компании мягко говоря неразумно. В вот с VBA — это хорошая мысль, которую мы скорее всего реализуем. Вместе со средой разработки с отладчиком, подсветкой и т.п. :-)
      2. Хелп с объектой моделью = объектной модели DWG, которая описана в SDK-документации Autodesk и ODA. К сожалению, доступ к SDK-документации платный. Более того, компания Autodesk ограничивает доступ к своему SDK по принципу «нравишься ты ей или нет» (т.е. даже заплатив им деньги, не факт, что вам дадут доступ к SDK и формату DWG). А вот ODA более открыты — «Предлагается несколько уровней членства в Альянсе: если вы не собираетесь включать библиотеки ODA в коммерчески распространяемые продукты, то можете ограничиться уровнем ассоциативного членства ($250 за первый год и $100 за каждый последующий). Коммерческий уровень дает вам право продавать не более 100 копий производных продуктов в год и стоит $2000 за первый год и $1500 за последующие. Если вы хотите продавать свое ПО без ограничений, то придется перейти на следующий уровень и заплатить $5000 в первый год и $3000 за каждый последующий.» (http://isicad.ru/ru/articles.php?article_num=13636).
      Для всех остальных остается метод проб и ошибок :-) Ну, либо искать chm файл с описанием функций DWG в просторах Интернет :-)

      P.S. В nanoCAD по правой кнопке в контекстном меню также появляется последняя команда. Только в AutoCAD 2006 она сверху меню, а у нас в середине :-) Но можно сделать также как в AutoCAD.

      Про закрепление тулбаров внес в пожелания. А вкладочки с именами чертежей зачем убирать — имхо, очень удобно переключаться между документами.
      • 0
        1. С лиспом ясно хоть и жаль. С VBA тоже понятно — уже лучше, но еще лучше прикрутить Visual Studio — там есть какой-то integrated вариант у нее — чтобы на любом .NET языке писать. =)
        2. Ну то есть в принципе можно «тиснуть» хэлп от автокада — модель будет та же. Вообще чудесно

        Про последнюю команду не поняли. Пример — команда рисования линии, тыкаем мышкой три раза — имеем три линии, правой кнопкой тыкнули — вышли из режима рисования линий. Теперь если опять тыкаем правую кнопку, у вас вылезает контекстное меню, в автокаде можно настроить, что повторяется последняя команда (как будто нажали Enter) — то есть опять рисуем линии. С 2004го можно настроить так, что если быстро кликнули правой кнопкой — последняя команда, если нажали и подержали — контекстное меню.

        Для вкладочек лучше все таки галочку в настройках — надо/не надо. А то ИМХО у всех разное — мое например считает, что они только место занимают =)

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

Самое читаемое Разработка