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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как извлечь свойство 3D-тела "Длина"

Как извлечь свойство 3D-тела "Длина"

Ответ
Поиск в этой теме
Непрочитано 23.06.2017, 11:03 #1
Как извлечь свойство 3D-тела "Длина"
Klemion
 
Регистрация: 14.05.2015
Сообщений: 56

Имеется набор объектов 3D-тел, полученных функцией Сдвиг, как прямых так и прямолинейных. Если посмотреть свойство отдельного объекта, то там есть пункт "Длина". Однако для автоматического извлечения данный пункт отсутствует.
Надо всеми правдами и неправдами извлечь длины 3D-тел. А если есть какая то возможность извлечь еще и габаритные размеры (объекты преимущественно цилиндрические - необходимо извлечь диаметры) то буду рад если поделитесь!
Просмотров: 6912
 
Непрочитано 23.06.2017, 11:45
#2
Кулик Алексей aka kpblc
Moderator

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


Файл предоставь. Если велась история записи изменения тел, может быть, что-то увидишь в панели свойств.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.06.2017, 12:12
#3
Klemion


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


Файл примера прикрепил.
Суть какая - имеется некая траектория, по которой потом "сдвигаются" окружности для получения 3D-тел.
Для прямых участков надо извлечь диаметр и длину.
Для криволинейных - только длину.
Вложения
Тип файла: dwg
DWG 2013
Пример.dwg (204.0 Кб, 35 просмотров)
Klemion вне форума  
 
Непрочитано 23.06.2017, 12:23
#4
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


А если так попробовать:
Код:
[Выделить все]
(setq obj (car (entsel "\nВыберите 3D тело: ")))
(vla-GetBoundingBox (vlax-ename->vla-object obj) 'minp 'maxp)
(setq pmin (vlax-safearray->list minp) pmax (vlax-safearray->list maxp))
pmin и pmax - крайние 3D координаты габаритного параллелепипеда.
Profan вне форума  
 
Непрочитано 23.06.2017, 13:40
#5
Кулик Алексей aka kpblc
Moderator

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


Profan, ты на раздел топика посмотри...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.06.2017, 14:26
#6
Klemion


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


Цитата:
Сообщение от Profan Посмотреть сообщение
А если так попробовать:
Код:
[Выделить все]
(setq obj (car (entsel "\nВыберите 3D тело: ")))
(vla-GetBoundingBox (vlax-ename->vla-object obj) 'minp 'maxp)
(setq pmin (vlax-safearray->list minp) pmax (vlax-safearray->list maxp))
pmin и pmax - крайние 3D координаты габаритного параллелепипеда.
Вариант с габаритами параллелепипеда интересный, но как я понял будет работать только если элемент параллелен плоскостям XOY XOZ или YOZ. В остальных случаях не предоставится возможным найти характеристики тела.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Profan, ты на раздел топика посмотри...
Есть какие то соображения по поводу как это осуществить все таки? Лисп или штатными методами это не важно, лишь бы было вообще осуществимо.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Profan, ты на раздел топика посмотри...
Может есть какие то мысли? Не важно каким способом, главное что б было осуществимо. А к процессу извлечения привыкнется.

Последний раз редактировалось Кулик Алексей aka kpblc, 23.06.2017 в 15:19.
Klemion вне форума  
 
Непрочитано 23.06.2017, 21:32
#7
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Profan, ты на раздел топика посмотри...
Я посмотрел: Программное обеспечение. А извлечь указанное свойство (длина), которого в палитре свойств 3D тела нет, можно только с помощью программирования.

Цитата:
Сообщение от Klemion Посмотреть сообщение
будет работать только если элемент параллелен плоскостям XOY XOZ или YOZ
Да, габаритный контейнер ортогонален осям координат. Значит, надо тела делать временно ортогональными (поворачивать). Сложно, да, однако, именно таким образом я создаю отверстия в стене (3D тело) в месте пересечения ее воздуховодами (3D тела), трубопроводами (3D тела) или лотками (3D тела) после экспорта архитектуры с трассами MEP из Revit в AutoCAD.
Profan вне форума  
 
