以梦为马,不负韶华

搜索
查看: 1389|回复: 1
收起左侧

[软件交流] CAD控件(插件):COM接口实现自定义实体

[复制链接]
发表于 1970-1-1 08:00:00 显示全部楼层 |阅读模式
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);
    }
}
发表于 1970-1-1 08:00:00 显示全部楼层

非常感谢!谢谢分享!
回复 支持 反对

使用道具 举报

懒得打字嘛,点击右侧快捷回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|以梦为马,不负韶华

GMT+8, 2025-1-4 12:44

Powered by 以梦为马,不负韶华

© 2024-2099 Meng.Horse

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