Можешь попробовать такую функцию для преобразования обычного Array в SafeArray(VT_ARRAY|VT_DISPATCH)Спасибо, вечером проверю, может сработает.
Впрочем, насколько я знаю, большинство COM-объектов в AutoCAD "неполноценные" и поэтому такие вещи не помогут.
Можешь попробовать такую функцию для преобразования обычного Array в SafeArray(VT_ARRAY|VT_DISPATCH)
Не работает. Может я чего то не понимаю, но не хочет.Увы. Похоже что неполноценность COM-объектов AutoCAD не позволяет так делать.
Увы. Похоже что неполноценность COM-объектов AutoCAD не позволяет так делать.Скорее это неполноценность .net , потому что на VB6 работает без проблем.
Скорее это неполноценность .netТоже возможно. .NET более жестко относится к типам данным.
А зачем вообще использовать COM?Чтобы не привязываться к версии.
Чтобы не привязываться к версии.мой опыт говорит, что оно так не работает - например нет нужных методов...
Работает в любом CAD независимо от года и разрядности. Одна сборка для всего.
кажется на python'е тоже с этим проблема, я лет 10 назад в Delphi с этим плюхался...Вроде работает: https://adn-cis.org/forum/index.php?topic=7864.msg42066#msg42066
Как только не ковырял - не выходит каменная чаша.Если бы выходило, то за последние 15 лет кто-нибудь это отметил.
Странно всё это.
Грустно...
Чтобы не привязываться к версии.Так себе аргумент, если честно. В Visual Studio штатным функционалом можно легко настроить так, чтобы под все версии одним нажатием собирались библиотеки. Можно дополнительно ещё чуток настроить события после сборки - и все собранные библиотеки будут автоматически помещаться на своё место в структуре Bundle. Если, конечно, не используются версии AutoCAD ниже 2012...
Работает в любом CAD независимо от года и разрядности. Одна сборка для всего.
Вы уже пишете на VB.NET - так сделайте ещё один шаг вперёд и избавьтесь от COM-зависимости!Нет уж, писать отдельные проги под 7 CAD систем, учитывая их годы и разрядность - мозг заклинит.
У меня тут идея - создать маленькую dll на VB6 и засунуть в неё функцию для региона. Если это сработает, то будет одно неудобство - надо регистрировать dll.На лиспе напишите ;)
Кстати, неплохая идея и не понадобится иметь еще один dll-файл. lisp можно и на лету создавать. :-)У меня тут идея - создать маленькую dll на VB6 и засунуть в неё функцию для региона. Если это сработает, то будет одно неудобство - надо регистрировать dll.На лиспе напишите ;)
На лиспе напишите ;)В некоторых CAD не все функции лиспа работают, а алгоритм сложный, массив элементов проходит предварительную обработку, на это нужно переписать всю прогу, а это не реально.
Нет уж, писать отдельные проги под 7 CAD систем, учитывая их годы и разрядность - мозг заклинит.проще сразу делать dxf/dwg без всяких CAD систем
проще сразу делать dxf/dwg без всяких CAD системНе... там цель другая..
В некоторых CAD не все функции лиспа работают, а алгоритм сложный, массив элементов проходит предварительную обработку, на это нужно переписать всю прогу, а это не реально.Не обязательно всю программу на лисп переводить, достаточно только часть для создания региона. И придумать как передать данные в лисп из расчетной части, наверняка уже есть решения.
Как я понял, там кросс-платформенные приложения. AutoCAD + клоны. Я так подозреваю, что с лиспом могут быть проблемы, особенно с его vla- и vlax- функциями.Они могут возникнуть и с СОМ. Возможно для построения Region не потребуется прибегать к vla- и vlax- функциям. Они кстати случаем не через СОМ?
Возможно для построения Region не потребуется прибегать к vla- и vlax- функциям.Альтернатива - только через командные методы. Но для серьёзного приложения это тот ещё костыль. Тут есть примеры: https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/create-a-closed-polyline-and-convert-it-to-region/td-p/4505893
Они кстати случаем не через СОМ?vla- и vlax-? Да, это функции для работы с COM с помощью VisualLISP.
Альтернатива - только через командные методы.Возможно можно по другому. (в "программистком" стиле)
а результат перенести в текущий документ.Для этого нужна CopyObjects , а оно аналогично идёт через массив объектов - о чем здесь и говорится, и тоже не работает.
Используется позднее связывание (другое не интересует). Чистый СОМ без библиотек.Специально открыл справку:
Для создания AddRegion и CopyObjects требуется массив SAFEARRAY.
Перерыл всё, нигде нет информации как создать SAFEARRAY на vb.net
В VB6 Object и Variant это разные вещи, а тут всё слили в один ObjectЕсли долго гуглить, может что и найдется.
и скорее всего .net воспринимает объект автокада не как объект а как строку.это врятли.
Сейчас попробовал через консольное приложение с поздним связыванием достучаться хотя бы до пространства модели текущего документа - не получилось.Тут же есть код: https://adn-cis.org/forum/index.php?topic=9710.msg42379#msg42379
У меня вываливало ошибку на строке получения указателя на пространство модели.И AutoCAD был запущен?
Правда, там ни до чего мне добраться не удалось - ни до пространства модели, ни до коллекции блоков / стилей / слоев.Так и должно быть. Это позднее связывание.
Но ошибку вываливать на этом не должно.Правда, там ни до чего мне добраться не удалось - ни до пространства модели, ни до коллекции блоков / стилей / слоев.Так и должно быть. Это позднее связывание.
Сейчас попробовал через консольное приложение с поздним связыванием достучаться хотя бы до пространства модели текущего документа - не получилось.У меня валялся где-то код, можно найти и допилить
Dll на VB6 получается х32 и на vb.net х64 не подключается, разрядность не стыкуется.это не смертельно - в AutoDESK в своё время это побороли, но это ОЧЕНЬ большой геморрой
Как ранее писал идею - создать dll и подключать.Скорее всего остается смешать entmakex для создания контура
Но факир был пьян и фокус не удался.
Dll на VB6 получается х32 и на vb.net х64 не подключается, разрядность не стыкуется.
Безусловно.Как ранее писал идею - создать dll и подключать.Скорее всего остается смешать entmakex для создания контура
Но факир был пьян и фокус не удался.
Dll на VB6 получается х32 и на vb.net х64 не подключается, разрядность не стыкуется.
вызвать командный метод "_region"
И затем попробовать выбрать созданный контур.
Наверное такое возможно?
Через подключение лиспа получается создать область:Согласен, об этом и не спорим.
Согласен, об этом и не спорим.Может объектов 100-500 штук? А то 100500 чет слишком большое число, тут CAD другую систему надо искать, для отображения REGION.
Но когда объектов 100500 штук. ...
Да хотелось использовать стандартное.
Но когда объектов 100500 штук. ...Вряд ли лисп будет работать медленнее, чем код из подключаемой через COM сторонней DLL. Единственное что добавляется - преобразования handle-объект и обратно. Тоже не думаю, что это сильно повлияет на скорость работы.
Да хотелось использовать стандартное.
Единственное что добавляется - преобразования handle-объект и обратно.Это на уровне открытия объекта (Transaction.GetObject(...)) в AutoCAD .NET API.
Можешь попробовать такую функцию для преобразования обычного 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Это работает в C++, но не работает в .NET
вот тут http://rsdn.org/forum/com/591449.all есть рабочее решение и говорят что без VT_BYREF будет ошибка
Это работает в C++, но не работает в .NETДа. Ситуация не изменилась.
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in System.Dynamic.dll
Additional information: Неверный массив объектовP.S. Интересно, что на работе код работал со строкой "AutoCAD.Application", а дома пришлось добавить "23.1". Иначе отказывался запускаться...
Я правильно понимаю, что весь наш предварительный маршаллинг коту под хвост, т.к. присутствует маршаллинг параметра на входе в метод?Не думаю. Если бы это было так, то и при раннем связывании код бы не работал.
А это случайно не раннее связывание?Именно. Но об этом Дмитрий Загорулькин и пишет.
Увы, но и сотрудники ADN DevHelp не смогли "победить .NETСпасибо за информацию. Жаль.
Пришлось скрестить .NET и Lisp кусками, получилась гадость ещё та, но хотя бы так работает.Именно это и предложили ребята из ADN DevHelp в качестве workaround. Некрасиво, но работает вне зависимости от версии AutoCAD.