Длина 3д тела как атрибут блока
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Длина 3д тела как атрибут блока

Длина 3д тела как атрибут блока

Ответ
Поиск в этой теме
Непрочитано 16.12.2009, 19:58 #1
Длина 3д тела как атрибут блока
Андрей Будзинский
 
Регистрация: 01.12.2009
Сообщений: 62

Здравствуйте!
Решил обратиться за помощью в этот раздел, так как стандартными автокадовскими средствами проблема не решается. Проблема заключается в том, что нужно сделать атрибут блока, который бы отображал длину 3д объекта, входящего в этот блок. Мне советовали сделать это полями, но в свойствах 3д тел нет длины. Уважаемые программисты, помогите с решением пожалуйста!
Просмотров: 7933
 
Непрочитано 16.12.2009, 20:23
#2
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Андрей Будзинский Посмотреть сообщение
Здравствуйте!
Решил обратиться за помощью в этот раздел, так как стандартными автокадовскими средствами проблема не решается. Проблема заключается в том, что нужно сделать атрибут блока, который бы отображал длину 3д объекта, входящего в этот блок. Мне советовали сделать это полями, но в свойствах 3д тел нет длины. Уважаемые программисты, помогите с решением пожалуйста!
Нужно немного переделать блок:
в поле Description изначально ввести данные измерений 3D объекта
в виде (1000 500 200) вместе со скобками
затем читать данные через (vla-get-description ...)
и умножать размер на соответствующий коэффициент масштаба
по соответствующей оси
Затем менять значение атрибута
Пример в виде чертежа не помешал бы тоже

~'J'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 17.12.2009, 09:40
#3
Андрей Будзинский


 
Регистрация: 01.12.2009
Сообщений: 62


Это конечно хорошо, но только чем этот метод отличается от ручного? Данные измерения 3д объекта можно и сразу забить в атрибуты, правда ведь? Задача состоит именно в автоматическом режиме определения габаритов и передаче их в атрибут. То-есть я хочу просто выделить объект и получить данные о его длине.
Андрей Будзинский вне форума  
 
Непрочитано 17.12.2009, 11:30
#4
ShaggyDoc

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-объектов, которых нет в Автокаде. Вот у таких объектов могут быть дополнительные свойства, в том числе и "длина".
ShaggyDoc вне форума  
 
Непрочитано 17.12.2009, 12:06
#5
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Я, для себя, решил эту задачу так:
Мне надо было измерять длинну цилиндрических объектов типа 3Dсолид.
Эти объекты могут быть разных типов, но независимо от этого длинна их может быть вычислена.
Так же может быть вчислена длинна профиля, если у него есть радиусы в сечении.
http://forum.dwg.ru/showthread.php?t=44068

Код:
[Выделить все]
(defun acis-decode (s) ; decode an encrypted acis-string of dxf group 1 
(apply (function strcat) 
(mapcar 
(function (lambda (c) ; decode one char 
(cond ; by Owen Wengerd 
((= c 32) " ") 
((= c 86) "I") 
(T (chr (boole 6 c 95)))))) 
(vl-string->list s)) 
) 
)
;|
(defun goACIS (/ ent entl)
(setq disk1 (open "D:\\СТРОИТЕЛЬСТВО\\solid.txt" "w"))
(cond ((setq ent (car (entsel))) 
(setq entl (entget ent)) 
(foreach n entl 
(if (= 1 (car n)) 
(print (acis-decode (cdr n)) disk1)
)))
) 
(close disk1)
)
|;
(defun goACIS2 (/ ent entl)
(setq resultat nil)
(cond ((setq ent (car (entsel))) 
(setq entl (entget ent)) 
(foreach n entl 
(if (= 1 (car n)) 
(setq resultat (append resultat (list (acis-decode (cdr n)))))
)))
) 
)

(GOACIS2)

