Какой тип переменной у IBezier::Points ?

Автор Doom, 20.08.23, 22:11:19

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

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

Doom

Здравствуйте!

Какой тип переменной Points у IBezier ? В хелпе написано Тип данных: VARIANT типа VT_ARRAY | VT_R8.
принт выдает это <bound method IBezier.Points of <KompasApi7V16.IBezier instance at 0x275401168>>

BezierS_ = drawing_container.Objects(const_2d_.ksDrBezier)
                                   
for iobject in BezierS_:
 iBeziere = KAPI7.IBezier(iobject)
 numL = iBeziere.LayerNumber
 ps = iBeziere.Points
 print(ps)
 input()



Нужно извлечь эти параметры.

Doom

#1
IDrawingObjects ?

тут получаю ошибку - AttributeError: 'function' object has no attribute 'InvokeTypes'


drawing_container1 = KAPI7.IDrawingContainer(ps)
BezierS_point = drawing_container1.Objects(const_2d_.ksDrPoint)

- AttributeError: 'function' object has no attribute 'QueryInterface'
iDrawingObject = KAPI7.IDrawingObjects(ps)
iDrawingObject1 = KAPI7.IDrawingObject1(iDrawingObject)

По сути я должен получить кортеж, но всячески пройтись по элементам кортежа не выходит и количество элементов не получить.

Scull_

Если не знаете, как работать с вариантным массивом, можно воспользоваться следующими методами:
 - IBezier.PointsCount - Количество опорных точек;
 - IBezier.GetPoint - Получить параметры узла.
+ Благодарностей: 1

Вират Лакх

Тут гораздо проще, чем вы думаете.
ps = iBeziere.Points
<bound method IBezier.Points of <KompasApi7V16.IBezier instance at 0x275401168>>
Питон вам нерусским языком говорит, что это метод. А методы должны быть со скобками. Без скобок свойства.
В библиотеке типов вы можете увидеть:
# The method Points is actually a property, but must be used as a method to correctly pass the arguments
def Points(self, AllPoints=defaultNamedNotOptArg):
'Параметры узлов в виде SAFEARRAY | VT_R8.'
return self._ApplyTypes_(3, 2, (12, 0), ((11, 1),), 'Points', None,AllPoints
)
Даже не заглядывая в модуль с типами, в SDK легко можно видеть аргумент ( AllPoints ) в скобках, которые вы упустили.
+ Благодарностей: 1

Doom

Цитата: Scull_ от 21.08.23, 02:18:13Если не знаете, как работать с вариантным массивом,

Через IDrawingContainer - не извлекаются точки - ошибку выдает. Может быть не точки а что то другое нужно?
И как еще получить помимо опорных точек еще и вспомогательные отрезки и углы их ?

Doom

Цитата: Вират Лакх от 21.08.23, 04:58:03Даже не заглядывая в модуль с типами, в SDK легко можно видеть аргумент ( AllPoints ) в скобках, которые вы упустили.

Не совсем понимаю тогда эту функцию.. зачем передавать ей точки если нужно и их же получить?

Вират Лакх

Передавать нужно не точки, а то, в каком виде вы от него хотите получить ответ или в каком виде вы ему даёте массив. Вы SDK читаете? :) Там же это написано.
+ Благодарностей: 1

Doom

#7
Цитата: Вират Лакх от 21.08.23, 11:58:33Передавать нужно не точки, а то, в каком виде вы от него хотите получить ответ или в каком виде вы ему даёте массив. Вы SDK читаете? :) Там же это написано.

я так и поступил:
так понимаю должен получить кортеж а тут ошибка -
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'tuple'

allPoints = ()
ps = iBeziere.Points(allPoints)
print(allPoints)

В SDK не могу найти про этот массив.  Искал по array - там нашел только для Api5 но не для 7.

Doom

Цитата: Scull_ от 21.08.23, 02:18:13- IBezier.GetPoint - Получить параметры узла.

Спасибо!
Param0 = iBeziere.GetPoint(Index = 0)
получил:
True, 55.1534597680851, 182.7314760057979, 50.98768048359952, 172.86455511534308, 59.147281454838094, 192.1911040711962

я так понимаю углы и длины убраны, а выведены только координаты? (так даже удобней для мой задачи)

Scull_

В справке все написано, есть координаты, углы посчитать можно самому.
IBezier.png

Doom

Ааахах, я смотрю на структуру функции и думаю ее все надо заполнять а глаза до пункта Входные параметры так и не дошли :) :)

Doom

Цитата: Doom от 21.08.23, 12:08:24я так и поступил:
так понимаю должен получить кортеж а тут ошибка -
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'tuple'

Входной параметр - bool(True) - вывел множество координат

Вират Лакх

Во, справились. Аргумент AllPoints вы выбираете: True или False. А ответ вы получите в вашу переменную ps как результат функции. Питон в аргументы не возвращает результаты функций как некоторые другие языки умеют. Но тут даже не тот случай, про который вы думали. А ещё вы пытались изменить неизменяемую последовательность кортеж (это можно сделать, но как-то непросто).
ps = iBeziere.Points(False)
print(ps)
Вбейте в сдк в поиске IBezier, у него свойства, там Points

Doom

Я смотрю на параметры функции и думаю - надо заполнять.. ввел все координаты и функция любезно мне их вернула :)

Scull_

Не всё параметры нужно заполнять, нужно передать переменные для записи в них значений.
Посмотрите внимательно на картинки и не забывайте внимательно читать.
IBezier_1.png

Doom

#15
Цитата: Вират Лакх от 21.08.23, 13:39:28Питон в аргументы не возвращает результаты функций как некоторые другие языки умеют.

я уже видел подобный механизм в других САПРах  на Python когда переписывал код

В К для ksSelectGroup:
TGroup = Doc2D5.ksNewGroup(1)
Doc2D5.ksEndObj()

Doc2D5.ksSelectGroup(g=TGroup, selectMode=3, xmin=20, ymin=20, xmax=21, ymax=21)

Scull_


Doom

Цитата: Scull_ от 23.08.23, 22:01:10Доцент, у Вас проблемы?

Пока все работает.. Группа заполняется объектами, а что не так ?

В аргументы функции ksSelectGroup подается ссылка на группу для заполнения а результатом будет 1 в случае успеха.

Doom

Scull_ если Вы чего то не знаете - спрашивайте, я не кусаюсь.

Doom

#19
Похоже что то не то, в хелпе по SelectGroup  написано : Если указатель на группу равен нулю, то добавление производится в группу выделения (т.е. происходит выделение объектов документа).

Так что в итоге происходит если указать группу ? Правильно же? группа которая пустая указал ссылку на нее в SelectGroup  и группа заполнилась объектами (Проверил все точно).

Scull_, хелп вызывает ряд вопросов - а Вы еще сверху подкидываете ? :)