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

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

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

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

Здравствуйте!
Решил обратиться за помощью в этот раздел, так как стандартными автокадовскими средствами проблема не решается. Проблема заключается в том, что нужно сделать атрибут блока, который бы отображал длину 3д объекта, входящего в этот блок. Мне советовали сделать это полями, но в свойствах 3д тел нет длины. Уважаемые программисты, помогите с решением пожалуйста!
Просмотров: 7938
 
Непрочитано 18.12.2009, 15:02
#21
Елпанов Евгений

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
К стати, есть пара-тройка предложений, ты свою почту часто смотришь? Мне туда писать?
почту смотрю несколько раз в день, и целыми днями в аське и на телефоне...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 19.12.2009, 18:45
#22
Supermax

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


Каждый раз, как начинаю писать в теме, тлеет еле-еле надежда, что кто-нибудь подхватит идею и попытается ее реализовать. Вот сейчас опять приступ наивного оптимизма мучает.

Если в прокат не приклеивать отростков и не вычитать по краям цилиндрическими объектами, то и подрезка и extrude фасок оставляют в описании геометрии объекты ellipse-curve. Я проанализировал их и понял, что они дают вектор выдавливания профиля под каким бы углом они небыли бы срезаны.
Если срезать цилиндр, то мы получим на торце элипс с центром по оси цилиндра, малым и большим радиусами.
В ellipse-curve есть точка центра элипса, нормаль к плоскости элипса, большой вектор-радиус, а именно точка, в которую если провести линию из точки 0,0,0 получится отрезок равный длинне большого радиуса и направление в котором лежит эта точка. Проще говоря, если взять этот отрезок и за точку 0,0,0 перенести в центр элипса, получим отрезок большого радиуса.
Есть еще коофициент элипсности, то есть цифра получаемая от деления длинны малого радиуса на большой.

Но это все приамбула.
Перемножив нормаль элипса и вектор-радиус получим малый вектор и останется только повернуть вектор нормали вокруг малого вектор-радиуса в сторону большого вектор-радиуса на угол, который легко вычисляется по теоремам прямоугольных треугольников. Большой вектор-радиус - это гипотенуза, а малый вектор-радиус - катет. Угол между ними и есть тот угол, на который надо повернуть нормаль элипса.

Но это тоже пока приамбула.
А вот это есть суть идеи:

Вместо того, чтобы анализировать строение плоскостей 3Dсолида, зная основной вектор объекта (как его найти по данным элемента ellipse-curve я уже написал), Собираем со всех описаний в 3Dсолиде точки и считаем их как облако, расположенное вокруг основного вектора объекта.

Каждая точка есть ничто иное, как точка плоскости, в которой вектор нормали - наш основной вектор. Находим точку пересечения этой плоскости с нашим вектором и вместо облака точек получаем кучу точек, расположенных на основном векторе. Проще говоря - проекции этих точек на вектор.

Остается только найти две крайние точки. Это и будет длинна объекта.
Supermax вне форума  
 
Непрочитано 20.12.2009, 01:20
#23
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Supermax
>>Если в прокат не приклеивать отростков и не...
много "не", зачем вообще солид с ограничениями? используй простую линию. когда нада строй вокруг нее солид

>>В ellipse-curve есть точка центра элипса.
если есть центры ограничивающих элипсов то длина - растояние между центрами. Не?

>>Перемножив нормаль элипса и вектор-радиус получим малый вектор
>>Большой вектор-радиус - это гипотенуза, а малый вектор-радиус - катет. Угол между ними и есть тот угол, на который надо повернуть нормаль элипса.

если малый - результат произведения большого и нормали, то угол между большим и малым = 90. Не?

у тебя талант использовать вещи не по назначению, это до хорошего не доведет)).

Последний раз редактировалось zamtmn, 20.12.2009 в 01:36.
zamtmn вне форума  
 
Непрочитано 20.12.2009, 15:01
#24
Supermax

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


Цитата:
>>Если в прокат не приклеивать отростков и не...
много "не", зачем вообще солид с ограничениями? используй простую линию. когда нада строй вокруг нее солид
Ни-изя-а-а! Уголки, швеллеры и двутавры постоянно надо резать под углом. Даже трубы иногда встречается тоже надо. Порой просто, ну очень длинный кусок, скопированный по соседству, обрезается чуть ли не на 90%.

Цитата:
>>В ellipse-curve есть точка центра элипса.
если есть центры ограничивающих элипсов то длина - растояние между центрами. Не?
Не. Ты забыл про то, что швеллер под углом срезан. Если взять и померять между центрами, то при суммировании набегают десятки метров.
Надо такую длинну, чтобы из такого куска можно было сделать то, что нарисовано.

Цитата:
если малый - результат произведения большого и нормали, то угол между большим и малым = 90. Не?
Вот тут да. 90. Только это получится не вектор-радиус (длинна не та), а просто вектор. Да там и не нужен вектор-радиус, просто вектора с головой хватает.

Цитата:
у тебя талант использовать вещи не по назначению, это до хорошего не доведет)).
Стараюсь. Надеюсь, что со мною все будет в порядке, а с Автокадом - так и бог сним.


p.s. Когда проектируешь трассу водопровода или теплопровода из труб большого диаметра, надо составлять карту заказа труб. И не дай бог тебе ошибиться на какие-то 10см. И чем меньше размер трассы, тем больше напрягов с расчетом длин участков. А ты говоришь, от центра до центра. Привезут на участок трубу на трубовозе, а ее надо под углом резать (отводов таких не делают), а ее-то и не хватает. Из могилы достанут.

