Массивы в AutoCAD через COM. Как обратиться к свойствам?
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Массивы в AutoCAD через COM. Как обратиться к свойствам?

Массивы в AutoCAD через COM. Как обратиться к свойствам?

Ответ
Поиск в этой теме
Непрочитано 23.10.2013, 18:48 #1
Массивы в AutoCAD через COM. Как обратиться к свойствам?
Дмитрий Асташев
 
päällikön suunnittelijat
 
Pietari, Venäjä
Регистрация: 04.12.2010
Сообщений: 63

Добрый день, коллеги!
Подскажите, как через COM (на Visual Studio) получить доступ к массиву и его свойствам? Также, как ,собственно, выбрать массив?

Последний раз редактировалось Дмитрий Асташев, 23.10.2013 в 21:52.
Просмотров: 5839
 
Непрочитано 23.10.2013, 19:01
#2
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


Какой "Массив"??
trir вне форума  
 
Автор темы   Непрочитано 23.10.2013, 20:57
#3
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Который Array
Дмитрий Асташев вне форума  
 
Непрочитано 23.10.2013, 21:09
#4
Кулик Алексей aka kpblc
Moderator

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


Обычный массив объектов не имеет никакой связи между его составляющими. Это просто копии объектов, располагающиеся в достаточно произвольном порядке. Динамический массив - совершенно другое дело.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.10.2013, 21:16
#5
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Алексей, конечно динамический. Вы все шутить изволите
Дмитрий Асташев вне форума  
 
Непрочитано 23.10.2013, 21:19
#6
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


Код:
[Выделить все]
Dim MyArr() as AcadEntity
trir вне форума  
 
Автор темы   Непрочитано 23.10.2013, 21:26
#7
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Цитата:
Сообщение от trir Посмотреть сообщение
Dim MyArr() as AcadEntity
это точно на правду не похоже. Уверен, существует класс со свойствами.
Код:
[Выделить все]
   ARRAY     Layer: "0"
                            Space: Model space
                   Handle = 235
      Array type:  Rectangular
      Base point:  X=1695.7400  Y=1065.6442  Z=   0.0000
        Number of columns:          4
           Column spacing:   146.7501
           Number of rows:          3
              Row spacing:   117.3131
  Row elevation increment:     0.0000
         Number of levels:          1
            Level spacing:     1.0000
      Included axis angle:         90
Дмитрий Асташев вне форума  
 
Непрочитано 23.10.2013, 21:28
#8
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


Цитата:
Уверен, существует класс со свойствами.

Так массив или класс??

Вообще зачем в VS работать с АкАд'ом через COM, когда есть NET API??

Autodesk.AutoCAD.DatabaseServices.AssocArray?

Последний раз редактировалось trir, 23.10.2013 в 21:35.
trir вне форума  
 
Автор темы   Непрочитано 23.10.2013, 21:35
#9
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Цитата:
Сообщение от trir Посмотреть сообщение
зачем в VS работать с АкАд'ом через COM, когда есть NET API
Сейчас срачъ начнется...
Зачем, зачем... Надо. Прошу писать по существу вопроса, (а то все интернеты уже замусорены)
Дмитрий Асташев вне форума  
 
Непрочитано 23.10.2013, 21:37
#10
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


Подозреваю, что так же как AcadAcCmColor в версии x64...
trir вне форума  
 
Непрочитано 23.10.2013, 21:37
#11
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Дмитрий Асташев Посмотреть сообщение
Алексей, конечно динамический. Вы все шутить изволите
Вообще-то я не шутил.
А так, динамический массив - обычный анонимный блок. Вот и все.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.10.2013, 21:41
#12
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


И как его теперь в Document.Blocks найти?
trir вне форума  
 
