📄 amiutilities.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 + -