(setq rek nil)
(mapcar '(lambda (a) (if (wcmatch a "ellipse-curve*") (setq rek (append rek (list a))))) resultat)
(setq rek2 nil)
(mapcar '(lambda (a) (setq rek2 (append rek2 (list (substr a 26))))) rek)
(setq rek5 (mapcar '(lambda (a) (vl-string->list a)) rek2))

(defun list-pozition-32 (a)
(setq a-1 a)
(setq spi-1 nil)
(while (/= (car a-1) 32) (setq spi-1 (append spi-1 (list (car a-1)))) (setq a-1 (cdr a-1)))
(setq a-1 (cdr a-1))
(setq spi-1 (read (vl-list->string spi-1)))
(setq spi-2 nil)
(while (/= (car a-1) 32) (setq spi-2 (append spi-2 (list (car a-1)))) (setq a-1 (cdr a-1)))
(setq a-1 (cdr a-1))
(setq spi-2 (read (vl-list->string spi-2)))
(setq spi-3 nil)
(while (/= (car a-1) 32) (setq spi-3 (append spi-3 (list (car a-1)))) (setq a-1 (cdr a-1)))
(setq a-1 (cdr a-1))
(setq spi-3 (read (vl-list->string spi-3)))
(list spi-1 spi-2 spi-3)
)

(setq dlinnatrub (apply 'distance (mapcar '(lambda (a) (list-pozition-32 a)) rek5)))
(setq  dlinnatrub dlinnatrub)
Это лично для меня, но на основе самограничений, собственной логики построения и обработки модели можно любую задачу решить.

p.s. Спасибо огромное Евгению Елпанову за материал по 3Dсолидам.
Supermax вне форума  
 
Непрочитано 17.12.2009, 12:49
#6
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


3d тело в блоке (ежели это 3d solid) - объект, в общем-то, неизменяемый с помощью динамических операций/параметров (по крайней мере, он не "растягивается"). То есть "длина" солида (что бы под ней ни подразумевалось, - габариты или длина траектории выдавливания) будет неизменной до момента переопределения блока. Поэтому какой смысл в полях, - отредактировал блок (изменив солид), - отредактируй атрибут. Можно этот процесс программно автоматизировать, если знать - чего конкретно надо (файл с образцом блока и атрибутом приложить неплохо было б).
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 17.12.2009, 13:13
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Цитата:
Сообщение от AlexV Посмотреть сообщение
"длина" солида (что бы под ней ни подразумевалось, - габариты или длина траектории выдавливания) будет неизменной до момента переопределения блока
Да ну?? А сделай-ка масштабный коэффициент по одной из осей равным, например, 20
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.12.2009, 13:14
#8
Сергей Дубина


 
Регистрация: 06.04.2009
Сообщений: 702


Не до конца понятно что вы хотите получить в конечном итоге. Я полагаю, что длина это путь по готорому выдавливалось какое-то сечение тела. В одной из граней нарисовать линию, а на неё поставить поле в атрибуте длина. (или вы хотите растягивать единичный блок?)
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Непрочитано 17.12.2009, 13:21
#9
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Да ну?? А сделай-ка масштабный коэффициент по одной из осей равным, например, 20
"Федя, вы - комсомолец? Но это же не наш метод!"
Вобщем, да, ежели солид - некий "ящик" или цилиндр, то возможно, такие манипуляции имеют смысл...
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!

Последний раз редактировалось AlexV, 17.12.2009 в 13:30.
AlexV вне форума  
 
Автор темы   Непрочитано 17.12.2009, 15:12
#10
Андрей Будзинский


 
Регистрация: 01.12.2009
Сообщений: 62


ShaggyDoc, под длиной я полагаю самый большой размер. Понятное дело, что формы тел бывают очень сложные. С помощью massprop можно получить значения Bounding box. Потом вычесть из вторых значений первые, и попарно сравнить. Самое большое и будет длиной. Понятно, что это будет давать неправильный результат для 3д объектов ось которых повёрнута к осям под каким-либо углом. Но лично мне сейчас этого не надо.
AlexV, я с Вами полностью согласен, но мне не надо сделать это через поле, а просто забить в атрибут.
Supermax, подскажите пожалуйста подробно, что с этим кодом делать. Просто я совсем в програмировании не
бум-бум. Заранее спасибо!
Андрей Будзинский вне форума  
 
Непрочитано 17.12.2009, 15:14
#11
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Андрей Будзинский, сначала скажи что за 3Dсолиды ты собрался измерять.
Supermax вне форума  
 
Непрочитано 17.12.2009, 15:52
#12
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Андрей Будзинский Посмотреть сообщение
С помощью massprop можно получить значения Bounding box Потом вычесть из вторых значений первые, и попарно сравнить. Самое большое и будет длиной.
Аналог в лиспе vla-GetBoundingBox
Код:
[Выделить все]
(defun C:TEST ()
(vl-load-com)
  (if
    (and (setq ss (ssget "_:S" '((0 . "3DSOLID"))))
	 (setq ent (ssname ss 0))
    )
     (progn
       (vla-GetBoundingBox
	 (vlax-ename->vla-object ent)
	 'MinPt
	 'MaxPt
       )
       (setq blPt    (vlax-safearray->list minPt)
	     trPt    (vlax-safearray->list maxPt)
	     delta   (mapcar '- trpt blpt)
	     maximum (apply 'max delta)
       )
       (alert (strcat "DeltaX DeltaY DEltaZ\n"
		      (VL-PRINC-TO-STRING delta)
		      "\nMax value:\n"
		      (VL-PRINC-TO-STRING maximum)
	      )
       )
     )
  )
  (princ)
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 17.12.2009, 16:03
#13
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Если твой 3д объект является неким профилем с выдавливанием на различную длину, например цилиндр, угольник, швелер. То все не так уж плохо...
Берем профиль и выдавливаем на 1 мм.
Закидываем профиль в блок с точкой вставки, лежащей на плоскости выдавливания и направлением выдавливания, совпадающим с любой из осей - удобно с осью Х или Z - проще поэксперементировать.
Далее, вставляем этот блок в нужное место, задавая ему масштаб по оси выдавливания на нужную длину. Получаем полную имитацию твердого тела и масштаб как измерение длины.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 17.12.2009, 16:43
#14
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
Если твой 3д объект является неким профилем с выдавливанием на различную длину, например цилиндр, угольник, швелер. То все не так уж плохо...
Берем профиль и выдавливаем на 1 мм.
Закидываем профиль в блок с точкой вставки, лежащей на плоскости выдавливания и направлением выдавливания, совпадающим с любой из осей - удобно с осью Х или Z - проще поэксперементировать.
Далее, вставляем этот блок в нужное место, задавая ему масштаб по оси выдавливания на нужную длину. Получаем полную имитацию твердого тела и масштаб как измерение длины.
... А вот этакий образец подобного стиля.. Блок, изображающий собой швеллер. Масштаб по оси z = длине. Блок содержит скрытый атрибут, в котором - масса солида (вычисляется как площадь контура выдавливания * масштаб по z * 7850). При изменении масштаба необходимо регенерация чертежа для обновления поля..
Вложения
Тип файла: dwg
DWG 2007
блоки.dwg (74.8 Кб, 1005 просмотров)
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 17.12.2009, 18:10
#15
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Тогда уж лучше так:
Вложения
Тип файла: dwg
DWG 2004
блоки.dwg (111.0 Кб, 1007 просмотров)
Supermax вне форума  
 
Непрочитано 17.12.2009, 22:17
#16
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
Сообщение от Supermax Посмотреть сообщение
Тогда уж лучше так:
Ну да, возможно, так лучше.. _flatshot все равно не плющит ни 3dface, ни отмасштабированный по одной оси в блоке 3dsolid (если вдруг такая возможность нужна - для оформления 2d чертежей по 3d модели). А вот интересно, в А2010 появился новый примитив - 3-мерная сеть (3dface, чтоль..) Он обрабатывается командами _flatshot и _sectionplane, так же, как и солиды. А Stretch в динамических блоках их растягивает?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 18.12.2009, 11:47
#17
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


К сожалению, любой прокат запихивать в блоки - неправильное решение.
Дырок не вырежешь, не подрезать наискось, не согнуть. Лучше оставить 3Dсолиды. Все 3Dсолиды одной категории материала надо класть в свой слой ("Швеллер N16П") и в этот же слой класть динамический блок-бирку, в котором и атрибуты есть и свойства, и который легко настроить на данный слой. А вот дальше ..., дальше надо все-таки анализировать графику 3Dсолида и высчитывать его габариты, не взирая на дырки, пазы и пр. Если учесть, что для того, чтобы сделать швеллер подрезанным, нужен кусок целого швеллера - вычисление длинны самой длинной грани очень актуальный вопрос.
Дай бог, я с этой задачей как-нибудь справлюсь.

Есть, правда, и другой, более простой способ, это сделать лисп, заменяющий традиционные команды _slice и _solidedit, в частности _extrude та, которая для _face. Они убивают описание истории в 3Dсолиде, а там есть первоначальная длинна. Надо прежеде чем резать, сохранять историю и редактировать ее, а после помещать на место, где раньше была.
Если резать (точнее укорачивать) объект вычитанием или сверлить в нем дырки, история не уничтожается.

Есть еще проще способ. Заменить _slice лиспом, который автоматом строит по трем точкам огромный (1х1м.) куб и ориентирует его в нужном направлении, а потом вычитает из проката этот куб. Все равно в ГОСТах нет такого огромного проката. А вычитание не портит историю. Там по прежнему - длинна первоначального отрезка проката.

Последний раз редактировалось Supermax, 18.12.2009 в 12:17.
Supermax вне форума  
 
Непрочитано 18.12.2009, 12:29
#18
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
Сообщение от Supermax Посмотреть сообщение
К сожалению, любой прокат запихивать в блоки - неправильное решение
Ну да, тем более разного рода программ для построения 3d проката солидами немало есть - от Кондрата, от Mikka и т.д...
На самом деле, автору темы может и не нужны все эти профили, он пока толком не объяснил/не показал, чего хочет..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 18.12.2009, 12:35
#19
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Supermax, ты же читал описание формата...
Зачем такие сложности, если в солиде хранятся центры всех граней, вектор нормали грани, последовательные сегменты (как в полилинии) для каждой грани, ссылки для каждого сегмента грани, на соседнюю грань и ее сегмент, ссылку на предыдущий сегмент грани и следующий...
Куда уж больше информации?
Достаточно взять все точки грани и найти самый длинный сегмент. Пробежавшись по всем граням, мы получим списки самых длинных сегментов периметров граней и их вершины. Сразу будет понятна не только длинна примитива но и направление выдавливания и много еще чего...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 18.12.2009, 13:07
#20
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Евгений, беда в том, что там 300 с гаком страниц на английском. Я в нем, как баран. Да, я могу через автоматический переводчик что-то переводить, многое и переводить мне не надо, и так понятно, но в целом -чтобы лекго все пошло, нужен нормальный перевод.
Лучше всего этот материал сразу в справочный файл запихивать. Вот тут я могу поработать.
Материал просто шикарный, но один только 5-ый раздел - 87 страниц. Одним типом описания - не обойдешся. все читать надо.
Ты вроде, слышал, что-то уже перевел, так поделись, а я еще пару страниц переведу, да и народ может пособит.
Мы патриоты или нет? Всем ведь будет польза.
К стати, есть пара-тройка предложений, ты свою почту часто смотришь? Мне туда писать?
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Длина 3д тела как атрибут блока



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рифмоплетство. 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