⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 amiutilities.cpp

📁 能在MDT5/6环境下对已经存在地曲面进行全部和局部区域展开
💻 CPP
字号:
#include "stdafx.h"
#include "StdArx.h"


#ifdef AMI_H   // 当使用MCAD API时有用

#include "AmiUtilities.h"
#include "BrUtilities.h"

// 从屏幕上选择一个实体,并返回其AmiGeomKey值
AmiStatus getGeomKeyFromPick(const char* prompt,AmiKeyType keyType,AmiGeomKey*& pGeomKey)
{
	AmiPickObj pickObj;
//	AmiKeyType keyType = Ami::curveKey;
	AmiStatus as = Ami::eOk;

	as = amiPick(prompt, keyType,NULL,pickObj);
	if(as != Ami::eOk) {
		acutPrintf("no entity selected or user canceled.\n");
		return as;
	}
	
	if((as = amiGetKeyFromPick(&pickObj,keyType,(AmiObjectKey*&)pGeomKey)) != Ami::eOk)
	{
		acutPrintf("amiGetKeyFromPick failed.\n");
		return as;
	}
	return as;
}

// 从屏幕上选择多个实体,并返回其AmiGeomKey值,不允许实体重复选择
AmiStatus getGeomKeysFromPick(const char* prompt, AmiKeyType keyType, AmiGeomKeyArray& keys)
{
	AmiPickObj pickObj;
	AmiObjectKey *pObjKey,*pKey;
	AmiStatus as = Ami::eOk;
	keys.setLogicalLength(0);

	while(true) {
		as = amiPick(prompt, keyType,NULL,pickObj);
		if(as==Ami::kUserTermination) {
			acutPrintf("%d entities selected.\n",keys.length());
			return Ami::kOk;
		} else if(as != Ami::eOk) {
			acutPrintf("user canceled.\n");
			return as;
		}
		
		if((as = amiGetKeyFromPick(&pickObj,keyType,pObjKey)) != Ami::eOk)
		{
			acutPrintf("amiGetKeyFromPick failed.\n");
			keys.setLogicalLength(0);
			return as;
		}
		Adesk::Boolean isExist = false;
		for(int i=0;i<keys.length();i++) {
			pKey = keys[i];
			amiAreKeysEquivalent(pObjKey,pKey,isExist);
			if(isExist)			break;
		}
		for(i=0;i<keys.length();i++) amiHighlight(keys[i],Adesk::kTrue);

		if(!isExist) {
			keys.append((AmiGeomKey*)pObjKey);
			acutPrintf("%d entities selected.\n",keys.length());
		}
		else {
			acutPrintf("a repeated entity filtered.\n");
		}
	}
}


AmiStatus getDbIdFromGeomKey(AmiGeomKey *pkey,AcDbObjectId& id)
{
	AmiStatus as=Ami::eOk;
	AcDbObjectId *pArr;
	int num;
	as = amiGetDbIdsFromKey(pkey,num,pArr);
	if(num>0) {
		id = pArr[0];
		delete pArr;
	}
	else {
		id = NULL;
	}
	
	return as;
}


AmiStatus getDbIdsFromGeomKeys(AmiGeomKeyArray keys,AcDbObjectIdArray& ids)
{
	AmiStatus as=Ami::eOk;
	AcDbObjectId *pArr;
	int i,num,len;
	
	len = keys.length();
	ids.setLogicalLength(len);
	for (i=0; i<len; i++) {
		as = amiGetDbIdsFromKey(keys[i],num,pArr);
		if(Ami::eOk == as) {
			ids[i] = pArr[0];
			delete pArr;
		}
		else {
			ids.setLogicalLength(0);
			return as;
		}
	}
	
	return as;
}

AmiStatus getGeomKeysFromDbIds(const AcDbObjectIdArray& ids,AmiKeyType type,AmiGeomKeyArray& keys)
{
	int i,len;
	AmiStatus as;
	
	len = ids.length();
	keys.setLogicalLength(len);
	for (i=0; i<len; i++) {
		AmiGeomKey *pkey;
		pkey = keys[i];
		as = amiGetKeyFromId(ids[i],type,(AmiObjectKey*&)pkey);
		if (Ami::eOk != as) {
			keys.setLogicalLength(0);
			return as;
		}
	}
	
	return as;
}

AmiStatus getBrEdgeFromGeomKey(AmiCurveKey *pKey,AcBrEdge*& pBrEdge)
{
	
	AmiStatus as=Ami::eOk;
	as = amiGetBrepFromKey(pKey,(AcBrEntity*&)pBrEdge);
	
	return as;
}