Непрочитано 23.06.2017, 22:22
#8
Кулик Алексей aka kpblc
Moderator

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


Profan, не пытайся казаться дурнем - не получится. Дальше прочитай: AutoCAD. Т.е. нужны штатные возможности. Без использования программирования.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.06.2017, 23:57
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Klemion Посмотреть сообщение
Лисп или штатными методами это не важно, лишь бы было вообще осуществимо.
GeomProps ?

Цитата:
Вызов из AutoLISP:

(GeomPropsGetArea <имя примитива>) ;; Площадь примитива
(GeomPropsGetVolume <имя примитива>) ;; Объем примитива
(GeomPropsGetPerimiter <имя примитива>) ;; Периметр/длина примитива
Вычисление площади 3Dface, Mesh и PolygonMesh
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 26.06.2017, 08:22
#10
Klemion


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


Цитата:
Сообщение от Profan Посмотреть сообщение
А извлечь указанное свойство (длина), которого в палитре свойств 3D тела нет,
Но ведь свойство "длина" в палитре есть (см. скрин), но для стандартного извлечения недоступна

Цитата:
Сообщение от Profan Посмотреть сообщение
Да, габаритный контейнер ортогонален осям координат. Значит, надо тела делать временно ортогональными (поворачивать)
Это не так страшно. У меня лишь единичные объекты не ортогональны осям, поэтому переживу.
Другое дело, а работает ли данная функция при выделении большого количества объектов. Просто если надо тыкать в каждый, я быстрее вручную все сделаю.
А еще можешь или объяснить, или кинуть ссылку на то как установить все это дело?
Миниатюры
Нажмите на изображение для увеличения
Название: Палитра свойств.png
Просмотров: 120
Размер:	22.1 Кб
ID:	190177  
Klemion вне форума  
 
Непрочитано 28.06.2017, 08:44
#11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Klemion Посмотреть сообщение
а работает ли данная функция при выделении большого количества объектов.
Klemion, Ссылки из #9 смотрел?
У geomprops есть функция для лиспа GeomPropsGetPerimiter.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 28.06.2017, 16:45
#12
Klemion


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Klemion, Ссылки из #9 смотрел?
У geomprops есть функция для лиспа GeomPropsGetPerimiter.
Да, глянул, скачал, установил. Только не понимаю как пользоваться.
Ты пишешь:
"(GeomPropsGetPerimiter <имя примитива>) ;; Периметр/длина примитива"
Вот вместо имени примитива что писать следует? Если мне нужно определить периметр 3d-тела
Klemion вне форума  
 
Непрочитано 29.06.2017, 08:31
#13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


GeomPropsGetPerimiter не подойдет. Подойдет этот способ
Только вместо команды "_SETVAR" писать команду "_LIST"
Это если руками

Цитата:
Сообщение от Klemion Посмотреть сообщение
Не важно каким способом, главное что б было осуществимо. А к процессу извлечения привыкнется.
Например так (отчет смотреть в командной строке - клавиша F2)
Код:
[Выделить все]
 
(defun C:SolidL	(/ ss lst item qa cmd str flag)
;;;Solid Length
;;; http://forum.dwg.ru/showthread.php?p=1656438
  (vl-load-com)
  (if (setq ss (ssget "_:L" '((0 . "3DSOLID"))))
    (repeat (setq item (sslength ss))
      (setq lst (cons (ssname ss (setq item (1- item))) lst))
    ) ;_ end repeat
  )
  (setq qa (getvar "QAFLAGS"))
  (setq cmd (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (vl-catch-all-apply
    '(lambda ()
       (while (> (getvar "CMDACTIVE") 0) (command))
       (if command-s
	 (command-s "_LOGFILEON")
	 (command "_LOGFILEON")
       )
       (setvar "QAFLAGS" 2)
       (foreach	solid lst
	 (if command-s
	   (command-s "_LIST" solid "")
	   (command "_LIST" solid "")
	 )
       )
       (if command-s
	 (command-s "_LOGFILEOFF")
	 (command "_LOGFILEOFF")
       )
       (setq lst  nil
	     item (open (getvar "LOGFILENAME") "r")
       )
       (while (setq str (read-line item))
	 (if (wcmatch str "*----------------------------*")
	   (setq lst (cons str lst))
	 )
       )
       (setq flag (car lst))
       (close item)
       (if (setq lst  nil
		 item (open (getvar "LOGFILENAME") "r")
	   )
	 (progn
	   (setq str (read-line item))
	   (while (not (eq (strcase str) (strcase flag)))
	     (setq str (read-line item))
	   )
	   (while (setq str (read-line item))
	     (if
	       (wcmatch	(setq str (strcase (vl-string-trim " \t\n" str)))
			"ДЛИНА*"
	       )
		(progn
		  (setq str (str-str-lst str ":"))
		  (setq
		    lst	(cons (atof (vl-string-trim
				      " \t\n"
				      (vl-princ-to-string (cadr str))
				    )
			      )
			      lst
			)
		  )
		)
	     )
	   )
	 )
       )
       (close item)
     )
  )
  (setvar "QAFLAGS" qa)
  (setvar "CMDECHO" cmd)
  (setq lst (reverse lst))
  (princ "============== SOLID LENGTH REPORT ==============\n"
  )
  (princ (car lst))
  (mapcar '(lambda (x) (princ ",") (princ (rtos x 2 6))) (cdr lst))
  (princ "\n===============================================")
  (princ)
)
(defun str-str-lst (str pat / i)
  (cond	((= str "") nil)
	((setq i (vl-string-search pat str))
	 (cons (substr str 1 i)
	       (str-str-lst (substr str (+ (strlen pat) 1 i)) pat)
	 ) ;_  cons
	)
	(t (list str))
  ) ;_  cond
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.06.2017, 10:05
#14
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Это, по сути, опять определение габаритного контейнера, только муторно.
Как пример: имею 3DSOLID - цилиндр. Вышеприведенная программа выдает следующее:
Ограничивающая рамка: Нижняя граница X = -39574.164, Y = -498707.461, Z = -1588.102
Верхняя граница X = -28379.116, Y = -479476.069, Z = -1429.102
Длина получилась равна nil.
Пример более простой программы:
Код:
[Выделить все]
(defun C:B-SOLID ( / pmin pmax)
(vla-GetBoundingBox (vlax-ename->vla-object (car (entsel))) 'minp 'maxp)
(setq pmin (vlax-safearray->list minp) pmax (vlax-safearray->list maxp))
(princ "\nОграничивающий контейнер: ")
(princ "\nМинимальная точка: ") (princ pmin)
(princ "\nМаксимальная точка: ") (princ pmax)
(vl-cmdf "_BOX" pmin pmax)
(princ)
)
Протокол выполнения:
Код:
[Выделить все]
Команда: B-SOLID
Выберите объект:
Ограничивающий контейнер:
Минимальная точка: (-39574.2 -498707.0 -1588.1)
Максимальная точка: (-28379.1 -479476.0 -1429.1)
_BOX
Первый угол или [Центр]:
Другой угол или [Куб/Длина]:
Команда:
Как видим, координаты практически совпадают. Длину диагонали можно вычислить через полученные координаты ящика, только она не будет равна длине цилиндра, если он не ортогонален.
Profan вне форума  
 
Автор темы   Непрочитано 29.06.2017, 12:36
#15
Klemion


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Например так (отчет смотреть в командной строке - клавиша F2)
Цитата:
Сообщение от Profan Посмотреть сообщение
Пример более простой программы:
Чертовы волшебники))

Полистал программу VVA. Опыта в программировании никакого, но как я понял ты просто создаешь лог, открываешь файл логов, находишь строку с именем "длина" и все что после ":" записываешь через запятую в отчет? Поправь если я ошибся. Буду хоть знать, правильно но ли представляю себе работу программы.

Profan,
Цитата:
Сообщение от Profan Посмотреть сообщение
Длину диагонали можно вычислить через полученные координаты ящика, только она не будет равна длине цилиндра, если он не ортогонален.
А разве длина цилиндра будет равна не просто разнице координат?..

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

Вообще введу в курс дела - есть куча трубопроводов, нарисованных "сдвигом" (но в данном случае это не важно я так понимаю, все равно это 3dsolid) А считать эти трубы для спецификации дико лень. Идея была изначально такой - выбираю все трубы одного диаметра, и нахожу их длину (как по программе VVA), суммирую и вписываю в спецификацию.
Но судя по всему это можно автоматизировать еще сильнее.
Например так - Создать файл txt, и забить туда разницы координат углов ограничивающих 3д-тело (как у Profan, только именно разницу). Забить их, каждое значение в новую строку, и потом скопировав в тот же Excel анализировать и по разнице координат смотреть и диаметры труб и длину (типоразмеры диаметров фиксированные, так что труда не составит). Отводы таким же образом можно будет сосчитать.

Если вам сильно скучно и нефиг делать, то буду рад такой программке) (ну или аналогу, потому что алгоритм описанный мной далеко не факт что самый простой)
Ну а если нет, то думаю я и сам смогу написать подобную программу. Благодаря вам у меня есть теперь хотя бы основа для всех этих дополнений)

В любом случае спасибо!)
Klemion вне форума  
 
