JS实现预览DWG文件

4,066 阅读3分钟

前言:近日,接到一些无理的需求,需要在网页上实现预览CAD图纸文件(dwg格式)。为此,本人特意去各大学术论坛调研(百度、Google)。最终寻找到以下方法,本着开源的精神,在此分享出来。

注意:只支持IE浏览器、360浏览器标准模式

以下内容是代码部分

index.html

<HTML>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<HEAD>
  <title>MxDrawX ActiveX 5.2</title>
  <LINK REL="stylesheet" TYPE="text/css" HREF="ie4.css">
  <script language="javascript" type="text/javascript" src="mxcustom.js"></script>
  <script language="javascript" type="text/javascript" src="mxocx.js"></script>
  <script>

    function alert(str)
    {
      var mxOcx = document.getElementById("MxDrawXCtrl");
      if(mxOcx)
        mxOcx.Call("Mx_Alert",str);
    }

    function OpenFile()
    {
      var MxDrawX = document.getElementById("MxDrawXCtrl");
      MxDrawX.SendStringToExecute("OpenDwg");
    }
    function ZoomE()
    {
      var MxDrawX = document.getElementById("MxDrawXCtrl");
      MxDrawX.SendStringToExecute("ZoomE");
    }
    function WindowZoom()
    {
      var MxDrawX = document.getElementById("MxDrawXCtrl");
      MxDrawX.SendStringToExecute("WindowZoom");
    }
    function ZoomR()
    {
      var MxDrawX = document.getElementById("MxDrawXCtrl");
      MxDrawX.DoCommand(56);

    }
    var isShow = false;
    function HideToolbar()
    {
      var MxDrawX = document.getElementById("MxDrawXCtrl");
      MxDrawX.ShowToolBar("绘图工具",isShow);
      MxDrawX.ShowToolBar("编辑工具",isShow);
      isShow = !isShow;
    }

    function Pan()
    {
      var MxDrawX = document.getElementById("MxDrawXCtrl");
      MxDrawX.DoCommand(55);
    }

    function ZoomWindow()
    {
      var MxDrawX = document.getElementById("MxDrawXCtrl");
      MxDrawX.SendStringToExecute();
    }
    function HideLayoutBar()
    {
      var MxDrawX = document.getElementById("MxDrawXCtrl");
      MxDrawX.ShowToolBars = !MxDrawX.ShowToolBars;
    }


    function PrintCmd()
    {
      var MxDrawX = document.getElementById("MxDrawXCtrl");
      MxDrawX.SendStringToExecute("Plot");
    }


  </script>





</HEAD>
<BODY>
<a href="javascript:OpenFile()">打开DWG文件</a> | <a href="javascript:ZoomE()">范围缩放</a> | <a href="javascript:WindowZoom()">窗口缩放</a> | <a href="javascript:ZoomR()">实时缩放</a> | <a href="javascript:Pan()">视区移动</a> | <a href="javascript:HideToolbar()">显示/隐藏 工具条</a> | <a href="javascript:PrintCmd()">打印</a> | <a href="http://www.mxdraw.com">返回主页</a>
<p> <a href="javascript:DoCustomEntity()">绘制自定义实体</a> | <a href="javascript:DoCmd(4)">绘制动画</a> | <a href="javascript:DoCmd(7)">显示水印</a> | <a href="javascript:DoCmd(6)">浏览模式切换</a> | <a href="javascript:DoCmd(8)">设置超连接</a> | <a href="javascript:DoCmd(9)">绘制标记</a> | <a href="javascript:DoCmd(11)">写扩展数据</a> | <a href="javascript:DoCmd(12)">读扩展数据</a> | <a href="javascript:DoCmd(13)">查找图上文字</a> | <a href="javascript:DoCmd(14)">选择范围打印</a> </p>

