土木在线论坛 \ 建筑设计 \ CAD下载及教程 \ 梦想CAD控件关于曲线问题

梦想CAD控件关于曲线问题

发布于:2019-05-15 11:00:15 来自:建筑设计/CAD下载及教程 [复制转发]

IMxDrawCurve 接口



控件中的曲线接口,实现了曲线的相关操作,如求曲线的长度,最近点,面积,曲线上任一点在曲线上的长度 切向方向,曲线交点,坐标变换,打断,偏移,离散等功能。



一、返回曲线组成的闭合区域面积



IMxDrawCurve::GetArea



返回曲线组成的闭合区域面积,具体详细如下:


参数说明[out] DOUBLE* pArea返回闭合区域面积


C#代码计算闭合区域面积:


       MxDrawPolyline pl = new MxDrawPolyline();         MxDrawPoint pt1 = new MxDrawPoint();        pt1.x = 10;        pt1.y = 10;        MxDrawPoint pt2 = new MxDrawPoint();         pt2.x = 20;        pt2.y = 20;        MxDrawPoint pt3 = new MxDrawPoint();         pt3.x = 30.5;        pt3.y = 10;        pl.AddVertexAt(pt1);        pl.AddVertexAt(pt2);        pl.AddVertexAt(pt3);        pl.IsClosedStatus = true;                double dArea = 0.0;        pl.GetArea(out dArea);


IMxDrawCurve::GetArea2



返回曲线组成的闭合区域面积。



js代码计算闭合区域面积:



将此段代码放入鼠标事件中:


// 得到鼠标位置var point = mxOcx.NewPoint();point.x = dX;point.y = dY;// 构造择集,得到鼠标所在闭合区域。 // 设置过滤条件var filter = mxOcx.NewResbuf();// 设置PL线为过滤条件filter.AddStringEx("LWPOLYLINE", 5020); // 选择范围左下角var pt1 = mxOcx.NewPoint();pt1.x = point.x - 100;pt1.y = point.y - 100;// 选择范围右上角 var pt2 = mxOcx.NewPoint();pt2.x = point.x + 100;pt2.y = point.y + 100; // 选择pt1,pt2所在范围内的对象.var ss =mxOcx.NewSelectionSet();ss.Select(1, pt1, pt2, filter); for (var i = 0; i < ss.Count; i++){    // 遍历所有对象,看当前点是在那个闭合区域内    var pl =ss.Item(i);    var dArea = pl.GetArea2 ();    alert("面积为:" + dArea.toString()); }


二、打断曲线



主要用到函数说明:



IMxDrawCurve::SplitCurves



打断曲线,详细说明如下:


参数说明[in] IMxDrawResbuf* aryParam打断位置参数数组,或打断的点数组,是个MxDrawResbuf对象[out] IMxDrawResbuf** aryNewId返回打断后生成的新曲线id,是个MxDrawResbuf对象


