当块保存在所指定的位置后,即可在其他文件中使用图块了。图块的重复使用是通过插入图快的方式实现的。最常用的插入图块方式是用插入图块对话框,可以插入当前图中的图块或者某个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);
                }
            }









