找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 949|回复: 14

[ARX程序]:用insertLoopAt加入新边界不成功

[复制链接]
发表于 2002-11-19 23:10:06 | 显示全部楼层 |阅读模式

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

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

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-20 00:14:36 | 显示全部楼层

Re: [ARX程序]:用insertLoopAt加入新边界不成功

最初由 qq12345 发布
[B]用insertLoopAt向已有的Hatch加入新边界不成功,谁能贴出具体的例子? [/B]


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

使用道具 举报

 楼主| 发表于 2002-11-20 01:13:17 | 显示全部楼层
下面是用来测试的代码,
生成四条line,并在其内,生成Hatch,
目的是想在已生成的Hatch中挖洞。
在生成hatch时,定义二边界的方法可实现挖洞效果,
但为什么在已有的Hatch加入新内边界会不成功(但以以下方式加入园
以成功   //pEnt->insertLoopAt(0,AcDbHatch::kExternal,ArrayId2);


  1. [FONT=courier new]
  2. int change_pat()
  3. {
  4. .......
  5. ..

  6.    for(int i=0;i<5;i++)
  7.    {
  8.            pt2d[i].set(xx1[i],yy1[i]);
  9.            pt_bound[i].set(xx[i],yy[i],0.0);
  10.            pt2dBulges[i]=0.0;
  11.    }
  12.    for(i=0;i<4;i++)
  13.    {
  14.      pline=new AcDbLine();
  15.          pline->setStartPoint(pt_bound[i]);
  16.          pline->setEndPoint(pt_bound[i+1]);
  17.      LineId=AddEntityToDbs(pline);
  18.          ArrayId.append(LineId);
  19.    }
  20.    AcGeVector3d normal(0.0,0.0,1.0);
  21.    AcDbCircle *pCircle=new AcDbCircle(pt4,normal,10);
  22.    CircleId=AddEntityToDbs(pCircle);
  23.     ArrayId2.append(CircleId);
  24.    AcDbHatch *pHatch=new AcDbHatch();

  25.    pHatch->setNormal(normal);
  26.    pHatch->setElevation(0.0);
  27.    pHatch->setAssociative(Adesk::kTrue);
  28.    pHatch->setPatternScale(1);
  29.    pHatch->setPattern(AcDbHatch::kUserDefined,"gp100");
  30.    pHatch->setHatchStyle(AcDbHatch::kNormal);
  31.    pHatch->appendLoop(AcDbHatch::kExternal,ArrayId);
  32.    //pHatch->appendLoop(AcDbHatch::kDefault,pt2d,pt2dBulges);
  33.    //pHatch->appendLoop(AcDbHatch::kExternal,ArrayId2);
  34.    pHatch->evaluateHatch();
  35.    AddEntityToDbs(pHatch);
  36.    ads_name enHatch;
  37.    if(RTNORM!=ads_entlast(enHatch)) return 1;
  38.    AcDbObjectId eid;
  39.    acdbGetObjectId(eid,enHatch);
  40.    AcDbHatch *pEnt;
  41.    acdbOpenObject(pEnt,eid,AcDb::kForWrite);
  42.    //pEnt->insertLoopAt(0,AcDbHatch::kExternal,ArrayId2);
  43.    pEnt->insertLoopAt(1,AcDbHatch::kDefault,pt2d,pt2dBulges);
  44.    pEnt->close();
  45.    return 1;
  46. }
  47. AcDbObjectId AddEntityToDbs(AcDbEntity *pEnt)
  48. {
  49.         AcDbBlockTable *p_blk_tbl;
  50.         acdbCurDwg()->getBlockTable(p_blk_tbl,AcDb::kForRead);
  51.         AcDbBlockTableRecord *p_rec;
  52.         p_blk_tbl->getAt(ACDB_MODEL_SPACE,p_rec,AcDb::kForWrite);
  53.         AcDbObjectId entId;
  54.         p_rec->appendAcDbEntity(entId,pEnt);
  55.         p_blk_tbl->close();
  56.         p_rec->close();
  57.         pEnt->close();
  58.         return entId;
  59. }[/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-20 01:43:19 | 显示全部楼层
最初由 qq12345 发布
[B]下面是用来测试的代码,
生成四条line,并在其内,生成Hatch,
目的是想在已生成的Hatch中挖洞。
在生成hatch时,定义二边界的方法可实现挖洞效果,
但为什么在已有的Hatch加入新内边界会不成功(但以以下方式加入... [/B]


看你说的有些胡涂了,上面代码到底是那个地方没有成功?

添加环或者其他编辑操作后,必须调用:AcDbHatch::evaluateHatch 对HATCH重新计算后,才能正确更新HATCH的显示。

你先试试,把结果告诉大家。


  1. [FONT=courier new]
  2. AcDbHatch::evaluateHatch Function Acad::ErrorStatus

  3. evaluateHatch(

  4. bool bUnderestimateNumLines = false);

  5. bUnderestimateNumLines If true, underestimates the count before deciding to abort.
  6. That is, if AcDbHatch::evaluateHatch(true) is used, the function will abort if the count is in excess of 100,000.

  7. This function evaluates the hatch lines or solid fill for the hatch entity using the specified hatch pattern.
  8. For regular hatch patterns, except for solid, this function performs intersection calculations between
  9. pattern definition lines and hatch boundary curves to form hatch lines. For a solid fill hatch pattern,
  10. this function performs triangulation of the hatch area and fills in the triangular meshes with the given color.

  11. This function returns Acad::eOk when successful. Returns Acad::eHatchTooDense
  12. if the number of hatch lines is very high (above 100,000). Otherwise, it returns Acad::eInvalidInput.

  13. Note Be sure to call setPattern() before using this method in order to update the display.

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

使用道具 举报

 楼主| 发表于 2002-11-20 08:50:39 | 显示全部楼层
pEnt->insertLoopAt(1,AcDbHatch::kDefault,pt2d,pt2dBulges);
即在已有的Hatch内加入矩形边界不成功,但用下语句加入园边界成功,
(//pEnt->insertLoopAt(0,AcDbHatch::kExternal,ArrayId2);)
还有加入时,loopindex是如何取值的?(即此处的1是否正确)
另:在此句后加入pEnt->evaluateHatch()同样不成功
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-20 09:17:37 | 显示全部楼层
最初由 qq12345 发布
[B]pEnt->insertLoopAt(1,AcDbHatch::kDefault,pt2d,pt2dBulges);
即在已有的Hatch内加入矩形边界不成功,但用下语句加入园边界成功,
(//pEnt->insertLoopAt(0,AcDbHatch::kExternal,ArrayId2);)
还有加入时,loopi... [/B]


你应该先用 AcDbHatch::numLoops() 得到当前HATCH的最大环数,然后加1,作为再插入环的INDEX。这样能保证INDEX正确。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-20 09:35:40 | 显示全部楼层
最初由 qq12345 发布
[B]那这里loopindex为1,应该是正确的. [/B]


你是说,同样的位置,用圆可以插入,用矩形就出错?

为什么圆的索引你用:

  1. (//pEnt->insertLoopAt(0,AcDbHatch::kExternal,ArrayId2);)
复制代码


的0,而矩形你用的1?

你测试下insertLoopAt的返回码,看看是什么?

再,你别用几何实体,先把矩形POST到数据库,然后用ID数组做参数调用insertLoopAt方法,试试。

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

使用道具 举报

 楼主| 发表于 2002-11-20 10:00:23 | 显示全部楼层 |阅读模式

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

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

×
按你的说法,先生成矩形,post至数据库,然后用Id数组做参数调用insertLoopAt
成功,想来也是,因为这个园正是这样加上去的。
现在的问题是:用Id数组做参数可成功加入
//pEnt->insertLoopAt(1,cDbHatch::kExternal,ArrayId2);----成功
而//pEnt->insertLoopAt(0,AcDbHatch::kDefault,pt2d,pt2dBulges);---不成功
令人不解的是,上面这条语句在已有的Hatch中加入虽不成功,
但如果放入至hatch加入数据库之前却成功(代码中注释位置)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-20 10:05:42 | 显示全部楼层
最初由 qq12345 发布
[B]按你的说法,先生成矩形,post至数据库,然后用Id数组做参数调用insertLoopAt
成功,想来也是,因为这个园正是这样加上去的。
现在的问题是:用Id数组做参数可成功加入
//pEnt->insertLoopAt(1,cDbHatch::kExtern... [/B]


我就不明白你为什么这两个老放一起说


  1. //pEnt->insertLoopAt(1,cDbHatch::kExternal,ArrayId2);----成功
  2. 而//pEnt->insertLoopAt(0,AcDbHatch::kDefault,pt2d,pt2dBulges);---不成功
复制代码


为什么一个索引是0,一个索引是1?

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

使用道具 举报

 楼主| 发表于 2002-11-20 10:20:16 | 显示全部楼层
dd最初由xdsoft发布
//pEnt->insertLoopAt(1,cDbHatch::kExternal,ArrayId2);----成功
而//pEnt->insertLoopAt(0,AcDbHatch::kDefault,pt2d,pt2dBulges);---不成功






为什么一个索引是0,一个索引是1?

HATCH生成添加到数据库后,再往里面添加环,需要这个环是数据库存在的实体。

不好意思,在我的代码中index两个多的1(按你的说法,应该为2才对,先不管这一点)
你说的,在已有的HATCH中加环,这个环必须是存在的实体,虽能很好解释上面的现象,
但这是否意味加入环,只能用Id数组方法,而不能用另外两种方法,
查帮助,insertLoopAt共有三种调用方法。用第一种方法,可完全代替另外二种方法吗?
好象用Id数组只是用来插入外边界,而第二种用来插入内边界。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-20 10:28:27 | 显示全部楼层
最初由 qq12345 发布
[B]dd最初由xdsoft发布
//pEnt->insertLoopAt(1,cDbHatch::kExternal,ArrayId2);----成功
而//pEnt->insertLoopAt(0,AcDbHatch::kDefault,pt2d,pt2dBulges);---不成功






为什么一个索引是0,一个索引是1... [/B]


我的理解是这样的:

1、在没有生成HATCH实体到数据库的情况下,可以使用几种方法,在使用几何实体的时候,在添加数据库的时候,边界实体应该自动一起建立出来。不知道你成功的那个,是否边界也一起有了?(我想应该有)

2、在HATCH实体生成后,添加到数据库,应该只能用第一种方法,因为如果设置了关联,那么没有边界是不可能的,所以需要用已经在数据库中的实体做边界,用ID数组传(通过第一种)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-20 10:39:55 | 显示全部楼层
是,成功的边界也有。
但你说的,hatch生成后,只能用Id数组的方法加入环,好象不好理解,
因为appendloop有三种方法,而insertLoopAt同样也有三种方法,
如果,插入环只能用第一种方法,那另外二种方法如何使用?
你的xdapi中插入环,是否只使用用Id数组方法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-20 10:44:55 | 显示全部楼层
最初由 qq12345 发布
[B]是,成功的边界也有。
但你说的,hatch生成后,只能用Id数组的方法加入环,好象不好理解,
因为appendloop有三种方法,而insertLoopAt同样也有三种方法,
如果,插入环只能用第一种方法,那另外二种方法如何使用?.. [/B]


另外的方法是提供给你用成功的,在生成HATCH前啊。

是,我一直用先POST到数据库,然后用ID数组调用。

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

使用道具 举报

 楼主| 发表于 2002-11-20 10:57:53 | 显示全部楼层
你的意思是,虽然insertLoopAt虽然提供了三种方法,但若关联就只能用第一种方法,
另二种只能用于不关联hatch,这样就很好解释了。感谢提供帮助!也希望我们的
讨论对hatch感兴趣的朋友也有帮助。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 11:17 , Processed in 0.450798 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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