梦想CAD控件如何打开保存图纸,图纸比较呢
cad梦想画图
2021年06月07日 11:25:10
只看楼主

打开保存图纸 我们控件提供一些打开,保存图纸的函数,下面详细说明一下: A.  在软件启动时,自动打开图纸 调用控件函数:OpenDwgFile,详细说明参考.该函数支持打开dxf,dwg,dwf,png,jpg,bmp,mxg文件 比如js语言: 首先响应控件初始化完成事件,在控件初化完成后,调用OpenDwgFile打开图纸 增加用户自定义事件发生事件响应函数: document.getElementById("MxDrawXCtrl").ImplementCustomEvent = CustomEvent;

打开保存图纸

我们控件提供一些打开,保存图纸的函数,下面详细说明一下:

A.  在软件启动时,自动打开图纸

调用控件函数:OpenDwgFile,详细说明参考.该函数支持打开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函数

该函数把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. 最快方式 加载图纸

DWG图纸中有很多看不见的数据,控件打开文件时,可以设置那些内容不让加载,来提高打开文件速度。

比如, 设置控件的Iniset属性的值 READCONTENT=132440最快方式打开图纸, 132440就一个位运算出来的数值,每个二进位代表是需要加那些内容,

js设置如下:

kuaisujiazai.png

每个二进制位代表含义:


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文件密码,和控制那些内容加载

比如打文件,传入密码,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:

EZU(JL`UY[@DCX$G_R{QCVE.png

H. 清空当前打开内容

调用控件NewFile函数,清空所有内容,比如js

mxOcx.NewFile();

I. 图纸打开完成事件

控件打开图纸完成后,会触发该事件,用户可以在该事件里面做一些加载图纸后的一些工作。

MxDrawXEvents::OpenFileComplete

如下图,添加事件响应,js:


function CustomEvent(sEventName)

{

if(sEventName == "OpenFileComplete")

{

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



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



}





}

J.  保存图纸

调用控件SaveDwgFile保存DWG,详细说明

该函数可以传不同的扩展名,然保存不同类型的文件,它支持保存dxf,dwf,mxg,pdf等文件格式

如下保存111.dwg:

mxOcx.SaveDwgFile("d:\\111.dwg");

调用扩展函数Mx_SetDefaultDwgVersion设置保存函数默认保存的dwg文件版本

如设置成默认保存为CAD2007文件格式的文件:

mxOcx.CallLongParam1("Mx_SetDefaultDwgVersion", 31);

函数的详细帮助如下图:

s1.png

K.  保存DWG文件到服务器上

调用控件的SaveDwgToURL函数,把DWG文件提交到服务器上保存

该函数会把当前图纸保存到一个临时文件中,然后模拟一个文件表单提交给服务器。

例如:


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

J. 保存JPG

调用控件SaveJpgFile函数,把当前图纸保存为jpg文件

调用控件DrawToJpg函数,把当前显示的指定区域内的图形输出到jpg文件

调用控件自定义函数:Mx_WriteJpgToURL,把控前图形保存为jpg文件,并当着一个文件表单提交给服务器

比较

全图比较

怎么比较两个CAD图纸文件修改前后的不同部分呢?在工程图纸设计中,我们更多情况下可能需要对同一张工程图的前后修改部分进行对比,以确定工程图纸的改动部分及追溯原因,本教程演示了几种常见的比较方法。

实现图纸比较功能,首先将两个控件放入网页中,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 + "对象被增加");

}

首先通过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 + "对象被增加");

}

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

<img  data-cke-saved-src='https://image.co188.com/x2/static/image/smiley/coface/4UK2.gif' src='https://image.co188.com/x2/static/image/smiley/coface/4UK2.gif'/>HF[TVR]5%S2G6Z(KA.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);

}

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

<img  data-cke-saved-src='https://image.co188.com/x2/static/image/smiley/coface/4UK2.gif' src='https://image.co188.com/x2/static/image/smiley/coface/4UK2.gif'/>HF[TVR]5%S2G6Z(KA.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);

}

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

<img  data-cke-saved-src='https://image.co188.com/x2/static/image/smiley/coface/4UK2.gif' src='https://image.co188.com/x2/static/image/smiley/coface/4UK2.gif'/>HF[TVR]5%S2G6Z(KA.png

免费打赏

相关推荐

APP内打开