<table border="0" width="100%" height=750>
  <tr>
    <td width="60%">
      <script type="text/javascript">LoadMxDrawX("https://demo.mxdraw3d.com:3562/test.dwg","https://demo.mxdraw3d.com:3562/MxDrawX52.CAB#version=11,0,0,1","https://demo.mxdraw3d.com:3562/MxDrawx86Setup.exe","https://demo.mxdraw3d.com:3562/MxChromex86Setup.exe");
      </script>

    </td>
    <td width="40%" valign="top">
      <table border="0" width="100%">
        <tr>
          <td width="100%">
            <img border="0" src="/images/tips.gif" width="12" height="11"> 控件已经购买微软代码签名证书,正常下都能自动在网页中加载,建议使用IE为内核的浏览器,CAB安装包有13M,所以<font color="#FF0000">加载需要一定时间(2M网络,一般3分钟左右,),请耐心等待...</font>

          </td>
        </tr>



        <tr>
          <td width="100%">
            <img border="0" src="/images/tips.gif" width="12" height="11"> 如果不能加载,请关掉你电脑上的杀毒软件,特别是360安全卫土和360杀毒,然后再试...
            <p align="right" style="border-bottom:1px dashed"></p>
          </td>
        </tr>


        <tr>
          <td width="100%">
            <img border="0" src="/images/tips.gif" width="12" height="11">
            或者下载MxDrawx86Setup.exe,MxDrawx64Setup.exe手动安装后,然后再试...
            <p align="right" style="border-bottom:1px dashed"></p>
          </td>
        </tr>

        <tr>
          <td width="100%"></td>
        </tr>

        <tr>
          <td width="100%"><img border="0" src="/images/tips.gif" width="12" height="11">
            下载MxDrawX52.CAB自动安装包到本地</td>
        </tr>
        <tr>
          <td width="100%">
            <img border="0" src="/images/tips.gif" width="12" height="11">
            <p align="right"><a href="https://demo.mxdraw3d.com:3562/MxDrawX52.CAB">下载MxDrawX52.CAB..</a>.</p>
            <p align="right" style="border-bottom:1px dashed"></p>
          </td>
        </tr>

        <tr>
          <td width="100%"></td>
        </tr>

        <tr>
          <td width="100%"><img border="0" src="/images/tips.gif" width="12" height="11">
            下载MxDrawx86Setup.exe手动32位安装包到本地</td>
        </tr>
        <tr>
          <td width="100%">
            <img border="0" src="/images/tips.gif" width="12" height="11">
            <p align="right"><a href="https://demo.mxdraw3d.com:3562/MxDrawx86Setup.exe">下载MxDrawx86Setup.exe..</a>.</p>
            <p align="right" style="border-bottom:1px dashed"></p>
          </td>
        </tr>


        <tr>
          <td width="100%"></td>
        </tr>


        <tr>
          <td width="100%"></td>
        </tr>


        <tr>
          <td width="100%"><img border="0" src="/images/tips.gif" width="12" height="11">
            谷歌浏览器使用,安装指定Chrome内核浏览器</td>
        </tr>
        <tr>
          <td width="100%">
            <p align="right"><a href="https://demo.mxdraw3d.com:3562/sogou_explorer_11.0.1_0722.exe">下载sogou_explorer_11.0.1_0722.exe..</a>.</p>
          </td>
        </tr>

        <tr>
          <td width="100%"></td>
        </tr>
      </table>
    </td>
  </tr>
</table>
</BODY>

