Мультилиния в Автокаде.

На мой взгляд, разработчики незаслуженно убрали команду мультилиния  из последних версий  Автокад. Этот инструмент многофункционален и может быть использован в различных областях проектирования. При помощи мультилинии мы можем создавать многослойные стены в архитектуре, рисовать дороги, трубопроводы системы отопление  и теплоснабжения, воздуховоды  систем вентиляции.

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

Итак, в этой уроке мы рассмотрим следующее:

Добавление команды «Мультилиния» на ленту.

Перейдите на вкладку «Управление»  выберите команду «Пользовательский интерфейс». См. Рис. 1.

Автокад

Рис. 1.  Команда «Пользовательский интерфейс».

Откроется окно «Адаптация  пользовательского интерфейса».

Щелкните [+] напротив надписи «Лента». Зачем по [+] напротив  «Вкладки», по [+] напротив  «Главная 2D»  и выберите строку  «Главная 2D — Рисование».

Справа вверху появится панель инструментов «Главная 2D — Рисование».

Чтобы найти команду «Мультилиния», слева внизу в окне «Список команд» набираем «мультилин». Ниже появятся команды, которые мы и поместим на панель  «Главная 2D — Рисование».

Справа вверху щелкните на изображение кольца. См. Рис. 2

Автокад

Рис. 2. Окно «Адаптация пользовательского интерфейса».

Слева вверху станут видны команды панели «Главная 2D — Рисование». Помещаем курсор мыши на команду «Мультилиния» нажимаем левую кнопку мыши, и не отпуская ее, тащим под команду «Кольцо» и только там отпускаем. Тоже самое делаем с командой «Стиль мультилиний». См. Рис. 3.

Автокад

Рис. 3. Добавляем команды на па панель инструментов.

В результате на панели «Главная 2D — Рисование» появятся две новые команду. Нажимаем ОК. См. Рис. 4.

Автокад

Рис. 4. Новые команды на панели инструментов.

Таким образом, мы можем добавлять на «Ленту” любые команды.

Создание нового стиля мультилинии.

Мультилиния в Автокаде может быть использоваться в различных областях проектирования. В данной статье мы рассмотрим одну из них. Мы создадим мультилинию для прорисовки воздуховода (трубопровода).

Перейдите на вкладку «Главная», щелкните по надписи «Рисование» и выберите команду «Стиль мультилинии…». См. Рис. 5.

Автокад

Рис. 5. Команда «Стиль мультилинии…».

Откроется окно «Стиль мультилиний». Нажмите на кнопку «Создать». В окне «Создание стиля мультилинии» введите имя нового стиля («New») и нажмите кнопку «Продолжить». См. Рис. 6.

Автокад

Рис. 6. Окно «Стиль мультилиний»

Откроется окно «Новый стиль мультилинии: NEW». Поставьте галочки напротив надписи отрезок, что замкнуть концы нашего воздуховода. Нажмите на кнопку «Добавить», чтобы добавить  центральную линию. См. Рис. 7.

Автокад

Рис. 7. Создание нового стиля мультилинии.

Выделите центральную линию, поменяйте цвет (Фиолетовый) и тип линии (Осевая) и нажмите ОК. См. Рис. 8.

Автокад

Рис. 8.  Изменяем цвет и тип линии.

Будет создан новый стиль мультилинии «NEW», образец которого можно посмотреть в нижней части окна. Нажмите на кнопку «Установить», чтобы сделать стиль мультилинии «NEW» текущим. Затем кнопку ОК. См. Рис. 9.

Автокад

Рис. 9. Новый стиль мультилинии.

Добавление мультилинии в чертеж.

Теперь давайте нарисуем воздуховод диаметром 250 мм.

Выберите на панели команду «Мультилиния». См. Рис. 10.

Автокад

Рис. 10. Команда «Мультилиния».

Далее смотрим в командную строку: Выберите вначале «Расположение» , затем «Центр», чтобы при построении мы указывали центральную линию воздуховода. См. Рис. 11.

Автокад

Автокад

Рис. 11. Расположение направляющей линии.

Затем выбираем «Масштаб», вводим 250 и нажимаем <Enter> (или пробел). См. Рис. 12.

Автокад

Автокад

Рис. 12. Задаем масштаб мультилинии.

Далее указываем несколько точек в рабочем окне Автокад. Команда нарисует нам воздуховод диаметром 250. См. Рис. 13.

Автокад

Рис. 13. Воздуховод диаметром 250.

Создавая различные стили мультилиний, можно найти множество применений этой без сомнения интересной функции. Но нам как программистам, хотелось бы создавать такие стили программным путем.  В этом случаи, их можно будет включить в свои программы и с легкостью переносить с одного компьютера на другой.

