摘 要: 本文介绍了利用.NET平台下的C#语言对AutoCAD2007进行二次开发的技术,原理及方法。利用该技术,通过对话框的形式简单快速的实现了AutoCAD中控制指标块的修改功能。
关键词: 二次开发;指标修改;.NET;AUTOCAD
在城市控制性详细规划中,控制指标块属性的修改是很重要的一部分,根据对话框的形式可以修改指标块的各参数值,并更新到属性窗和指标块中,若依靠CAD本身的功能只能从特性中进行修改,这样操作不仅不方便而且容易出错。利用AutoCAD二次开发技术,可以通过界面对话框的形式对控制指标块进行修改,根据实际需要输入新的属性值后,控制指标块中的属性值就会随之更新,从而达到了快速修改指标块中的各类属性值的目的。
1.开发工具的选择
对开发人员来说,开发语言的选择对于功能的实现起到很重要的作用。在CAD的二次开发中,目前,广泛应用的语言有VBA、Visual lisp 、Object ARX等。Object ARX功能虽强大,但 C++这门语言的高门槛让许多人望而却步。Visual lisp 、VBA语言虽然简单,但功能相对较弱,尤其是面向对象的功能支持不好,从而限制了这两种语言的使用。.NET是微软新推出的开发平台,它具有众多优点。基于.NET平台对AutoCAD进行二次开发,可充分利用.N ET的各种优势,大大提高开发速度。本文利用C#语言对Auto CAD进行二次开发,实现了控制指标块属性修改的功能。
2.实现原理与方法
实现AutoCAD的二次开发,必须使用AutoCAD.NET托管封装类,这些托管封装类包含在两个托管模块中。要加入对这两个托管模块的引用,可通过“添加引用”,找到AutoCAD的安装目录,在目录下找到acdbmgd.dll和acmgd.dll组件,并打开这两个组件。这样就可以将这两个托管类添加到引用中。正如它们的名字所表示的,acdbmgd.dll包含Object DBX托管类,而acmgd.dll包含AutoCAD托管类。
在编辑代码完成后进行编译,将得到一个.dll文件。在AutoCAD2007命令行中输入
“netload”加载该.dll文件,加载成功后即可以通过程序调用命令如“ZBXG”,实现所编译代码的功能。
本文中的控制指标块,从实体的类型上说是块实体。但这种指标块不同于在CAD中创建的普通快,它包含了大量的属性信息。在控制指标块的修改中,当用户选中指标块后,会弹出属性修改的对话框,用户可以根据需要修改对话框中的属性值。
3.修改功能的开发与实现
通过对话框的形式,修改各地块的控制指标数值,并将对话框中设置的新参数值,通过代码读取到属性窗口进行更新。图1、图2分别为原控制指标块、原控制指标块的属性窗
图1 原控制指标块 图2 原控制指标块属性窗
在指标块的属性修改中,首先判断选择的实体是否为控制指标块,本文利用过滤器通过块名加以判断,当选取的实体为控制指标块时,弹出修改指标块的对话框,否则,返回。关键代码如下:
public void ZBXG()
{
Database db = HostApplicationServices.WorkingDatabase;
Editor ed = App.DocumentManager.MdiActiveDocument.Editor;
PromptSelectionOptions prSel = new PromptSelectionOptions();
prSel.MessageForAdding = "\n选择指标块实体:";//提示选择
prSel.SingleOnly = true;//只应许选择一个
TypedValue[] selectValues = new TypedValue[] { new ypedValue((int)DxfCode.BlockName, "控制指标*") };//只选择"控制指标块"
SelectionFilter filter = new SelectionFilter(selectValues);
PromptSelectionResult prRes = ed.GetSelection(prSel, filter);
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockReference br = (BlockReference)trans.GetObject(prRes.Value[0].ObjectId, OpenMode.ForWrite);
AttributeCollection att = br.AttributeCollection;//获取块的属性
for (int i = 0; i < att.Count; i++)
{
AttributeReference attref = (AttributeReference)trans.GetObject(att[i], penMode.ForWrite);
zdm.ZBXG.str_zbxg[i] = ttref.TextString;
}
trans.Commit();//提交事务处理
ZBXG zbxg = new ZBXG();
zbxg.brZBXG = br;
Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(zbxg); } }
弹出修改对话框后,用户可根据需要进行修改,属性值修改后的对话框如图3所示。
图3 控制指标修改对话框
从图3中可以看出,各面积参数之间存在一定的关系,即:
建筑面积=容积率*用地面积
道路面积=总面积-用地面积-绿地面积
在控制指标修改对话框中,用户可以根据需要修改相应的参数值,其中用地性质还可以通过单击。“…按钮”进行选择。当选择了用地性质后,容积率、建筑密度、绿地率、建筑限高、自行车位参数、机动车位参数和总户数参数会自动填写,这7个参数与用地性质的类型密切相关,一般不要去更改。总面积、用地面积和绿地面积可以从textBox中输入,也可以通过其后“…按钮”获取,获得的各类面积值满足以上所述的关系。这5个textBox控件的控制代码很类似,都采用了Leave事件,当鼠标的光标离开时,textBox的值会随着各面积参数之间的关系计算得出的值而发生变化,这样就可以保证修改后的指标块的参数是正确的。实现该功能的主要代码如下所示(以绿地面积为例):
private void txtLDMJ_Leave(object sender, EventArgs e)
{double zmj = double.Parse(txtZMJ.Text.ToString());//获取总面积的值
double ydmj = double.Parse(txtYDMJ.Text.ToString());//获取用地面积的值
double ldmj = double.Parse(txtLDMJ.Text.ToString());//获取绿地面积的值
double dlmj = zmj - ydmj - ldmj;//道路面积=总面积-用地面积-绿地面积
if (dlmj < 0.00)//道路面积不能为负数
{ labMessage.Visible = true;//显示错误信息}
txtDLMJ.Text = dlmj.ToString();
}
修改好指标块各参数后,要将新的参数值更新到属性窗口,各参数值的更新方法类似,在此,只以地块编码和用地性质为例,其他的属性值也可按照类似的方法更新。更新方法的主要代码:
private void btnOk_Click(object sender, EventArgs e)
{
BlockReference br = (BlockReference)brZBXG;
Autodesk.AutoCAD.DatabaseServices.AttributeCollection att = br.AttributeCollection;
for (int i = 0; i < att.Count; i++)
{
AttributeReference attref = (AttributeReference)trans.GetObject(att[i], OpenMode.ForWrite);
//更新属性值
if (attref.Tag == "地块编码")
attref.TextString = txtDKBH.Text.ToString();