<script>

  var mxOcx = document.getElementById("MxDrawXCtrl");
  function DoCustomEntity() {
    document.getElementById("MxDrawXCtrl").DoCommand(1);
  }

  function DoDynInsert() {
    document.getElementById("MxDrawXCtrl").DoCommand(2);
  }

  function DoCmd(iCmd) {
    mxOcx.DoCommand(iCmd);
  }

  function DoCommandEventFunc(iCmd) {
    if (iCmd == 1) {
      //该函数在mxcustom.js中
      InsertCustomEntity();
    }
    else if (iCmd == 2) {
      DynInsert();
    }
    else if (iCmd == 3) {
      InsertImage();
    }
    else if (iCmd == 4) {
      DrawGif();
    }
    else if (iCmd == 5) {
      ModifyImage();
    }
    else if (iCmd == 6) {
      BrownerMode();
    }
    else if (iCmd == 7) {
      ShowWatermark();
    }
    else if (iCmd == 8) {
      SetHyperlink();
    }
    else if (iCmd == 99) {
      DoUserCustomMenu();
    }
    else if (iCmd == 9) {
      DrawFlag();
    }
    else if (iCmd == 10) {
      CreateGroup();
    }
    else if (iCmd == 11) {
      WriteXData();
    }
    else if (iCmd == 12) {
      ReadXData();
    }
    else if (iCmd == 13) {
      FindText();
    }
    else if (iCmd == 14) {
      Print();
    }
    else if (iCmd == 15) {
      PrintHtml();
    }


    else if (iCmd == 55) {
      mxOcx.SendStringToExecute("P");
    }
    else if (iCmd == 56) {
      mxOcx.SendStringToExecute("ZoomR");
    }




  }


  function DoDynWorldDrawFun(dX, dY, pWorldDraw, pData) {


    var sGuid = pData.Guid;

    mxOcx.SetEventRet(0);
    if (sGuid == "TestDynDraw") {
      // 动态插入图块。
      var firstPt = pData.GetPoint("pt1");
      if (firstPt == null)
        return;

      var sBlkName = pData.GetString("BlkName");

      var secondPt = mxOcx.NewPoint();

      secondPt.x = dX;
      secondPt.y = dY;

      var vec = firstPt.SumVector(secondPt);
      var dAng = vec.Angle();

      pWorldDraw.DrawBlockReference(firstPt.x, firstPt.y, sBlkName, 1.0, dAng * 180.0 / 3.14159265 + 90.0);

      mxOcx.SetEventRet(1);
    }
    else if (sGuid == "TestDynDraw1") {
      var sBlkName = pData.GetString("BlkName");
      pWorldDraw.DrawBlockReference(dX, dY, sBlkName, 1.0, 0.0);
    }


  }



  function DynInsert() {
    var sBlkName = "Tree";
    var sBlkFile = mxOcx.GetOcxAppPath() + "\Blk\树.dwg";
    mxOcx.InsertBlock(sBlkFile, "Tree");


    var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
    getPt.message = "点取插入点";

    var spDrawData1 = getPt.InitUserDraw("TestDynDraw1");
    spDrawData1.SetString("BlkName", "Tree");

    if (getPt.go() != 1) {
      return;
    }

    var frstPt = getPt.value();
    if (frstPt == null) {

      return;
    }


    var getSecondPt = mxOcx.NewComObject("IMxDrawUiPrPoint");

    var spDrawData = getSecondPt.InitUserDraw("TestDynDraw");


    getSecondPt.message = "点取旋转角度";
    getSecondPt.basePoint = frstPt;
    getSecondPt.setUseBasePt(true);

    spDrawData.SetPoint("pt1", frstPt);




    spDrawData.SetString("BlkName", "Tree");

    if (getSecondPt.go() != 1) {

      return;
    }

    spDrawData.Draw();


  }


  function DoInputPointToolTipFun(ent) {
    var sHyperlinks = ent.Hyperlinks;
    if (sHyperlinks.length != 0) {
      var sClassName = ent.ObjectName;

      var tip = "<b><ct=0x0000FF><al_c>" + sClassName +
              "</b><br><ct=0x00AA00><hr=100%></ct><br><a="link">" + sHyperlinks + "</a>";

      mxOcx.SetEventRetString(tip);
    }
    ent = null;
    CollectGarbage();
  }

  function DoHyperlinkClickFun(ent, dX, dY) {
    mxOcx.GotoURL(ent.Hyperlinks);
    mxOcx.SetEventRet(1);
  }

  function DoUserCustomMenu() {
    var filter = mxOcx.NewResbuf();
    var ent = mxOcx.GetPopupMenuEntity(filter);
    if (ent == null)
      return;

    var sName = ent.ObjectName;
    var sT = "点击了:" + sName + "实体";
    alert(sT);
  }

  // 控件鼠标事件
  function MouseEvent(dX, dY, lType) {
    if (lType == 3) {
      // 鼠标右键按下
      var filter = mxOcx.NewResbuf();

      // 5020 = RTDXF0,只选择直线实体,设置过滤条件
      //filter.AddStringEx("LINE",5020);

      var ent = mxOcx.FindEntAtPoint(dX, dY, filter);

      var sPopMenu;
      if (ent != null) {
        mxOcx.ClearCurrentSelect();
        mxOcx.AddCurrentSelect(ent.ObjectID, true, true);

        sPopMenu = mxOcx.GetOcxAppPath() + "\MxPopMenuEnt.mnu"
      }
      else {
        sPopMenu = mxOcx.GetOcxAppPath() + "\MxPopMenu.mnu"
      }


      mxOcx.TrackPopupMenu(dX, dY, sPopMenu);
      // 设置1,表示鼠标事件,不再往下传递.
      mxOcx.SetEventRet(1);
    }
  }

  //初始化
  function InitMxDrawX() {
    if (mxOcx) {
      if (!mxOcx.IsIniting()) {
        clearInterval(mxtime);
        mxOcx.ReDraw();
        // 控件初始化完成,需要在启动做的事,在这里做

        // 启动时打开文件
        //var sDwgFile = mxOcx.GetOcxAppPath() + "\管道安装大样图.dwg";
        //mxOcx.OpenDwgFile("http://demo.mxdraw3d.com:3562/test.dwg");
        //....

        mxOcx.ImpInputPointToolTipFun = DoInputPointToolTipFun;
        console.log("Init ok")
      }
    }
  }
  mxtime = setInterval(InitMxDrawX, 100);

  document.getElementById("MxDrawXCtrl").ImplementCommandEventFun = DoCommandEventFunc;
  document.getElementById("MxDrawXCtrl").ImpDynWorldDrawFun = DoDynWorldDrawFun;
  document.getElementById("MxDrawXCtrl").ImpInputPointToolTipFun = DoInputPointToolTipFun;
  document.getElementById("MxDrawXCtrl").ImpHyperlinkClickFun = DoHyperlinkClickFun;
  document.getElementById("MxDrawXCtrl").ImplementMouseEventFun = MouseEvent;
  document.getElementById("MxDrawXCtrl").ImpExplodeFun = ExplodeFun;
  document.getElementById("MxDrawXCtrl").ImpGetGripPointsFun = GetGripPointsFun;
  document.getElementById("MxDrawXCtrl").ImpMoveGripPointsAtFun = MoveGripPointsFun;
  document.getElementById("MxDrawXCtrl").ImpTransformByFun = TransformByFun;
  document.getElementById("MxDrawXCtrl").ImpGetGeomExtentsFun = GetGeomExtentsFun;

  function InsertImage() {
    var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
    getPt.message = "点取图片的插入中点";
    if (getPt.go() != 1) {
      return;
    }

    var frstPt = getPt.value();
    if (frstPt == null) {

      return;
    }

    var sImageFile = mxOcx.GetOcxAppPath() + "\mxcad.jpg";
    mxOcx.DrawImageMark(frstPt.x, frstPt.y, -100.0, 0.0, sImageFile, "", true);

  }

  function DrawGif() {
    var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
    getPt.message = "点取图片的插入中点";
    if (getPt.go() != 1) {
      return;
    }

    var frstPt = getPt.value();
    if (frstPt == null) {

      return;
    }

    var sImageFile1 = "http://demo.mxdraw3d.com:3562/1.png";
    var sImageFile2 = "http://demo.mxdraw3d.com:3562/2.png";
    var sImageFile3 = "http://demo.mxdraw3d.com:3562/3.png";
    //    var lId = mxOcx.DrawImageMark(frstPt.x, frstPt.y, -20, 45.0 * 3.14159265 / 180.0, sImageFile1,
    //       sImageFile1 + "," + sImageFile2 + "," + sImageFile3, true);
    var lId = mxOcx.DrawImageMark(frstPt.x, frstPt.y, 2, 0, sImageFile1,
            sImageFile1 + "," + sImageFile2 + "," + sImageFile3, true);
    mxOcx.TwinkeEnt(lId);
  }

  function ModifyImage() {
    var selEnt = mxOcx.NewComObject("IMxDrawUiPrEntity");

    selEnt.message = "选择图像对象";
    if (selEnt.go() != 1)
      return;

    var image = selEnt.Entity();
    if (image == null)
      return;
    if (image.ObjectName != "McDbMxImageMark") {
      alert("选择对象不是图像")
      return;
    }

    var sImageFile = mxOcx.GetOcxAppPath() + "\mxcad.jpg";
    image.ImageFile = sImageFile;
  }

  function geturl() {
    return document.URL;
  }

  var isBrowner = false;
  function BrownerMode() {
    isBrowner = !isBrowner;
    mxOcx.BrowseMode = isBrowner;
    mxOcx.ShowMenuBar = !isBrowner;
    mxOcx.ShowPropertyWindow = !isBrowner;
  }

  var iShowWatermark = false;
  function ShowWatermark() {
    iShowWatermark = !iShowWatermark;
    if (iShowWatermark) {
      mxOcx.Watermark = "http://www.mxdraw.com/download/Watermark.png" + ",20,5,5,1";
      mxOcx.ViewColor = 16777215; // 背景色改成白色
    }
    else {
      mxOcx.Watermark = "";
      mxOcx.ViewColor = 0; // 背景色改成白色
    }
  }

  function SetHyperlink() {
    var selEnt = mxOcx.NewComObject("IMxDrawUiPrEntity");

    selEnt.message = "选择要设置的对象";
    if (selEnt.go() != 1)
      return;

    var ent = selEnt.Entity();
    if (ent == null)
      return;

    ent.Hyperlinks = "www.mxdraw.com";

    mxOcx.DynToolTipTime = 100;
  }

  function CreateGroup() {
    mxOcx.Prompt("选择要做成组的实体:");
    var ss = mxOcx.NewSelectionSet();

    //     var pt1 = mxOcx.NewPoint();
    //     var pt2 = mxOcx.NewPoint();
    //     var filter = mxOcx.NewResbuf();
    //     ss.Select(8, pt1, pt2, filter);
    ss.Select2(8, null, null, null);
    var param = mxOcx.NewResbuf();

    for (var i = 0; i < ss.Count; i++) {
      var ent = ss.Item(i);
      if (ent == null)
        continue;

      param.AddObjectId(ent.ObjectID);
    }
    if (param.Count == 0)
      return;
    mxOcx.CreateGroup("", param);

  }


  function DrawFlag() {
    while (true) {
      var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");

      getPt.message = "点取绘制点";

      if (getPt.go() != 1) {
        return;
      }
      var frstPt = getPt.value();
      if (frstPt == null)
        return;

      var dLen = mxOcx.GetCursorPickRect();
      dLen = mxOcx.ViewLongToDocCoord(dLen);

      dLen *= 3.0;
      mxOcx.DrawVectorLine(frstPt.x - dLen, frstPt.y - dLen,
              frstPt.x + dLen, frstPt.y + dLen,
              255
      );

      mxOcx.DrawVectorLine(frstPt.x - dLen, frstPt.y + dLen,
              frstPt.x + dLen, frstPt.y - dLen,
              255
      );

      mxOcx.DrawVectorCircle(frstPt.x, frstPt.y,
              dLen * 0.5, 65280);
      mxOcx.UpdateDisplay();
    }

  }

  function WriteXData() {
    var selEnt = mxOcx.NewComObject("IMxDrawUiPrEntity");

    selEnt.message = "选择要写扩展数据的对象";
    if (selEnt.go() != 1)
      return;

    var ent = selEnt.Entity();
    if (ent == null)
      return;

    if (ent.SetxDataString("ExDataName", 0, "ExDataValue")) {
      alert("写扩展数据成功");
    }
    else {
      alert("写扩展数据失败");
    }


  }

  function ReadXData() {
    var selEnt = mxOcx.NewComObject("IMxDrawUiPrEntity");

    selEnt.message = "选择要读取扩展数据的对象";
    if (selEnt.go() != 1)
      return;

    var ent = selEnt.Entity();
    if (ent == null)
      return;

    var val = ent.GetxDataString2("ExDataName", 0);
    if (mxOcx.IsOk()) {
      alert(val);
    }
    else {
      alert("没有扩展数!");
    }

  }

  function FindText() {

    var param = mxOcx.NewResbuf();
    param.AddString("");
    param.AddDouble(3);

    var ret = mxOcx.CallEx("Mx_ShowMTextDialog", param);

    if (ret.AtString(0) != "Ok") {
      return;
    }

    var txt = ret.AtString(1);


    var ss = mxOcx.NewSelectionSet();
    var spFilte = mxOcx.NewResbuf();

    // 把文字对象,当着过滤条件.
    spFilte.AddStringEx("TEXT,MTEXT", 5020);

    // 得到图上,所有文字对象.
    ss.Select2(5, null, null, null, spFilte);


    // 遍历每个文字.
    var bFind = false;
    for (var i = 0; i < ss.Count; i++) {
      var ent = ss.Item(i);
      if (ent == null)
        continue;
      if (ent.ObjectName == "McDbText") {
        var sTxt = ent.TextString;


        if (sTxt == txt) {
          // 把文字放到视区中间.
          mxOcx.PutEntityInView(ent.ObjectID, 300);


          var dLen = mxOcx.ViewLongToDocCoord(80);

          // 绘制一个标记圆.
          mxOcx.DrawVectorCircle(ent.Position.x,
                  ent.Position.y,
                  dLen, 65280);
          bFind = true;
        }
      }
      else if (ent.ObjectName == "McDbMText") {
        var param = mxOcx.NewResbuf();
        param.AddObjectId(ent.ObjectID);

        var ret = mxOcx.CallEx("Mx_GetMTextContent", param);
        if (ret.AtString(0) == "Ok") {


          if (ret.AtString(1) == txt) {
            // 把文字放到视区.
            mxOcx.PutEntityInView(ent.ObjectID, 300);

            var dLen = mxOcx.ViewLongToDocCoord(80);

            // 绘制一个标记圆.
            mxOcx.DrawVectorCircle(ent.Location.x,
                    ent.Location.y,
                    dLen, 65280);
            bFind = true;

            break;
          }
        }
      }




      ent = null;

    }

    if (!bFind) {
      alert("没有找到文字对象");
    }


    // 在这里必须显示释放控件的COM对象指针.
    ss = null;
    spFilte = null;
    CollectGarbage();


  }

  function PrintHtml() {
    var print = mxOcx.NewComObject("IMxDrawPrint");
    if (print.PrintHtml(true)) {
      alert("打印成功");
    }
    else {
      alert("打印失败");
    }

  }
  function Print() {

    var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");

    getPt.message = "点取打印范围第一点";

    if (getPt.go() != 1) {
      return;
    }
    var frstPt = getPt.value();
    if (frstPt == null)
      return;

    var utl = mxOcx.NewUtility();
    var secondPt = utl.GetCorner(frstPt, "点取打印范围第二点");
    if (secondPt == null)
      return;

    var print = mxOcx.NewComObject("IMxDrawPrint");

    if (print.Print(frstPt.x, frstPt.y, secondPt.x, secondPt.y)) {
      alert("打印成功");
    }
    else {
      alert("打印失败");
    }

  }
