找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 931|回复: 7

[分享]:openDWG直读代码片段1(读xRecord)

[复制链接]
发表于 2005-4-25 13:53:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
vc6+atl+wtl+openDWG; 都是些测试代码,编译过,没问题。主要功能是找polyline,并读出其xRecord中的bin Data;



#define _WTL_USE_CSTRING
#define _ATL_USE_CSTRING_FLOAT
#include <atlbase.h>
CComModule _Module;

#include <atlapp.h>
#include <atlmisc.h>
#include <z9/ZCon2.h>




#include <ad2.h>
#include <odio.h>


class ZTest:public IZCon2Impl{
public:


        BOOL test1(){
                BOOL isOK = FALSE;

                AD_DB_HANDLE h;  
                ///初始openDWG;
                short err = 0;
                if(!adInitAd2("adInit.dat", 0, &err))return FALSE;
                adSetupDwgRead();
                h = adLoadFile("d:\\ssss.dwg", AD_PRELOAD_ALL, 1);
                /////----------------------------

                adStartBlockheaderGet(h);
                long blockHeaderCount = adNumBlockheaders(h);
                AD_TB table;
               
                for(long i=0; i<blockHeaderCount; i++){
                        adGetBlockheader(h, &table.blkh);
                        if(table.blkh.purgedflag)continue;
                       
                        CString recordName = table.blkh.name;
                        recordName.MakeLower();                       
                        if(recordName != "*model_space")continue;

                        ////get entity;
                        adStartEntityGet(table.blkh.entitylist);
                        long backNum;
                        AD_ENT_HDR entHdr;
                        AD_ENT     ent;
                        long validCount=0;
                       
                        do{
                                memset(&entHdr, 0, sizeof(entHdr));

                                printf("pline type: %i\r\n", adLwplineEnttype(h));
                               
                                backNum = adGetEntity(table.blkh.entitylist, &entHdr, &ent);                               
                                if(backNum){
                                        validCount++;
                                        printf("ent type: %i\r\n", entHdr.enttype);
                                        if(entHdr.enttype == 504 || entHdr.enttype == 503){
                                                ////读xrecord;
                                                AD_OBJ_HDR objH;
                        AD_OBJ obj;
                                                if(adSeekObject(h, entHdr.xdicobjhandle, &objH, &obj)){
                                                        printf("get xd oooooo\r\n");
                                                        printf("obj type: %i\r\n", objH.objtype);
                                                        if(objH.objtype == 32){
                                                          AD_DIC* pDic = (AD_DIC*)&obj;
                                                                printf("num dic item: %i\r\n", pDic->numdicitems);
                                                                if(pDic->numdicitems>0){
                                                                  AD_BLOB_CTRL* pBlob = adStartBlobRead(pDic->itemblob);
                                                                        for(long i=0; i<pDic->numdicitems; i++){
                                                                          AD_DICITEM dicItem;
                                                                                if(adReadDicItem(pBlob, &dicItem)){
                                                                                  printf("read dic item ooooooo, name: %s\r\n", dicItem.str);

                                                                                        AD_OBJ_HDR objH1;
                                                                                        AD_OBJ obj1;
                                                                                        if(adSeekObject(h, dicItem.itemhandle, &objH1, &obj1)){
                                                                                          if(objH1.objtype == adXrecordObjtype(h)){
                                                                                                  printf("dic item is xrecord\r\n");
                                                                                                        AD_XRECORD* pX = (AD_XRECORD*)&obj1;
                                                                                                        printf("xd databits: %i\r\n", pX->databits);
                                                                                                       
                                                                                                        AD_XD xd;
                                                                                                        AD_BLOB_CTRL* pBC = adStartBlobRead(pX->datablob);
                                                                                                        while(adReadXrecordItem(pBC, &xd)){
                                                                                                                printf("xd.xddxfnumber: %i\r\n", xd.xddxfnumber);
                                                                                                                if(xd.xddxfnumber == 310){//kDxfBinaryChunk=310,
                                                                                                                  printf("data: %s\r\n" ,xd.xddata.xdbindata);
                                                                                                                }
                                                                                                        }
                                                                                                        adEndBlobRead(pBC);
                                                                                                }
                                                                                        }
                                                                                }
                                                                        }
                                                                        adEndBlobRead(pBlob);
                                                                }
                                                        }
                                                }                                       


                                          AD_LWPLINE* pLine = (AD_LWPLINE*)&ent;
                                                ////读点数据;
                                                AD_BLOB_CTRL* pBC = adStartBlobRead(pLine->ldblob);
                                                for(long i=0; i<pLine->numpoints; i++){
                                                  double x, y, t;               
                                                        adReadBlobDouble(pBC, &x);
                                                        adReadBlobDouble(pBC, &y);
                                                        CString str;
                                                        str.Format("x:%0.3f, y:%0.3f\r\n", x, y);
                                                       

                                                        if(pLine->flag & AD_LWPLINE_HAS_BULGES)adReadBlobDouble(pBC, &t);
                                                        if(pLine->flag & AD_LWPLINE_HAS_WIDTHS)adReadBlobDouble(pBC, &t);
                                                }
                                                adEndBlobRead(pBC);
                                                ////读xrecord;

                                        }
                                       
                                }
                                ////printEnt(entHdr, ent);
                        }while(backNum == 1 && entHdr.enttype != AD_ENT_ENDBLK);
                }
                /////============================               
                ///关闭openDWG;
                adCloseFile(h);
                adCloseAd2();

                return isOK;
        }

  long __stdcall EventNotify_(const char* pName, void* p1, void* p2, void* p3){
    if(strcmp(pName, "test1") == 0){
                  test1();
                }
    return 0;
  }
};

__declspec(dllexport) BOOL __stdcall CreateIZCon2_(const char* pName, IZCon2** ppCon){
  if(ppCon){
    if(pName == NULL){
                  IZCon2* pCon = (IZCon2*)(new ZTest());
      if(pCon){
        *ppCon = pCon;
        return TRUE;
      }
                }else{
                }
  }
  return FALSE;
}

BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved){
        if(dwReason == DLL_PROCESS_ATTACH){
                _Module.Init(NULL, hInstance, NULL);
        }else if(dwReason == DLL_PROCESS_DETACH){
                _Module.Term();
  }
        return TRUE;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-4-25 16:58:24 | 显示全部楼层
有点象ARX
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-25 17:36:54 | 显示全部楼层
还有什么OpenDWG的经验,贡献一下啦,谢谢!楼主用的是1.0版的吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-25 20:51:23 | 显示全部楼层
别找急,我刚研究一天。好象是2.0.
明天上一个打开修改数据的例子
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-21 13:42:45 | 显示全部楼层
利害阿,太有用了,这下我不用自己写了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-21 15:09:53 | 显示全部楼层
我也要保存下来
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-21 15:48:11 | 显示全部楼层
支持,请楼主继续
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-21 19:54:03 | 显示全部楼层
这些都很简单,其实已经和arx很像了,有没一些和用户交互的代码,比如选择一个物体,jig的代码?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 05:07 , Processed in 0.193258 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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