|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Длина 3д тела как атрибут блока
Регистрация: 01.12.2009
Сообщений: 62
|
||
Просмотров: 7993
|
|
||||
специалист по околачиванию грушевых деревьев Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811
|
Цитата:
в поле Description изначально ввести данные измерений 3D объекта в виде (1000 500 200) вместе со скобками затем читать данные через (vla-get-description ...) и умножать размер на соответствующий коэффициент масштаба по соответствующей оси Затем менять значение атрибута Пример в виде чертежа не помешал бы тоже ~'J'~ |
|||
![]() |
|
||||
Регистрация: 01.12.2009
Сообщений: 62
|
Это конечно хорошо, но только чем этот метод отличается от ручного? Данные измерения 3д объекта можно и сразу забить в атрибуты, правда ведь? Задача состоит именно в автоматическом режиме определения габаритов и передаче их в атрибут. То-есть я хочу просто выделить объект и получить данные о его длине.
|
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Андрей Будзинский, что есть "длина" для абстрактного 3D-тела? Шара, например. Потому и нет там такого свойства. Более того, свойства "длина" нет даже у некоторых "линейных" объектов.
Штатные примитивы Автокада, изображают реальные объекты, в том числе с помощью 3D-тел и их сочетаний. Что именно изображает это тело и где у него измерять "длину", Автокад не знает. Знать может, например, прикладная программа, которая из 3D-тел моделирует трубопровод или прокатный профиль. Вот такая программа, в момент создания тела, может определить его длину и привязать эту информацию к объектам. При этом атрибуты - худшее место для хранения длины - их можно изменить, а фактическая длина останется прежней. Возможно также создание с помощью ObjectARX специальных Custom-объектов, которых нет в Автокаде. Вот у таких объектов могут быть дополнительные свойства, в том числе и "длина". |
|||
![]() |
|
||||
Я, для себя, решил эту задачу так:
Мне надо было измерять длинну цилиндрических объектов типа 3Dсолид. Эти объекты могут быть разных типов, но независимо от этого длинна их может быть вычислена. Так же может быть вчислена длинна профиля, если у него есть радиусы в сечении. http://forum.dwg.ru/showthread.php?t=44068 Код:
p.s. Спасибо огромное Евгению Елпанову за материал по 3Dсолидам. |
||||
![]() |
|
||||
Инженер Регистрация: 02.10.2008
С-Пб
Сообщений: 3,706
|
3d тело в блоке (ежели это 3d solid) - объект, в общем-то, неизменяемый с помощью динамических операций/параметров (по крайней мере, он не "растягивается"). То есть "длина" солида (что бы под ней ни подразумевалось, - габариты или длина траектории выдавливания) будет неизменной до момента переопределения блока. Поэтому какой смысл в полях, - отредактировал блок (изменив солид), - отредактируй атрибут. Можно этот процесс программно автоматизировать, если знать - чего конкретно надо (файл с образцом блока и атрибутом приложить неплохо было б).
__________________
...Не пытайся гнуть ты ложку, Не вяжи её узлом. Ложка - ложка понарошку, А по правде, - это лом! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Цитата:
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 06.04.2009
Сообщений: 702
|
Не до конца понятно что вы хотите получить в конечном итоге. Я полагаю, что длина это путь по готорому выдавливалось какое-то сечение тела. В одной из граней нарисовать линию, а на неё поставить поле в атрибуте длина. (или вы хотите растягивать единичный блок?)
__________________
КазнитьØнельзяØпомиловать:eek: |
|||
![]() |
|
||||
Инженер Регистрация: 02.10.2008
С-Пб
Сообщений: 3,706
|
Цитата:
![]() Вобщем, да, ежели солид - некий "ящик" или цилиндр, то возможно, такие манипуляции имеют смысл...
__________________
...Не пытайся гнуть ты ложку, Не вяжи её узлом. Ложка - ложка понарошку, А по правде, - это лом! Последний раз редактировалось AlexV, 17.12.2009 в 13:30. |
|||
![]() |
|
||||
Регистрация: 01.12.2009
Сообщений: 62
|
ShaggyDoc, под длиной я полагаю самый большой размер. Понятное дело, что формы тел бывают очень сложные. С помощью massprop можно получить значения Bounding box. Потом вычесть из вторых значений первые, и попарно сравнить. Самое большое и будет длиной. Понятно, что это будет давать неправильный результат для 3д объектов ось которых повёрнута к осям под каким-либо углом. Но лично мне сейчас этого не надо.
AlexV, я с Вами полностью согласен, но мне не надо сделать это через поле, а просто забить в атрибут. Supermax, подскажите пожалуйста подробно, что с этим кодом делать. Просто я совсем в програмировании не бум-бум. Заранее спасибо! |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Если твой 3д объект является неким профилем с выдавливанием на различную длину, например цилиндр, угольник, швелер. То все не так уж плохо...
Берем профиль и выдавливаем на 1 мм. Закидываем профиль в блок с точкой вставки, лежащей на плоскости выдавливания и направлением выдавливания, совпадающим с любой из осей - удобно с осью Х или Z - проще поэксперементировать. Далее, вставляем этот блок в нужное место, задавая ему масштаб по оси выдавливания на нужную длину. Получаем полную имитацию твердого тела и масштаб как измерение длины.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Инженер Регистрация: 02.10.2008
С-Пб
Сообщений: 3,706
|
Цитата:
__________________
...Не пытайся гнуть ты ложку, Не вяжи её узлом. Ложка - ложка понарошку, А по правде, - это лом! |
|||
![]() |
|
||||
Инженер Регистрация: 02.10.2008
С-Пб
Сообщений: 3,706
|
Ну да, возможно, так лучше.. _flatshot все равно не плющит ни 3dface, ни отмасштабированный по одной оси в блоке 3dsolid (если вдруг такая возможность нужна - для оформления 2d чертежей по 3d модели). А вот интересно, в А2010 появился новый примитив - 3-мерная сеть (3dface, чтоль..) Он обрабатывается командами _flatshot и _sectionplane, так же, как и солиды. А Stretch в динамических блоках их растягивает?
__________________
...Не пытайся гнуть ты ложку, Не вяжи её узлом. Ложка - ложка понарошку, А по правде, - это лом! |
|||
![]() |
|
||||
К сожалению, любой прокат запихивать в блоки - неправильное решение.
Дырок не вырежешь, не подрезать наискось, не согнуть. Лучше оставить 3Dсолиды. Все 3Dсолиды одной категории материала надо класть в свой слой ("Швеллер N16П") и в этот же слой класть динамический блок-бирку, в котором и атрибуты есть и свойства, и который легко настроить на данный слой. А вот дальше ..., дальше надо все-таки анализировать графику 3Dсолида и высчитывать его габариты, не взирая на дырки, пазы и пр. Если учесть, что для того, чтобы сделать швеллер подрезанным, нужен кусок целого швеллера - вычисление длинны самой длинной грани очень актуальный вопрос. Дай бог, я с этой задачей как-нибудь справлюсь. Есть, правда, и другой, более простой способ, это сделать лисп, заменяющий традиционные команды _slice и _solidedit, в частности _extrude та, которая для _face. Они убивают описание истории в 3Dсолиде, а там есть первоначальная длинна. Надо прежеде чем резать, сохранять историю и редактировать ее, а после помещать на место, где раньше была. Если резать (точнее укорачивать) объект вычитанием или сверлить в нем дырки, история не уничтожается. Есть еще проще способ. Заменить _slice лиспом, который автоматом строит по трем точкам огромный (1х1м.) куб и ориентирует его в нужном направлении, а потом вычитает из проката этот куб. Все равно в ГОСТах нет такого огромного проката. А вычитание не портит историю. Там по прежнему - длинна первоначального отрезка проката. Последний раз редактировалось Supermax, 18.12.2009 в 12:17. |
||||
![]() |
|
||||
Инженер Регистрация: 02.10.2008
С-Пб
Сообщений: 3,706
|
Ну да, тем более разного рода программ для построения 3d проката солидами немало есть - от Кондрата, от Mikka и т.д...
На самом деле, автору темы может и не нужны все эти профили, он пока толком не объяснил/не показал, чего хочет..
__________________
...Не пытайся гнуть ты ложку, Не вяжи её узлом. Ложка - ложка понарошку, А по правде, - это лом! |
|||
![]() |
|
||||
Supermax, ты же читал описание формата...
Зачем такие сложности, если в солиде хранятся центры всех граней, вектор нормали грани, последовательные сегменты (как в полилинии) для каждой грани, ссылки для каждого сегмента грани, на соседнюю грань и ее сегмент, ссылку на предыдущий сегмент грани и следующий... Куда уж больше информации? Достаточно взять все точки грани и найти самый длинный сегмент. Пробежавшись по всем граням, мы получим списки самых длинных сегментов периметров граней и их вершины. Сразу будет понятна не только длинна примитива но и направление выдавливания и много еще чего...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Евгений, беда в том, что там 300 с гаком страниц на английском. Я в нем, как баран. Да, я могу через автоматический переводчик что-то переводить, многое и переводить мне не надо, и так понятно, но в целом -чтобы лекго все пошло, нужен нормальный перевод.
Лучше всего этот материал сразу в справочный файл запихивать. Вот тут я могу поработать. Материал просто шикарный, но один только 5-ый раздел - 87 страниц. Одним типом описания - не обойдешся. все читать надо. Ты вроде, слышал, что-то уже перевел, так поделись, а я еще пару страниц переведу, да и народ может пособит. Мы патриоты или нет? Всем ведь будет польза. К стати, есть пара-тройка предложений, ты свою почту часто смотришь? Мне туда писать? |
||||
![]() |
|
||||
почту смотрю несколько раз в день, и целыми днями в аське и на телефоне...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Каждый раз, как начинаю писать в теме, тлеет еле-еле надежда, что кто-нибудь подхватит идею и попытается ее реализовать. Вот сейчас опять приступ наивного оптимизма мучает.
Если в прокат не приклеивать отростков и не вычитать по краям цилиндрическими объектами, то и подрезка и extrude фасок оставляют в описании геометрии объекты ellipse-curve. Я проанализировал их и понял, что они дают вектор выдавливания профиля под каким бы углом они небыли бы срезаны. Если срезать цилиндр, то мы получим на торце элипс с центром по оси цилиндра, малым и большим радиусами. В ellipse-curve есть точка центра элипса, нормаль к плоскости элипса, большой вектор-радиус, а именно точка, в которую если провести линию из точки 0,0,0 получится отрезок равный длинне большого радиуса и направление в котором лежит эта точка. Проще говоря, если взять этот отрезок и за точку 0,0,0 перенести в центр элипса, получим отрезок большого радиуса. Есть еще коофициент элипсности, то есть цифра получаемая от деления длинны малого радиуса на большой. Но это все приамбула. Перемножив нормаль элипса и вектор-радиус получим малый вектор и останется только повернуть вектор нормали вокруг малого вектор-радиуса в сторону большого вектор-радиуса на угол, который легко вычисляется по теоремам прямоугольных треугольников. Большой вектор-радиус - это гипотенуза, а малый вектор-радиус - катет. Угол между ними и есть тот угол, на который надо повернуть нормаль элипса. Но это тоже пока приамбула. А вот это есть суть идеи: Вместо того, чтобы анализировать строение плоскостей 3Dсолида, зная основной вектор объекта (как его найти по данным элемента ellipse-curve я уже написал), Собираем со всех описаний в 3Dсолиде точки и считаем их как облако, расположенное вокруг основного вектора объекта. Каждая точка есть ничто иное, как точка плоскости, в которой вектор нормали - наш основной вектор. Находим точку пересечения этой плоскости с нашим вектором и вместо облака точек получаем кучу точек, расположенных на основном векторе. Проще говоря - проекции этих точек на вектор. Остается только найти две крайние точки. Это и будет длинна объекта. ![]() |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Supermax
>>Если в прокат не приклеивать отростков и не... много "не", зачем вообще солид с ограничениями? используй простую линию. когда нада строй вокруг нее солид >>В ellipse-curve есть точка центра элипса. если есть центры ограничивающих элипсов то длина - растояние между центрами. Не? >>Перемножив нормаль элипса и вектор-радиус получим малый вектор >>Большой вектор-радиус - это гипотенуза, а малый вектор-радиус - катет. Угол между ними и есть тот угол, на который надо повернуть нормаль элипса. если малый - результат произведения большого и нормали, то угол между большим и малым = 90. Не? у тебя талант использовать вещи не по назначению, это до хорошего не доведет)). Последний раз редактировалось zamtmn, 20.12.2009 в 01:36. |
|||
![]() |
|
|||||
Цитата:
Цитата:
Надо такую длинну, чтобы из такого куска можно было сделать то, что нарисовано. Цитата:
Цитата:
p.s. Когда проектируешь трассу водопровода или теплопровода из труб большого диаметра, надо составлять карту заказа труб. И не дай бог тебе ошибиться на какие-то 10см. И чем меньше размер трассы, тем больше напрягов с расчетом длин участков. А ты говоришь, от центра до центра. Привезут на участок трубу на трубовозе, а ее надо под углом резать (отводов таких не делают), а ее-то и не хватает. Из могилы достанут. Последний раз редактировалось Supermax, 20.12.2009 в 15:09. |
|||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Не. Ты забыл про то, что швеллер под углом срезан.
тогда еще + большой радиус*синус угла между нормалью и направлением выдавливания для каждого среза. (наверно вру, надо нарисовать на бумажке) один фиг солид для труб слишком универсальный и сложный инструмент Последний раз редактировалось zamtmn, 20.12.2009 в 15:57. |
|||
![]() |
|
||||
Не. Берем длинну большого вектор-радиуса и умножаем на кофициент элипсности, получаем длинну малого вектор-радиуса. Вычисляем арккосинус от деления длинны малого вектор-радиуса на большой - это получится угол в градусах на который надо повернуть (виртуально) вектор нормали плоскости элипса вокруг оси малого вектор-радиуса. Увы, формула поворота 3D точки вокруг оси на указанное число градусов мне не известна (пока). Я с детства с тригонометрией не дружил. Если бы все знал - давно бы застрелился.
|
||||
![]() |
|
||||
Регистрация: 01.12.2009
Сообщений: 62
|
Добрый день!
Для меня данная тема уже была решена, когда VVA написал в 11 ответе этой темы. Его функция прекрасно вычисляет длину. Спасибо ему ещё раз. Теперь прошу помощи для автоматизации данной задачи. Вручную я делаю так: открываю редактор блоков, запускаю функцию test и его значение забиваю в новый атрибут. Так вот хотелось бы получить команду, которая сама создавала атрибут для блока со значением функции test. Кто хорошо владеет программированием, помогите пожалуйста! И ещё, было бы неплохо перед вычислением команды test делать ориентацию ucs/object, где в качестве объекта указывать блок, над которым и должна проходить операция. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Имя атрибута задаем в переменной attname (выделено красным)
Не учитываются разные масштабы блока по осям. Т.е длина считается как для блока с масштабными коэффициентами=1 Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 01.12.2009
Сообщений: 62
|
Спасибо огромное, VVA!
Но програма работает с некоторыми ограничениями, а именно: -команда sol выбирает только блоки, которые содержат атрибут solidlenth -если основные размеры расположены не вдоль осей системы координат, она работает неправильно Хотелось бы как-то автоматически переопредилить все существующие блоки и добавить к ним атрибут с заданым именем. Подскажите пожалуйста, как это можно сделать? |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Рифмоплетство. | Kryaker | Разное | 554 | 14.11.2023 11:59 |
Мониторы LCD CRT | Разное | 94 | 17.06.2008 10:51 | |
Как изменять, добавлять атрибуты у блока | Алексей К. | AutoCAD | 2 | 29.01.2007 10:59 |
Как программно узнать точку пересеч. линии с подприм. блока? | kp+ | AutoCAD | 3 | 21.10.2005 10:46 |
Как из блока програмно вычленить текст | Flint | Программирование | 5 | 17.02.2004 11:03 |