</script>

</HTML>

mxcustom.js


// 插入自定义实体函数
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);
    ent.SetString("MxObjectAppName", "我的自定义实体名");
}

// 格式化字符串
function formatNumber(num, pattern) {
    var strarr = num ? num.toString().split('.') : ['0'];
    var fmtarr = pattern ? pattern.split('.') : [''];
    var retstr = '';

    // 整数部分
    var str = strarr[0];
    var fmt = fmtarr[0];
    var i = str.length - 1;
    var comma = false;
    for (var f = fmt.length - 1; f >= 0; f--) {
        switch (fmt.substr(f, 1)) {
            case '#':
                if (i >= 0) retstr = str.substr(i--, 1) + retstr;
                break;
            case '0':
                if (i >= 0) retstr = str.substr(i--, 1) + retstr;
                else retstr = '0' + retstr;
                break;
            case ',':
                comma = true;
                retstr = ',' + retstr;
                break;
        }
    }
    if (i >= 0) {
        if (comma) {
            var l = str.length;
            for (; i >= 0; i--) {
                retstr = str.substr(i, 1) + retstr;
                if (i > 0 && ((l - i) % 3) == 0) retstr = ',' + retstr;
            }
        }
        else retstr = str.substr(0, i + 1) + retstr;
    }

    retstr = retstr + '.';
    // 处理小数部分
    str = strarr.length > 1 ? strarr[1] : '';
    fmt = fmtarr.length > 1 ? fmtarr[1] : '';
    i = 0;
    for (var f = 0; f < fmt.length; f++) {
        switch (fmt.substr(f, 1)) {
            case '#':
                if (i < str.length) retstr += str.substr(i++, 1);
                break;
            case '0':
                if (i < str.length) retstr += str.substr(i++, 1);
                else retstr += '0';
                break;
        }
    }
    return retstr.replace(/^,+/, '').replace(/.$/, '');
}


