Первые шаги в мир программирования под 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 — подвиснете :-)
    Метки:
    Нанософт 43,55
    Компания
    Поделиться публикацией
    Похожие публикации
    Комментарии 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го можно настроить так, что если быстро кликнули правой кнопкой — последняя команда, если нажали и подержали — контекстное меню.

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

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

                            Самое читаемое