找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1755|回复: 6

[求助]:创建一个curve的offset

[复制链接]
发表于 2002-2-19 14:49:58 | 显示全部楼层 |阅读模式

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

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

×
下面的程序是创建一个curve的offset,运行没有问题,但是在屏幕上没有任何反应,请何、陈两版主给予指点,谢谢!
static int rzrx_offset(struct resbuf *rb)//偏移曲线
{   ads_name ent; double offset_dist;
    AcDbObjectId curveId, newcurveId;
    struct resbuf *rbf;  rbf = rb;
    if (rbf == NULL)  return RTERROR;       

    if (rbf->restype == RTENAME)  ads_name_set(rbf->resval.rlname, ent);
    else { acdbFail("参数应为实体名!"); return RTERROR; }

    rbf = rbf->rbnext;
    if (rbf == NULL)  return RTERROR;///提取数值
    if (rbf->restype == RTSHORT) offset_dist = (ads_real) rbf->resval.rint;
    else if (rbf->restype == RTREAL) offset_dist = rbf->resval.rreal;
    else { acdbFail("参数应为数值!"); return RTERROR; }

    acdbGetObjectId(curveId,ent);
    AcDbCurve* pCurve = NULL;
    acdbOpenObject(pCurve, curveId, AcDb::kForRead);
    if(pCurve == NULL) { pCurve->close(); return RTERROR; }

    AcDbVoidPtrArray curves;
    Acad::ErrorStatus es;
    es = pCurve->getOffsetCurves(offset_dist, curves);
    if(es != Acad::eOk) { pCurve->close(); acdbFail("无法创建偏移实体!"); return RTERROR; }
    pCurve->close();

    es = postToDatabase((AcDbEntity*)curves[0], newcurveId);
    if(es != Acad::eOk) { acdbFail("无法加入数据库!"); return RTERROR; }

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-2-21 09:31:45 | 显示全部楼层

Re: [求助]:请版主看看这个问题:创建一个curve的offset

最初由 Lagier 发布
[B]下面的程序是创建一个curve的offset,运行没有问题,但是在屏幕上没有任何反应,请何、陈两版主给予指点,谢谢!
static int rzrx_offset(struct resbuf *rb)//偏移曲线
{   ads_name ent; double offset_dist;
   ... [/B]


若程序没有问题的话,你试试在ACAD里面交互,对你的测试对象按照你给的便宜距离测试下OFFSET,OFFSET不是任何时候都可以进行正确操作的.对具体对象要有合适的距离.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-2-21 11:56:28 | 显示全部楼层
XD:
  程序没有问题,在ACAD里面交互能得到正确图形,但不知是哪里的问题,还请XD或何版主将函数试用一下。谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-2-21 12:30:17 | 显示全部楼层
最初由 Lagier 发布
[B]XD:
  程序没有问题,在ACAD里面交互能得到正确图形,但不知是哪里的问题,还请XD或何版主将函数试用一下。谢谢! [/B]


下面是XDRX_API的XDRX_GETOFFSETCURVES函数代码,偏移AcDbCurve实体,最后得到样本点表.你参考下,看看.

还有,OFFSET后的实体不一定是一个,有可能是多个.所以仅仅是curves[0]不够的. 再有,是否你的postToDb函数内有问题,还有你偏移的是什么实体?


  1. int getoffsetcurve()
  2. {
  3.         resbuf *rb=ads_getargs();
  4.         AcGePoint3d start_pt,end_pt;
  5.         if (rb==NULL)
  6.                 return RTNORM;
  7.         if (rb->restype!=RTENAME)
  8.                 return RTNORM;
  9.         AcDbObjectId id;
  10.         acdbGetObjectId(id,rb->resval.rlname);
  11.         AcDbEntity *pEnt;
  12.         Acad::ErrorStatus ret;
  13.         ret=acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead);
  14.         if (ret!=Acad::eOk)
  15.                 return RTNORM;
  16.         AcDbCurve *pCurve,*pOffsetCurve;
  17.         if ((pCurve=AcDbCurve::cast(pEnt))==NULL){
  18.                 pEnt->close();
  19.                 return RTNORM;
  20.         }
  21.         double c_length,sParam,eParam,dist=0;
  22.         resbuf vs;
  23.         ads_getvar("VIEWSIZE",&vs);
  24.         dist=vs.resval.rreal/15.0;
  25.         pCurve->getStartParam(sParam);
  26.         pCurve->getEndParam(eParam);
  27.         pCurve->getDistAtParam(eParam,c_length);
  28.         rb=rb->rbnext;
  29.         if (rb==NULL){
  30.                 pEnt->close();
  31.                 return RTNORM;
  32.         }
  33.         int div=0;
  34.         double offset_dist;
  35.         switch (rb->restype){
  36.         case RTSHORT:
  37.                 offset_dist=(double)rb->resval.rint;
  38.                 break;
  39.         case RTREAL:
  40.                 offset_dist=rb->resval.rreal;
  41.                 break;
  42.         default:
  43.                 pEnt->close();
  44.                 return RTNORM;
  45.         }
  46.         rb=rb->rbnext;
  47.         int type=0;
  48.         AcGePoint3d mid_pt;
  49.         int line_div=0;
  50.         if (rb!=NULL)
  51.         {
  52.                 switch (rb->restype){
  53.                 case RTSHORT:
  54.                         if ((rb->resval.rint>0)&&(rb->resval.rint<=AES_DBASE.Curve_Max_Div)){
  55.                                 line_div=abs(rb->resval.rint);
  56.                         }
  57.                         else{
  58.                                 dist=abs(rb->resval.rint);
  59.                         }
  60.                         break;
  61.                 case RTREAL:
  62.                         dist=fabs(rb->resval.rreal);
  63.                         break;
  64.                 case RT3DPOINT:
  65.                 case RTPOINT:
  66.                         acdbUcs2Wcs(rb->resval.rpoint,rb->resval.rpoint,Adesk::kFalse);
  67.                         mid_pt=asPnt3d(rb->resval.rpoint);
  68.                         type=1;
  69.                         break;
  70.                 default:
  71.                         pEnt->close();
  72.                         return RTNORM;
  73.                 }
  74.         }
  75.         else{
  76.                 line_div=0;
  77.         }
  78.         AcDbVoidPtrArray offsetCurves;
  79.         AcDbPolyline *pLwpoly=NULL;
  80.         int lwtype=0;
  81.         if ((pEnt->isKindOf(AcDbLine::desc()))||(pEnt->isKindOf(AcDb2dPolyline::desc()))){
  82.                 pCurve=AcDbCurve::cast(pEnt);
  83.                 pLwpoly=makePolyFromCurve(pCurve,Adesk::kFalse);
  84.                 lwtype=1;
  85.                 pCurve=AcDbCurve::cast(pLwpoly);
  86.         }
  87.         if (!(XdDbUtils::isAntiClockWise(pCurve)))
  88.                 offset_dist=-offset_dist;
  89.         ret=pCurve->getOffsetCurves(offset_dist,offsetCurves);
  90.         if (pLwpoly)
  91.                 delete pLwpoly;
  92.         pEnt->close();
  93.         if (ret!=Acad::eOk){
  94.                 return RTNORM;
  95.         }
  96.         int length=offsetCurves.length();
  97.         AcGePoint3d near_pt,ls;
  98.         AcGePoint3dArray nPts,nPts1;
  99.         for (int j=0;j<length;j++){
  100.                 nPts1.setLogicalLength(0);
  101.                 pOffsetCurve=(AcDbCurve *)offsetCurves.at(j);
  102.                 if (type){
  103.                         if (j==0){
  104.                                 pOffsetCurve->getClosestPointTo(mid_pt,ls,Adesk::kTrue);
  105.                         }
  106.                         else{
  107.                                 pOffsetCurve->getClosestPointTo(mid_pt,near_pt,Adesk::kTrue);
  108.                                 if (ls.distanceTo(mid_pt)>near_pt.distanceTo(mid_pt)){
  109.                                         ls=near_pt;
  110.                                 }
  111.                         }
  112.                 }
  113.                 else{
  114.                         XdDbUtils::getPolyVertxFromCurve(pOffsetCurve,nPts1,dist);
  115.                         nPts.append(nPts1);
  116.                 }
  117.                 delete pOffsetCurve;
  118.         }
  119.         if (type){
  120.                 Xd_RetPoint(ls);
  121.         }
  122.         else{
  123.                 resbuf *RetList=NULL;
  124.                 XdRbUtils::getRbListFromPtArray(&nPts,RetList);
  125.                 if (RetList!=NULL){
  126.                         XdRbUtils::toLisp(RetList);
  127.                         ads_relrb(RetList);
  128.                 }
  129.         }
  130.         return RTNORM;
  131. }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-2-21 23:27:25 | 显示全部楼层
最初由 Lagier 发布
[B]问题已解决!非常感谢XD!!! [/B]


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

使用道具 举报

 楼主| 发表于 2002-2-22 13:05:08 | 显示全部楼层
修改后如下:
static int rzrx_offset(struct resbuf *rb)//偏移曲线
{   ads_name ent; double offset_dist;
    AcDbObjectId curveId, newcurveId;
    struct resbuf *rbf;  rbf = rb;
    if (rbf == NULL)  return RTERROR;       

    if (rbf->restype == RTENAME)  ads_name_set(rbf->resval.rlname, ent);
    else { acdbFail("参数应为实体名!"); return RTERROR; }

    rbf = rbf->rbnext;
    if (rbf == NULL)  return RTERROR;///提取数值
    if (rbf->restype == RTSHORT) offset_dist = (ads_real) rbf->resval.rint;
    else if (rbf->restype == RTREAL) offset_dist = rbf->resval.rreal;
    else { acdbFail("参数应为数值!"); return RTERROR; }

    acdbGetObjectId(curveId,ent);
    AcDbCurve* pCurve = NULL;
    acdbOpenObject(pCurve, curveId, AcDb::kForRead);
    if(pCurve == NULL) { pCurve->close(); return RTERROR; }

    AcDbVoidPtrArray curves;
    Acad::ErrorStatus es;
    es = pCurve->getOffsetCurves(offset_dist, curves);
    if(es != Acad::eOk) { pCurve->close(); acdbFail("无法创建偏移实体!"); return RTERROR; }
    pCurve->close();

    AcDbEntity* pnewCurve = (AcDbEntity*)curves[0];
    es = postToDatabase(pnewCurve, newcurveId);
    if(es != Acad::eOk) { acdbFail("无法加入数据库!"); return RTERROR; }
    pnewCurve->close();
    return RTNORM;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 10:25 , Processed in 0.297394 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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