воспроизвести информационный слой Dymola из скрипта Python - PullRequest
1 голос
/ 30 октября 2019

Я хотел бы написать скрипт Python для извлечения той же информации о входах и выходах функции Modelica, как показано на информационном слое Dymola, например, для функции синуса:

4782

Я хотел бы показать минимальный пример, но я даже не знаю, с чего начать.

1 Ответ

3 голосов
/ 31 октября 2019

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...