На мой взгляд, разработчики незаслуженно убрали команду мультилиния из последних версий Автокад. Этот инструмент многофункционален и может быть использован в различных областях проектирования. При помощи мультилинии мы можем создавать многослойные стены в архитектуре, рисовать дороги, трубопроводы системы отопление и теплоснабжения, воздуховоды систем вентиляции.
Давайте, вернем мультилинию на ленту и познакомимся с ней более подробно.
Итак, в этой уроке мы рассмотрим следующее:
- Добавление команды мультилиния на ленту.
- Создание нового стиля мультилинии.
- Добавление мультилинии в чертеж.
- Создание стиля мультилинии программным путем.
- LISP программа добавления мультилинии.
Добавление команды «Мультилиния» на ленту.
Перейдите на вкладку «Управление» выберите команду «Пользовательский интерфейс». См. Рис. 1.
Откроется окно «Адаптация пользовательского интерфейса».
Щелкните [+] напротив надписи «Лента». Зачем по [+] напротив «Вкладки», по [+] напротив «Главная 2D» и выберите строку «Главная 2D — Рисование».
Справа вверху появится панель инструментов «Главная 2D — Рисование».
Чтобы найти команду «Мультилиния», слева внизу в окне «Список команд» набираем «мультилин». Ниже появятся команды, которые мы и поместим на панель «Главная 2D — Рисование».
Справа вверху щелкните на изображение кольца. См. Рис. 2
Слева вверху станут видны команды панели «Главная 2D — Рисование». Помещаем курсор мыши на команду «Мультилиния» нажимаем левую кнопку мыши, и не отпуская ее, тащим под команду «Кольцо» и только там отпускаем. Тоже самое делаем с командой «Стиль мультилиний». См. Рис. 3.
В результате на панели «Главная 2D — Рисование» появятся две новые команду. Нажимаем ОК. См. Рис. 4.
Таким образом, мы можем добавлять на «Ленту” любые команды.
Создание нового стиля мультилинии.
Мультилиния в Автокаде может быть использоваться в различных областях проектирования. В данной статье мы рассмотрим одну из них. Мы создадим мультилинию для прорисовки воздуховода (трубопровода).
Перейдите на вкладку «Главная», щелкните по надписи «Рисование» и выберите команду «Стиль мультилинии…». См. Рис. 5.
Откроется окно «Стиль мультилиний». Нажмите на кнопку «Создать». В окне «Создание стиля мультилинии» введите имя нового стиля («New») и нажмите кнопку «Продолжить». См. Рис. 6.
Откроется окно «Новый стиль мультилинии: NEW». Поставьте галочки напротив надписи отрезок, что замкнуть концы нашего воздуховода. Нажмите на кнопку «Добавить», чтобы добавить центральную линию. См. Рис. 7.
Выделите центральную линию, поменяйте цвет (Фиолетовый) и тип линии (Осевая) и нажмите ОК. См. Рис. 8.
Будет создан новый стиль мультилинии «NEW», образец которого можно посмотреть в нижней части окна. Нажмите на кнопку «Установить», чтобы сделать стиль мультилинии «NEW» текущим. Затем кнопку ОК. См. Рис. 9.
Добавление мультилинии в чертеж.
Теперь давайте нарисуем воздуховод диаметром 250 мм.
Выберите на панели команду «Мультилиния». См. Рис. 10.
Далее смотрим в командную строку: Выберите вначале «Расположение» , затем «Центр», чтобы при построении мы указывали центральную линию воздуховода. См. Рис. 11.
Затем выбираем «Масштаб», вводим 250 и нажимаем <Enter> (или пробел). См. Рис. 12.
Далее указываем несколько точек в рабочем окне Автокад. Команда нарисует нам воздуховод диаметром 250. См. Рис. 13.
Создавая различные стили мультилиний, можно найти множество применений этой без сомнения интересной функции. Но нам как программистам, хотелось бы создавать такие стили программным путем. В этом случаи, их можно будет включить в свои программы и с легкостью переносить с одного компьютера на другой.
Создание стиля мультилинии программным путем.
Откройте редактор Visual LISP (введите в командной строке VLIDE и нажмите <Enter>). Стиль мультилинии мы будем создавать при помощи функции entmakex, которая создает новый примитив или не графический объект по списку с данными. В общем случаи функция выглядеть так:
(entmakex <список>)
<список> - список точечных пар примитива или не графического объекта.
Для создания списка нам понадобятся DXF-коды стиля мультилиний. Давайте посмотрим их в справочной системе. См. Рис. 14.
Внимательно изучив DXF-коды, составляем следующий список:
'((0 . "MLINESTYLE")(102 . "{ACAD_REACTORS")(102 . "}") (100 . "AcDbMlineStyle") (2 . "VenK") (70 . 272) (3 . "Воздуховод") (51 . 1.5708) (52 . 1.5708) (71 . 3) (49 . 0.5) (62 . 256) (6 . "BYLAYER") (49 . 0.0) (62 . 6) (6 . "Осевая") (49 . -0.5) (62 . 256) (6 . "BYLAYER"))
В котором:
Код 0 – тип объекта; Код 102 – Группа реакторов; Код 100 – маркер подкласса (имеет вид «AcDb» + тип примитива); Код 2 – Имя стиля мультилинии; Код 70 – Стиль торцов. 272 (16+256) – говорит о том что концы мультилинии замкнуты отрезками; Код 3 – Описание стиля; Код 51 – угол наклона замыкающего отрезка в начале мультилинии в радианах (Пи/2 =1.5708 = 90 градусов); Код 52 – угол наклона замыкающего отрезка в конце мультилинии в радианах (Пи/2 =1.5708 = 90 градусов); Код 71 – количество линий. Код 49 – смещение линии. Код 62 – цвет линии. Код 6 – тип линии.
Коды 49, 62, и 6 задаются три раза, для каждой линии отдельно.
При помощи setq cохраним наш список в переменной mlList. См. Рис. 15.
Теперь по этому списку мы должны создать новый стиль мультилинии и добавить его в словарь мультилиний Автокад.
Вначале давайте определим имя, которое Автокад присвоил словарю мультилиний.
Чтобы определить имя корневого словаря не графических объектов используем функцию
(namedobjdict)
Возвращает:
<Имя объекта: 7ef01c60>
Чтобы получить характеристики словаря мультилиний используем функцию dictsearch:
(dictsearch <словарь> <тип словаря>)
<словарь> - имя корневого словаря; <тип словаря> - тип словаря входящего в корневой словарь.
В нашем случаи:
(dictsearch (namedobjdict) «ACAD_MLINESTYLE»)
Возвращает: Список словаря мультилиний.
((-1 . < Имя объекта: 7ef01cb8>) (0 . "DICTIONARY") (5 . "17") (102 . "{ACAD_REACTORS") (330 . < Имя объекта: 7ef01c60>) (102 . "}") (330 . < Имя объекта: 7ef01c60>) (100 . "AcDbDictionary") (280 . 0) (281 . 1 )(3 . "NEW") (350 . < Имя объекта: 7ef035e0>) (3 . "Standard") (350 . < Имя объекта: 7ef01cc0>))
В этом списке хранится информация о всех созданных стилях мультилиний (DXF-код 3).
Чтобы извлечь элемент с DXF-кодом -1 ( с именем словаря мультилиний), используем функции assoc:
(assoc -1 (dictsearch (namedobjdict) "ACAD_MLINESTYLE"))
Возвращает: элемент с DXF-кодом -1
(-1 . < Имя объекта: 7ef01cb8>)
Чтобы избавиться от первого элемента точечной пары используем функцию cdr:
(cdr(assoc -1(dictsearch (namedobjdict) "ACAD_MLINESTYLE")))
Возвращает: имя словаря мультилиний
< Имя объекта: 7ef01cb8>
Сохраним имя словаря мультилиний в переменной mlDict:
(setq mlDict (cdr(assoc -1(dictsearch (namedobjdict) "ACAD_MLINESTYLE"))))
И наконец, создаем новый стиль:
(entmakex mlList)
mlList – список нового стиля мультилинии
И при помощи функции dictadd добавляем его в словарь мультилиний:
(dictadd mlDict "VenK" (entmakex mlList))
mlDict – имя словаря мультилиний; "VenK" - Имя нового стиля
Вставим выше сказанное в программу. См. Рис. 16.
Данный код создает стиль мультилинии и добавляет его в словарь мультилиний.
Чтобы не возникало ошибок, при добавление стиля, который уже есть в словаре, нам необходимо провести проверку наличия стиля в словаре:
Создадим точечную пару:
(cons 3 "VENK")
Возвращает:
(3 . "VENK")
Затем при помощи функции member проверим, если в Автокаде стиль с таким именем:
(member (cons 3 «VENK») (dictsearch (namedobjdict) «ACAD_MLINESTYLE»))
Если (3 . «VENK») нет в списке словаря мультилиний (dictsearch (namedobjdict) «ACAD_MLINESTYLE»), то функция member вернет nil
Если есть, то функция member вернет остаток списка, начиная и указанного элемента.
Таким образом, если функция member
возвращает nil — нам нужно добавить новый стиль,
если список – стиль добавлять не надо.
При помощи функции if добавим условия проверки на nil:
(if (= nil (member (cons 3 "VENK") (dictsearch (namedobjdict) "ACAD_MLINESTYLE"))) <Выражения> )
Поскольку выражений несколько, добавляем функцию progn
(if (= nil (member (cons 3 "VENK") (dictsearch (namedobjdict) "ACAD_MLINESTYLE"))) (prong <Выражения> ) )
<Выражения> - выражения, которые будут выполнены в случаи, если функция member возвратит nil.
Добавляем выше сказанное. См. Рис. 17.
Выделите весь текст программы и нажмите «Загрузить выделенных фрагмент».
Перейдите в Автокад. Нажмите на кнопку «Стили мультилиний». Откроется окно «Стили мультилиний», в котором появился новый стиль «VENK». См. Рис. 18.
Вернемся в редактор Visual LISP и при помощи функции defun преобразуем нашу программу в пользовательскую функцию:
В начале программы добавим строку, в которой придумаем имя новой команды (SMLK) и перечислим все временные переменные:
(defun SMLK (/ mlDict mlList) <наша программа> ) ; end_defun
В конце программы добавим закрывающую скобку.
Не забудьте сохранить программу.
Окончательный вариант программы см. Рис. 19.
Что вызвать нашу пользовательскую функцию, используем имя функции в скобках:
(SMLK)
И в заключении давайте напишем небольшую программу, вставляющую в чертеж мультилинию.
LISP программа добавления мультилинии.
Программу будем создавать в этом же файле, где наша пользовательская функция.
Вначале просим пользователя ввести размер воздуховода:
(setq Di (getreal "\nВведите размер воздуховода :"))
Сохраняем его в переменной Di.
Затем просим указать начальную и конечную точки воздуховода:
(setq p1 (getpoint "\nУкажите первую точку:")) (setq p2 (getpoint "\ nУкажите вторую точку:" p1))
Сохраняем их в переменных р1 и р2.
При помощи пользовательской функции добавляем новый стиль мультилинии:
(SMLK)
Запоминаем текущий стиль мультилинии и сохраняем его в переменной Cml:
(setq Cml (getvar "CMLSTYLE"))
Делаем текущим наш стиль:
(setvar "CMLSTYLE" "VenK")
Добавляем мультилинию:
(command "_mline" "_J" "_Z" "_S" Di p1 p2 "")
"_mline" – стандартная команда Автокад (мультилиния); "_J" – вызываем запрос расположения направляющей линии; "_Z" – указываем расположение по центру; "_S" – вызываем запрос масштаба мультилинии; Di – размер масштаба; p1 p2 – координаты начальной и конечной точек; "" – имитирует нажатие <Enter>.
Возвращаем первоначальный стиль мультилинии:
(setvar "CMLSTYLE" Cml)
При помощи функции defun преобразуем нашу программу в команду Автокад:
В начале программы добавим строку, в которой придумаем имя новой команды (Vml) и перечислим все временные переменные:
(defun c:Vml (/ Di p1 p2 Cml) <наша программа> ) ; end_defun
В конце программы добавим закрывающую скобку.
В результате получим программу команды добавления мультилинии. См. Рис. 20.
Нажмите кнопку «Загрузить активное окно редактора», перейдите в Автокад.
Введите в командной строке «Vml» и нажмите <Enter>.
На запрос «Введите размер воздуховода :» – вводим 200, нажимаем <Enter>.
Указываем две точку и программа построит воздуховод указанного размера. См. Рис. 21.
Дальнейшим развитием программы может быть:
- Создание диалогового окна для быстрого ввода стандартных размеров;
- Добавление дополнительных данных в мультилинию;
- Чтение дополнительных данных для выноски или составления спецификации и т.д.
Постепенно программу можно превратить в отличного помощника, который будет экономить Вам время.
Если Вам интересны, какие либо направления развитие этой программы пишите о них в комментариях. Рассмотрим их в следующих уроках.
Если у Вас появились вопросы, задавайте.
Я с удовольствием отвечу.
Также пишите в комментариях:
Была ли для Вас полезной информация, данная в этом уроке?
На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?
Ваши мнения очень важны для меня.
Хотите получать информацию о выходе новых статей. Оформляйте подписку.
До новых встреч.
«Автор: Михаил Орлов»
Спасибо за очередной отличный урок! У меня на работе, никто хорошо не знает автокад, не говоря уже о программировании, приходиться всему учиться самому. Благодаря вашим урокам сдвинулся с мертвой точки в пути по изучению лиспа. Было бы отлично написать простенькую программку по отрисовке воздуховодов. В будущих уроках был бы рад увидеть каким образом проще отрисовать стандартные отводы 45, 90 итп, строить их внутри программы, или вставлять готовый блок и подрезать мультилинии? Пока не знаю как правильно ориентировать отвод при вставке его блоком в зависимости от угла поворота. Каким путем лучше добавить информацию о типоразмере прямоугольного воздуховода для дальнейшей возможности подсчета длин по сортаменту? Как лучше написать функцию для вставки опусков или подъемов, переходов, например при вводе команды О90/П90 пользователем с клавиатуры или ввода отличного размера воздуховода.
Спасибо за внимание!
Спасибо! ОЧень познавательно!!!
А где посмотреть ВСЕ Свойства Мультитилиний
И как вообще программно поизвращаться с мультилинией, например изменить Координаты одного из ползунков или, еще лучше — Как добавить еще один новый ползунок и возможно ли это без создания новой Млинии на основе имеющейся считыванием координат всех ползунков + добавление координат нового ползунка?
Посмотреть свойства: Выделите мультилинию и нажмите на клавиатуре «Ctrl+1»
Смотрите другие примеры с использование мультилинии:
http://acad-prog.ru/avtomatizatsiya-proektirovaniya/
Редактирование мультилинии в самом конце статьи:
http://acad-prog.ru/avtomatizatsiya-proektirovaniya-otvod/
А можно ли, поменять вес отдельных линий, например оссевая 0,13, крайние 0,3?
К сожалению, все линии могут быть только одной толщины.
Здравствуйте, Михаил! Спасибо за ваши уроки!
Вопрос заключается в следующем, Можно ли создать в редакторе Visual LISP, как и в данном уроке, стили мультилиний с добавлением их на чертеж, но при построении отрезка мультилинии определенной длины, прямо на этом отрезке присутствовал, например знак «+», который можно перемещать по всему отрезку мультилинии и при нажатии на который можно было бы сделать «врезку (вставку) в виде прямоугольника» или «другого стиля мультилинии». При этом при нажатии на знак «+» появлялся бы выпадающий список, в котором можно было бы выбрать определенные виды врезаемых отрезков (участков) , например трубы стальные или ПНД со своим диаметром, длиной и указанием их глубины укладки (переменные величины, например 0,7м и 0,9м) . Далее после добавления «врезок» на отрезке мультилинии, итогом был бы вывод данных «атрибутов» строительных длин этих участков, общей длины всех линий, включенных в стиль мультилинии и общая длина труб.
Задача не простая. Но так как я ее понял, я бы скорее всего использовал ни мультилинию,а динамический блок с возможность перемещения и изменения параметров врезки. Параметры изменялись бы путем изменения атрибутов блока.
Здравствуйте, у меня такой вопрос, делаю по аналогии с примером, программу, построения призмы с использованием диалогового окна. Столкнулся с такой проблемой, пытаюсь считать с поля в диалоговом окне значение в переменную, а потом построить точку на какое-то расстояние, от первой точки, у меня ошибка «; ошибка: неверный тип аргумента: stringp nil»
(setq dcl_id (load_dialog "F:\lab2.DCL"))
(if (not (new_dialog "s_tart" dcl_id))(exit))
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq ddi (start_dialog))
(unload_dialog dcl_id)
(setq H (atoi (get_tile "Pir_h")))
(action_tile "Pir_h" )
(defun lab(p1)
(setq p1 (getpoint "\n Укажите точку" ))
(setq p2( polar p1 0 H))
(command "_line" p1 p2 "")
)
(if (= ddi 1) (lab Raz)
Присвоение переменной значение из диалогового окна
Лучше осуществлять в момент нажатия клавиши ОК
Сделайте функцию:
(defun reH ( / )
(setq H (atoi (get_tile "Pir_h")))
)
И вставьте ее в нажатие ОК:
Спасибо огромное. У меня вопрос такой: как рисовать мультилинию, что бы получилось как полевая и лесная дорога 1:2000 масштаба.
Я не знаю как выглядит полевая, лесная дорога. Пришлите пример на почту: acadprog@gmail.com
Спасибо за урок. А как можно нарисовать мультилинию по списку координат, а не по двум точкам? В каком виде эти координаты присвоить переменной?
p1, p2, p3 — координаты точек
У меня есть некий сплайн с множеством вершин, мне нужно изменить программно (в коде лисп) координаты некоторых вершин сплайна. Как это сделать? Заранее благодарен.