一、图层介绍

我们可以把图层想象为一张没有厚度的透明纸,各层之间完全对齐,一层上的某一基准点准确地对准其他各层上的同一基准点。用户可以给每一图层指定所用的线型、颜色,并将具有相同线型和颜色的对象放在统一图层,这些图层叠放在一起就构成了一幅完整的图形。

二、图层的特点

用户可以在一幅图中指定任意数量的图层,并对图层数量没有限制。每一图层有一个名称,以便管理。一般情况下,一个图层上的对象应该是一种线型、一种颜色。各图层具有相同的坐标系,绘图界限,显示时的缩放倍数。用户只能在当前图层上绘图,可以对各图层进行“打开”、“关闭”、“冻结”、“解冻”、“锁定”等操作管理。

三、图层管理

1、关闭、打开、增加图层、删除图层、关闭所有图层、选择关闭部分图层和反选。

2、单击菜单栏“格式->图层”显示图层管理界面。

3、(1)单击特性工具栏“关闭和打开图层”按钮,如下图:

  

CAD图层操作_图层

(2)也可在工具栏点击

CAD图层操作_c#_02

,效果图如下:    

CAD图层操作_图层_03

(3)点击高级管理,效果图如下:

    

CAD图层操作_c#_04

(4)在高级管理中可以一键选择关闭所有图层,也可增加新图层以及删除图层,可以单击击

CAD图层操作_c#_05

关闭该图层,在此单击则打开该图层。选择关闭效果图如下 :   

CAD图层操作_数据库_06

(5)反选之后效果如下:

   

CAD图层操作_数据库_07

(6)新建图层还可以直接单击图标

CAD图层操作_c#_08

,效果图如下: 

CAD图层操作_c#_09

4、(1)在命令行中输入MxLayerManager,按回车键。

(2)执行命令后,命令行将显示如下信息:命令: MxLayerManager

名称:用于显示各图层的名称,默认图层为“0”,各图层不能重名。

可见:点击可见,显示或隐藏图纸。

颜色:用于显示各图层设置的颜色。

锁定:锁定或解锁图层,锁定状态并不影响该图层上图形对象的显示,用户不能编辑锁定图层上的对象,但还可以在锁定的图层中绘制新图形的对象。此外。还可以在锁定的图层上使用查询命令和对象捕捉功能。

冻结:冻结或解冻对象,图层被冻结,该图层上的图形对象不能被显示出来,也不能打印输出,而且也不能编辑或修改;图层处于解冻状态时,该图层上的图形对象能够显示出来,也能够打印,并且可以在该图层上编辑图形对象。从可见性来说冻结图层与关闭图层是相同的,但冻结的对象不参加处理过程中的运算,关闭的图层则要参加运算,所以在复杂的图形中冻结不需要的图层中可以加快系统重新生成图形的速度。

注意不能冻结当前层,也不能将冻结层改为当前层。

线型:用于显示各图层的图线宽度。

删除图层:用于删除图层。

4、下列四种图层不可删除:(1)图层0和定义点;(2)当前图层;(3)依赖外部参照的图层;(4)包含对象的图层。

5、若是开发人员想要进行二次开发,下面将讲解有关图层的基本操作:

(1)新建图层CAD中我们设置好图层后除了我们平常的绘图时选择线段的颜色,线型,线宽等作用,而且我们还可以在出图时选择性显示图形,冻结图形,已达到我们想要的效果。

主要用到函数说明:_DMxDrawX::AddLayer   

增加新的图层。详细说明如下:

参数

说明

BSTR pszName

图层名

IMxDrawMcCmColor::SetRGB

设置颜色的RGB色。详细说明如下:

参数

说明

[in] LONG lRed

红色

[in] LONG lGreen

绿色

[in] LONG lBlue

蓝色

c#中实现代码说明:

