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

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

Как выполнить Explode для 3DSolid?

Ответ
Поиск в этой теме
Непрочитано 26.05.2009, 12:25 #1
Как выполнить Explode для 3DSolid?
Sergey Pavlenko
 
Регистрация: 26.05.2009
Сообщений: 3

Вопрос в следующем.
Как используя ActiveX взорвать 3DSolid? Ведь у объектов такого типа нет соответствующего метода. Судя по документации этот метод есть только у объектов 3DPolyline , BlockRef, ExternalReference, LightweightPolyline, MInsertBlock, Polygonmesh, Polyline, Region.
Просмотров: 5817
 
Непрочитано 27.05.2009, 18:51 Re: Как выполнить Explode для 3DSolid?
#2
Марат Миргалеев


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


Добрый день, Сергей!

Метод explode() определен для всех потомков AcDbEntity, т.е. и для AcDb3dSolid тоже. Я попробовал в AutoCAD 2009 и ObjectARX 2009, у меня из цилиндра получилось 3 entities.
__________________
Успехов!
Марат Миргалеев,
Технический консультант
Autodesk Developer Network (ADN)
Марат Миргалеев вне форума  
 
Автор темы   Непрочитано 27.05.2009, 19:55
#3
Sergey Pavlenko


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


Спасибо, Марат.
Буду пробовать.
Хотя, конечно, странно, что в документации об этом не написано. Среди перечисленных в документации методов для 3DSolid метода Explode нету... :-(
Sergey Pavlenko вне форума  
 
Непрочитано 27.05.2009, 21:01
#4
Кулик Алексей aka kpblc
Moderator

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


Sergey Pavlenko, надо было с самого начала сказать, в какой среде выполняется программирование. Если работать с примитивами через VBA или lisp, то метода Explode для 3-мерных твердых тел действительно нет. Но Марат Миргалеев, похоже, работает в ARX - а там возможности на несколько порядков шире.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.05.2009, 21:33
#5
Supermax

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


Автокад покзывает не все методы и свойства. Надо пробывать метод, даже если Думп его не показывает.

Меня интересует, а как создать набор из элементов, которые получились в результате расчлененки? Мне на ум приходит только один способ - собрать все элементы нужного типа в набор. Расчленить 3Dсолид и те элементы, которые в наборе отсутствуют и есть кусочки 3Dсолида.
Supermax вне форума  
 
Непрочитано 27.05.2009, 22:27
#6
Кулик Алексей aka kpblc
Moderator

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


Supermax, 2008 и 2010-й AutoCAD'ы через vlax-dump-Object могут показать заявленные, но не работающие свойства и методы (ну, например, попробуй получить DataLink для таблицы...)
И насчет Explode вне средств .NET / arx :
Код:
[Выделить все]
_$ (vl-load-com)

_$ (setq obj (vlax-ename->vla-object (car (entsel))))
#<VLA-OBJECT IAcad3DSolid 02426b64>
_$ (vlax-dump-Object obj t)
; IAcad3DSolid: AutoCAD 3dSolid Interface
; Property values:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 00d74d3c>
;   Centroid (RO) = (1521.88 678.951 183.015)
;   Document (RO) = #<VLA-OBJECT IAcadDocument 022f6950>
;   Handle (RO) = "1B4"
;   HasExtensionDictionary (RO) = 0
;   History = -1
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 06f0f0cc>
;   Layer = "0"
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Material = "ByLayer"
;   MomentOfInertia (RO) = (5.17641e+013 2.39501e+014 2.82352e+014)
;   ObjectID (RO) = -1075178592
;   ObjectName (RO) = "AcDb3dSolid"
;   OwnerID (RO) = -1075184392
;   PlotStyleName = "ByLayer"
;   Position = (1521.88 678.951 0.0)
;   PrincipalDirections (RO) = (1.0 0.0 0.0 0.0 1.0 0.0 ... )
;   PrincipalMoments (RO) = (2.42293e+012 5.04059e+012 5.23533e+012)
;   ProductOfInertia (RO) = (1.03108e+014 1.23993e+013 2.77932e+013)
;   RadiiOfGyration (RO) = (720.243 1549.24 1682.13)
;   ShowHistory = 0
;   SolidType (RO) = "Box"
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 06f3ec78>
;   Visible = -1
;   Volume (RO) = 9.97863e+007
; Methods supported:
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   Boolean (2)
;   CheckInterference (2)
;   Copy ()
;   Delete ()
;   GetBoundingBox (2)
;   GetExtensionDictionary ()
;   GetXData (3)
;   Highlight (1)
;   IntersectWith (2)
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   SectionSolid (3)
;   SetXData (2)
;   SliceSolid (4)
;   TransformBy (1)
;   Update ()
T
_$ (vlax-invoke obj 'explode)
; error: ActiveX Server returned the error: unknown name: "EXPLODE"
_$ (vlax-invoke-method obj 'explode)
; error: ActiveX Server returned the error: unknown name: EXPLODE
_$
Выполнялось на AutoCAD 2008 Eng + SP1
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.05.2009, 12:44
#7
Supermax

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


Кулик Алексей aka kpblc,
Цитата:
2008 и 2010-й AutoCAD'ы через vlax-dump-Object могут показать заявленные, но не работающие свойства и методы
да, есть такое и в 2006, 2007 и 2009 кадах.

Помнишь как я бился с WScript.Shell?
http://forum.dwg.ru/showpost.php?p=200211&postcount=1

И такое не только там есть. Вот ты проверил и правильно сделал. Всегда надо проверять, а то Автокад ведь живые люди писали.
Supermax вне форума  
 
Непрочитано 28.05.2009, 13:40
#8
Александр Ривилис

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


Использовать метод Explode для 3DSolid можно в ObjectARX и ObjectARX .NET (C#,VB.NET и т.д.). В чистом VBA (через COM-интерфейс) этого сделать нельзя. Разве что запустить команду _EXPLODE.
Александр Ривилис вне форума  
 
Непрочитано 28.05.2009, 14:05
#9
VVA

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Меня интересует, а как создать набор из элементов, которые получились в результате расчлененки?
Как вариант: Отслеживание объектов появившихся после pasteclip
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.05.2009, 14:27
#10
Supermax

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


Вот было бы здорово, если бы кто-нибудь бы написал бы на ObjectARX ... БЫ.
Такую штуку, которая принимает в качестве аргумента функции указатель на расчленяемый объект, а возвращает список с указателями на объекты распада.

Да что-то не верится в человеческие возможности.
Supermax вне форума  
 
Непрочитано 28.05.2009, 14:44
#11
Александр Ривилис

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Вот было бы здорово, если бы кто-нибудь бы написал бы на ObjectARX ... БЫ.
Такую штуку, которая принимает в качестве аргумента функции указатель на расчленяемый объект, а возвращает список с указателями на объекты распада.

Да что-то не верится в человеческие возможности.
А зачем если _EXPLODE с этим прекрасно справляется? Кроме того "указатель на расчленяемый объект" в arx передать нельзя (можно objectid или handle), и метод explode (в отличие от команды _EXPLODE) не добавляет результаты расчленения в dwg-файл (т.е. они только в памяти PC) и соответственно не имеют ни objectid ни handle.
Александр Ривилис вне форума  
 
Непрочитано 28.05.2009, 15:52
#12
Supermax

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


Да ... гм. Жаль. Но функцию для автолиспа точно нужно сделать. Чтобы ты ей указатель на расчленяемый объект, а она тебе указатели на элементы распада.
Чтобы наверняка, можно слой временный создавать и туда переносить расчленяемый объект, а потом все от туда обратно в слой, от куда был приговоренный. Если объектов много и они в разных слоях, то список списков нужен.
Ценнейшая весч для библиотеки функций была-б.

Забыл. Так можно расчленять без удаления оригинала!
Supermax вне форума  
 
Непрочитано 28.05.2009, 15:58
#13
Александр Ривилис

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


Так в ObjectARX оригинал и не удаляется...
Александр Ривилис вне форума  
 
Непрочитано 29.05.2009, 09:50
#14
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Ну раз всем лень писать такую функцию, то вот нашёл свою старенькую (уже выкладывал как-то). На входе даёшь vla-object, он может быть как в модели, так и вложенный в блок, а на выходе имеем список vla-object -ов, полученных через стандартный "_.explode", входящий объект удаляется.

Код:
[Выделить все]
;|
вызов например такой: (ad-explode-cmdf (vlax-ename->vla-object (car (entsel))))
|;
(defun ad-explode-cmdf (insert / adoc blocks ms ename ename_last sp_rez sp_rez1 owner
                        ins_copy)
  (setq adoc   (vla-get-activedocument (vlax-get-acad-object))
        blocks (vla-get-blocks adoc)
        ms     (vla-get-modelspace adoc)
        ) ;_ end setq
  (if (= (setq owner (vla-get-ownerid insert))
         (vla-get-objectid ms)
         ) ;_ end setq
    (progn (setq ename_last (entlast)
                 sp_rez     '()
                 ) ;_ end setq
           (if (vl-cmdf "_.explode" (vlax-vla-object->ename insert))
             (while (setq ename (entnext ename_last))
               (setq sp_rez     (cons ename sp_rez)
                     ename_last ename
                     ) ;_ end setq
               ) ;_ end while
             (vl-cmdf)
             ) ;_ end if
           (setq sp_rez (mapcar 'vlax-ename->vla-object sp_rez))
           ) ;_ end progn
    (progn (setq
             ins_copy (car
                        (vlax-safearray->list
                          (vlax-variant-value
                            (vla-CopyObjects adoc
                                             (vlax-make-variant
                                               (vlax-safearray-fill
                                                 (vlax-make-safearray vlax-vbObject '(0 . 0))
                                                 (list insert)
                                                 ) ; _
                                               ) ;_   vlax-make-variant
                                             ms
                                             ) ;_   vla-CopyObjects
                            ) ;_   vlax-variant-value
                          ) ;_   vlax-safearray->list
                        ) ;_   car
             ) ;_   setq
           (setq ename_last (vlax-vla-object->ename ins_copy)
                 sp_rez     '()
                 ) ;_ end setq
           (if (vl-cmdf "_.explode" ename_last)
             (while (setq ename (entnext ename_last))
               (setq sp_rez1    (cons ename sp_rez1)
                     ename_last ename
                     ) ;_ end setq
               ) ;_ end while
             (vl-cmdf)
             ) ;_ end if
           (setq sp_rez1 (mapcar 'vlax-ename->vla-object sp_rez1)
                 sp_rez  (vlax-safearray->list
                           (vlax-variant-value
                             (vla-CopyObjects adoc
                                              (vlax-make-variant
                                                (vlax-safearray-fill
                                                  (vlax-make-safearray vlax-vbObject
                                                                       (cons 0 (1- (length sp_rez1)))
                                                                       ) ;_ end vlax-make-safearray
                                                  sp_rez1
                                                  ) ; _
                                                ) ;_   vlax-make-variant
                                              (vla-objectidtoobject adoc owner)
                                              ) ;_   vla-CopyObjects
                             ) ;_   vlax-variant-value
                           ) ;_   vlax-safearray->list                        
                 ) ;_   setq
           (vla-delete insert) ;           (vla-delete ins_copy)
           (mapcar 'vla-delete sp_rez1)
           ) ;_ end progn
    ) ;_ end if
  (vl-cmdf)
  sp_rez
  ) ;_ end defun
Евгений А. вне форума  
 
Непрочитано 29.05.2009, 11:24
#15
Дима_

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


Зачем так сложно-то? Этож просто обертка explode.
на входе 'ename и F (если установлен то оставляет объект), на выходе список ename после взрыва.
Код:
[Выделить все]
(vl-load-com)
(defun explode3d (obj f / ss)
(if (and obj (= (type obj) 'ename) (= (cdr (assoc 0 (entget obj))) "3DSOLID"))
(progn
(setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_x")))))
(command "_explode" (if f (entmakex (cdr (entget obj))) obj))
(vl-remove-if '(lambda (x) (member x ss)) (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_x")))))
));end of progn & if
);end of explode3d
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 29.05.2009, 12:59
#16
Supermax

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


Функция Евгений А. расчленяет ве подряд, но не имеет признака сохранения оригинала.
Функция Дима_ расчленяет только 3Dсолиды, но имеет признак сохранения.
Я только сейчас узнал, что если расчленить 3D солид и сохранить его оригинал, то наложение регионов на солид высвечивает ручки с крестиками над ними. Очень полезная инфа, однако. Всегда знаешь один там элемент или несколько. Никогда такое не видел, хоть в Автокаде не первый год.

Расчленять надо все и с наличием возможности сохранения оригинала. И надо множественный выбор сделать, чтобы не по одному объекту, а к набору эту функцию применять. Результат должен быть список списков.
Supermax вне форума  
 
Непрочитано 29.05.2009, 13:54
#17
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Supermax, зачем плодить простые вещи.
Хочешь список списков - делай так:
Код:
[Выделить все]
(mapcar 'ad-explode-cmdf (список vla-указателей))
то же с сохранением исходников:
Код:
[Выделить все]
(mapcar 'ad-explode-cmdf (mapcar 'vla-copy (список vla-указателей)))
и т. д.

Дима_, - не люблю писать ограниченные функции... :-) , кстати тот функционал что у тебя - у меня вроде даже короче и проще, остальное для вложенных в блоки объектов.
Евгений А. вне форума  
 
Непрочитано 29.05.2009, 14:11
#18
Supermax

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


О! Теперь зер гуд. Только надо оформить и в библиотеку функций положить.

Одно из применений этой функции - подсчет площади поверхностей 3D солидов. Расчленяем с сохранением, собираем площадь регионов и удаляем их.
Supermax вне форума  
 
Непрочитано 29.05.2009, 14:16
#19
Александр Ривилис

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Одно из применений этой функции - подсчет площади поверхностей 3D солидов. Расчленяем с сохранением, собираем площадь регионов и удаляем их.
Зачем так сложно? К тому же AutoCAD очень не любит массового создания/удаления примитивов - это приводит к утечкам памяти. Рекомендую пользоваться теми инструментами, которые это могут сделать с минимальными потерями и максимальной скоростью (arx, .net)
Александр Ривилис вне форума  
 
Непрочитано 29.05.2009, 14:20
#20
Дима_

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Одно из применений этой функции - подсчет площади поверхностей 3D солидов. Расчленяем с сохранением, собираем площадь регионов и удаляем их.
Не получится - там еще и surface могут быть - а они без площади (по крайней ни vla свойства, ни даже коммандыми методами ее не получить) - поробуй с шариком.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как выполнить Explode для 3DSolid?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рифмоплетство. Kryaker Разное 554 14.11.2023 11:59
Бетоны для гидротехнических сооружений Egor_II Железобетонные конструкции 9 03.02.2016 11:06
бетонирование в зимних условиях тен Технология и организация строительства 107 21.12.2013 13:59
Копирование данных для спецификаций из выносок СПДС в таблицу из мтекстов Red Nova Программирование 177 08.12.2008 11:35
Альтернативная служба в армии Vova Разное 117 12.06.2007 00:30