Косяки в АПИ КОМПАС

Автор MasterMVC, 06.09.21, 23:25:13

« назад - далее »

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

MasterMVC

1) Не работает функция IKompasDocument3D1Ptr->ExcludeObjects передаю массив variant_t DISPATCH объектов в функцию. Но функция не работает. Передаю этот же массив в селектор объекты подсвечиваются.
2) Также не работает свойство ksPart::needRebuild. После установки ksPart::needRebuild=VARIANT_FALSE и установки свойств ksEntity с последующим вызовом функции ksEntity::Update возвращает false и  при дальнейшем вызове ksPart::RebuildModelEx(VARIANT_TRUE) изменение установленных свойств ksEntity не происходит.
3)При селектировании объектов через API невозможно применить команды через - KompasObject::ksExecuteKompasCommand. Селектирование через АПИ проходит- объекты подсвечиваются, но команды не выполняются. Если же выполнить селектирование вручную, то те же команды выполняются.

Прошу команду Аскона не указывать у себя в SDK функции и методы которые не поддерживаются(являются не рабочими)!
Так же прошу исправить указанные выше косяки или убрать эти методы из SDK.

Vi2

Цитата: MasterMVC от 06.09.21, 23:25:131) Не работает функция IKompasDocument3D1Ptr->ExcludeObjects передаю массив variant_t DISPATCH объектов в функцию. Но функция не работает. Передаю этот же массив в селектор объекты подсвечиваются.
Описание функции в хелпе простенькое, но похоже объекты должны иметь вполне определённый тип, который ещё и отличается от типа для селектора объектов. Ну, например, IFeature и IEntity. А почему бы и нет?

MasterMVC

Цитата: Vi2 от 07.09.21, 09:36:50Описание функции в хелпе простенькое, но похоже объекты должны иметь вполне определённый тип, который ещё и отличается от типа для селектора объектов. Ну, например, IFeature и IEntity. А почему бы и нет?
Вы сначала проверьте или подумайте прежде чем писать ярунду и засорять тему.

333

IKompasDocument3D1Ptr->ExcludeObjects функция API7
И работает она с указателями на интерфейсы API7
IModelObject IFeature7

333

2) Здесь нужен более расширенный пример
Есть библиотеки которые успешно используют ksPart::needRebuild

3) Здесь тоже хотелось бы увидеть более расширенный пример
   Также есть библиотеки которые это используют и там работает

p3452

Если не трудно, продемонстрируйте скрин с описанием интерфейса "IKompasDocument3D1Ptr".

333

Ищи в справке SDK IKompasDocument3D1
IKompasDocument3D1Ptr это обертка над интерфейсом создается после импорта
#import "kAPI7.tlb"         no_namespace named_guids
см примеры SDK

Vi2

Мне нетрудно.
    [
      odl,
      uuid(92AB02F7-2C68-4A74-9E74-70C51E015FEF),
      helpstring("Дополнительный интерфейс для 3D документа."),
      helpcontext(0x00528cd0),
      dual,
      nonextensible,
      oleautomation
    ]
    interface IKompasDocument3D1 : IDispatch {
        [id(0x000013a5), propput, helpstring("Скрыть / показать компановочную геометрию."), helpcontext(0x00528cd1)]
        HRESULT HideLayoutGeometry([in, optional, defaultvalue(0)] VARIANT_BOOL PVal);
        [id(0x000013a5), propget, helpstring("Скрыть / показать компановочную геометрию."), helpcontext(0x00528cd1)]
        HRESULT HideLayoutGeometry([out, retval] VARIANT_BOOL* PVal);
        [id(0x000013a6), propput, helpstring("Редактируемый объект"), helpcontext(0x00528cd2)]
        HRESULT EditObject([in] IFeature7* Result);
        [id(0x000013a6), propget, helpstring("Редактируемый объект"), helpcontext(0x00528cd2)]
        HRESULT EditObject([out, retval] IFeature7** Result);
        [id(0x000013a7), propget, helpstring("Менеджер 3D документа."), helpcontext(0x00528cd3)]
        HRESULT Document3DManager([out, retval] IDocument3DManager** PVal);
        [id(0x000013a8), propget, helpstring("Неуказанная шероховатость 3D."), helpcontext(0x00528cd4)]
        HRESULT SpecRough([out, retval] ISpecRough3D** PVal);
        [id(0x000013a9), helpstring("Очистить undo контейнер."), helpcontext(0x00528cd3)]
        HRESULT ClearUndo([out, retval] VARIANT_BOOL* Result);
        [id(0x000013aa), propget, helpstring("Коллекция сопряжений."), helpcontext(0x00528cd4)]
        HRESULT MateConstraints([out, retval] IMateConstraints3D** Result);
        [id(0x000013ab), helpstring("Исключить из расчета объект или объекты."), helpcontext(0x00528cd5)]
        HRESULT ExcludeObjects([in] VARIANT Objects, [in] VARIANT_BOOL Excl, [out, retval] VARIANT_BOOL* Result);
        [id(0x000013ac), helpstring("Запустить процесс вставки компонента из файла или библиотеки моделей."), helpcontext(0x00528cd6)]
        HRESULT ExecuteProcessOfInsertComponentFromFile([in] BSTR FileName, [in] ProcessTypeEnum ProcessType, [out, retval] VARIANT_BOOL* Result);
        [id(0x000013ad), propget, helpstring("Получить объект процесса."), helpcontext(0x00528cd7)]
        HRESULT LibProcess([in] ksProcess3DTypeEnum ProcessType, [out, retval] IProcess3D** Result);
    };

