找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 989|回复: 8

[ARX程序]:如何把从一个DWG文件读入的实体平移到指定地方去

[复制链接]
发表于 2003-9-3 16:51:37 | 显示全部楼层 |阅读模式

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

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

×
ARX打开读入一个DWG文件,如何把DWG里头所有的实体整体平移到指定的点去?并取得这个文件(这个dwg文件是二维的)的最左下脚的坐标值和最右上脚的坐标值(其实这个文件是一个图纸模板,我想得到这图纸的大小,就是左下脚坐标和右上脚坐标)谢谢(是ARX程序)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-9-3 17:59:03 | 显示全部楼层
AcGeMatrix3d Mat;

....这里设置你的转换矩阵Mat;
....
AcDbDatabase *pNewDb =new AcDbDatabase(Adesk::kFalse);
es=pNewDb->readDwgFile(sFileName , _SH_DENYNO,false);
if (es!=Acad::eOk)
{
    acutPrintf("\nThe file %s cannot be opend",sFileName);
    return;
}
AcDbDatabase *pDb;
pDb =acdbHostApplicationServices ()->workingDatabase () ;
pDb->insert(AcGeMatrix3d::kIdentity, pNewDb );
........
........
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-9-3 19:21:11 | 显示全部楼层
Acad::ErrorStatus moveEntries(double x,double y,double z)
{       
        AcGeMatrix3d Mat;
        Mat(0,0)=1;
        Mat(0,1)=0;
        Mat(0,2)=0;
        Mat(0,3)=0;
        Mat(1,0)=0;
        Mat(1,1)=1;
        Mat(1,2)=0;
        Mat(1,3)=0;
        Mat(2,0)=0;
        Mat(2,1)=0;
        Mat(2,2)=1;
        Mat(2,3)=0;
        Mat(3,0)=x;
        Mat(3,1)=y;
        Mat(3,2)=z;
        Mat(3,3)=1;
        AcDbDatabase *pNewDb =new AcDbDatabase(Adesk::kFalse);
        Acad::ErrorStatus es=pNewDb->readDwgFile(DWGFILEDIRECTORY , _SH_DENYNO,false);
        if (es!=Acad::eOk)
        {
                acutPrintf("\nThe file %s cannot be opend",DWGFILEDIRECTORY);
                delete pNewDb;
                return es;
        }
        AcDbDatabase *pDb;
        pDb =acdbHostApplicationServices ()->workingDatabase () ;
        pDb->insert(Mat, pNewDb );
        delete pDb;
        delete pNewDb;
        return es;
}

//就是平移啊,怎么提示出错,是读内存错,可是我跟踪的时候没有错的。上面错在哪里?文件是存在的。路径也是对了。
//还有,我怎么得到图中的最大最小坐标呢(最大是最右上脚的坐标,最小是左小角的坐标)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-9-3 19:32:23 | 显示全部楼层
最初由 lidexiang 发布
[B]Acad::ErrorStatus moveEntries(double x,double y,double z)
{       
        AcGeMatrix3d Mat;
        Mat(0,0)=1;
        Mat(0,1)=0;
        Mat(0,2)=0;
        Mat(0,3)=0;
        Mat(1,0)=0;
        Mat(1,1)=1;
        Mat(1,2)=0;
        Mat(1,3)=0;
        Mat(... [/B]


你怎么能删除当前数据库呢?

delete pDb

另外,构造平移矩阵不用一个元素一个元素的赋值,AcGeMatrix3d 提供了方法的。

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

使用道具 举报

发表于 2003-9-3 21:35:59 | 显示全部楼层

Re: [ARX程序]:如何把从一个DWG文件读入的实体平移到指定地方去

最初由 lidexiang 发布
[B]ARX打开读入一个DWG文件,如何把DWG里头所有的实体整体平移到指定的点去?并取得这个文件(这个dwg文件是二维的)的最左下脚的坐标值和最右上脚的坐标值(其实这个文件是一个图纸模板,我想得到这图纸的大小,就是左... [/B]


如果仅仅是为了获取图纸的大小,很简单的
AcDbDatabase::extmax()
AcDbDatabase::extmin()
就可以得到

  1. AcDbDatabase *pNewDb =new AcDbDatabase(Adesk::kFalse);
  2. Acad::ErrorStatus es=pNewDb->readDwgFile(DWGFILEDIRECTORY , _SH_DENYNO,false);
  3. if (es == Acad::eOk)
  4. {
  5.     AcGePoint3d ptMax,ptMin;
  6.     ptMax = pNewDB->extmax();
  7.     ptMin = pNewDB->extmin();
  8. }
  9. //...
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-9-3 21:57:16 | 显示全部楼层
报告园长,其实我还不知道怎么做,所以出了你提出来的错误。关于AcGeMatrix3d ,我看了帮助,但不多,还不怎么知道怎么用。当然transformBy也一样。还有喽罗 斑竹 ,非常感谢你们。我的目的就是ARX中把一张标准的单位图框读入并显示,而且还要把图框(读入的图也就只有一个图框,包括标题栏什么的)平移到指定点,图框平移的的基点是图框的中心。能不能讲具体一点?我也是比较着急,都晕了。
<<<还有,我想旋转坐标系,怎么做?比如我要旋转WCS,绕Z轴旋转一个角度,如何?也是很急
谢谢看完!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2006-2-11 01:28:48 | 显示全部楼层
3楼的代码中几个问题:
1、根据ARX开发文档:任何时候,当readDwgFile被调用成功后,系统的当前数据库会自动指向本次调用所返回的数据库。也就是说,代码后面获取的工作数据库就是readDwgFile产生的数据库。
2、把数据库向自身做插入操作,那无疑会失败。
3、最后面两条delete语句实际上在删除同一个数据库,而且是当前数据库,一定会导致CAD终止。

正确做法应为:
1、获取并保存当前数据库指针。
2、读外部文件产生数据库。
3、将2步产生的数据库插入到1步保存的数据库。
4、重新将1步保存的数据库设为当前数据库。
5、删除2步产生的数据库。

PHP代码表示为:
[PHP]
{
        ... ...
        AcDbDatabase *pSrcDb=acdbHostApplicationServices()->workingDatabase();//(1)
        AcDbDatabase *pNewDb;
        ... ...
        Acad::ErrorStatus es=pNewDb->readDwgFile(...);//(2)
        pSrcDb->insert(mat,pNewDb);//(3)
        acdbHostApplicationServices()->setWorkingDatabase(pSrcDb);//(4);
        delete pNewDb;//(5)
}
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 14:04 , Processed in 0.371300 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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