diff --git a/Release/database/XNSim.db b/Release/database/XNSim.db
index 5715766..63635a9 100644
Binary files a/Release/database/XNSim.db and b/Release/database/XNSim.db differ
diff --git a/XNSimPortal/components/configuration-config.js b/XNSimPortal/components/configuration-config.js
index bcda69a..085b399 100644
--- a/XNSimPortal/components/configuration-config.js
+++ b/XNSimPortal/components/configuration-config.js
@@ -1864,7 +1864,7 @@ class ConfigurationConfig extends HTMLElement {
let serviceList = [];
try {
- const response = await fetch('/api/services');
+ const response = await fetch('/api/service-dev/services');
if (!response.ok) throw new Error('B03042015: 获取服务列表失败');
serviceList = await response.json();
serviceSelect.innerHTML = '' +
@@ -1886,7 +1886,7 @@ class ConfigurationConfig extends HTMLElement {
}
try {
- const response = await fetch(`/api/service-versions/${className}`);
+ const response = await fetch(`/api/service-dev/service-versions/${className}`);
if (!response.ok) throw new Error('B03042016: 获取版本列表失败');
const versions = await response.json();
versionSelect.innerHTML = '' +
diff --git a/XNSimPortal/components/model-development.js b/XNSimPortal/components/model-development.js
index 2557923..9b7a2ca 100644
--- a/XNSimPortal/components/model-development.js
+++ b/XNSimPortal/components/model-development.js
@@ -919,12 +919,12 @@ class ModelDevelopment extends HTMLElement {
@@ -1299,11 +1299,19 @@ class ModelDevelopment extends HTMLElement {
const option = document.createElement('option');
option.value = i.toString();
option.textContent = i.toString();
- if (this.currentVersion.RunNode === i.toString()) {
+
+ // 使用宽松比较,处理数字和字符串类型
+ if (this.currentVersion.RunNode == i.toString()) {
option.selected = true;
}
+
runNodeSelect.appendChild(option);
}
+
+ // 如果没有选中任何选项,默认选择第一个
+ if (runNodeSelect.selectedIndex === -1 && maxNode > 0) {
+ runNodeSelect.selectedIndex = 0;
+ }
}
/**
diff --git a/XNSimPortal/routes/filesystem.js b/XNSimPortal/routes/filesystem.js
index 0b36859..8c35bcb 100644
--- a/XNSimPortal/routes/filesystem.js
+++ b/XNSimPortal/routes/filesystem.js
@@ -854,35 +854,33 @@ async function findStructDefinition(headerFilePath, structName) {
continue;
}
- // 匹配成员声明
- // 基础类型: int, double, float, char, short, long, unsigned, etc.
- // 结构体指针: struct xxx_S*
- // 结构体: struct xxx_S
- const memberRegex = /^(?:const\s+)?(?:struct\s+([A-Za-z_][A-Za-z0-9_]*)\s*)?(?:unsigned\s+)?(?:long\s+)?(?:int\s+)?(?:char\s+)?(?:short\s+)?(?:float\s+)?(?:double\s+)?(?:void\s*)?(?:[A-Za-z_][A-Za-z0-9_]*\s*)?(\*?)\s*([A-Za-z_][A-Za-z0-9_]*)\s*(?:\[[^\]]*\])?\s*;?\s*$/;
-
+ /**
+ * 匹配结构体成员声明,包括如下形式:
+ * int a;
+ * double b;
+ * struct input_hydraulic_S input;
+ * struct input_hydraulic_S *input;
+ * float arr[10];
+ * const char *name;
+ */
+ // 新正则:分组更清晰,支持struct和基础类型指针
+ const memberRegex = /^(?:const\s+)?(?:(struct)\s+([A-Za-z_][A-Za-z0-9_]*)\s*)?([A-Za-z_][A-Za-z0-9_\s]*?)?(\*?)\s*([A-Za-z_][A-Za-z0-9_]*)\s*(?:\[[^\]]*\])?\s*;?\s*$/;
+
const memberMatch = trimmedLine.match(memberRegex);
if (memberMatch) {
- const structType = memberMatch[1]; // 结构体类型名
- const isPointer = memberMatch[2]; // 是否为指针
- const memberName = memberMatch[3]; // 成员名
-
- // 构建类型信息
+ const isStruct = memberMatch[1]; // struct关键字
+ const structType = memberMatch[2]; // 结构体类型名
+ const baseType = memberMatch[3] ? memberMatch[3].trim() : '';
+ const isPointer = memberMatch[4]; // *
+ const memberName = memberMatch[5]; // 变量名
+
let type = '';
- if (structType) {
- // 结构体类型
+ if (isStruct && structType) {
type = `struct ${structType}${isPointer ? '*' : ''}`;
} else {
- // 基础类型,需要从原始行中提取
- const typeMatch = trimmedLine.match(/^(?:const\s+)?(?:unsigned\s+)?(?:long\s+)?(?:int\s+)?(?:char\s+)?(?:short\s+)?(?:float\s+)?(?:double\s+)?(?:void\s*)?(?:[A-Za-z_][A-Za-z0-9_]*\s*)?/);
- if (typeMatch) {
- type = typeMatch[0].trim() + (isPointer ? '*' : '');
- } else {
- type = 'unknown';
- }
+ type = `${baseType}${isPointer ? '*' : ''}`.replace(/\s+/g, ' ').trim();
}
-
- // 拼接类型和成员名
- const memberString = `${type} ${memberName}`;
+ const memberString = `${type} ${memberName}`.trim();
memberNames.push(memberString);
}
}