层级分析接口增加target_level参数 - 支持指定单一层级返回
新增功能: - 添加target_level参数,支持返回指定单一层级的数据 - 解决前端大数据量卡顿问题,提升渲染性能 - 保持向后兼容,不影响现有API调用 技术改进: - 修复target_level=1时的数组越界崩溃问题 - 优化children_count计算逻辑,添加安全边界检查 - 改进total_levels统计,保持递归过程中的正确值 - 完善hierarchy数组初始化机制 参数说明: - target_level=-1或未指定:返回所有层级(默认) - target_level=0:只返回根装配体 - target_level=1:只返回第1层组件 - target_level>实际层级:返回空数组 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
359e4d277c
commit
e857a47cd0
26
CLAUDE.md
26
CLAUDE.md
@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
||||
|
||||
## 项目架构
|
||||
|
||||
这是一个 MFC 动态链接库 (DLL) 项目,作为 Creo CAD 软件的插件运行。项目整合了以下技术栈:
|
||||
这是一个 MFC 动态链接库 (DLL) 项目,作为 Creo CAD 软件的插件运行。文档在项目文件夹otk_cpp_doc目录下,项目整合了以下技术栈:
|
||||
|
||||
- **MFC框架**: 微软基础类库,用于 Windows 应用程序开发
|
||||
- **OTK/ProToolkit**: PTC Creo 的官方开发工具包,用于与 Creo 交互
|
||||
@ -152,10 +152,10 @@ MFCCreoDll/
|
||||
}
|
||||
```
|
||||
|
||||
#### 模块4: 层级分析功能 (完成)
|
||||
**功能:** 装配体层级结构分析,支持无限深度遍历
|
||||
#### 模块4: 层级分析功能 (完成 - 已优化)
|
||||
**功能:** 装配体层级结构分析,支持无限深度遍历和指定层级过滤
|
||||
**文件:** CreoManager.h, CreoManager.cpp, MFCCreoDll.cpp
|
||||
**测试状态:** ✅ 编译成功,已修复循环调用问题
|
||||
**测试状态:** ✅ 编译成功,已修复target_level崩溃问题,功能测试通过
|
||||
**API端点:**
|
||||
- `POST /api/creo/analysis/hierarchy` - 装配体层级分析
|
||||
|
||||
@ -165,6 +165,7 @@ MFCCreoDll/
|
||||
- 优化了API调用链,避免重复的LoadComponentModel和ListFeaturesByType调用
|
||||
- 实现了组件信息提取、文件大小计算和删除安全评估
|
||||
- 支持无层级限制的递归分析
|
||||
- **新增target_level参数**:支持返回指定单一层级的数据,解决前端大数据量卡顿问题
|
||||
|
||||
**API请求格式:**
|
||||
```json
|
||||
@ -172,7 +173,8 @@ MFCCreoDll/
|
||||
"software_type": "creo",
|
||||
"project_name": "Assembly Analysis",
|
||||
"max_depth": 0,
|
||||
"include_geometry": false
|
||||
"include_geometry": false,
|
||||
"target_level": 1
|
||||
}
|
||||
```
|
||||
|
||||
@ -212,10 +214,24 @@ MFCCreoDll/
|
||||
}
|
||||
```
|
||||
|
||||
**target_level参数说明:**
|
||||
- **`target_level` 未指定或 `-1`**:返回所有层级(默认行为,保持向后兼容)
|
||||
- **`target_level: 0`**:只返回根装配体(第0层)
|
||||
- **`target_level: 1`**:只返回第1层的所有组件
|
||||
- **`target_level: 2`**:只返回第2层的所有组件
|
||||
- **`target_level > 实际层级数`**:返回空的hierarchy数组
|
||||
|
||||
**优势:**
|
||||
- **性能优化**:减少返回数据量,显著提升前端渲染性能
|
||||
- **按需加载**:用户可根据需求查看特定层级,避免信息过载
|
||||
- **向后兼容**:现有API调用不受影响,保持稳定性
|
||||
|
||||
**已解决的技术问题:**
|
||||
1. **重复API调用优化** - 修复了LoadComponentModel和ListFeaturesByType的重复调用
|
||||
2. **递归调用优化** - 优化了组件加载流程,避免不必要的重复操作
|
||||
3. **内存管理改进** - 使用预加载模型参数传递,减少内存分配
|
||||
4. **target_level崩溃修复** - 修复了指定层级时的数组越界访问问题,确保程序稳定性
|
||||
5. **层级统计准确性** - 改进total_levels和children_count的计算逻辑,确保数据准确性
|
||||
|
||||
#### 模块5: 层级删除功能 (完成)
|
||||
**功能:** 装配体层级组件删除,支持安全的组件移除
|
||||
|
||||
@ -991,20 +991,32 @@ HierarchyAnalysisResult CreoManager::AnalyzeModelHierarchy(const HierarchyAnalys
|
||||
root_component.model_type = "MDL_ASSEMBLY";
|
||||
root_component.children_count = 0; // 将在递归后计算
|
||||
|
||||
// 初始化层级0并添加根装配体
|
||||
result.hierarchy.push_back(std::vector<ComponentInfo>());
|
||||
result.hierarchy[0].push_back(root_component);
|
||||
// 初始化层级0并添加根装配体(只在target_level为-1或0时添加)
|
||||
if (request.target_level == -1 || request.target_level == 0) {
|
||||
result.hierarchy.push_back(std::vector<ComponentInfo>());
|
||||
result.hierarchy[0].push_back(root_component);
|
||||
}
|
||||
|
||||
// 使用新的SOTA递归算法分析子组件(从层级1开始)
|
||||
AnalyzeAssemblyNode(assembly, 1, root_component.name, root_component.path, result);
|
||||
AnalyzeAssemblyNode(assembly, 1, root_component.name, root_component.path, result, request.target_level);
|
||||
|
||||
// 计算根装配体的children_count
|
||||
if (result.hierarchy.size() > 1) {
|
||||
result.hierarchy[0][0].children_count = result.hierarchy[1].size();
|
||||
// 计算根装配体的children_count(只在根装配体被包含时)
|
||||
if ((request.target_level == -1 || request.target_level == 0) &&
|
||||
result.hierarchy.size() > 0 && result.hierarchy[0].size() > 0) {
|
||||
// 安全地计算第一层的实际组件数
|
||||
try {
|
||||
pfcFeatures_ptr features = assembly->ListFeaturesByType(xfalse, pfcFEATTYPE_COMPONENT);
|
||||
if (features) {
|
||||
result.hierarchy[0][0].children_count = features->getarraysize();
|
||||
}
|
||||
} catch (...) {
|
||||
result.hierarchy[0][0].children_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 计算最终统计
|
||||
result.total_levels = result.hierarchy.size();
|
||||
// total_levels已经在递归过程中正确计算,保持装配体的实际总层级数
|
||||
// 不需要基于hierarchy.size()重新计算,因为当指定target_level时hierarchy可能只包含部分层级
|
||||
|
||||
// 计算总组件数(从所有层级统计)
|
||||
result.total_components = 0;
|
||||
@ -1097,18 +1109,23 @@ void CreoManager::AnalyzeAssemblyNode(wfcWAssembly_ptr assembly,
|
||||
int level,
|
||||
const std::string& parentName,
|
||||
const std::string& currentPath,
|
||||
HierarchyAnalysisResult& result) {
|
||||
HierarchyAnalysisResult& result,
|
||||
int target_level) {
|
||||
if (!assembly) return;
|
||||
|
||||
try {
|
||||
// 更新最大层级深度
|
||||
// 更新最大层级深度(始终统计)
|
||||
if (level + 1 > result.total_levels) {
|
||||
result.total_levels = level + 1;
|
||||
}
|
||||
|
||||
// 确保层级容器足够大
|
||||
while (result.hierarchy.size() <= level) {
|
||||
result.hierarchy.push_back(std::vector<ComponentInfo>());
|
||||
// 确保层级容器足够大(只在需要时创建)
|
||||
if (target_level == -1 || level == target_level) {
|
||||
// 确保hierarchy有足够的空间到指定层级
|
||||
// 即使前面的层级是空的,也要保证索引正确
|
||||
while (result.hierarchy.size() <= level) {
|
||||
result.hierarchy.push_back(std::vector<ComponentInfo>());
|
||||
}
|
||||
}
|
||||
|
||||
// 使用ListFeaturesByType获取所有组件特征(包括隐藏的)
|
||||
@ -1134,8 +1151,10 @@ void CreoManager::AnalyzeAssemblyNode(wfcWAssembly_ptr assembly,
|
||||
// 创建组件信息,传递已加载的模型
|
||||
ComponentInfo component = CreateComponentFromFeature(compFeat, level, parentName, currentPath, childModel);
|
||||
|
||||
// 添加到当前层级
|
||||
result.hierarchy[level].push_back(component);
|
||||
// 只在指定层级或返回所有层级时添加到结果
|
||||
if (target_level == -1 || level == target_level) {
|
||||
result.hierarchy[level].push_back(component);
|
||||
}
|
||||
|
||||
// 递归处理子装配体
|
||||
if (component.type == "assembly" && childModel) {
|
||||
@ -1143,9 +1162,9 @@ void CreoManager::AnalyzeAssemblyNode(wfcWAssembly_ptr assembly,
|
||||
if (childModel->GetType() == pfcMDL_ASSEMBLY) {
|
||||
wfcWAssembly_ptr childAssembly = wfcWAssembly::cast(childModel);
|
||||
if (childAssembly) {
|
||||
// 递归分析子装配体
|
||||
// 始终递归处理子装配体(需要统计total_components等)
|
||||
AnalyzeAssemblyNode(childAssembly, level + 1,
|
||||
component.name, component.path, result);
|
||||
component.name, component.path, result, target_level);
|
||||
}
|
||||
}
|
||||
} catch (...) {
|
||||
|
||||
@ -117,6 +117,7 @@ struct HierarchyAnalysisRequest {
|
||||
std::string project_name;
|
||||
int max_depth;
|
||||
bool include_geometry;
|
||||
int target_level = -1; // 新增:指定返回的层级,-1表示返回所有
|
||||
std::map<std::string, std::string> analysis_options;
|
||||
};
|
||||
|
||||
@ -287,7 +288,8 @@ private:
|
||||
int level,
|
||||
const std::string& parentName,
|
||||
const std::string& currentPath,
|
||||
HierarchyAnalysisResult& result);
|
||||
HierarchyAnalysisResult& result,
|
||||
int target_level = -1); // 新增参数
|
||||
|
||||
ComponentInfo CreateComponentFromFeature(pfcComponentFeat_ptr compFeat,
|
||||
int level,
|
||||
|
||||
@ -687,6 +687,18 @@ HttpResponse HierarchyAnalysisHandler(const HttpRequest& request) {
|
||||
analysis_request.max_depth = 0; // 0表示无限制
|
||||
}
|
||||
|
||||
// 解析target_level参数(指定返回的层级)
|
||||
std::string target_level_str = ExtractJsonValue(request.body, "target_level");
|
||||
if (!target_level_str.empty()) {
|
||||
try {
|
||||
analysis_request.target_level = std::stoi(target_level_str);
|
||||
} catch (...) {
|
||||
analysis_request.target_level = -1; // -1表示返回所有层级
|
||||
}
|
||||
} else {
|
||||
analysis_request.target_level = -1; // -1表示返回所有层级
|
||||
}
|
||||
|
||||
// 执行层级分析
|
||||
HierarchyAnalysisResult result = CreoManager::Instance().AnalyzeModelHierarchy(analysis_request);
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,5 +1,6 @@
|
||||
C:\Users\sladr\source\repos\MFCCreoDll\AuthManager.cpp;C:\Users\sladr\source\repos\MFCCreoDll\MFCCreoDll\x64\Debug\AuthManager.obj
|
||||
C:\Users\sladr\source\repos\MFCCreoDll\CreoManager.cpp;C:\Users\sladr\source\repos\MFCCreoDll\MFCCreoDll\x64\Debug\CreoManager.obj
|
||||
C:\Users\sladr\source\repos\MFCCreoDll\GeometryAnalyzer.cpp;C:\Users\sladr\source\repos\MFCCreoDll\MFCCreoDll\x64\Debug\GeometryAnalyzer.obj
|
||||
C:\Users\sladr\source\repos\MFCCreoDll\HttpRouter.cpp;C:\Users\sladr\source\repos\MFCCreoDll\MFCCreoDll\x64\Debug\HttpRouter.obj
|
||||
C:\Users\sladr\source\repos\MFCCreoDll\HttpServer.cpp;C:\Users\sladr\source\repos\MFCCreoDll\MFCCreoDll\x64\Debug\HttpServer.obj
|
||||
C:\Users\sladr\source\repos\MFCCreoDll\JsonHelper.cpp;C:\Users\sladr\source\repos\MFCCreoDll\MFCCreoDll\x64\Debug\JsonHelper.obj
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.41.34120:TargetPlatformVersion=10.0.16299.0:
|
||||
PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.41.34120:TargetPlatformVersion=10.0.16299.0:VcpkgTriplet=x64-windows:
|
||||
Debug|x64|C:\Users\sladr\source\repos\MFCCreoDll\|
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@ -1,3 +1,3 @@
|
||||
^C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\AUTHMANAGER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\CREOMANAGER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\HTTPROUTER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\HTTPSERVER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\JSONHELPER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\LOGGER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\MFCCREODLL.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\MFCCREODLL.RES|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\MODELANALYZER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\PATHDELETEMANAGER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\PCH.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\SERVERMANAGER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\SHELLEXPORTHANDLER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\SHRINKWRAPMANAGER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\WEBSOCKETSERVER.OBJ
|
||||
^C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\AUTHMANAGER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\CREOMANAGER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\GEOMETRYANALYZER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\HTTPROUTER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\HTTPSERVER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\JSONHELPER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\LOGGER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\MFCCREODLL.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\MFCCREODLL.RES|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\MODELANALYZER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\PATHDELETEMANAGER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\PCH.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\SERVERMANAGER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\SHELLEXPORTHANDLER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\SHRINKWRAPMANAGER.OBJ|C:\USERS\SLADR\SOURCE\REPOS\MFCCREODLL\MFCCREODLL\X64\DEBUG\WEBSOCKETSERVER.OBJ
|
||||
C:\Users\sladr\source\repos\MFCCreoDll\x64\Debug\MFCCreoDll.lib
|
||||
C:\Users\sladr\source\repos\MFCCreoDll\x64\Debug\MFCCreoDll.EXP
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user