ObjectARX注册命令

/-----------------------------------------------------------------------------
#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)

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ObjectARX Toolbar (对象ARX工具栏) 是一个在AutoCAD中使用的工具栏。ObjectARX是一种用于开发AutoCAD的应用程序的编程接口,通过它可以创建自定义的命令和功能,以满足特定的设计需求。 ObjectARX工具栏为开发者提供了一组快捷方式和工具按钮,方便他们快速访问在AutoCAD中开发的自定义功能。通过ObjectARX工具栏,开发者可以更加高效地使用他们创建的命令和功能,从而提高工作效率和设计准确性。 ObjectARX工具栏通常包含一些常用的功能按钮,如选择对象、创建实体、修改实体等。通过点击这些按钮,开发者可以直接执行相应的命令,而无需手动输入命令名称或使用菜单。 另外,ObjectARX工具栏还能够提供一些开发者相关的工具,如调试工具和资源管理器。这些工具使开发者能够更加方便地调试和管理他们的自定义应用程序。 总之,ObjectARX工具栏是一个为AutoCAD开发者设计的工具栏,通过提供快捷方式和工具按钮,方便他们快速访问和使用自己开发的命令和功能。它大大提高了开发者的工作效率和设计准确性。 ### 回答2: ObjectARX是一个由Autodesk开发的开发环境和API(应用程序接口),用于创建和定制AutoCAD和其他Autodesk产品的插件和应用程序。它为开发者提供了一系列功能强大的工具和库,使他们能够创建与AutoCAD完全集成的自定义工具和功能。 ObjectARX Toolbar是一个通过ObjectARX开发的插件,在AutoCAD界面中添加一个自定义的工具栏。这个工具栏可以包含各种功能按钮,可以直观地显示和执行特定的操作。通过ObjectARX Toolbar,开发者可以根据自己的需要创建各种自定义工具,例如快速执行特定命令、自动化复杂的任务、访问第三方数据源等等。 使用ObjectARX Toolbar可以极大地提高AutoCAD的工作效率和功能扩展性。开发者可以根据自己的需求设计和布置工具栏上的按钮,将常用的功能和命令集中在一起,避免频繁查找和输入命令。此外,ObjectARX Toolbar还可以与其他ObjectARX插件和应用程序进行集成,实现更复杂的功能和更高级的操作。 总而言之,ObjectARX Toolbar是通过ObjectARX开发的一个自定义工具栏,可用于在AutoCAD中添加各种自定义功能按钮,提高工作效率和功能扩展性。它是AutoCAD开发者的强大工具之一,可以根据需求创建各种自定义工具,满足不同用户的需求。 ### 回答3: ObjectARX Toolbar是AutoCAD的一个工具栏,用于在AutoCAD环境中快速访问和使用ObjectARX编程接口的功能。ObjectARX是AutoCAD的应用程序接口(API),允许开发者自定义和扩展AutoCAD的功能。 通过ObjectARX Toolbar,开发者可以方便地访问和使用ObjectARX API所提供的各种函数和方法。这些函数和方法可以用于创建自定义的命令、修改和访问AutoCAD的对象,以及实现各种与AutoCAD相关的功能。 ObjectARX Toolbar通常包含了各种常用的功能按钮,如创建实体、修改实体、查询实体等。开发者可以通过点击这些按钮来执行特定的操作。此外,ObjectARX Toolbar还提供了一些额外的工具,如查看帮助文档、打开示例代码等,以帮助开发者更好地理解和使用ObjectARX API。 使用ObjectARX Toolbar,开发者可以快速开发和调试与AutoCAD相关的应用程序。他们可以使用ObjectARX API提供的各种函数和方法,来创建自定义的命令和功能,并将其集成到AutoCAD中。通过这种方式,开发者可以根据自己的需求扩展AutoCAD的功能,使其符合特定的工作流程和业务需求。 总之,ObjectARX Toolbar为开发者提供了一个便捷的工具,使他们能够更好地使用和开发ObjectARX API。通过ObjectARX Toolbar,开发者可以快速访问和使用ObjectARX编程接口的功能,并通过自定义和扩展AutoCAD的功能来满足特定的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值