feat(core): add ModelicaFmuEntity for first-class FMU support, auto-r… · modelscript/modelscript@770c9fb · GitHub
Skip to content

Commit 770c9fb

Browse files
committed
feat(core): add ModelicaFmuEntity for first-class FMU support, auto-resolve FMU XML as Modelica blocks
1 parent 13f1d07 commit 770c9fb

5 files changed

Lines changed: 305 additions & 29 deletions

File tree

Lines changed: 236 additions & 0 deletions

‎packages/core/src/compiler/modelica/model.ts‎

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1763,7 +1763,27 @@ export class ModelicaEntity extends ModelicaClassInstance {
17631763
const pkgPath = context.fs.join(this.path, dirent.name, "package.mo");
17641764
if (!context.fs.stat(pkgPath)?.isFile()) continue;
17651765
} else if (dirent.isFile()) {
1766-
if (dirent.name === "package.mo" || context.fs.extname(dirent.name) !== ".mo") continue;
1766+
const ext = context.fs.extname(dirent.name);
1767+
if (dirent.name === "package.mo") continue;
1768+
// Check for FMI model description XML files
1769+
if (ext === ".xml") {
1770+
const xmlPath = context.fs.join(this.path, dirent.name);
1771+
try {
1772+
const xmlContent = context.fs.read(xmlPath);
1773+
if (xmlContent.includes("fmiModelDescription")) {
1774+
// Lazy import to avoid circular dependency (fmu.ts imports from model.ts)
1775+
// eslint-disable-next-line @typescript-eslint/no-require-imports
1776+
const { ModelicaFmuEntity } = require("./fmu.js") as typeof import("./fmu.js");
1777+
const fmuEntity = new ModelicaFmuEntity(this, xmlPath);
1778+
fmuEntity.name = dirent.name.replace(/\.xml$/, "");
1779+
this.subEntities.push(fmuEntity as unknown as ModelicaEntity);
1780+
}
1781+
} catch {
1782+
// Skip unreadable XML files
1783+
}
1784+
continue;
1785+
}
1786+
if (ext !== ".mo") continue;
17671787
}
17681788
const subEntity = new ModelicaEntity(this, context.fs.join(this.path, dirent.name));
17691789
// Set name from filesystem path without parsing — enables lazy loading

‎packages/core/src/index.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export * from "./compiler/modelica/flattener.js";
1313
export * from "./compiler/modelica/fmi.js";
1414
export * from "./compiler/modelica/fmu-archive.js";
1515
export * from "./compiler/modelica/fmu-codegen.js";
16+
export * from "./compiler/modelica/fmu.js";
1617
export * from "./compiler/modelica/i18n.js";
1718
export * from "./compiler/modelica/interpreter.js";
1819
export * from "./compiler/modelica/linter.js";

‎packages/vscode/src/browserClientMain.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -620,15 +620,15 @@ async function initWorkspaceAndTree(
620620
"",
621621
].join("\n");
622622

623-
// Write all three files
623+
// Write all files
624624
const controllerUri = Uri.joinPath(workspaceUri, "Controller.mo");
625625
const plantUri = Uri.joinPath(workspaceUri, "Plant.xml");
626626
const readmeUri = Uri.joinPath(workspaceUri, "README.md");
627627

628628
const cosimSetupMo = [
629629
'model CosimSetup "Co-simulation wiring diagram"',
630630
" Controller controller;",
631-
' FMUBlock plant(fileName = "Plant.xml");',
631+
" Plant plant;",
632632
"equation",
633633
" connect(controller.y, plant.u);",
634634
" connect(plant.y, controller.u);",

‎packages/vscode/src/cosimPanel.ts‎

Lines changed: 45 additions & 26 deletions

0 commit comments

Comments
 (0)