天气与日历 切换到窄版

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

扩展数据

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

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    展数据(xdata)是由应用程序通过ObjectArx或AutoLISP建立并添加到任何对象上.扩展数据包含一个应用程序使用的结果缓冲区(resbuf)链接表.数据与在1000至1071范围内的DXF组码相对应.
    该方法节省空间,在向对象添加少量数据时是很有用的.然而,扩展数据不能超过16KB,其数据只能在既有的DXF组码和类型范围内.

    void         printXdata();        // 打印扩展数据
    void         addXdata();        // 添加扩展数据
    void         printList(struct resbuf* pRb);                //打印扩展数据列表
    AcDbObject*  selectObject(AcDb::OpenMode openMode);        //选择并打开对象

    // 打印扩展数据
    void
    printXdata()
    {
        // 选择并打开一个对象,selectObject函数为自定义函数,下面即是
        AcDbObject *pObj;
        if ((pObj = selectObject(AcDb::kForRead)) == NULL) {
            return;
        }

        // 输入扩展数据的应用程序名,以便查找时用,在扩展数据方面,查询函数为xData(char*)
        char appname[133];
        if (acedGetString(NULL,
            "/n输入想获取扩展数据的应用程序名: ",
            appname) != RTNORM)
        {
            return;
        }

        // 这里就是根据上面的字符串来查询相应的程序名是否存在
        struct resbuf *pRb;
        pRb = pObj->xData(appname);

        if (pRb != NULL) {
                    // 如果扩展数据为空,注册应用程序将appName添加到表的第一个结果缓冲区中
            printList(pRb); //打印列表,为自定义函数,详细看下面其实现
            acutRelRb(pRb); //释放pRb的内在空间

        } else {
            acutPrintf("/n该名字的应用程序没有扩展数据");
        }
        pObj->close();
    }

    //添加扩展数据
    void
    addXdata()
    {
            // 选择并打开一个对象,selectObject函数为自定义函数,下面即是
        AcDbObject* pObj = selectObject(AcDb::kForRead);
        if (!pObj) {
            acutPrintf("选择对象出错/n");
            return;
        }

            //获取应用程序名和要添加到扩展数据的字符串
        char appName[132], resString[200];
        appName[0] = resString[0] = '/0';

        acedGetString(NULL, "/n输入应用程序名: ",
            appName);
        acedGetString(NULL, "/n输入要添加的字符串: ",
            resString);

       
        struct  resbuf  *pRb, *pTemp;
        // 查询或搜索应用程序名
        pRb = pObj->xData(appName);
        if (pRb != NULL) {
                    // 如果应用程序名已存在,将指针指向表尾,以便添加的字符串位于整个应用程序的最后
            for (pTemp = pRb; pTemp->rbnext != NULL;
                    pTemp = pTemp->rbnext)
                    { ; }
        } else {
            // 如果扩展数据为空,说明目前的对象中没有该程序的扩展数据,则就注册应用程序
                    // 并添加到表的第一个结果缓冲区中
            acdbRegApp(appName);        //注册应用程序扩展数据

            pRb = acutNewRb(AcDb::kDxfRegAppName); //以DXF组码建立应用程序名缓冲区
            pTemp = pRb;
            pTemp->resval.rstring
                = (char*) malloc(strlen(appName) + 1);
            strcpy(pTemp->resval.rstring, appName);
        }

            // 将用户指定的字符串添加到扩展数据中
            pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString); //以DXF组码建立字符串缓冲区
        pTemp = pTemp->rbnext;
        pTemp->resval.rstring
            = (char*) malloc(strlen(resString) + 1);
        strcpy(pTemp->resval.rstring, resString);

            //由于pObj是以读方式打开的,所以这里要调用upgradeOpen()函数将实体从读模式改为写模式
        pObj->upgradeOpen();
        pObj->setXData(pRb); //为对象指定扩展数据
       
        pObj->close();
        acutRelRb(pRb);
    }

    //打印扩展数据列表,
    void
    printList(struct resbuf* pRb)
    {
            int rt, i;
            char buf[133];

            for (i = 0;pRb != NULL;i++, pRb = pRb->rbnext) {
                    if (pRb->restype < 1010) {
                            rt = RTSTR;
                    } else if (pRb->restype < 1040) {
                            rt = RT3DPOINT;
                    } else if (pRb->restype < 1060) {
                            rt = RTREAL;
                    } else if (pRb->restype < 1071) {
                            rt = RTSHORT;
                    } else if (pRb->restype == 1071) {
                            rt = RTLONG;
                    } else {
                            rt = pRb->restype;
                    }

                    switch (rt) {
                    case RTSHORT:
                            if (pRb->restype == RTSHORT) {
                                    acutPrintf(
                                            "RTSHORT : %d/n", pRb->resval.rint);
                            } else {
                                    acutPrintf("(%d . %d)/n", pRb->restype,
                                            pRb->resval.rint);
                            };
                            break;

                    case RTREAL:
                            if (pRb->restype == RTREAL) {
                                    acutPrintf("RTREAL : %0.3f/n",
                                            pRb->resval.rreal);
                            } else {
                                    acutPrintf("(%d . %0.3f)/n", pRb->restype,
                                            pRb->resval.rreal);
                            };
                            break;

                    case RTSTR:
                            if (pRb->restype == RTSTR) {
                                    acutPrintf("RTSTR : %s/n",
                                            pRb->resval.rstring);
                            } else {
                                    acutPrintf("(%d . /"%s/")/n", pRb->restype,
                                            pRb->resval.rstring);
                            };
                            break;

                    case RT3DPOINT:
                            if (pRb->restype == RT3DPOINT) {
                                    acutPrintf(
                                            "RT3DPOINT : %0.3f, %0.3f, %0.3f/n",
                                            pRb->resval.rpoint[X],
                                            pRb->resval.rpoint[Y],
                                            pRb->resval.rpoint[Z]);
                            } else {
                                    acutPrintf("(%d %0.3f %0.3f %0.3f)/n",
                                            pRb->restype,
                                            pRb->resval.rpoint[X],
                                            pRb->resval.rpoint[Y],
                                            pRb->resval.rpoint[Z]);
                            }
                            break;

                    case RTLONG:
                            acutPrintf("RTLONG : %dl/n", pRb->resval.rlong);
                            break;
                    }

                    if ((i == 23) && (pRb->rbnext != NULL)) {
                            i = 0;
                            acedGetString(0,
                                    "Press <ENTER> to continue...", buf);
                    }
            }
    }

    //选择并打开对象
    AcDbObject*
    selectObject(AcDb::OpenMode openMode)
    {
            // 允许用户拾取对象或者输入对象的句柄值
            int ss;
            ads_name en;
            ads_point pt;
            acedInitGet(RSG_OTHER, "Handle _Handle");        //设置关键字
            ss = acedEntSel("/n选择对象或者输入用户的句柄(H)", en, pt);

            char handleStr[132];
            AcDbObjectId eId;
            switch (ss) {
            case RTNORM:   // 选择对象模式
                    break;
            case RTKWORD:        //句柄模式
                    if ((acedGetString(Adesk::kFalse,
                            "输入用效的对象句柄: ",
                            handleStr) == RTNORM)
                            && (acdbHandEnt(handleStr, en) == RTNORM))
                    {
                            break;
                    }
            default:
                    acutPrintf("应用选择对象,返回 Code==%d/n",ss);
                    return NULL;
            }

            // 通过acdbGetObjectId由ads_name转折炙ObjectId
            Acad::ErrorStatus retStat;
            retStat = acdbGetObjectId(eId, en);
            if (retStat != Acad::eOk) {
                    acutPrintf("/nacdbGetObjectId failed");
                    acutPrintf("/nen==(%lx,%lx), retStat==%d/n",
                            en[0], en[1], eId);
                    return NULL;
            }

            AcDbObject* obj;
            // 打开对象
            if ((retStat = acdbOpenObject(obj, eId, openMode))
                    != Acad::eOk)
            {
                    acutPrintf("打开对象失败: ename:(%lx,%lx),"
                            " mode:%d retStat:%d", en[0], en[1],
                            openMode, retStat);
                    return NULL;
            }
            return obj;
    }

    其相关的例子在ObjetARX2006包下的smaples/database/xdata_dg,我在这里对例子的重点内容进行讲解下,如果大家有什么问题可以一起探讨.

     

     

     

     

    扩展数据
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-7-1 05:25 , Processed in 0.058527 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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