找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 713|回复: 13

[求助]:如何在当前数据库中读入一DWG图,并且使他可见!急!拜求!

[复制链接]
发表于 2004-3-31 00:43:37 | 显示全部楼层 |阅读模式

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

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

×
我想使用原有的一张图,使用他的一些格式,在该图中加入实体,然后另存为别的图名,通过如下方法:
pDb=new AcDbDatabase(Adesk::kFalse);
pDb->readDwgFile("E:\\draw.dwg");
pDb->saveAs("e:\\jgt.dwg");
delete pDb;
pDb=NULL;
执行结果是确实打开了DRAW.DWG图形,但是我在CAD中看不到他,为什么?如何看到他?

因为我需要在原图中插入实体,需要知道插入点的位置,该位置由手工点击获得。只有看见了原有图形,才能确定出入位置,跪求!!!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-31 02:38:58 | 显示全部楼层

Re: [求助]:如何在当前数据库中读入一DWG图,并且使他可见!急!拜求!

最初由 boust 发布
[B]我想使用原有的一张图,使用他的一些格式,在该图中加入实体,然后另存为别的图名,通过如下方法:
pDb=new AcDbDatabase(Adesk::kFalse);
pDb->readDwgFile("E:\\draw.dwg");
pDb->saveAs("e:\\jgt.dwg");
dele... [/B]


pDb->readDwgFile("E:\\draw.dwg");
仅仅是把外部DWG图形读入到数据库对象pDb中,它并不是当前数据库,所以你看不到它,但是你可以对它操作,也可以遍历其中的实体,处理后,然后存盘,这些过程用户都看不到。

如果你希望把外部图形读入到当前数据库,显示,那么你应该用:
对当前数据库用AcDbDatabase::insert(...)插入进来,然后实例AcDbBlockReference对象引用这个块定义,添加到模型空间后才会显示。

[php]
    AcDbDatabase *pDwg =new AcDbDatabase (Adesk::kFalse) ;
    pDwg->readDwgFile ("E:\\draw.dwg") ;
    AcDbObjectId blockId ;
    Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->insert (blockId, "myfile", pDwg,
Adesk::kFalse) ;
    if ( es != Acad::eOk )
        acutPrintf ("\n插入块错误.") ;
    delete pDwg ;

//上面创建了“名字是myfile的块定义AcDbBlockTableRecord”,
//ObjectId是blockId,接着就可以实例AcDbBlockReference对象,
//创建INSERT实体了。

    AcDbBlockReference *pBlkRef =new AcDbBlockReference ;
    pBlkRef->setBlockTableRecord (blockId) ;

//---- 设置插入点,旋转角度,比例等等

    pBlkRef->setPosition (basePoint) ;
    pBlkRef->setRotation (0.0) ;
    .......................................

//....最后把上面的块索引对象添加到数据库里面

//获得模型空间块表记录

    AcDbBlockTable *pBlockTable ;
    acdbHostApplicationServices()->workingDatabase()->getBlockTable (pBlockTable, AcDb::kForRead) ;
    AcDbBlockTableRecord *pBlockTableRecord ;
    pBlockTable->getAt (ACDB_MODEL_SPACE, pBlockTableRecord,
AcDb::kForWrite) ;
    pBlockTable->close () ;

//----- 添加块引用pBlkRef实体到模型空间

    AcDbObjectId newEntId ;
    pBlockTableRecord->appendAcDbEntity (newEntId, pBlkRef) ;
    pBlockTableRecord->close () ;
    pBlkRef->close();
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2004-4-8 20:11:34 | 显示全部楼层
XD大人,我按照你的代码操作,我检验到当前数据库里确实生成了块引用,也可以插入该块,
但是我不能ZOOM  EXTENSION,只要操作ZOOM-E就退出,而且还是看不见该图形,
并且不能另存,假如操作保存,就退出,不知道什么原因,我试了几个小时,真的没有办法,我错在那里了,求告!!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-4-8 21:04:30 | 显示全部楼层
最初由 boust 发布
[B]XD大人,我按照你的代码操作,我检验到当前数据库里确实生成了块引用,也可以插入该块,
但是我不能ZOOM  EXTENSION,只要操作ZOOM-E就退出,而且还是看不见该图形,
并且不能另存,假如操作保存,就退出,不知道什么原因,我... [/B]


空口无凭啊,我怎么知道你哪里错了:),你把你的完整的代码毫无保留的都贴上来吧,让大家看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-4-8 21:47:55 | 显示全部楼层
[program]
AcDbDatabase *pDwg =new AcDbDatabase (Adesk::kFalse) ;
pDwg->readDwgFile("D:\\个人目录\\论文目录\\sluicedraw.dwg");

