天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 64|回复: 0

Object Arx 过滤器使用例子,计算选择的曲线面积和周长

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
static AcDbObjectId LoadEntity(AcDbEntity* entity)
{
AcDbBlockTable* pBlockTable;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);


AcDbBlockTableRecord* pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);




AcDbObjectId Id;
pBlockTableRecord->appendAcDbEntity(Id,entity);
pBlockTable->close();


pBlockTableRecord->close();
entity->close();
return Id;
}


是否是自由模式,返回样本实体所在的层(非自由选择模式)
static bool IsFreeMode(CString& strLayer)
{
样本
ads_name sName;
ads_point sPt;


acedInitGet(RSG_NONULL,_T("F"));
int ret = acedEntSel(_T("\n选择样本曲线[自由选择(F)]<回车自由选择>:"),sName,sPt);
bool isFree = false;是否自由选择

acutPrintf(_T("ret is %d\n"),ret);


只要没选实体,都是自由模式
if(ret == RTKWORD || ret == RTERROR)
{
/*CString kword ;
acedGetInput(kword.GetBuffer(1));
kword.ReleaseBuffer();
if(kword.CompareNoCase(_T("F")) == 0)
{
isFree = true;
}*/
isFree = true;
}
else if(ret == RTNORM)
{
isFree = false;
AcDbObjectId entId;
if(Acad::eOk != acdbGetObjectId(entId,sName))
{
acutPrintf(_T("\n获取样本实体ID失败"));
return isFree;
}


AcDbEntity* pEnt;
if(Acad::eOk != acdbOpenObject(pEnt,entId,AcDb::OpenMode::kForRead))
{
acutPrintf(_T("\n打开样本实体失败"));
return isFree;
}

获取层名称
strLayer = pEnt->layer();


pEnt->close();
}
return isFree;
}


static void GetAreaLen(double& sumLen,double& sumArea,long& lineNum,const int& mode)
{
CString strMode ;


bool isFree = false;
CString strLayer;
isFree = IsFreeMode(strLayer);


ads_name ssName;
resbuf* strFilter = NULL;
根据选择的模式构造过滤器字符串
if(isFree)
{
acutPrintf(_T("\n您选择了自由模式\n"));
strFilter = acutBuildList(-4,_T("<or"),
RTDXF0,_T("LINE"),//直线
RTDXF0,_T("ARC"),//圆弧
RTDXF0,_T("LWPOLYLINE"),//轻量多段线
RTDXF0,_T("POLYLINE"),//二维多段线
RTDXF0,_T("SPLINE"),//样条曲线
RTDXF0,_T("CIRCLE"),圆
RTDXF0,_T("ELLIPSE"),圆
-4,_T("or>"),RTNONE);
}
加上样本曲线所在的层进行过滤
else
{
acutPrintf(_T("\n您选择了样本模式"));
acutPrintf(_T("\n根据图层%s进行过滤。"),strLayer);


strFilter = acutBuildList(-4,_T("<and"),
-4,_T("<or"),
RTDXF0,_T("LINE"),//直线
RTDXF0,_T("ARC"),//圆弧
RTDXF0,_T("LWPOLYLINE"),//轻量多段线
RTDXF0,_T("POLYLINE"),//二维多段线
RTDXF0,_T("SPLINE"),//样条曲线
RTDXF0,_T("CIRCLE"),圆
RTDXF0,_T("ELLIPSE"),圆
-4,_T("or>"),
8,strLayer,样本所在的层名称
-4,_T("and>"),
RTNONE);
}

if(mode == 1)计算长度
{
acutPrintf(_T("\n选择要计算长度的曲线:"));
}
else
{
acutPrintf(_T("\n选择要计算面积的曲线:"));
}


根据过滤条件选择实体
if(acedSSGet(NULL,NULL,NULL,strFilter,ssName) != RTNORM)
{
acutPrintf(_T("\n未找到符合条件的实体"));
return;
}


long len;
acedSSLength(ssName,&len);
lineNum = len;赋值实体数量


AcDbEntity* pEnt = NULL;
AcDbCurve*  pCur = NULL;

ads_name en;每个实体名称


double param = 0.0;
double dist = 0.0;//长度
double area = 0.0;//面积


for(int i = 0;i < len; i++)
{

if(acedSSName(ssName,i,en) != RTNORM)
{
acutPrintf(_T("\n获取第%d个实体名称出错"),i);
acutRelRb(strFilter);
acedSSFree(ssName);
return;
}
AcDbObjectId enId;
if(Acad::eOk != acdbGetObjectId(enId,en))
{
acutPrintf(_T("\n获取第%d个实体ID出错"),i);
acutRelRb(strFilter);
acedSSFree(ssName);
return;
}
if(Acad::eOk != acdbOpenObject(pEnt,enId,AcDb::OpenMode::kForRead))
{
acutPrintf(_T("\n获取第%d个实体ID出错"),i);
acutRelRb(strFilter);
acedSSFree(ssName);
return;
}
if(!pEnt->isKindOf(AcDbCurve::desc()))
{
acutPrintf(_T("\n发现了不是曲线类型的实体,程序退出"));
pEnt->close();
acutRelRb(strFilter);
acedSSFree(ssName);
return;
}


pCur = (AcDbCurve*)pEnt;

pCur->getEndParam(param);
pCur->getDistAtParam(param,dist);


pCur->getArea(area);


sumLen += dist;
sumArea += area;


acutPrintf(_T("\n第%d个曲线的长度是%.2f,面积是%.2f"),i,dist,area);
pCur->close();
}


acutRelRb(strFilter);
acedSSFree(ssName);
}


static void TESTsumarea()
{


double len = 0.0;
double area = 0.0;
long lineN = 0;
GetAreaLen(len,area,lineN,0);
acutPrintf(_T("\n共选择:%ld个曲线,总面积:%.2f。"),lineN,area);
}


static void TESTsumlen()
{


double len = 0.0;
double area = 0.0;
long lineN = 0;
GetAreaLen(len,area,lineN,0);
acutPrintf(_T("\n共选择:%ld个曲线,总长度:%.2f。"),lineN,len);
}

 

 

 

 

Object Arx 过滤器使用例子,计算选择的曲线面积和周长
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 10:30 , Processed in 0.129950 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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