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)

 

原创粉丝点击