控件在网页CAD开发时如何打开保存图纸,进行图纸比较
我们控件提供一些打开,保存图纸的函数,下面详细说明一下:
A. 在软件启动时,自动打开图纸
调用控件函数:OpenDwgFile,详细说明参考:http://www.mxdraw.com/help/MxDrawXLib___DMxDrawX__OpenDwgFile@BSTR.htm
该函数支持打开dxf,dwg,dwf,png,jpg,bmp,mxg文件
比如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函数,详细:http://www.mxdraw.com/help/MxDrawXLib___DMxDrawX__OpenBackgroundFile@BSTR@VARIANT_BOOL@LONG@VARIANT_BOOL@VARIANT_BOOL.htm
该函数把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[i].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. 最快方式 加载图纸
DWG图纸中有很多看不见的数据,控件打开文件时,可以设置那些内容不让加载,来提高打开文件速度。
比如, 设置控件的Iniset属性的值 READCONTENT=132440最快方式打开图纸, 132440就一个位运算出来的数值,每个二进位代表是需要加那些内容,
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文件密码,和控制那些内容加载,详细参考:
http://www.mxdraw.com/help/MxDrawXCustomFunction__Mx_OpenDwgEx@IN_CString@IN_LONG@IN_CString.htm
比如打文件,传入密码,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. 图纸打开完成事件
控件打开图纸完成后,会触发该事件,用户可以在该事件里面做一些加载图纸后的一些工作。
MxDrawXEvents::OpenFileComplete,详细参考:http://www.mxdraw.com/help/MxDrawXLib___DMxDrawXEvents__OpenFileComplete.htm
如下图,添加事件响应,js:
| function CustomEvent(sEventName) | |
| { | |
| if(sEventName == "OpenFileComplete") | |
| { | |
| // 控件打开一个文件完成后会调用该事件 | |
| alert("打开图纸完成"); | |
| } | |
| } |
J. 保存图纸
调用控件SaveDwgFile保存DWG,详细说明:http://www.mxdraw.com/help/MxDrawXLib___DMxDrawX__SaveDwgFile@BSTR.htm
该函数可以传不同的扩展名,然保存不同类型的文件,它支持保存dxf,dwf,mxg,pdf等文件格式
如下保存111.dwg:
mxOcx.SaveDwgFile("d:\\111.dwg");
调用扩展函数Mx_SetDefaultDwgVersion设置保存函数默认保存的dwg文件版本
如设置成默认保存为CAD2007文件格式的文件:
mxOcx.CallLongParam1("Mx_SetDefaultDwgVersion", 31);
函数的详细帮助如下图:

K. 保存DWG文件到服务器上
调用控件的SaveDwgToURL函数,把DWG文件提交到服务器上保存,详细说明:
http://www.mxdraw.com/help/MxDrawXLib___DMxDrawX__SaveDwgToURL@BSTR@BSTR@BSTR@BSTR.htm
该函数会把当前图纸保存到一个临时文件中,然后模拟一个文件表单提交给服务器。
例如:
| 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文件,详细说明:
http://www.mxdraw.com/help/MxDrawXLib___DMxDrawX__ExprotPdf@BSTR@DOUBLE@DOUBLE@BSTR@VARIANT_BOOL.htm
J. 保存JPG
调用控件SaveJpgFile函数,把当前图纸保存为jpg文件,详细说明:
http://www.mxdraw.com/help/MxDrawXLib___DMxDrawX__SaveJpgFile@BSTR@LONG@LONG@LONG.htm
调用控件DrawToJpg函数,把当前显示的指定区域内的图形输出到jpg文件,详细说明:
调用控件自定义函数:Mx_WriteJpgToURL,把控前图形保存为jpg文件,并当着一个文件表单提交给服务器,详细说明:
全图比较
怎么比较两个CAD图纸文件修改前后的不同部分呢?在工程图纸设计中,我们更多情况下可能需要对同一张工程图的前后修改部分进行对比,以确定工程图纸的改动部分及追溯原因,本教程演示了几种常见的比较方法。点击此处在线演示。
实现图纸比较功能,首先将两个控件放入网页中,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> |
首先通过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 + "对象被增加"); | |
| } |
网页中演示效果如下,用户可以比教在两个控件里面的图纸内容。
![@4UK2@HF[TVR]5%S2G6Z(KA.png @4UK2@HF[TVR]5%S2G6Z(KA.png](http://help.mxdraw.com/images/editor/20180823/15350078776886167.png)
选择范围比较
首先通过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 + "对象被增加"); | |
| } |
用户可以选取范围内的图纸作比较,具体实现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); | |
| } |
网页中演示效果如下,用户可以比教在两个控件里面的图纸内容。
![@4UK2@HF[TVR]5%S2G6Z(KA.png @4UK2@HF[TVR]5%S2G6Z(KA.png](http://help.mxdraw.com/images/editor/20180823/15350078852824109.png)
选择圆形范围比较
通过圆形范围把两个控件里面不同的内容标记出来,首先需要动态画一个圆,具体实现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); | |
| } | |
| } |
用户可以选取圆形范围内的图纸作比较,具体实现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); | |
| } |
网页中演示效果如下,用户可以比教在两个控件里面的图纸内容。
![@4UK2@HF[TVR]5%S2G6Z(KA.png @4UK2@HF[TVR]5%S2G6Z(KA.png](http://help.mxdraw.com/images/editor/20180823/15350078966123716.png)
浙公网安备 33010602011771号