From 872a68d5bea79cdc0f2de0085e1a40df37c73afc Mon Sep 17 00:00:00 2001 From: root Date: Mon, 21 Jul 2025 19:46:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0Creo=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=8A=9F=E8=83=BD=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增功能: - 添加SaveResult结构体用于保存操作结果 - 实现CreoManager::SaveModel()方法,使用OTK pfcModel::Save() API - 添加SaveModelHandler HTTP路由处理器 - 注册/api/model/save接口支持POST请求 技术特性: - 简化设计:只保存当前模型到原位置,无复杂另存为逻辑 - 完善的OTK异常处理:支持BadInputs、GeneralError、InvalidName等 - 标准JSON API格式:返回文件大小、保存时间、软件信息等 - 与现有架构完全兼容:不影响任何现有功能 API使用: POST /api/model/save 请求: {"software_type": "creo"} 响应: 包含file_size、save_time、software、original_file等信息 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- CreoManager.cpp | 57 ++++++++++++++++++++++++++++++++++++++++ CreoManager.h | 13 +++++++++ MFCCreoDll.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) diff --git a/CreoManager.cpp b/CreoManager.cpp index 1b90ba9..d40a35a 100644 --- a/CreoManager.cpp +++ b/CreoManager.cpp @@ -598,6 +598,63 @@ ExportResult CreoManager::ExportModelToSTEP(const std::string& export_path, cons return result; } +// 保存模型功能实现 +SaveResult CreoManager::SaveModel() { + SaveResult result; + + SessionInfo sessionInfo = GetSessionInfo(); + + if (!sessionInfo.is_valid) { + result.error_message = "Creo session not available"; + return result; + } + + try { + pfcModel_ptr current_model = sessionInfo.session->GetCurrentModel(); + if (!current_model) { + result.error_message = "No current model loaded"; + return result; + } + + // 获取文件信息 + xstring original_name = current_model->GetFileName(); + result.original_file = XStringToString(original_name); + result.software = "Creo Parametric"; + + // 执行保存操作 + current_model->Save(); + + // 设置成功结果 + result.save_time = GetCurrentTimeStringISO(); + result.file_size = GetModelFileSize(current_model); + result.success = true; + + } + catch (const pfcXToolkitBadInputs&) { + result.error_message = "Bad input parameters"; + } + catch (const pfcXToolkitGeneralError&) { + result.error_message = "Creo toolkit error"; + } + catch (const pfcXToolkitInvalidName&) { + result.error_message = "Invalid file name"; + } + catch (const pfcXToolkitCantWrite&) { + result.error_message = "Cannot write to file"; + } + catch (const pfcXToolkitCantOpen&) { + result.error_message = "Cannot open file"; + } + catch (const std::exception& e) { + result.error_message = "Standard error: " + std::string(e.what()); + } + catch (...) { + result.error_message = "Unknown error during save operation"; + } + + return result; +} + // 层级分析主方法 HierarchyAnalysisResult CreoManager::AnalyzeModelHierarchy(const HierarchyAnalysisRequest& request) { HierarchyAnalysisResult result; diff --git a/CreoManager.h b/CreoManager.h index 1e7aa16..f8bfb4b 100644 --- a/CreoManager.h +++ b/CreoManager.h @@ -61,6 +61,16 @@ struct ExportResult { std::string error_message; }; +// 保存结果结构 +struct SaveResult { + bool success = false; + std::string file_size; + std::string save_time; + std::string software; + std::string original_file; + std::string error_message; +}; + // 层级分析组件信息结构 struct ComponentInfo { std::string id; @@ -123,6 +133,9 @@ public: // 导出功能 ExportResult ExportModelToSTEP(const std::string& export_path, const std::string& geom_flags = "solids"); + // 保存功能 + SaveResult SaveModel(); + // 层级分析功能 HierarchyAnalysisResult AnalyzeModelHierarchy(const HierarchyAnalysisRequest& request); diff --git a/MFCCreoDll.cpp b/MFCCreoDll.cpp index e8c8d7c..3c7a6bf 100644 --- a/MFCCreoDll.cpp +++ b/MFCCreoDll.cpp @@ -788,6 +788,75 @@ HttpResponse ShellAnalysisHandler(const HttpRequest& request) { return response; } +// 保存模型路由处理器 +HttpResponse SaveModelHandler(const HttpRequest& request) { + HttpResponse response; + + if (request.method != "POST") { + response.status_code = 405; + response.body = "{\"success\": false, \"error\": \"Method not allowed\"}"; + return response; + } + + try { + // 解析JSON请求参数 + std::string software_type = ExtractJsonValue(request.body, "software_type"); + + // 参数验证 + if (software_type.empty()) { + response.status_code = 400; + response.body = "{\"success\": false, \"error\": \"Missing required parameter: software_type\"}"; + return response; + } + + if (software_type != "creo") { + response.status_code = 400; + response.body = "{\"success\": false, \"error\": \"Invalid software_type, must be 'creo'\"}"; + return response; + } + + // 执行保存操作 + SaveResult result = CreoManager::Instance().SaveModel(); + + if (result.success) { + // 构建成功响应 + std::ostringstream json; + json << "{" + << "\"success\": true," + << "\"data\": {" + << "\"file_size\": \"" << EscapeJsonString(result.file_size) << "\"," + << "\"save_time\": \"" << EscapeJsonString(result.save_time) << "\"," + << "\"software\": \"" << EscapeJsonString(result.software) << "\"," + << "\"original_file\": \"" << EscapeJsonString(result.original_file) << "\"" + << "}," + << "\"error\": null" + << "}"; + + response.body = json.str(); + } else { + // 构建错误响应 + std::ostringstream json; + json << "{" + << "\"success\": false," + << "\"data\": null," + << "\"error\": \"" << EscapeJsonString(result.error_message) << "\"" + << "}"; + + response.status_code = 500; + response.body = json.str(); + } + + } catch (const std::exception& e) { + response.status_code = 500; + response.body = "{\"success\": false, \"data\": null, \"error\": \"JSON parsing error: " + std::string(e.what()) + "\"}"; + } catch (...) { + response.status_code = 500; + response.body = "{\"success\": false, \"data\": null, \"error\": \"Unknown error during save operation\"}"; + } + + return response; +} + extern "C" int user_initialize( int argc, @@ -816,6 +885,7 @@ extern "C" int user_initialize( g_http_server->SetRouteHandler("/api/creo/analysis/hierarchy", HierarchyAnalysisHandler); g_http_server->SetRouteHandler("/api/creo/hierarchy/delete", HierarchyDeleteHandler); g_http_server->SetRouteHandler("/api/analysis/shell-analysis", ShellAnalysisHandler); + g_http_server->SetRouteHandler("/api/model/save", SaveModelHandler); if (g_http_server->Start()) {