// 自定义实体绘制函数
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);

    }
}

// 返回自定义实体夹点
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);
    }
}
// 移动自定义实体夹点
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);
    }
}
// 变换自定义实体
function TransformByFun(pCustomEntity, pMatXform) {

    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;


        stp.TransformBy(pMatXform);
        ept.TransformBy(pMatXform);

        pCustomEntity.SetPoint("spt", stp);

        pCustomEntity.SetPoint("ept", ept);
        mxOcx.SetEventRet(1);
    }
}
// 返回自定义实体最小外包
function GetGeomExtentsFun(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);
    }
}

function GetOsnapPointsFun(pCustomEntity, lOsnapMode, dPickPointX, dPickPointY, dLastPointX, dLastPointY) {

    //        enum OsnapMode         { kOsModeEnd          = 1,
    //           kOsModeMid          = 2,
    //           kOsModeCen          = 3,
    //           kOsModeNode         = 4,
    //           kOsModeQuad         = 5,
    //           kOsModeIns          = 7,
    //           kOsModePerp         = 8,
    //           kOsModeTan          = 9,
    //           kOsModeNear         = 10,
    //           kOsModeInt          = 11
    //        };

    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(lOsnapMode == 1)
        {
            // 端点捕捉。
            var pickPoint = mxOcx.NewPoint();

            pickPoint.x = dPickPointX;
            pickPoint.y = dPickPointY;

            var dDis1 = pickPoint.DistanceTo(stp);
            var dDis2 = pickPoint.DistanceTo(ept);

            var ret = mxOcx.NewResbuf();

            if(dDis1 < dDis2)
            {
                ret.AddDouble(stp.x);
                ret.AddDouble(stp.y);
            }
            else {
                ret.AddDouble(ept.x);
                ret.AddDouble(ept.y);

            }

            mxOcx.SetEventRetEx(ret);
        }
        else if(lOsnapMode == 10)
        {
            // 最近点捕捉.
            var pickPoint = mxOcx.NewPoint();

            pickPoint.x = dPickPointX;
            pickPoint.y = dPickPointY;


            var  line = mxOcx.NewEntity("IMxDrawLine");
            line.EndPoint   = ept;
            line.StartPoint = stp;

            var closePoint = line.GetClosestPointTo2(pickPoint,false);

            if(closePoint != null)
            {
                var ret = mxOcx.NewResbuf();
                ret.AddDouble(closePoint.x);
                ret.AddDouble(closePoint.y);
                mxOcx.SetEventRetEx(ret);
            }
        }

    }
}

