找回密码 注册 QQ登录
一站式解决方案

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 22312|回复: 9
打印 上一主题 下一主题

CAA: 量度面與面之間的最短距離

[复制链接]
跳转到指定楼层
1
发表于 2006-12-8 16:37:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
各位,

我請問怎樣用CAA來量度面與面之間的最短距離, 我試過CATIMeasurable::MinimumDistance(), 但是不成功,
我也找到一些global functioin 如 CATCreateDistanceMin 但没有surface 同surface的距離量度.

請問大家知不知有什麼function可用呢?

謝謝
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 赞一下!赞一下!
2
发表于 2006-12-8 21:30:30 | 只看该作者
把surface的面和edge给cell化
然后把各个cell做成CATBody
然后用 CATDistanceMinBodyBody求最小距离
3
发表于 2006-12-10 21:45:23 | 只看该作者
好久没来这里了。
acoka还是这里的老大啊。
4
发表于 2006-12-11 14:06:45 | 只看该作者
謝謝你的回覆
我嘗試依照你的步驟來做, 但是當呼叫 CATCreateDistanceMinTopo() 時, 有exception throw出來.
以下是我寫的code

pPathElm1->InitToLeafElement();
CATBaseUnknown* pSelEntity1 = pPathElm1->NextFatherElement();

pPathElm2->InitToLeafElement();
CATBaseUnknown* pSelEntity2 = pPathElm2->NextFatherElement();

// Create the CATBody containing the selected face/point
CATIBRepAccess *pBRep1 = NULL, *pBRep2 = NULL;
hr = pSelEntity1->QueryInterface(IID_CATIBRepAccess, (void**)&pBRep1);
hr = pSelEntity2->QueryInterface(IID_CATIBRepAccess, (void**)&pBRep2);
CATBody_var spBody1 = pBRep1->CreateBody();  // Get the CATBody
CATBody_var spBody2 = pBRep2->CreateBody();  // Get the CATBody

// Get the CATGeoFactory of selected entity 1
CATILinkableObject* pLinkableObj;
CATDocument* pDoc = NULL;
hr = pSelEntity1->QueryInterface(IID_CATILinkableObject, (void**)&pLinkableObj);

CATDocument* pDoc = pLinkableObj->GetDocument();
CATIContainerOfDocument* pContainerOfDoc = NULL;
hr = pDoc->QueryInterface(IID_CATIContainerOfDocument, (void**)&pContainerOfDoc);
                       
CATIContainer* pResultContainer = NULL;
pContainerOfDoc->GetResultContainer(pResultContainer);
CATGeoFactory* pGeoFact = NULL;
hr = pResultContainer->QueryInterface(IID_CATGeoFactory, (void**)&pGeoFact);
// Clone and get the compatible CATGeoFactory
CATCloneManager cloneMgr(pGeoFact, CatCGMFullDuplicate);        // Full Duplication
cloneMgr.Add(spBody1);        // Add the selected body 1
cloneMgr.Run();
CATICGMObject* pClonedObj = cloneMgr.ReadImage(spBody1);
CATGeoFactory* pCompatibleGeoFact = pClonedObj->GetContainer();

CATSoftwareConfiguration *pSoftConfig = new CATSoftwareConfiguration();
CATTopData topData(pSoftConfig, NULL);
       
CATTry
{
        // Measure distance between two selected entities
        CATDistanceMinBodyBody* pMinDist = CATCreateDistanceMinTopo(pCompatibleGeoFact, &topData, spBody1, spBody2, BASIC);
        minDistance = pMinDist->GetDistance();
        delete pMinDist; pMinDist = NULL;
}
CATCatch(CATError, pError)
{
        CATUnicodeString e1 = pError->GetNLSDiagnostic();
        CATUnicodeString e2 = pError->GetNLSMessage();
                                               
        const char* c1 = e1.ConvertToChar();
        const char* c2 = e2.ConvertToChar();

}
CATEndTry

