CATIA 的干涉检查是 DMU Space Analysis 工作台提供的核心能力。它把整个产品树的所有零件做空间布尔运算,找出三种关系:
| 类型 | 枚举 | 含义 |
|---|---|---|
| Clash | CATClashTypeClash | 实际穿透(体积重叠) |
| Contact | CATClashTypeContact | 恰好接触(公差 ε 内) |
| Clearance | CATClashTypeClearance | 距离小于阈值但不接触 |
计算策略上 CATIA 用 BBox 粗筛 + 精确几何 fine 检测两阶段算法:先按零件 OBB(定向包围盒)做 O(N²) 但极快的初筛,过滤掉绝大多数明显不可能的对;剩下的少量候选对再做 BRep 级精确求交。这就是为什么大装配(10000+ 零件)也能在分钟内出结果。
结果通过 CATIClashResult 接口暴露,每个干涉对包含两个零件 reference、干涉类型、最小距离、干涉点(如果是 Clash 则是穿透量最大的点对),以及可视化用的 conflict body(共享体积的几何)。
CATIClashSpecFactory::CreateClashSpec 新建一个分析任务,指定类型(Clash/Contact/Clearance)和阈值。CATIClashSpec::SetScope 决定全部 vs 选定零件 vs 两组零件互测。CATIClashSpec::Compute。这是个同步调用,大装配可能阻塞数分钟,多线程模式要单开线程。GetResults 返回 CATListPtrCATIClashResult,逐对遍历。CATIClashSpec::SetActivationMode(CATClashActivateAll)。SetSelfInstanceClash(0) 关闭。CATIClashSpec::SetComputationLevel(CATClashComputationLevelBBox) 做粗筛,精检在结果上做第二轮。// BatchClash.cpp
// 输入:Product 文件路径、间距阈值
// 输出:干涉对列表(导出到 CSV)
#include "CATIClashSpecFactory.h"
#include "CATIClashSpec.h"
#include "CATIClashResult.h"
#include "CATIProduct.h"
#include "CATDocumentServices.h"
#include <fstream>
HRESULT BatchClashCheck(
const CATUnicodeString& productPath,
double clearanceMM,
const CATUnicodeString& csvOut)
{
HRESULT rc = S_OK;
CATDocument* pDoc = NULL;
rc = CATDocumentServices::OpenDocument(productPath, pDoc);
if (FAILED(rc) || !pDoc) return rc;
// 1. 拿 Root Product
CATIProduct_var spRoot;
rc = GetRootProduct(pDoc, spRoot);
if (FAILED(rc)) goto Done;
// 2. 创建 Clash Spec
CATIClashSpecFactory_var spFac = spRoot;
if (spFac == NULL_var) { rc = E_FAIL; goto Done; }
CATIClashSpec_var spSpec;
rc = spFac->CreateClashSpec(
CATClashTypeClearance, // 同时报 Clash + Contact + Clearance
spSpec);
if (FAILED(rc) || spSpec == NULL_var) goto Done;
// 3. 配置参数
spSpec->SetClearanceValue(clearanceMM);
spSpec->SetSelfInstanceClash(0);
spSpec->SetActivationMode(CATClashActivateAll);
spSpec->SetScope(CATClashScopeAll, NULL, NULL);
// 4. 触发计算
rc = spSpec->Compute();
if (FAILED(rc)) goto Done;
// 5. 拿结果
CATListPtrCATIClashResult results;
rc = spSpec->GetResults(results);
if (FAILED(rc)) goto Done;
// 6. 写 CSV
{
std::ofstream out(csvOut.CastToCharPtr());
out << "PartA,PartB,Type,MinDist_mm,Penetration_mm\n";
for (int i = 1; i <= results.Size(); ++i) {
CATIClashResult* pR = results[i];
CATUnicodeString nameA, nameB;
pR->GetPartNames(nameA, nameB);
int type = 0; double minDist = 0, pen = 0;
pR->GetType(type);
pR->GetMinDistance(minDist);
pR->GetMaxPenetration(pen);
const char* typeStr =
(type==CATClashTypeClash) ? "CLASH" :
(type==CATClashTypeContact) ? "CONTACT" : "CLEARANCE";
out << nameA.CastToCharPtr() << ","
<< nameB.CastToCharPtr() << ","
<< typeStr << ","
<< minDist << "," << pen << "\n";
}
out.close();
}
cout << "Found " << results.Size() << " conflict pairs.\n";
Done:
if (pDoc) CATDocumentServices::Remove(*pDoc);
return rc;
}
© 上海琛兴科技发展有限公司 · 转载请注明出处 · CATIA 是 Dassault Systèmes 注册商标