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