AcDbObjectId blockId ;
Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->insert(blockId, "sourcedraw", pDwg, Adesk::kFalse) ;
if ( es != Acad::eOk )                acutPrintf ("\n插入块错误.") ;
delete pDwg ;

AcDbBlockReference *pBlkRef =new AcDbBlockReference();
pBlkRef->setBlockTableRecord (blockId) ;
pBlkRef->setPosition(AcGePoint3d(0.0,0.0,0.0)) ;
pBlkRef->setRotation(0.0);

AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
  pBlockTable->close();

AcDbObjectId newEntId ;
pBlockTableRecord->appendAcDbEntity(newEntId, pBlkRef);
pBlockTableRecord->close();
[/program]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-4-8 22:08:13 | 显示全部楼层
最初由 boust 发布
[B]AcDbDatabase *pDwg =new AcDbDatabase (Adesk::kFalse) ;
pDwg->readDwgFile("D:\\个人目录\\论文目录\\sluicedraw.dwg");

AcDbObjectId blockId ;
Acad::ErrorStatus es = acdbHostApplicationServices()->wo... [/B]


你忘记关闭块索引对象了。

在最后加上:

pBlkRef->close();

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

使用道具 举报

 楼主| 发表于 2004-4-8 23:10:44 | 显示全部楼层
我原先以为块索引对象关闭用DELETE,结果总是出错,后来干脆不关了,结果出问题了,
现在可以了,真的谢谢你,XD-FORUM IS REALLY GOOD!!!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-4-8 23:16:42 | 显示全部楼层
最初由 boust 发布
[B]我原先以为块索引对象关闭用DELETE,结果总是出错,后来干脆不关了,结果出问题了,
现在可以了,真的谢谢你,XD-FORUM IS REALLY GOOD!!!!!!!!!!! [/B]



以后你记住,凡是你NEW生成的对象,添加到数据库后,或者OPEN打开的对象,在用后,代码最近的地方,你一定要关闭它。不要用 delete,因为添加到数据库后,ACAD就负责管理这个对象的内存了。

自己NEW生成的对象,如果用后不添加到数据库,那么最后一定要 delete 它。 避免“内存泄漏”。

总之,new 生成的对象不是 delete就是close,不要什么也不做,也不要乱做:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-11 10:43:51 | 显示全部楼层
解决这个问题用到智能指针技术,当对象构析时,自动分析对象是否加入到数据库,没有加入需要delete,否则关闭close。智能指针与异常错误处理也可以很好的配合使用,一旦出错在程序推出的过程中,不必一个个关闭对象分析各种处理路径。智能指针如果与事务配合使用,可以实现命令编辑的原子性,对象要么被完整编辑,要么没有任何的变动。大大提高代码的稳定性,和简化错误处理模型。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-4-11 14:21:31 | 显示全部楼层
说的好,我深刻理解了,但是智能指针如何使用,怎么定义,望告只,能举个例子吗,多谢谢了,这对我的帮助很大。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2006-2-11 00:54:43 | 显示全部楼层
从ARX2002开始,开发包中就带了一组智能指针(基于模板类),它们可用于所有的数据库对象(数据库驻留对象和非数据库驻留对象)。使用这个模板操作数据库,不必担心会忘记关闭实体。使用时很简单,只需将 dbobjptr.h 包含进来就可以用了。
例如,写方式打开当前数据库中的模型空间块表记录,然后创建一条直线并追加到数据库:
[PHP]
//包含智能指针头文件
#include <dbobjptr.h>
void addLine()
{
        //定义并打开块表记录
        AcDbBlockTableRecordPointer pBTR(ACDB_MODEL_SPACE,acdbCurDwg(),AcDb::kForWrite);
        if(pBTR.openStatus()!=Acad::eOk)
                return;

        //定义直线指针
        AcDbObjectPointer<AcDbLine> pLine;

        //创建直线对象
        if(pLine.create()!=Acad::eOk)
                return;

        //设置直线参数
        pLine->setStartPoint(AcGePoint3d(1,1,1));
        pLine->setEndPoint(AcGePoint3d(10,10,10));
        pLine->setDatabaseDefaults(acdbCurDwg());

        //追加到数据库
        //pPLine: 若失败,析构时会自动被删除,成功时会自动被关闭.
        //pBTR:   析构时会自动被关闭.
        pBTR->appendAcDbEntity(pLine.object());
}
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 04:26 , Processed in 0.575167 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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