乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 26|回复: 0

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

[复制链接]

135

主题

144

帖子

4

银币

中流砥柱

Rank: 25

铜币
684
发表于 2021-6-7 10:41:00 | 显示全部楼层 |阅读模式
打开保存图纸
我们控件提供一些打开,保存图纸的函数,下面详细说明一下:A.  在软件启动时,自动打开图纸1.调用控件函数:OpenDwgFile,详细说明参考: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函数,打开一个比如: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

zbmczs2jvly.png

zbmczs2jvly.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文件密码,和控制那些内容加载,详细参考:(梦想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:

kxlezayajd4.png

kxlezayajd4.png

H. 清空当前打开内容调用控件NewFile函数,清空所有内容,比如jsmxOcx.NewFile();I. 图纸打开完成事件1.控件打开图纸完成后,会触发该事件,用户可以在该事件里面做一些加载图纸后的一些工作。2.MxDrawXEvents::OpenFileComplete,详细参考:
如下图,添加事件响应,js:
function CustomEvent(sEventName)
{
    if(sEventName == "OpenFileComplete")
    {
        // 控件打开一个文件完成后会调用该事件

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

    }


}J.  保存图纸1.调用控件SaveDwgFile保存DWG,详细说明:
2.该函数可以传不同的扩展名,然保存不同类型的文件,它支持保存dxf,dwf,mxg,pdf等文件格式3.如下保存111.dwg:mxOcx.SaveDwgFile("d:\\111.dwg");4.调用扩展函数Mx_SetDefaultDwgVersion设置保存函数默认保存的dwg文件版本。如设置成默认保存为CAD2007文件格式的文件:mxOcx.CallLongParam1("Mx_SetDefaultDwgVersion", 31);函数的详细帮助如下图:

peuxcztfzde.png

peuxcztfzde.png

K.  保存DWG文件到服务器上1.调用控件的SaveDwgToURL函数,把DWG文件提交到服务器上保存,详细说明:https://www.mxdraw.com/help/frames.htm?frmname=topic&frmfile=MxDrawXLib___DMxDrawX__SaveDwgToURL@BSTR@BSTR@
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. 保存JPG1.调用控件SaveJpgFile函数,把当前图纸保存为jpg文件,详细说明:(梦想CAD控件)2.调用控件DrawToJpg函数,把当前显示的指定区域内的图形输出到jpg文件,详细说明:(梦想CAD控件)3.调用控件自定义函数:Mx_WriteJpgToURL,把控前图形保存为jpg文件,并当着一个文件表单提交给服务器,详细说明:(梦想CAD控件)比较
A全图比较1.怎么比较两个CAD图纸文件修改前后的不同部分呢?在工程图纸设计中,我们更多情况下可能需要对同一张工程图的前后修改部分进行对比,以确定工程图纸的改动部分及追溯原因,本演示了几种常见的比较方法。
2.实现图纸比较功能,首先将两个控件放入网页中,js代码如下:

  
   
   
   
   
   
   
   
   
   
   
   
   

   
    不能装载CAD控件。请确认你可以连接网络或者检查浏览器的选项中安全设置。
  
  
   
   
   
   
   
   
   
   
   
   
   
   

   
    不能装载CAD控件。请确认你可以连接网络或者检查浏览器的选项中安全设置。
  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

gdqgztu15kl.png

gdqgztu15kl.png

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

41gowtcebxs.png

41gowtcebxs.png

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

cxyipvn5rsu.png

cxyipvn5rsu.png


本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 01:12 , Processed in 0.146763 second(s), 57 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表