天天看点

CAD控件:COM接口实现自定义实体的方法

 实现步骤:

参考例子 :Src\MxDraw5.2\samples\ie\iedemoTest.htm

1、增加自定义实体对象

调用DrawCustomEntity函数,绘制一个自定义实体对象

函数说明如下:

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事件

帮助如下:

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事件

帮助如下:

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事件

// 移动自定义实体夹点

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);

    }

}