明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 747|回复: 0

CAD控件打开保存图纸,并进行图纸比较

[复制链接]
发表于 2021-6-7 10:41:54 | 显示全部楼层 |阅读模式
本帖最后由 MxDraw 于 2021-6-7 11:07 编辑

打开保存图纸
我们控件提供一些打开,保存图纸的函数,下面详细说明一下:
A.  在软件启动时,自动打开图纸
1.调用控件函数:OpenDwgFile,详细说明参考:
https://www.mxdraw.com/help/frames.htm?frmname=topic&frmfile=MxDrawXLib___DMxDrawX__OpenDwgFile@BSTR.htm
2.该函数支持打开dxf,dwg,dwf,png,jpg,bmp,mxg文件
3.比如js语言:
首先响应控件初始化完成事件,在控件初化完成后,调用OpenDwgFile打开图纸,增加用户自定义事件发生事件响应函数:
document.getElementById("MxDrawXCtrl").ImplementCustomEvent = CustomEvent;
然后在该事件函数中,加入打开文件代码:

function CustomEvent(sEventName)

{

    if(sEventName == "MxDrawXInitComplete")

    {

        // 控件加载完成.


     mxOcx.OpenDwgFile("D:\\MyBlock.dwg");   



    }


}
B. 打开网络路径图纸
使用控件 OpenWebDwgFile函数,打开一个http://开头网络图纸。比如:
mxOcx.OpenWebDwgFile("https://mxtmpweb.mxdraw.f3322.net:3562/test.dwg");
C. 把DWG图纸当着背景图打开
使用控件 OpenBackgroundFile函数,详细:(梦想CAD控件)
该函数把dwg图纸变灰显示,图纸不能选中编辑。
D.二制流数据中加载图形
使用控件 ReadBinStream函数,可以加载二进制流形式的DWG图纸。
例如js:

    //服务器后台代码,返回前台二进制流数据.

    public JsonResult change()

    {

     FileStream fileStream = new FileStream(Server.MapPath(fileName), FileMode.Open, FileAccess.Read, FileShare.Read);

     BinaryReader binaryReader = new BinaryReader(fileStream);

     byte[] mybyte = binaryReader.ReadBytes((int)fileStream.Length);     return Json(mybyte, JsonRequestBehavior.AllowGet);

    }   

    // 前台客服端代码:

    function Bytes2Str(arr) {


     var str = "";     for (var i = 0; i < arr.length; i++) {


         var tmp = arr.toString(16);         if (tmp.length == 1) {


             tmp = "0" + tmp;


         }


         str += tmp;


     }     return str;


   }

    function InitMxDrawX()

{

     var mxOcx = document.getElementById("MxDrawXCtrl");     if (mxOcx) {     if (!mxOcx.IsIniting()) {

         clearInterval(mxtime);

   

             $.ajax({

                 url: '@Href("~/Home/change")',

                 success: function (text) {

                     

                     alert(typeof (text));


                    var str = Bytes2Str(text);


                    mxOcx.NewFile();

                     mxOcx.ReadBinStream(str, "", "16777215");

                 },

                 error: function () {

                     alert("失败");


                 }

             });         //mxOcx.OpenWebDwgFile("http://192.168.0.13/DWG/后沟.dwg");

     }

     }

}

mxtime = setInterval(InitMxDrawX, 100);
E. 最快方式 加载图纸
1.DWG图纸中有很多看不见的数据,控件打开文件时,可以设置那些内容不让加载,来提高打开文件速度。
2.比如。设置控件的Iniset属性的值 READCONTENT=132440最快方式打开图纸, 132440就一个位运算出来的数值,每个二进位代表是需要加那些内容,
3.js设置如下:
每个二进制位代表含义:

enum ReadContent

