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);获取 Part 仓库:
cpp
const ptoKPartRepository& parts =
ptoKConstGetPartRepos(mdb, modelName);
ptoKPart part = parts.ConstGet(partIndex);6.2 获取当前 Part 网格
在 Part Fragment 中:
cpp
ptoKPart* part = this->GetPart();
ftrFeatureList* features = part->GetFeatureList();
bmeMesh* mesh = features->GetMesh(bdoDefaultInstId);只读场景优先:
cpp
const bmeMesh* mesh =
features->ConstGetMesh(bdoDefaultInstId);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);批量读取坐标:
cpp
utiCoordCont3D coords = nodeData.CoordContainer();
coords.GetCoord(meshIndex, x, y, z);必须区分:
text
用户标签 userLabel
网格内部索引 meshIndex不能用节点标签直接当数组索引。
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();
}官方示例明确处理:
text
B31
S4RVTK 示例还通过单元类型映射处理更多类型。
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);mesSetMesh 会整体设置 Part 网格。对已有大型模型使用它可能破坏 Set、Assignment 和既有网格关系,因此不应作为局部修复接口。
6.6 增量建模:现有船体的优先路线
吊耳参数化源码使用:
cpp
SAMReMesh meshEditor(featureList);
meshEditor.createNewElement2(
part,
positions3D,
connectivity,
currentMesh,
newElementLabels,
newNodeLabels);完成后刷新:
cpp
mesh->InvalidateMeshData();
gmeMesh* geomMesh = dynamic_cast<gmeMesh*>(mesh);
geomMesh->ResetOrphanElements();
geomMesh->ClearQualityEvaluator();
geomMesh->UpdateMeshTimeStamp(gmeMesh::AddElemTSEnum);这条路线适合:
- 吊耳
- 肘板
- 局部补板
- 加强环
- 参数化孔边构件
- 新增壳或梁单元
6.7 二维参数映射到任意三维平面
吊耳源码通过三个节点建立局部坐标系:
text
节点1:局部原点
节点1 → 节点2:局部 X
节点3:确定局部平面
叉乘:得到局部法向二维点映射:
cpp
P3D = origin + x2D * localX + y2D * localY;因此参数化构件不需要用户手工计算倾斜面的全局坐标。
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);输出:
text
data.pos 二维网格节点
data.connectM 三角形或四边形连接关系6.9 C++ 内部调用 Python 2
当 SAM 的 Python API 已验证而 C++ 内部接口不明确时,可以从 C++ 执行白名单 Python 命令:
cpp
pytInterpreterRole::Instance().RunCommand(command, false);或从 GUI 投递命令:
cpp
cmdGCommandDeliveryRole::Instance().SendCommand(command);吊耳插件实际采用这种方式调用:
python
p.Set(...)
p.mergeNodes(...)
del p.sets[temp_name]这不是绕开架构,而是 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];适合开发:
- 位移、应力结果提取
- 自动后处理
- VTK 输出
- Agent 结果摘要