zoukankan      html  css  js  c++  java
  • 【转载】曲线打断、求交点

    在08科创项目,绘图助手工具箱中的第二、三个命令RTLine、STLine就是使用了曲线打断的函数,为实现这个命令我查阅了多个网页,找出了几个重要的函数,分别是打断曲线的getSplitCurves、求两曲线交点的intersectwith。感谢ObjectARX编程站,让我找到很多ObjectARX方面我需要的东西,以下就是我转载的文章:

    创建自己的曲线打断命令

     原文地址:http://www.objectarx.net/bbs/viewthread.php?tid=1655&extra=page%3D1%26amp%3Bfilter%3Ddigest

    复制代码
     void drawEntity(AcDbEntity* pEntity);
     bool breakCurve(AcDbCurve* curve, AcGePoint3d pt);
     bool breakCurve(AcDbCurve* curve, AcGePoint3d p1, AcGePoint3d p2);


     static void Mybreak2008_Mybreak(void)
     {
         // Add your code for command Mybreak2008._Mybreak here
         ads_point pt1,pt2;
         ads_name entName;
         Acad::ErrorStatus es;
         int ret;
         ACHAR kWord[100];


         if (acedEntSel(_T(" 选择所要打断的曲线:"), entName, pt1) !=RTNORM)
         {
             return;
         }
         AcDbObjectId entId;
         AcDbCurve *pCurve=NULL;
         AcDbEntity *pEnt = NULL;
         es = acdbGetObjectId(entId, entName);
         if (es != Acad::eOk)
         {
            return;
         }
         acdbOpenObject(pEnt, entId, AcDb::kForWrite);
         if (pEnt->isKindOf(AcDbCurve::desc()))
         {
            pCurve = AcDbCurve::cast(pEnt);
            if (pCurve != NULL)
            {
               acedInitGet (NULL, _T("F"));
               ret=acedGetPoint(NULL,_T(" 指定第二个打断点或[第一点(F)]:"),pt2);
               switch (ret)
               {
                   case RTKWORD:
                       ret=acedGetInput(kWord);
                       if ( ret!= RTNORM )
                           break ;
                       acedInitGet(RSG_NONULL, _T(""));
                       ret=acedGetPoint(NULL,_T(" 指定第一个打断点:"),pt1);
                       if (ret!=RTNORM)
                           break;
                       acedInitGet(RSG_NONULL, _T(""));
                       ret=acedGetPoint(NULL,_T(" 指定第二个打断点:"),pt2);
                       if (ret!=RTNORM)
                          break;
                       breakCurve(pCurve,asPnt3d(pt1), asPnt3d(pt2));
                       break;
                   case RTNONE:
                       breakCurve(pCurve,asPnt3d(pt1));
                       break;
                    case RTNORM:
                       breakCurve(pCurve,asPnt3d(pt1), asPnt3d(pt2));
                        break;
                  default:
                       break;
               }
            }
         }
         pEnt->close();
     }


     //以下为函数
     //打断于点
     bool breakCurve(AcDbCurve* curve,AcGePoint3d pt)
     {
         AcGePoint3d p1;
         curve->getClosestPointTo(pt,p1);
         double param;
         curve->getParamAtPoint(p1,param);
         AcGeDoubleArray params;
         params.append(param);
         AcDbVoidPtrArray curveSegments;
         curve->getSplitCurves(params, curveSegments);
         AcDbEntity* ent =NULL;
         if (curveSegments.length()==2)
         {
             ent=(AcDbEntity*)curveSegments[0];
             drawEntity(ent);
             ent->close();
             ent=(AcDbEntity*)curveSegments[1];
             drawEntity(ent);
             ent->close();
             curve->erase();
         }
         else
         {
             curve->close();
         }   
         return true ;
     }
     //两点打断
     bool breakCurve(AcDbCurve* curve, AcGePoint3d p1, AcGePoint3d p2)
     {
         AcGePoint3d p11;
         curve->getClosestPointTo(p1,p11);
         double param1;
         curve->getParamAtPoint(p11,param1);
         AcGePoint3d p21;
         curve->getClosestPointTo(p2,p21);
         double param2;
         curve->getParamAtPoint(p21,param2);
         AcGeDoubleArray params;
         if (param1<param2)
         {
             params.append(param1);
             params.append(param2);
         }
         else
         {
             params.append(param2);
             params.append(param1);
         }
         AcDbVoidPtrArray curveSegments;
         curve->getSplitCurves(params, curveSegments);
         AcDbEntity* ent =NULL;
         if (curveSegments.length()==2)
         {
             ent=(AcDbEntity*)curveSegments[1];
             drawEntity(ent);
             ent->close();
         }
         else if (curveSegments.length()==3)
         {
             ent=(AcDbEntity*)curveSegments[0];
             drawEntity(ent);
             ent->close();
             ent=(AcDbEntity*)curveSegments[2];
             drawEntity(ent);
             ent->close();
         }
         curve->erase();
         return true ;
     }
     //绘制打断的曲线
     void drawEntity(AcDbEntity* pEntity)
     {
         AcDbBlockTable *pBlockTable;
         acdbHostApplicationServices()->workingDatabase()
             ->getSymbolTable(pBlockTable, AcDb::kForRead);
         AcDbBlockTableRecord *brec;
         resbuf tilemode;
         acedGetVar(_T("TILEMODE"),&tilemode);
         int tile=tilemode.resval.rint;
         if (tile)
             pBlockTable->getAt(ACDB_MODEL_SPACE, brec,AcDb::kForWrite);
         else
             pBlockTable->getAt(ACDB_PAPER_SPACE, brec,AcDb::kForWrite);
         pBlockTable->close();
         AcDbObjectId entid;
         brec->appendAcDbEntity(entid, pEntity);
          brec->close();     
      }
    复制代码
  • 相关阅读:
    Javascript常用代码
    Node.cluster
    swift3.0 hello swift(1)
    vs2013 linq to mysql
    ThinkPHP5作业管理系统中处理学生未交作业与已交作业信息
    ThinkPHP5 Model分层及多对多关联的建立
    ThinkPHP5中Session的使用
    用户登陆模块的后端实现
    使用BootStrapValidator来完成前端输入验证
    空间session失效的解决方法
  • 原文地址:https://www.cnblogs.com/mjgw/p/12347934.html
Copyright © 2011-2022 走看看