Извлечение данных из 3DSOLID Cylinder.
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Извлечение данных из 3DSOLID Cylinder.

Извлечение данных из 3DSOLID Cylinder.

Ответ
Поиск в этой теме
Непрочитано 16.05.2009, 10:43 #1
Извлечение данных из 3DSOLID Cylinder.
Victor-85
 
Регистрация: 03.03.2009
Сообщений: 16

Здравствуйте. Подскажите пожалуйста как извлечь радиус и длину из цилиндра в AutoCAD. Это необходимо для составления спецификации.
Дополнительная информация:
цилиндр отрисовывается в AutoCAD версия 2007 и выше.
пробовал применять команду filter совместно с list там конечно есть радиус и длина, но это не совсем удобно т.к. количество цилиндров (труб) на чертеже много и в окне истории они все не "умещаются". Даже если цилиндры разместить на разные слои и в настройках filter по слоям выделить цилиндры это не помогает т.к. цилиндров много.
пробовал создать динамический блок из цилиндра. Создавал блок из цилиндра заранее известный диаметр и с помошью массива с заданым шагом получал длину. Но это также не подходит т.к. цилиндр получается весь в кольцал и начинает тормозить компьютер.

Может быть есть у кого-нибудь идеи как извлечь радиус и длину из цилиндра в AutoCAD. Просьба не отвечать "для этого нужен PLANT-4d и т.п."

Последний раз редактировалось Victor-85, 18.05.2009 в 08:41.
Просмотров: 5341
 
Непрочитано 16.05.2009, 15:38
#2
AlexV

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


Цитата:
"извлечь радиус и длину"
из "одинокого" цилиндра, созданного командой _cylinder, элементарно, - в свойствах объекта посмотреть. Если же нужно, к примеру, найти количество всех цилиндров определенного диаметра и длины, то без программирования не обойтись, наверное...
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 16.05.2009, 18:47
#3
Victor-85


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


да это и так понятно что в свойствах указаны диаметр и длина, а как я уже писал цилиндр не "одинокий" их очень много.
Проблема еще в том, что при использовании команды _dataextraction (Извлечение данных) нет возможности извлечь диаметр (ну или хотя бы радиус) и длину.
Victor-85 вне форума  
 
