iCAx开思网

标题: CAA: 量度面與面之間的最短距離 [打印本页]

作者: catiaNew    时间: 2006-12-8 16:37
标题: CAA: 量度面與面之間的最短距離
各位,

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

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

謝謝
作者: acoka    时间: 2006-12-8 21:30
把surface的面和edge给cell化
然后把各个cell做成CATBody
然后用 CATDistanceMinBodyBody求最小距离
作者: southillmoon    时间: 2006-12-10 21:45
好久没来这里了。
acoka还是这里的老大啊。
作者: catiaNew    时间: 2006-12-11 14:06
謝謝你的回覆
我嘗試依照你的步驟來做, 但是當呼叫 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. 我不知道是什麼, 請問有什麼方法解決呢?

謝謝
作者: catiaNew    时间: 2006-12-11 15:03
補充多一點, 我是想量度 面與面間的距離, 而這些面是在不同的component 上, 即是不同的part上

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

謝謝
作者: hick    时间: 2006-12-11 15:24
呵呵,这个问题我也曾经碰到过,到现在也没解决,同问

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

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

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

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

我嘗試過用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寫錯還是有其他問題呢

謝謝
作者: acoka    时间: 2006-12-22 23:26
直接从agent取到CATISpecObject( Surface.x)
然后直接从CATISpecObject取CATBody, Surfaces是普通的面特征,cast到CATIGeomertical之类的I/F, 查我以前的帖子,有 CATBody_var TSTUtility::GetBodyFromFeature( const CATISpecObject_var& ispObjAsSpec)的代码




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3