天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 12|回复: 0

ObjectARX注册命令

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    /-----------------------------------------------------------------------------
    #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注册命令
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|

    GMT+8, 2024-7-1 05:17 , Processed in 0.059141 second(s), 23 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表