找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1975|回复: 9

[求助]:各位,能帮我看看这个判断点是否在一面域上的程序吗?为什么不能成功?

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

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

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

×
程序思路:在lisp中用该函数,参数一为一面域句柄,参数二为一三维点,程序目的是以三维点作一半径为1的圆,获得该圆的面域,再求圆的面域和参数一面域的交集,若交集为圆的面域,则判断出点在面域内,返回T,否则返回nil,但为什么无论传入的点是否在面域内都返回nil呢?
[php]
int isinregion(struct resbuf *rb)
{
ads_name objName;
AcDbObjectId objId;
AcDbCircle *circle;
AcGeVector3d normal(0.0, 0.0, 1.0);
AcDbRegion *region;
AcDbRegion *circleregion;
AcDbRegion *newregion;
AcDbVoidPtrArray crarray;
AcDbVoidPtrArray rearray;
AcGePoint3d point;
struct resbuf *rb1;
if (rb == NULL)
{
return RTERROR;
}
if (rb->restype == RTSTR) {
if(acdbHandEnt(rb->resval.rstring, objName) != RTNORM)
{
acdbFail("No entity with that handle exists\n");
return RTERROR;
}
} else {
acdbFail(/*MSG3*/"Argument1 should be an Handle String.");
return RTERROR;
}
rb1 = rb->rbnext;
if (rb1 == NULL)
return RTERROR;
if (rb1->restype == RT3DPOINT) {
point.set(rb1->resval.rpoint[X], rb1->resval.rpoint[Y], rb1->resval.rpoint[Z]);
} else {
acdbFail(/*MSG3*/"Argument2 should be an 3DPOINT.");
return RTERROR;
}
if(acdbGetObjectId(objId, objName) == Acad::eInvalidAdsName)
{
acedRetNil();
return RTNORM;
}
if(acdbOpenObject(region, objId , AcDb::kForWrite) != Acad::eOk)
{
acedRetNil();
return RTNORM;
}
circle = new AcDbCircle(point, normal, 1);
crarray.append(circle);
if(AcDbRegion::createFromCurves(crarray,
rearray) == Acad::eInvalidInput)
{
acedAlert("InvalidInput.");
acedRetNil();
return RTNORM;
}
circleregion = AcDbRegion::cast((AcRxObject*)rearray[0]);
if(region->booleanOper(AcDb::kBoolIntersect, circleregion) == Acad::eOk)
{
acedRetT();
}
else
{
//acedAlert("NULL.");
acedRetNil();
}
for (int i = 0; i < rearray.length(); i++) {
delete (AcRxObject*)rearray;
}
region->close();
return RTNORM;
}
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-2-24 07:47:43 | 显示全部楼层

Re: [求助]:各位,能帮我看看这个判断点是否在一面域上的程序吗?为什么不能成功?

最初由 leemanzhuo 发布
[B]程序思路:在lisp中用该函数,参数一为一面域句柄,参数二为一三维点,程序目的是以三维点作一半径为1的圆,获得该圆的面域,再求圆的面域和参数一面域的交集,若交集为圆的面域,则判断出点在面域内,返回T,否则返?.. [/B]


程序执行到求交的部分了吗? 即下面的分支.circleregion模型是否保证生成了?

if(region->booleanOper(AcDb::kBoolIntersect, circleregion) == Acad::eOk)
{
acedRetT();
}
else
{
//acedAlert("NULL.");
acedRetNil();
}

另外提几个建议:
1.ads_point到AcGePoint3d的转换,可以直接用point=asPnt3d(rb->resval.rpoint);

2.曲线生成REGION模型,判断只判断是否eOk就可以,更通用.if (AcDbRegion::createFromCurves(crarray,
rearray) !=Acad::eOk)

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-2-24 07:53:56 | 显示全部楼层

Re: [求助]:各位,能帮我看看这个判断点是否在一面域上的程序吗?为什么不能成功?

