找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 599|回复: 10

[ARX程序]:急问:直线的分段和多线段的炸开

[复制链接]
发表于 2003-12-16 13:56:11 | 显示全部楼层 |阅读模式

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

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

×
我在论坛上查出,直线的分段用getPointAtParam(),但是我始终不得要领,能不能给个成功的例子
炸开polyline用explode(),但是我用它炸开后,却没有反应,
pEnt->explode(ents);  ents参数如何用,怎么将他炸后却没有开呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-12-16 15:21:11 | 显示全部楼层
AcDbVoidPtrArray entitySet;
pEnt->explode(entitySet);  //返回pEnt炸开后的实体数组,当然其类型是void*,使用时需要转换。

对于AcDbPolyline来说,dParam参数和其顶点是匹配的数据,在自定义实体中我们可以自定义其含义。
多数情况下我们主要用getPointAtDist(double dDist, AcGePoint3d &point)函数

输入参数 double dDist 是曲线上的点到起点的距离
输出参数 AcGePoint3d &point 距离到起点长度为dDist点的坐标
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-16 18:40:55 | 显示全部楼层
我将一条pline线用explode后,它并没有被炸开,为什么呢?如何取得炸开后的实体数组呢?

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2003-12-17 08:23:58 | 显示全部楼层
你用Explode炸开后,原实体是不变的,只是将新的实体放在数组中,然后你需要将数组中的每个实体添加到当前数据库中,并在必要的时候删除原实体.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-17 19:57:23 | 显示全部楼层
     AcDbObjectId entityId;
        AcDbPolyline *pEnt;//初始化指针
        AcDbVoidPtrArray ents;
        int k;
       
        int rc;
                               
        rc = acdbGetObjectId(entityId, entName);//
        if(rc != Acad::eOk)
        {
            acutPrintf("\n no entityId");
                return Adesk::kFalse;
                       
        }

        rc = acdbOpenObject(pEnt,entityId,AcDb::kForWrite);//
        if(rc != Acad::eOk)
        {
            acutPrintf("\n no open entity");
                return Adesk::kFalse;
        }

        pEnt->explode(ents);
        k = ents.length();
从k可以看出已经炸开了,但是如果将炸开的实体取出来呢?下面的程序如何写呢?也就是AcDbVoidPtrArray ents;的用法我不清楚,请给个例子看看

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

使用道具 举报

发表于 2003-12-17 23:50:56 | 显示全部楼层
AcDbVoidPtrArray 实际上是一个继承自AcArray的,
你就按照普通的数组来处理就可以:
我感觉是这样处理的,我没有用过的,不知道对不对!
你试试吧!!

  1.   [FONT=courier new]
  2.         AcDbVoidPtrArray ents;
  3.         AcDbEntity *pEnt;
  4.         for(int i=0; i < ents.length();i++)
  5.         {
  6.                 pEnt = ents.at(i);
  7.                 pBlkTableRec->appendAcDbEntity(lineId,pEnt);               
  8.         }
  9.        
  10.   [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-18 01:29:33 | 显示全部楼层
AcDbVoidPtrArray是void,所以会报错cannot convert from 'void *' to 'class AcDbEntity *'
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2003-12-18 09:59:02 | 显示全部楼层
AcDbVoidPtrArray ents;
        AcDbEntity *pEnt;
        for(int i=0; i < ents.length();i++)
        {
//                pEnt = ents.at(i);//家墙纸类型转换
           pEnt = (AcDbEntity*)ent.at(i);
                pBlkTableRec->appendAcDbEntity(lineId,pEnt);               
        }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-18 11:14:57 | 显示全部楼层
非常感谢各位的帮忙,这个问题终于解决了,解决方法就如stoneball 说的那样

那么如何将一条直线分段呢,就如divide的命令那样,有人说用getPointAtParam(),但是我还是做不出,看看下面的代码错在哪了
AcDbObjectId entityId;
        AcDbCurve *pEnt;//初始化指针
        double l = 3.0;
        AcGePoint3d pt;
        int rc;
                               
        rc = acdbGetObjectId(entityId, entName);//
        if(rc != Acad::eOk)
        {
            acutPrintf("\n no entityId");
                return Adesk::kFalse;                       
        }

        rc = acdbOpenObject(pEnt,entityId,AcDb::kForRead);//
        if(rc != Acad::eOk)
        {
            acutPrintf("\n no open entity");
                return Adesk::kFalse;
        }

        pEnt->getPointAtParam(l, pt);
        pEnt->close();

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2003-12-18 11:39:01 | 显示全部楼层
AcDbCurve的getDistAtPoint() 和getPointAtDist()结合使用就能解决.
做完后建议将代码贴出来,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-19 00:19:34 | 显示全部楼层
for(j=0; j<3; j++)
                        {
                            dist = distance*j/3.0;
                pEnt->getPointAtDist(dist, point);
                            pt2[X] = point.x;
                            pt2[Y] = point.y;
                            pt2[Z] = point.z;
                            pEnt->close();
                       
                        }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 10:48 , Processed in 0.328778 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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