Аналог метода GetObjParam в api 7 ?

Автор Doom, 10.08.23, 01:20:05

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

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

Doom

Как в контексте итератора получить параметры осевой линии через интерфейс IDrawingObject ?

сам код:

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

from win32com.client import Dispatch, gencache
# import pythoncom

import ksConstV16 as const_2d_
import ksConst3DV16 as const_3d_

import LDefin2D
import LDefin3D

import KompasApi5V16 as KAPI5
import KompasApi7V16 as KAPI7

api5_ = Dispatch('Kompas.Application.5', None, KAPI5.KompasObject.CLSID)
api7_ = Dispatch('Kompas.Application.7')


uDoc7 = api7_.ActiveDocument
DocType = api5_.ksGetDocumentType(0) # если 0 - то указатель на активный документ

if DocType == LDefin2D.lt_DocSheetStandart or DocType == LDefin2D.lt_DocSheetUser:
   
    Doc2D7 = KAPI7.IKompasDocument2D(uDoc7)
   
    uDoc5 = api5_.ActiveDocument2D()
   
    iIterator = api5_.GetIterator()
    iIterator.ksCreateIterator(LDefin2D.ALL_OBJ, 0)
   
    next_object = iIterator.ksMoveIterator("F")
   
    while uDoc5.ksExistObj(next_object) == 1:
        type_obj = uDoc5.ksGetObjParam(next_object, None, LDefin2D.ALLPARAM)
       
        if type_obj == LDefin2D.AXISLINE_OBJ:
           
            # версии 5: работает ============================================================================
           
            # Next_Obj_Param = api5_.GetParamStruct(LDefin2D.ko_AxisLineParam)
            # Next_Obj_Param.Init()
           
            # uDoc5.ksGetObjParam(next_object, Next_Obj_Param, LDefin2D.ALLPARAM)
           
            # # iAxisLineParam = KAPI5.ksAxisLineParam(next_object)
            # StartPointParam = Next_Obj_Param.GetBegPoint()
                       
            # print(StartPointParam.x)
            # print(StartPointParam.y)
           
            # версии 7 не работает================================================================================
           
            # так тоже можно но нужно иначе прийти к параметрам
            # Next_Obj_Param7 = api5_.TransferReference(next_object,  0)
            # print(Next_Obj_Param7.X1)
            # print(Next_Obj_Param7.Y1)
            # ----------------------------------------------
            # нужно IDrawingObject -> DrawingObjectType -> IAxisLine -> параметры X1, X2, и тд
           
            drawing_object = KAPI7.DrawingObject(next_object)
            # KAPI7 не содержит объект IDrawingObject есть DrawingObject
            # и тупик - полученный объект видимо
           
            # не работает----------------------------------------------
            # AxisLine_Param = KAPI7.IAxisLine(next_object)
            # print(AxisLine_Param.X1)
            # AttributeError: 'int' object has no attribute 'InvokeTypes'
            # ==================================================================================================
            input()
           
           
       
       
        next_object = iIterator.ksMoveIterator("N")
   
    iIterator.ksDeleteIterator()

Scull_

Получаете вариантный массив с типом осевая линия и в цикле просматриваете параметры. Примеров работы с IDrawingObject на форуме достаточно.

Doom

#2
Цитата: Scull_ от 10.08.23, 06:46:43Получаете вариантный массив с типом осевая линия

В итераторе уже есть объект мне нужно его привести к  IDrawingObject -> DrawingObjectType -> IAxisLine

ошибка выходит здесь drawing_object = KAPI7.DrawingObject(next_object)
AttributeError: 'int' object has no attribute 'InvokeTypes'

нашел пример - ... KAPI7.IDrawingObject ... но у KAPI7 нет метода IDrawingObject как это работало?
у меня ide живет собственной жизнью сам резервирует буфер сам настройки принимает и не увидел в дереве объектов IDrawingObject - тогда странно следующая ошибка но должно было работать

drawing_object = KAPI7.IDrawingObject(next_object)
AttributeError: 'int' object has no attribute 'InvokeTypes'


Doom

