找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 872|回复: 4

readDwgFile怎么读取不到文件呢?

[复制链接]
发表于 2005-1-11 14:00:27 | 显示全部楼层 |阅读模式

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

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

×
下面这么几行非常简单的代码,可是文件名怎么设置都报错说读取不到文件?
即使把文件存到autocad的系统目录中,或者当前目录中都是一样说读取不到。奇怪了。这是什么原因阿?
谢谢

AcDbObjectId insertDwgFile(char dwgName[],char blockName[],                                                      
                                                 bool purge,bool explode)                                         
  {                                                                                                               
          Acad::ErrorStatus error;                                                                                 
        AcDbDatabase extDb(Adesk::kFalse);                                                                        
                                                                                                                  
        error=extDb.readDwgFile(dwgName);                                                                        
        if(error!=Acad::eOk)                                                                                      
        {                                                                                                         
                CString msg;                                                                                      
                msg.Format(                                                                                       
                        "%s读取不到文件!%s",                              
                        dwgName,dwgName);                                                                        
                AfxMessageBox(msg);                                                                              
                return NULL;                                                                                      
        }                                                                                                         
        AcDbObjectId blockId;                                                                                    
        if(purge)                                                                                                
        {                                                                                                         
                AcDbDatabase *pTempDb;                                                                           
                  extDb.wblock(pTempDb);                                                                           
                if(explode)                                                                                       
                        acdbHostApplicationServices()->workingDatabase()->insert(AcGeMatrix3d::kIdentity,pTempDb);
                else                                                                                             
                        acdbHostApplicationServices()->workingDatabase()->insert(blockId,blockName,pTempDb);      
                delete pTempDb;                                                                                   
        }                                                                                                         
        else                                                                                                      
        {                                                                                                         
                if(explode)                                                                                       
                        acdbHostApplicationServices()->workingDatabase()->insert(AcGeMatrix3d::kIdentity,&extDb);
                else                                                                                             
                acdbHostApplicationServices()->workingDatabase()->insert(blockId,blockName,&extDb);               
}                                                                                                                 
                                                                                                                  
        return blockId;                                                                                          
}                                                                                                                 
void test()                                                                                                      
{                                                                                                                 
                                                                                                                  
        char dwgName[]="E:\\Program Files\\AutoCAD 2002\\Drawing1.dwg",blockName[]="myBlock";                     
        insertDwgFile(dwgName,blockName,false,true);                                                              
                                                                                                         
                                                                                                                  
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-1-11 22:46:25 | 显示全部楼层
试一下这样:
将AcDbDatabase extDb(Adesk::kFalse);改为:
AcDbDatabase *pExtDb=new AcDbDatabase(false,false);
......
从Windows系统的内存管理机制上来说这两种做法有着根本性的区别。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-1-18 11:00:50 | 显示全部楼层
void InsertBlk(LPCTSTR FilePath,LPCTSTR BlkName)
{
        AcDbObjectId blkId;
                AcDbDatabase *pdb = new AcDbDatabase(Adesk::kFalse);
                if (Acad::eOk !=pdb->readDwgFile(FilePath,_SH_DENYNO,false))
                {
                        acedAlert( "Error reading DWG!" );
                        return;
                }
                acdbHostApplicationServices()->workingDatabase()->insert(blkId,BlkName,pdb,false);
               
            
}
用我的,没问题!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-19 14:11:27 | 显示全部楼层

吓人

最初由 Hellow 发布
[B]试一下这样:
将AcDbDatabase extDb(Adesk::kFalse);改为:
AcDbDatabase *pExtDb=new AcDbDatabase(false,false);
......
从Windows系统的内存管理机制上来说这两种做法有着根本性的区别。 [/B]


阿。除了用new生成的对象要close外,还有什么区别?怎么说和windowz。。。。?
请问:
AcDbLine tmpline(pt1,pt2);
然后tmpline加入到数据库中,就不用close了吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-1-19 23:05:46 | 显示全部楼层
No,no.no...:
1、以局部变量形式直接定义类变量,则类变量在超出作用域时将自动失效(析构符被自动调用),而且此类变量是创建在进程的堆中;而new出来的类变量创建在系统的内存中,只要你不调用delete显式的删除它,那他就一直存在(不会自动调用析构符),直至进程结束。
2、至于是否调用close跟这方面没关系,对于数据库驻留对象,如果打开了它,就必须调用close关闭它;对于非数据库驻留对象,没必要调用close。
3、AcDbLine tmpline(pt1,pt2);
然后tmpline加入到数据库中,就不用close了吧。
用这种方式创建的实体不能加到数据库中,会出问题的!(我记得文档上有说明)不相信可以试一试,因为从本质上说,CAD无法控制这样的实体,也就是CAD无法控制实体所占用内存片断的存取/撤销等。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 09:35 , Processed in 0.323047 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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