Определение площади поверхности и объема тел в AutoCAD на VBA.
В свободное от работы время разрабатываю 3D САПР на базе AutoCAD.
Возникла проблема нахождения объема и площади поверхности деталей, для расчета количества антикоррозионного покрытия и пр.
ActiveX модель AutoCAD` не поддерживает таких данных на прямую, но существуют команды (_area, _massprop).
Вопрос, возможно ли получить из базы нужные данные, вычислить или необходимо скрестить VBA с AutoLisp?
Просмотров: 19686
shumilovvv |
Посмотреть профиль |
Найти ещё сообщения от shumilovvv |
Регистрация: 02.10.2008
Сообщений: 3,685
Если примитив — 3d solid, то у него есть свойства volume. Из справки:
Sub Example_Volume() Dim boxObj As Acad3DSolid Dim length As Double, width As Double, height As Double Dim center(0 To 2) As Double center(0) = 5#: center(1) = 5#: center(2) = 0 length = 5#: width = 7: height = 10# Set boxObj = ThisDrawing.ModelSpace.AddBox(center, length, width, height) Dim NewDirection(0 To 2) As Double NewDirection(0) = -1: NewDirection(1) = -1: NewDirection(2) = 1 ThisDrawing.ActiveViewport.direction = NewDirection ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport ZoomAll Dim Volume As Double Volume = boxObj.Volume MsgBox "Объем " & Volume, , "Volume Пример" End Sub
__________________
. Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка — ложка понарошку,
А по правде, — это лом!
LISP, C# (ACAD 200[9,12,13,14])
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,810
Объем для 3Д-солида получить не проблема: obj.Volume. Как получить площадь твердого тела чисто программно, без применения командных методов — не знаю.
__________________
Моя библиотека lisp-функций
—
Обращение ко мне — на «ты».
Все, что сказано — личное мнение.
Кулик Алексей aka kpblc |
Посмотреть профиль |
Посетить домашнюю страницу Кулик Алексей aka kpblc |
Найти ещё сообщения от Кулик Алексей aka kpblc |
Регистрация: 02.10.2008
Сообщений: 3,685
А что, разве чтение свойства примитива в коде программы — это не «чисто программно»?
__________________
. Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка — ложка понарошку,
А по правде, — это лом!
Инженер технолог по проектированию магистральных нефтепрводов
Регистрация: 07.05.2009
Сообщений: 9
за obj.Volume спасибо, оказалось не сложным посчитать объем из моментов инерции теперь буду искать нахождение площади поверхности
shumilovvv |
Посмотреть профиль |
Найти ещё сообщения от shumilovvv |
Регистрация: 02.10.2008
Сообщений: 3,685
Сообщение от shumilovvv
за obj.Volume спасибо, оказалось не сложным посчитать объем из моментов инерции теперь буду искать нахождение площади поверхности
Ну, моменты инерции-то здесь причем. А площадь поверхности. Может, как то скопировать все грани и снять площадь с них? Хотя как это сделать программно. Может, скопировать солид, заэксплодить и пройтись по объектам-поверхностям?
Однако, метод explode к солидам отчего-то не применим, в отличие от команды автокада.
__________________
. Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка — ложка понарошку,
А по правде, — это лом!
Последний раз редактировалось AlexV, 07.05.2009 в 09:56 .
LISP, C# (ACAD 200[9,12,13,14])
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,810
AlexV, по-моему, у объекта поверхность (Surface) отсутствует понятие площади.
__________________
Моя библиотека lisp-функций
—
Обращение ко мне — на «ты».
Все, что сказано — личное мнение.
Кулик Алексей aka kpblc |
Посмотреть профиль |
Посетить домашнюю страницу Кулик Алексей aka kpblc |
Найти ещё сообщения от Кулик Алексей aka kpblc |
Регистрация: 02.10.2008
Сообщений: 3,685
Сообщение от Кулик Алексей aka kpblc
AlexV, по-моему, у объекта поверхность (Surface) отсутствует понятие площади.
И правда, отсутствует. Плоские участки солида при explode превратятся в регионы, их площадь посчитать легко. А вот с криволинейными как быть..
__________________
. Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка — ложка понарошку,
А по правде, — это лом!
программист, рыцарь ObjectARX
Регистрация: 09.05.2005
Сообщений: 2,406
А в ObjectARX у 3DSolid площадь есть (намек на GeomProps — я там делал возможность вызова из VBA)
Александр Ривилис |
Посмотреть профиль |
Посетить домашнюю страницу Александр Ривилис |
Найти ещё сообщения от Александр Ривилис |
Инженер технолог по проектированию магистральных нефтепрводов
Регистрация: 07.05.2009
Сообщений: 9
Нашло расчетное решение! я конечно не математик но постараюсь по понятней.
Отношение площади к объему произвольного тела равно отношению площади к объему параллелепипеда в которое это тело вписано.
shumilovvv |
Посмотреть профиль |
Найти ещё сообщения от shumilovvv |
Регистрация: 22.02.2007
Сообщений: 2,840
Сообщение от shumilovvv
Нашло расчетное решение! я конечно не математик но постараюсь по понятней.
Отношение площади к объему произвольного тела равно отношению площади к объему параллелепипеда в которое это тело вписано.
Извините — но по моему это бред. Я в один и тот-же паралелепипед могу вписать бесконечное множество тел — и что у всех них будет одинаковое отношение объем/плащадь поверхности?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
программист, рыцарь ObjectARX
Регистрация: 09.05.2005
Сообщений: 2,406
Сообщение от Дима_
Извините — но по моему это бред. Я в один и тот-же паралелепипед могу вписать бесконечное множество тел — и что у всех них будет одинаковое отношение объем/плащадь поверхности?
Александр Ривилис |
Посмотреть профиль |
Посетить домашнюю страницу Александр Ривилис |
Найти ещё сообщения от Александр Ривилис |
Инженер технолог по проектированию магистральных нефтепрводов
Регистрация: 07.05.2009
Сообщений: 9
Для тех кто не верит, могут не верить. Для тех кто сомневается, данный способ я наковырял из курса по интегральному исчислению проверил для пяти произвольных фигур получил тоже значение, что и выдает команда _area.
shumilovvv |
Посмотреть профиль |
Найти ещё сообщения от shumilovvv |
Регистрация: 24.07.2005
Сообщений: 1,335
не любое тело можно вписать в параллелепипед — ето раз.
два: нужно сечь тело с опр. шагом и вычислять площадь сечений, а потом сложить площади и умножить на шаг.
LISP, C# (ACAD 200[9,12,13,14])
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,810
Sleekka, скажи, а зачем это?
__________________
Моя библиотека lisp-функций
—
Обращение ко мне — на «ты».
Все, что сказано — личное мнение.
Кулик Алексей aka kpblc |
Посмотреть профиль |
Посетить домашнюю страницу Кулик Алексей aka kpblc |
Найти ещё сообщения от Кулик Алексей aka kpblc |
Инженер технолог по проектированию магистральных нефтепрводов
Регистрация: 07.05.2009
Сообщений: 9
Сообщение от Sleekka
не любое тело можно вписать в параллелепипед — ето раз.
два: нужно сечь тело с опр. шагом и вычислять площадь сечений, а потом сложить площади и умножить на шаг.
object.GetBoundingBox какраз возвращает противоположные вершины этого самого параллелепипеда, по полученным точкам находим площадь и объем, объем тела поверхность которого мы ищем возвращает obj.Volume, днлим одно на другое и получаем площадь
shumilovvv |
Посмотреть профиль |
Найти ещё сообщения от shumilovvv |
программист, рыцарь ObjectARX
Регистрация: 09.05.2005
Сообщений: 2,406
Сообщение от shumilovvv
Для тех кто не верит, могут не верить. Для тех кто сомневается, данный способ я наковырял из курса по интегральному исчислению проверил для пяти произвольных фигур получил тоже значение, что и выдает команда _area.
Контрпример: Есть шар. Из него вырезан по оси цилиндр. Площадь целого шара и шара без цилиндра разная (в площадь включается еще и площадь боковой поверхности цилиндра). Зато и целый шар и «выгрызенный» вписываются в один и тот же параллелепипед (точнее куб). Что скажешь?
P.S.: Кстати, object.GetBoundingBox даст правильный параллелепипед только если «тело» ориентировано по осям. А если оно повернуто, скажем, на 45 градусов относительно оси Z? И это тело — длинный цилиндр?:-)
Последний раз редактировалось Александр Ривилис, 07.05.2009 в 17:07 .
Александр Ривилис |
Посмотреть профиль |
Посетить домашнюю страницу Александр Ривилис |
Найти ещё сообщения от Александр Ривилис |
Регистрация: 06.04.2009
Сообщений: 705
Могу предложить приближенное решение.
У объекта solid из приведенного выше примера значение объема obj.volume равно 350. В коммандную строку через SendCommand отправляешь строчку для создания оболочки из твоего солида с толщиной напрмер 0,01 (чем меньше тем точнее) от корня кубического объема тела (или задать конкретную толщину покрытия, изоляции и т.д.)
Потом выдернуть этот объектик и посмотреть его объемчик. Ну а дальше S=V/t.
Сергей Дубина |
Посмотреть профиль |
Найти ещё сообщения от Сергей Дубина |
программист, рыцарь ObjectARX
Инженерный блог
Этот блог создан с целью публикации интересных инженерных и научных материалов.
17 марта 2011 г.
Определяем массу и площадь поверхности деталей в AutoCAD
Известно, что AutoCAD позволяет определить объем трехмерных твердых тел. При помощи команды _massprop можно получить различные геометрические характеристики тела. В окне отображения этих свойств обращает на себя внимание такая особенность, как наличие параметров объема и массы, друг другу численно равных. Получается, что тело имеет некоторую единичную плотность, но ее значение редактировать нельзя.
Так как в своей работе мне периодически нужно измерять массу проектируемых деталей, то очень уж захотелось упростить себе и коллегам жизнь, автоматизировав расчет массы на основе данных объема тела.
На помощь мне пришел ARX-плагин от Александра Ривилиса, опытного разработчика программ для продуктов Autodesk. Этот плагин называется GeomProps (по ссылке скачивается архив), который позволяет снимать с выделенных в AutoCAD объектов свойства длины, площади поверхности и объема. И самое главное, то что этот плагин позволяет вводить в расчет линейный масштабный коэффициент, благодаря которому можно получить результат в требуемых единицах.
Перед расчетом следует увеличить разрядность основных единиц измерения в чертеже. Пять знаков после запятой будет достаточно.
Расчет массы тела
Определим массу тела и обода турбинной диафрагмы. Плотность стали равна близко 7,85 г/см3, единицы чертежа – миллиметры, а мы хотим получить значение массы детали в килограммах.
Чтобы самим посчитать массу тела из легированной стали, нужно объем тела в кубических миллиметрах (полученный командой _massprop) умножить на 7,85 и разделить на 10^6.
А чтобы посчитать массу тела при помощи плагина GeomProps нужно взять в расчет масштабный коэффициент, который линейный, а не кубический. Потому масштабный коэффициент равен (7,85/10^6)^(1/3) = 0,01987 (приблизительно).
В поле “Объем” мы получим значение, численно равное массе заданного трёхмерного тела в килограммах, в данном случае мы получили массу деталей, равную 365 кг. Если мы выделяем несколько тел, то плагин показывает сумму их характеристик.
Приведем здесь таблицу с усредненной плотностью и масштабным коэффициентом GeomProps для основных конструкционных и строительных материалов.
Самоучитель AutoCAD 3D
В процессе моделирования иногда возникает необходимость в получении информации о создаваемом (созданном) объекте.
Для этой цели можно воспользоваться инструментами, доступ к которым также возможен при выборе опций из меню:
Расстояние – измерение расстояний между двумя или несколькими точками в пространстве;
Радиус – вычисление радиусов кругов и дуг;
Угол – определение углов между двумя или несколькими точками;
Объем – вычисление объема 3D объектов;
Площадь – вычисление площади и периметра некоторых типов объектов, например 3D тел;
Геометрия и масса – вычисление массы и инерционных характеристик 3D тел;
Список – получение информации о выбранных объектах из базы данных рисунка;
Техника работы с инструментами довольно проста: для получения требуемой информации необходимо активизировать соответствующий инструмент и выполнить предложенные действия по подсказкам КС.
Например, для определения ориентации объекта относительно рабочей плоскости XY, а также измерения длины его ребра, необходимо активизировать инструмент Расстояние и указать две точки: 1 и 2, как это показано на рис. 3.20.а.
Рис. 3.20. Измерение расстояния, углов и координат точки
При измерении расстояний AutoCAD автоматически определяет значение угла в плоскости XY и значение угла от плоскости XY. Справочная информация с полученными данными отображается в окне команд, рис. 3.21.
Рис. 3.21. Окно команд с информацией об объекте
Для определения координат точки в пространстве, после активизации инструмента Координаты, необходимо просто указать эту точку в графической зоне экрана. Результат также выводится в окне команд в текущем формате единиц измерения.
На практике в большинстве случаев определять положение новой точки удобней и проще, используя управление ПСК. Например, координаты точки будут иметь значения по осям 0,0,0, если предварительно перенести ПСК в эту точку, используя опцию управления ПСК Начало, рис. 3.20.б.
При вычислении площади занимаемой 3D телом, все точки должны лежать в плоскости, параллельной плоскости XY текущей ПСК.
Площадь 3д тела в автокаде
Программа позволяет получать данные о площади, периметре и свойствах массы для области, ограниченной выбранными объектами или последовательностью точек. Можно рассчитать и вывести на экран данные о площади и периметре для последовательности точек. Можно также получить данные о площади, периметре и свойствах массы для любого из нескольких типов объектов.
Совет Самый быстрый способ вычисления площади, ограничиваемой несколькими обхектами в 2D, состоит в использовании команды ГРАНИЦЫ. С помощью команды ГРАНИЦЫ можно выбрать точку в пределах площади с целью создания замкнутой полилинии или области. Далее можно использовать палитру «Свойства» или команду СПИСОК с целью получения площади и периметра полилинии или области.
Использование команды ПЛОЩАДЬ С помощью команды ПЛОЩАДЬ можно задавать серии точек или выбирать объект. Если требуется найти общую площадь нескольких объектов, можно задать режим суммирования или вычитания последовательно вычисляемых площадей. Для выбора объектов в данном случае нельзя пользоваться рамкой выбора и секущей рамкой. Вычисленные значения площади и периметра сохраняются в системных переменных AREA и PERIMETER.
Вычисление площади области, ограниченной точками Можно вычислить площадь произвольной замкнутой области, определенной указанием набора двумерных или трехмерных точек. Все точки должны лежать в плоскости, параллельной плоскости XY текущей ПСК.
- Круг. Площадь и длина окружности.
- Эллипс, замкнутая полилиния, многоугольник, планарный замкнутый сплайн и область. Площадь и периметр. Для широкой полилинии вычисляется площадь, ограниченная ее осевой линией.
- Разомкнутые объекты (разомкнутые сплайновые кривые, разомкнутые полилинии и т.п.). Площадь и длина. Площадь вычисляется в предположении, что начало и конец объекта соединены отрезком.
- 3D тела AutoCAD. Общая площадь объекта.
Пример: Подсчет площадей в различных случаях
Можно производить измерение площади нескольких областей, как ограничиваемых точками, так и заключенных внутри объектов. Например, можно определить суммарную площадь комнат на плане этажа.
Из подсчитанной суммарной площади можно производить вычитание площади одной или нескольких областей. В следующем примере вначале определяется полная площадь этажа, а затем из нее вычитается площадь, занимаемая комнатой.
Пример: Вычитание площади из суммарной площади
В следующем примере рассматривается определение площади металлической пластины, имеющей два больших отверстия; контур пластины образован замкнутой полилинией. Для определения площади пластины из площади, ограничиваемой полилинией, вычитается площадь, занимаемая отверстиями. После выполнения каждого шага вычислений отображаются значения площади и периметра или длины окружности каждого объекта и их суммарные значения.
Диалог в командной строке выглядит так:
Первая угловая точка или [Объект/Добавить/Вычесть]: д
Первая угловая точка или [Объект/Вычесть]: о
(Режим СЛОЖЕНИЕ) Выбрать объекты: Выберите полилинию (1)
Площадь = 0.34, Периметр = 2.71
Общая площадь = 0.34
(Режим СЛОЖЕНИЕ) Выбрать объекты: Нажмите ENTER
Первая угловая точка или [Объект/Вычесть]: о
Первая угловая точка или [Объект/Добавить]: о
(Режим ВЫЧИТАНИЕ) Выбрать объекты:Выберите нижнюю окружность (2)
Площадь = 0.02, Длина окружности = 0.46
Общая площадь = 0.32
(Режим ВЫЧИТАНИЕ) Выбрать объекты: Выберите верхнюю окружность (3)
Площадь = 0.02, Длина окружности = 0.46
Общая площадь = 0.30
(Режим ВЫЧИТАНИЕ) Выбрать окружность или полилинию: Нажмите ENTER
Первая угловая точка или [Объект/Добавить]: Нажмите ENTER
Площадь пластины можно также получить в палитре «Свойства» или (если предварительно преобразовать ее в область командой ОБЛАСТЬ и удалить из области отверстия) с помощью команды СПИСОК.
Совет Калькулятор QuickCalc используется для преобразования единиц площади одной системы в единицы другой системы. Дополнительную информацию см. в разделе Использование калькулятора QuickCalc .
Расчет массовых характеристик
С помощью команды МАСС-ХАР для 3D тел и 2D областей можно проанализировать их массовые характеристики, в том числе объем, площадь, момент инерции, центр тяжести и т. п. При этом результаты вычислений можно сохранить в текстовом файле.
- Построение и объединение областей
- Коротко о свойствах объектов