Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

Sidebar Navigation

← 工业软件 / Industrial Software

SAM 平台开发 / SAM Platform Development

1. SAM 二次开发总览与证据分级 / SAM Secondary Development Overview and Evidence Levels

2. 从 P0 到 P5:SAM 插件界面开发流程 / SAM Plugin Interface Development from P0 to P5

3. PYD 注册、Model Fragment 与 Part Fragment / PYD Registration, Model Fragments, and Part Fragments

4. Python 2 SAM API:已验证接口与失败清单 / Verified Python 2 SAM APIs and Known Failures

5. C++ SAM SDK:模型、网格与 ODB 接口 / C++ SAM SDK APIs for Models, Meshes, and ODB Data

6. SAM 参数化构件建模:从二维轮廓到三维网格 / SAM Parametric Component Modeling from 2D Profiles to 3D Meshes

7. Agent 接入 SAM:插件架构、工具注册与安全边界 / Integrating AI Agents into SAM with Plugins, Tools, and Safety Boundaries

8. SAM API 验证工作流:禁止猜测与七级验收门 / A Seven-Gate SAM API Validation Workflow Without Guesswork

9. 真实案例、当前边界与后续路线 / Validated Cases, Current Boundaries, and the Development Roadmap

10. SAM 二次开发指南:架构总览与系列索引 / SAM Secondary Development Architecture and Series Index

11. SAM GUI、Toolset 与交互类 API / SAM GUI, Toolset, and Interaction APIs

12. SAM 命令桥、Python 与 PYD 扩展 API / SAM Command Bridge, Python, and PYD Extension APIs

13. SAM 数据模型、Part 与 Mesh API / SAM Data Models, Parts, and Mesh APIs

14. SAM 场景、显示表示与渲染 API / SAM Scene, Display Representation, and Rendering APIs

15. SAM 插件编译、部署与故障排查 / Building, Deploying, and Troubleshooting SAM Plugins

16. SAM 二次开发旧入口 / Legacy Entry for SAM Secondary Development

17. SAM 二次开发知识体系 / SAM Secondary Development Knowledge System

本页目录

C++ SAM SDK:模型、网格与 ODB 接口 / C++ SAM SDK APIs for Models, Meshes, and ODB Data ​

📅 创建时间:2026-07-23
🏷️ 标签:#SAM #C++SDK #网格 #ODB #VTK
📚 前置知识:02-pyd-registration-and-fragments
📖 系列导航:总目录 · 上一篇:03-python2-verified-api · 下一篇:05-parametric-modeling


第6部分:有官方源码证据的 C++ SAM SDK 接口 ​

本部分接口均达到 C 级证据:它们出现在 7231、VTKIO 或 LiftingLug 源码中。由于当前目录缺少完整 SDK 头文件与匹配工具链,尚未在本机重新编译,不能把它们等同于 A 级端到端验证。

6.1 获取模型数据库 ​

官方 VTK 和舱段源码使用:

cpp
basBasis* basis = basBasis::Instance();
basMdb mdb = basis->Fetch();

basModelMap& models = mdb.GetModels();
basNewModel& model = models.Get(modelName);
1
2
3
4
5

获取 Part 仓库:

cpp
const ptoKPartRepository& parts =
    ptoKConstGetPartRepos(mdb, modelName);

ptoKPart part = parts.ConstGet(partIndex);
1
2
3
4

6.2 获取当前 Part 网格 ​

在 Part Fragment 中:

cpp
ptoKPart* part = this->GetPart();
ftrFeatureList* features = part->GetFeatureList();
bmeMesh* mesh = features->GetMesh(bdoDefaultInstId);
1
2
3

只读场景优先:

cpp
const bmeMesh* mesh =
    features->ConstGetMesh(bdoDefaultInstId);
1
2

6.3 读取节点 ​

cpp
const bmeNodeData& nodeData = mesh->NodeData();
int count = nodeData.NumNodes();

int meshIndex = nodeData.GetMeshNodeIndex(userLabel);

float x, y, z;
nodeData.GetNodalCoord(meshIndex, x, y, z);
1
2
3
4
5
6
7

批量读取坐标:

cpp
utiCoordCont3D coords = nodeData.CoordContainer();
coords.GetCoord(meshIndex, x, y, z);
1
2

必须区分:

text
用户标签 userLabel
网格内部索引 meshIndex
1
2

不能用节点标签直接当数组索引。

6.4 读取单元 ​

cpp
const bmeElementData& data = mesh->ElementData();
const bmeElementClassList& classes = data.ConstGetClasses();