Создание стиля мультилинии программным путем.

Откройте редактор Visual LISP (введите в командной строке VLIDE и нажмите <Enter>). Стиль мультилинии мы будем создавать при помощи функции entmakex, которая создает новый примитив или не графический объект по списку с данными. В общем случаи функция выглядеть так:

(entmakex <список>)
<список> - список точечных пар примитива или не графического объекта.

Для создания списка нам понадобятся DXF-коды стиля мультилиний. Давайте посмотрим их в справочной системе. См. Рис. 14.

Автокад

Рис. 14. Справка MLINESTYLE (DXF).

Внимательно изучив 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.

Visual LISP

Рис. 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.

Visual LISP

Рис. 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.

Visual LISP

Рис. 17. Проверка наличия стиля в словаре.

Выделите весь текст программы и нажмите «Загрузить выделенных фрагмент».

Перейдите в Автокад. Нажмите на кнопку «Стили мультилиний». Откроется окно «Стили мультилиний», в котором появился новый стиль «VENK». См. Рис. 18.

Автокад

Рис. 18. Новый стиль в окне «Стили мультилиний»

Вернемся в редактор Visual LISP и при помощи функции defun преобразуем нашу программу в пользовательскую функцию:

В начале программы добавим строку, в которой придумаем имя новой команды (SMLK) и перечислим все временные переменные:

(defun SMLK (/ mlDict mlList)
   <наша программа>
) ; end_defun

В конце программы добавим закрывающую скобку.

Не забудьте  сохранить программу.

Окончательный вариант программы см. Рис. 19.

Visual LISP

Рис. 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.

Visual LISP

Рис. 20. Программа добавления мультилинии.

Нажмите кнопку «Загрузить активное окно редактора», перейдите в Автокад.

Введите в командной строке «Vml» и нажмите <Enter>.

На запрос «Введите размер воздуховода :» – вводим 200, нажимаем <Enter>.

Указываем две точку и программа построит воздуховод указанного размера. См. Рис. 21.

Автокад

Рисю 21. Воздуховод.

Дальнейшим развитием программы может быть:

  • Создание диалогового окна для быстрого ввода стандартных размеров;
  • Добавление дополнительных данных в мультилинию;
  • Чтение дополнительных данных для выноски или составления спецификации и т.д.

Постепенно программу можно превратить в отличного помощника, который будет экономить  Вам время.

Если Вам интересны, какие либо направления развитие этой программы пишите о них в комментариях. Рассмотрим их в следующих уроках.

Если у Вас появились вопросы, задавайте.

Я с удовольствием отвечу.

Также пишите в комментариях:

Была ли для Вас полезной информация, данная в этом уроке?

На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?

Ваши мнения очень важны для меня.

Хотите получать информацию о выходе новых статей. Оформляйте подписку.

До новых встреч.

«Автор: Михаил Орлов»

Также на эту тему Вы можете почитать:

