梦想cad在网页开发时如何获取图层操作的信息

 

简介

在此示例将演示如何获取CAD控件图纸上一些常用信息,如符号表(块表、层表、文字样式表、线型表、点样式表)、字典。点击此处在线演示

下面将介绍如何获取符号表的一些信息,如下图所示:

15123534486359648.png

 
 
图层操作

DWG数据库中,图层存放在图层层表中,层表类名:MxDrawLayerTable,它的详细接口说明参考:http://www.mxdraw.com/help/frames.htm?frmname=topic&frmfile=IMxDrawLayerTable.htm

层表中每一条记录称为层表记录,类名:MxDrawLayerTableRecord,它的详细接口说明参数:http://www.mxdraw.com/help/frames.htm?frmname=topic&frmfile=IMxDrawLayerTableRecord.htm

每一个层,有颜色,线型,关闭/打开,冻结等属性,DWG数据库默认总是有一个"0"层,该层不能被删除。

图层操作在线演示例子:点击此处在线演示

视频演示:

A. 当前层

当前层表示DWG数据库默认层,向数据库中添加一个对象时,默认放到该层上,该属性随图存放,通过系统变量CLAYER操作,系统变量设置参考:http://www.mxdraw.com/help_2_48.html

设置当前层代码JS:

      // 新建一个图层
      mxOcx.AddLayer("MyLayerName");
      // 设置当前层
      mxOcx.SetSysVarString("CLAYER", "MyLayerName");
      // 设置控件Draw函数使得的层
      mxOcx.LayerName = "MyLayerName";

或者这样:

       // 添加层
       mxOcx.AddLayer("aaaa");
       // 得到当前数据库
       var database = mxOcx.GetDatabase();
       // 设置当前层
       database.CurrentlyLayerName = "aaaa";

B.添加图层

调用控件AddLayer方法添加图层,详细接口说明见:http://www.mxdraw.com/help/frames.htm?frmname=topic&frmfile=MxDrawXLib___DMxDrawX__AddLayer@BSTR.htm

例如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.得到图层上所有对象

我们通过构造选择集,使用图层名过虑来得到某个层上所有对象,关于选择集的类说明参考:http://www.mxdraw.com/help/frames.htm?frmname=topic&frmfile=IMxDrawSelectionSet.htm

例如代码 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的详细说明,参考:http://www.mxdraw.com/help/MxDrawXLib___DMxDrawX__Iniset.htm

比如 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 函数详细说明,参考:http://www.mxdraw.com/help/MxDrawXCustomFunction__Mx_SetLayerBright@LPCTSTR@DOUBLE@LONG.htm

Mx_SetBright&nbsp;函数详细说明,参考:http://www.mxdraw.com/help/MxDrawXCustomFunction__Mx_SetBright@IN_LONG@CString.htm

例如设置图层 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;
              }
          }

posted on 2021-06-10 16:58  梦想CAD控件  阅读(194)  评论(0)    收藏  举报

导航