一、在插入块前修改图块文字
1、实现思路:首先我们利用InsertBlock方法将我们需要插入的块文件引入到控件数据库中,然后利用GetBlockTable得到块表对象,再查找当前块表中是否有块表记录,再创建一个用于遍历块表的遍历器,得到遍历器当前的实体,如果当前实体是一个文字就利用TextString修改文字内容,最后再利用DrawBlockReference绘制图块到视区中。
2、主要用到函数说明:_DMxDrawX::DrawBlockReference
绘制块引用对象。详细说明如下:
参数 | 说明 |
---|---|
DOUBLE dPosX | 插入点的X坐标 |
DOUBLE dPosY | 插入点的Y坐标 |
BSTR pszBlkName | 图块名 |
DOUBLE dScale | 图块缩放比例 |
DOUBLE dAng | 图块的旋转角度 |
c#中使用如下:
// 插入块的块名。
String sBlkName = "MyBlkName";
// 把要插入的块文件引入到控件数据库中。
String sBlkFile = axMxDrawX1.GetOcxAppPath() + "\\Blk\\attribblock.dwg";
axMxDrawX1.InsertBlock(sBlkFile, sBlkName);
// 得到当前应用对象
MxDrawApplication app = new MxDrawApplication();
// 取到控件数据库
MxDrawDatabase database = app.WorkingDatabase();
// 得到块表对象
MxDrawBlockTable blkTable = database.GetBlockTable();
// 当前块表中是否已经有名为sBlkName的块表记录
MxDrawBlockTableRecord blkRec = blkTable.GetAt(sBlkName, true);
if (blkRec == null)
{
// 证明InsertBlock函数失败,没有成功把文件插入数据库中。
return;
}
// 创建一个用于遍历块表遍历器
MxDrawBlockTableRecordIterator iter = blkRec.NewIterator();
if (iter == null)
return;
for (; !iter.Done(); iter.Step(true, false))
{
// 得到遍历器当前的实体
MxDrawEntity ent = iter.GetEntity();
if (ent == null)
continue;
if (ent.ObjectName == "McDbText")
{
// 当前实体是一个文字
MxDrawText text = (MxDrawText)ent;
// 修改文字内容为 "MyContent"
text.TextString = "MyContent";
}
}
// 创建块引用,把图块插入到当前空间,并显示。
axMxDrawX1.DrawBlockReference(0, 0, sBlkName, 1.0, 0.0);
js中使用如下:
// 插入块的块名。
var sBlkName = "MyBlkName";
// 把要插入的块文件引入到控件数据库中。
var sBlkFile = mxOcx.GetOcxAppPath() + "\\Blk\\attribblock.dwg";
mxOcx.InsertBlock(sBlkFile, sBlkName);
// 取到控件数据库
var database = mxOcx.GetDatabase();
// 得到块表对象
var blkTable = database.GetBlockTable();
// 当前块表中是否已经有名为sBlkName的块表记录
var blkRec = blkTable.GetAt(sBlkName, true);
if (blkRec == null)
{
// 证明InsertBlock函数失败,没有成功把文件插入数据库中。
return;
}
// 创建一个用于遍历块表遍历器
var iter = blkRec.NewIterator();
if (iter == null)
return;
for (; !iter.Done(); iter.Step(true, false))
{
// 得到遍历器当前的实体
var ent = iter.GetEntity();
if (ent == null)
continue;
if (ent.ObjectName == "McDbText") {
// 当前实体是一个文字
var text =ent;
// 修改文字内容为 "MyContent"
text.TextString = "MyContent";
}
}
// 创建块引用,把图块插入到当前空间,并显示。
mxOcx.DrawBlockReference(0, 0, sBlkName, 1.0, 0.0);
二、获取图块文字信息
实现思路:获取控件数据库中的块表对象,创建遍历块表记录的遍历器。遍历出图纸上的图块;利用两次遍历得到组成图块的实体,如果当前实体是一个文字就利用TextString得到文字内容。
js中使用如下:
var database = mxOcx.GetDatabase();
var blkTab = database.GetBlockTable();
var iter = blkTab.NewIterator();
for (; !iter.Done(); iter.Step(true, false)) {
var blkRec = iter.GetRecord();
var iter1 = blkRec.NewIterator();
for (; !iter1.Done(); iter1.Step()) {
var tmpEnt = iter1.GetEntity();
if (tmpEnt == null)
continue;
if (tmpEnt.ObjectName == "McDbText") {
// 当前实体是一个文字
var text =tmpEnt;
var txt=text.TextString;
alert(txt.toString());
}
}
}
三、修改图块指定文字
实现思路:获取控件数据库中的块表对象,创建遍历块表记录的遍历器。遍历出图纸上的图块;利用两次遍历得到组成图块的实体,如果当前实体是一个文字就利用TextString修改文字内容。
js中使用如下:
var database = mxOcx.GetDatabase();
var blkTab = database.GetBlockTable();
var iter = blkTab.NewIterator();
for (; !iter.Done(); iter.Step(true, false)) {
var blkRec = iter.GetRecord();
var iter1 = blkRec.NewIterator();
for (; !iter1.Done(); iter1.Step()) {
var tmpEnt = iter1.GetEntity();
if (tmpEnt == null)
continue;
if (tmpEnt.ObjectName == "McDbText") {
// 当前实体是一个文字
var text =tmpEnt;
if(text.TextString =="123"){
// 修改文字内容为 "MyContent"
text.TextString = "MyContent";
}
}
}
}