lihao2014 发表于 1970-1-1 08:00:00

CAD控件(插件):COM接口实现自定义实体

COM接口实现自定义实体
1、 实现步骤:        3
1、 实现步骤:参考例子 :Src\MxDraw5.2\samples\ie\iedemoTest.htm 1) 增加自定义实体对象调用DrawCustomEntity函数,绘制一个自定义实体对象函数说明如下:file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wps911A.tmp.jpg JS例子,下面代码绘制一个自定义实体,设置了两个属性,属性名分别” startpoint”,” endpoint”的两个点坐标, // 插入自定义实体函数function InsertCustomEntity() {     var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");    getPt.message = "点取第一点";    if (getPt.go() != 1)      return;    var frstPt = getPt.value();    if (frstPt == null)      return;     var getSecondPt = mxOcx.NewComObject("IMxDrawUiPrPoint");     getSecondPt.message = "点取第二点";    getSecondPt.basePoint = frstPt;     getSecondPt.setUseBasePt(true);     if (getSecondPt.go() != 1)      return;     var secondPt = getSecondPt.value();    if (secondPt == null)      return;     var ent = mxOcx.DrawCustomEntity("TestMxCustomEntity", "");     ent.SetPoint("spt", frstPt);    ent.SetPoint("ept", secondPt);}; 2) 响应自定义事件,绘制自定义实体需要响应DMxDrawXEvents::CustomEntity_Explode事件帮助如下:file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wps913A.tmp.jpg JS例子,下面例子,得到自实体的数据,根据自定义实体的两个必属,开始点,和结束点绘制一个直线      // 自定义实体绘制函数function ExplodeFun(pCustomEntity, pWorldDraw) {     var sGuid = pCustomEntity.Guid;    if (sGuid == "TestMxCustomEntity") {      if (!pCustomEntity.IsHave("ept"))            return;       var stp = pCustomEntity.GetPoint("spt");      if (stp == null)            return;       var ept = pCustomEntity.GetPoint("ept");      if (ept == null)            return;       var mxUtility = mxOcx.NewUtility();      var vec = ept.SumVector(stp);       vec.Mult(0.5);       var midPt = mxOcx.NewPoint();       midPt.x = stp.x;      midPt.y = stp.y;      midPt.Add(vec);       var dAng = vec.Angle();      dAng = mxUtility.GetDimAngle(dAng);       var dDis = 0.0;      dDis = stp.DistanceTo(ept);       var sTxt = "L=" + formatNumber(dDis, '#.##');       dAng = dAng * 180.0 / 3.14159265;       vec.RotateByXyPlan(3.14159265 / 2.0);      vec.Normalize();      vec.Mult(10);       stp.Add(vec);      ept.Add(vec);       pWorldDraw.DrawLine(stp.x, stp.y, ept.x, ept.y);       vec.Mult(2);       stp.Sum(vec);      ept.Sum(vec);       pWorldDraw.DrawLine(stp.x, stp.y, ept.x, ept.y);       pWorldDraw.SetColorIndex(1);       pWorldDraw.DrawText(midPt.x, midPt.y, sTxt, 5, dAng,                        1, 2);       mxOcx.SetEventRet(1);     }}3) 响应自定义事件,返回自定义实体夹点 需要响应_DMxDrawXEvents::CustomEntity_getGripPoints事件帮助如下:file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wps915A.tmp.jpg JS例子,返回自定义实体的开始夹点,和结束夹点。// 返回自定义实体夹点function GetGripPointsFun(pCustomEntity) {     var sGuid = pCustomEntity.Guid;    if (sGuid == "TestMxCustomEntity") {      if (!pCustomEntity.IsHave("ept"))            return;       var stp = pCustomEntity.GetPoint("spt");      if (stp == null)            return;       var ept = pCustomEntity.GetPoint("ept");      if (ept == null)            return;       var ret = mxOcx.NewResbuf();       ret.AddPoint(stp);      ret.AddPoint(ept);       mxOcx.SetEventRetEx(ret);    }}4) 响应自定义事件,夹点移动后的处理 需要响应CustomEntity_moveGripPointsAt事件帮助如下:file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wps918A.tmp.jpg JS例子,夹点移动后,修改自定义实体的属性// 移动自定义实体夹点function MoveGripPointsFun(pCustomEntity, lGridIndex, dOffsetX, dOffsetY) {     var sGuid = pCustomEntity.Guid;    if (sGuid == "TestMxCustomEntity") {      if (!pCustomEntity.IsHave("ept"))            return;       var stp = pCustomEntity.GetPoint("spt");      if (stp == null)            return;       var ept = pCustomEntity.GetPoint("ept");      if (ept == null)            return;       if (lGridIndex == 0) {            stp.x = stp.x + dOffsetX;            stp.y = stp.y + dOffsetY;            pCustomEntity.SetPoint("spt", stp);      }      else {            ept.x = ept.x + dOffsetX;            ept.y = ept.y + dOffsetY;            pCustomEntity.SetPoint("ept", ept);      }       mxOcx.SetEventRet(1);    }}

chenhaijunsjy 发表于 1970-1-1 08:00:00


非常感谢!谢谢分享!
页: [1]
查看完整版本: CAD控件(插件):COM接口实现自定义实体