Построение параметрической модели детали в среде программирования
Министерство образования и науки Республики Казахстан
Карагандинский Государственный Технический Университет
Кафедра
Систем автоматизированного проектирования
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе
Тема: "Построение параметрической модели детали в среде программирования "
Руководитель
Студент
2009
Содержание
1. Задание
2. Графическая система КОМПAС-3D
3. Язык программирования AutoLisp в среде AutoCAD
3.1 Техническое требования
4. Построение параметрической модели детали на основе AutoLisp
4.1Структура работы программы
4.2 Определение базовых размеров
4.3 Определение контрольных точек
4.4 Отрисовка детали
4.5 Простановка размеров
4.6 Построение трехмерной модели детали
Результаты работы программы
Заключение
Список использованных источников
Приложение
1. Задание
1. Написать программу построения двумерного изображения детали согласно заданию.
2. Написать программу построения трехмерного изображения детали согласно заданию.
3. Сравнение и обоснование выбора средства параметрического моделирования.
2. Графическая система КОМПAС-3D
Система КОМПАС-3D предназначена для создания трехмерных ассоциативных моделей отдельных деталей и сборочных единиц, содержащих как оригинальные, так и стандартизованные конструктивные элементы. Параметрическая технология позволяет быстро получать модели типовых изделий на основе однажды спроектированного прототипа. Многочисленные сервисные функции облегчают решение вспомогательных задач проектирования и обслуживания производства.
Ключевой особенностью КОМПАС-3D является использование собственного математического ядра и параметрических технологий, разработанных специалистами АСКОН.
Основная задача, решаемая системой - моделирование изделий с целью существенного сокращения периода проектирования и скорейшего их запуска в производство. Эти цели достигаются благодаря возможностям:
быстрого получения конструкторской и технологической документации, необходимой для выпуска изделий (сборочных чертежей, спецификаций, деталировок и т.д.),
передачи геометрии изделий в расчетные пакеты,
передачи геометрии в пакеты разработки управляющих программ для оборудования с ЧПУ, создания дополнительных изображений изделий (например, для составления каталогов, создания иллюстраций к технической документации и т.д.).
Средства импорта/экспорта моделей (КОМПАС-3D поддерживает форматы IGES, SAT, XT, STEP, VRML) обеспечивают функционирование комплексов, содержащих различные CAD/CAM/CAE системы.
Моделирование изделий в КОМПАС-3D можно вести различными способами: "снизу вверх" (используя готовые компоненты), "сверху вниз" (проектируя компоненты в контексте конструкции), опираясь на компоновочный эскиз (например, кинематическую схему) либо смешанным способом. Такая идеология обеспечивает получение легко модифицируемых ассоциативных моделей.
Система обладает мощным функционалом для работы над проектами, включающими несколько тысяч подсборок, деталей и стандартных изделий. Она поддерживает все возможности трехмерного твердотельного моделирования, ставшие стандартом для САПР среднего уровня.
3. Язык программирования AutoLisp в среде AutoCAD
Широкие возможности системы AutoCAD позволяют использовать ее как инструмент создания автоматизированных рабочих мест для специалистов различных направлений. Система является наиболее распространенной у нас и за рубежом и постоянно развивается.
Даже те, кто знаком с системой AutoCAD, не многие осознают, что AutoCAD не является конечным продуктом. Прежде всего, AutoCAD - средство создания прикладных программ. И основным, но далеко не единственным, средством создания прикладных систем в AutoCAD является язык программирования AutoLisp.
Язык AutoLisp был создан в 1962 году профессором Стенфордского университета Дж. Маккарти для решения задач искусственного интеллекта и является родоначальником функциональных языков. В настоящее время существует огромное количество версий языка. AutoLisp - это созданный специально для системы AutoCAD диалект Lisp, полученный в результате изменения языка XLISP. Все вычисления, преобразования и управления программы в функциональных языках осуществляются с помощью элементарных встроенных функций или функций, определенных пользователем при написании программ. Программа в целом является суперпозицией некоторых функций и. в свою очередь, может быть использована как функция другими программами. Язык LISP идеально подошел для системы AutoCAD, т.к. имеет удобные средства работы с глубоко структурированной информацией. При этом AutoLisp прост в изучении и весьма гибок.
Использование языка AutoLisp не только значительно ускоряет процесс разработки проектной документации в AutoCAD, но и позволяет создавать в этой среде новые команды графического редактора и специализированные меню, осуществлять доступ к графической базе данных и модернизировать ее, разрабатывать функции для решения самых разнообразных задач и, кроме того, создавать эффективные системы и подсистемы, связанные с обработкой информации, представленной в виде символов и чисел.
В настоящее время AutoLisp (в модернизированном виде Visual LISP) встроен в систему AutoCAD и имеет ряд средств для облегчения и ускорения разработки программ.
Исходя из выше изложенного, для своей работы я выбрала язык программирования AutoLisp, так как он является самым удобным и универсальным средством для построения параметрических моделей. Он прост в использовании, что позволило легко добиться нужного результата.
3.1 Техническое требования
Общие требования.
Выбор технического обеспечения обуславливается следующими основными параметрами:
Производительность. Комплекс технических средств должен удовлетворять требованиям, предъявляемым программным обеспечением;
Стоимость. Выбор компьютерной техники осуществляется из расчета экономической эффективности и уменьшения затрат на техническое обеспечение для разработанного проекта;
Качество. Данный параметр является связующим звеном между производительностью и стоимостью и должен обеспечивать комфортную и бесперебойную работу комплекса технических средств.
Комплекс технических средств должен быть построен на базе ПЭВМ IBM PC или совместимых с ней.
В качестве средств программной обработки данных следует использовать ПЭВМ с процессором типа Intel Celeron (либо Intel Pentium) с тактовой частотой не менее 500 МГц.
В качестве запоминающего устройства, в котором реализуются преобразования данных и программное управление процессами, должна использоваться оперативная память. Ее объем должен позволять использовать базовую операционную систему, допускающую реализацию прикладных программ, и составлять, как минимум, 64 Мбайт.
В качестве устройства для подготовки и ввода данных необходима клавиатура (клавишное устройство). С ее помощью осуществляется ввод команд пользователя, обеспечивающих доступ к ресурсам ПЭВМ; ввод и корректировка данных; ввод команд в процессе диалога человека с ПЭВМ. Для облегчения общения с машиной рекомендуется наличие манипулятора - мыши.
Для отображения информации, выводимой во время работы, необходим монитор с разрешающей способностью не менее 1024x768 и поддержкой отображения 16,5 млн. цветовых оттенков.
Центральный процессор.
Центральный процессор должен обеспечивать удовлетворительную работу операционной системы Windows 98/2000/XP, среды разработки проекта (AutoCAD) и самого проекта. В связи с этим для разрабатываемой системы рекомендуется использовать процессор Pentium IV, обладающий достаточной производительностью, надежностью, низкой стоимостью и низким энергопотреблением. В сравнении с процессором CeleronTM1.7 ГГц обладает большей кэш-памятью.
Надежность процессора Intel Pentium обеспечивается более чем многолетним опытом корпорации Intel по созданию микропроцессоров высочайшего качества и надежности.
Материнская плата.
Материнская плата должна поддерживать выбранный процессор и иметь слот S-478 под процессор. Исходя из этого, сравним две материнские платы. Первая из них: MSI S-6580 845PE Neo Socket 478 i845PE AGP 2DDR Audio ATA100 USB2.0 ATX Retail. Вторая: Asus P4P800 VM, чипсет Intel 865G, Socket 478, FSB 800MHz (HT), ATA133 + SATA, 4xDDR3200, SVGA, AGP 8x, 6ch. AC'97, LAN, ATX.
Основой материнской платы MS-6580 845PE Neo послужил набор системной логики Intel 845PE. Вследствие наличия процессорного разъема Socket 478 эта модель материнской платы позволяет использовать процессоры Intel Celeron и Intel Pentium 4. Слот AGP 4x, оборудованный удобным фиксатором, дает возможность устанавливать 1,5-вольтовые графические платы расширения с интерфейсом AGP 4x. Плата MSI S-6580 поддерживает работу четырёх портов USB 2.0, для чего используются возможности интегрированного в микросхеме контроллера-концентратора ввода-вывода USB-контроллера. В качестве звукового кодека использована микросхема Realtek ALC650, поддерживающая два выходных стереоканала. Для установки плат расширения предусмотрено шесть 32-битных слотов PCI 2.2 и один CNR-слот.
После всего оговоренного остановимся в своем выборе на материнской плате Asus P4P800 VM. Она организована на базе чипсета Intel 845E. В этом чипсете использован новый контроллер-концентратор ввода-вывода (I/O Controller Hub) 82801DB (ICH 4), который, помимо всех функциональных возможностей своего предшественника ICH 2, поддерживает новые спецификации популярных интерфейсов (главное новшество - поддержка шести портов USB 2.0).
Все ведущие производители материнских плат поспешили представить новые модели своих продуктов, построенные на базе чипсетов, поддерживающих высокоскоростную системную шину процессора Intel Pentium 4.
Оперативная память.
Оперативное запоминающее устройство (ОЗУ). Для общесистемного программного обеспечения необходимо ОЗУ с размером 64 Мбайт. Учитывая то, что данный вид памяти уже не производится, и то, что при увеличении объема ОЗУ в два раза, почти на столько же увеличивается производительность персонального компьютера, выбираем Kingston Technology 128MB Module (DDR DIMM 128 Mb; 168 pin; PC 2700МHz), согласно техническим характеристикам материнской платы Asus P4P800 VM.
Можно сравнить выбранную с подобной ей - Viking Components 128MB Module. Однако последняя, согласно рейтингу, менее популярна и менее надежна. В технологии фирмы Kingston традиционно используется позолота ножек микросхем. Это значительно повышает надежность работы изделий данной фирмы, так как отсутствует окисление и пропадание контакта.
DDR - Double Data Rate SDRAM - память с удвоенной скоростью обмена данными. Другое обозначение этого типа памяти - SDRAM II (т.е. SDRAM второго поколения). По принципам работы она похожа на SDRAM, но, в отличие от нее, может принимать и передавать данные на обоих фронтах тактовых импульсов. Это удваивает скорость передачи данных. Кроме того, в DDR RAM используется протокол DLL (Delay Locked Loop), позволяющий сдвинуть во времени интервал действительного значения выходных данных. Таким образом, сокращаются простои системной шины при считывании данных на нее из нескольких модулей памяти.
Видеоадаптер.
Типовой размер видеопамяти для современных компьютеров зависит от назначения компьютера.
По современным параметрам видеокарта должна обеспечивать частоту обновления экрана не менее 75 МГц.
Для более эффективной работы всего программного обеспечения выбираем видеокарту A97 Radeon 9500 Pro, обладающую большой надежностью и большим объемом памяти.
Монитор.
Если на других компонентах компьютера мы можем как-то сэкономить, то на мониторе экономить не следует. Он по-прежнему самый дорогой компонент компьютерной системы, его нельзя модернизировать в процессе эксплуатации, и "время жизни" у него наибольшее по сравнению со всеми другими компонентами.
Именно посредством монитора мы воспринимаем всю визуальную информацию от компьютера. Неважно, работаем ли мы с офисной программой, рисуем, играем, пишем письма или находимся в Интернете - монитор нам необходим всегда. Кроме того, от качества и безопасности монитора напрямую зависит наше здоровье.
Для работы рекомендуется использовать мониторы ЭЛТ (электронно-лучевая трубка) с диагональю не менее 17".
На сегодняшний день мониторы ЭЛТ имеют следующие преимущества:
текст выглядит лучше (особенно при малом размере точек);
цвета натуральнее и точнее;
отлаженная технология обеспечивает лучшее соотношение стоимости и эксплуатационных качеств.
Следовательно, такие мониторы можно рекомендовать для универсального применения и домашнего использования.
Рассмотрим два типа мониторов фирмы LG и фирмы Samsung.
Монитор Samsung имеет большее максимальное разрешение экрана и большую полосу пропускания видео-сигнала.
Окончательно для вывода алфавитно-цифровой и графической информации на экран выбираем монитор Samsung 757DFX, с разрешающей способностью 1024х768, точкой растра 0,20 мкм, диагональю 17” и поддерживающий стандарт безопасности ТСО’99.
Жесткий диск.
В настоящее время минимальным объемом памяти на жестком диске считается 20 Гб.
Рассмотрим для примера два жестких диска: IC35L036UCD210 (фирма IBM) и IC25N020ATMR04 (фирма Hitachi из серии Travelstar 80 GN).
Объем диска. Первым и главным параметром любого винчестера является, конечно же, количество информации, который способен хранить ваш винчестер. Еще недавно эта емкость измерялась в мегабайтах, однако реальная величина сегодня составляет до сотни гигабайт! Надо сказать, что разница в цене между винчестерами на порядок меньше их разницы в объеме - переплатив всего лишь 30%, вы можете приобрести винчестер вдвое большей емкости. Тем не менее, для нашего проекта большая емкость будет излишняя. Поэтому делаем выбор в пользу накопителя IC25N020ATMR04.
Скорость чтения данных и спецификация. Как ни странно, на этот параметр редко обращают внимание при покупке - считая, что скорости у любого современного винчестера большой емкости практически одинаковы. Однако на деле разница доходит до 20%, что, согласитесь, не так уж и мало. Средний сегодняшний показатель - около 10-15 Мбайт/с. В нашем выбранном варианте это будет составлять - 32,5 Мбайт/с.
Среднее время доступа. Тоже достаточно важный показатель. Измеряется в миллисекундах и обозначает то время, которое необходимо диску для доступа к любому выбранному вами участку. Средний показатель - 7-9 мс. В нашем выбранном варианте это будет составлять - 12 мс.
Скорость вращения диска. Показатель, напрямую связанный со скоростью доступа и скоростью чтения данных. Принято считать, что покупать сегодня винчестеры со скоростью вращения меньше 5400 об/мин просто не имеет смысла, 7200 об/мин - сегодняшний стандарт, ну а 10 000 об/мин (планка, впервые взятая IBM) - это просто идеал! Существует, правда, и другая точка зрения. Некоторые специалисты утверждают, что чрезмерные скорости вращения диска на самом деле не слишком убыстряют чтение данных. А вот на надежность хранения информации и срок службы винчестера влияют куда более ощутимо...
Иными словами, чем выше скорость вращения шпинделя дисковода, тем больше его производительность (скорость записи и считывания данных), но выше цена и сильней нагрев.
Выбранный нами НЖМД имеет скорость вращения шпинделя 4200 оборотов в минуту, что будет вполне достаточно для разработки и использования нашего проекта.
Размер кэш-памяти. Кэш-память - быстрая "буферная" память небольшого объема, в которую компьютер помещает наиболее часто используемые данные. Она есть у процессоров, она есть у материнских плат. Но ведь собственной кэш-памятью оборудован и жесткий диск! Ее размер у современных моделей винчестеров колеблется в диапазоне от 2 Мбайт до 8 Мбайт (у большинства современных винчестеров размер кэш-памяти составляет 2 Мбайт). Нетрудно понять, что чем кэш больше, тем быстрее и стабильнее работает жесткий диск...
Принимаем жесткий диск IC25N020ATMR04 емкостью 20 Гб, с частотой вращения 4200об/мин, средним временем поиска 12 мс. Эти значения являются следствием разумного компромисса между производительностью и стоимостью.
Клавиатура.
Особых требований к клавиатуре нет, выбираем стандартную клавиатуру со 101 клавишей с разъёмом PS/2 (Genius Comfy KB-10X).
Мышь.
Мышь - это манипулятор для компьютера. Выбираем мышь по параметрам цены и качества, которым соответствуют мыши Genius NetScroll+PS/2.
4. Построение параметрической модели детали на основе AutoLisp
4.1Структура работы программы
П
остроение
двумерной модели детали
Построение трехмерной модели детали
4![](images/image-3eb109eb-108.gif)
![](images/image-3eb109eb-108.gif)
![](images/image-3eb109eb-108.gif)
![](images/image-m4295b764.gif)
.2
Определение базовых размеров
Для построения двумерной модели детали использовались следующие основные базовые размеры для определения формы детали:
Д
ля
ввода данных, определяющих основные
размеры использовались функция ввода:
(getreal “текст запроса-подсказки”) - ввод вещественного числа с клавиатуры.
Для исключения наиболее очевидных ошибочных ситуаций использовалась функция:
(initget флаг строка) - задание ключевых слов и ограничений ввода для get-функций, действие функции распространяется только на одну следующую за ней get-функцию.
Аргумент <флаг> функции iinitget - это битовый флаг, который должен быть целым числом (от 0 до 255), являющимся суммой битов с соответствующими из них весовыми значениями (нумеруются по степеням числа 2). Если бит не установлен, то его значение в битовом флаге считается равным нулю.
В данном курсовом проекте использовалась функция (initget 6) - разрешен пустой ввод, но не разрешены ввод нуля и ввод отрицательных чисел (6=2+4).
Также были использованы:
1. Условная конструкция (if (условие) (выражение1) (выражение2))
Типы аргументов: любые.
Если условие истинно, то выполняется выражение1, иначе - выражение2.
2. Функция
(while (условие) (выражение1) (выражение2) … (выражениеN)), которая задает цикл по многократно повторяющемуся условию.
4.3 Определение контрольных точек
Для указания координат точек применялись следующие функции:
1. Функция присваивания
(setq переменная 1 (выражение 1)
переменная 2 (выражение 2) …
переменная N (выражение N))
Функция setq может использоваться с любым количеством аргументов, которое должно быть обязательно четным и не менее 2. В качестве аргументов переменная могут использоваться любые символы (имена) AutoLisp, не занятые в наименованиях функций. В качестве аргументов могут использоваться выражения AutoLisp, имена переменных или константы (например, числа).
2. Списки - основные структуры данных, используемые в программировании на языке AutoLisp. Чаще всего списки используются для определения координат точек.
Списки создаются функцией list:
(list элемент1 элемент2 … элементN)
В качестве аргументов элементы, из которых образуется список, могут выступать любые объекты, которыми оперирует AutoLisp. В качестве элементов списка могут выступать другие списки, а также переменные и выражения AutoLisp. Функция list возвращает последний элемент списка, причем список не должен быть равным nil.
Со списками выполняют операции следующие функции:
(car список) - извлечение первого элемента списка или точечной пары;
(cadr список) - извлечение из списка подсписка путем удаления первого элемнта.
4.4 Отрисовка детали
Для построения чертежа детали использовались следующие функции:
(command “имя команды" параметр1 … параметрN)
Функция command воспринимает все сопутствующие операнды так, будто они введены в командную строку. Все константы, являющиеся параметрами функции command, задаются как текстовые строки (в кавычках), даже если они являются числами или координатами точек. Любой параметр функции command можно заменить на имя переменной или выражение AutoLisp. Данный параметр примет значение, равное значению переменной или результату значения выражения.
Таким образом, в проекте были использованы следующие команды:
(command "line" “точка1” “точка2" "") - построение линии;
(command "circle" “центр окружности” “радиус”) - построение окружности;
(command "layer" "опции") - работа со слоями;
(command "array" объекты "" "тип массива" “базовая точка" "количество элемнтов" "угол заполнения" "") - построение массива;
(command "osnap" "обозначение привязки") - включение определенного вида привязки;
(command "trim" выделяемые секущие стороны "" объекты для отсечения "") - отсечение по границе;
(command "erase" объекты "") - удаление объектов;
(command "fillet" "r" "радиус сопряжения")
(command "fillet" объект1 объект2 "") - сопряжение;
(command "lengthen" "de" "величина" объект "") - изменяет размер объекта на заданную величину;
(command "bhatch" "p" "ansi31" "0.5" "0" точка "") - штриховка объекта через указание точки внутри замкнутой области;
(entlast) - извлечение последнего построенного примитива.
4.5 Простановка размеров
Для простановки размеров использовались следующие команды:
(command "dimlinear" p1 p2 p3) - линейный размер, где p1, p2 - начальная и конечная точка на объекте; p3 - точка расположения размерной линии;
(command "dimdiameter" p1 p2) - диаметральный размер, где p1- точка на окружности или дуге; p2 - точка расположения размерной линии;
(command "dimradius" p1 p2) - радиальный размер, где p1 - точка на окружности или дуге; p2 - точка расположения размерной линии;
(command "dimangular" p1 p2 p3) - угловой размер, где p1 - точка на первом объекте; p2 - точка на втором объекте; p3 - точка расположения размерной линии.
Для создания размерного стиля использовались следующие команды:
(command "style" "имя стиля" "шрифт" "высота" эффекты) - создание и настройка нового текстового стиля (стиль назначается текущим);
(command "dimstyle" "s" "имя стиля" "y") - сохранение созданного стиля;
(command "dimstyle" "r" "имя стиля") - активизация стиля;
Использовалась функция (setvar “имя” значение). Она меняет значение соответствующей системной переменной.
В данном курсовом проекте была использована системная переменная DI MTXSTY - текстовый стиль для разеров.
4.6 Построение трехмерной модели детали
Для построения трехмерной модели детали использовались следующие команды:
(command "region" объекты "") - объединение объектов в регион;
(command "extrude" объекты "" высота "") - выдавливание объекта;
(command "sub>tract" p1 "" p2 "") - вычитание одного объекта из другого, где p1 - объект, из которого вычитают; p2 - объект, который вычитают;
(command "elev" высота "") - указание уровня;
(command "union" объекты "") - сложение объектов;
(command "shademode" опции "") - закрашивание детали.
Результаты работы программы
Построение двумерного изображения детали
Заключение
В данном курсовом проекте были поставлены следующие задачи:
изучить принципы создания параметрических моделей;
изучить язык программирования AutoLisp;
написать программу построения двумерного изображения детали с простановкой размеров;
написать программу построения трехмерного изображения детали.
В ходе данной работы все поставленные задачи были выполнены.
Практическую ценность проделанной работы вижу в том, что:
во-первых, мною был получен опыт создания параметрических моделей;
во-вторых, мной были изучены основы языка AutoLisp, что дает мне возможность для дальнейшего совершенствования своих знаний.
Список использованных источников
1. Райц Н.Р., Лимарева И.Г. Методические указания по выполнению курсового проекта по дисциплине "Компьютерная графика и геометрическое моделирование". - КарГТУ, 2005.
2. Воевода Е.П., Райц Н.Р., Лимарева Н.Г. Учебное пособие по работе в системе AutoCAD 2000. - КарГТУ, 2004.
3. Воевода Е.П., Райц Н.Р., Лимарева Н.Г. Геометрическое моделирование в системе AutoCAD 2000. - КарГТУ, 2006.
Приложение
(Листинг программы)
Построение двумерного изображения детали
(defun c: mod2d (/ d1 d2 d3 w1 w2 w3 r1 r2 r3)
(command "erase" "all" "")
(command "ortho" "on")
(setvar "cmdecho" 1)
(command "limits" "0,0" "210,297")
(command "grid" "10")
(command "snap" "1")
(command "osnap" "off")
(command "layer" "m" "osn" "l" "continuous" "osn" "lw" "0.3" "osn" "")
(command "layer" "m" "osev" "l" "center" "osev" "lw" "0.05" "osev" "")
(command "layer" "m" "vsp" "l" "continuous" "vsp" "lw" "0.05" "vsp" "")
(command "_. regen")
(command "view" "t")
(setvar "lwdisplay" 1)
(command "layer" "s" "osn" "")
(setq d1 0)
(while (or (< d1 35) (> d1 45))
(initget 6)
(setq d1 (getreal "Введите наибольший диаметр детали <40>"))
(if (= d1 nil) (setq d1 40)))
(setq d2 0)
(while (or (< d2 26) (> d2 37))
(initget 6)
(setq d2 (getreal " Введите средний диаметр детали <32>"))
(if (= d2 nil) (setq d2 32)))
(setq d3 0)
(while (or (< d3 15) (> d3 25))
(initget 6)
(setq d3 (getreal " Введите наименьший диаметр детали <20>"))
(if (= d3 nil) (setq d3 20)))
(setq w1 0)
(while (or (< w1 17) (> w1 27))
(initget 6)
(setq w1 (getreal " Введите максимальную ширину детали <22>"))
(if (= w1 nil) (setq w1 22)))
(setq w2 0)
(while (or (< w2 10) (> w2 20))
(initget 6)
(setq w2 (getreal " Введите расстояние от верха детали до конца среднего кольца <15> "))
(if (= w2 nil) (setq w2 15)))
(setq w3 0)
(while (or (< w3 5) (> w3 15))
(initget 6)
(setq w3 (getreal " Введите высоту верхнего кольца детали <10>"))
(if (= w3 nil) (setq w3 10)))
(setq r1 0)
(while (or (< r1 65) (> r1 75))
(initget 6)
(setq r1 (getreal "Введите диаметр, проходящий через центр фигуры и центр отверстий <70>"))
(if (= r1 nil) (setq r1 70)))
(setq r2 0)
(while (or (< r2 2) (> r2 12))
(initget 6)
(setq r2 (getreal " Введите диаметр маленьких отверстий детали <7>"))
(if (= r2 nil) (setq r2 7)))
(setq r3 0)
(while (or (< r3 3) (> r3 13))
(initget 6)
(setq r3 (getreal " Введите радиус сопряжения детали <8>"))
(if (= r3 nil) (setq r3 8)))
(setq x (list 150 150))
(command "layer" "s" "osev" "")
(setvar "ltscale" 4)
(setq h (+ (/ r1 2) (/ d1 2) r3 r3))
(setq c1 (/ d1 2))
(setq c2 (/ d2 2))
(setq c3 (/ d3 2))
(setq os1 (list ( - 150 c1 3) 150)
os2 (list (+ 150 c1 3) 150)
os3 (list ( - 150 (/ h 2) 33 w1) 150)
os4 (list ( - 150 (/ h 2) 27) 150)
os5 (list 150 (+ 150 (/ r1 2) r3 3))
os7 (list 150 ( - 150 c1 r3 3)))
(command "line" os1 os2 "")
(command "line" os3 os4 "")
(command "line" os5 x "")
(setq l1 (entlast))
(command "line" x os7 "")
(setq n1 (entlast))
(command "layer" "s" "osn" "")
(command "circle" x c1)
(command "circle" x c2)
(command "circle" x c3)
(command "layer" "s" "osev" "")
(command "circle" x (/ r1 2))
(command "layer" "s" "osn" "")
(setq b1 (list 150 (+ 150 (/ r1 2))))
(command "circle" b1 (/ r2 2))
(setq kr1 (entlast))
(command "circle" b1 r3)
(setq kr2 (entlast))
(command "array" l1 kr1 kr2 "" "P" x "2" "-120" "")
(setq mas2 (entlast))
(command "array" l1 kr1 kr2 "" "P" x "2" "120" "")
(setq mas (entlast))
(command "osnap" "tan")
(setq t1 (list ( - 150 r3) (cadr b1)))
(setq t2 (list ( - 150 (/ r1 2) (/ r3 2)) ( - 150 c2)))
(command "line" t1 t2 "")
(setq l2 (entlast))
(setq t3 (list (car t2) ( - (cadr t2) r2)))
(setq t4 (list (+ 150 (/ r1 2) (/ r3 2)) (cadr t3)))
(command "line" t3 t4 "")
(setq l3 (entlast))
(setq t5 (list (+ 150 r3) (cadr b1)))
(setq t6 (list (car t4) (cadr t2)))
(command "line" t5 t6 "")
(setq l4 (entlast))
(command "trim" l2 l3 l4 "" kr2 mas2 mas "")
(command "erase" mas "" "")
(command "fillet" "r" "8")
(command "fillet" l2 l3 "")
(setq arc1 (entlast))
(command "trim" l3 "" n1 "")
(command "lengthen" "de" "3" n1 "")
(command "lengthen" "de" (+ 40 h) l3 "")
(command "osnap" "int")
(setq ss (list (car t3) ( - (cadr t3) 2)))
(setq os8 (list (car os4) (cadr b1)))
(setq os9 (list ( - (car os8) 6 ( - w1 w2)) (cadr b1)))
(command "layer" "s" "osev" "")
(command "line" os8 os9 "")
(command "layer" "s" "osn" "")
(setq k1 (list ( - (car os8) 3) (+ 150 ( - (/ r1 2) (/ r2 2)))))
(setq k2 (list ( - (car k1) ( - w1 w2)) (cadr k1)))
(command "line" k1 k2 "")
(setq k3 (list (car k1) (+ 150 (/ r1 2) (/ r2 2))))
(setq k4 (list (car k2) (cadr k3)))
(command "line" k3 k4 "")
(setq k5 (list (car k1) (+ 150 c3)))
(setq k6 (list ( - (car k1) w1) (cadr k5)))
(command "line" k5 k6 "")
(setq k7 (list (car k1) ( - 150 c3)))
(setq k8 (list (car k6) (cadr k7)))
(command "line" k7 k8 "")
(setq a1 (list (car k1) ( - 150 (/ r1 2))))
(setq a2 (list (car k2) (cadr a1)))
(setq a3 (list (car k2) ( - 150 c1)))
(setq a4 (list ( - (car k1) ( - w1 w3)) (cadr a3)))
(setq a5 (list (car a4) (cadr t2)))
(setq a6 (list (car k6) (cadr t2)))
(setq a7 (list (car k6) (+ 150 c2)))
(setq a8 (list (car a4) (cadr a7)))
(setq a9 (list (car a4) (+ 150 c1)))
(setq a10 (list (car k2) (cadr a9)))
(setq a11 (list (car k2) ( - (cadr os5) 3)))
(setq a12 (list (car k1) (cadr a11)))
(command "line" a1 a2 "")
(setq l5 (entlast))
(command "line" a2 a3 "")
(setq l6 (entlast))
(command "line" a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 "")
(command "line" a12 a1 "")
(setq l7 (entlast))
(command "trim" l7 l6 arc1 "" l3 "")
(command "trim" l7 l3 "" l7 l6"")
(command "erase" l5 "" "")
(command "trim" arc1 l7 "" ss "")
(setq m1 (list ( - (car os4) 4) (+ (cadr k1) 1)))
(setq m2 (list (car m1) (+ (cadr k3) 1)))
(setq m3 (list (car m1) ( - (cadr k7) 1)))
(command "layer" "s" "vsp" "")
(command "bhatch" "p" "ansi31" "0.5" "0" m1 "")
(command "bhatch" "p" "ansi31" "0.5" "0" m2 "")
(command "bhatch" "p" "ansi31" "0.5" "0" m3 "")
(command "style" "Марьяна" "isocpeur" "2.5" "1" "15" "n" "n" "y")
(setvar "dimtxsty" "Марьяна")
(command "dimstyle" "s" "Марьяна" "y")
(command "dimstyle" "r" "Марьяна")
(setq raz1 (list ( - 150 (/ h 2) w1 40) 150))
(setq raz2 (list ( - (car raz1) 7) 150))
(setq raz3 (list ( - (car raz1) 14) 150))
(setq raz4 (list (+ (car raz1) 10) ( - (cadr raz1) c2 10)))
(setq raz5 (list ( - 150 (/ h 2) ( - w1 w2) 40) ( - 150 c2 17)))
(setq raz6 (list (car raz4) ( - (cadr raz5) 7)))
(setq raz7 (list 150 ( - (cadr a11) r3)))
(setq raz8 (list (+ 150 c3) (cadr k5)))
(setq raz9 (list 145 (+ (cadr raz7) r3)))
(setq raz10 (list ( - 150 c3) (cadr a11)))
(setq raz11 (list 150 (+ 150 (/ r1 3))))
(setq raz12 (list (car t3) (cadr t3)))
(setq raz13 (list ( - 150 (/ r1 2) r3 10) 150))
(setq raz14 (list 150 (+ (cadr b1) (/ r2 2))))
(setq raz15 (list (car raz8) (+ (cadr b1) r3)))
(command "dimlinear" k7 k5 "m" "%%c<>" raz1)
(setq p_raz9 (osnap raz9 "nea"))
(setq p_raz14 (osnap raz14 "tan"))
(command "dimlinear" a5 a8 "m" "%%c<>" raz2)
(command "dimlinear" a3 a10 "m" "%%c<>" raz3)
(command "dimlinear" a5 k8 raz4)
(command "dimlinear" a3 k8 raz5)
(command "dimlinear" k7 k8 raz6)
(command "dimdiameter" raz7 raz8)
(command "dimradius" p_raz9 raz10)
(command "dimangular" raz11 raz12 raz13)
(command "dimradius" p_raz14 raz15)
(command "line" "20,5" "205,5" "")
(command "line" "205,5" "205,292" "")
(command "line" "205,292" "20,292" "")
(command "line" "20,292" "20,5" "")
(command "line" "20,60" "205,60" "")
(command "_. zoom" "e")
)
Построение трехмерного изображения детали
(defun c: mod3d (/ d1 d2 d3 w1 w2 w3 r1 r2 r3)
(command "erase" "all" "")
(setvar "cmdecho" 1)
(command "limits" "0,0" "210,297")
(command "snap" "1")
(command "layer" "m" "osn" "l" "continuous" "osn" "lw" "0.3" "osn" "")
(command "_. regen")
(command "view" "t")
(setvar "lwdisplay" 1)
(setq d1 0)
(while (or (< d1 35) (> d1 45))
(initget 6)
(setq d1 (getreal "Введите наибольший диаметр детали <40>"))
(if (= d1 nil) (setq d1 40)))
(setq d2 0)
(while (or (< d2 26) (> d2 37))
(initget 6)
(setq d2 (getreal " Введите средний диаметр детали <32>"))
(if (= d2 nil) (setq d2 32)))
(setq d3 0)
(while (or (< d3 15) (> d3 25))
(initget 6)
(setq d3 (getreal " Введите наименьший диаметр детали <20>"))
(if (= d3 nil) (setq d3 20)))
(setq w1 0)
(while (or (< w1 17) (> w1 27))
(initget 6)
(setq w1 (getreal " Введите максимальную ширину детали <22>"))
(if (= w1 nil) (setq w1 22)))
(setq w2 0)
(while (or (< w2 10) (> w2 20))
(initget 6)
(setq w2 (getreal " Введите расстояние от верха детали до конца среднего кольца <15> "))
(if (= w2 nil) (setq w2 15)))
(setq w3 0)
(while (or (< w3 5) (> w3 15))
(initget 6)
(setq w3 (getreal " Введите высоту верхнего кольца детали <10>"))
(if (= w3 nil) (setq w3 10)))
(setq r1 0)
(while (or (< r1 65) (> r1 75))
(initget 6)
(setq r1 (getreal "Введите диаметр, проходящий через центр фигуры и центр отверстий <70>"))
(if (= r1 nil) (setq r1 70)))
(setq r2 0)
(while (or (< r2 2) (> r2 12))
(initget 6)
(setq r2 (getreal " Введите диаметр маленьких отверстий детали <7>"))
(if (= r2 nil) (setq r2 7)))
(setq r3 0)
(while (or (< r3 3) (> r3 13))
(initget 6)
(setq r3 (getreal " Введите радиус сопряжения детали <8>"))
(if (= r3 nil) (setq r3 8)))
(setq x (list 150 150))
(setq h (+ (/ r1 2) (/ d1 2) r3 r3))
(setq c1 (/ d1 2))
(setq c2 (/ d2 2))
(setq c3 (/ d3 2))
(command "layer" "s" "osn" "")
(setq b1 (list 150 (+ 150 (/ r1 2))))
(command "circle" b1 (/ r2 2))
(setq kr1 (entlast))
(command "circle" b1 r3)
(setq kr2 (entlast))
(command "array" kr2 "" "P" x "2" "-120" "")
(setq mas2 (entlast))
(command "array" kr1 "" "P" x "2" "-120" "")
(setq mas22 (entlast))
(command "array" kr2 "" "P" x "2" "120" "")
(setq mas (entlast))
(command "array" kr1 "" "P" x "2" "120" "")
(setq mass (entlast))
(command "osnap" "tan")
(setq t1 (list ( - 150 r3) (+ 150 (/ r1 2))))
(setq t2 (list ( - 150 (/ r1 2) (/ r3 2)) ( - 150 c2)))
(command "line" t1 t2 "")
(setq l2 (entlast))
(setq t3 (list (car t2) ( - (cadr t2) r2)))
(setq t4 (list (+ 150 (/ r1 2) (/ r3 2)) (cadr t3)))
(command "line" t3 t4 "")
(setq l3 (entlast))
(setq t5 (list (+ 150 r3) (+ 150 (/ r1 2))))
(setq t6 (list (car t4) (cadr t2)))
(command "line" t5 t6 "")
(setq l4 (entlast))
(command "trim" l2 l3 l4 "" kr2 mas2 mas "")
(command "erase" mas "" "")
(command "fillet" "r" r3)
(command "fillet" l2 l3)
(setq arc1 (entlast))
(command "circle" x c3)
(setq rad3 (entlast))
(entdel kr1)
(entdel mass)
(entdel mas22)
(entdel rad3)
(setq H2 ( - w1 w2))
(command "region" "all" "")
(command "extrude" "all" "" H2 "")
(setq reg1 (entlast))
(entdel kr1)
(command "extrude" kr1 "" H2 "")
(setq en1 (entlast))
(entdel mass)
(command "extrude" mass "" H2 "")
(setq en2 (entlast))
(entdel mas22)
(command "extrude" mas22 "" H2 "")
(setq en3 (entlast))
(command "sub>tract" reg1 "" en1 en2 en3 "")
(command "elev" H2 "")
(command "circle" x c1)
(setq rad1 (entlast))
(setq H3 ( - w2 w3))
(command "extrude" rad1 "" H3 "")
(setq kol1 (entlast))
(command "elev" (+ H2 H3)"")
(command "circle" x c2)
(setq rad2 (entlast))
(command "extrude" rad2 "" w3 "")
(setq kol2 (entlast))
(command "union" reg1 kol1 kol2 "")
(setq reg2 (entlast))
(command "elev" "0" "")
(entdel rad3)
(command "extrude" rad3 "" w1 "")
(setq cil (entlast))
(command "sub>tract" reg2 "" cil "")
(command "shademode" "F" "")
(command "_. zoom" "e")
)