zoukankan      html  css  js  c++  java
  • 读写扩展数据

    写扩展数据,其中使用upgradeOpen()函数对象的打开方式变为写方式

     1 static void lzxARX_AcDbDatabaseAddXData(void)
     2     {
     3         //获得对象
     4         AcDbObject* pObj = selectObject(AcDb::kForRead);
     5 
     6         if (!pObj)
     7         {
     8             acutPrintf(L"Error selecting object\n");
     9             return;
    10         }
    11 
    12         //获得将要添加到扩展数据中的应用程序名和字符串
    13         ACHAR appName[132], resString[200];
    14         appName[0] = resString[0] = '\0';
    15 
    16         acedGetString(NULL, L"Enter application name:",appName);
    17         acedGetString(NULL,L"Enter string to be addec:", resString);
    18 
    19         struct resbuf *pRb, *pTemp;
    20 
    21         //添加扩展数据
    22         pRb = pObj->xData(appName);
    23 
    24         if (pRb != NULL)
    25         {
    26             //如果对象上已经有扩展数据,则到链表层
    27             for (pTemp = pRb; pTemp->rbnext != NULL; pTemp = pTemp->rbnext)
    28             {
    29                 
    30             }
    31         }
    32         else
    33         {
    34             //如果扩展数据不存在,则注册该应用程序,然后将应用程序名添加到链表的首部
    35             acdbRegApp(appName);
    36 
    37             pRb = acutNewRb(AcDb::kDxfRegAppName);
    38             pTemp = pRb;
    39             pTemp->resval.rstring = (ACHAR *)malloc(_tcslen(appName)+1);
    40             _tcscpy(pTemp->resval.rstring, appName);
    41         }
    42 
    43         //将用户指定的数据添加到扩展数据中
    44         pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);
    45         pTemp = pTemp->rbnext;
    46         pTemp->resval.rstring = (ACHAR *)malloc(_tcslen(resString)+1);
    47         _tcscpy(pTemp->resval.rstring, resString);
    48 
    49         //下面使用upgradeOpen()函数对象的打开方式变为写方式
    50         pObj->upgradeOpen();
    51         pObj->setXData(pRb);
    52         pObj->close();
    53         acutRelRb(pRb);
    54     }

    读取扩展数据

     1     static void lzxARX_AcDbDatabasePrintXData(void)
     2     {
     3         //选择对象并打开该该对象
     4         AcDbObject* pObj;
     5         if ((pObj = selectObject(AcDb::kForRead)) == NULL)
     6         {
     7             return;
     8         }
     9 
    10         //获得应用程序名称
    11         ACHAR appName[133];
    12         if (acedGetString(NULL,L"\nEnter the desired Xdata application name:", appName) != RTNORM)
    13         {
    14             return;
    15         }
    16 
    17         //获得对应于应用程序名称的扩展数据
    18         struct resbuf *pRb;
    19         pRb = pObj->xData(appName);
    20 
    21         if (pRb!=NULL)
    22         {
    23             //如果存在数据,则打印扩展数据
    24             printList(pRb);
    25             acutRelRb(pRb);
    26         }
    27         else
    28         {
    29             //没有扩展数据
    30             acutPrintf(L"\nNo xdata for this sppname");
    31         }
    32         pObj->close();
    33     }

    下面是两个自定义函数

      1     //打印链表中的数据
      2     static void printList(struct resbuf* pRb)
      3     {
      4         int rt, i;
      5         ACHAR buf[133];
      6 
      7         //对链表中数据的类型进行判断
      8         for(i = 0; pRb != NULL; i++, pRb = pRb->rbnext)
      9         {
     10             if (pRb->restype < 1010)
     11             {
     12                 rt = RTSTR;
     13             }
     14             else if (pRb->restype < 1040)
     15             {
     16                 rt = RT3DPOINT;
     17             }
     18             else if (pRb->restype < 1060)
     19             {
     20                 rt = RTREAL;
     21             }
     22             else if (pRb->restype < 1071)
     23             {
     24                 rt = RTSHORT;
     25             }
     26             else if (pRb->restype = 1071)
     27             {
     28                 rt = RTLONG;
     29             }
     30             else
     31             {
     32                 //未知类型
     33                 rt = pRb->restype;
     34             }
     35 
     36             //对不同类型数据进行处理
     37             switch(rt)
     38             {
     39             //短整型数据
     40             case RTSHORT:
     41                 if (pRb->restype == RTSHORT)
     42                 {
     43                     acutPrintf(L"RTSHORT : %d\n", pRb->resval.rint);
     44                 }
     45                 else
     46                 {
     47                     acutPrintf(L"(%d . %d)\n",pRb->restype,pRb->resval.rint);
     48                 }
     49                 break;
     50 
     51             //实型数据
     52             case RTREAL:
     53                 if (pRb->restype == RTREAL)
     54                 {
     55                     acutPrintf(L"RTREAL : %0.3f\n", pRb->resval.rreal);
     56                 }
     57                 else
     58                 {
     59                     acutPrintf(L"(%d . %0.3f)\n",pRb->restype,pRb->resval.rreal);
     60                 }
     61                 break;
     62 
     63             //这符串型数据
     64             case RTSTR:
     65                 if (pRb->restype == RTSTR)
     66                 {
     67                     acutPrintf(L"RTSTR : %s\n", pRb->resval.rstring);
     68                 }
     69                 else
     70                 {
     71                     acutPrintf(L"(%d . \"%s\")\n", pRb->restype, pRb->resval.rstring);
     72                 }
     73                 break;
     74 
     75             //三维点
     76             case RT3DPOINT:
     77                 if (pRb->restype == RT3DPOINT)
     78                 {
     79                     acutPrintf(L"RT3DPOINT : %0.3f, %0.3f, %0.3f,\n", 
     80                         pRb->resval.rpoint[X],
     81                         pRb->resval.rpoint[Y],
     82                         pRb->resval.rpoint[Z]);
     83                 }
     84                 else
     85                 {
     86                     acutPrintf(L"(%d %0.3f, %0.3f, %0.3f,\n", 
     87                         pRb->restype,
     88                         pRb->resval.rpoint[X],
     89                         pRb->resval.rpoint[Y],
     90                         pRb->resval.rpoint[Z]);
     91                 }
     92                 break;
     93 
     94             //长整型
     95             case RTLONG:
     96                 acutPrintf(L"RTLONG : %d\n", pRb->resval.rlong);
     97                 break;
     98             }
     99 
    100             //数据处理完成
    101             if ((i == 23) && (pRb->rbnext != NULL))
    102             {
    103                 i = 0;
    104                 acedGetString(0, L"Press <ENTER> to continue...", buf);
    105             }
    106         }
    107     }
     1     //获得对象并打开该对象的函数
     2     static AcDbObject* selectObject(AcDb::OpenMode openMode)
     3     {
     4         //提示用户选择实体
     5         int ss;
     6         ads_name en;
     7         ads_point pt;
     8         ss = acedEntSel(L"\nSelect an Entity: ", en, pt);
     9 
    10         AcDbObjectId eId;
    11 
    12         //实体选择错误
    13         if(ss != RTNORM)
    14         {
    15             acutPrintf(L"Selection error, Return Code = %d\n", ss);
    16             return NULL;
    17         }
    18 
    19         //通过ads_name获得对象ID
    20         Acad::ErrorStatus retStat;
    21         retStat = acdbGetObjectId(eId, en);
    22         if (retStat != Acad::eOk)
    23         {
    24             //没胡获得对象ID
    25             acutPrintf(L"\nacadGelObjectId failed");
    26             acutPrintf(L"\nen == (%lx,%lx), restStat == %d\n", en[0], en[1], eId);
    27             return NULL;
    28         }
    29 
    30         AcDbObject* obj;
    31 
    32         //打开对象
    33         if ((retStat = acdbOpenObject(obj, eId, openMode)) != Acad::eOk)
    34         {
    35             acutPrintf(L"acdbOpenEntiy failed: ename: (%lx,%lx), mode:%d retStat:%d", en[0], en[1], openMode, retStat);
    36             return NULL;
    37         }
    38 
    39         //返回对象指针
    40         return obj;
    41     }
  • 相关阅读:
    Unity实现Bezier曲线的移动(三点之间的Bezier曲线的移动)
    error CS2001: Source file `Assets/Pro Standard Assets/Image Based/SaveGameData.cs' could not be found 错误
    Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?) 错误
    Unity拖拽旋转2D物体
    Unity预编译
    Activity的四种launchMode
    接入华为海外SDK支付,按下home键,之后支付页面被销毁
    Android动态权限申请
    armeabi与armeabi-v7a的区别
    win7上帝模式
  • 原文地址:https://www.cnblogs.com/lzx838/p/2664965.html
Copyright © 2011-2022 走看看