private void CreateLayer()
{
// sNewLayerName新创建的图层名
string sNewLayerName = "TestNewLayer";
MxDrawApplication app = new MxDrawApplication();

// 得到当前数据为的层表对象
MxDrawLayerTable layerTable = app.WorkingDatabase().GetLayerTable();

// 向层表中新增一个层表记录
MxDrawLayerTableRecord layerTableRec = layerTable.Add(sNewLayerName);

// 设置新图层的颜色。SetRGB
MxDrawMcCmColor color = new MxDrawMcCmColor();
color.SetRGB(255, 0, 0);
layerTableRec.Color = color;

// 把新建的层设置成当前层
app.WorkingDatabase().CurrentlyLayerName = sNewLayerName;
}

js中实现代码说明:

function CreateLayer() {
//增加新的图层
var layerId = mxOcx.AddLayer("自定义图层");
//返回控件的数据库对象
var database = mxOcx.GetDatabase();
//实体id返回实体对象
var layer = database.ObjectIdToObject(layerId);
//返回图层的颜色
var newColor = layer.Color;
//设置图层颜色
newColor.SetRGB(255,0,0);
//将设置的颜色赋值给图层
layer.Color = newColor;
//当前绘图函数的使用的图层名
mxOcx.LayerName = "自定义图层";
//当前控件绘图函数使用的CAD颜色索引值
mxOcx.DrawCADColorIndex = 256;
}

(2)隐藏图层

主要用到函数说明:IMxDrawLayerTable::GetAt

得到层表中的图层对象。详细说明如下:

参数

说明

[in] BSTR pName

图层名称

[in,defaultvalue(TRUE) ] VARIANT_BOOL isGetErased

图层被删除掉,是否也能成功得到

c#中实现代码说明:

private void HideLayer()
{
// 隐藏选择实体的层。
MxDrawUtility mxUtility = new MxDrawUtility();

MxDrawPoint getPt;
MxDrawEntity ent = mxUtility.GetEntity(out getPt, "\n 选择要关闭图层的实体:");
if (ent == null)
{
return;
}
string sLayerName = ent.Layer;
MxDrawApplication app = new MxDrawApplication();
//返回数据库中的层表对象
MxDrawLayerTable layerTable = app.WorkingDatabase().GetLayerTable();
//关闭指定图层
MxDrawLayerTableRecord layerTableRec = layerTable.GetAt(sLayerName, false);
//返回图层是否处于关闭状态
layerTableRec.IsOff = true;
}

 js中实现代码说明:

function HideLayer() {
var winWidth = 440;
var winHeight = 140;
var winLeft = (screen.width - winWidth) / 2;
var winTop = (screen.height - winHeight) / 2 - 20;
var str = 'dialogHeight:' + winHeight + 'px;dialogWidth:' + winWidth + 'px;dialogTop:' + winTop + 'px;dialogLeft:' + winLeft + 'px;resizable:yes;center:yes;status:no;'
var rt = window.showModalDialog("Gettext.htm?tmp=" + Math.random(), "输入图层名", str);
var txt;
if (typeof (rt) == "undefined") {
return;
} else {
var arr = rt.split(",");
txt = arr[0];
}
var database = mxOcx.GetDatabase();
//返回数据库中的层表对象
var layerTable = database.GetLayerTable();
//得到层表中的图层对象
var layerRec = layerTable.GetAt(txt, false);
if (layerRec == null)
return;
//返回图层是否处于关闭状态
layerRec.IsOff = true;
alert("成功隐藏图层");
}

(3)显示图层

主要用到函数说明:

IMxDrawLayerTable::GetAt

得到层表中的图层对象。详细说明如下:

参数

说明

[in] BSTR pName

图层名称

[in,defaultvalue(TRUE) ] VARIANT_BOOL isGetErased

图层被删除掉,是否也能成功得到

c#中实现代码说明:

private void ShowLayer()
{
MxDrawApplication app = new MxDrawApplication();
//返回数据库中的层表对象
MxDrawLayerTable layerTable = app.WorkingDatabase().GetLayerTable();
//创建一个遍历层表中所有图层的遍历器
MxDrawLayerTableIterator iter = layerTable.NewIterator();
if (iter == null)
return;
//移动当前遍历器位置
for (; !iter.Done(); iter.Step(true, false))
{
//返回遍历器当前位置的记录
MxDrawLayerTableRecord layerTableRec = iter.GetRecord();
//返回图层是否处于关闭状态
layerTableRec.IsOff = false;
}
}

 js中实现代码说明:

function ShowLayer() {
var winWidth = 440;
var winHeight = 140;
var winLeft = (screen.width - winWidth) / 2;
var winTop = (screen.height - winHeight) / 2 - 20;
var str = 'dialogHeight:' + winHeight + 'px;dialogWidth:' + winWidth + 'px;dialogTop:' + winTop + 'px;dialogLeft:' + winLeft + 'px;resizable:yes;center:yes;status:no;'
var rt = window.showModalDialog("Gettext.htm?tmp=" + Math.random(), "输入图层名", str);
var txt;
if (typeof (rt) == "undefined") {
return;
} else {
var arr = rt.split(",");
txt = arr[0];
}
var database = mxOcx.GetDatabase();
//返回数据库中的层表对象
var layerTable = database.GetLayerTable();
//得到层表中的图层对象
var layerRec = layerTable.GetAt(txt, false);
if (layerRec == null)
return;
//返回图层是否处于关闭状态
layerRec.IsOff = false;
alert("成功显示图层");
}

(4)得到所有图层名

主要用到函数说明:IMxDrawLayerTableIterator::Step

得到层表中的图层对象。详细说明如下:

参数

说明

[in,defaultvalue(TRUE) ] VARIANT_BOOL forward

为ture向前移动一位,为false向后移动位

[in,defaultvalue(TRUE) ] VARIANT_BOOL skipDeleted

是否跳过删除的对象

c#中实现代码说明:

private void GetAllLayer()
{
MxDrawApplication app = new MxDrawApplication();
//返回数据库中的层表对象
MxDrawLayerTable layerTable = app.WorkingDatabase().GetLayerTable();
//创建一个遍历层表中所有图层的遍历器
MxDrawLayerTableIterator iter = layerTable.NewIterator();
if (iter == null)
return;
//所有图层名
string sRet = null;
//移动当前遍历器位置
for (; !iter.Done(); iter.Step(true, true))
{
//返回遍历器当前位置的记录
MxDrawLayerTableRecord layerTableRec = iter.GetRecord();
sRet = sRet + ',' + layerTableRec.Name;
}
MessageBox.Show(sRet);
}

js中实现代码说明: 

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);
}

(5)打开所有图层

主要用到函数说明:IMxDrawLayerTableIterator::Step

得到层表中的图层对象。详细说明如下:

参数

说明

[in,defaultvalue(TRUE) ] VARIANT_BOOL forward

为ture向前移动一位,为false向后移动位

[in,defaultvalue(TRUE) ] VARIANT_BOOL skipDeleted

是否跳过删除的对象

c#中实现代码说明:

private void OpenAllLayer()
{
MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();
//返回数据库中的层表对象
MxDrawLayerTable layerTable = database.GetLayerTable();
//创建一个遍历层表中所有图层的遍历器
MxDrawLayerTableIterator iter = layerTable.NewIterator();
if (iter == null)
return;
//移动当前遍历器位置
for (; !iter.Done(); iter.Step(true, false))
{
//返回遍历器当前位置的记录
MxDrawLayerTableRecord layerTableRec = iter.GetRecord();
//返回图层是否处于锁定状态
layerTableRec.IsLocked = false;
}
MessageBox.Show("锁定所有图层成功!");
}

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("成功显示图层");
}

}

}

(6)锁定所有图层

具体实现c#代码如下:

private void LockeAllLayer()
{
MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();
//返回数据库中的层表对象
MxDrawLayerTable layerTable = database.GetLayerTable();
//创建一个遍历层表中所有图层的遍历器
MxDrawLayerTableIterator iter = layerTable.NewIterator();
if (iter == null)
return;
//移动当前遍历器位置
for (; !iter.Done(); iter.Step(true, false))
{
//返回遍历器当前位置的记录
MxDrawLayerTableRecord layerTableRec = iter.GetRecord();
//返回图层是否处于锁定状态
layerTableRec.IsLocked = true;
}
MessageBox.Show("锁定所有图层成功!");
}

 具体实现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("成功锁定图层");

}
}