Редактирование параметров 3D точки (API5)

Автор YS, 27.03.20, 21:36:36

« предыдущая - следующая »

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

YS

Доброго времени суток!

Возможно ли "добраться" до параметров 3D точки через КОМПАС API5 (например - отредактировать координаты)?

Самому пока удалось прочитать массив 3D точек и считать их имена, а к параметрам X,Y,Z не знаю как подступиться  :( :

 iPart = iDoc3D.GetPart(Kompas6Constants3D.Part_Type.pTop_Part) ' верхний компонент
        io3d_points3D = iPart.EntityCollection(Kompas6Constants3D.Obj3dType.o3d_point3D)

        Dim count As Integer = io3d_points3D.GetCount
        For i = 0 To count - 1
            icurrentEntity = io3d_points3D.GetByIndex(i)
            iKompasObject.ksMessage (icurrentEntity.name)
            icurrentEntity = Nothing
        Next

Sabahs


YS

28.03.20, 09:46:52 #2 Последнее редактирование: 28.03.20, 11:59:42 от YS
Спасибо, за ответ!
Честно говоря я предвидел такой ответ, но надеялся что в API5 можно таки управлять 3D точками.

API 7 у меня не получается использовать из-за "косячных" com объектов КОМПАСА, в частности, на NET платформе.
Дело в том, что редактировать координаты 3D точки мне надо в обработчике события Doc3DNotify.Rebuild
К сожалению Интерфейс KompasAPI7.ksDocument3DNotify7 не имеет обработчиков событий, также, как и KompasAPI7.IApplication, а если объявить переменную с интерфейсом KompasAPI7._Application студия начинает ругаться на ошибки в COM:
 
Ошибка 1   
Не удается встроить тип взаимодействия "KompasAPI7.ksKompasObjectNotify_Event", поскольку не обнаружен исходный интерфейс "Kompas6API5.ksKompasObjectNotify", на который ссылается атрибут типа ComEventInterfaceAttribute.


Если отключить встраивание (внедрение) Kompas6API5 и KompasAPI7 в ссылках проекта, то ошибка пропадает, но вместе с этим
перестают работать все события КОМПАСа - например при нажатии кнопки "Открыть" она нажимается, но ничего не происходит, хотя в студии брекпоинт в событии iKompasObject.OpenDocument срабатывает и, не смотря на возвращаемое значение true, КОМПАС дальше ничего не делает, т.е. файл не открывает.

В общем куда ни сунешься, везде тупик.

YS

Продолжаю, пока безуспешные, попытки вразумить API КОМПАСа адекватно обрабатывать события...

А вообще кто-нибудь пробовал протестить пример из SDK\Samples\Basic\events?
У меня, как уже наверное понятно, не работает.

Да и не могу я понять, как он может работать, если интерфейс КОМПАСа объявлен с возможностью обработки событий:

   Public WithEvents iKompasObject As Kompas6API5.Application

а функция-обработчик объявлена без указания, что ее нужно подключить к событию объекта handles iKompasObject.BeginOpenDocument.:

   Private Function iKompasObject_BeginOpenDocument(ByVal fileName As String) As Boolean

Здесь вообще бывают программисты из АСКОНа или писать в сервисдеск?

Петрович-47

Нет, они здесь не бывают, они даже не знают про этот ресурс. Пишите в ТП.
Да и вообще здесь не очень используют Басик, мой вопрос висит уже давно... реакции никакой нет

YS

С программерами все понятно :(  Это вам не форумы буржуйских CADов, где всегда есть программеры-профи, которые придут на помощь :angry:

Танцами с бубном свою проблему удалось решить. Пришлось отказаться от интерфейса KompasAPI7._Application, т.к. в этом интерфейсе после вызова установленных мной обработчиков управление не передается обратно в программу для завершения события в КОМПАСе, в общем косяк какой-то в COM объектах.

И посмотрел по поводу Вашего вопроса - см.  Сохранение документов компаса в растровые и другие форматы

Николай

Некоторые, (не будем называть, кто :shu: ) очень таки используют Бейсик. Но так как уровень знаний не позволяет сказать что-либо путное, приходится скромно стоять в сторонке и читать вопросы продвинутых пользователей...

YS

Работали бы в DELPHI, так нет его официально бесплатного  :(

Vi2

Цитата: YS от 28.03.20, 09:46:52Честно говоря я предвидел такой ответ, но надеялся что в API5 можно таки управлять 3D точками.

API 7 у меня не получается использовать из-за "косячных" com объектов КОМПАСА, в частности, на NET платформе.
А в чём проблема преобразовать из интерфейс 5 версии в 7 версию?

    Dim obj5 As Kompas6API5.Application
    Set obj5 = GetObject(, "Kompas.Application.5")
   
    Dim doc5 As Kompas6API5.Document3D
    Dim doc7 As KompasAPI7.IKompasDocument
    Set doc5 = obj5.ActiveDocument3D
    Set doc7 = obj5.TransferInterface(doc5, ksAPI7Dual, 0)

Таким же образом переводишь icurrentEntity = io3d_points3D.GetByIndex(i) из Entity в Point3D.

    Dim pnt5 As Kompas6API5.Entity ' равный твоему icurrentEntity
    Dim pnt7 As KompasAPI7.Point3D

    Set pnt7 = obj5.TransferInterface(pnt5, ksAPI7Dual, 0)
    ' и вот они pnt7.X, pnt7.Y и pnt7.Z

YS

Цитата: Vi2 от 16.04.20, 22:03:44А в чём проблема преобразовать из интерфейс 5 версии в 7 версию?

    Dim obj5 As Kompas6API5.Application
    Set obj5 = GetObject(, "Kompas.Application.5")
   
    Dim doc5 As Kompas6API5.Document3D
    Dim doc7 As KompasAPI7.IKompasDocument
    Set doc5 = obj5.ActiveDocument3D
    Set doc7 = obj5.TransferInterface(doc5, ksAPI7Dual, 0)

Таким же образом переводишь icurrentEntity = io3d_points3D.GetByIndex(i) из Entity в Point3D.

    Dim pnt5 As Kompas6API5.Entity ' равный твоему icurrentEntity
    Dim pnt7 As KompasAPI7.Point3D

    Set pnt7 = obj5.TransferInterface(pnt5, ksAPI7Dual, 0)
    ' и вот они pnt7.X, pnt7.Y и pnt7.Z

Спасибо за ответ!
"танцами с бубном" я уже свою задачу решил, т.е. мне удалось сочетанием API5+API7 локально (исключительно для своей задачи) обойти неадекватное поведение API КОМПАСа при обработке событий, но проблемы работы API КОМПАСа в NET framework (при написании библиотеки ActiveX) с обработкой событий остались.