最初由 leemanzhuo 发布
[B]程序思路:在lisp中用该函数,参数一为一面域句柄,参数二为一三维点,程序目的是以三维点作一半径为1的圆,获得该圆的面域,再求圆的面域和参数一面域的交集,若交集为圆的面域,则判断出点在面域内,返回T,否则返?.. [/B]


求点是否在面域内的算法,我想根据点和REGION的型心,X轴,Y轴求出惯性矩等那些参数应该可以直接判断出来.REGION本身的几何信息可以从getAreaProp()得到. 应该有数学方法求点和刚体的位置关系,可惜高数没有学好,大家讨论讨论用数学的方法是否可以做到吧.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-2-24 07:58:21 | 显示全部楼层

Re: [求助]:各位,能帮我看看这个判断点是否在一面域上的程序吗?为什么不能成功?

最初由 leemanzhuo 发布
[B]程序思路:在lisp中用该函数,参数一为一面域句柄,参数二为一三维点,程序目的是以三维点作一半径为1的圆,获得该圆的面域,再求圆的面域和参数一面域的交集,若交集为圆的面域,则判断出点在面域内,返回T,否则返?.. [/B]


下面是HOBOSOFT朋友贴的使用BREP API的方法.

[php]
BOOL PointInBrep(AcDbRegion *pRegion, AcGePoint3d Pt)
{
if (pRegion == NULL) return FALSE;
AcBrBrep brep;
if (brep.set(*m_pRegion) != AcBr::eOk) return FALSE;
AcBr::Relation relation;
AcBr::ErrorStatus esbr = brep.getPointRelationToBrep(Pt, relation);
if (esbr != AcBr::eOk) return FALSE;
switch(relation)
{
case AcBr::kBoundary:// return CXtBrepUtility::eOnBoundary;
case AcBr::kInside: return TRUE;
default: return FALSE;
}
}
[/php]
程序需要包括 #include "brbrep.h"
和连接 acbr15.lib 库
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-2-25 01:05:51 | 显示全部楼层
我也相信从region的本身信息能够算出点是否在平面内的,我分析过一些程序就是这样做,通过massprop把region的信息保存到文件中,然后读取该文件获得面域的几何参数来判断点是否在面域里,就是不知道起算法是如何,谁能说说呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-15 16:22:56 | 显示全部楼层
我在使用AcBrBrep时,总是报出一堆的关于这个类的linkerror!
我现在用的是.net,arx2004,环境设置里我也添加了,这个类的inc和lib目录;
请问还需要进行一些比较特殊的设置吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-4-15 18:41:54 | 显示全部楼层
最初由 forest99bjx 发布
[B]我在使用AcBrBrep时,总是报出一堆的关于这个类的linkerror!
我现在用的是.net,arx2004,环境设置里我也添加了,这个类的inc和lib目录;
请问还需要进行一些比较特殊的设置吗? [/B]


保证INC和LIB目录设置好后,你的程序初始化部分还要有判断ACBR库是否加载了,如没有加载,就加载它。


[program]
if (!acrxClassDictionary->at("AcBrEntity"))
#if (ADS>15)
        acrxDynamicLinker->loadModule("acbr16.dbx", 1);
#else
        acrxDynamicLinker->loadModule("acbr15.dll", 1);
#endif
[/program]

上面对2004、2005加载acbr16.dbx,对2000、2002加载acbr15.dll

ADS的值你根据情况在预编译里面设置好如ADS=16或ADS=15,如果你就是开发2004、2005下面的程序,就不用判断了,直接用:

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

使用道具 举报

发表于 2004-8-27 16:11:41 | 显示全部楼层
这段程序我用了,很好用,但是在使用AcBrBrep时,不是每一个AutoCAD版本都可以调用成功,在我的实验中,AutoCAD2000和AutoCAD LT 2002怎么都不能调用成功,这个问题应该怎样处理?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2017-3-29 22:44:15 | 显示全部楼层

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 22:10 , Processed in 0.450142 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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