15 комментарии на “Мультилиния в Автокаде.

  1. Антон 18.02.2015 16:48

    Спасибо за очередной отличный урок! У меня на работе, никто хорошо не знает автокад, не говоря уже о программировании, приходиться всему учиться самому. Благодаря вашим урокам сдвинулся с мертвой точки в пути по изучению лиспа. Было бы отлично написать простенькую программку по отрисовке воздуховодов. В будущих уроках был бы рад увидеть каким образом проще отрисовать стандартные отводы 45, 90 итп, строить их внутри программы, или вставлять готовый блок и подрезать мультилинии? Пока не знаю как правильно ориентировать отвод при вставке его блоком в зависимости от угла поворота. Каким путем лучше добавить информацию о типоразмере прямоугольного воздуховода для дальнейшей возможности подсчета длин по сортаменту? Как лучше написать функцию для вставки опусков или подъемов, переходов, например при вводе команды О90/П90 пользователем с клавиатуры или ввода отличного размера воздуховода.

    Спасибо за внимание!

  2. releyshic 04.07.2015 13:42

    Спасибо! ОЧень познавательно!!!
    А где посмотреть ВСЕ Свойства Мультитилиний
    И как вообще программно поизвращаться с мультилинией, например изменить Координаты одного из ползунков или, еще лучше — Как добавить еще один новый ползунок и возможно ли это без создания новой Млинии на основе имеющейся считыванием координат всех ползунков + добавление координат нового ползунка?

  3. Максим 23.07.2015 08:58

    А можно ли, поменять вес отдельных линий, например оссевая 0,13, крайние 0,3?

    • Михаил Орлов 23.07.2015 20:32

      К сожалению, все линии могут быть только одной толщины.

  4. Павел 19.06.2016 20:31

    Здравствуйте, Михаил! Спасибо за ваши уроки!
    Вопрос заключается в следующем, Можно ли создать в редакторе Visual LISP, как и в данном уроке, стили мультилиний с добавлением их на чертеж, но при построении отрезка мультилинии определенной длины, прямо на этом отрезке присутствовал, например знак «+», который можно перемещать по всему отрезку мультилинии и при нажатии на который можно было бы сделать «врезку (вставку) в виде прямоугольника» или «другого стиля мультилинии». При этом при нажатии на знак «+» появлялся бы выпадающий список, в котором можно было бы выбрать определенные виды врезаемых отрезков (участков) , например трубы стальные или ПНД со своим диаметром, длиной и указанием их глубины укладки (переменные величины, например 0,7м и 0,9м) . Далее после добавления «врезок» на отрезке мультилинии, итогом был бы вывод данных «атрибутов» строительных длин этих участков, общей длины всех линий, включенных в стиль мультилинии и общая длина труб.

    • Михаил Орлов 23.06.2016 10:06

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

  5. Алексей 05.11.2016 08:49

    Здравствуйте, у меня такой вопрос, делаю по аналогии с примером, программу, построения призмы с использованием диалогового окна. Столкнулся с такой проблемой, пытаюсь считать с поля в диалоговом окне значение в переменную, а потом построить точку на какое-то расстояние, от первой точки, у меня ошибка «; ошибка: неверный тип аргумента: 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)

    • Михаил Орлов 05.11.2016 19:41

      Присвоение переменной значение из диалогового окна

      (setq H (atoi (get_tile "Pir_h")))

      Лучше осуществлять в момент нажатия клавиши ОК
      Сделайте функцию:
      (defun reH ( / )
      (setq H (atoi (get_tile "Pir_h")))
      )

      И вставьте ее в нажатие ОК:

      (action_tile "accept" "(reH) (done_dialog 1)")
  6. Руслан 06.04.2017 21:50

    Спасибо огромное. У меня вопрос такой: как рисовать мультилинию, что бы получилось как полевая и лесная дорога 1:2000 масштаба.

    • Михаил Орлов 19.04.2017 15:33

      Я не знаю как выглядит полевая, лесная дорога. Пришлите пример на почту: acadprog@gmail.com

  7. Дмитрий 23.08.2017 01:38

    Спасибо за урок. А как можно нарисовать мультилинию по списку координат, а не по двум точкам? В каком виде эти координаты присвоить переменной?

    • Михаил Орлов 23.08.2017 12:11
      (setq p1 (getpoint "\nУкажите точку начала построения: "))
      (setq p2 (mapcar '+ (list 1000 1000 0) p1))
      (setq p3 (mapcar '+ (list 1000 0 0) p2))
      (command "_mline" p1 p2 p3 "")

      p1, p2, p3 — координаты точек

  8. Павел 09.07.2019 20:12

    У меня есть некий сплайн с множеством вершин, мне нужно изменить программно (в коде лисп) координаты некоторых вершин сплайна. Как это сделать? Заранее благодарен.

    • Михаил Орлов 04.09.2019 14:48
      (vl-load-com)  
      (while(not(setq ent (car(entsel "\nУкажите сплайн или нажмите Esc : ")))))  
      (setq vla_obj (vlax-ename->vla-object ent))
      ;----------- Список координат управляющих точек -----
      (setq sp_Cpoints (vlax-safearray->list(vlax-variant-value(vla-get-ControlPoints vla_obj))))
      (setq kc (length sp_points))
      ;----------- Список координат опорных точек ---------
      (setq sp_Fpoints (vlax-safearray->list(vlax-variant-value(vla-get-FitPoints vla_obj))))  
      (setq kf (length sp_Fpoints))
      ;------- Изменение списка опорных точек -------------
      (setq sp_new nil)
      (setq i 0)
      (setq np 1)
      (repeat (/ kf 3)
        (setq x (nth i sp_Fpoints))
        (setq y (nth (+ i 1) sp_Fpoints))
        (setq z (nth (+ i 2) sp_Fpoints))
      
        (if (eq np 1)
          (progn
            (setq x (+ x 100))	
          ); progn
        ); end if
        
        (setq sp_new (append sp_new (list x y z)))          
      
        (setq i (+ i 3))
        (setq np (+ np 1))
      ); end repeat
      ;-------------------------------------------
      ;------------- Редактирования сплайна ------
      (setq saf_ar (vlax-make-safearray vlax-vbDouble (cons 1  kf)))
      (setq var_coord (vlax-make-variant (vlax-safearray-fill saf_ar sp_new)))
      (vla-put-FitPoints vla_obj var_coord)
      (vla-update vla_obj)
      ;-------------------------------------------

Оставить комментарий

Ваш mail не будет опубликован.

Вы можете использовать HTML теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>