Как создать SAFEARRAY для создания AddRegion

Автор Тема: Как создать SAFEARRAY для создания AddRegion  (Прочитано 35634 раз)

0 Пользователей и 11 Гостей просматривают эту тему.

Оффлайн maratovichАвтор темы

  • ADN OPEN
  • Сообщений: 21
  • Карма: 1
  • Skype: maratovich78
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #45 : 04-02-2020, 15:58:34 »
Правда, там ни до чего мне добраться не удалось - ни до пространства модели, ни до коллекции блоков / стилей / слоев.
Так и должно быть. Это позднее связывание.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #46 : 04-02-2020, 15:59:35 »
Правда, там ни до чего мне добраться не удалось - ни до пространства модели, ни до коллекции блоков / стилей / слоев.
Так и должно быть. Это позднее связывание.
Но ошибку вываливать на этом не должно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 119
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #47 : 04-02-2020, 15:59:47 »
Сейчас попробовал через консольное приложение с поздним связыванием достучаться хотя бы до пространства модели текущего документа - не получилось.
У меня валялся где-то код, можно найти и допилить
Получится что-то типа:
https://adn-cis.org/forum/index.php?topic=9657.0
Если нужно конечно?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1119
  • Карма: 173
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #48 : 04-02-2020, 16:51:03 »
Наверняка какие-то настройки не выставил. Я уже даже не удивляюсь этому :)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1119
  • Карма: 173
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #49 : 04-02-2020, 16:52:22 »
Привалов Дмитрий, я просто пытался из VB через позднее связывание достучаться до текущего документа и его элементов.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн maratovichАвтор темы

  • ADN OPEN
  • Сообщений: 21
  • Карма: 1
  • Skype: maratovich78
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #50 : 05-02-2020, 08:25:55 »
Как ранее писал идею - создать dll и подключать.
Но факир был пьян и фокус не удался.
Dll  на VB6 получается х32 и на  vb.net х64 не подключается, разрядность не стыкуется.
 :'(

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #51 : 05-02-2020, 10:28:32 »
Цитировать
Dll  на VB6 получается х32 и на  vb.net х64 не подключается, разрядность не стыкуется.
это не смертельно - в AutoDESK в своё время это побороли, но это ОЧЕНЬ большой геморрой
https://docs.microsoft.com/ru-ru/windows/win32/com/using-the-system-supplied-surrogate?redirectedfrom=MSDN

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 119
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #52 : 05-02-2020, 10:59:20 »
Как ранее писал идею - создать dll и подключать.
Но факир был пьян и фокус не удался.
Dll  на VB6 получается х32 и на  vb.net х64 не подключается, разрядность не стыкуется.
 
Скорее всего остается смешать entmakex для создания контура
вызвать командный метод "_region"
И затем попробовать выбрать созданный контур.
Наверное такое возможно?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #53 : 05-02-2020, 11:31:40 »
Как ранее писал идею - создать dll и подключать.
Но факир был пьян и фокус не удался.
Dll  на VB6 получается х32 и на  vb.net х64 не подключается, разрядность не стыкуется.
 
Скорее всего остается смешать entmakex для создания контура
вызвать командный метод "_region"
И затем попробовать выбрать созданный контур.
Наверное такое возможно?

Безусловно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #54 : 05-02-2020, 11:54:39 »
Проверил. Через подключение лиспа получается создать область:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun create-region (handles-list)
  2.  
  3.   (setq mspace (vlax-get-property
  4.                  (vla-get-activedocument (vlax-get-acad-object))
  5.                  'modelspace
  6.                )
  7.   )
  8.  
  9.   (vlax-invoke
  10.     mspace
  11.     'addregion
  12.     (mapcar (function
  13.               (lambda (handle) (vlax-ename->vla-object (handent handle)))
  14.             )
  15.             handles-list
  16.     )
  17.   )
  18.  
  19.   (setvar "users1" (vlax-get-property (vlax-ename->vla-object (entlast)) 'handle))
  20.   (princ)
  21. )
Код - C# [Выбрать]
  1. using System;
  2. using System.Runtime.InteropServices;
  3.  
  4. namespace AcadLateCOM
  5. {
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {            
  10.             dynamic acad = Marshal.GetActiveObject("AutoCAD.Application");
  11.             dynamic thisDrawing = acad.ActiveDocument;
  12.  
  13.             double[] centerPoint = new[] { 5.0, 3.0, 0.0 };
  14.             double
  15.                 radius = 2.0,
  16.                 startAngle = 0.0,
  17.                 endAngle = Math.PI;
  18.  
  19.             dynamic
  20.                 arc = thisDrawing.ModelSpace.AddArc
  21.                     (centerPoint, radius, startAngle, endAngle),
  22.                 line = thisDrawing.ModelSpace.AddLine
  23.                     (arc.StartPoint, arc.EndPoint);            
  24.  
  25.             thisDrawing.SendCommand($"(create-region '(\"{arc.Handle}\" \"{line.Handle}\")) ");
  26.  
  27.             string regionHandle = thisDrawing.GetVariable("users1");            
  28.         }
  29.     }
  30. }
Код примитивен, т.к. написан только для проверки идеи.

Оффлайн maratovichАвтор темы

  • ADN OPEN
  • Сообщений: 21
  • Карма: 1
  • Skype: maratovich78
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #55 : 05-02-2020, 12:00:27 »
Через подключение лиспа получается создать область:
Согласен, об этом и не спорим.
Но когда объектов 100500 штук.  ...
Да хотелось использовать стандартное.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 119
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #56 : 05-02-2020, 12:16:27 »
Согласен, об этом и не спорим.
Но когда объектов 100500 штук.  ...
Да хотелось использовать стандартное.
Может объектов 100-500 штук? А то 100500 чет слишком большое число, тут CAD другую систему надо искать, для отображения REGION.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #57 : 05-02-2020, 12:40:57 »
Но когда объектов 100500 штук.  ...
Да хотелось использовать стандартное.
Вряд ли лисп будет работать медленнее, чем код из подключаемой через COM сторонней DLL. Единственное что добавляется - преобразования handle-объект и обратно. Тоже не думаю, что это сильно повлияет на скорость работы.
Насчёт стандартного - я не нашёл ничего для того, чтобы напрямую в .NET создать массив объектов, который бы принял метод создания области. Вроде даже есть специальный метод CreateTypedArray, но он не может создавать массив из объектов AutoCAD.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #58 : 05-02-2020, 12:43:28 »
Единственное что добавляется - преобразования handle-объект и обратно.
Это на уровне открытия объекта (Transaction.GetObject(...)) в AutoCAD .NET API.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн maratovichАвтор темы

  • ADN OPEN
  • Сообщений: 21
  • Карма: 1
  • Skype: maratovich78
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #59 : 06-02-2020, 20:44:59 »
Можешь попробовать такую функцию для преобразования обычного Array в SafeArray(VT_ARRAY|VT_DISPATCH)
Код - vb.net [Выбрать]

    Public Function MarshalVariantIDispatchArray(ByVal ObjIn As Object) _
                   As <System.Runtime.InteropServices.MarshalAsAttribute( _
                       System.Runtime.InteropServices.UnmanagedType.SafeArray, _
                       SafeArraySubType:=System.Runtime.InteropServices.VarEnum.VT_DISPATCH)> Object
      Return ObjIn
    End Function


Александр, здесь я не силён,  если это возможно - добавьте чтобы было = VT_ARRAY|VT_DISPATCH|VT_BYREF

вот тут http://rsdn.org/forum/com/591449.all есть рабочее решение и говорят что без VT_BYREF будет ошибка