Цитата: Scull_ от 10.08.23, 10:34:14https://forum.ascon.ru/index.php?topic=26512.msg194951#msg194951
это же я реализовал в коде

# версии 7 не работает================================================================================
           
            # так тоже можно но нужно иначе прийти к параметрам
            # Next_Obj_Param7 = api5_.TransferReference(next_object,  0)
            # print(Next_Obj_Param7.X1)
            # print(Next_Obj_Param7.Y1)


мне нужно как то таким способом прийти к параметрам -

drawing_object = KAPI7.IDrawingObject(next_object)

Нашел на форуме все работает видимо но я получаю ошибку AttributeError: 'int' object has no attribute 'InvokeTypes'


Scull_

Вообще тут можно без итератора обойтись используя API7.
Взять у контейнера непосредственно интерфейс коллекции осевых линий и работать с ним.

Doom

Цитата: Scull_ от 10.08.23, 11:14:07Взять у контейнера непосредственно интерфейс коллекции осевых линий и работать с ним.

Да

С итератором удобнее - можно работать с полученным  объектом как средствами апи 5 так и 7 версии - по удобству.

ide теперь выдает это

    from win32com.client import Dispatch, gencache

  File C:\Program Files\Spyder\pkgs\win32com\__init__.py:8
    import pythoncom

  File C:\Program Files\Spyder\pkgs\pythoncom.py:2
    import pywintypes

ModuleNotFoundError: No module named 'pywintypes'

%%

на виртуалке проверил не каких ошибок в drawing_object = KAPI7.IDrawingObject(next_object)

Doom

Цитата: Doom от 10.08.23, 11:19:22на виртуалке проверил не каких ошибок в drawing_object = KAPI7.IDrawingObject(next_object)

объекты drawing_object:

['Application', 'CLSID', 'Delete', 'DrawingObjectParamType', 'DrawingObjectType', 'LayerNumber', 'Parent', 'Reference', 'Temp', 'Type', 'Update', 'Valid', '_ApplyTypes_', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_good_object_', '_get_good_single_object_', '_oleobj_', '_prop_map_get_', '_prop_map_put_', 'coclass_clsid']

но как только я пытаюсь что то вызвать из этого списка например print(drawing_object.LayerNumber()) -> получаю туже ошибку:

print(drawing_object.LayerNumber)
  File "C:\Python38x64\Lib\site-packages\win32com\client\__init__.py", line 585, in __getattr__
    return self._ApplyTypes_(*args)
  File "C:\Python38x64\Lib\site-packages\win32com\client\__init__.py", line 574, in _ApplyTypes_
    self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args),
AttributeError: 'int' object has no attribute 'InvokeTypes'

Doom

так тоже не получается

drawing_object = KAPI7.IDrawingObject(next_object._oleobj_.QueryInterface(KAPI7.IDrawingObject.CLSID, pythoncom.IID_IDispatch))
# AttributeError: 'int' object has no attribute '_oleobj_'
           
drawing_object = KAPI7.IDrawingObject(next_object._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['IDrawingObject'], pythoncom.IID_IDispatch))
# AttributeError: 'int' object has no attribute '_oleobj_'

Doom

Не могу понять почему в ошибке написано 'int' object - то есть итератор выдает ссылку на объект а не сам объект ?


Doom

как получить объект по Reference для IDrawingObject?

Doom

Упорно думал что нужно использовать TransferInterface почему то..

next_object = api5_.TransferReference(next_object_reference, uDoc5.reference)
drawing_object = KAPI7.IDrawingObject(line_object)

print(drawing_object.LayerNumber)


Валерий Изранов

Цитата: Doom от 10.08.23, 13:32:49# AttributeError: 'int' object has no attribute '
переводится как
объект int' не имеет атрибута

Doom

Цитата: Валерий Изранов от 10.08.23, 22:21:26объект int'

Да я думал до последнего что итератор выдает объект а не ссылку :)

Валерий Изранов

Объект объявлен как целое число.
И естественно никаких атрибутов не имеет.
Похоже так.

Doom

Цитата: Валерий Изранов от 11.08.23, 00:01:25И естественно никаких атрибутов не имеет.

А вот это тогда как понимать ?

['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']