COM接口实现自定义实体
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); } } |