在 GetNLSMessage() 中, 它說geometry container incompatible. 我不知道是什麼, 請問有什麼方法解決呢?

謝謝
5
发表于 2006-12-11 15:03:34 | 只看该作者
補充多一點, 我是想量度 面與面間的距離, 而這些面是在不同的component 上, 即是不同的part上

我試過在如果是同一個part上的兩塊面上, 是没有問題的, 量度出來的距離是正確的, 但在不同part上的面, 便不能量度, 有exception throw.

謝謝
6
发表于 2006-12-11 15:24:47 | 只看该作者
呵呵,这个问题我也曾经碰到过,到现在也没解决,同问

CATGeoFactory 的问题, 两个面不属于同一个part,也就不属于同一个container.
不属于同一个container,貌似就不可以,geometry container incompatible.

当时时间匆忙,也没仔细研究,就用了个特笨特笨的办法 ,把需要测量的copy到一个temp  part中,然后测量

[ 本帖最后由 hick 于 2006-12-11 15:28 编辑 ]
7
发表于 2006-12-11 17:16:51 | 只看该作者
如果你做的是interactive的命令
可以用featureimportagent把另1个part的面以copy with link的形式使用

如果测量过程不需要留下,你可以在测量命令的最后undo掉
或用CATIStructureAnalyse来挑出不再被使用的copy with link(其他part的面)删除掉
8
发表于 2006-12-14 13:22:04 | 只看该作者
请教acoka :
        在CATIA在装配体设计的Workshop中提供的测量功能,是在Application下 创建了一个SpecObject,能不能解说一些它的创建细节,比如:调用的借口等。好像这一部分是Undocument的。
9
发表于 2006-12-18 14:52:29 | 只看该作者
謝謝你的回復,

我嘗試過用CATFeatureImportAgent來copy with link, 但是當做量度時, 還是不行, 但這次error是"Input Object cannot be referred to"

以下是一些code:

# pPathElem1 和 pPathElem2 是我選了的兩個faces的catpathelement.

// Activate the destination part, the second selected object
CATFrmEditor *pFrmEditor = NULL;
pFrmEditor = CATFrmEditor::GetCurrentEditor();
hr = pFrmEditor->SetActivePath(pPathElm1);

// Copy the feature
CATFeatureImportAgent* pAgent = new CATFeatureImportAgent("copyAgent", CATISpecObject::ClassName(), NULL, MfDuplicateFeature, NULL_var, NULL );
pAgent->SetValueToSelect(pPathElm2);
pAgent->SetValuation();
                                                       
// Get the external reference
CATBaseUnknown* pUnkExtRef = pAgent->GetElementValue(pPathElm2);
hr = pUnkExtRef->QueryInterface(IID_CATIBRepAccess, (void**)&pBRep2);
CATBody_var spBody2 = pBRep2->CreateBody();

CATTry
{
// pGeoFact 是第一個selected entity的 CATIGeoFactory.
CATDistanceMinBodyBody* pMinDist = CATCreateDistanceMinTopo(pGeoFact, &topData, spBody1, spBody2, BASIC);
minDistance = pMinDist->GetDistance();
delete pMinDist; pMinDist = NULL;
}
CATCatch(CATError, pError)
{
CATUnicodeString e1 = pError->GetNLSDiagnostic();
CATUnicodeString e2 = pError->GetNLSMessage();
                                                       
const char* c1 = e1.ConvertToChar();
const char* c2 = e2.ConvertToChar();

}
CATEndTry


請問各位是否以上的code寫錯還是有其他問題呢

謝謝
10
发表于 2006-12-22 23:26:21 | 只看该作者
直接从agent取到CATISpecObject( Surface.x)
然后直接从CATISpecObject取CATBody, Surfaces是普通的面特征,cast到CATIGeomertical之类的I/F, 查我以前的帖子,有 CATBody_var TSTUtility::GetBodyFromFeature( const CATISpecObject_var& ispObjAsSpec)的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-12-24 07:58 , Processed in 0.024438 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

快速回复 返回顶部 返回列表