add version and fix min size

This commit is contained in:
brige 2025-11-17 01:58:50 +08:00
parent ef7ed1c300
commit d9c64eb1b3
16 changed files with 58 additions and 85 deletions

View File

@ -1,6 +1,6 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.21)
PROJECT(Dyt)
project(Dyt VERSION 1.0.0)
option(USE_HOST_EVENT_LOOP
"Enable the integration of CEF message loop thread into host event loop"

View File

@ -1,5 +1,3 @@
PROJECT(Dyt)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
@ -19,7 +17,22 @@ FILE(GLOB_RECURSE CPP_FILES ./*.cpp common/*.cpp model/*.cpp app/*.cpp utils/*.c
FILE(GLOB_RECURSE CC_FILES ./*.cc)
FILE(GLOB_RECURSE UI_FILES ./*.ui)
FILE(GLOB_RECURSE QRC_FILES ./*.qrc)
FILE(GLOB_RECURSE RC_FILES ./res/*.rc)
## Configure Windows resource file with version info (exposed to cmake-gui)
set(DYT_COMPANY_NAME "DYT" CACHE STRING "Company name for version resource")
set(DYT_PRODUCT_NAME "DYT" CACHE STRING "Product name for version resource")
set(DYT_FILE_DESCRIPTION "Dyt Application" CACHE STRING "File description for version resource")
set(DYT_COPYRIGHT "(C) 2025 DYT" CACHE STRING "Legal copyright for version resource")
# Read version from top-level project definition and expose as editable cache entries
set(DYT_VERSION_MAJOR "${Dyt_VERSION_MAJOR}" CACHE STRING "Major version for version resource")
set(DYT_VERSION_MINOR "${Dyt_VERSION_MINOR}" CACHE STRING "Minor version for version resource")
set(DYT_VERSION_PATCH "${Dyt_VERSION_PATCH}" CACHE STRING "Patch version for version resource")
set(DYT_VERSION "${Dyt_VERSION}" CACHE STRING "Product version string for version resource")
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/res/dyt.rc.in
${PROJECT_BINARY_DIR}/dyt.rc
)
SET(
TS_FILES
@ -77,7 +90,7 @@ SET(
)
configure_file(
${PROJECT_SOURCE_DIR}/config.cpp.in
${CMAKE_CURRENT_SOURCE_DIR}/config.cpp.in
${PROJECT_BINARY_DIR}/config.cpp
)
@ -88,10 +101,10 @@ SET(
${CC_FILES}
${UI_FILES}
${QRC_FILES}
${RC_FILES}
${PROJECT_BINARY_DIR}/dyt.rc
${QM_FILES}
${PROJECT_BINARY_DIR}/config.cpp
${PROJECT_SOURCE_DIR}/${PROJECT_NAME}.manifest
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.manifest
)
INCLUDE_DIRECTORIES(

View File

@ -62,7 +62,6 @@ void PathComponent::Begin() {
animationPath_->clear();
// 优先使用路径文件的时间列;若不存在则按当前时间范围等间距生成时间点
std::vector<double> mappedSteps;
const bool hasPathTimes = transformPath_ && !transformPath_->GetTimes().empty();
double rangeMin = 0.0, rangeMax = 0.0, rangeStep = 0.0;
@ -70,7 +69,6 @@ void PathComponent::Begin() {
if (hasPathTimes) {
const auto& times = transformPath_->GetTimes();
if (timeStep_->HasManualRange()) {
// 使用文件时间为主:仅截取手动范围内的原始时间点
double dstMin = timeStep_->GetManualStart();
double dstMax = timeStep_->GetManualEnd();
mappedSteps.reserve(times.size());
@ -79,7 +77,6 @@ void PathComponent::Begin() {
mappedSteps.push_back(t);
}
}
// 若截取后为空,回退为原始时间列,避免动画路径为空
if (mappedSteps.empty()) {
mappedSteps = times;
}
@ -94,7 +91,6 @@ void PathComponent::Begin() {
double start = timeStep_->HasManualRange() ? timeStep_->GetManualStart() : rangeMin;
double end = timeStep_->HasManualRange() ? timeStep_->GetManualEnd() : rangeMax;
double step = rangeStep;
// 若步长无效,则回退为均匀分布
if (step <= 0.0) {
step = (num > 1) ? std::max(0.0, (end - start)) / double(num - 1) : 0.0;
}

View File

@ -1 +0,0 @@
IDI_ICON ICON DISCARDABLE ".\\res\\sys_icon.ico"

36
src/res/dyt.rc.in Normal file
View File

@ -0,0 +1,36 @@
IDI_ICON ICON DISCARDABLE "@CMAKE_CURRENT_SOURCE_DIR@/res/sys_icon.ico"
#include <winver.h>
VS_VERSION_INFO VERSIONINFO
FILEVERSION @DYT_VERSION_MAJOR@,@DYT_VERSION_MINOR@,@DYT_VERSION_PATCH@,0
PRODUCTVERSION @DYT_VERSION_MAJOR@,@DYT_VERSION_MINOR@,@DYT_VERSION_PATCH@,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS VS_FF_DEBUG
#else
FILEFLAGS 0x0L
#endif
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE VFT2_UNKNOWN
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904B0"
BEGIN
VALUE "CompanyName", "@DYT_COMPANY_NAME@\0"
VALUE "FileDescription", "@DYT_FILE_DESCRIPTION@\0"
VALUE "FileVersion", "@DYT_VERSION@\0"
VALUE "InternalName", "@PROJECT_NAME@\0"
VALUE "OriginalFilename", "@PROJECT_NAME@.exe\0"
VALUE "ProductName", "@DYT_PRODUCT_NAME@\0"
VALUE "ProductVersion", "@DYT_VERSION@\0"
VALUE "LegalCopyright", "@DYT_COPYRIGHT@\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0409, 1200
END
END

View File

@ -54,7 +54,6 @@ void FrameTitleBar::SetMainWidget(QWidget* widget) {
}
}
void FrameTitleBar::OnMaximized(bool maximized) {
// 根据配置位决定是否显示最大/还原按钮,并切换图标
const bool hasMaxButton = (ftbButton_ & FTB_MAX) != 0;
ui->sys_max->setVisible(hasMaxButton);
if (!hasMaxButton) {

View File

@ -41,7 +41,6 @@ void FramelessDelegate::SetTitleBar(FrameTitleBar* titleBar) {
titleBar_ = titleBar;
if (nullptr != titleBar_) {
// 跟踪标题栏显示/隐藏,以便在显示时注册为可移动区域
titleBar_->installEventFilter(this);
}
}

View File

@ -118,7 +118,6 @@ void PlayManagerMenu::OnWorkspaceChange(WorkSpace* workSpace) {
}
workSpace_ = workSpace;
connect(workSpace, &WorkSpace::TimestepChanged, this, &PlayManagerMenu::OnTimestepChanged);
// 若当前 workspace 已有 timestep则立即刷新一次 UI
if (auto* timestep = workSpace->GetTimestep()) {
OnTimestepChanged(timestep);
}
@ -140,12 +139,10 @@ void PlayManagerMenu::OnTimestepChanged(Timestep* timestep) {
ui->horizontalSlider->setValue(int(dt));
}
);
// 监听倍速改变SpeedChanged更新显示为 x倍速
connect(timestep, &Timestep::StepChanged, [this](double speed) {
ui->lbUp->setText(QString("x%1").arg(speed));
}
);
// 当时间范围更新(例如用户在属性面板设置了起止时间)时,刷新显示与滑条范围
connect(timestep, &Timestep::RangeChanged, [this](double minTime, double maxTime, double step, double speed) {
minTime_ = minTime;
maxTime_ = maxTime;

View File

@ -48,7 +48,6 @@ void PropertyBrowser::OnWorkSpaceChange(const QVariant& value) {
WorkSpace* workspace = value.value<WorkSpace*>();
if (nullptr == workspace) {
LOG_WARN("workspace is nullptr");
// 如果没有属性对象,清空属性面板
browser_->clear();
propertyToId_.clear();
idToProperty_.clear();
@ -57,7 +56,6 @@ void PropertyBrowser::OnWorkSpaceChange(const QVariant& value) {
return;
}
// 点击根项目需要清空属性面板,不展示工作区属性
browser_->clear();
propertyToId_.clear();
idToProperty_.clear();
@ -71,7 +69,6 @@ void PropertyBrowser::OnWorkSpaceChange(const QVariant& value) {
workSpaceManager_->setValue(property, worksapceAttribute);
addProperty(property, tr("WorkSpace"));
// 保持对运行时工作区变更的监听(树刷新所需),但属性面板保持清空
if (currentWorkspace_) {
QObject::disconnect(currentWorkspace_, nullptr, this, nullptr);
}
@ -79,7 +76,6 @@ void PropertyBrowser::OnWorkSpaceChange(const QVariant& value) {
QObject::connect(currentWorkspace_, &WorkSpace::FilesChanged,
this, &PropertyBrowser::OnWorkspaceFilesChanged);
// 属性面板清空,文件项属性由 FileEntry 点击时单独处理
}
void PropertyBrowser::OnEntityChange(const QVariant& value) {
@ -87,7 +83,6 @@ void PropertyBrowser::OnEntityChange(const QVariant& value) {
Entity* entity = value.value<Entity*>();
if (nullptr == entity) {
LOG_WARN("engity is nullptr");
// 如果没有属性对象,清空属性面板
browser_->clear();
propertyToId_.clear();
idToProperty_.clear();
@ -141,7 +136,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
FileEntry* entry = value.value<FileEntry*>();
if (!entry) {
LOG_WARN("file entry is nullptr");
// 如果没有属性对象,清空属性面板
inFileEntryView_ = false;
browser_->clear();
propertyToId_.clear();
@ -173,7 +167,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
//if (!curve)
{
LOG_WARN("file entry not a curve: %s", entry->GetFileName().toStdString().c_str());
// 基础信息组
const QString idBasic = QString("FileEntry:%1").arg(entry->GetFileName());
const QString titleBasic = QString("File Entry - %1").arg(entry->GetName());
QtProperty* groupBasic = groupManager_->addProperty(tr("Basic"));
@ -205,7 +198,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
addProperty(groupBasic, idBasic);
// 类型专属属性显示
switch (entry->GetType())
{
case FileEntryType::Curve:
@ -453,7 +445,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
const QString titleChart = QString("Surface Chart - %1").arg(entry->GetName());
const QString titleItems = QString("Surfaces - %1").arg(entry->GetName());
// Chart 属性
QtProperty* chartGroup = groupManager_->addProperty(tr("Chart"));
const auto& chart = surf->GetChartProperties();
QtProperty* xCountProp = intManager_->addProperty(tr("xCount"));
@ -600,7 +591,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
addProperty(chartGroup, idChart);
// Surface 列表
QtProperty* itemsGroup = groupManager_->addProperty(tr("SurfacesProp"));
const auto& items = surf->GetSurfaceProperties();
for (int i = 0; i < items.size(); ++i)
@ -626,7 +616,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
QtProperty* col = colorManager_->addProperty(tr("color"));
colorManager_->setValue(col, s.color);
itemGroup->addSubProperty(col);
// 写回 Surface 条目颜色
colorSetters_[col] = [surf, entry, i](const QColor& c)
{
auto props = surf->GetSurfaceProperties();
@ -768,7 +757,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
// QtProperty* col = colorManager_->addProperty(tr("color"));
// colorManager_->setValue(col, t.color);
// itemGroup->addSubProperty(col);
// // 写回 Table 条目颜色
// colorSetters_[col] = [tbl, entry, i](const QColor& c){
// auto props = tbl->GetTableProperties();
// if (i >= 0 && i < props.size()) {
@ -778,7 +766,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
// if (auto ws = WorkSpaceManager::Get().GetCurrent()) ws->NotifyFileEntryUpdated(entry->GetType());
// }
// };
// // datas 展示为拼接字符串
// QStringList values;
// for (const auto& v : t.datas) values << QString::number(v);
// QtProperty* ds = stringManager_->addProperty(tr("datas"));
@ -800,7 +787,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
const QString titleColor = QString("Light Colors - %1").arg(entry->GetName());
const QString titleRows = QString("Light Rows - %1").arg(entry->GetName());
// 颜色与时间
QtProperty* colorGroup = groupManager_->addProperty(tr("Chart"));
const auto& colorProps = lt->GetColorProperties();
QtProperty* oc = colorManager_->addProperty(tr("openColor"));
@ -822,7 +808,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
};
addProperty(colorGroup, idColor);
// 写回处理:颜色变化更新到 FileEntryLight 并通知 Workspace
colorSetters_[oc] = [lt, entry](const QColor& c)
{
auto props = lt->GetColorProperties();
@ -838,7 +823,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
if (auto ws = WorkSpaceManager::Get().GetCurrent()) ws->NotifyFileEntryUpdated(entry->GetType());
};
// 行数据
QtProperty* rowsGroup = groupManager_->addProperty(tr("Light Rows"));
const auto& rows = lt->GetLightProperties();
for (int i = 0; i < rows.size(); ++i)
@ -987,7 +971,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
QtProperty* col = colorManager_->addProperty(tr("color"));
colorManager_->setValue(col, ln.color);
line->addSubProperty(col);
// 写回 Polar 线颜色
colorSetters_[col] = [pl, entry, i](const QColor& c)
{
auto props = pl->GetLineProperties();
@ -1165,7 +1148,6 @@ void PropertyBrowser::OnFileEntryChange(const QVariant& value) {
break;
}
// 聚焦基础信息组
if (groupBasic) {
QtBrowserItem* item = browser_->topLevelItem(groupBasic);
if (item) {
@ -1270,7 +1252,6 @@ void PropertyBrowser::InitPropertyManager() {
browser_->setFactoryForManager(curveEntryManager_->subDoubleProperyManager(), doubleSpinBoxFactory);
browser_->setFactoryForManager(curveEntryManager_->subColorProperyManager(), colorFactory);
// 颜色属性变更信号:触发对应写回处理器
connect(colorManager_, &QtColorPropertyManager::valueChanged, this,
[this](QtProperty* prop, const QColor& color){
if (colorSetters_.contains(prop)) {

View File

@ -61,9 +61,6 @@ const QString QWorkspaceAttribute::GetDescription() const {
return workspace_->GetDescribe();
}
// 已移除:时间步长文件路径设置/获取(不再从文件读取)
void QWorkspaceAttribute::SetSimulationStart(double start) {
if (!workspace_) return;
Timestep* t = workspace_->GetTimestep();

View File

@ -62,8 +62,6 @@ public:
void SetDescription(const QString& desc);
const QString GetDescription() const;
// 已移除:时间步长文件路径(不再从文件读取)
// Simulation time (manual range) for playback
void SetSimulationStart(double start);
double GetSimulationStart() const;

View File

@ -53,7 +53,6 @@ TransformPath* TransformPath::LoadFromFile(const QString& path, QObject* parent)
}
bool ok = false;
// 解析各字段
const double time = parts[0].toDouble(&ok); if (!ok) { LOG_WARN("invalid time: {}", parts[0].toStdString()); return {}; }
const double longitude= parts[1].toDouble(&ok); if (!ok) { LOG_WARN("invalid longitude: {}", parts[1].toStdString()); return {}; }
const double latitude = parts[2].toDouble(&ok); if (!ok) { LOG_WARN("invalid latitude: {}", parts[2].toStdString()); return {}; }
@ -63,13 +62,9 @@ TransformPath* TransformPath::LoadFromFile(const QString& path, QObject* parent)
const double roll = parts[6].toDouble(&ok); if (!ok) { LOG_WARN("invalid roll: {}", parts[6].toStdString()); return {}; }
Transform transform;
// 位置映射:经度->x纬度->y高度->z
transform.GetLocation().set(longitude, latitude, altitude);
// 旋转向量采用代码库约定顺序Pitch, Roll, Heading与 OsgUtils::HPRToQuat/QuatToHPR 保持一致
transform.GetRotation().set(pitch, roll, heading);
// 当前 PathComponent 使用 WorkSpace 的 Timestep 作为时间轴,这里暂不保存 time 字段
// 现在记录时间以支持按路径文件驱动回放
times.push_back(time);
transforms.push_back(transform);

View File

@ -25,7 +25,6 @@ void Timestep::SetManualRange(double start, double end) {
manualStart_ = start;
manualEnd_ = end;
maxTime_ = end;
// 通知 UI 更新范围与步进
double minTime = 0.0, maxTime = 0.0, step = 1.0;
GetRange(minTime, maxTime, step);
emit RangeChanged(minTime, maxTime, step, currentSpeed_);
@ -126,7 +125,6 @@ void Timestep::Stop() {
}
void Timestep::Up() {
// 提升到下一个倍率(封顶)
if (speedIndex_ < int(speedLevels_.size()) - 1) {
++speedIndex_;
}
@ -168,7 +166,6 @@ void Timestep::SetSpeed(double speed) {
}
void Timestep::SetStep(double step) {
// 更新时间轴步进间隔,并通知 UI 范围与步进发生变化
stepInterval_ = step;
double minTime = 0.0, maxTime = 0.0, s = 0.0;
GetRange(minTime, maxTime, s);

View File

@ -367,13 +367,11 @@ void WorkSpace::ExecuteCommands(CommandWhen when) {
cmdMgr_->Execute(this, when);
}
// 统一属性更新通知:不改变数量,仅提升序号并广播 FilesChanged
void WorkSpace::NotifyFileEntryUpdated(FileEntryType type, std::shared_ptr<FileEntry> fileEntry) {
++filesSeq_;
emit FilesChanged(type, fileEntry);
}
// 删除指定指针的文件条目(不删除物理文件,仅移出工作空间管理)
bool WorkSpace::RemoveFileEntry(FileEntryType type, FileEntry* entry) {
if (!entry) {
LOG_WARN("RemoveFileEntry: entry is nullptr");
@ -397,7 +395,6 @@ bool WorkSpace::RemoveFileEntry(FileEntryType type, FileEntry* entry) {
return true;
}
// 按索引删除文件条目
bool WorkSpace::RemoveFileEntryAt(FileEntryType type, int index) {
auto it = files_.find(type);
if (it == files_.end()) {
@ -416,7 +413,6 @@ bool WorkSpace::RemoveFileEntryAt(FileEntryType type, int index) {
return true;
}
// 按文件名删除文件条目(匹配工作空间内记录的文件名)
bool WorkSpace::RemoveFileEntryByName(FileEntryType type, const QString& fileName) {
auto it = files_.find(type);
if (it == files_.end()) {

View File

@ -60,14 +60,13 @@ bool WorkSpaceXMLParse::ParseTimestep(const tinyxml2::XMLElement* element) {
LOG_WARN("element is nullptr");
return false;
}
// 确保存在 Timestep 实例
workSpace_->EnsureTimestep();
Timestep* t = workSpace_->GetTimestep();
if (!t) {
return false;
}
// 解析属性manual(0/1)、start、end、step
int manualFlag = 0;
element->QueryIntAttribute("manual", &manualFlag);
double start = 0.0;
@ -85,7 +84,6 @@ bool WorkSpaceXMLParse::ParseTimestep(const tinyxml2::XMLElement* element) {
t->SetStep(step);
}
// 若标记为手动或具有完整的 start/end则设置手动范围否则按数据最大时间设置边界
if (manualFlag != 0 || (hasStart && hasEnd)) {
t->SetManualRange(hasStart ? start : 0.0, hasEnd ? end : 0.0);
} else if (hasEnd) {
@ -122,7 +120,6 @@ bool WorkSpaceXMLParse::ParseCommond(const tinyxml2::XMLElement* element) {
return false;
}
// Set the command file path using the filename stored in XML
workSpace_->commondPath_ = path;
return true;
}
@ -133,19 +130,15 @@ bool WorkSpaceXMLParse::ParseFiles(const tinyxml2::XMLElement* element) {
return false;
}
// 首先处理新的Chart元素结构
const tinyxml2::XMLElement* chartElement = element->FirstChildElement("Chart");
while (nullptr != chartElement) {
// 创建FileEntryCurve对象来解析Chart数据
auto curveEntry = CreateEmptyFileEntryCurve();
if (curveEntry && curveEntry->ParseFiles(chartElement)) {
// 添加解析后的FileEntry到workspace
workSpace_->SetFileEntry(curveEntry, false);
}
chartElement = chartElement->NextSiblingElement("Chart");
}
// 保持向后兼容处理旧的type元素结构
const tinyxml2::XMLElement* typeElement = element->FirstChildElement("type");
while (nullptr != typeElement) {
const char* name = typeElement->Attribute("name");
@ -155,17 +148,14 @@ bool WorkSpaceXMLParse::ParseFiles(const tinyxml2::XMLElement* element) {
if (nullptr != name && count > 0) {
QString typeName = QString::fromLocal8Bit(name);
// Create FileEntry objects and call their ParseFiles method
FileEntryType enumType;
if (FileEntryTypeFromString(name, enumType)) {
const tinyxml2::XMLElement* chartElement = typeElement->FirstChildElement("chart");
while (nullptr != chartElement) {
auto fileEntry = CreateEmptyFileEntry(enumType); // Create empty FileEntry for XML parsing
auto fileEntry = CreateEmptyFileEntry(enumType);
if (fileEntry) {
// Call the FileEntry's ParseFiles method to parse detailed data
if (fileEntry->ParseFiles(chartElement)) {
// Add the parsed FileEntry to workspace
workSpace_->SetFileEntry(fileEntry, false);
}
}
@ -173,19 +163,6 @@ bool WorkSpaceXMLParse::ParseFiles(const tinyxml2::XMLElement* element) {
chartElement = chartElement->NextSiblingElement();
}
// Create FileEntry objects for this type
//for (int i = 0; i < count; ++i) {
// auto fileEntry = CreateEmptyFileEntry(enumType); // Create empty FileEntry for XML parsing
// if (fileEntry) {
// // Call the FileEntry's ParseFiles method to parse detailed data
// if (fileEntry->ParseFiles(typeElement)) {
// // Add the parsed FileEntry to workspace
// workSpace_->SetFileEntry(fileEntry, false);
// }
// }
//}
// Also set file entry count for backward compatibility
workSpace_->SetFileEntryCount(enumType, count);
}
}

View File

@ -66,15 +66,12 @@ bool WorkSpaceXMLWrite::SaveScene(tinyxml2::XMLElement* scene) {
return true;
}
// Removed: SaveTimeStep — timestep is no longer file-based
// 新增:保存 Timestep 的手动范围与步长倍率
bool WorkSpaceXMLWrite::SaveTimeStep(tinyxml2::XMLElement* scene) {
if (nullptr == workSpace_) {
return false;
}
auto* t = workSpace_->GetTimestep();
if (!t) {
// 若尚未创建,确保存在一个默认实例,以保证文件的一致性
workSpace_->EnsureTimestep();
t = workSpace_->GetTimestep();
}
@ -114,7 +111,6 @@ bool WorkSpaceXMLWrite::SaveCommond(tinyxml2::XMLElement* scene) {
const QString commondPath = workSpace_->GetCommondFilePath();
if (!commondPath.isEmpty()) {
tinyxml2::XMLElement* commond = scene->InsertNewChildElement("commond");
// Extract just the filename from the full path for storage
QFileInfo fileInfo(commondPath);
commond->SetAttribute("path", fileInfo.fileName().toStdString().c_str());
}
@ -129,7 +125,6 @@ bool WorkSpaceXMLWrite::SaveEntities(tinyxml2::XMLElement* scene, tinyxml2::XMLD
bool WorkSpaceXMLWrite::SaveChart(tinyxml2::XMLElement* scene, tinyxml2::XMLDocument* doc)
{
// charts section retained for compatibility, but deprecated entries (Wave, Report, RD, SimMatlab) are no longer saved
tinyxml2::XMLElement* charts = doc->NewElement("charts");
scene->LinkEndChild(charts);
@ -137,7 +132,6 @@ bool WorkSpaceXMLWrite::SaveChart(tinyxml2::XMLElement* scene, tinyxml2::XMLDocu
}
bool WorkSpaceXMLWrite::SaveFiles(tinyxml2::XMLElement* scene, tinyxml2::XMLDocument* doc) {
// Persist multi-file entries per type as counts
tinyxml2::XMLElement* files = doc->NewElement("files");
scene->LinkEndChild(files);
@ -149,7 +143,6 @@ bool WorkSpaceXMLWrite::SaveFiles(tinyxml2::XMLElement* scene, tinyxml2::XMLDocu
typeElem->SetAttribute("count", static_cast<int>(vec.size()));
files->LinkEndChild(typeElem);
// Call SaveFiles method for each FileEntry to save detailed data
for (const auto& fileEntry : vec) {
if (fileEntry) {
fileEntry->SaveFiles(typeElem, doc);