/****************************************************************************** 函数名称:getChengTouKong 功能说明:输入沉头上一级的面,获取沉头对应的面 返 回 值:tag_t 参 数:faceTag--沉头上一级的面 作 者: LuoPengyu 日 期: 2025/1/6 ******************************************************************************/ tag_t getChengTouKong(tag_t faceTag) { // 检查是否为圆柱面 Session* theSession = Session::GetSession(); Part* workPart = theSession->Parts()->Work(); BodyCollection* bodys = workPart->Bodies(); BodyCollection::iterator iter; vector<tag_t> vecFindFaces; for(iter = bodys->begin(); iter != bodys->end(); ++iter) { tag_t bodyTag = (*iter)->Tag(); int nType = -1,nSubType = -1; UF_OBJ_ask_type_and_subtype(bodyTag,&nType,&nSubType); if(nType != 70 || nSubType != 0) continue; // Skip non-solid bodies Body* body = dynamic_cast<Body*>(NXObjectManager::Get(bodyTag)); std::vector<Face*> vecFaces = body->GetFaces(); for(size_t i = 0; i < vecFaces.size(); ++i) { int nFaceType = 0; UF_MODL_ask_face_type(vecFaces[i]->Tag(),&nFaceType); if(nFaceType == UF_MODL_CYLINDRICAL_FACE) { //检查是否不在 YDK, GUOKONG, XIAODINGKONG 中 if(std::find(m_YDK.begin(),m_YDK.end(),vecFaces[i]->Tag()) == m_YDK.end() && std::find(m_GuoKong.begin(),m_GuoKong.end(),vecFaces[i]->Tag()) == m_GuoKong.end() && std::find(m_XiaoDingKong.begin(),m_XiaoDingKong.end(),vecFaces[i]->Tag()) == m_XiaoDingKong.end()) { if(AreCylindersCoaxial(faceTag,vecFaces[i]->Tag())) { vecFindFaces.push_back(vecFaces[i]->Tag()); } } } } } // 检查 findFaces 是否为空 if(vecFindFaces.empty()) { return null_tag; // 返回一个无效的 tag } //判断与输入圆柱面距离最短的圆柱面 tag_t findFace = *std::min_element(vecFindFaces.begin(),vecFindFaces.end(), [ faceTag ](tag_t findFace1,tag_t findFace2) ->bool { double aBoundingBox[6],aBoundingBox1[6],aBoundingBox2[6]; UF_MODL_ask_bounding_box(faceTag,aBoundingBox); UF_MODL_ask_bounding_box(findFace1,aBoundingBox1); UF_MODL_ask_bounding_box(findFace2,aBoundingBox2); double aPoint[3] = { (aBoundingBox[0] + aBoundingBox[3]) / 2, (aBoundingBox[1] + aBoundingBox[4]) / 2, (aBoundingBox[2] + aBoundingBox[5]) / 2 }; double aPoint1[3] = { (aBoundingBox1[0] + aBoundingBox1[3]) / 2, (aBoundingBox1[1] + aBoundingBox1[4]) / 2, (aBoundingBox1[2] + aBoundingBox1[5]) / 2 }; double aPoint2[3] = { (aBoundingBox2[0] + aBoundingBox2[3]) / 2, (aBoundingBox2[1] + aBoundingBox2[4]) / 2, (aBoundingBox2[2] + aBoundingBox2[5]) / 2 }; double dDistance1,dDistance2; UF_VEC3_distance(aPoint,aPoint1,&dDistance1); UF_VEC3_distance(aPoint,aPoint2,&dDistance2); return dDistance1 < dDistance2; }); // 如果没有找到符合条件的面,返回一个无效的 tag return findFace; } /****************************************************************************** 函数名称:getScrewChengTouKong 功能说明:输入螺丝沉头上一级的面,获取螺丝沉头对应的面 返 回 值:tag_t 参 数:faceTag--沉头上一级的面 作 者: LuoPengyu 日 期: 2025/1/23 ******************************************************************************/ tag_t getScrewChengTouKong(tag_t faceTag,string strSpec) { // 检查是否为圆柱面 Session* theSession = Session::GetSession(); Part* workPart = theSession->Parts()->Work(); BodyCollection* bodys = workPart->Bodies(); BodyCollection::iterator iter; vector<tag_t> vecFindFaces; for(iter = bodys->begin(); iter != bodys->end(); ++iter) { tag_t bodyTag = (*iter)->Tag(); int nType = -1,nSubType = -1; UF_OBJ_ask_type_and_subtype(bodyTag,&nType,&nSubType); if(nType != 70 || nSubType != 0) continue; // Skip non-solid bodies Body* body = dynamic_cast<Body*>(NXObjectManager::Get(bodyTag)); std::vector<Face*> vecFaces = body->GetFaces(); for(size_t i = 0; i < vecFaces.size(); ++i) { int nFaceType = 0; UF_MODL_ask_face_type(vecFaces[i]->Tag(),&nFaceType); if(nFaceType == UF_MODL_CYLINDRICAL_FACE) { //检查是否不在 YDK, GUOKONG, XIAODINGKONG 中 if(std::find(m_YDK.begin(),m_YDK.end(),vecFaces[i]->Tag()) == m_YDK.end() && std::find(m_GuoKong.begin(),m_GuoKong.end(),vecFaces[i]->Tag()) == m_GuoKong.end() && std::find(m_XiaoDingKong.begin(),m_XiaoDingKong.end(),vecFaces[i]->Tag()) == m_XiaoDingKong.end()) { if(AreCylindersCoaxial(faceTag,vecFaces[i]->Tag())) { if(strSpec == getSpecName(vecFaces[i]->Tag())) { vecFindFaces.push_back(vecFaces[i]->Tag()); } } } } } } // 检查 findFaces 是否为空 if(vecFindFaces.empty()) { return null_tag; // 返回一个无效的 tag } //判断与输入圆柱面距离最短的圆柱面 tag_t findFace = *std::min_element(vecFindFaces.begin(),vecFindFaces.end(), [ faceTag ](tag_t findFace1,tag_t findFace2) ->bool { double aBoundingBox[6],aBoundingBox1[6],aBoundingBox2[6]; UF_MODL_ask_bounding_box(faceTag,aBoundingBox); UF_MODL_ask_bounding_box(findFace1,aBoundingBox1); UF_MODL_ask_bounding_box(findFace2,aBoundingBox2); double aPoint[3] = { (aBoundingBox[0] + aBoundingBox[3]) / 2, (aBoundingBox[1] + aBoundingBox[4]) / 2, (aBoundingBox[2] + aBoundingBox[5]) / 2 }; double aPoint1[3] = { (aBoundingBox1[0] + aBoundingBox1[3]) / 2, (aBoundingBox1[1] + aBoundingBox1[4]) / 2, (aBoundingBox1[2] + aBoundingBox1[5]) / 2 }; double aPoint2[3] = { (aBoundingBox2[0] + aBoundingBox2[3]) / 2, (aBoundingBox2[1] + aBoundingBox2[4]) / 2, (aBoundingBox2[2] + aBoundingBox2[5]) / 2 }; double dDistance1,dDistance2; UF_VEC3_distance(aPoint,aPoint1,&dDistance1); UF_VEC3_distance(aPoint,aPoint2,&dDistance2); return dDistance1 < dDistance2; }); // 如果没有找到符合条件的面,返回一个无效的 tag return findFace; }这两个函数的区别是什么
时间: 2025-06-13 16:59:07 AIGC 浏览: 28
```markdown
### 代码概述
这两个函数 `getChengTouKong` 和 `getScrewChengTouKong` 都是为了查找与输入圆柱面相关的沉头孔对应的面,但它们的实现细节和功能有所区别。
---
### 代码解析
#### 1. `getChengTouKong` 函数
- 功能:输入沉头上一级的面,获取沉头对应的面。
- 实现:
- 遍历所有实体体(Body),检查是否为实心体。
- 遍历每个体的所有面,找到类型为圆柱面的面。
- 排除在 `YDK`, `GUOKONG`, `XIAODINGKONG` 列表中的面。
- 检查圆柱面是否与输入面共轴。
- 返回距离输入面最近的圆柱面。
#### 2. `getScrewChengTouKong` 函数
- 功能:输入螺丝沉头上一级的面和规格字符串,获取螺丝沉头对应的面。
- 实现:
- 基于 `getChengTouKong` 的逻辑,增加了一个额外的条件判断:检查圆柱面的规格名称是否与输入的规格字符串匹配。
- 如果匹配,则将该面加入候选列表。
- 最终返回距离输入面最近且规格匹配的圆柱面。
---
### 区别总结
1. **参数不同**:
- `getChengTouKong` 只有一个参数 `faceTag`,表示输入的沉头面上一级的面。
- `getScrewChengTouKong` 有两个参数:`faceTag` 和 `strSpec`,后者用于指定螺丝的规格。
2. **功能扩展**:
- `getChengTouKong` 只根据几何条件(共轴性和距离)查找沉头孔对应的面。
- `getScrewChengTouKong` 在此基础上增加了规格匹配的条件,确保找到的面不仅满足几何条件,还符合指定的规格。
3. **适用场景**:
- `getChengTouKong` 适用于一般的沉头孔查找。
- `getScrewChengTouKong` 更适合特定规格的螺丝沉头孔查找。
---
### 知识点
1. **几何建模基础**
圆柱面的类型判断和共轴性检查是基于几何建模库的API实现。
2. ** STL 容器操作**
使用 `std::vector` 存储候选面,并通过 `std::min_element` 找到距离最近的面。
3. **Lambda 表达式**
在 `std::min_element` 中使用 Lambda 表达式计算两个面之间的距离。
```
阅读全文