Dymola генерирует эту информацию на лету для документации модели, но я не знаю, как ее получить.
Библиотека ModelManagement
(поставляется с Dymola и включена в стандартную лицензию) позволяетизвлечь такую информацию из загруженных классов. Тем не менее, это немного больно использовать. Проблема в том, что большинство функций в этой библиотеке анализируют только точный код класса - расширенные классы не рассматриваются. Следовательно, вы должны сами зацикливаться на расширенных классах.
Ниже приведен пример, который пытается получить все определения компонентов класса, включая те, которые унаследованы от расширенных классов. Для каждого компонента возвращается dict с несколькими свойствами, что соответствует записи ModelManagement.Structure.AST.ComponentAttributes
в Dymola. Он содержит такую информацию, как имя компонента, его описание, его изменчивость, наличие префиксов input
и output
и т. Д.
Так что для вашего примера Modelica.Math.sin
входы и выходы класса * можно легко определить с помощьюключи dict isOutput
и isInput
.
Но имейте в виду, что это не работает для входных и выходных разъемов таких блоков, как Modelica.Blocks.Interfaces.RealInput
, и а-причинных разъемов, таких как электрические контакты. Вам нужно будет что-то реализовать самостоятельно, чтобы идентифицировать их.
Приведенный ниже код просто использует фиксированные пути классов для перечисления всех входных и выходных соединителей Modelica.Blocks.Continuous.Integrator
. Дополнительно он выводит все свои параметры.
import pprint
from dymola.dymola_interface import DymolaInterface
def get_extends(dym, c):
""" return a list with all extended classes (including inherited extends) """
extends = dym.ExecuteCommand(f'ModelManagement.Structure.AST.ExtendsInClassAttributes("{c}")')
for e in extends.copy():
sub_extends = get_extends(dym, e['fullTypeName'])
# only add sub-extends if they are not already in the list
for s in sub_extends:
if not any(s['fullTypeName'] == tmp_e['fullTypeName'] for tmp_e in extends):
extends.append(s)
return extends
def get_components(dym, c):
""" return a list with all components in a class (including inherited ones )"""
# get components defined in the class itself
comp = dym.ExecuteCommand(f'ModelManagement.Structure.AST.ComponentsInClassAttributes("{c}")')
# get components defined in extended classes itself
for e in get_extends(dym, c):
comp.extend(dym.ExecuteCommand(
f'ModelManagement.Structure.AST.ComponentsInClassAttributes("{e["fullTypeName"]}")'))
return comp
if __name__ == '__main__':
modelica_class = 'Modelica.Blocks.Continuous.Integrator'
# get all components in the model
dymola = DymolaInterface(showwindow=False)
components = get_components(dymola, modelica_class)
dymola.close()
# extract inputs and parameters
inputs = ['Modelica.Blocks.Interfaces.RealInput', 'Modelica.Blocks.Interfaces.BooleanInput',
'Modelica.Blocks.Interfaces.BooleanInput']
inputs = [c for c in components if c['fullTypeName'] in inputs]
parameters = [c for c in components if c['variability'] == 'parameter']
print('-------- inputs ------------')
pprint.pprint(inputs)
print('\n\n-------- parameters ------------')
pprint.pprint(parameters)