找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 893|回复: 6

[ARX函数]:arx中AcDbPolylin中的BUG!!!!

[复制链接]
发表于 2004-3-30 16:39:23 | 显示全部楼层 |阅读模式

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

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

×
我在使用过程中发现两个,但是不能确认,大家也测试一下吧

1:getSubentPathsAtGsMarker不能正常工作。大家可以使用highlight来测试;
2:getOffsetCurves在多以线的定点的横坐标超过10000的时候不能正常工作

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-30 19:36:10 | 显示全部楼层

Re: [ARX函数]:arx中AcDbPolylin中的BUG!!!!

最初由 warmrain 发布
[B]我在使用过程中发现两个,但是不能确认,大家也测试一下吧

1:getSubentPathsAtGsMarker不能正常工作。大家可以使用highlight来测试;
2:getOffsetCurves在多以线的定点的横坐标超过10000的时候不能正常工作

... [/B]


第一个问题:

不应该说是ARX的BUG,准确的说是ADESK的疏忽,他们实现了getSubentPathsAtGsMarker,但是忘了提供getGsMarkersAtSubentPath方法。这个他们也承认了,只是不知道为什么到2004还没有改正。

应该提供的getGsMarkersAtSubentPath方法应该是:
[program=getGsMarkersAtSubentPath]
ErrorStatus AcDbPolyline::getGsMarkersAtSubentPath(
   const AcDbFullSubentPath& subPath,
   AcDbIntArray& gsMarkers) const
{
   assertReadEnabled();
   gsMarkers.append( subPath.subentId().index() );
   return Acad::eOk;
}
[/program]

不过,你要想实现亮显LWPOLYLINE的一个“段”,可以自己从AcDbPolyline类派生自己的类,在你的类里面实现上面的方法。

在亮显前,先从你的派生类实例一个对象,然后用AcDbPolyline的copyFrom 方法,把要亮显的POLYLINE的属性拷贝到你新实例的对象上,然后用handOverTo() 方法,转换两个对象,这样就用你新实例的派生类对象替代了原来的POLYLINE,变成了数据库实体,你就可以亮显它下的子段了。

亮显后,你在用handOverTo() 方法,把原来的POLYLINE恢复回数据库里面。

你的派生类不用去实现 ACRX_DEFINE..._DECLARE.. 宏, 也不需要用::rxInit()注册你的派生类,所以你的派生类不应该叫“自定义实体”。 因为你要做的仅仅是用copyFrom()在两个完全相同的对象上拷贝,因此可以省略上面那些注册过程。 ACAD认为你的派生类的polyline就和正常的Polyline一样。

下面给你一个派生类,里面实现了ADESK忽略的AcDbPolyline::getGsMarkersAtSubentPath实现。用这个派生类,你就可以亮显子段了。

[program=实现AcDbPolyline::getGsMarkersAtSubentPath 的类定义和实现]class MyPolyline : public AcDbPolyline
{
public:
  virtual Acad::ErrorStatus getGsMarkersAtSubentPath(
      const AcDbFullSubentPath& subPath,
      AcDbIntArray& gsMarkers) const;
};

Acad::ErrorStatus
MyPolyline::getGsMarkersAtSubentPath(
    const AcDbFullSubentPath& subPath,
    AcDbIntArray& gsMarkers) const
{
    assertReadEnabled();
    switch (subPath.subentId().type()) {
    case AcDb::kEdgeSubentType:
        gsMarkers.append(subPath.subentId().index());
        break;
    default:
        return Acad::eWrongSubentityType;
    }
    return Acad::eOk;
}
[/program]


第二个问题,不知道你的图中怎么会由那么多顶点的PL :),你试试正常用ACAD的OFFSET命令去做,是否出现问题? 出现的问题是什么现象?因为不是所有的PL都可以OFFSET的,往内OFFSET往往有可能实现不了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-31 10:30:19 | 显示全部楼层
第二个问题是这样的:用offset命令不会出问题,是在程序中连续使用getOffsetCurves函数时出问题。多以线定点不必多,4各就可以验证了,而且是用命令可以offset的,但是用程序就出问题,现象是原来的多以线(原来的每个定点的横坐标大于10000)被移动到了原点附近。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-31 10:59:43 | 显示全部楼层
最初由 warmrain 发布
[B]第二个问题是这样的:用offset命令不会出问题,是在程序中连续使用getOffsetCurves函数时出问题。多以线定点不必多,4各就可以验证了,而且是用命令可以offset的,但是用程序就出问题,现象是原来的多以线(原来的每... [/B]


如果命令OFFSET没有问题,那么就不会是ARX的问题,因为ACAD的OFFSET命令就是用AcDbCurve::getOffsetCurves(..)实现的。

应该你程序里面的问题吧,是每个POLYLINE都有问题吗?是否在UCS下面?等等。可能某些情况你没有考虑到。

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

使用道具 举报

 楼主| 发表于 2004-3-31 15:29:28 | 显示全部楼层
大家看看这段程序,然后按照一下步骤作一下,看看结果是什么。
1:在阿AUTOCAD中画一条多义线,最好是封闭的凸多边形,尺寸大一点;
2:把它移动,是它的最左边的定点的横坐标大于10000(一万);
3:运行下面程序,是程序中的pl指向该多以线,看运行结果。
///////////////
我的运行环境是2004,结果是偏移得到的第一条是正确的,偏移得到的另外两条和原来的
多以线都被移动到了原点附近。

大家看看你们的结果跟我的一样不一样
[program]/////////////

AcDbEntity* ent=NULL;
ent=selectEntity("\nPlease select a Polyline:",AcDb::kForWrite); //选择并打开一实体
if(ent==NULL)
return;
AcDbPolyline* pl=NULL;
pl=AcDbPolyline::cast(ent);
if(pl==NULL)
{
    ent->close();
    acutPrintf("\npl NUll");
    return;
}

AcDbVoidPtrArray vs02,vd04,vd03;
AcDbPolyline* pls02=NULL;
AcDbPolyline* pld04=NULL;
AcDbPolyline* pld03=NULL;
pl->getOffsetCurves(30,vd04);
pl->getOffsetCurves(20,vd03);
pl->getOffsetCurves(10,vs02);
append((AcDbEntity*)vd03.first());//将实体加入当前数据库
append((AcDbEntity*)vd04.first());
append((AcDbEntity*)vs02.first());
pl->close();
[/program]

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

使用道具 举报

发表于 2004-3-31 18:28:39 | 显示全部楼层
你的程序错误太多了。
vs02,vd04,vd03要释放内存。
append的AcDbEntity要close();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-4-1 08:21:11 | 显示全部楼层
拜托,怎么可能不释放不用的内存呢?这只是程序段,不完整的,只是表明大概的思路。全贴上太长了,源程序还要进行处理其他的动作,代码比较分散,也无法全贴。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 14:32 , Processed in 0.185178 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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