TA的每日心情 | 开心 半小时前 |
---|
签到天数: 20 天 [LV.4]偶尔看看III
管理员
- 积分
- 1393
|
- 图层操作
- 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;
- }
- }
复制代码 |
|