Непрочитано 29.06.2017, 14:56
#16
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Цитата:
Сообщение от Klemion Посмотреть сообщение
А разве длина цилиндра будет равна не просто разнице координат?..
Будет равна только в случае диаметра цилиндра равного нулю. Диаметр может быть и не равен нулю, но тогда сам цилиндр должен быть ортогональным.
На картинке видно, почему длина цилиндра не равна длине диагонали.
Миниатюры
Нажмите на изображение для увеличения
Название: Контейнер.jpg
Просмотров: 43
Размер:	15.7 Кб
ID:	190326  
Profan вне форума  
 
Автор темы   Непрочитано 29.06.2017, 15:00
#17
Klemion


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


Цитата:
Сообщение от Profan Посмотреть сообщение
Будет равна только в случае диаметра цилиндра равного нулю. Диаметр может быть и не равен нулю, но тогда сам цилиндр должен быть ортогональным.
А ну в этом случае конечно. Я просто думал что ты изначально про цилиндр ортогональный осям говорил, вот и удивился почему диагональ.
Klemion вне форума  
 
Непрочитано 29.06.2017, 16:20
#18
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Программа, которая была здесь, не соответствует исходным данным.

Последний раз редактировалось Profan, 30.06.2017 в 16:37.
Profan вне форума  
 
Непрочитано 29.06.2017, 16:30
#19
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Klemion,
Здесь готовый алгоритм: http://adn-cis.org/kak-poluchit-3d-p...lo-sdviga.html
Александр Ривилис вне форума  
 
Непрочитано 29.06.2017, 16:47
#20
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Напомню, что я разрабатываю свои программы для тел, образующихся при экспорте коммуникаций MEP (совместно с 3D архитектурой) из Revit в AutoCAD. Тел типа "Сдвиг" там нет. Зато часто присутствуют тела типа "BODY". На этот случай я сделал программу автоматического преобразования тел "BODY" в тела "3DSOLID".
Profan вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как извлечь свойство 3D-тела "Длина"

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как скопировать отверстие с одной грани на другую у 3D тела Double-Zero AutoCAD 2 01.05.2014 17:22
Координаты 3D тела в пространстве Mixon2010 AutoCAD 12 10.08.2011 17:39
LISP. Вывод объема 3D тела. Scorpio_1986 LISP 3 27.02.2010 13:02
Нагрузки на 3D тела в SCADe как прикладывать Comunikabel SCAD 20 20.10.2006 07:27
Как тело построенное 3D Face превратить в 3D Solid? Bdod AutoCAD 37 03.08.2006 11:36