c#代码实现如下:


   private void DoSplitCurves()    {        MxDrawUtility mxUtility = new MxDrawUtility();        object getPt;        MxDrawEntity ent = mxUtility.GetEntity(out getPt, "选择打断的曲线:");                if (ent == null)                    return;         MxDrawCurve curve;                if (ent is MxDrawCurve)        {            curve = (MxDrawCurve)ent;        }                else        {            MessageBox.Show("实体类型不对");                        return;        }         MxDrawPoint getPt1 = (MxDrawPoint)(mxUtility.GetPoint(null, "点取打断位置:"));                if (getPt1 == null)        {            MessageBox.Show("用户取消..");                        return;        }        MxDrawResbuf param = new MxDrawResbuf();        param.AddPoint(getPt1, -10);         object objId;                if (curve.SplitCurves(param,out objId))        {            MxDrawResbuf rbId = (MxDrawResbuf)objId;            MessageBox.Show("打断成功,生成的曲线个数:" + rbId.Count);                        // 把以前的删除掉。            ent.Erase();        }                else        {            MessageBox.Show("打断失败");        }    }


选择曲线,把曲线从中间1/4 到 3/ 4处断开:


          MxDrawUtility mxUtility = new MxDrawUtility();         object getPt;         MxDrawEntity ent = mxUtility.GetEntity(out getPt, "选择打断的曲线:");                  if (ent == null)                          return;          MxDrawCurve curve;                  if (ent is MxDrawCurve)         {             curve = (MxDrawCurve)ent;         }                  else         {             MessageBox.Show("实体类型不对");                          return;         }                  double dLen = 0.0;         curve.GetDistAtParam(curve.GetEndParam(),out dLen);          object pt1;                  if (!curve.GetPointAtDist(dLen / 4.0, out pt1))                      return;           object pt2;                  if (!curve.GetPointAtDist(dLen * 3.0 / 4.0, out pt2))                      return;          MxDrawPoint breakPt1 = (MxDrawPoint)pt1;         MxDrawPoint breakPt2 = (MxDrawPoint)pt2;                  if (breakPt1 == null || breakPt2 == null)                      return;          MxDrawResbuf param = new MxDrawResbuf();         param.AddPoint(breakPt1, -10);         param.AddPoint(breakPt2, -10);          object objIds;                  if (curve.SplitCurves(param, out objIds))         {             MxDrawResbuf rbId = (MxDrawResbuf)objIds;                          if(rbId.Count == 3)             {                 axMxDrawX1.Erase(rbId.AtLong(1));             }                          // 把以前的删除掉。             ent.Erase();         }


js代码打断曲线实现如下:


   var ent = mxOcx.GetEntity("选择打断的曲线:");    if (ent == null)        return;         var curve;    if (ent.ObjectName == "McDbSpline")    {        curve =ent;    }     else    {        alert("实体类型不对");        return;    }              var getPt1 = mxOcx.GetPoint(false,0,0,"\n 点取打断位置:");                if (getPt1 == null)    {        alert("用户取消..");        return;    }    var param = mxOcx.NewResbuf();    param.AddPoint(getPt1);    var objId = mxOcx.NewResbuf();              if (curve.SplitCurves(param ,objId))    {        var rbId = objId;        alert("打断成功");        // 把以前的删除掉。        ent.Erase();    }    else    {        alert("打断失败");    }


三、得到曲线长度



主要用到函数说明:



IMxDrawCurve::GetLength2



返回曲线长度



js代码得到曲线长度实现如下:    function GetCLength() {        var ent = mxOcx.GetEntity("选择曲线:");        if (ent == null)            return;             var curve;        if (ent.ObjectName == "McDbSpline")        {            curve =ent;        }        else        {            alert("实体类型不对");            return;        }        var curvelen = curve.GetLength2();             alert(curvelen);     }


四、得到两曲线的交点



IMxDrawEntity::IntersectWith



求两个实体的交点,具体详细如下:


参数说明[in] IDispatch* pIntersectObject另一个求交实体[in] MCAD_McExtendOption exOption求交方式,现在不支持延伸实体求交点[out,retval] IMxDrawPoints** intersectPoints返回实体的相交点


js代码得到两曲线的交点:


   //求曲线的交点        function  IntersectPoint() {        var ent1 = mxOcx.GetEntity("选择曲线1:");        if (ent1 == null)            return;             var curve;        if (ent1.ObjectName == "McDbSpline")        {            curve =ent1;        }        else        {            alert("实体类型不对");            return;        }        var ent2 = mxOcx.GetEntity("选择曲线2:");        if (ent2 == null)            return;             var curve1;        if (ent2.ObjectName == "McDbSpline")        {            curve1 =ent2;        }        else        {            alert("实体类型不对");            return;        }             var points = curve.IntersectWith(curve1, 1);        if(points.Count == 0)        {            alert("没有求到交点");        }        else        {            var pt = points.Item(0);            alert("交点为:" + pt.x + "," + pt.y);        }    }


四、曲线周围一点到曲线上的最近点



主要用到函数说明:



IMxDrawCurve::GetClosestPointTo2



返回曲线长度,具体说明如下:


参数说明[in] IMxDrawPoint* givenPnt任一点[in] VARIANT_BOOL isExtend暂不支持[out,retval] IMxDrawPoint** pPointOnCurve返回曲线上的最近点


js代码求曲线周围一点到曲线上的最近点实现如下:    var ent = mxOcx.GetEntity("选择曲线:");    if (ent == null)        return;         var curve;    if (ent.ObjectName == "McDbSpline")    {        curve =ent;    }    else    {        alert("实体类型不对");        return;    }         var getPt1 = mxOcx.GetPoint(false,0,0,"\n 点取一个点:");              if (getPt1 == null)    {        alert("用户取消..");        return;    }         var ClosestPoint = curve.GetClosestPointTo2(getPt1,false);         var grtClosestPointx = ClosestPoint.x;         var grtClosestPointy = ClosestPoint.y;              alert(grtClosestPointx);    alert(grtClosestPointy);


五、离散曲线



主要用到函数说明:



IMxDrawCurve::GetSamplePoints



离散曲线,具体说明如下:


参数说明[in] DOUBLE dApproxEps离散后的曲线的最大弧高[out,retval] IMxDrawPoints** ppPointArray返回离散的点数组


js代码实现如下:    var ent = mxOcx.GetEntity("选择需要离散的曲线:");    if (ent == null)        return;         var curve;    if (ent.ObjectName == "McDbSpline")    {        curve =ent;    }    else    {        alert("实体类型不对");        return;    }    var curvelen = curve.GetSamplePoints(1);    if (curvelen == null) {        return;    }    var pt = curvelen.Item(0);    console.log(pt)    mxOcx.PathMoveTo(pt.x, pt.y);    for(var i = 1; i < curvelen.Count;i++)    {        pt = curvelen.Item(i);        mxOcx.PathLineTo(pt.x,pt.y)    }         mxOcx.LineWidth = 10;    mxOcx.DrawPathToPolyline();


六、偏移



主要用到函数说明:



IMxDrawCurve::OffsetCurves



曲线偏移,具体说明如下:


参数说明[in] DOUBLE dOffsetDist偏移距离[in] IMxDrawPoint* ptOffsetRef偏移方向参考点,曲线向该点所在位置偏移[out] IMxDrawResbuf** aryNewId返回偏移后新生成的曲线id数组


c#代码实现如下:    private void OffsetCurves()    {        MxDrawUtility mxUtility = new MxDrawUtility();        object getPt;        MxDrawEntity ent = mxUtility.GetEntity(out getPt,"选择编移的曲线:");                if (ent == null)                    return;         MxDrawCurve curve;                if(ent is MxDrawCurve)        {            curve = (MxDrawCurve)ent;        }        else        {            MessageBox.Show("实体类型不对");                        return;        }         MxDrawPoint getPt1 = (MxDrawPoint)(mxUtility.GetPoint(null, "点取偏移位置:"));                if (getPt1 == null)        {            MessageBox.Show("用户取消..");                        return;        }         MxDrawPoint getPt2 = (MxDrawPoint)(mxUtility.GetPoint(getPt1, "点取偏移距离:"));                if (getPt2 == null)        {            MessageBox.Show("用户取消..");                        return;        }         Double dis = (getPt1.x - getPt2.x) * (getPt1.x - getPt2.x) + (getPt1.y - getPt2.y) * (getPt1.y - getPt2.y);        dis = Math.Sqrt(dis);         object objId;                if(curve.OffsetCurves(dis, getPt1, out objId) )        {            MxDrawResbuf rbId = (MxDrawResbuf)objId;            MessageBox.Show("偏移生成的曲线个数:" + rbId.Count);        }    }


js代码实现如下:var ent = mxOcx.GetEntity("选择偏移的曲线:");if (ent == null)    return; var curve;curve =ent;     var getPt1 = mxOcx.GetPoint(false,0,0,"\n 点取偏移位置:");    if(getPt1 == null)    {        return;    }    var getPt2 = mxOcx.GetPoint(true,getPt1.x,getPt1.y,"\n 点取偏移距离:");    if(getPt2 == null)    {        return;    }     var dis = (getPt1.x - getPt2.x) * (getPt1.x - getPt2.x) + (getPt1.y - getPt2.y) * (getPt1.y - getPt2.y);     dis = Math.sqrt(dis);    //dis = Math.sqrt();     //var objId;    var objId = mxOcx.NewResbuf();    if(curve.OffsetCurves2(dis, getPt1))    {        var rbId = objId;                // 把以前的删除掉。        ent.Erase();    }


七、绘制pl线



js代码实现如下:function DrawPolyline(){      var mxOcx = document.all.item("MxDrawXCtrl");              mxOcx.focus();      var point1 = mxOcx.GetPoint(false,0,0,"\n 点取开始点:");      if(point1 == null)      {             return;      }       //mxOcx.PathMoveToEx(point1.x,point1.y,10,10,0.0);       mxOcx.PathMoveTo(point1.x,point1.y);                    var point2 = mxOcx.GetPoint(true,point1.x,point1.y,"\n 点取下一个:");      if(point2 == null)      {             return;      }       var tmpobj = new Array();      //mxOcx.PathLineToEx(point2.x,point2.y,10,10,0.0);      mxOcx.PathLineTo(point2.x,point2.y);                var iCount = 0;      var id = mxOcx.DrawLine(point1.x,point1.y,point2.x,point2.y);          tmpobj[iCount] = id;                iCount = iCount + 1;       point1 = point2;                while(true)                {                       var point2 = mxOcx.GetPoint(true,point1.x,point1.y,"\n 点取下一个:");         if(point2 == null)         {                break;         }          mxOcx.PathLineTo(point2.x,point2.y);           var id = mxOcx.DrawLine(point1.x,point1.y,point2.x,point2.y);             tmpobj[iCount] = id;                   iCount = iCount + 1;          point1 = point2;                }                 var i = 0;                for(;i < iCount;i++)                {         mxOcx.Erase(tmpobj );                }                 var lId = mxOcx.DrawPathToPolyline();       // 把新绘的pl线变成双线。                var param = mxOcx.Call("Mx_NewResbuf","");                param.AddLong(lId);      // 双线的宽度。                var lineWidth = 2;                param.AddDouble(lineWidth);       // 调用变双线函数。               var ret = mxOcx.CallEx("ExApp_MakeDoubleLine",param);                      if(ret.AtString(0) == "Ok")      {         // 返回的绘制的双线对象id.         alert(ret.AtLong(1));      }       // 删除旧的pl线。                mxOcx.Erase(lId);        }


八、由曲线上的一点返回该点到曲线开始点的长度



主要用到函数说明:



IMxDrawCurve::GetDistAtPoint



由曲线上的一点返回该点到曲线开始点的长度,具体说明如下:


参数说明[in] IMxDrawPoint* point曲线上的一点[out] DOUBLE* pDis返回到开始点的曲线上长度


js代码实现如下:    var ent = mxOcx.GetEntity("选择曲线:");        if (ent == null)        return;    var curve;    if (ent.ObjectName == "McDbSpline")    {        curve =ent;    }    else    {        alert("实体类型不对");        return;    }    var getPt1 = mxOcx.GetPoint(false,0,0,"\n 点取一个点:");    if (getPt1 == null)    {        alert("用户取消..");        return;    }    if (curve.GetDistAtPoint2(getPt1))    {        alert(curve.GetDistAtPoint2(getPt1));    }    else    {        alert("失败");    }


九、返回指定参数在曲线上,到开始点的曲线上长度



主要用到函数说明:



IMxDrawCurve::GetDistAtParam



返回指定参数在曲线上,到开始点的曲线上长度,具体说明如下:


参数说明[in] DOUBLE dParam曲线参数[out] DOUBLE* pDis返回到开始点的曲线上长度


js代码实现如下:    var ent = mxOcx.GetEntity("选择曲线:");    if (ent == null)        return;    var curve;    if (ent.ObjectName == "McDbSpline")    {        curve =ent;    }    else    {        alert("实体类型不对");        return;    }     var curvelen = curve.GetEndParam();         if (curve.GetDistAtParam2(curvelen))    {        var my = curve.GetDistAtParam2(curvelen);        alert(my);           }    else    {        alert("失败");    }


十、得到指定参数在曲线上的点坐标



主要用到函数说明:



IMxDrawCurve::GetPointAtParam



得到指定参数在曲线上的点坐标,具体说明如下:


参数说明[in] DOUBLE dParam曲线上的参数[out] IMxDrawPoint** pPoint返回曲线的点


js代码实现如下:    var ent = mxOcx.GetEntity("选择曲线:");    if (ent == null)        return;    var curve;    if (ent.ObjectName == "McDbSpline")    {        curve =ent;    }    else    {        alert("实体类型不对");        return;    }    var curvelen = curve.GetStartParam();         if (curve.GetPointAtParam2(curvelen))    {        var my = curve.GetPointAtParam2(curvelen);        alert(my.x);        alert(my.y);    }    else    {        alert("失败");    }


十一、返回曲线上一点在曲线上的参数



主要用到函数说明:



IMxDrawCurve::GetParamAtPoint



返回曲线上一点在曲线上的参数,具体说明如下:


参数说明[in] IMxDrawPoint* point曲线的点[out] DOUBLE* pParam返回曲线上的参数


js代码实现如下:    var ent = mxOcx.GetEntity("选择曲线:");    if (ent == null)        return;    var curve;    if (ent.ObjectName == "McDbSpline")    {        curve =ent;    }    else    {        alert("实体类型不对");        return;    }    var getPt1 = mxOcx.GetPoint(false,0,0,"\n 点取一个点:");    if (getPt1 == null)    {        alert("用户取消..");        return;    }    if (curve.GetParamAtPoint2(getPt1))    {        alert(curve.GetParamAtPoint2(getPt1));    }    else    {        alert("失败");    }


十二、求曲线参数所在位置的一价导数,这就是切向方向



主要用到函数说明:



IMxDrawCurve::GetFirstDeriv



求曲线参数所在位置的一价导数,这就是切向方向,具体说明如下:


参数说明[in] DOUBLE dParam曲线参数[out] IMxDrawVector3d** pFirstDeriv返回切向方向


js代码实现如下:    var ent = mxOcx.GetEntity("选择曲线:");    if (ent == null)        return;    var curve;    if (ent.ObjectName == "McDbLine")    {        curve =ent;    }    else    {        alert("实体类型不对");        return;    }    var curvelen = curve.GetEndParam();         if (curve.GetFirstDeriv2(curvelen))    {        var my = curve.GetFirstDeriv2(curvelen);        alert(my.x);        alert(my.y);    }    else    {        alert("失败");    }


十三、返回曲线上到开始点的曲线长度对应的曲线参数



主要用到函数说明:



IMxDrawCurve::GetParamAtDist



返回曲线上到开始点的曲线长度对应的曲线参数,具体说明如下:


参数说明[in] DOUBLE dDis到开始点的曲线上长度[out] DOUBLE* pParam返回曲线参数


js代码实现如下:    var ent = mxOcx.GetEntity("选择曲线:");    if (ent == null)        return;    var curve;    curve =ent;    var curvelen = curve.GetLength2();         var my = curve.GetParamAtDist2(0);    alert(my);    if (curve.GetParamAtDist2(curvelen))    {        alert(curve.GetParamAtDist2(curvelen));         }    else    {        alert("失败");    }



全部回复(0 )

只看楼主 我来说两句抢沙发

CAD下载及教程

返回版块

52.07 万条内容 · 651 人订阅

猜你喜欢

阅读下一篇

?电脑端上批量将CAD转换彩色WMF格式的步骤是什么?

电脑端上批量将CAD转换彩色WMF格式的步骤是什么?CAD图纸文件为了方便将其进行打开查看会需要进行的操作就是将其进行格式间的转换步骤,然而图片的格式也有很多种,WMF格式就是其中的一种,需要将CAD图纸文件进行转换成WMF格式的操作步骤是什么,下面小编就要来教大家的就是电脑端上批量将CAD转换彩色WMF格式的步骤是什么的全部操作,希望能够帮助到你们,望采纳! 步骤一:进行此项操作首先需要进行打开的是电脑桌面上的CAD转换器软件,电脑上面没有这款软件的就可以去到迅捷CAD官网上面进行下载安装迅捷CAD转换器!

回帖成功

经验值 +10