mxocx.js


function LoadMxDrawX(dwgfile,cabpath,msipath,chrompath) {

    var s, classid, Sys = {}, ua = navigator.userAgent.toLowerCase();
    (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] : (s = ua.match(/trident/([\d.]+)/)) ? Sys.ie9 = s[1] : (s = ua.match(/firefox/([\d.]+)/)) ? Sys.firefox = s[1] : (s = ua.match(/chrome/([\d.]+)/)) ? Sys.chrome = s[1] : (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] : (s = ua.match(/version/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0,
        classid = "74A777F8-7A8F-4e7c-AF47-7074828086E2",

        Sys.ie || Sys.ie9 ? (document.write("<!-- 用来产生编辑状态的ActiveX控件的JS脚本-->   "),
                document.write("<!-- 因为微软的ActiveX新机制,需要一个外部引入的js-->   "),
                document.write('<object id="MxDrawXCtrl" classid="clsid:' + classid + '" '),
                //document.write('width="85%" height="85%" align="left">   '),
                document.write('codebase="' + cabpath + '" width="90%" height="90%" align="left">   '),
                document.write('<param name="_Version" value="65536">  '),
                document.write('<param name="_ExtentX" value="24262">  '),
                document.write('<param name="_ExtentY" value="16219">  '),
                document.write('<param name="_StockProps" value="0">'),
                document.write('<param name="DwgFilePath" value="' + dwgfile + '" > '),
                document.write('<param name="IsRuningAtIE" value="1">'),
                document.write('<param name="EnablePrintCmd" value="1">  '),
                document.write('<param name="ShowCommandWindow" value="1">   '),
                document.write('<param name="ShowToolBars" value="1">  '),
                document.write('<param name="ShowModelBar" value="1">'),
                document.write('<param name="Iniset" value="">  '),
                document.write('<param name="ToolBarFiles" value="">'),
                document.write('<param name="ShowMenuBar" value="1">'),
                document.write('<param name="EnableUndo" value="1">'),
                document.write('<param name="ShowPropertyWindow" value="0">'),
                document.write('<SPAN STYLE="color:red">不能装载文档控件,使用IE,或QQ,360浏览器兼容模式。请在检查浏览器的选项中检查浏览器的安全设置。请点击<a href=' + msipath + '>安装控件</a></SPAN>'),
                document.write('</object>')) :

            Sys.chrome ? (document.write('<object id="MxDrawXCtrl" clsid="{' + classid + '}" '),
                    document.write('type="application/mxdraw-activex" width="90%" height="90%" align="left" '),
                    document.write('<param name="_Version" value="65536">  '),
                    document.write('<param name="_ExtentX" value="24262">  '),
                    document.write('<param name="_ExtentY" value="16219">  '),
                    document.write('<param name="_StockProps" value="0">'),
                    document.write('<param name="DwgFilePath" value="' + dwgfile + '" > '),
                    document.write('<param name="IsRuningAtIE" value="1">'),
                    document.write('<param name="EnablePrintCmd" value="1">  '),
                    document.write('<param name="ShowCommandWindow" value="1">   '),
                    document.write('<param name="ShowToolBars" value="1">  '),
                    document.write('<param name="ShowModelBar" value="1">'),
                    document.write('<param name="Iniset" value="CHROME=Y">  '),
                    document.write('<param name="ToolBarFiles" value="">'),
                    document.write('<param name="ShowMenuBar" value="1">'),
                    document.write('<param name="EnableUndo" value="1">'),
                    document.write('<param name="ShowPropertyWindow" value="0">'),
                    document.write('<param name="Event_ImplementCommandEvent" value="DoCommandEventFunc">'),
                    document.write('<SPAN STYLE="color:red">不能装载文档控件,谷歌浏览器使用,下载MxChrome安装包到本地,安装后点击桌面 Chrome企业版 快捷方式启动。请点击<a href=' + chrompath + '>安装控件</a></SPAN>'),
                    document.write('</object>')) :

                Sys.firefox ? (document.write("<!-- 需要安装ieTab插件才能使用-->   "),
                            document.write("<!-- 右键弹出菜单,点击使用ieTab浏览> -->  "),

                            document.write('<div class="no_title">  不能装载文档控件。1.请在安装ieTab插件,2.然后请点击<a href=' + msipath + '>安装控件</a>, 3.然后右键弹出菜单,点击使用ieTab浏览 </div> ')

                    ) :
                    Sys.opera ? alert("sorry,ntko 暂时不支持opera!") :
                        Sys.safari && alert("sorry,ntko 暂时不支持safari!");
}


function isFireFox()
{
    var s, classid, Sys = {}, ua = navigator.userAgent.toLowerCase();
    (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] : (s = ua.match(/trident/([\d.]+)/)) ? Sys.ie9 = s[1] : (s = ua.match(/firefox/([\d.]+)/)) ? Sys.firefox = s[1] : (s = ua.match(/chrome/([\d.]+)/)) ? Sys.chrome = s[1] : (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] : (s = ua.match(/version/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;

    return  Sys.firefox;

}

ie4.css

BODY
{
    FONT: 80% verdana,arial,helvetica;
    COLOR: #000000
}
DIV.clsDocBody
{
    MARGIN-TOP: 10px;
    MARGIN-LEFT: 10px;
    MARGIN-RIGHT: 10px
}
DIV.clsFooter
{
    MARGIN-TOP: 10px;
    MARGIN-LEFT: 10px;
    MARGIN-RIGHT: 10px
}
DIV.clsFPfig
{
    FONT-SIZE: 80%
}
TD
{
    FONT-SIZE: 75%;
    TEXT-DECORATION: none
}
TH
{
    FONT-SIZE: 68%;
    BACKGROUND-COLOR: lightgrey
}
A:link
{
    BORDER-RIGHT: green;
    BORDER-TOP: green;
    BORDER-LEFT: green;
    BORDER-BOTTOM: green;
    TEXT-DECORATION: none
}
A:visited
{
    COLOR: #6699cc;
    TEXT-DECORATION: none
}
A:hover
{
    COLOR: red;
    TEXT-DECORATION: underline
}
h1
{
    font-size:200%
}
H2
{
    font-size:150%
}
H3
{
    COLOR: #003399;
    BACKGROUND-COLOR: lightgoldenrodyellow
}
CODE
{
    BACKGROUND-COLOR: lightcyan
}

以上代码来自 help.mxdraw.com/?pid=46