Непрочитано 17.05.2009, 09:42
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Можно написать програмку которая из классов истории вытягивает длинну и радиус цилиндров:
Код:
[Выделить все]
(defun getcylinderinfo (obj)
(if (and
obj 
(= (type obj) 'ename)
(= (cdr (assoc 0 (entget obj))) "3DSOLID")
(setq obj (cdr (assoc 350 (entget obj))))
(setq obj (cdr (assoc 360 (entget obj))))
(setq obj (cdr (assoc 360 (entget obj))))
(= (cdr (assoc 0 (entget obj))) "ACSH_CYLINDER_CLASS")
);end of and
(setq 	obj (member (cons 100 "AcDbShCylinder") (entget obj))
	obj (list (cdr (assoc 40 obj)) (cdr (assoc 41 obj))
);end of setq
);end of setq
);end of if
);end of cylinderinfo
Но тут много ньюансов, работать она будет только для цилиндров созданных командой _cylinder, начиная с 2007 формата и если этот цилиндр "подрезать", просверлить и пр. - она его уже не определит. Если это устраивает - укажи что надо на выходе (да и на входе) поподробней сумарная длинна по радиусам выбранных, или просто список всех цилиндров "валом", и в каком формате выводить (на экран или таблицу) - будет время - оболочку я или другие добрые люди с форума напишут.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 17.05.2009 в 09:58.
Дима_ вне форума  
 
Автор темы   Непрочитано 17.05.2009, 10:22
#5
Victor-85


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


на выходе необходима суммарная длина всех цилиндров одинаковых по диаметру. т.е. сумма цилиндров например с диаметром 100, 200 и т.д.

также необходимо чтобы эти суммы разбивались по слоям. Т.к. трубы с одинаковым диаметром могут отличаться (материал исполнения - сталь, толщина стенки, подземный\надземный участок трубы и т.д.)

выводить конечно лучше в формат .doc .txt .xls если это проблематично, то можно и непосредственно в этот же чертеж
Victor-85 вне форума  
 
Непрочитано 18.05.2009, 00:23
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Примерно так:
Код:
[Выделить все]
(vl-load-com)
(defun c:getcyl ( / lst)
(foreach tmp  
(vl-remove nil ; радиусы и длинны всех цилиндров 
(mapcar 'getcylinderinfo
(vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget (list (cons 0 "3DSOLID"))))))))
(setq lst
(if (assoc (car tmp) lst);если радиус уже есть
(subst (list (car tmp) (1+ (cadr (assoc (car tmp) lst))) (+ (cdr tmp) (caddr (assoc (car tmp) lst)))) (assoc (car tmp) lst) lst);добавлем в сущ.
(append lst (list (list (car tmp) 1 (cdr tmp)))); добавляем новый тип если нет
);end of if
);end of setq
);end of foreach
(if ;если файл создастся
(writefile "суммарно по цилиндрам.txt"
(append (list "Диаметр\tКол-во\tОбщая длинна");заголовок
(mapcar '(lambda (tmp)
(strcat (rtos (* 2 (car tmp))) (chr 9) (rtos (cadr tmp)) (chr 9) (rtos (caddr tmp))); диаметр, к-во, общая длинна
);end of lambda
(vl-sort lst '(lambda (x y) (< (car x) (car y)))))) nil);отсортированные по возрастанию диаметра
;если файл создан
(command "notepad" "суммарно по цилиндрам.txt"); включить в блокноте
;если ошибка записи
(alert "???Не удалось создать файл отчета???"); на случай read only или disk error
);end of if
);end of getcyl
(defun writefile (F lst A); записывает список строк lst в файл F, если A установлен,то дописывает в конец
(setq F (if A (open F "a") (open F "w")))
(if F
(progn
(foreach tmp lst (princ (strcat tmp "\n") F))
(close F)
T
));end of progn&if
);end of writefile
(defun getcylinderinfo (obj)
(if (and
obj 
(= (type obj) 'ename)
(= (cdr (assoc 0 (entget obj))) "3DSOLID")
(setq obj (cdr (assoc 350 (entget obj))))
(setq obj (cdr (assoc 360 (entget obj))))
(setq obj (cdr (assoc 360 (entget obj))))
(= (cdr (assoc 0 (entget obj))) "ACSH_CYLINDER_CLASS")
);end of and
(setq 	obj (member (cons 100 "AcDbShCylinder") (entget obj))
	obj (cons (cdr (assoc 41 obj)) (cdr (assoc 40 obj))
);end of setq
);end of setq
);end of if
);end of cylinderinfo
запускать командой getcyl - обрабатывает выделенные - чтобы разбить по слоям - воспользуйся штатными средствами при выделении, или продумай хорошенько как этовсе правильно оформить с примерами - а то в пустую делать - лень.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 18.05.2009, 07:24
#7
Victor-85


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


К сожалению фаил отчета пуст.
После применения команды _getcyl появляется фаил "суммарно по цилиндрам.txt" в нем 3 колонки "Диаметр Кол-во Общая длинна" и на этом все, больше нет никаких строчек.

Порядок выполнения действий:
1 скопировал код в блокнот и сохранил фаил на рабочем столе. Фаил назван getcyl.lsp
2 запустил команду _appload и загружаю getcyl.lsp
3 AutoCAD пишит что "getcyl.lsp успешно загружено."
4 создаю цилиндр/цилиндры и запускаю команду _getcyl. Выделяю цилиндр и нажимаю Enter.
5 Появляется фаил "суммарно по цилиндрам.txt" который, как я уже писал, пуст
В чем ошибка?
Victor-85 вне форума  
 
Непрочитано 18.05.2009, 10:30
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


приложи файлик, посмотрю у себя
p.s. с этим работает - у тебя сам автокад (в свойствах) про твои цилиндры радиус и длинну показывает?
Вложения
Тип файла: dwg
DWG 2007
тестовый.dwg (180.3 Кб, 914 просмотров)
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 18.05.2009 в 10:43.
Дима_ вне форума  
 
Автор темы   Непрочитано 18.05.2009, 12:00
#9
Victor-85


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


Спасибо огромное, Дима_ !!!! Все работает!!!
Ты не представляешь как ты мне помог!!!
Victor-85 вне форума  
 
Непрочитано 18.05.2009, 12:03
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Еще паз повнимательней к 4 посту - если часть цилиндров будут созданны, например, из выдавленных окружностей - они не будут посчитанны. Удачи.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 18.05.2009, 12:16
#11
Victor-85


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


Еще раз огромное спасибо!!!
Можно ли как-то эту программу усовершенствовать чтобы появился 4-ый столбец "разбиение по слоям"
Victor-85 вне форума  
 
Непрочитано 18.05.2009, 12:48
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Можно все что ты сам сможешь объяснить - что должно быть в 4 столбце? Подумай хорошенько - перед тем как ответить - представь у тебя сто разных диаметров труб и три слоя, либо же наоборот 100 слоев и 2 диаметра. По чему должна быть изначальная группировака. И ИХМО это должно выглядеть не 4 столбец, а например
слой - металл:
диаметр к-во длинна
....
слой - пластик
диаметр к-во длинна
и.т.д. - либо же как-то иначе?
p.s. да и как насчет выделения по слоям руками - если их всего 2 например.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 18.05.2009, 14:20
#13
Victor-85


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


Фаил отчета должен содержать 4 столбца.
Примерный вид его в приложенном файле Внешний вид файла отчета.zip
Если есть такая возможность, то необходимо чтобы Фаил отчета сразу создавался в Excel в формате .xls

Объясняю почему необходимо 4 столбца.
Во первых трубы одинакового диаметра могут отличаться не только по материалу, но и по технологическим линиям (т.е. труба от аппарата1 к аппарату2 и труба от аппарата1 к аппарату3 могут быть одинаковы по материалу и диаметру но отличать их будет только технологическая линия - слой на котором они размещены). В прикрепленном примере 3D-pech.zip это можно увидеть.

во вторых если ввести этот 4-ый столбец то это сводит к минимуму действия. Т.е. открыл чертеж, запустил программу, получил результат. Дело в том что и слоев и различных диаметров очень много. (Приложеный пример это далеко не самая большая площадка.) Поэтому вручную выделять цилиндры по слоям проблематично.

изначально цилиндры можно группировать по диаметрам, а уже в Excel можно было бы отфильтровать как удобно.
Вложения
Тип файла: zip Внешний вид файла отчета.zip (28.3 Кб, 77 просмотров)
Тип файла: zip 3D-pech.zip (624.0 Кб, 74 просмотров)
Victor-85 вне форума  
 
Непрочитано 18.05.2009, 14:36
#14
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Во-во, с таким количесвтом дело пахнет select'ами, ты уверен что тебе эксель нужен - без проблем можно сделать импорт в любую б\д поддерживающию ADO, в таблицу с полями диаметр, длина, слой по каждому цилиндру. А потом группируй их как хочешь.
p.s. если не понял что я тут написал дай знать. можно и как ты просишь - но здесь уже явно "недочеты видны".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 18.05.2009, 14:44
#15
Victor-85


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


Ну конечно. Если Excel сильно усложняет работу то можно просто из блокнота скопировать.
А что за "недочеты"
Victor-85 вне форума  
 
Непрочитано 18.05.2009, 16:38
#16
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Про недочеты - если нужно в последствии "плотно" работать с информациях о трубах, то группировать - это терять информацию (ну напрмер потом тебе понодобиться оптимизировать раскрой с учетом что трубы идут 6-ти метровыми кусками - а информация о длинне по каждому из диаметров), поэтому, если этих труб много я и предлагаю сделать импорт в б\д по каждой трубе, далее с помощью ростого selecta можно построить любые таблицы хоть в экселе, хоть где. Вопрос если какая б\д. Если нет, или не понятно про что пишу, когда будет время добавлю 4 столбец слои - это не сложно.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 18.05.2009, 17:54
#17
vasilyis

Инженер
 
Регистрация: 05.05.2008
Москва
Сообщений: 1,074


А, не пробовали пользоваться программой AutoCAD MEP специально заточенной под всякие трубы с возможностью создания спецификаций и т.д. и т.п.
__________________
Рапик отдай папе кость, Ты ведь не собака. /анекдот АРМЯНСКОГО РАДИО/
vasilyis вне форума  
 
Непрочитано 18.05.2009, 22:59
#18
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


вот 4 столбца - делет тоже текстовик, просто открывает экселем (не знаю я екселевских методов), если при повторном запуске будет ругаться, что не может создать файл - закрой в экселе предыдущий открытый.
Код:
[Выделить все]
(vl-load-com)
(defun c:getcyl ( / lst x pth)
(foreach tmp  
 (vl-remove-if-not '(lambda (tmp) (car tmp)) ; радиусы и длинны всех цилиндров 
 (mapcar '(lambda (obj / tmp) (setq tmp (getcylinderinfo obj)) (list (car tmp) (cdr tmp) (cdr (assoc 8 (entget obj)))))
 (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget (list (cons 0 "3DSOLID"))))))))
(setq lst
(if (setq x (car (vl-remove-if-not '(lambda (x) (and (= (car x) (car tmp)) (= (last x) (last tmp)))) lst))) ;если радиус и слой уже есть
(subst (list (car x) (1+ (cadr x)) (+ (caddr x) (cadr tmp)) (last x)) x lst);добавляем в существующий
(append lst (list (list (car tmp) 1 (cadr tmp) (last tmp)))); добавляем новый тип если нет
);end of if
);end of setq
);end of foreach
(if ;если файл создастся
(writefile "результат.txt"
(append (list "Диаметр\tКол-во\tОбщая длинна\tСлой");заголовок
(mapcar '(lambda (tmp)
(strcat (rtos (* 2 (car tmp))) (chr 9) (rtos (cadr tmp)) (chr 9) (rtos (caddr tmp)) (chr 9) (last tmp)); диаметр, к-во, общая длинна
);end of lambda
(vl-sort lst '(lambda (x y) (< (car x) (car y)))))) nil);отсортированные по возрастанию диаметра
;если файл создан
(progn
(setq 	x (vlax-create-object "Excel.Application")
	pth (vlax-get-property x "path")
);end of setq
(vlax-release-object x)
(startapp (strcat pth "\\excel") "результат.txt")
);end of progn
;если ошибка записи
(alert "???Не удалось создать файл отчета???"); на случай read only или disk error
);end of if
);end of getcyl

(defun writefile (F lst A); записывает список строк lst в файл F, если A установлен,то дописывает в конец
(setq F (if A (open F "a") (open F "w")))
(if F
(progn
(foreach tmp lst (princ (strcat tmp "\n") F))
(close F)
T
));end of progn&if
);end of writefile

(defun getcylinderinfo (obj)
(if (and
obj 
(= (type obj) 'ename)
(= (cdr (assoc 0 (entget obj))) "3DSOLID")
(setq obj (cdr (assoc 350 (entget obj))))
(setq obj (cdr (assoc 360 (entget obj))))
(setq obj (cdr (assoc 360 (entget obj))))
(= (cdr (assoc 0 (entget obj))) "ACSH_CYLINDER_CLASS")
);end of and
(setq 	obj (member (cons 100 "AcDbShCylinder") (entget obj))
	obj (cons (cdr (assoc 41 obj)) (cdr (assoc 40 obj))
);end of setq
);end of setq
);end of if
);end of cylinderinfo
to vasillyis - конечно лучше, но если ты работу с нуля начинаешь...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 18.05.2009, 23:10
#19
Кулик Алексей aka kpblc
Moderator

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


Для варианта "с нуля" как раз МЕР может оказаться самым нормальным решением. Чисто психологически: терять-то нечего, никаких серьезных разработок нет
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.05.2009, 23:22
#20
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


То Крыс я это и имел в виду - если тебе надо обработать то, что в акаде сделанно и в приличном объеме - тут только лисп или руки.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Извлечение данных из 3DSOLID Cylinder.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
извлечение и замена данных поля (field) Composter Программирование 39 23.07.2019 09:22
извлечение данных в AutoCAD 2008 versus1984 AutoCAD 10 27.03.2009 09:33
Извлечение данных в шаблон EXEL. OHUKC Программирование 23 15.09.2008 19:45
Сравнение КЭ расчетных комплексов. Пролог. X-DeViL Конструкции зданий и сооружений 77 10.10.2007 16:07
структурированный список Holon Программирование 22 11.09.2007 14:09