原创辛苦,转载请注明!
编写一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; } }