{

kReadAllDefault = 0xFFF9FFFF,//0xFFFDFFFF=~kFastRelease & ~kReadProxyEntGet

kReadAllProxyEntGet = 0xFFFDFFFF,//0xFFFDFFFF=~kFastRelease

kReadNull       = 0x0,// 下面数据都不读取

kReadExData= 0x1,

kReadHandle= 0x2,

kReadBlockRefPreviewIcon= 0x4,

kReadBlockLayoutName= 0x8,

kNamedObjectsDictionary= 0x10,// 是否读对象字典,如果不读,字典下所有数据都不会读取.

kReadGroupDict              = 0x20,// 是否读取组字典

kReadLayoutDict             = 0x40,

kReadMlineStyleDict         = 0x80,

kReadImageDict= 0x100,

kReadXrecord= 0x200,

kReadDrawOrder= 0x400,

kReadxData= 0x800,

kReadExRecord               = 0x1000,

kReadExternalReference      = 0x2000,

kReadCustomEntity           = 0x4000,// 是否读取自定义实体,如果该为项为真,则自动让kReadHandle值也为真,因为自定义实体需要名柄支持.

kReComputeDimBlock          = 0x8000,// 是否重新生成标注块 。

kReadUserDictionary         = 0x10000,// 读取命名字典下的用户字典.

kFastRelease                = 0x20000,

kReadProxyEntGet            = 0x40000,// 是否读取代理实体的entget.

kFastRead=  kReadBlockLayoutName|kNamedObjectsDictionary|kReadLayoutDict|kReadImageDict|kFastRelease|Mcad::kReadDrawOrder

};
JS代码,最快的速加载图纸,图纸内部看不见的数据,不加载:

        var param = mxOcx.NewResbuf();

        param.AddString("https://mxtmpweb.mxdraw.f3322.net:3562/test.dwg");

        param.AddLong(132440);

        mxOcx.CallEx("Mx_OpenDwgEx", param);
F. 打开有密码的DWG函数
调用我们的自定义打开文件函数,Mx_OpenDwgEx,该函数可以输入DWG文件密码,和控制那些内容加载,详细参考:(梦想CAD控件)
比如打文件,传入密码,js代码:

        var param = mxOcx.NewResbuf();

        param.AddString("D:hhhh.dwg");

        param.AddLong(0);

        // dwg文件密码

        param.AddString("password");

        mxOcx.CallEx("Mx_OpenDwgEx", param);
G. 直接修改属性DwgFilePath打开DWG文件
如下图设置,在界面启动,自动打开D:\\MyBlock.dwg:
H. 清空当前打开内容
调用控件NewFile函数,清空所有内容,比如js
mxOcx.NewFile();
I. 图纸打开完成事件
1.控件打开图纸完成后,会触发该事件,用户可以在该事件里面做一些加载图纸后的一些工作。
2.MxDrawXEvents::OpenFileComplete,详细参考:

https://www.mxdraw.com/help/frames.htm?frmname=topic&frmfile=MxDrawXLib___DMxDrawXEvents__OpenFileComplete.htm
如下图,添加事件响应,js:

function CustomEvent(sEventName)

{

    if(sEventName == "OpenFileComplete")

    {

        // 控件打开一个文件完成后会调用该事件


        alert("打开图纸完成");


    }



}
J.  保存图纸
1.调用控件SaveDwgFile保存DWG,详细说明:

