ARX CAD HW9_2

原创辛苦,转载请注明!

编写一ObjectARX命令EllipseTest,实现由用户交互方式生成椭圆的功能。生成方式有命令方式和ARX方式两种供用户选择。用户交互输入的参数有:椭圆中心点、长轴长度、短轴长度和生成方式(命令方式[com]/ARX方式[arx])。

椭圆在ObjectARX中的实体类是AcDbEllipse(头文件dbelipse.h),详细信息请参阅ObjectARXReference。


EllipseTest.cpp如下:

//
// ObjectARX defined commands

#include "StdAfx.h"
#include "StdArx.h"

const double PI=3.14159265;
// This is command 'ELLIPSETEST'
void CreateEllipse(
	AcGePoint3d center,//椭圆圆心
	double longR,//椭圆长轴
	double shortR,//椭圆短轴
	char *layer)//图层名
{
	AcGeVector3d v1(0,0,1);//椭圆所在平面的法向量
	AcGeVector3d v_long(longR,0,0);//表示长轴的向量
	if (longR/shortR<1.0)
	{
		AfxMessageBox("长轴短于短轴!请重新输入!");
		return;
	}

	//设置椭圆的绘制方式,函数的参数如下:
	//中心,法向量,长轴向量,短长轴之比,起始角度,终止角度
	AcDbEllipse *pEllipse=new AcDbEllipse(center,v1,v_long,shortR/longR,
		0.0,2*PI);

	//获取图形块表指针
	AcDbBlockTable *pBlockTable;
	acdbHostApplicationServices()->workingDatabase()->getSymbolTable
		(pBlockTable,AcDb::kForRead);

	//获取图形块表记录指针
	AcDbBlockTableRecord *pBlockTableRecord;
	pBlockTable->getAt(ACDB_MODEL_SPACE,
		pBlockTableRecord,AcDb::kForWrite);

	//关闭图形块表指针
	pBlockTable->close();

	//将图形对象写入块表记录指针
	AcDbObjectId EllipseID;
	pBlockTableRecord->appendAcDbEntity(EllipseID,pEllipse);

	//关闭块表记录指针
	pBlockTableRecord->close();

	//设置图层
	pEllipse->setLayer(layer);

	//关闭椭圆对象
	pEllipse->close();
	return;
}
void BaiyangEllipseTest()
{
	// TODO: Implement the command
	AcGePoint3d center;
	ads_point EllipseCenter;
	double longR=100;
	double shortR=50;
	int color;
	char ans;
	ads_point point_long,point_short;//用来存储长短轴端点坐标
	acedGetString(0,"请输入您想要实现的方式(首字母)?<Command/Arx>:",&ans);
	switch(ans)
	{
	case 'C':
	case 'c':
		{
			//输入椭圆中心点的坐标
			acedGetPoint(NULL,"请输入椭圆中心点:",EllipseCenter);

			//输入长轴坐标
			acedGetReal("请输入长轴:",&longR);
			
			//设置长轴端点坐标,默认长轴为X方向
			point_long[0]=longR+EllipseCenter[0];
			point_long[1]=EllipseCenter[1];
			point_long[2]=EllipseCenter[2];
			
			//输入短轴坐标
			acedGetReal("请输入短轴:",&shortR);

			//设置短轴坐标,默认短轴为Y方向
			point_short[0]=EllipseCenter[0];
			point_short[1]=shortR+EllipseCenter[1];
			point_short[2]=EllipseCenter[2];

			//用Command方式实现椭圆
			acedCommand(RTSTR,"ellipse",RTSTR,"c",
				RT3DPOINT,EllipseCenter,
				RT3DPOINT,point_long,
				RT3DPOINT,point_short,
				RTNONE);
		}
		break;
	case 'A':
	case 'a':
		{
			acedGetPoint(NULL,"请输入椭圆中心点:",EllipseCenter);
			acedGetReal("请输入长轴:",&longR);
			acedGetReal("请输入短轴:",&shortR);
			
			//将椭圆中心存入到一个AcGePoint3d中,以免调用函数时出错
			center[0]=EllipseCenter[X];
			center[1]=EllipseCenter[Y];
			center[2]=EllipseCenter[Z];
			
			//下面的函数的第一个参数必须为AcGePoint3d
			CreateEllipse(center,longR,shortR,"0");//
		}
		break;
	default:
		acutPrintf("输入错误!请重新输入您的选择(A、a、C、c)!");
		break;
	}
}

你可能感兴趣的:(ARX CAD HW9_2)