当块保存在所指定的位置后,即可在其他文件中使用图块了。图块的重复使用是通过插入图快的方式实现的。最常用的插入图块方式是用插入图块对话框,可以插入当前图中的图块或者某个DWG文件作为图块,如果要在当前图中插入其他图中的图块,大家比较常见的的方法是打开另一张图,从那张图复制到当前图中。实际上,我们可以不必打开另一张图也可以插入图中的图块,另外还可以将常用的图块保存到工具选项板中,定制成自己的图库,在任意图中调用。
一、调出插入图框对话框的方法有三种:
1、菜单位置:[绘图]→[插入块]
2、工 具 条:[绘制]→[插入块命令]
3、命 令 行:Insert
(1)用户可以在当前图形中插入图块或别的图形。当插入图形时,它是作为一个单个实体。如果改变原始图形,它对当前图形无影响。
(2)缺省的使用方法是执行“插入块”命令后,系统弹出如图所示的“插入图块”对话框,在对话框中选择块的名称后,点击“插入”按钮。回到图形窗口后,根据命令行提示输入块的插入点、比例、旋转角。回车就完成插入图块命令。
4、“插入图块”选项说明:
浏览:此项用来选取要插入的外部块,单击“浏览”,选择要插入的外部图块文件名称,点击“打开”。
名称:该下拉列表框中选择预插入的内部块名。
在屏幕上指定:勾选此复选框,将在插入时对图块定位、比例因子、旋转角度。不勾选此框,则需要在命令行中输入坐标比例因子和旋转角度。
插入点(X,Y,Z):此三项输入框用于输入坐标值确定在图形中的插入点。当勾选“在屏幕上指定”后,三项呈灰色,不可用。
缩放比例(X,Y,Z):此三项输入框用于预先输入图块在X轴、Y轴、Z轴方向上缩放的比例因子。此三项比例因子可以相同,也可以不同,缺省值为1,当勾选“在屏幕上指定”后,三项呈灰色,不可用。
旋转(R):图块在图形中可以任意改变角度。在此输入图块的旋转角度。当勾选“在屏幕上指定”后,三项呈灰色,不可用。
二、下面介绍关于二次开发插入块的使用方法(以MxDrawCAD为例);分别是参数绘制以及交互绘制中的使用。
1、参数绘制:
(1)参数化绘图在CAD中可以帮助我们极大缩短设计时间,用户可以按照设计意图控制绘图对象,这样即使对象发生了变化,具体的关系和测量数据仍将保持不变,能够对几何图形和标注进行控制,可以帮助用户应对耗时的修改工作。
(2)实现思路:首先通过InsertBlock方法向控件数据库中插入所需的图块,然后再通过DrawBlockReference方法将该图块插入到我们想要插入的位置,同时我们还可以设置该图块的缩放比例和旋转角度。
(3)主要用到函数说明:_DMxDrawX::DrawBlockReference
绘制块引用对象。详细说明如下:
参数
说明
DOUBLE dPosX
插入点的X坐标
DOUBLE dPosY
插入点的Y坐标
BSTR pszBlkName
图块名
DOUBLE dScale
图块缩放比例
DOUBLE dAng
图块的旋转角度
C#中实现代码说明:
private void DynInsert(){
//把颜色改回黑白色
axMxDrawX1.DrawCADColorIndex = 0;
//创建一个图层,名为"BlockLayer"
axMxDrawX1.AddLayer("BlockLayer");
//设置当前图层为"BlockLayer"
axMxDrawX1.LayerName = "BlockLayer";
var sBlkName = "Tree";
//用户需要出入图块的路径 控件程序在磁盘的文件路径
var sBlkFile = axMxDrawX1.GetOcxAppPath() + "\\Blk\\树.dwg";
//向控件数据库中插入一个图块,不用它插入匿名块
axMxDrawX1.InsertBlock(sBlkFile, "Tree");
//绘制块引用对象
//参数一为插入点的X坐标;参数二为插入点的Y坐标;
//参数三为图块名;参数四为图块缩放比例;参数五为图块的旋转角度
axMxDrawX1.DrawBlockReference(0, 3600, "Tree", 1, 0);
axMxDrawX1.ZoomAll();
axMxDrawX1.UpdateDisplay();
}
网页中实现代码说明:
function DynInsert() {mxOcx.DrawColor = 0;
//创建一个图层,名为"BlockLayer"
mxOcx.AddLayer ("BlockLayer");
//设置当前图层为"BlockLayer"
mxOcx.LayerName = "BlockLayer";
var sBlkName = "Tree";
//用户需要出入图块的路径 控件程序在磁盘的文件路径
var sBlkFile = mxOcx.GetOcxAppPath() + "\\Blk\\树.dwg";
//向控件数据库中插入一个图块,不用它插入匿名块
mxOcx.InsertBlock(sBlkFile, "Tree");
//绘制块引用对象
//参数一为插入点的X坐标;参数二为插入点的Y坐标;
//参数三为图块名;参数四为图块缩放比例;参数五为图块的旋转角度
mxOcx.DrawBlockReference(0, 3600, "Tree", 1, 0) ;
mxOcx.ZoomAll();
mxOcx.UpdateDisplay();
}
2、交互绘制:
(1)实现思路:首先我们需要设置动态施放绘制事件回调函数DoDynWorldDrawFun,然后在此回调函数里面写实现代码。代码同参数绘制图块大同小异,交互绘制的最大区别在于绘制的点是由我们在视区选择,所以在使用DrawBlockReference方法的时候注意插入点的X和Y坐标是由我们在视区取点决定的。
(2)主要用到函数说明:_DMxDrawX::DrawBlockReference
绘制块引用对象。详细说明如下:
参数
说明
DOUBLE dPosX
插入点的X坐标
DOUBLE dPosY
插入点的Y坐标
BSTR pszBlkName
图块名
DOUBLE dScale
图块缩放比例
DOUBLE dAng
图块的旋转角度
网页中实现代码说明:
function DynInsert() {var sBlkName = "Tree";
var sBlkFile = mxOcx.GetOcxAppPath() + "\Blk\树.dwg";
mxOcx.InsertBlock(sBlkFile, "Tree");
var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
getPt.message = "点取插入点";
var spDrawData1 = getPt.InitUserDraw("TestDynDraw1");
spDrawData1.SetString("BlkName","Tree");
if (getPt.go() != 1) {
return;
}
var frstPt = getPt.value();
if (frstPt == null) {
return;
}
var getSecondPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
var spDrawData = getSecondPt.InitUserDraw("TestDynDraw");
getSecondPt.message = "点取旋转角度";
getSecondPt.basePoint = frstPt;
getSecondPt.setUseBasePt(true);
spDrawData.SetPoint("pt1", frstPt);
spDrawData.SetString("BlkName", "Tree");
if (getSecondPt.go() != 1) {
return;
}
var ret = spDrawData.Draw();
// 给属性块写文字.
var blkRef = ret.AtObject(0);
if (blkRef != null)
{
var param = mxOcx.NewResbuf();
blkRef.SetProp("createAttribute",param);
}
}
// 设置回调函数
document.getElementById("MxDrawXCtrl").ImpDynWorldDrawFun = DoDynWorldDrawFun;
// 函数实现代码
function DoDynWorldDrawFun(dX,dY,pWorldDraw,pData)
{
var sGuid = pData.Guid;
mxOcx.SetEventRet(0);
if(sGuid == "TestDynDraw")
{
// 动态插入图块。
var firstPt = pData.GetPoint("pt1");
if(firstPt == null)
return;
var sBlkName = pData.GetString("BlkName");
var secondPt = mxOcx.NewPoint();
secondPt.x = dX;
secondPt.y = dY;
var vec = firstPt.SumVector(secondPt);
var dAng = vec.Angle();
pWorldDraw.DrawBlockReference(firstPt.x,firstPt.y,sBlkName,1.0,dAng * 180.0 / 3.14159265 + 90.0);
mxOcx.SetEventRet(1);
}
else if (sGuid == "TestDynDraw1") {
var sBlkName = pData.GetString("BlkName");
pWorldDraw.DrawBlockReference(dX, dY, sBlkName, 1.0, 0.0);
}
}