乐筑天下

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

梦想CAD网页开发--图层的相关信息操作

[复制链接]

135

主题

144

帖子

4

银币

中流砥柱

Rank: 25

铜币
684
发表于 2021-6-10 16:55:00 | 显示全部楼层 |阅读模式
简介
在此示例将演示如何获取CAD控件图纸上一些常用信息,如符号表(块表、层表、文字样式表、线型表、点样式表)、字典。。下面将介绍如何获取符号表的一些信息,如下图所示:

afee4rxwruy.png

afee4rxwruy.png


图层操作
DWG数据库中,图层存放在图层层表中,层表类名:MxDrawLayerTable,它的详细接口说明参考:层表中每一条记录称为层表记录,类名:MxDrawLayerTableRecord,它的详细接口说明参数:每一个层,有颜色,线型,关闭/打开,冻结等属性,DWG数据库默认总是有一个"0"层,该层不能被删除。图层操作在线演示例子:A. 当前层当前层表示DWG数据库默认层,向数据库中添加一个对象时,默认放到该层上,该属性随图存放,通过系统变量CLAYER操作,系统变量设置参考:设置当前层代码JS:
    // 新建一个图层
    mxOcx.AddLayer("MyLayerName");
    // 设置当前层
    mxOcx.SetSysVarString("CLAYER", "MyLayerName");
    // 设置控件Draw函数使得的层
    mxOcx.LayerName = "MyLayerName";或者这样:
     // 添加层
     mxOcx.AddLayer("aaaa");
     // 得到当前数据库
     var database = mxOcx.GetDatabase();
     // 设置当前层
     database.CurrentlyLayerName = "aaaa";B.添加图层调用控件AddLayer方法添加图层,详细接口说明见:例如JS代码:
            // 新建一个图层
            mxOcx.AddLayer("MyLayerName");
            // 设置控件Draw函数使得的层
            mxOcx.LayerName = "MyLayerName";或使用层表Add方法来添加一个图层
        // sNewLayerName新创建的图层名        
        var sNewLayerName = "TestNewLayer";
        
        //返回控件的数据库对象
        var database = mxOcx.GetDatabase();
        
        var layerTable = database.GetLayerTable();
        // 向层表中新增一个层表记录
        var layerTableRec = layerTable.Add(sNewLayerName);
        // 设置新图层的颜色。SetRGB
        var color = layerTableRec.Color;
        color.SetRGB(255, 0, 0);
        layerTableRec.Color = color;
        // 把新建的层设置成当前层
        database.CurrentlyLayerName = sNewLayerName;C.遍历所有图层下面代码是遍历层表中所有层表记录,并得到所有图层名,在遍历的循环中,得到每个层表记录对象,可以去修改它的属性
function GetAllLayer() {
    var database = mxOcx.GetDatabase();
    // 得到所有图层名
    var sRet = null;
    //返回数据库中的层表对象
    var spLayerTable = database.GetLayerTable();
    //创建一个遍历层表中所有图层的遍历器
    var spIter = spLayerTable.NewIterator();
    //移动当前遍历器位置
    for(;!spIter.Done();spIter.Step(true,true))
    {
        //返回遍历器当前位置的记录
        var spLayerRec = spIter.GetRecord();
        //符号表记录名属性
        var sName = spLayerRec.Name;
        // 0零层不参加比较
        if(sName != "0")
        {
            if(sRet == null)
                sRet = sName;
            else
            {
                sRet = sRet +","+sName;
            }
        }
    }
    alert(sRet);
}D.  隐藏图层隐藏一个图层的实现思路,得到数据库层表对象,然后根据层名得到层表记录对象,设置层表记录IsOff属性值。例如代码,让用户在CAD图上选择一个对象,然后隐藏对象所在的图层C#:
  // 隐藏选择实体的层。

var ent = mxOcx.GetEntity("选择要关闭图层的实体:");
if(ent == null)
{
    return;
}
if (ent == null)
{
    return;
}
var sLayerName = ent.Layer;
var database = mxOcx.GetDatabase();

