ARX CAD HW10_1

7 篇文章 0 订阅
4 篇文章 0 订阅

编写一ObjectARX程序,包含以下三个功能(命令):

命令Ellipse1,使之能够自动对图中的椭圆进行如下操作:面积小于等于π的椭圆,将其颜色变为红色;面积大于π的椭圆,将其颜色变为蓝色。

命令Ellipse2,使之能够让用户以逐个选取方式对椭圆进行上述操作。

命令Ellipse3,使之能够让用户以多选方式对椭圆进行上述操作。

Command.cpp 如下:

//
// ObjectARX defined commands

#include "StdAfx.h"
#include "StdArx.h"
const double PI=3.15159265;//定义常量π
// This is command 'ELLIPSE1'
void xxxxEllipse1()
{
	// TODO: Implement the command
	double area;

	AcDbBlockTable *pBlockTable;
	acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable,
		AcDb::kForRead);
	AcDbBlockTableRecord *pBlockTableRecord;
	pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,
		AcDb::kForWrite);
	AcDbBlockTableRecordIterator *pIter;
	pBlockTableRecord->newIterator(pIter);
	AcDbEntity *pEnt;

	for (;!pIter->done();pIter->step())//遍历所有实体
	{
		pIter->getEntity(pEnt,AcDb::kForWrite);//获取实体指针
		if (strcmp(pEnt->isA()->name(),"AcDbEllipse")==0)//遇到椭圆就进行操作
		{
			AcDbEllipse *pEllipse;
			pEllipse=(AcDbEllipse *)pEnt;//将pEnt强制转换
			pEllipse->getArea(area);
			if (area<=PI)//面积小于π设为红色
			{
				
				pEllipse->setColorIndex(1);
			}
			else//大于π设为蓝色色
			{
				pEllipse->setColorIndex(5);
			}
			pEllipse->close();//关闭对象指针
		}
		pEnt->close();//关闭实体
	}
	delete pIter;//删除指针
	pBlockTableRecord->close();
	pBlockTable->close();//关闭所有指针
}

// This is command 'ELLIPSE2'
void xxxxEllipse2()//以逐个选取方式对椭圆进行操作
{
	// TODO: Implement the command
	ads_name Ent;//记录实体名
	ads_point pt;//数组
	AcDbEntity *pEnt;//实体指针
	AcDbObjectId EntId;//实体ID
	double area;
	while(acedEntSel("\nSelect An Entity:",Ent,pt)==RTNORM)//循环选取单个实体,直到Cancle
	{
		acdbGetObjectId(EntId,Ent);//获取实体ID
		acdbOpenObject(pEnt,EntId,AcDb::kForWrite);//读取实体指针
		if (strcmp(pEnt->isA()->name(),"AcDbEllipse")==0)//如果实体名为椭圆,进入操作
		{
			AcDbEllipse *pEllipse;
			pEllipse=(AcDbEllipse *)pEnt;//强制转换为AcDbEllipse类型的指针
			pEllipse->getArea(area);//获取椭圆面积
			if (area<PI)
			{
				pEllipse->setColorIndex(1);
			}
			else
			{
				pEllipse->setColorIndex(5);
			}
			pEllipse->close();
		}
		else
		{
			acutPrintf("\nThe Selected Entity Is Not A Ellipse!");//错误提示
		}
		pEnt->close();//关闭实体指针
	}
}

// This is command 'ELLIPSE3'
void xxxxEllipse3()//以多选方式对椭圆进行操作
{
	// TODO: Implement the command
	AcDbEntity *pEnt;//实体指针
	ads_name Ent,Ssname;//记录名
	AcDbObjectId EntId;
	long Nss,i;//与acdeSSLength对变量的要求匹配
	double area;

	acedSSGet(NULL,NULL,NULL,NULL,Ssname);//选择多个实体
	acedSSLength(Ssname,&Nss);//得到实体个数
	for (i=0;i<Nss;i++)//遍历已经选取的实体
	{
		acedSSName(Ssname,i,Ent);//获取实体名
		acdbGetObjectId(EntId,Ent);//读取实体ID
		acdbOpenObject(pEnt,EntId,AcDb::kForWrite);//打开实体
		if (strcmp(pEnt->isA()->name(),"AcDbEllipse")==0)//如果是椭圆就进行操作
		{
			AcDbEllipse *pEllipse;
			pEllipse=(AcDbEllipse *)pEnt;
			pEllipse->getArea(area);
			if (area<=PI)//小于π设为红色
			{
				pEllipse->setColorIndex(1);
			}
			else//大于π设为蓝色
			{
				pEllipse->setColorIndex(5);
			}
			pEllipse->close();
		}
		else//错误提示
		{
			acutPrintf("\nThe Selected Entity Is Not A Ellipse!");
		}
		pEnt->close();//关闭指针
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值