Автор темы   Непрочитано 23.10.2013, 21:50
#13
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Так выглядят кишки массива (если смотреть через ENTGET (SSNAME):
((-1 . <Entity name: 7ffff705bd0>) (0 . "INSERT") (5 . "235") (102 . "{ACAD_REACTORS") (330 . <Entity name: 7ffff705ca0>) (102 . "}") (330 . <Entity name: 7ffff7039f0>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (2 . "*U2") (10 1695.74 1065.64 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

Если получать в COM через SelectionSet, то массив является объектом типа AcadBlockReference.

Его свойство IsDynamicBlock= False, метод GetDynamicBlockProperties срабатывает, но возвращает пустой объект (нету свойств).
Но ведь хранятся где-то же все эти свойства
Код:
[Выделить все]
   ARRAY     Layer: "0"
                            Space: Model space
                   Handle = 235
      Array type:  Rectangular
      Base point:  X=2054.0547  Y=1113.3026  Z=   0.0000
        Number of columns:          4
           Column spacing:   128.4063
           Number of rows:          3
              Row spacing:    98.9829
  Row elevation increment:     0.0000
         Number of levels:          1
            Level spacing:     1.0000
      Included axis angle:         90

Последний раз редактировалось Дмитрий Асташев, 23.10.2013 в 22:23.
Дмитрий Асташев вне форума  
 
Непрочитано 23.10.2013, 21:55
1 | #14
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


Если работать с COM, то кишки надо смотреть через VBA. Только не представляю как его отличить от других анонимных блоков...
trir вне форума  
 
Непрочитано 24.10.2013, 09:56
1 | #15
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
обычный анонимный блок
Не совсем обычный. Это динамический блок с именем вида "*U21" у которого параметр IsDynamicBlock=False и еще если брать COM модель, то на сколько я понял, массив отличается от динамического блока тем, что у Дин блока EffectiveName ("BlockName") и Name ("*U20") как правило не равны, а у массива эти поля имеют одинаковое значение, вида "*U21"
Boxa вне форума  
 
Автор темы   Непрочитано 24.10.2013, 12:11
#16
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


ОК. Массив можно поймать через, например,:

Dim block As AcadBlockReference = entity
If block.EffectiveName = block.Name Then

далее ищем его в блоках:
For Each bl As AcadBlock In doc.Blocks
If bl.Name = block.Name Then

bl - это наш массив!
Сразу можем получить число элементов массива через Dim Count = bl.Count.
Интересно, что все элементы массива имеют одинаковые имена вида *U104, но разные handle и objectid. Причем данное поведение на зависит от того, является элемент массива простым примитивом или блоком.
Но информации о количестве строк, столбцов и прочем нигде поблизости не наблюдается.
Перехожу на прием.
Дмитрий Асташев вне форума  
 
Непрочитано 24.10.2013, 12:29
1 | #17
Кулик Алексей aka kpblc
Moderator

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


Дмитрий Асташев, по такой технологии любой анонимный блок будет считаться массивом. Это неверно в принципе: любой динамический блок можно преобразовать в анонимный, у которого EffectiveName будет таким же, как и Name. Так что это в принципе - не критерий.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.10.2013, 12:49
1 | #18
Дима_

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


Нет у меня автокада с дин. массивами (я вобще долго тупил смотря на первые сообщения и не мог ухватить сути - потом понял что это про авктокадовские массивы - вспомнил что такие есть) - но сильно подозреваю что через COM к их свойствам не подобраться (как и ко многому другому). Если в COM свойств нету - то и взяться им неоткуда (если только самому не проонализировать геометрию выделив строки\столбцы - но метод этот будет кривой как турецкая сабля). В общем, скорее всего, тут либо колхоз, либо .Net или DXF на выбор.
Цитата:
Интересно, что все элементы массива имеют одинаковые имена вида *U104, но разные handle и objectid.
Было-бы действительно интересно, еслиб они одинаковые были...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.10.2013, 13:23
1 | #19
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Дмитрий Асташев Посмотреть сообщение
Dim block As AcadBlockReference = entity
If block.EffectiveName = block.Name Then

далее ищем его в блоках:
For Each bl As AcadBlock In doc.Blocks
If bl.Name = block.Name Then
Сдается мне, что любой статический блок тоже пройдет через этот фильтр. У него Reference Name = Reference EffectiveName = Defenition Name.
P.S.
Как вариант, может сделать подгружаемый в AutoCAD NET-плагин, который извлечет нужные данные по массиву? А затем передать эти данные в приложение с помощью внешнего файла/буфера обмена/реестра или другого известного Вам способа. В NET есть инструменты работы с массивами. Запустить плагин через SendCommand возможно, наверное (не пробовал). Думаю, должно получиться.
Предложение №2 - возможно, что данные о массивах хранятся где-то в словарях чертежа. Покопать в этом направлении. Как отправная точка - (102 . "{ACAD_REACTORS") (330 . <Entity name: 7ffff705ca0>) (102 . "}")
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)

Последний раз редактировалось Do$, 24.10.2013 в 13:35.
Do$ вне форума  
 
Автор темы   Непрочитано 24.10.2013, 13:37
#20
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Как жаль. Очень удобная штука - динамические массивы. Но без возможности получения свойств (в случае использования COM) - не такая полезная, как могла бы быть. Заказать бы у разработчиков (как подарок на рождество) такой функционал...
Дмитрий Асташев вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Массивы в AutoCAD через COM. Как обратиться к свойствам?

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
1. AutoCAD Кулик Алексей aka kpblc FAQ: Часто задаваемые вопросы 25 27.09.2016 13:29
Информация по идентификационным кодам программ в сетевых лицензиях Autodesk KSI AutoCAD 1 14.09.2009 15:59
BIESSEWORKS и AUTOCAD (связь через DXF) Afonya Программирование 1 17.12.2008 13:25
Доступ к палитре инструментов AutoCAD через объектную модель remlin Программирование 4 14.05.2008 22:14
Файлы отк-ся и сох-тся только через командную строку AutoCad Zlobin AutoCAD 11 21.09.2006 14:59