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

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

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

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

  • ADN OPEN
  • Сообщений: 21
  • Карма: 1
  • Skype: maratovich78
Используется позднее связывание (другое не интересует). Чистый СОМ без библиотек.
Для создания AddRegion и CopyObjects требуется массив SAFEARRAY.
Перерыл всё, нигде нет информации как создать SAFEARRAY на vb.net

regionObj = ThisDrawing.ModelSpace.AddRegion(curves)

здесь curves нужно как SAFEARRAY, другое не прнимает.

Неужто никто не столкнулся ? Как его собрать ?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
VB.NET? SAFEARRAY? Однако! Знаешь почему никто не сталкивался? Потому что это никому не нужно.
Теоретически это должен быть обычный System.Array с атрибутом [MarshalAs(UnmanagedType.Safe)]
Впрочем, насколько я знаю, большинство COM-объектов в AutoCAD "неполноценные" и поэтому такие вещи не помогут.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Можешь попробовать такую функцию для преобразования обычного Array в SafeArray(VT_ARRAY|VT_DISPATCH)
Код - vb.net [Выбрать]
  1. Public Function MarshalVariantIDispatchArray(ByVal ObjIn As Object) _
  2.                As <System.Runtime.InteropServices.MarshalAsAttribute( _
  3.                    System.Runtime.InteropServices.UnmanagedType.SafeArray, _
  4.                    SafeArraySubType:=System.Runtime.InteropServices.VarEnum.VT_DISPATCH)> Object
  5.   Return ObjIn
  6. End Function
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 21
  • Карма: 1
  • Skype: maratovich78
Можешь попробовать такую функцию для преобразования обычного Array в SafeArray(VT_ARRAY|VT_DISPATCH)
Спасибо, вечером проверю, может сработает.

Впрочем, насколько я знаю, большинство COM-объектов в AutoCAD "неполноценные" и поэтому такие вещи не помогут.

На VB6 всё работает без проблем, а в .net повылазило...


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

  • ADN OPEN
  • Сообщений: 21
  • Карма: 1
  • Skype: maratovich78
trir
И вам спасибо.
P.S. я не против почитать много умных слов, но рабочий пример был бы полезнее.

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

  • ADN OPEN
  • Сообщений: 21
  • Карма: 1
  • Skype: maratovich78
Можешь попробовать такую функцию для преобразования обычного Array в SafeArray(VT_ARRAY|VT_DISPATCH)

Не работает. Может я чего то не понимаю, но не хочет.

Код - vb.net [Выбрать]
  1. Public Class Form1
  2.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  3.       Dim Acad As Object = GetObject(, "AutoCAD.Application")
  4.       Dim ThisDrawing As Object = Acad.ActiveDocument
  5.       Dim NameDoc As String = ThisDrawing.Name
  6.       '-----------------------------------------------------------------+
  7.       Dim curves(0 To 1) As Object
  8.       Dim centerPoint(0 To 2) As Double
  9.       Dim radius As Double
  10.       Dim startAngle As Double
  11.       Dim endAngle As Double
  12.       '-----------------------------------------------------------------+
  13.       centerPoint(0) = 5.0# : centerPoint(1) = 3.0# : centerPoint(2) = 0.0#
  14.       radius = 2.0#
  15.       startAngle = 0
  16.       endAngle = 3.141592
  17.       curves(0) = ThisDrawing.ModelSpace.AddArc(centerPoint, radius, startAngle, endAngle)
  18.       curves(1) = ThisDrawing.ModelSpace.AddLine(curves(0).startPoint, curves(0).endPoint)
  19.       ' Create the region
  20.       Dim regionObj As Object
  21.       '-----------------------------------------------------------------+
  22.       regionObj = ThisDrawing.ModelSpace.AddRegion(MarshalVariantIDispatchArray(curves))
  23.       '-----------------------------------------------------------------+
  24.    End Sub
  25.    Public Function MarshalVariantIDispatchArray(ByVal ObjIn As Object) _
  26.                As <System.Runtime.InteropServices.MarshalAsAttribute( _
  27.                    System.Runtime.InteropServices.UnmanagedType.SafeArray, _
  28.                    SafeArraySubType:=System.Runtime.InteropServices.VarEnum.VT_DISPATCH)> Object
  29.       Return ObjIn
  30.    End Function
  31. End Class





« Последнее редактирование: 03-02-2020, 10:36:29 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не работает. Может я чего то не понимаю, но не хочет.
Увы. Похоже что неполноценность COM-объектов AutoCAD не позволяет так делать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 21
  • Карма: 1
  • Skype: maratovich78
Увы. Похоже что неполноценность COM-объектов AutoCAD не позволяет так делать.
Скорее это неполноценность .net , потому что на VB6 работает без проблем.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
А зачем вообще использовать COM?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #10 : 03-02-2020, 11:56:49 »
Скорее это неполноценность .net
Тоже возможно. .NET более жестко относится к типам данным.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 21
  • Карма: 1
  • Skype: maratovich78
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #11 : 03-02-2020, 12:08:20 »
А зачем вообще использовать COM?
Чтобы не привязываться к версии.
Работает в любом CAD независимо от года и разрядности. Одна сборка для всего.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #12 : 03-02-2020, 12:18:24 »
Цитировать
Чтобы не привязываться к версии.
Работает в любом CAD независимо от года и разрядности. Одна сборка для всего.
мой опыт говорит, что оно так не работает - например нет нужных методов...
NET тянет примерно три версии
можно ещё python попробовать

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #13 : 03-02-2020, 12:24:06 »
maratovich,
Как я понял и в ADN DevHelp не знают как это реализовать в .NET: https://forums.autodesk.com/t5/net/invalid-object-array-exception-while-calling-copyobjects/td-p/4405461
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Как создать SAFEARRAY для создания AddRegion
« Ответ #14 : 03-02-2020, 12:27:53 »
кажется на python'е тоже с этим проблема, я лет 10 назад в Delphi с этим плюхался...