AmiStatus getBrFaceFromGeomKey(AmiGeomKey *pKey,AcBrFace*& pBrFace)
{
	AmiSurfKey* pSurfKey = AmiSurfKey::cast(pKey);
	if(!pSurfKey) {
		pBrFace = NULL;
		return Ami::eTypeMapFailure;
	}
	
	AmiStatus as=Ami::eOk;
	AcBrBrep *pTmpFace;
	if((as = amiGetBrepFromKey(pSurfKey,(AcBrEntity*&)pTmpFace)) != Ami::eOk)
		return as;
	
	AcBrBrepFaceTraverser bft;
	bft.setBrep(*(AcBrBrep*)pTmpFace);
	pBrFace = new AcBrFace;
	bft.getFace(*pBrFace);
	delete pTmpFace;
	
	return as;
}

bool getBaseSurfaceAndLoops(AmiGeomKey *pSurfKey,AcGeNurbSurface& baseSurf, ChGeLoop3dArray& loops)
{
	AcBrFace *pFace;
	getBrFaceFromGeomKey(pSurfKey,pFace);
	
	// 得到原曲面的loops
	AcBrLoopPointerArray Loops;
	getBrLoopsFromBrFace(pFace,Loops);
	loops.setLogicalLength(0);
	getGeLoopsFromBrLoops(Loops,loops);
	
	// 得到曲面的ExternalBoundedSurface
	Adesk::UInt32 num;
	AcGeExternalBoundedSurface exsurf,**ppNurbs=NULL;
	Adesk::Boolean bIsSame;
	pFace->getOrientToSurface(bIsSame);
	pFace->getSurfaceAsTrimmedNurbs(num,ppNurbs);
	delete pFace;
	exsurf = *ppNurbs[0];
	delete [] ppNurbs;
	
	// 得到曲面的BaseSurface
	AcGeNurbSurface *pSurf=NULL;
	exsurf.getBaseSurface((AcGeSurface*&)pSurf);
	baseSurf = *pSurf;
	delete pSurf;
	
	if (bIsSame) {
		return true;
	} else {
		return false;
	}
}

bool getBaseSurface(AmiGeomKey *pSurfKey,AcGeNurbSurface& baseSurf)
{
	AcBrFace *pFace;
	getBrFaceFromGeomKey(pSurfKey,pFace);
	
	// 得到曲面的ExternalBoundedSurface
	Adesk::UInt32 num;
	AcGeExternalBoundedSurface exsurf,**ppNurbs=NULL;
	Adesk::Boolean bIsSame;
	pFace->getOrientToSurface(bIsSame);
	pFace->getSurfaceAsTrimmedNurbs(num,ppNurbs);
	delete pFace;
	exsurf = *ppNurbs[0];
	delete [] ppNurbs;
	
	// 得到曲面的BaseSurface
	AcGeNurbSurface *pSurf=NULL;
	exsurf.getBaseSurface((AcGeSurface*&)pSurf);
	baseSurf = *pSurf;
	delete pSurf;
	
	if (bIsSame) {
		return true;
	} else {
		return false;
	}
}


bool getBaseSurfaceAndLoops(const AcDbHandle& hSurf,AcGeNurbSurface& baseSurf, ChGeLoop3dArray& loops)
{
	AcDbObjectId objId;
	acdbHostApplicationServices()->workingDatabase()->
		getAcDbObjectId(objId,false,hSurf);
	
	// 得到曲面的BrFace
	AmiGeomKey *pKey;
	AcBrFace *pFace;
	amiGetKeyFromId(objId,Ami::surfKey,(AmiObjectKey*&)pKey);
	getBrFaceFromGeomKey(pKey,pFace);
	
	bool bIsSame;
	loops.setLogicalLength(0);
	bIsSame = getBaseSurfaceAndLoops(pKey,baseSurf,loops);
	
	pKey->release();
	
	return bIsSame;
}



bool getBaseSurface(const AcDbHandle& hSurf,AcGeNurbSurface& baseSurf)
{
	AcDbObjectId objId;
	acdbHostApplicationServices()->workingDatabase()->
		getAcDbObjectId(objId,false,hSurf);
	
	// 得到曲面的BrFace
	AmiGeomKey *pKey;
	AcBrFace *pFace;
	amiGetKeyFromId(objId,Ami::surfKey,(AmiObjectKey*&)pKey);
	getBrFaceFromGeomKey(pKey,pFace);
	
	bool bIsSame;
	bIsSame = getBaseSurface(pKey,baseSurf);
	
	pKey->release();
	
	return bIsSame;
}

#endif // AMI_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -