From 4cfe7c3a0e8e3aab7a58d33c607e67dcb89911bb Mon Sep 17 00:00:00 2001 From: Joppe Blondel Date: Mon, 20 Jul 2026 18:17:45 +0200 Subject: [PATCH] Fixed om emission --- BEdit/src/bedit/core/simulation/compiler.py | 10 +- BEdit/src/bedit/core/simulation/service.py | 1 + .../bedit/gui/dialogs/simulation_settings.py | 46 ++++- .../ui_simulation_settings_dialog.py | 75 +++++++- BEdit/ui/simulation_settings_dialog.ui | 181 +++++++++++++++++- BEdit/untitled.bedit.json | 9 +- 6 files changed, 301 insertions(+), 21 deletions(-) diff --git a/BEdit/src/bedit/core/simulation/compiler.py b/BEdit/src/bedit/core/simulation/compiler.py index cb91777..d87cd39 100644 --- a/BEdit/src/bedit/core/simulation/compiler.py +++ b/BEdit/src/bedit/core/simulation/compiler.py @@ -86,7 +86,7 @@ def emit_model( del id_list # Kept in the public API for compiler extensions and inspection. indentation = "\t" * indent body_indent = "\t" * (indent + 1) - model_name = identifier(graph["id"]) + model_name = model_name_for(graph) lines = [f"{indentation}model {model_name}"] implementation = graph.get("implementation", {}) implementation_kind = implementation.get("kind") @@ -123,7 +123,7 @@ def emit_model( if implementation_kind == "graph": for block in nested_graph.get("blocks", []): - block_type = identifier(block["id"]) + block_type = model_name_for(block) block_name = identifier(block["name"]) lines.append(f"{body_indent}{block_type} {block_name};") for junction in nested_graph.get("junctions", []): @@ -322,5 +322,11 @@ def identifier(value: str) -> str: return normalized +def model_name_for(component: dict[str, Any]) -> str: + """Return the generated Modelica type name for a component.""" + + return identifier(f"m_{component['name']}") + + def _junction_name(junction_id: str) -> str: return identifier(f"junction_{junction_id}") diff --git a/BEdit/src/bedit/core/simulation/service.py b/BEdit/src/bedit/core/simulation/service.py index 0f1fe3d..fddb3a0 100644 --- a/BEdit/src/bedit/core/simulation/service.py +++ b/BEdit/src/bedit/core/simulation/service.py @@ -24,3 +24,4 @@ class Simulation: self.id_list = result.objects_by_id self.last_compilation_output = result.modelica log.info("Generated Modelica model:\n%s", self.last_compilation_output) + log.info("Simulation settings:\n%s", self.last_compilation_input['implementation']['graph']['simulation']) diff --git a/BEdit/src/bedit/gui/dialogs/simulation_settings.py b/BEdit/src/bedit/gui/dialogs/simulation_settings.py index 00552d7..e1e6752 100644 --- a/BEdit/src/bedit/gui/dialogs/simulation_settings.py +++ b/BEdit/src/bedit/gui/dialogs/simulation_settings.py @@ -1,6 +1,6 @@ from copy import deepcopy -from PySide6.QtWidgets import QDialog +from PySide6.QtWidgets import QButtonGroup, QDialog from bedit.gui.generated.ui_simulation_settings_dialog import Ui_SimulationSettingsDialog @@ -11,12 +11,50 @@ class SimulationSettingsDialog(QDialog): self.ui = Ui_SimulationSettingsDialog() self.ui.setupUi(self) self._settings = deepcopy(settings) - self.ui.placeholderCheckBox.setChecked( - bool(self._settings.get("enabled", False)) + + self.interval_mode_group = QButtonGroup(self) + self.interval_mode_group.setExclusive(True) + self.interval_mode_group.addButton(self.ui.numberOfIntervalsRadioButton) + self.interval_mode_group.addButton(self.ui.intervalTimeRadioButton) + + self.ui.startTimeSpinBox.setValue(float(settings.get("startTime", 0.0))) + self.ui.stopTimeSpinBox.setValue(float(settings.get("stopTime", 1.0))) + self.ui.numberOfIntervalsSpinBox.setValue( + int(settings.get("numberOfIntervals", 500)) ) + self.ui.intervalTimeSpinBox.setValue(float(settings.get("intervalTime", 0.002))) + + interval_mode = settings.get("intervalMode", "numberOfIntervals") + if interval_mode == "intervalTime": + self.ui.intervalTimeRadioButton.setChecked(True) + else: + self.ui.numberOfIntervalsRadioButton.setChecked(True) + + self.ui.numberOfIntervalsRadioButton.toggled.connect( + self._update_interval_fields + ) + self.ui.intervalTimeRadioButton.toggled.connect(self._update_interval_fields) + self._update_interval_fields() + + def _update_interval_fields(self) -> None: + use_number = self.ui.numberOfIntervalsRadioButton.isChecked() + self.ui.numberOfIntervalsSpinBox.setEnabled(use_number) + self.ui.intervalTimeSpinBox.setEnabled(not use_number) @property def settings(self) -> dict: values = deepcopy(self._settings) - values["enabled"] = self.ui.placeholderCheckBox.isChecked() + values.update( + { + "startTime": self.ui.startTimeSpinBox.value(), + "stopTime": self.ui.stopTimeSpinBox.value(), + "intervalMode": ( + "numberOfIntervals" + if self.ui.numberOfIntervalsRadioButton.isChecked() + else "intervalTime" + ), + "numberOfIntervals": self.ui.numberOfIntervalsSpinBox.value(), + "intervalTime": self.ui.intervalTimeSpinBox.value(), + } + ) return values diff --git a/BEdit/src/bedit/gui/generated/ui_simulation_settings_dialog.py b/BEdit/src/bedit/gui/generated/ui_simulation_settings_dialog.py index f5984a0..2376329 100644 --- a/BEdit/src/bedit/gui/generated/ui_simulation_settings_dialog.py +++ b/BEdit/src/bedit/gui/generated/ui_simulation_settings_dialog.py @@ -15,25 +15,76 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont, QFontDatabase, QGradient, QIcon, QImage, QKeySequence, QLinearGradient, QPainter, QPalette, QPixmap, QRadialGradient, QTransform) -from PySide6.QtWidgets import (QAbstractButton, QApplication, QCheckBox, QDialog, - QDialogButtonBox, QGroupBox, QSizePolicy, QSpacerItem, - QVBoxLayout, QWidget) +from PySide6.QtWidgets import (QAbstractButton, QAbstractSpinBox, QApplication, QDialog, + QDialogButtonBox, QDoubleSpinBox, QFormLayout, QGroupBox, + QLabel, QRadioButton, QSizePolicy, QSpacerItem, + QSpinBox, QVBoxLayout, QWidget) class Ui_SimulationSettingsDialog(object): def setupUi(self, SimulationSettingsDialog): if not SimulationSettingsDialog.objectName(): SimulationSettingsDialog.setObjectName(u"SimulationSettingsDialog") - SimulationSettingsDialog.resize(420, 180) + SimulationSettingsDialog.resize(420, 384) self.dialogLayout = QVBoxLayout(SimulationSettingsDialog) self.dialogLayout.setObjectName(u"dialogLayout") self.settingsGroup = QGroupBox(SimulationSettingsDialog) self.settingsGroup.setObjectName(u"settingsGroup") self.settingsLayout = QVBoxLayout(self.settingsGroup) self.settingsLayout.setObjectName(u"settingsLayout") - self.placeholderCheckBox = QCheckBox(self.settingsGroup) - self.placeholderCheckBox.setObjectName(u"placeholderCheckBox") + self.simulationInterval = QGroupBox(self.settingsGroup) + self.simulationInterval.setObjectName(u"simulationInterval") + self.simulationInterval.setEnabled(True) + self.formLayout = QFormLayout(self.simulationInterval) + self.formLayout.setObjectName(u"formLayout") + self.label = QLabel(self.simulationInterval) + self.label.setObjectName(u"label") - self.settingsLayout.addWidget(self.placeholderCheckBox) + self.formLayout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.label) + + self.startTimeSpinBox = QDoubleSpinBox(self.simulationInterval) + self.startTimeSpinBox.setObjectName(u"startTimeSpinBox") + self.startTimeSpinBox.setEnabled(True) + + self.formLayout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.startTimeSpinBox) + + self.label_2 = QLabel(self.simulationInterval) + self.label_2.setObjectName(u"label_2") + + self.formLayout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.label_2) + + self.stopTimeSpinBox = QDoubleSpinBox(self.simulationInterval) + self.stopTimeSpinBox.setObjectName(u"stopTimeSpinBox") + self.stopTimeSpinBox.setValue(1.000000000000000) + + self.formLayout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.stopTimeSpinBox) + + self.numberOfIntervalsRadioButton = QRadioButton(self.simulationInterval) + self.numberOfIntervalsRadioButton.setObjectName(u"numberOfIntervalsRadioButton") + + self.formLayout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.numberOfIntervalsRadioButton) + + self.intervalTimeRadioButton = QRadioButton(self.simulationInterval) + self.intervalTimeRadioButton.setObjectName(u"intervalTimeRadioButton") + + self.formLayout.setWidget(3, QFormLayout.ItemRole.LabelRole, self.intervalTimeRadioButton) + + self.numberOfIntervalsSpinBox = QSpinBox(self.simulationInterval) + self.numberOfIntervalsSpinBox.setObjectName(u"numberOfIntervalsSpinBox") + self.numberOfIntervalsSpinBox.setMaximum(999999999) + self.numberOfIntervalsSpinBox.setValue(500) + + self.formLayout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.numberOfIntervalsSpinBox) + + self.intervalTimeSpinBox = QDoubleSpinBox(self.simulationInterval) + self.intervalTimeSpinBox.setObjectName(u"intervalTimeSpinBox") + self.intervalTimeSpinBox.setDecimals(5) + self.intervalTimeSpinBox.setStepType(QAbstractSpinBox.StepType.AdaptiveDecimalStepType) + self.intervalTimeSpinBox.setValue(0.002000000000000) + + self.formLayout.setWidget(3, QFormLayout.ItemRole.FieldRole, self.intervalTimeSpinBox) + + + self.settingsLayout.addWidget(self.simulationInterval) self.settingsSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) @@ -59,6 +110,14 @@ class Ui_SimulationSettingsDialog(object): def retranslateUi(self, SimulationSettingsDialog): SimulationSettingsDialog.setWindowTitle(QCoreApplication.translate("SimulationSettingsDialog", u"Simulation Settings", None)) self.settingsGroup.setTitle(QCoreApplication.translate("SimulationSettingsDialog", u"Settings", None)) - self.placeholderCheckBox.setText(QCoreApplication.translate("SimulationSettingsDialog", u"Enable simulation option", None)) + self.simulationInterval.setTitle(QCoreApplication.translate("SimulationSettingsDialog", u"Simulation Interval", None)) + self.label.setText(QCoreApplication.translate("SimulationSettingsDialog", u"Start time:", None)) + self.startTimeSpinBox.setPrefix("") + self.startTimeSpinBox.setSuffix(QCoreApplication.translate("SimulationSettingsDialog", u"s", None)) + self.label_2.setText(QCoreApplication.translate("SimulationSettingsDialog", u"Stop time:", None)) + self.stopTimeSpinBox.setSuffix(QCoreApplication.translate("SimulationSettingsDialog", u"s", None)) + self.numberOfIntervalsRadioButton.setText(QCoreApplication.translate("SimulationSettingsDialog", u"Number of intervals:", None)) + self.intervalTimeRadioButton.setText(QCoreApplication.translate("SimulationSettingsDialog", u"Interval:", None)) + self.intervalTimeSpinBox.setSuffix(QCoreApplication.translate("SimulationSettingsDialog", u"s", None)) # retranslateUi diff --git a/BEdit/ui/simulation_settings_dialog.ui b/BEdit/ui/simulation_settings_dialog.ui index a646fc9..097043e 100644 --- a/BEdit/ui/simulation_settings_dialog.ui +++ b/BEdit/ui/simulation_settings_dialog.ui @@ -2,16 +2,185 @@ SimulationSettingsDialog - 00420180 - Simulation Settings + + + 0 + 0 + 420 + 311 + + + + Simulation Settings + - SettingsEnable simulation optionQt::Orientation::Vertical2040 - QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + + + General + + + + + + true + + + Simulation Interval + + + + + + Start time: + + + + + + + true + + + + + + s + + + + + + + Stop time: + + + + + + + s + + + 1.000000000000000 + + + + + + + Number of intervals: + + + + + + + Interval: + + + + + + + 999999999 + + + 500 + + + + + + + s + + + 5 + + + QAbstractSpinBox::StepType::AdaptiveDecimalStepType + + + 0.002000000000000 + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + + + + Gui::IntSpinBox + QSpinBox +
Gui/SpinBox.h
+
+ + Gui::DoubleSpinBox + QDoubleSpinBox +
Gui/SpinBox.h
+
+
- buttonBoxaccepted()SimulationSettingsDialogaccept() - buttonBoxrejected()SimulationSettingsDialogreject() + + buttonBox + accepted() + SimulationSettingsDialog + accept() + + + 20 + 20 + + + 20 + 20 + + + + + buttonBox + rejected() + SimulationSettingsDialog + reject() + + + 20 + 20 + + + 20 + 20 + + +
diff --git a/BEdit/untitled.bedit.json b/BEdit/untitled.bedit.json index 5cb4af8..958e5a8 100644 --- a/BEdit/untitled.bedit.json +++ b/BEdit/untitled.bedit.json @@ -648,7 +648,14 @@ ], "annotations": [], "junctions": [], - "simulation": {} + "simulation": { + "enabled": false, + "startTime": 0.0, + "stopTime": 10.0, + "intervalMode": "numberOfIntervals", + "numberOfIntervals": 5000, + "intervalTime": 0.002 + } } } }