Последний раз редактировалось Supermax, 20.12.2009 в 15:09.
Supermax вне форума  
 
Непрочитано 20.12.2009, 15:51
#25
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Не. Ты забыл про то, что швеллер под углом срезан.
тогда еще + большой радиус*синус угла между нормалью и направлением выдавливания для каждого среза. (наверно вру, надо нарисовать на бумажке)

один фиг солид для труб слишком универсальный и сложный инструмент

Последний раз редактировалось zamtmn, 20.12.2009 в 15:57.
zamtmn вне форума  
 
Непрочитано 20.12.2009, 18:09
#26
Supermax

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


Не. Берем длинну большого вектор-радиуса и умножаем на кофициент элипсности, получаем длинну малого вектор-радиуса. Вычисляем арккосинус от деления длинны малого вектор-радиуса на большой - это получится угол в градусах на который надо повернуть (виртуально) вектор нормали плоскости элипса вокруг оси малого вектор-радиуса. Увы, формула поворота 3D точки вокруг оси на указанное число градусов мне не известна (пока). Я с детства с тригонометрией не дружил. Если бы все знал - давно бы застрелился.
Supermax вне форума  
 
Автор темы   Непрочитано 21.12.2009, 15:38
#27
Андрей Будзинский


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


Добрый день!
Для меня данная тема уже была решена, когда VVA написал в 11 ответе этой темы. Его функция прекрасно вычисляет длину. Спасибо ему ещё раз. Теперь прошу помощи для автоматизации данной задачи. Вручную я делаю так: открываю редактор блоков, запускаю функцию test и его значение забиваю в новый атрибут. Так вот хотелось бы получить команду, которая сама создавала атрибут для блока со значением функции test. Кто хорошо владеет программированием, помогите пожалуйста! И ещё, было бы неплохо перед вычислением команды test делать ориентацию ucs/object, где в качестве объекта указывать блок, над которым и должна проходить операция.
Андрей Будзинский вне форума  
 
Непрочитано 22.12.2009, 20:17
#28
VVA

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


Цитата:
Сообщение от Андрей Будзинский Посмотреть сообщение
Теперь прошу помощи для автоматизации данной задачи.
Имя атрибута задаем в переменной attname (выделено красным)
Не учитываются разные масштабы блока по осям. Т.е длина считается как для блока с масштабными коэффициентами=1
Код:
[Выделить все]
(defun C:SOL ( / ss lst MinPt MaxPt trPt delta maximum defblk solid count blPt attname)
  ;;;SOlid Length
(vl-load-com)
(setvar "UCSFOLLOW" 0)  
(setq attname "SOLIDLENGTH") ;<<<<< Здесь задаем имя атрибута  
  (if
    (setq ss (ssget "_:L" '((0 . "INSERT")(66 . 1))))
     (progn
       (setq lst (mapcar (function vlax-ename->vla-object)
	            (vl-remove-if (function listp)
		      (mapcar (function cadr) (ssnamex ss))))
	  ss nil)
       (foreach item lst
         (command "_.UCS" "_Ob" (vlax-vla-object->ename item))
         (setq defblk (vla-item (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object)))(vla-get-name item)))
         (setq count 0)
         (vlax-for itm defblk
           (if (eq (vla-get-ObjectName itm) "AcDb3dSolid")
             (progn
               (vla-GetBoundingBox
                 itm
                 'MinPt
                 'MaxPt
                 )
               (setq blPt    (vlax-safearray->list minPt)
                     trPt    (vlax-safearray->list maxPt)
                     delta   (mapcar '- trpt blpt)
                     maximum (apply 'max delta)
                     count (1+ count)
                     )
               )
             )
           )
         (if (= count 1)
           (progn
             (mip-block-setattr-bylist item (list(cons attname (rtos maximum 2 2))))
             (vla-update item)
             )
           (mip-block-setattr-bylist item (list(cons attname (strcat "Количество солидов="(itoa count)))))
           )
         )
       )
    )
  (princ)
)
  (defun mip-block-setattr-bylist (obj att_list / txt lst)
;; obj - Ename or Vla object of block
;; att_list - list ((Tag_Name1 . Value1)(Tag_Name2 . Value2) ...)
;;                 Tag_Name - string
;;                    Value - string
(if (= (type obj) 'ENAME)(setq obj (vlax-ename->vla-object obj)))
(setq att_list (mapcar '(lambda(x)(cons (strcase (car x))(cdr x))) att_list))
  (if (and obj
           (not(vlax-erased-p obj))
           (= (vla-get-ObjectName obj) "AcDbBlockReference")
	   (eq :vlax-true (vla-get-HasAttributes obj))
	   (vlax-property-available-p obj 'Hasattributes)
	   (vlax-write-enabled-p obj)
      )
    (vl-catch-all-apply
      (function
	(lambda	()
          (foreach at (vlax-invoke obj 'Getattributes)
            (if (setq lst (assoc(strcase(vla-get-TagString at)) att_list))
              (vla-put-TextString at (cdr lst))
            )
            )
          )
        )
      )
    )
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 24.12.2009, 19:53
#29
Андрей Будзинский


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


Спасибо огромное, VVA!
Но програма работает с некоторыми ограничениями, а именно:
-команда sol выбирает только блоки, которые содержат атрибут solidlenth
-если основные размеры расположены не вдоль осей системы координат, она работает неправильно

Хотелось бы как-то автоматически переопредилить все существующие блоки и добавить к ним атрибут с заданым именем.
Подскажите пожалуйста, как это можно сделать?
Андрей Будзинский вне форума  
Ответ
Вернуться   Форум 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