在CAD中,图块是将多个实体组合成一个整体,并给这个整体命名保存,在以后的图形编辑中图块就被视为一个实体。一个图块包括可见的实体如线、圆、圆弧以及可见或不可见的属性数据。用户可根据需要将图块按给定的缩放系数和旋转角度插入到指定的任意位置,但无法修改块中对象。若要编辑块中对象,必须用“分解”按钮将其分解,然后再进行编辑。图块的运用可以帮助用户更好的组织工作,快速创建与修改图形,减少图形文件的大小,节省磁盘空间。

下面将介绍使用MxDrawCAD操作图块的基本操作。

一、定义图块

1、CAD中图块分为外部图块和内部图块两类,因此定义图块也有两种方法。

2、定义内部块

(1)菜单位置:[绘图]→[块] →[创建]

(2)工 具 条:[绘制]→[创建块]

(3)命 令 行:Block

(4)先输入一个名称,再按“选择对象”选择你要组成块的对象,选择完成后按回车键。最后按“拾取点”按钮,在你的对象上选择一个点作为此“块”的参考点。“确定”就OK了。然后可以用“插入”——“块”的命令,插入这个块。

(5)用此方法定义的图块只能在定义图块的图形中调用,而不能在其它图形中调用,因此用此方法定义的图块称为内部块。

(6)执行创建块命令后会弹出对话框,在对话框中输入块名,利用窗口选择要定义的块的元素,然后根据需要定义一个插入点,即可完成定义块的操作。

                                             

CAD定义图块_控件

(7)如果是开发人员想进行二次开发,推荐使用MxDrawCAD控件,因为MxDrawCAD是专业的CAD插件(控件),可轻松在网页、手机及BS/CS程序中浏览编辑DWG文件,不需安装AutoCAD即可运行。并支持多种语言进行二次开发:VC、VB、CSharp、Delphi、HTML、ASP、JAVA、JavaScript、C++、 Builder、PHP、.Net、易语言、PowerBuild等。

二、下面介绍c#以及在网页中使用控件将选中的实体做成块的实现代码:

1、实现思路:利用选择集进行过滤,得到用户选取的对象,将选取的对象添加到一个数组里面,然后返回控件的数据库对象,通过ObjectIdToObject得到数组对象的实体,在通过得到实体的最小外包计算出块的中心点,检查新创建的块名,在当前数据库是否已经存在,再将以前的实体删除,最后将制作好的块通过InsertBlock方法插入到控件数据库中。

2、c#将选中的实体做成块实现代码:

                MxDrawSelectionSet ss = new MxDrawSelectionSet();
ss.Select(MCAD_McSelect.mcSelectionSetUserSelect, null, null, null);


List<Int64> aryId = new List<Int64>();
for (Int32 i = 0; i < ss.Count; i++)
{
MxDrawEntity ent = ss.Item(i);
if (ent != null)
{
aryId.Add(ent.ObjectID);
ent.Close();
}
}
MxDrawDatabase curDatabase = (MxDrawDatabase)(mxdraw.GetDatabase());

double dMinX = 0, dMinY = 0, dMaxX = 0, dMaxY = 0;
bool isFirstEnt = true;
for (int l = 0; l < aryId.Count; l++)
{
MxDrawMcDbObject pObj = curDatabase.ObjectIdToObject(aryId[l]);
if (pObj == null)
continue;


MxDrawPoint pt1Ob, pt2Ob;

MxDrawEntity pEnt = (MxDrawEntity)pObj;
if (pEnt == null)
continue;

pEnt.GetBoundingBox(out pt1Ob, out pt2Ob);

MxDrawPoint minPt = (MxDrawPoint)pt1Ob;
MxDrawPoint maxPt = (MxDrawPoint)pt2Ob;

if (minPt != null && maxPt != null)
{
if(isFirstEnt)
{
dMinX = minPt.x;
dMinY = minPt.y;
dMaxX = maxPt.x;
dMaxY = maxPt.y;
isFirstEnt = false;
}
else
{
if (dMinX > minPt.x)
dMinX = minPt.x;

if (dMinY > minPt.y)
dMinY = minPt.y;

if (dMaxX < maxPt.x)
dMaxX = maxPt.x;

if (dMaxY < maxPt.y)
dMaxY = maxPt.y;
}
}
}

if(isFirstEnt)
{
// 没有实体
return 0;
}

MxDrawPoint pos = new MxDrawPoint();
pos.x = dMinX + (dMaxX - dMinX) / 2.0;
pos.y = dMinY + (dMaxY - dMinY) / 2.0;

// 检查新创建的块名,在当前数据库是否已经存在.

MxDrawBlockTable blkTable = curDatabase.GetBlockTable();
MxDrawBlockTableRecord curSpace = curDatabase.CurrentSpace();

String sNewBlakName;

MxDrawBlockTableRecord blkNewRec = blkTable.Add("");
sNewBlakName = blkNewRec.Name;

blkNewRec.Origin = pos;

