ObjectARX注册命令
来源:互联网 发布:大数据可视化软件 编辑:程序博客网 时间:2024/04/30 05:13
/-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "ArxAllTestCommands.h"
#include "MfcDialog.h"
#include "ArxDialog.h"
#include "ModelessDlg.h"
#include "MyDockControlBar.h"
//-----------------------------------------------------------------------------
#define szRDS _RXST("")
//HINSTANCE _hdllInstance=NULL;
CModelessDlg *pDialog=NULL; //非模态显示的窗体
CMyDockControlBar* g_pDlgBar=NULL;
AcDbObjectId PostToModelSpace(AcDbEntity* pEnt);
void ZffCHAP5AddCircle1(void); //创建一个圆 acedCommand
void ZffCHAP5ADDCIRCLE2(void); //创建一个圆 acedCmd
void ZffCHAP5EntInfo(void); //提示用户选择一个实体,在命令窗口显示该实体的参数
void ZffCHAP5AddPoly(void); //提示用户输入多段的节点、线宽和颜色,完成多段线的创建
void ZffCHAP5AddXData(void); //向实体追加指定的扩展数据
void ZffCHAP5ViewXData(void); // 查看指定实体的扩展数据
void ZffCHAP12MfcModal(void); //显示新创建的对话框
void ZffCHAP12ArxModal(void); //以模态方式显示对话框
void ZffCHAP12ModelessDlg(void); //
//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CArxAllTestApp : public AcRxArxApp {
public:
CArxAllTestApp () : AcRxArxApp () {}
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
acedRegCmds->addCommand("test2","AddCircle1","AddCircle1",ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET,ZffCHAP5AddCircle1);
acedRegCmds->addCommand("test2","AddCircle2","AddCircle2",ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET,ZffCHAP5ADDCIRCLE2);
acedRegCmds->addCommand("test2","EntInfo","EntInfo",ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET,ZffCHAP5EntInfo);
acedRegCmds->addCommand("test2","AddPoly","AddPoly",ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET,ZffCHAP5AddPoly);
acedRegCmds->addCommand("test2","Xdata","Xdata",ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET,ZffCHAP5AddXData);
acedRegCmds->addCommand("test2","ViewXdata","ViewXdata",ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET,ZffCHAP5ViewXData);
acedRegCmds->addCommand("test2","MfcModal","MfcModal",ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET,ZffCHAP12MfcModal);
acedRegCmds->addCommand("test2","ArxModal","ArxModal",ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET,ZffCHAP12ArxModal);
acedRegCmds->addCommand("test2","ModelessDlg","ModelessDlg",ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET,ZffCHAP12ModelessDlg);
// TODO: Add your initialization code here
// CAcModuleResourceOverride resOverride;
//if (g_pDlgBar==NULL)
//{
// g_pDlgBar=new CMyDockControlBar();
// g_pDlgBar->Create(acedGetAcadFrame(),_T("DockBar"));
// g_pDlgBar->SetWindowText(_T("MyControlBar"));
// g_pDlgBar->EnableDocking(CBRS_ALIGN_ANY);
//}
//acedGetAcadFrame()->FloatControlBar(g_pDlgBar,CPoint(100,100),CBRS_ALIGN_TOP); //初始位置
//acedGetAcadFrame()->ShowControlBar(g_pDlgBar,TRUE,TRUE);
return (retCode) ;
}
virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
// TODO: Add your code here
// CModelessDlg::CloseDialog();
return (retCode) ;
}
virtual void RegisterServerComponents () {
}
} ;
void ZffCHAP5AddCircle1()
{
//声明ADS变量
ads_point ptCenter={0,0,0}; //圆心
ads_real radius=10; //半径
//调用acedCommand函数创建圆
acedCommand(RTSTR,"Circle", //命令
RTPOINT,ptCenter, //圆心
RTREAL,radius, //半径
RTNONE
);
}
void ZffCHAP5ADDCIRCLE2()
{
struct resbuf *rb; //结果缓冲区
int rc=RTNORM; //返回值
//创建结果缓冲区链表
ads_point ptCenter={30,0,0};
ads_real radius=10;
rb=acutBuildList(RTSTR,"Circle",RTPOINT,ptCenter,RTREAL,radius,RTNONE);
//创建圆
if (rb!=NULL)
{
rc=acedCmd(rb);
}
//检验返回值
if (rc!=RTNORM)
{
acutPrintf("/n创建圆失败!");
}
acutRelRb(rb);
//进行缩放
acedCommand(RTSTR,"Zoom",RTSTR,"E",RTNONE);
}
void ZffCHAP5EntInfo()
{
//提示用户选择实体
ads_name entName;
ads_point pt;
if (acedEntSel("/n选择实体:",entName,pt)!=RTNORM)
{
return;
}
struct resbuf *rbEnt; //保存实体数据的结果缓冲区
struct resbuf *rb; //用于遍历rbEnt的结果缓冲区
//从entName获得保存实体数据的结果缓冲区
rbEnt=acdbEntGet(entName);
rb=rbEnt;
while (rb!=NULL)
{
switch (rb->restype)
{
case -1: //图元名
acutPrintf("/n 图元名:%x",rb->resval.rstring);
break;
case 0: // 图元类型
acutPrintf("/n 图元类型:%s",rb->resval.rstring);
break;
case 8: //图层
acutPrintf("/n图层:%s:",rb->resval.rstring);
break;
case 10: // 圆心
acutPrintf("/n圆心:(%.2f,%.2f,%.2f)",rb->resval.rpoint[X],rb->resval.rpoint[Y],rb->resval.rpoint[Z]);
break;
case 40: //半径
acutPrintf("/n半径:%.4f",rb->resval.rreal);
break;
case 210: //圆所在平面的法向矢量
acutPrintf("/n平面的法向矢量:(%.2f,%.2f,%.2f)",rb->resval.rpoint[X],rb->resval.rpoint[Y],rb->resval.rpoint[Z]);
break;
default:break;
}
rb=rb->rbnext; //切换到下一个节点
}
if(rbEnt!=NULL)
{
acutRelRb(rbEnt);
}
}
void ZffCHAP5AddPoly(void)
{
int colorIndex=0; //颜色索引值
ads_real width=0; //多段线宽的线宽
int index=2; //当前输入点的次数
ads_point ptStart; //起点
//提示用户输入起点
if(acedGetPoint(NULL,"/n输入第一个点:",ptStart)!=RTNORM)
return;
ads_point ptPrevious,ptCurrent; //前一个参考点,当前拾取的点
acdbPointSet(ptStart,ptPrevious);
AcDbObjectId polyId; //多段线的ID
//输入第二点
acedInitGet(NULL,"WCO");
int rc=acedGetPoint(ptPrevious,"/n输入下一点[宽带(W)/颜色(C)]<完成(O)>:",ptCurrent);
while(rc==RTNORM||rc==RTKWORD)
{
if(rc==RTKWORD)
{
char kword[20];
if(acedGetInput(kword)!=RTNORM)
return;
if(strcmp(kword,"W")==0)
{
width=ArxAllTestCommands::GetWidth();
}
else if(strcmp(kword,"C")==0)
{
colorIndex=ArxAllTestCommands::GetColorIndex();
}
else if(strcmp(kword,"O")==0)
{
return;
}
else
{
acutPrintf("/n无效的关键字。");
}
}
else if(rc==RTNORM)
{
if(index==2)
{
//创建多段线
AcDbPolyline *ptPoly=new AcDbPolyline(2);
AcGePoint2d ptGe1,ptGe2; //两个节点
ptGe1[X]=ptPrevious[X];
ptGe1[Y]=ptPrevious[Y];
ptGe2[X]=ptCurrent[X];
ptGe2[Y]=ptCurrent[Y];
ptPoly->addVertexAt(0,ptGe1);
ptPoly->addVertexAt(1,ptGe2);
//修改多段线的颜色和线宽
ptPoly->setConstantWidth(width);
ptPoly->setColorIndex(colorIndex);
//添加到模型空间
polyId=PostToModelSpace(ptPoly);
}
else if(index >2)
{
//修改多段线,添加最后一个顶点
AcDbPolyline *ptPoly;
acdbOpenObject(ptPoly,polyId,AcDb::kForWrite);
AcGePoint2d ptGe; //增加的节点
ptGe[X]=ptCurrent[X];
ptGe[Y]=ptCurrent[Y];
ptPoly->addVertexAt(index-1,ptGe);
//修改多段线的颜色和线宽
ptPoly->setConstantWidth(width);
ptPoly->setColorIndex(colorIndex);
ptPoly->close();
}
index++;
acdbPointSet(ptCurrent,ptPrevious);
}
// 提示用户输入新的节点
acedInitGet(NULL,"WCO ");
rc=acedGetPoint(ptPrevious,"/n输入下一点[宽带(W)/颜色(C)]<完成(O)>.",ptCurrent);
}
}
//将指定的实体添加到当前图形的模型空间
AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
{
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
AcDbObjectId entId;
pBlockTableRecord->appendAcDbEntity(entId,pEnt);
pBlockTable->close();
pBlockTableRecord->close();
pEnt->close();
return entId;
}
void ZffCHAP5AddXData()
{
//提示用户选着所要扩展数据的图形对象
ads_name en;
ads_point pt1;
if(acedEntSel("/n选择所要添加扩展数据的实体:",en,pt1)!=RTNORM)
{
return;
}
AcDbObjectId entId;
Acad::ErrorStatus es=acdbGetObjectId(entId,en);
//扩展数据的内容
struct resbuf* pRb;
char appName[] ={"XData"};
char typeName[]={"道理中心线"};
//注册应用程序名称
acdbRegApp("XData");
//创建结果缓冲区链表
pRb=acutBuildList(AcDb::kDxfRegAppName,appName, //应用程序名称
AcDb::kDxfXdAsciiString,typeName, //字符串
AcDb::kDxfXdInteger32,2, //整数
AcDb::kDxfXdReal,3,14, //实数
AcDb::kDxfXdWorldXCoord,pt1, //点坐标值
RTNONE);
//为选择的视图添加扩展数据
AcDbEntity* pEnt;
acdbOpenAcDbEntity(pEnt,entId,AcDb::kForWrite);
struct resbuf* pTemp;
pTemp=pEnt->xData("XData");
if(pTemp!=NULL) //如果已经包含扩展数据,就不在添加新的扩展数据
{
acutRelRb(pTemp);
acutPrintf("/n所选择的实体已经包含扩展数据!");
}
else
{
pEnt->setXData(pRb);
}
pEnt->close();
acutRelRb(pRb);
}
void ZffCHAP5ViewXData()
{
//提示用户选择所要查看扩展数据的图形对象
ads_name en;
ads_point pt2;
if(acedEntSel("/n选择所要查看扩展数据的实体",en,pt2)!=RTNORM)
return ;
AcDbObjectId entId;
Acad::ErrorStatus es=acdbGetObjectId(entId,en);
//打开图形对象,查看是否包括扩展数据
AcDbEntity* pEnt;
acdbOpenAcDbEntity(pEnt,entId,AcDb::kForRead);
struct resbuf* pRb;
pRb=pEnt->xData("XData");
pEnt->close();
if(pRb!=NULL)
{
//在命令行显示所有的扩展数据
struct resbuf* pTemp;
pTemp=pRb;
//首先要跳过应用程序的名称的这一项
pTemp=pTemp->rbnext;
acutPrintf("/n字符串类型的扩展数据是:%s",pTemp->resval.rstring);
pTemp=pTemp->rbnext;
acutPrintf("/n整数类型的扩展数据是:%d",pTemp->resval.rint);
pTemp=pTemp->rbnext;
acutPrintf("/n实数类型的扩展数据是:%.2f",pTemp->resval.rreal);
pTemp=pTemp->rbnext;
acutPrintf("/n点坐标类型的扩展数据是:(%.2f,%.2f,%.2f)",pTemp->resval.rpoint[X],pTemp->resval.rpoint[Y],pTemp->resval.rpoint[Z]);
acutRelRb(pRb);
}
else
{
acutPrintf("/n所选择的实体不包括任何的扩展数据!");
}
}
void ZffCHAP12MfcModal()
{
//显示MFC的模态对话框
CMfcDialog theDialog;
if(theDialog.DoModal()==IDOK)
{
AfxMessageBox(_T("关闭对话框!"));
}
}
void ZffCHAP12ArxModal()
{
//防止资源冲突
CAcModuleResourceOverride resOverride;
//显示ObjectARX的模态对话框
CArxDialog theDialog1;
theDialog1.DoModal();
}
void ZffCHAP12ModelessDlg()
{
CAcModuleResourceOverride resOverride;
//以非模态方式启动对话框
if(pDialog == NULL)
{
pDialog=new CModelessDlg(acedGetAcadFrame());
pDialog->Create(IDD_DIALOG3);
pDialog->ShowWindow(SW_SHOW);
}
else
{
pDialog->ShowWindow(SW_SHOW);
}
}
//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CArxAllTestApp)
- ObjectARX注册命令
- ObjectARX
- ObjectARX:C# ObjectARX--起步
- ObjectARX下载ObjectARX Wizards
- 组件注册命令- -
- 注册aspnet命令
- 注册组件命令
- 注册COM组件命令
- 重新注册opcenum命令
- Regsvr 32 注册命令
- 注册DLL文件命令
- 3.3、注册新命令
- 注册DLL文件命令
- ObjectARX简介
- ObjectARX 介绍
- ObjectARX-圆
- 关于objectarx
- ObjectARX 概述
- 做OSGi时关于Declarative Service的一点小问题
- 触摸屏中鼠标事件的捕获和传递及触摸屏的移植
- MySQL命令行操作
- Spring Portlet MVC
- 由于出现错误 c00ce56e 而导致此项操作无法完成。
- ObjectARX注册命令
- 查找某段话所在的文件
- string类的构造函数,拷贝构造函数,析构函数和赋值函数
- 存储过程调用自定义函数
- VS2005--设置Release模式下调试
- 金山词霸”屏幕取词技术揭密(讨论稿)
- php文件上传类型(MIME)对照表
- set path
- linux汇编必读