Ошибка при взаимодействии с LiraResAPI через python

Добрый день.Пытаюсь подключится к API с помощью модуля comtypes.Для начала хочу реализовать пример1 из документации. Но при вызове метода CreateNewRequest всплывает ошибка.Код import comtypes import comtypes.client LiraSaprRes = comtypes.client.GetModule(r"C:\Program Files (x86)\LIRA SAPR\LIRA SAPR 2024\Bin\x64\LiraResAPI.dll") result = LiraSaprRes.LiraResultsAccess() iresult = result.QueryInterface(LiraSaprRes.ILiraResultsAccess) request =...

Страницы: 1
RSS
Ошибка при взаимодействии с LiraResAPI через python
 
Добрый день.
Пытаюсь подключится к API с помощью модуля comtypes.
Для начала хочу реализовать пример1 из документации. Но при вызове метода CreateNewRequest всплывает ошибка.
Код
import comtypes
import comtypes.client

LiraSaprRes = comtypes.client.GetModule(r"C:\Program Files (x86)\LIRA SAPR\LIRA SAPR 2024\Bin\x64\LiraResAPI.dll")
result = LiraSaprRes.LiraResultsAccess()
iresult = result.QueryInterface(LiraSaprRes.ILiraResultsAccess)
request = iresult.CreateNewRequest(LiraSaprRes.LiraRequestEnum.kLiraRequest_LoadCaseDisplacement)

Ошибка следующая
Код
Traceback (most recent call last):
  File "C:/lirapythonAPI/com_lira_sapr_res5.py", line 11, in <module>
    request = iresult.CreateNewRequest(LiraSaprRes.LiraRequestEnum.kLiraRequest_LoadCaseDisplacement)
_ctypes.COMError: (-2147467263, 'Не поддерживается', (None, None, None, 0, None)

У кого-нибудь есть идеи, что я делаю неправильно? Сделал реализацию и на Excel VBA, там все работает.

При этом в python все классы, интерфейсы и прочее из DLL импортируются нормально, я могу создавать экземпляры и т.д. Но ошибки возникают, когда пытаюсь вызвать методы классов.
Изменено: ak1m - 05.12.2024 11:05:24
 
Добрый день, ak1m

Исправленный текст программы, см. ниже

from comtypes.client import GetModule, CreateObject
from comtypes.gen import LiraFemRes  

GetModule(r"C:\Program Files (x86)\LIRALAND\LIRA-FEM 2025\Bin\x64\LiraResAPI.dll")

result = CreateObject(LiraFemRes.LiraResultsAccess)

iresult = result.QueryInterface(LiraFemRes.ILiraResultsAccess)
request = iresult.CreateNewRequest(LiraFemRes.LiraRequestEnum.kLiraRequest_LoadCaseDisplacement)

С уважением, Алексей Тищенко
 
Дополнение
Цитата
как можно через API получить список узлов, которые сейчас выделены в модели?

У объекта LiraDocument есть метод GetSelection

С уважением, Алексей Тищенко
 
Спасибо. Дописал пример. Вдруг будет кому-нибудь полезно.
Код
from comtypes.client import GetModule, CreateObject
from comtypes.gen import LiraSaprRes

GetModule(r"C:\Program Files (x86)\LIRA SAPR\LIRA SAPR 2024\Bin\x64\LiraResAPI.dll")

result = CreateObject(LiraSaprRes.LiraResultsAccess)
result = result.QueryInterface(LiraSaprRes.ILiraResultsAccess)
request = result.CreateNewRequest(LiraSaprRes.LiraRequestEnum.kLiraRequest_LoadCaseDisplacement)
request = request.QueryInterface(LiraSaprRes.ILiraLoadCaseDisplacementsRequest)

request.DocumentName = "test_file"
request.Nodes.AddFromString("1-5")

response = result.LoadCaseDisplacements(request)

lc = 1

for i in range(request.Nodes.Count):
    node = request.Nodes.Item[i]
    x = response.GetNodeX(node, lc)
    y = response.GetNodeY(node, lc)
    z = response.GetNodeZ(node, lc)

    print(f'Node:{node}')
    print(f'X:{x}')
    print(f'Y:{y}')
    print(f'Z:{z}\n')

alekstish, напишите пожалуйста пример использования метода GetSelection. Судя по описанию он принимает в качестве первого аргумента указатель pNumbers. Что под ним подразумевается?

 
В общем все оказалось проще. Этот указатель передается автоматически. Все работает.
Дописал код, чтобы анализировал только выбранные узлы. Спасибо за помощь. :)  
Код
#! usr/bin/env python
 # -*- coding: utf-8 -*-
 
 from comtypes.client import GetModule, CreateObject
 GetModule(r'C:\Program Files (x86)\LIRA SAPR\LIRA SAPR 2024 DEMO\Bin\x64\LiraSapr.exe')
 GetModule(r'C:\Program Files (x86)\LIRA SAPR\LIRA SAPR 2024 DEMO\Bin\x64\LiraResAPI.dll')
 from comtypes.gen import LiraSapr
 from comtypes.gen import LiraSaprRes
 
 
 app = CreateObject(LiraSapr.LiraApplication)
 app = app.QueryInterface(LiraSapr.ILiraApplication)
 doc = app.ActiveDocument
 doc = doc.QueryInterface(LiraSapr.ILiraDocument)
 print(doc.PathName)
 
 
 selected_nodes = doc.GetSelection(Subj = LiraSapr.LiraSelEnum.kLiraSel_Ns)
 selected_elems = doc.GetSelection(Subj = LiraSapr.LiraSelEnum.kLiraSel_Els)
 selected_nodes_str = ','.join(str(i) for i in selected_nodes)
 selected_elems_str = ','.join(str(i) for i in selected_elems)
 
 print(f'Выбраны узлы: {selected_nodes_str}')
 print(f'Выбраны элементы: {selected_elems_str}')
 
 ##help(LiraSapr)
 
 result = CreateObject(LiraSaprRes.LiraResultsAccess)
 result = result.QueryInterface(LiraSaprRes.ILiraResultsAccess)
 request = result.CreateNewRequest(LiraSaprRes.LiraRequestEnum.kLiraRequest_LoadCaseDisplacement)
 request = request.QueryInterface(LiraSaprRes.ILiraLoadCaseDisplacementsRequest)
 
 request.DocumentName = doc.Title
 request.Nodes.AddFromString(selected_nodes_str)
 
 response = result.LoadCaseDisplacements(request)
 
 
 lc = 1
 
 for i in range(request.Nodes.Count):
     node = request.Nodes.Item[i]
     x = response.GetNodeX(node, lc)
     y = response.GetNodeY(node, lc)
     z = response.GetNodeZ(node, lc)
 
     print(f'Node:{node}')
     print(f'X:{x}')
     print(f'Y:{y}')
     print(f'Z:{z}\n')
Страницы: 1
Читают тему (гостей: 2)