https://www.mxdraw.com/help/frames.htm?frmname=topic&frmfile=MxDrawXLib___DMxDrawX__SaveDwgFile@BSTR.htm
2.该函数可以传不同的扩展名,然保存不同类型的文件,它支持保存dxf,dwf,mxg,pdf等文件格式
3.如下保存111.dwg:
mxOcx.SaveDwgFile("d:\\111.dwg");
4.调用扩展函数Mx_SetDefaultDwgVersion设置保存函数默认保存的dwg文件版本。如设置成默认保存为CAD2007文件格式的文件:
mxOcx.CallLongParam1("Mx_SetDefaultDwgVersion", 31);
函数的详细帮助如下图:
K.  保存DWG文件到服务器上
1.调用控件的SaveDwgToURL函数,把DWG文件提交到服务器上保存,详细说明:
[url=https://www.mxdraw.com/help/frames.htm?frmname=topic&frmfile=MxDrawXLib___DMxDrawX__SaveDwgToURL@BSTR@BSTR@BSTR@BSTR.htm]https://www.mxdraw.com/help/frames.htm?frmname=topic&frmfile=MxDrawXLib___DMxDrawX__SaveDwgToURL@BSTR@BSTR@BSTR@BSTR.htm[/url]
2.该函数会把当前图纸保存到一个临时文件中,然后模拟一个文件表单提交给服务器。
例如:

    if (!MxDrawXCtrl_Obj.SaveDwgToURL("http://127.0.0.1.", "/Save.aspx", "ComponentName", "6046")) {

        var ret = MxDrawXCtrl_Obj.Call("Mx_GetLastError","");

        alert(ret.AtString(0));

    }

    else {

        alert("成功");

    }
L. 保存pdf
调用控件ExprotPdf函数,把当前图纸保存为pdf文件,详细说明:(梦想CAD控件)
J. 保存JPG
1.调用控件SaveJpgFile函数,把当前图纸保存为jpg文件,详细说明:(梦想CAD控件)
2.调用控件DrawToJpg函数,把当前显示的指定区域内的图形输出到jpg文件,详细说明:(梦想CAD控件)
3.调用控件自定义函数:Mx_WriteJpgToURL,把控前图形保存为jpg文件,并当着一个文件表单提交给服务器,详细说明:(梦想CAD控件)
比较
A全图比较
1.怎么比较两个CAD图纸文件修改前后的不同部分呢?在工程图纸设计中,我们更多情况下可能需要对同一张工程图的前后修改部分进行对比,以确定工程图纸的改动部分及追溯原因,本教程演示了几种常见的比较方法。
点击此处演示
2.实现图纸比较功能,首先将两个控件放入网页中,js代码如下:

<p align="center">


  <object classid="clsid:74A777F8-7A8F-4e7c-AF47-7074828086E2" id="MxDrawXCtrl1"  codebase="http://www.mxdraw.com/MxDrawX52.CAB#version=7.0.0.1" width=48% height=85% align="left">

    <param name="_Version" value="65536">

    <param name="_ExtentX" value="24262">

    <param name="_ExtentY" value="16219">

    <param name="_StockProps" value="0">

    <param name="IsRuningAtIE" value="1">

    <param name="EnablePrintCmd" value="1">

    <param name="ShowStatusBar" value="1">

    <param name="ShowMenuBar" value="1">

    <param name="ShowToolBars"  value="1">

    <param name="ShowCommandWindow" value="1">

    <param name="ShowModelBar" value="1">

    <param name="Iniset" value="AutoActive=N,LoadMrx=PropertyEditor">


    <param name="ToolBarFiles" value="MxDraw-ToolBar.mxt,MxDraw-ToolBar-DrawParam.mxt,MxDraw-ToolBar-Draw.mxt,MxDraw-ToolBar-Edit.mxt">

    <SPAN STYLE="color:red">不能装载CAD控件。请确认你可以连接网络或者检查浏览器的选项中安全设置。<a href="http://www.mxdraw.com/MxDrawX52.msi">http://www.mxdraw.com/MxDrawX52.msi 安载CAD控件</a></SPAN>

  </object>

  <object classid="clsid:74A777F8-7A8F-4e7c-AF47-7074828086E2" id="MxDrawXCtrl2"  codebase="http://www.mxdraw.com/MxDrawX52.CAB#version=7.0.0.1"width=48% height=85% align="right">

    <param name="_Version" value="65536">

    <param name="_ExtentX" value="24262">

    <param name="_ExtentY" value="16219">

    <param name="_StockProps" value="0">

    <param name="IsRuningAtIE" value="1">

    <param name="EnablePrintCmd" value="1">

    <param name="ShowStatusBar" value="1">

    <param name="ShowMenuBar" value="1">

    <param name="ShowToolBars"  value="1">

    <param name="ShowCommandWindow" value="1">

    <param name="ShowModelBar" value="1">

    <param name="Iniset" value="AutoActive=N,LoadMrx=PropertyEditor">


    <param name="ToolBarFiles" value="MxDraw-ToolBar.mxt,MxDraw-ToolBar-DrawParam.mxt,MxDraw-ToolBar-Draw.mxt,MxDraw-ToolBar-Edit.mxt">

    <SPAN STYLE="color:red">不能装载CAD控件。请确认你可以连接网络或者检查浏览器的选项中安全设置。<a href="http://www.mxdraw.com/MxDrawX52.msi">http://www.mxdraw.com/MxDrawX52.msi 安载CAD控件</a></SPAN>

  </object>
3.首先通过id得到两个控件,返回控件的数据库对象,把两个控件里面不同的内容标记出来,具体实现js代码如下:

function AllCompare() {

    var ocx1 = document.getElementById("MxDrawXCtrl1");

    var ocx2 = document.getElementById("MxDrawXCtrl2");


    var database1 = ocx1.GetDatabase();

    var database2 = ocx2.GetDatabase();


    var filter = ocx1.NewResbuf();

    var compare1 = ocx1.NewComObject("IMxDrawCompare");

    //开始比较

    //参数一为比较时使用的原始文件 参数二为修改后的,新的文件 参数三为过滤条件

    compare1.Do(database1, database2, filter);

    //返回比较后,被修改的曲线id

    var aryDifferent1 = compare1.GetCurveIdsOfTheDifferent();

    //把修改的地方,标记出来

    //参数一为缩放比例

    //参数二为当前图纸,是新修改的图纸,该变量为true,那么在原图不能找到的对象,为新增加对象

    compare1.DrawFlag(1.0,false);

    // 反过来比较一下,用来确定,那些对象是新增加的。

    var compare2 = ocx1.NewComObject("IMxDrawCompare");


    compare2.Do(database2, database1, filter);


    var aryDifferent2 = compare2.GetCurveIdsOfTheDifferent();


    compare2.DrawFlag(1.0,true);


    var iErase = 0;

    var iModify = 0;

    var iAdd = 0;


    for (var i = 0;i < aryDifferent1.Count; i++)

    {

        //返回链表中的指定位置的对象id

        var lId = aryDifferent1.AtObjectId(i);

        //返回比较后,被修改的曲线的位置。用于图上标记被修改的对象

        if(compare1.GetIsErase(lId))

        {

            iErase = iErase + 1;

        }

        else

        {

            iModify = iModify +1;

        }

    }

    for(var i = 0; i < aryDifferent2.Count;i++)

    {

        var lId = aryDifferent2.AtObjectId(i);

        if(compare2.GetIsErase(lId))

        {

            iAdd = iAdd + 1;

        }

    }


    var modfColor = ocx1.NewComObject("IMxDrawModifyTheColor");

    modfColor.Do(ocx1.GetDatabase(),3289650);

    //把指定实体颜色

    modfColor.DoEntity(aryDifferent1,255);


    alert(iModify + "对象修改," + iErase + "对象删除," + iAdd + "对象被增加");

}
4.网页中演示效果如下,用户可以比教在两个控件里面的图纸内容。
B选择范围比较
1.首先通过id得到两个控件,返回控件的数据库对象,把两个控件里面不同的内容标记出来,具体实现js代码如下:

function DoImpCompare(points, filter) {


    var ocx1 = document.getElementById("MxDrawXCtrl1");

    var ocx2 = document.getElementById("MxDrawXCtrl2");


    var database1 = ocx1.GetDatabase();

    var database2 = ocx2.GetDatabase();


    var compare1 = ocx1.NewComObject("IMxDrawCompare");

    compare1.Bound = points;


    compare1.Do(database1, database2, filter);


    var aryDifferent1 = compare1.GetCurveIdsOfTheDifferent();


    compare1.DrawFlag(1.0, false);

    // 反过来比较一下,用来确定,那些对象是新增加的。

    var compare2 = ocx1.NewComObject("IMxDrawCompare");

    compare2.Bound = points;

    compare2.Do(database2, database1, filter);


    var aryDifferent2 = compare2.GetCurveIdsOfTheDifferent();

   

    compare2.DrawFlag(1.0, true);

   

    var iErase = 0;

    var iModify = 0;

    var iAdd = 0;

    for (var i = 0; i < aryDifferent1.Count; i++) {

        var lId = aryDifferent1.AtObjectId(i);

        if (compare1.GetIsErase(lId)) {

            iErase = iErase + 1;

        }

        else {

            iModify = iModify + 1;

        }

    }

    for (var i = 0; i < aryDifferent2.Count; i++) {

        var lId = aryDifferent2.AtObjectId(i);

        if (compare2.GetIsErase(lId)) {

            iAdd = iAdd + 1;

        }

    }

    alert(iModify + "对象修改," + iErase + "对象删除," + iAdd + "对象被增加");

}
2.用户可以选取范围内的图纸作比较,具体实现js代码如下:

function BoundCompare() {


    var ocx1  = document.getElementById("MxDrawXCtrl1");

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

    getPt.message = "点取第一点";

    if(getPt.go() != 1)

        return;

    var frstPt = getPt.value();

    var getCorner = ocx1.NewUtility();

    var secondPt =  getCorner.GetCorner(frstPt,"点取第二点:");

    if(secondPt == null)

        return;

    var points = ocx1.NewComObject("IMxDrawPoints");

    points.Add2(frstPt);

    points.Add2(secondPt);

    var filter = ocx1.NewResbuf();

    DoImpCompare( points, filter);

}
3.网页中演示效果如下,用户可以比教在两个控件里面的图纸内容。
C选择圆形范围比较
1.通过圆形范围把两个控件里面不同的内容标记出来,首先需要动态画一个圆,具体实现js代码如下:

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

    var sGuid = pData.Guid;

    var ocx1 = document.getElementById("MxDrawXCtrl1");

    ocx1.SetEventRet(0);

    if (sGuid == "DrawCircle") {

        var pt1 = pData.GetPoint("pt1");

        if (pt1 == null)

            return;

        var pt2 = ocx1.NewPoint();

        pt2.x = dX;

        pt2.y = dY;

        var dR = pt1.DistanceTo(pt2);

        pWorldDraw.DrawCircle(pt1.x, pt1.y, dR);

    }


}
2.用户可以选取圆形范围内的图纸作比较,具体实现js代码如下:

function CircleCompare() {

    var mxOcx  = document.getElementById("MxDrawXCtrl1");

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

    getPt1.message = "指定圆心";

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

        return;

    }

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

    getPt2.message = "指定圆上一点";

    getPt2.basePoint = getPt1.value();

    var spDrawData = getPt2.InitUserDraw("DrawCircle");

    spDrawData.SetPoint("pt1", getPt1.value());

    getPt2.setUseBasePt(true);

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

        return;

    }

    var cen = getPt1.value();

    var pt2 = getPt2.value();

    var dR = cen.DistanceTo(pt2);

    var circle = mxOcx.NewEntity("IMxDrawCircle");

    circle.Center = cen;

    circle.Radius = dR;

    var points = circle.GetSamplePoints(0.1);


    if (points.Count < 3) {

        alert("圆太小");

    }

    var filter = mxOcx.NewResbuf();

    DoImpCompare(points, filter);

}
3.网页中演示效果如下,用户可以比教在两个控件里面的图纸内容。







您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 02:55 , Processed in 0.200319 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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