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()) {