1、在上一篇文章中讲解了利用闪烁实体TwinkeEnt方法制作动画,现在介绍另一种实现动画的方法。
2、实现思路:首先我们先定义一个RotateEnt方法,得到动画临时对象,利用Rotate方法旋转一个对象,然后绘制动画对象。然后我们需要在控件启动时打开文件,然后把对象初始化为动画状态,再启动一个用于实现动画的时钟事件,最后调用我们之前定义的RotateEnt方法就可以啦。
3、主要用到函数说明:
(1)IMxDrawEntity::Rotate
旋转一个对象。详细说明如下:
参数 | 说明 |
---|---|
[in] IMxDrawPoint* basePoint | 旋转基点 |
[in] DOUBLE dRotationAngle | 旋转角度 |
(2)IMxDrawAnimation::GetAnimationEntity2
得到动画临时对象.如果对象没有被初始成动画状态,返回为 NULL。详细说明如下:
参数 | 说明 |
---|---|
[in] BSTR pszHandle | 动画对象句柄 |
js中实现代码说明:
function InitDraw() {
draw = document.getElementById("MxDrawXCtrl");
draw.ImplementCommandEventFun = function DoCommandEventFunc(iCmd) {
if (iCmd == 1) {
// 启动时打开文件
draw.OpenDwgFile(draw.GetOcxAppPath() + "\\Blk\\animation.dwg");
var animation = draw.NewComObject("IMxDrawAnimation");
//把对象初始化成动画状态
animation.InitAnimationEntity2("211");
animation.InitAnimationEntity2("212");
animation.InitAnimationEntity2("213");
// 启动一个控件时钟事件,用于实现动画。
draw.CallLongParam1("Mx_StartUserTimer", 30);
}
};
draw.ImplementCustomEvent = function CustomEvent(sEventName) {
if (sEventName == "Mx_UserTimer")
{
var animation = draw.NewComObject("IMxDrawAnimation");
//开始一个动画绘制过程
animation.StartDraw();
// 211 212 213是需要旋转实体的句柄.
RotateEnt("211", animation);
RotateEnt("212", animation);
RotateEnt("213", animation);
//结束动画绘制过程
animation.EndDraw();
// 注意需要显示释放递代器.,不然会引起错误
animation = null;
CollectGarbage();
}
};
}
function RotateEnt( handls, animation)
{
//得到动画临时对象.如果对象没有被初始成动画状态,返回为 NULL
var ent = animation.GetAnimationEntity2(handls);
if (ent != null && (ent.ObjectName == "McDbBlockReference"))
{
var blkRef = ent;
//旋转一个对象,参数一为旋转基点,参数二为旋转角度
blkRef.Rotate(blkRef.Position, -30 * 3.14159265 / 180.0);
//绘制动画对象.该函数只能在StartDraw,EndDraw之前调用
animation.Draw2(handls);
}
}
4、效果展示: