Продолжаем тему 3D моделирование в AutoCAD.
В этом уроке мы программным методом построим Болт с резьбой.
При создании болта в программе будем использовать стандартные команды Автокад.
Для примера мы построим болт М16.
В конце статьи смотрите видео к этому уроку.
Запустите AutoCAD.
Откройте редактор Visual LISP: Введите в командной строке «VLIDE» (или «VLISP») и нажмите <Enter>.
Создайте новый файл.
В начале, для лучшей наглядности и более простому указанию элементов болта переведем чертеж ЮЗ изометрию при помощи стандартной команды Автокад «_-view«:
(command "_-view" "_swiso")
Затем добавим исходные данные, для построения головки болта:
Добавим переменную raz_g, в которой будет хранить размер под ключ:
(setq raz_g 24)
Переменную h_g, в которой будет хранить высоту головки болта:
(setq h_g 10)
И переменную fas_g, в которой будет хранить размер фаски головки болта:
(setq fas_g 3.055)
Затем добавляем запрос базовой точки, от которой мы начнем наши построения:
(getpoint "\nУкажите базовую точку : ")
Координаты базовой точки сохраняем в переменной bp:
(setq bp (getpoint "\nУкажите базовую точку : "))
См. Рис. 1.
Для того чтобы текущие привязки не влияли на построения их надо на время отключить. Добавим следующие строки:
(setq osm (getvar "osmode")) - запоминает текущие 2d привязки; (setq osm3 (getvar "3dosmode")) - запоминает текущие 3d привязки;
Затем строки:
(setvar "osmode" 0) - отключает 2d привязки. (setvar "3dosmode" 0) - отключает 3d привязки.
И в конце программы вернем привязки установленные пользователем:
(setvar "osmode" osm) - возвращает 2d привязки. (setvar "3dosmode" osm3) - возвращает 3d привязки.
См. Рис. 2.
Теперь приступим непосредственно к построению:
В начале постоим шестигранник при помощи стандартной команды «_polygon»:
(command "_polygon" 6 bp "_c" (/ raz_g 2))
Command – функция, которая запускает стандартные команды Автокад; "_ polygon " – стандартная команда Автокад (многоугольник); 6 – количество сторон многоугольника; bp – Координаты базовой точки; "_c" – построение по внутреннему радиусу (по окружности вписанной в многоугольник); (/ raz_g 2) – размер внутреннего радиуса (размер под ключ делим на 2).
Выделите текст, как показано на рисунке и нажмите на кнопку «Загрузить выделенный фрагмент». См. Рис. 3.
Программа переедет в Автокад. На запрос: «Укажите базовую точку: » Укажите любую точку в рабочем окне Автокад. Программа построит шестигранник. См . Рис. 4.
Далее при помощи команды «Выдавить» («_extrude«) построим головку болта:
(command "_extrude" (entlast) "" h_sh)
"_extrude" – стандартная команда Автокад (выдавить); (entlast) – объект, который мы выдавливаем (функция entlast возвращает имя последнего построенного примитива. А это наш шестигранник); "" – означает окончание выбора объектов (имитирует нажатие клавиши <Enter>); h_sh – высота выдавливания (высота головки болта).
Добавьте эту строку в программу выделите ее и нажмите на кнопку «Загрузить выделенный фрагмент». См. Рис. 5.
Перейдите в Автокад. Программа построила головку болта. См. Рис. 6.
Запомним наш последний построенный примитив в переменной 3dgon:
(setq 3dgon (entlast))
Теперь нам нужно сделать фаску на головке болта. Для этого нужно сначала построит режущий треугольник. Первая точка треугольника будет расположена на окружности описывающей наш шестигранник. Определим радиус этой окружности и сохраним его в переменной r1
(setq r1 (/ (/ raz_g 2) (sin (/ pi 3)))), где
(/ raz_g 2) – радиус вписанной окружности (половина от размера под ключ); (sin (/ pi 3)) – синус 60 градусов.
Чтобы определить координаты первой точки, используем функцию mapcar:
(mapcar '<функция> <список1> <список2>))
Функцию mapcar поочередно применяет <функцию> сначала к первым элементам списков, затем ко втором и так далее. В результате образуется новый список, который и является возвращаемым значением. В нашем случаи я к списку координат базовой точки р1 прибавляю список, который изненит координату X на значение r1
(mapcar '+ (list r1 0 0) bp)
Координаты первой точки сохраняем в переменной р1:
(setq p1 (mapcar '+ (list r1 0 0) bp))
Координаты второй точки определяем относительно первой, путем изменения координаты Х на размер фаски fas_g:
(setq p2 (mapcar '+ (list (-fas_g) 0 0) p1))
Известно, что углы фаски составляют 60 и 30 градусов. Чтобы найти расстояние между первой и третьей точками, умножим размер фаски на котангенс 60 градусов
(* fas_g (/ (cos (/ pi 3)) (sin (/ pi 3)))), где
fas_g – размер фаски; (/ (cos (/ pi 3)) (sin (/ pi 3))) – котангенс 60 градусов (cos 60 делим на sin 60).
Значение расстояния сохраняем в переменной а1:
(setq a1 (* fas_g (/ (cos (/ pi 3)) (sin (/ pi 3)))))
Координаты третьей точки определяем относительно первой, путем изменения координаты Z на расстояние а1:
(setq p3 (mapcar '+ (list 0 0 a1) p1))
Все точки определены, строим треугольник при помощи 3D полилинии:
(command "_3dpoly" p1 p2 p3 p1 "")
"_3dpoly" - стандартная команда Автокад (3д полилиния); p1 p2 p3 p1 – координаты точек; "" – окончание построения полилинии (имитирует нажатие клавиши <Enter>).
Добавьте эти строки в программу, выделите их нажмите на кнопку «Загрузить выделенный фрагмент». См. Рис. 7.
Перейдите в Автокад. Программа построила нужный треугольник. См. Рис. 8.
Запомним наш последний построенный примитив в переменной 3dp:
(setq 3dp (entlast))
Теперь, давайте построим фигуру вращения, вращая наш треугольник вокруг оси параллельной оси Z и проходящей через базовую точку bp:
Найдем вторую точку оси относительно bp, изменив координаты Z на 10:
(setq bpo (mapcar '+ (list 0 0 10) bp))
Строим фигуру вращения:
(command "_REVOLVE" 3dp "" bp bpo 360)
"_REVOLVE" - стандартная команда Автокад (Вращать); 3dp – полилиния режущий треугольник; "" – означает окончание выбора объектов (имитирует нажатие клавиши <Enter>); bp bpo – точки оси вращения; 360 – угол вращения 360 градусов.
Добавьте строки в программу, выделите их нажмите на кнопку «Загрузить выделенный фрагмент». См. Рис. 9.
Перейдите в Автокад. Программа построила фигуру вращения. См. Рис. 10.
Давайте вычтем нашу фигуру вращения и головки болта:
(command "_subtract" 3dgon "" (entlast) "")
"_subtract" - стандартная команда Автокад (Вычитание); 3dgon – головка болта; "" – означает окончание выбора объектов (имитирует нажатие клавиши <Enter>); (entlast) – вычитаемый объект (последний примитив фигура вращения); "" – означает окончание выбора объектов для вычитания.
Добавьте эту строку в программу, выделите ее нажмите на кнопку «Загрузить выделенный фрагмент». См. Рис. 11.
Перейдите в Автокад. Программа сделала на головке фаску. См. Рис. 12.
Запомним наш последний построенный примитив (головку с фаской) в переменной 3dsh:
(setq 3dsh (entlast))
Теперь, давайте приступим к построению стержня болта и резьбы на нем.
Зададим исходные данные:
(setq d_s 8) – диаметр стержня; (setq h_s 60) – высота стержня; (setq dl_r 48) – длина резьбы; (setq sh_r 2) – шаг резьбы.
Определим радиус стержня:
(setq r_s (/ d_s 2))
На верхней поверхности головке рисуем круг:
(command "_circle" bpo r_s), где
"_ circle " - стандартная команда Автокад (Круг); bpo – центр круга; r_s - радиус стержня.
Далее при помощи команды «Выдавить» («_extrude») построим стержень болта:
(command "_extrude" (entlast) "" h_s)
"_extrude" – стандартная команда Автокад (выдавить); (entlast) – объект, который мы выдавливаем (последний примитив - круг); "" – означает окончание выбора объектов (имитирует нажатие клавиши <Enter>); h_s – высота выдавливания (высота стержня болта).
Добавьте строки в программу, выделите их нажмите на кнопку «Загрузить выделенный фрагмент». См. Рис. 13.
Перейдите в Автокад. Программа построила стержень болта. См. Рис. 14.
Давайте объединим стержень и головку болта в единый 3D объект:
(command "_union" 3dsh (entlast) "")
"_ union" – стандартная команда Автокад (объединить); 3dsh – головка болта; (entlast) – последний построенный примитив (стержень болта); "" – означает окончание выбора объектов (имитирует нажатие клавиши <Enter>).
Запомним наш последний построенный примитив (3D болт) в переменной 3db:
(setq 3db (entlast))
Определим точку на кромке (кромка — линия соединения головки и стержня):
(setq pk (polar bpo (* 5 (/ pi 4)) r_s)) – определяет координаты точки pk отстоящей от точки bpo на расстояние r_s в направлении угла образующем с осью Х угол (* 5 (/ pi 4)) - 225 градусов.
Создадим сопряжение стержня и головки:
(command "_filletedge" "_r" 1 pk "" "")
"_ filletedge" – стандартная команда Автокад (Сопряжение по кромке); "_r" – вызываем запрос радиуса сопряжения; 1 – значение радиуса сопряжения; pk – точка принадлежащая кромке; "" – означает окончание выбора (имитирует нажатие клавиши <Enter>).
Добавьте строки в программу, выделите их нажмите на кнопку «Загрузить выделенный фрагмент». См. Рис. 15.
Перейдите в Автокад. Программа построила сопряжение стержня и головки. См. Рис. 16.
Теперь создадим фаску на конце стержня:
Определим точку на кромке конца стержня относительно точки нижней кромки, изменив координаты Z на высоту стержня h_s:
(setq pkn (mapcar '+ (list 0 0 h_s) pk))
Построим фаску:
(command "_CHAMFEREDGE" "_d" sh_r sh_r pkn "" "")
"_ CHAMFEREDGE" – стандартная команда Автокад (Фаска по кромке); "_d" – вызываем запрос расстояний фаски; sh_r - расстояние фаски по ширине (= шаг резбы) sh_r - расстояние фаски по высоте (= шаг резбы) pkn – точка принадлежащая кромке; "" – означает окончание выбора (имитирует нажатие клавиши <Enter>).
Добавьте строки в программу, выделите их нажмите на кнопку «Загрузить выделенный фрагмент». См. Рис. 17.
Перейдите в Автокад. Программа построила фаску на конце стержня. См. Рис. 18.
Приступим к построению резьбы.
Определим количество витков резьбы и сохраним его в переменной kol_v:
(setq kol_v (/ dl_r sh_r))
dl_r - длина резьбы; sh_r – шаг резбы.
Всю резьбу разделим на две части:
Основная резьба – kol_v минус 2 витка
Нисходящая резьба – 2 витка.
Определим точки начала резьбы:
Координаты нижней точки Нисходящая резьбы определяем относительно bpo, путем изменения координаты Z на размер равный разности высоты стержня h_s и длины резьбы dl_r:
(setq ps1 (mapcar '+ (list 0 0 (- h_s dl_r)) bpo))
Координаты нижней точки основной резьбы расположены на два витка выше относительно ps1:
(setq ps2 (mapcar '+ (list 0 0 (* 2 sh_r)) ps1))
Строим пружину для основной резьбы:
(command "_HELIX" ps2 r_s r_s "_t" kol_v "_h" sh_r "")
"_ HELIX" – стандартная команда Автокад (Пружина); ps2 – точка начала пружины; r_s – нижний радиус пружины; r_s – верхний радиус пружины; "_t" – вызываем запрос количества витков; kol_v – количество витков; "_h" – вызываем запрос шага витков; sh_r – шаг витков (шаг резбы); "" – имитирует нажатие клавиши <Enter>.
Добавьте строки в программу, выделите их нажмите на кнопку «Загрузить выделенный фрагмент». См. Рис. 19.
Перейдите в Автокад. Программа построила пружину Основной резьбы. См. Рис. 20.
Вид спереди выглядит так. См. Рис. 21.
Запомним наш последний построенный примитив (пружина) в переменной spir1:
(setq spir1 (entlast))
Строим пружину для Нисходящей резьбы:
((command "_HELIX" ps1 (+ r_s (* 1.5 sh_r)) r_s "_t" 2 "_h" sh_r "")
"_ HELIX" – стандартная команда Автокад (Пружина); рs1 – точка начала пружины; (+ r_s (* 1.5 sh_r)) – нижний радиус пружины увеличиваем на 1,5 шага резьбы; r_s – верхний радиус пружины; "_t" – вызываем запрос количества витков; 2 – количество витков; "_h" – вызываем запрос шага витков; sh_r – шаг витков (шаг резбы); "" – имитирует нажатие клавиши <Enter>.
Добавьте строки в программу, выделите их нажмите на кнопку «Загрузить выделенный фрагмент». См. Рис. 22.
Перейдите в Автокад. Программа построила пружину Нисходящей резьбы. См. Рис. 23.
Вид спереди выглядит так. См. Рис. 24.
Запомним наш последний построенный примитив (пружина) в переменной spir2:
(setq spir2 (entlast))
Давайте объедим прижины:
(command "_join" spir1 spir2 "")
"_join" – стандартная команда Автокад (соединить); spir1 – Основная пружина; spir2 – Нисходящая пружина; "" – означает окончание выбора объектов (имитирует нажатие клавиши <Enter>).
Теперь нам нужно построить режущий равносторонний треугольник. Размер его стороны будет равен:
(- sh_r 0.2) – шаг резьбы минус 0.2
Расположить его нужно, как показано на рис. 25.
Давайте определим координаты точки pt1 относительно точки ps1:
Координата Х изменится на величину нижнего радиуса, который равен (+ r_s (* 1.5 sh_r) плюс 0.2. Сохраним значение в переменной is_X
(setq is_X (+ r_s (* 1.5 sh_r) 0.2))
Координата Z изменится на половину длины стороны треугольника. Сохраним значение в переменной is_Z
(setq is_Z (/ (- r_sh 0.2) 2))
Координаты точки pt1:
(setq pt1 (mapcar '+ (list is_X 0 is_Z) ps1))
Определим координаты точки pt2 относительно точки pt1:
(setq pt2 (mapcar '+ (list 0 0 (- 0.2 sh_r)) pt1))
Для определения координат точки pt3, в начале определим высоту треугольника и сохраним ее в переменной vis:
(setq vis (* (- 0.2 sh_r) (sin (/ pi 3))))
Определим координаты точки pt3 относительно точки pt2:
(setq pt3 (mapcar '+ (list vis 0 is_Z) pt2))
Все точки определены, строим треугольник при помощи 3D полилинии:
(command "_3dpoly" pt1 pt2 pt3 pt1 "")
"_3dpoly" - стандартная команда Автокад (3д полилиния); pt1 pt2 pt3 pt1 – координаты точек; "" – окончание построения полилинии (имитирует нажатие клавиши <Enter>).
Добавьте эти строки в программу, выделите их нажмите на кнопку «Загрузить выделенный фрагмент». См. Рис. 26.
Перейдите в Автокад. Программа построила режущий треугольник. См. Рис. 27. Вид спереди.
Запомним наш последний построенный примитив (режущий треугольник) в переменной 3dp:
(setq 3dp (entlast))
Теперь при помощи стандартной команды «Сдвиг» будет стоит 3d объект треугольником вдоль всей пружины. Но вначале определим координаты точки начала пружины относительно точки ps1:
(setq bps (mapcar '+ (list (+ r_s (* 1.5 sh_r)) 0 0) ps1))
И координаты точки конца пружины относительно точки ps2:
(setq pts (mapcar '+ (list r_s 0 dl_r) ps2))
Строим 3d объект при помощи команды «Сдвиг»:
(command "_sweep" 3dp "" "_b" bps pts)
"_ sweep" – стандартная команда Автокад (Сдвиг); 3dp – режущий треугольник; "" – означает окончание выбора объектов (имитирует нажатие клавиши <Enter>); bps – точка начала пружины; pts – точка конца пружины;
Добавьте эти строки в программу, выделите их нажмите на кнопку «Загрузить выделенный фрагмент». См. Рис. 28.
(команда «Сдвиг» в зависимости от мощности компьютера может занять несколько секунд)
Перейдите в Автокад. Программа построила 3D объект при помощи «Сдвига». См. Рис. 29.
Нам остается лишь вычисть последний построенный объект из 3d болта:
(command "_subtract" 3db "" (entlast) "")
"_subtract" - стандартная команда Автокад (Вычитание); 3db – болт; "" – означает окончание выбора объектов (имитирует нажатие клавиши <Enter>); (entlast) – вычитаемый объект (последний примитив фигура построенная сдвигом); "" – означает окончание выбора объектов для вычитания.
Добавьте эту строку в программу, выделите строки как показано на рис. 30 нажмите на кнопку «Загрузить выделенный фрагмент».
Перейдите в Автокад. Программа построила резьбу. См. Рис. 31.
Давайте посмотрим болт в другом визуальном стили. Например: в Концептуальном. Нажмите на надпись 2D каркас с лева в верхнем углу рабочего окна Автокад. И выберите «Концептуальный». См. Рис. 32.
Вид 3D болта в Концептуальном стиле. См. Рис. 33
Вид 3D болта спереди. См. Рис. 34
Давайте при помощи функции defun преобразуем нашу программу в команду Автокад:
В начале программы добавим строку, в которой придумаем имя новой команды (3d_bolt) и перечислим все временные переменные:
(defun c:3d_bolt (/ raz_g h_g fas_g bp osm osm3 3dgon r1 p1 p2 a1 p3 3dp bpo 3dsh d_s h_s dl_r sh_r r_s 3db pk pkn kol_v ps1 ps2 spir1 spir2 is_X is_Z pt1 pt2 vis pt3 bps pts) <наша программа> ) ; end_defun
В конце программы добавим закрывающую скобку.
Не забудьте сохранить программу.
Окончательный вариант программы см. Рис. 35.
Теперь чтобы загрузить нашу программу нажимаем на кнопку «Загрузить активное окно редактора».
Чтобы запустить нашу новую команду (3d_bolt) :
Перейдите в AutoCAD. В командной строке наберите 3d_bolt и нажмите клавишу <Enter>.
На запрос: «Укажите базовую точку :». Укажите любую точку в рабочем окне AutoCAD. Программа построит 3D болт.
Если к этой программе, дополнительно, создать диалоговое окно, в котором будут задаваться основные параметры болта см. Рис. 36.
то программа будет, за считанные секунды, создавать 3D болты с другими параметрами.
Затем для быстрого выбора стандартных болтов можно создать таблицу Excel, в которой указать типы болтов и их основные параметры. См. Рис. 37.
Подключить эту таблицу к форме, и для ввода параметров стандартного болта достаточно будет выбрать тип болта в пункте «Выберите болт».
Пример такой программы приведен в конце видео.
Смотрите видео к этому уроку:
На этом наш урок окончен. Надеюсь, что эта статья оказалось кому-то полезной, и 3D моделирование в AutoCAD, стало для Вас более быстрым и комфортным.
Вы можете бесплатно скачать LISP программу создания 3D болта с резбой:
Скачать программу 3d_bolt.lsp (Размер файла: 1.02 kB)
Если у Вас появились вопросы, задавайте их в комментариях.
Я с удовольствием отвечу.
Также пишите в комментариях или мне на почту:
Была ли для Вас полезной информация, данная в этом уроке?
На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?
Ваши мнения очень важны для меня.
Если вы хотите получать новости с моего сайта. Оформляйте подписку.
До новых встреч.
«Автор: Михаил Орлов»
Здравствуйте. При создании болта по данному алгоритму столкнулся со следующей проблемой: при сопряжении стержня и головки болта (грань сопряжения указывается посредством точки «pk»), если текущим стоит стиль «Реалистичный» или «Концептуальный», (не 2d-каркас), то автокад не может определить грань сопряжения и сопрягает не те что нужно грани. Та же проблема возникает, если на чертеже, куда вставляется болт, уже начерчено много объектов, и вставляемый болт получается на экране «маленьким» (т.е. не на весь экран). Автокад так же промахивается при выборе грани и сопрягает не то, что нужно. Я вышел из положения, нарисовав окружность в точке bpo
(command «_circle» bpo (/ raz_g 2))
потом зумировал чертеж по данной окружности
(command «_zoom» «_o» (entlast) «»)
сделал текущим визуальный стиль 2d-каркас
(command «_vscurrent» «_2»)
удалил вспомогательную окружность
(command «_erase» (entlast) «»)
и только потом сопрягал грани по точке pk
Я знал об этих проблемах и решил их приблизительно так же как Вы. Текст окончательного варианта программы я не публиковал. В конце видео присутствует лишь ее демонстрация.
Мне хотелось чтобы, это заметил кто нибудь без моей помощи. Поздравляю Вас, этим человеком оказались Вы. Вы не только заметили, но и дали свой вариант решения.
«Затем для быстрого выбора стандартных болтов можно создать таблицу Excel. Подключить эту таблицу к форме» (с) А каким образом подключить? И как извлечь данные из Excel в список? Спасибо.
Это тема отдельного урока. К сожалению, я об этом пока не писал.
Очень ждем-с. А где сейчас можно об этом прочесть не подскажите? Справочник или самоучитель.
Да, очень хочется почитать или посмотреть о подключении таблицы exel к диалоговому окну. 🙂
А как нарисовать болт с потайной головкой?
Добрый день.
Пытаюсь построить болт с резьбой простыми командами Автокада, без Lisp.
Строю основную спираль, затем нисходящую. После, пытаюсь командой »union» объединить две спирали в одну, указывая в качестве объектов одну и вторую спираль, нажимаю энтер.
Команда не работает. Спирали остаются сами по себе, два разных объекта.
Что делаю не так?
Попробуйте вместо команды
"union"
команду"_join"
Спасибо. Сработало.