找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 637|回复: 0

[每日一码] 梦想cad在网页开发时如何获取图层操作的信息

[复制链接]
发表于 2021-6-15 15:17:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×


简介
在此示例将演示如何获取CAD控件图纸上一些常用信息,如符号表(块表、层表、文字样式表、线型表、点样式表)、字典
下面将介绍如何获取符号表的一些信息,如下图所示:
梦想cad在网页开发时如何获取图层操作的信息-1.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 函数详细说明,Mx_SetBright 函数详细说明:
例如设置图层 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;

            }

        }



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-24 22:40 , Processed in 0.247362 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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