var layerTable = database.GetLayerTable();

var layerTableRec = layerTable.GetAt(sLayerName, false);
if(layerTable != null)
{
    layerTableRec.IsOff = true;
}E. 显示图层如下例子,得到层表,然后循环得到所有层表记录,并打开图层显示例如代码 JS:
function OpenAllLayer() {
    var database = mxOcx.GetDatabase();
    //返回数据库中的层表对象
    var spLayerTable = database.GetLayerTable();
    //创建一个遍历层表中所有图层的遍历器
    var spIter = spLayerTable.NewIterator();
    //移动当前遍历器位置
    for(;!spIter.Done();spIter.Step(true,true))
    {
        //返回遍历器当前位置的记录
        var spLayerRec = spIter.GetRecord();
        var sName = spLayerRec.Name;
        var layerRec=spLayerTable.GetAt(sName,false);
        if(layerRec)
        {
            layerRec.IsOff = false;
            alert("成功显示图层");
        }

    }

}F. 锁定图层锁定后的图层上的实体不能编辑,但可以选择,如果想也不能选择,设置控件InitSet属性值为:SelectLockLayer=N下面演示,遍历所有图层表记录,并设置图层为锁定状态,例如代码 JS:
  function LockeAllLayer() {
    //返回控件的数据库对象
    var database = mxOcx.GetDatabase();
    //返回数据库中的层表对象
     var layerTable = database.GetLayerTable();
    //创建一个遍历层表中所有图层的遍历器
    var iter = layerTable.NewIterator();
    for (; !iter.Done(); iter.Step())
    {
        //返回遍历器当前位置的记录
        var layerRec = iter.GetRecord();
        layerRec.IsLocked = true;
        alert("成功锁定图层");

    }
}F. 冻结图层被冻结上的图层实体,不会参显示数据的生成,这样可以加快显示速度,和打开图纸的速度,它与关闭属性相比,冻结后的图层不但看不见,并且在内存中也不参加显示。
             // 冻结选择实体的层。
        
        var ent = mxOcx.GetEntity("选择要冻结图层的实体:");
        if(ent == null)
        {
            return;
        }
        if (ent == null)
        {
            return;
        }
        var sLayerName = ent.Layer;
        var database = mxOcx.GetDatabase();
        
        var layerTable = database.GetLayerTable();
        
        var layerTableRec = layerTable.GetAt(sLayerName, false);
        if(layerTable != null)
        {
            layerTableRec.IsFrozen = true;
            alert("成功冻结图层");
        }G.调用图层管理界面例如代码JS: mxOcx.SendStringToExecute("MxLayerManager");H.得到图层上所有对象我们通过构造选择集,使用图层名过虑来得到某个层上所有对象,关于选择集的类说明参考:例如代码 JS:
         // 创建一个过滤数据连表对象。
         var filter = mxOcx.NewResbuf();
         // 把层名加入过滤条件,8是DXF组码,0表示是的是一个层名。
         filter.AddStringEx("0", 8);
         //定义选择集对象
         var ss = mxOcx.NewSelectionSet();
         // 选择图上的所有对象。
         ss.Select2(5, null, null, null,filter);
         var i = 0;
        var listId = new Array();
         // 遍历所有对象,得到对象id.
         for (; i < ss.Count;i++)
         {
             var e =  ss.Item(i);
             listId.push(e.ObjectID);
         }
         return listId;I. 设置指定图层上的实体不能选择通过控件InitSet属性,来设置特定图层上的实体不能选择,有关IniSet的详细说明,参考:比如 JS:

            // 设置Layer1,Layer2,Layer3图层上的实体不能选择
            mxOcx.Iniset = "DisableSelectLayer=Layer1;Layer2;Layer3";J. 设置CAD实体对象,到指定层上实体对象都有一个层属性,可以直接修改该属性。比如JS:
        var   ent = mxOcx.GetEntity("选择图层的实体:");
        if(ent == null)
        {
            return;
        }
        if (ent == null)
        {
            return;
        }
        
        // 得到数据库对象.
        var database = mxOcx.GetDatabase();
        // 得到层表.
        var layerTable = database.GetLayerTable();
        var sLayerName = "layer";
        // 得到层。
        var layer = layerTable.GetAt(sLayerName, true);
        if (layer == null)
        {
            // 如果没有层,就新建一个层。
            mxOcx.AddLayer(sLayerName);
        }
        else
        {
            // 如果层被删除,就反删除。
            layer.SetProp("unErase", null);
        }
        // 设置实体层名到指定层上。
        ent.Layer = sLayerName;
        alert("已将该实体设置到指定图层");K.判断该层上是否有对象,是不是一个 无用 的层。在CAD图上,一般需要遍历所有块表记录中的实体对象,才判断某个图层上是有对象实体,然后才能放心删除一个图层,因为一个图层上如果有实体对象,你删除该图层时,实体对象就会引用一个无效的图层。所以控件专门提供一个定制函数,用来判断该图上是否有实体对象:比如 JS:
       MxDrawResbuf param = (MxDrawResbuf)axMxDrawX1.Call("ExApp_isUselessLayer", "图层1");
        if(param.AtLong(1) == 1)
        {
            MessageBox.Show("该图层上没有对象");
        }L.删除数据库所有无用的图层我们提供一个定制函数,来遍历图上的所有对象,判断出图层上没有对象,然后删除。比如 JS:axMxDrawX1.Cal("ExApp_DeleteUselessLayer");M.修改图层亮度控件提供,让CAD图层上的所有对象,按指定亮度显示功能,比如亮度设置0,表示对象显示成灰色,一般一些背景不让修改的对象放在背景层上,然后把亮度设置成0.Mx_SetLayerBright 函数详细说明,参考:[url=http://www.mxdraw.com/help/MxDrawXCustomFunction__Mx_SetLayerBright@LPCTSTR@DOUBLE@LONG.htm]http://www.mxdraw.com/help/MxDrawXCustomFunction__Mx_SetLayerBright@LPCTSTR@DOUBLE@LONG.htm[/url][url=http://www.mxdraw.com/help/MxDrawXCustomFunction__Mx_SetLayerBright@LPCTSTR@DOUBLE@LONG.htm][/url]Mx_SetBright 函数详细说明,参考:http://www.mxdraw.com/help/MxDrawXCustomFunction__Mx_SetBright@[/url]例如设置图层 222按50%显示, JS代码:
    var param = mxOcx.NewResbuf();

// 图层名
    param.AddStringEx("222");

// 图层亮度.
    param.AddDoubleEx(50);

// 不自动调用更新函数。
    param.AddLongEx(0);

    mxOcx.CallEx("Mx_SetLayerBright", param);N. 得到图层亮度下面是得到图层的亮度,222表示的是图层名字。JS代码:
    var ret = mxOcx.Call("Mx_GetLayerBright", "222");
    if (ret.AtString(0) == "Ok")
    {
        alert(ret.AtDouble(1).toString());
    }O. 删除图层在删除图层前,最好判断一个该图层上是否有CAD绘图对象,如果有的话就不要删除图层JS代码:
private bool DeleteLayer(String sLayerName)
        {
            // 判断图上是否对象。
            MxDrawResbuf param = (MxDrawResbuf)axMxDrawX1.Call("ExApp_isUselessLayer", sLayerName);
            if (param.AtLong(1) != 1)
            {
                // 图上还有对象,不能删除。
                return false;
            }
            // 得到数据库对象.
            MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();
            // 得到层表.
            MxDrawLayerTable layerTable = database.GetLayerTable();
            // 得到层。
            MxDrawLayerTableRecord layer = layerTable.GetAt(sLayerName, false);
            if (layer == null)
            {
                // 没有该层
                return false;
            }
            else
            {
                // 删除图层。
                layer.Erase();
                return true;
            }
        }
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 02:05 , Processed in 0.143271 second(s), 57 queries .

© 2020-2024 乐筑天下

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