for (int i = 0; i < classes.Size(); ++i) {
    const bmeElementClass& cls = classes.ConstGet(i);
    QString type = cls.ElemTypeLabel();
    int count = cls.NumElements();
    const int* connectivity = cls.Connectivity();
}
1
2
3
4
5
6
7
8
9

官方示例明确处理:

text
B31
S4R
1
2

VTK 示例还通过单元类型映射处理更多类型。

6.5 新建完整网格:只适合空 Part 或整体导入 ​

cpp
bmeElementClass* cls = bmeElementClass::ConstructObject(
    elementCount,
    "S4R",
    connectivity);

cls->SetUserElementLabel(elementLabels);

bmeMesh* mesh = new omeMesh(
    bdoDefaultInstId,
    nodeCount,
    coordinateContainer,
    classCount,
    classes);

mesh->GetNodeData().SetUserNodeLabels(nodeLabels);
mesSetMesh(*featureList, bdoDefaultInstId, mesh);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

mesSetMesh 会整体设置 Part 网格。对已有大型模型使用它可能破坏 Set、Assignment 和既有网格关系,因此不应作为局部修复接口。

6.6 增量建模:现有船体的优先路线 ​

吊耳参数化源码使用:

cpp
SAMReMesh meshEditor(featureList);

meshEditor.createNewElement2(
    part,
    positions3D,
    connectivity,
    currentMesh,
    newElementLabels,
    newNodeLabels);
1
2
3
4
5
6
7
8
9

完成后刷新:

cpp
mesh->InvalidateMeshData();

gmeMesh* geomMesh = dynamic_cast<gmeMesh*>(mesh);
geomMesh->ResetOrphanElements();
geomMesh->ClearQualityEvaluator();
geomMesh->UpdateMeshTimeStamp(gmeMesh::AddElemTSEnum);
1
2
3
4
5
6

这条路线适合:

  • 吊耳
  • 肘板
  • 局部补板
  • 加强环
  • 参数化孔边构件
  • 新增壳或梁单元

6.7 二维参数映射到任意三维平面 ​

吊耳源码通过三个节点建立局部坐标系:

text
节点1:局部原点
节点1 → 节点2:局部 X
节点3:确定局部平面
叉乘:得到局部法向
1
2
3
4

二维点映射:

cpp
P3D = origin + x2D * localX + y2D * localY;
1

因此参数化构件不需要用户手工计算倾斜面的全局坐标。

6.8 CM2 网格器 ​

官方吊耳插件使用:

cpp
cm2::quadmesh_iso::mesher::settings_type settings;
cm2::quadmesh_iso::mesher engine(settings);
cm2::quadmesh_iso::mesher::data_type data;

data.pos = boundaryPoints;
data.connectB = boundaryEdges;
engine.run(data);
1
2
3
4
5
6
7

输出:

text
data.pos       二维网格节点
data.connectM  三角形或四边形连接关系
1
2

6.9 C++ 内部调用 Python 2 ​

当 SAM 的 Python API 已验证而 C++ 内部接口不明确时,可以从 C++ 执行白名单 Python 命令:

cpp
pytInterpreterRole::Instance().RunCommand(command, false);
1

或从 GUI 投递命令:

cpp
cmdGCommandDeliveryRole::Instance().SendCommand(command);
1

吊耳插件实际采用这种方式调用:

python
p.Set(...)
p.mergeNodes(...)
del p.sets[temp_name]
1
2
3

这不是绕开架构,而是 SAM 官方混合式扩展模式。

6.10 ODB 结果读取 ​

VTK 示例使用:

cpp
odbOdb& odb = odbOdbRepository::Instance().get(path);
odbStep& step = odb.steps().get("Step-1");
odbFrame& frame = step.frames().get(frameIndex);
frame.update();

const odbFieldOutputRepository& fields = frame.fieldOutputs();
QString fieldName = "U";
const odbFieldOutput& field = fields[fieldName];
1
2
3
4
5
6
7
8

适合开发:

  • 位移、应力结果提取
  • 自动后处理
  • VTK 输出
  • Agent 结果摘要

最后更新于:

Pager
上一篇4. Python 2 SAM API:已验证接口与失败清单 / Verified Python 2 SAM APIs and Known Failures
下一篇6. SAM 参数化构件建模:从二维轮廓到三维网格 / SAM Parametric Component Modeling from 2D Profiles to 3D Meshes

持续记录,持续成长

Copyright © Tidenflow