p3452

333 и Vi2, спасибо за ответ и много строк :o:

Slaviation

Цитировать1) Не работает функция IKompasDocument3D1Ptr->ExcludeObjects передаю массив variant_t DISPATCH объектов в функцию. Но функция не работает. Передаю этот же массив в селектор объекты подсвечиваются.

Добрый день.
Проверил - работает. Тест прилагаю.

# -*- coding: utf-8 -*-

#~ Открыть сборку, содержащую не менее трех компонентов, запустить скрипт.
#~ Скрипт исключит из расчета и обратно включит первый и третий компоненты сборки.

import pythoncom
from win32com.client import Dispatch, gencache
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
kompas_api_object = kompas_api7_module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
application = kompas_api_object.Application
kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
kmpas_document_3d1 =  kompas_api7_module.IKompasDocument3D1(kompas_document_3d)
part_1 = kompas_document_3d.TopPart.PartsEx(kompas6_constants_3d.ksAllParts)[0]
part_3 = kompas_document_3d.TopPart.PartsEx(kompas6_constants_3d.ksAllParts)[2]
parts = [part_1, part_3]
kmpas_document_3d1.ExcludeObjects(parts, True)
kompas_object.ksMessage("Исключили")
kmpas_document_3d1.ExcludeObjects(parts, False)
kompas_object.ksMessage("Обратно включили")

MasterMVC

Спасибо всем конечно за советы, но справкой я умею пользоваться. Для моего случая не работает. Я попал в тот случай когда api не работает предсказуемо. В справке ничего не сказано об исключительных ситуациях(в которые я попал). Так же не плохо было бы в будущем в айпи не просто возвращать false/true из методов но если false так же номер определенной ошибки, так бы освоение айпи было бы намного лучше.

Slaviation

Добрый день.
MasterMVC, разрешилась ли проблема, описанная вами в п.1 ?

Vi2

Цитата: MasterMVC от 15.09.21, 21:09:10В справке ничего не сказано об исключительных ситуациях(в которые я попал). Так же не плохо было бы в будущем в айпи не просто возвращать false/true из методов но если false так же номер определенной ошибки, так бы освоение айпи было бы намного лучше.
Там возвращается как false/true из метода, так и состояние выполнения через HRESULT:
[id(0x000013ab), helpstring("Исключить из расчета объект или объекты."), helpcontext(0x00528cd5)]
HRESULT ExcludeObjects([in] VARIANT Objects, [in] VARIANT_BOOL Excl, [out, retval] VARIANT_BOOL* Result);
Поэтому разумно предположить, что функция возвращает false при невыполнении действия и передаёт соответствующий код через HRESULT. Хотя, судя по Хелпу, этот возврат будет такой же лаконичный, типа E_FAIL, а то и вообще S_OK.