找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1334|回复: 16

[求助]:如何从AcDbEntity 的实体 读出其AcDb3dPoint类端点坐标??

[复制链接]
发表于 2005-5-28 21:46:07 | 显示全部楼层 |阅读模式

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

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

×
如何从AcDbEntity 的实体 读出其AcDb3dPoint类端点坐标??
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-5-30 07:27:18 | 显示全部楼层
你首先用AcDbEntity::cast()函数判断其属于那种实体,然后就可以相应实体的接口了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-30 11:41:49 | 显示全部楼层
2楼的说法,判断属于那种实体,是不是要关闭该实体,然后用相应实体类型指针打开后,取坐标?谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-30 13:42:18 | 显示全部楼层
根据2楼的说法我写了如下代码

//////////////////读出所有的对象//////////////////////////////
bool getAllEntity(AcDbObjectIdArray& IdArr)
{
        Acad::ErrorStatus es=Acad::eOk;
                ads_name ssname;
        ads_name fname;
        if (acdbEntNext(NULL, fname) != RTNORM)
        {
                acdbFail("No entities in drawing\n");
                return (0);
        }
        if (acedSSGet(NULL,NULL,NULL,NULL,ssname) !=RTNORM)
        {
                ads_alert("acedSSGet失败");
                return (0);
        }
        long ilast;

        if (acedSSLength(ssname, &ilast) != RTNORM)
    {
                acedSSFree(ssname);
                return (0);
        }
   
        AcDbObjectId Idtemp;
        ads_name ntemp;
        for (long i=0;i<ilast;i++)
        {       
                ads_alert("1");
                acedSSName(ntemp,i,ssname);
                acdbGetObjectId(Idtemp,ntemp);
                IdArr.append(Idtemp);
        }
        acedSSFree(ssname);

//        acutPrintf("eend");
        return (1);
}
////////////////////////// 节点的搜寻////////////////


//////////////////////////////////读点///////////////////////////
bool getAllPoints(AcDbObjectIdArray& IdArr, AcGePoint3dArray& pntArr)
{       

        AcDbObjectId objId;
        for (int i=0 ; i<IdArr.length();i++)
        {
                AcDbObject *SelEnt;
                objId=IdArr.at(i);
       
                acdbOpenObject(SelEnt, objId,AcDb::kForRead);
               
                if (SelEnt->isKindOf(AcDbLine::desc()))
                {       
                        ads_alert("line");
                        SelEnt->close();
                        pLine(objId,pntArr);
                        break;
                }
                else               
                if (SelEnt->isKindOf(AcDbPolyline::desc()))
                {       
                        ads_alert("poly");
                        SelEnt->close();
                        pPolyLine(objId,pntArr);
                        break;
                }
                else               
                if (SelEnt->isKindOf(AcDbCurve::desc()))
                {       
                        ads_alert("curve");
                        SelEnt->close();
                        collectVertices(objId,pntArr);
                        break;
                }
                else
                {       
                        ads_alert("不能识别的类型进入");
                        ads_fail("不能识别的类型");
                        SelEnt->close();
                        return (0);
                }
        }
        return (1);

}







//////////////////////////椭圆,半圆,曲线等//////////////////////
void collectVertices( AcDbObjectId& ellipseId, AcGePoint3dArray& pts)
{
        AcDbCurve *pEllipse;
    acdbOpenObject(pEllipse, ellipseId, AcDb::kForRead);
    if (pEllipse->isClosed())
        {
                pEllipse->close();
                return;
        }
        AcGePoint3d temp;
        pEllipse->getEndPoint(temp);
        pts.append(temp);
        pEllipse->getStartPoint(temp);
        pts.append(temp);
    pEllipse->close();
        //AcDbObjectId newCurveId;
    //addToModelSpace(newCurveId, pProjectedCurve);

}
///////////////////////多义线/////////////////////
void pPolyLine( AcDbObjectId plineId, AcGePoint3dArray& pts)
{
       
        AcDb2dPolyline *pPline;
        acdbOpenObject (pPline,plineId,AcDb::kForRead);
        if (pPline->isClosed())
        {
                pPline->close();
                return;
        }
        AcDbObjectIterator *pVertIter=pPline->vertexIterator();
        pPline->close();
        AcDb2dVertex *pVertex;
        AcGePoint3d location;
        AcDbObjectId vertexObjId;
        for (int vertexNumber = 0;!pVertIter->done();
        vertexNumber++,pVertIter->step())
        {
                vertexObjId = pVertIter->objectId();
                acdbOpenObject (pVertex,vertexObjId,AcDb::kForRead);
                location =  pVertex->position();
                pVertex->close();
                pts.append(location);
        }
        delete pVertIter;
}

//////////////////////////////直线//////////////////
void pLine( AcDbObjectId LineId, AcGePoint3dArray& pts)
{
        AcDbLine *pLine;
        acdbOpenObject (pLine,LineId,AcDb::kForRead);
        AcGePoint3d location = pLine->startPoint() ;
        pts.append(location);
        location = pLine->endPoint() ;
        pts.append(location);
        pLine->close();
       
}


但是死活 在读点的acdbOpenObject(SelEnt, objId,AcDb::kForRead);之后出错
信息是什么 未处理异常 C0000005((ACCESS Violation Reading 0xcccccccc),
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-30 16:42:52 | 显示全部楼层
1、请检查此函数调用acedSSName(ssname,i,ntemp);
2、acdbOpenObject(SelEnt, objid, AcDb::kForRead);打开实体后,请对SelEnt指针进行NULL判断。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-30 22:07:10 | 显示全部楼层
xysyr  根据你说的我已经检查了
但是acedSSName(ssname,i,ntemp);应该没有错,
前面一个for  没有显示完全
        for  (long i=0;i  <  ilast;i++)
还有加上判断也还是出错
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-30 22:40:51 | 显示全部楼层
acedSSName(ntemp,i,ssname);
这个函数的第一个参数和第三个参数你用反了。你看看你的源代码。
判断null是防止程序出错的好习惯(其它位置你有判断的,也有没判断的)。
加上判断还是出错,是因为上一个(acedSSName)取id的函数参数用反了,取出的id值总为0。当打开实体的时候,当然就一直出错了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2005-5-31 14:10:33 | 显示全部楼层
啊~~疏忽了,我这边是看着AutoCAD2002自带的英文帮助写的,没注意到那点~~
不过还是出错,弹出  isValid(i) 的错误,这个怎么解决??
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-5-31 23:06:01 | 显示全部楼层
最初由 unfogy 发布
[B]啊~~疏忽了,我这边是看着AutoCAD2002自带的英文帮助写的,没注意到那点~~
不过还是出错,弹出  isValid(i) 的错误,这个怎么解决?? [/B]


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

使用道具 举报

 楼主| 发表于 2005-5-31 23:10:46 | 显示全部楼层
我检查了下很有可能是在取点的时候,程序进入循环,成功运行了1次后在第2次循环的时候可能在objId=IdArr.at(i);这句出错,而且我如果只选一个实体是不会出错的.但是 我不知道到底是什么地方出了问题
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-1 12:13:03 | 显示全部楼层
你先看看每个实体只选择一次,会不会出现这个问题。要还存在,你把工程打包发到我邮箱吧,我帮你看看。上面你贴的代码在我这里执行是没有问题的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-2 19:03:09 | 显示全部楼层
在我这里 选择单个实体是不会出错的,你的邮箱多少??我门7号要毕业答辩了~~~紧急啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 16:02 , Processed in 0.211853 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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