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