天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 150|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    半小时前
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    115

    主题

    11

    回帖

    1393

    积分

    管理员

    积分
    1393
    QQ
    发表于 2024-3-14 21:04:12 | 显示全部楼层 |阅读模式
    1. 图层操作
    2. DWG数据库中,图层存放在图层层表中,层表类名:MxDrawLayerTable,它的详细接口说明参考:层表中每一条记录称为层表记录,类名:MxDrawLayerTableRecord,
    3. 每一个层,有颜色,线型,关闭/打开,冻结等属性,DWG数据库默认总是有一个"0"层,该层不能被删除。
    4. 视频演示:A. 当前层
    5. 当前层表示DWG数据库默认层,向数据库中添加一个对象时,默认放到该层上,该属性随图存放,通过系统变量CLAYER操作
    6. 设置当前层代码JS:
    7.     // 新建一个图层
    8.     mxOcx.AddLayer("MyLayerName");
    9.     // 设置当前层
    10.     mxOcx.SetSysVarString("CLAYER", "MyLayerName");
    11.     // 设置控件Draw函数使得的层
    12.     mxOcx.LayerName = "MyLayerName";
    13. 或者这样:
    14.      // 添加层
    15.      mxOcx.AddLayer("aaaa");
    16.      // 得到当前数据库
    17.      var database = mxOcx.GetDatabase();
    18.      // 设置当前层
    19.      database.CurrentlyLayerName = "aaaa";
    20. B.添加图层
    21. 调用控件AddLayer方法添加图层
    22. 例如JS代码:
    23.             // 新建一个图层
    24.             mxOcx.AddLayer("MyLayerName");
    25.             // 设置控件Draw函数使得的层
    26.             mxOcx.LayerName = "MyLayerName";
    27. 或使用层表Add方法来添加一个图层
    28.         // sNewLayerName新创建的图层名        
    29.         var sNewLayerName = "TestNewLayer";
    30.         
    31.         //返回控件的数据库对象
    32.         var database = mxOcx.GetDatabase();
    33.         
    34.         var layerTable = database.GetLayerTable();
    35.         // 向层表中新增一个层表记录
    36.         var layerTableRec = layerTable.Add(sNewLayerName);
    37.         // 设置新图层的颜色。SetRGB
    38.         var color = layerTableRec.Color;
    39.         color.SetRGB(255, 0, 0);
    40.         layerTableRec.Color = color;
    41.         // 把新建的层设置成当前层
    42.         database.CurrentlyLayerName = sNewLayerName;
    43. C.遍历所有图层
    44. 下面代码是遍历层表中所有层表记录,并得到所有图层名,在遍历的循环中,得到每个层表记录对象,可以去修改它的属性
    45. function GetAllLayer() {
    46.     var database = mxOcx.GetDatabase();
    47.     // 得到所有图层名
    48.     var sRet = null;
    49.     //返回数据库中的层表对象
    50.     var spLayerTable = database.GetLayerTable();
    51.     //创建一个遍历层表中所有图层的遍历器
    52.     var spIter = spLayerTable.NewIterator();
    53.     //移动当前遍历器位置
    54.     for(;!spIter.Done();spIter.Step(true,true))
    55.     {
    56.         //返回遍历器当前位置的记录
    57.         var spLayerRec = spIter.GetRecord();
    58.         //符号表记录名属性
    59.         var sName = spLayerRec.Name;
    60.         // 0零层不参加比较
    61.         if(sName != "0")
    62.         {
    63.             if(sRet == null)
    64.                 sRet = sName;
    65.             else
    66.             {
    67.                 sRet = sRet +","+sName;
    68.             }
    69.         }
    70.     }
    71.     alert(sRet);
    72. }
    73. D.  隐藏图层
    74. 隐藏一个图层的实现思路,得到数据库层表对象,然后根据层名得到层表记录对象,设置层表记录IsOff属性值。
    75. 例如代码,让用户在CAD图上选择一个对象,然后隐藏对象所在的图层C#:
    76.   // 隐藏选择实体的层。
    77. var ent = mxOcx.GetEntity("选择要关闭图层的实体:");
    78. if(ent == null)
    79. {
    80.     return;
    81. }
    82. if (ent == null)
    83. {
    84.     return;
    85. }
    86. var sLayerName = ent.Layer;
    87. var database = mxOcx.GetDatabase();
    88. var layerTable = database.GetLayerTable();
    89. var layerTableRec = layerTable.GetAt(sLayerName, false);
    90. if(layerTable != null)
    91. {
    92.     layerTableRec.IsOff = true;
    93. }
    94. E. 显示图层
    95. 如下例子,得到层表,然后循环得到所有层表记录,并打开图层显示
    96. 例如代码 JS:
    97. function OpenAllLayer() {
    98.     var database = mxOcx.GetDatabase();
    99.     //返回数据库中的层表对象
    100.     var spLayerTable = database.GetLayerTable();
    101.     //创建一个遍历层表中所有图层的遍历器
    102.     var spIter = spLayerTable.NewIterator();
    103.     //移动当前遍历器位置
    104.     for(;!spIter.Done();spIter.Step(true,true))
    105.     {
    106.         //返回遍历器当前位置的记录
    107.         var spLayerRec = spIter.GetRecord();
    108.         var sName = spLayerRec.Name;
    109.         var layerRec=spLayerTable.GetAt(sName,false);
    110.         if(layerRec)
    111.         {
    112.             layerRec.IsOff = false;
    113.             alert("成功显示图层");
    114.         }
    115.     }
    116. }
    117. F. 锁定图层
    118. 锁定后的图层上的实体不能编辑,但可以选择,如果想也不能选择,设置控件InitSet属性值为:SelectLockLayer=N
    119. 下面演示,遍历所有图层表记录,并设置图层为锁定状态,
    120. 例如代码 JS:
    121.   function LockeAllLayer() {
    122.     //返回控件的数据库对象
    123.     var database = mxOcx.GetDatabase();
    124.     //返回数据库中的层表对象
    125.      var layerTable = database.GetLayerTable();
    126.     //创建一个遍历层表中所有图层的遍历器
    127.     var iter = layerTable.NewIterator();
    128.     for (; !iter.Done(); iter.Step())
    129.     {
    130.         //返回遍历器当前位置的记录
    131.         var layerRec = iter.GetRecord();
    132.         layerRec.IsLocked = true;
    133.         alert("成功锁定图层");
    134.     }
    135. }
    136. F. 冻结图层
    137. 被冻结上的图层实体,不会参显示数据的生成,这样可以加快显示速度,和打开图纸的速度,它与关闭属性相比,冻结后的图层不但看不见,并且在内存中也不参加显示。
    138.              // 冻结选择实体的层。
    139.         
    140.         var ent = mxOcx.GetEntity("选择要冻结图层的实体:");
    141.         if(ent == null)
    142.         {
    143.             return;
    144.         }
    145.         if (ent == null)
    146.         {
    147.             return;
    148.         }
    149.         var sLayerName = ent.Layer;
    150.         var database = mxOcx.GetDatabase();
    151.         
    152.         var layerTable = database.GetLayerTable();
    153.         
    154.         var layerTableRec = layerTable.GetAt(sLayerName, false);
    155.         if(layerTable != null)
    156.         {
    157.             layerTableRec.IsFrozen = true;
    158.             alert("成功冻结图层");
    159.         }
    160. G.调用图层管理界面
    161. 例如代码JS:
    162. mxOcx.SendStringToExecute("MxLayerManager");
    163. H.得到图层上所有对象
    164. 我们通过构造选择集,使用图层名过虑来得到某个层上所有对象,关于选择集的类说明参考
    165. 例如代码 JS:
    166.          // 创建一个过滤数据连表对象。
    167.          var filter = mxOcx.NewResbuf();
    168.          // 把层名加入过滤条件,8是DXF组码,0表示是的是一个层名。
    169.          filter.AddStringEx("0", 8);
    170.          //定义选择集对象
    171.          var ss = mxOcx.NewSelectionSet();
    172.          // 选择图上的所有对象。
    173.          ss.Select2(5, null, null, null,filter);
    174.          var i = 0;
    175.         var listId = new Array();
    176.          // 遍历所有对象,得到对象id.
    177.          for (; i < ss.Count;i++)
    178.          {
    179.              var e =  ss.Item(i);
    180.              listId.push(e.ObjectID);
    181.          }
    182.          return listId;
    183. I. 设置指定图层上的实体不能选择
    184. 通过控件InitSet属性,来设置特定图层上的实体不能选择,有关IniSet的详细说明,
    185. 比如 JS:
    186.             // 设置Layer1,Layer2,Layer3图层上的实体不能选择
    187.             mxOcx.Iniset = "DisableSelectLayer=Layer1;Layer2;Layer3";
    188. J. 设置CAD实体对象,到指定层上
    189. 实体对象都有一个层属性,可以直接修改该属性。
    190. 比如JS:
    191.         var   ent = mxOcx.GetEntity("选择图层的实体:");
    192.         if(ent == null)
    193.         {
    194.             return;
    195.         }
    196.         if (ent == null)
    197.         {
    198.             return;
    199.         }
    200.         
    201.         // 得到数据库对象.
    202.         var database = mxOcx.GetDatabase();
    203.         // 得到层表.
    204.         var layerTable = database.GetLayerTable();
    205.         var sLayerName = "layer";
    206.         // 得到层。
    207.         var layer = layerTable.GetAt(sLayerName, true);
    208.         if (layer == null)
    209.         {
    210.             // 如果没有层,就新建一个层。
    211.             mxOcx.AddLayer(sLayerName);
    212.         }
    213.         else
    214.         {
    215.             // 如果层被删除,就反删除。
    216.             layer.SetProp("unErase", null);
    217.         }
    218.         // 设置实体层名到指定层上。
    219.         ent.Layer = sLayerName;
    220.         alert("已将该实体设置到指定图层");
    221. K.判断该层上是否有对象,是不是一个 无用 的层。
    222. 在CAD图上,一般需要遍历所有块表记录中的实体对象,才判断某个图层上是有对象实体,然后才能放心删除一个图层,因为一个图层上如果有实体对象,你删除该图层时,实体对象就会引用一个无效的图层。
    223. 所以控件专门提供一个定制函数,用来判断该图上是否有实体对象:
    224. 比如 JS:
    225.        MxDrawResbuf param = (MxDrawResbuf)axMxDrawX1.Call("ExApp采用isUselessLayer", "图层1");
    226.         if(param.AtLong(1) == 1)
    227.         {
    228.             MessageBox.Show("该图层上没有对象");
    229.         }
    230. L.删除数据库所有无用的图层
    231. 我们提供一个定制函数,来遍历图上的所有对象,判断出图层上没有对象,然后删除。
    232. 比如 JS:
    233. axMxDrawX1.Cal("ExApp采用DeleteUselessLayer");
    234. M.修改图层亮度
    235. 控件提供,让CAD图层上的所有对象,按指定亮度显示功能,比如亮度设置0,表示对象显示成灰色,一般一些背景不让修改的对象放在背景层上,然后把亮度设置成0.
    236. Mx采用SetLayerBright 函数详细说明,Mx采用SetBright 函数详细说明:
    237. 例如设置图层 222按50%显示, JS代码:
    238.     var param = mxOcx.NewResbuf();
    239. // 图层名
    240.     param.AddStringEx("222");
    241. // 图层亮度.
    242.     param.AddDoubleEx(50);
    243. // 不自动调用更新函数。
    244.     param.AddLongEx(0);
    245.     mxOcx.CallEx("Mx采用SetLayerBright", param);
    246. N. 得到图层亮度
    247. 下面是得到图层的亮度,222表示的是图层名字。
    248. JS代码:
    249.     var ret = mxOcx.Call("Mx采用GetLayerBright", "222");
    250.     if (ret.AtString(0) == "Ok")
    251.     {
    252.         alert(ret.AtDouble(1).toString());
    253.     }
    254. O. 删除图层
    255. 在删除图层前,最好判断一个该图层上是否有CAD绘图对象,如果有的话就不要删除图层
    256. JS代码:
    257. private bool DeleteLayer(String sLayerName)
    258.         {
    259.             // 判断图上是否对象。
    260.             MxDrawResbuf param = (MxDrawResbuf)axMxDrawX1.Call("ExApp采用isUselessLayer", sLayerName);
    261.             if (param.AtLong(1) != 1)
    262.             {
    263.                 // 图上还有对象,不能删除。
    264.                 return false;
    265.             }
    266.             // 得到数据库对象.
    267.             MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();
    268.             // 得到层表.
    269.             MxDrawLayerTable layerTable = database.GetLayerTable();
    270.             // 得到层。
    271.             MxDrawLayerTableRecord layer = layerTable.GetAt(sLayerName, false);
    272.             if (layer == null)
    273.             {
    274.                 // 没有该层
    275.                 return false;
    276.             }
    277.             else
    278.             {
    279.                 // 删除图层。
    280.                 layer.Erase();
    281.                 return true;
    282.             }
    283.         }
    复制代码

     

     

     

     

    [每日一码] 梦想cad在网页开发时如何获取图层操作的信息
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-5 06:02 , Processed in 0.150277 second(s), 29 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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