for (int l = 0; l < aryId.Count; l++)
{

blkNewRec.AddCloneEntity(aryId[l]);
// 把以前实体删除 。
MxDrawMcDbObject pObj = curDatabase.ObjectIdToObject(aryId[l]);
if (pObj == null)
continue;
pObj.Erase();
}


if (blkNewRec != null)
{
MxDrawBlockReference blkRef = curSpace.InsertBlock(pos.x,pos.y, sNewBlakName, 1.0, 0.0);
MxDrawAttribute attrib = blkRef.AppendAttribute();
attrib.Position = pos;
attrib.AlignmentPoint = pos;
attrib.Oblique = 0.0;
attrib.Rotation = 0.0;
attrib.Height = 2.0;
attrib.TrueColor.SetRGB(255,0,0);

// attrib.TextString = "这是一个属性文字的测试";

attrib.Tag = "TestTag";
attrib.IsInvisible = false;

blkRef.Position = blkRef.Position;

return blkRef.ObjectID;
}
return 0;

3、在网页中将选中的实体做成块实现代码:

//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
var ss = mxOcx.NewSelectionSet();
//构造一个过滤链表
var spFilte = mxOcx.NewResbuf();
//用户选择对象 得到用户选取的实体
ss.Select2(8, null, null, null, spFilte);

var aryId = new Array();
for (var i = 0; i < ss.Count; i++)
{
var ent = ss.Item(i);
if (ent != null)
{
aryId.push(ent.ObjectID);
ent.Close();
}
}
//返回控件的数据库对象
var curDatabase =mxOcx.GetDatabase();
var dMinX = 0, dMinY = 0, dMaxX = 0, dMaxY = 0;
var isFirstEnt = true;
for (var l = 0; l < aryId.length; l++)
{
var pObj = curDatabase.ObjectIdToObject(aryId[l]);
if (pObj == null)
continue;
var pEnt = pObj;
if (pEnt == null)
continue;
var points = pEnt.GetBoundingBox2();

var minPt = points.Item(0);
var maxPt = points.Item(1);

if (minPt != null && maxPt != null)
{
if(isFirstEnt)
{
dMinX = minPt.x;
dMinY = minPt.y;
dMaxX = maxPt.x;
dMaxY = maxPt.y;
isFirstEnt = false;
}
else
{
if (dMinX > minPt.x)
dMinX = minPt.x;

if (dMinY > minPt.y)
dMinY = minPt.y;

if (dMaxX < maxPt.x)
dMaxX = maxPt.x;

if (dMaxY < maxPt.y)
dMaxY = maxPt.y;
}
}
}

if(isFirstEnt)
{
// 没有实体
return;
}
var pos = mxOcx.NewPoint();
pos.x = dMinX + (dMaxX - dMinX) / 2.0;
pos.y = dMinY + (dMaxY - dMinY) / 2.0;

// 检查新创建的块名,在当前数据库是否已经存在.

var blkTable = curDatabase.GetBlockTable();
var curSpace = curDatabase.CurrentSpace();

var sNewBlakName;

var blkNewRec = blkTable.Add("");
sNewBlakName = blkNewRec.Name;

blkNewRec.Origin = pos;

for (var l = 0; l < aryId.length; l++)
{

blkNewRec.AddCloneEntity(aryId[l]);
// 把以前实体删除 。
var pObj = curDatabase.ObjectIdToObject(aryId[l]);
if (pObj == null)
continue;
pObj.Erase();
}
if (blkNewRec != null)
{
var blkRef = curSpace.InsertBlock(pos.x,pos.y, sNewBlakName, 1.0, 0.0);
var attrib = blkRef.AppendAttribute();
attrib.Position = pos;
attrib.AlignmentPoint = pos;
attrib.Oblique = 0.0;
attrib.Rotation = 0.0;
attrib.Height = 2.0;
attrib.Tag = "TestTag";
attrib.IsInvisible = false;

blkRef.Position = blkRef.Position;

}

return;

三、外部块定义

1、命 令 行:MX_Wblock

2、MX_Wblock命令可将图形文件中的整个图形、内部块或某些实体写入一个新的图形文件,其它图形均可以将它作为块调用。因此称之为外部块。

                                                          

CAD定义图块_数据库_02

3、缺省的使用方法是执行MX_Wblock命令后,系统弹出如图对话框,选择外部块文件在磁盘上的存储位置和路径,输入文件名后,单击保存后,回车选取块对象的插入点和块的内容,回车后完成块保存操作。

4、“内部块”只能在当前绘图环境中使用,不能调用到其他绘图环境中。“外部块”也叫“永久块”,可以在当前绘图环境中使用,也可以调用到其他绘图环境中,也就是说能够永久保存,只要不删除它,在以后任何需要的时候都可以调出来使用,多操作多练习就会搞清楚两者的区别了,其实很简单。

5、说白了“块”就相当于模块,做好后放在那里,在需要的时候再拿出来用,主要是使用频率较高的图形,或者一些较复杂的图形需要在其他地方使用,就将它做成块,既方便又省事,提高绘图速度。