} private void button1_Click(object sender, System.EventArgs e) {
AutoCADConnector connector=new AutoCADConnector(); AcadDocument document=connector.Application.ActiveDocument;
AcadAcCmColor color=(AcadAcCmColor)document.Application.GetInterfaceObject(\//新建一AcadAcCmColor对象,该对象用来给直线的颜色属性赋值
AcadLine line=document.ModelSpace.AddLine(new double[]{0,0,0},new double[]{200,200,0}); //加入直线
ColorDialog dlg=new ColorDialog();//生成一颜色对话框
if(dlg.ShowDialog()==DialogResult.OK)//显示颜色对话框,并按确定按钮后 {
color.SetRGB(dlg.Color.R,dlg.Color.G,dlg.Color.B);//设置颜色为颜色对话框中选择的颜色 line.TrueColor=color;//设置直线的颜色 }
line.Update();//更新显示 } } }
给AutoCAD的对象设置颜色,注意不是使用Color属性,而是使用TrueColor属性。TrueColor属性是一个AcadAcCmColor对象,它必须使用GetInterfaceObject方法而不能用new AcadAcCmColor()方法声明。
给AcadAcCmColor对象设置颜色时,由于要使用.net颜色对话框中选择的值,因此可使用SetRGB的方法,它的三个参数分别是RGB颜色的红,绿,蓝的值。
在C#中使用ObjectDBX技术从未打开图形中获得图块的信息
C#才鸟(QQ:2491785)
从未打开图形中能获得图块的信息吗?明经通道的VBA版块已经介绍了VBA的实现方法,那在C#中能否做到呢? 回答是肯定的。下面就来说明具体的实现方法。 要求: 会用C#编程
读过我写的“利用C#进行AutoCAD的二次开发“(在明经通道中有) 开始:
在visual studio.net中新建一C#控制台程序 在引用选项卡中添加下列类库: interop.AutoCAD.dll AcadExample.dll
ObjectDBX16(在“解决方案资源管理器”中右击“引用”标签,在弹出的菜单中选择“添加引用”,在“添加引用”对话框中选择“com\选项卡下的下拉列表框中的“AutoCAD/ObjectDBX Common 16.0 Type Library\项) 然后键入以下代码: 1: using System; 2: using AutoCAD; 3: using dbx = AXDBLib; 4: using AcadExample; 5:
6: namespace ConsoleApplication1 7: {
8: ///
9: /// Summary description for Class1. 10: /// 11: class Class1 12: {
13: ///
14: /// The main entry point for the application. 15: /// 16: [STAThread]
17: static void Main(string[] args) 18: {
19: using (AutoCADConnector connector = new AutoCADConnector()) 20: {
21: string progid = \注意,这是AutoCAD2004的写法, // 若是AutoCAD2002和AutoCAD2000i则是”ObjectDBX.AxDbDocument.1“ 22: AcadApplication acadApp = connector.Application; 23: dbx.AxDbDocument dbxDoc;
24: dbxDoc = (dbx.AxDbDocument)acadApp.GetInterfaceObject(progid); 25: dbxDoc.Open(@\
26: foreach (dbx.AcadEntity entity in dbxDoc.ModelSpace) 27: {
28: if (entity.EntityName == \判断实体是否是块参照 29: {
30: dbx.AcadBlockReference blkRef;
31: blkRef = (dbx.AcadBlockReference)entity; //将是块参照的实体强制转换为块参照类型 32: object[] atts = (object[])blkRef.GetAttributes();//获取块参照中的属性(为对象类型) 33: for (int i = 0; i < atts.Length; i++) //遍历块参照属性 34: {
35: dbx.AcadAttributeReference att;
36: att = (dbx.AcadAttributeReference)atts;//将块参照属性(对象类型)强制转换为块参照属性类型 37: Console.WriteLine(\ 38: att.TagString,
39: att.TextString);//显示块参照属性的Tag和Text的值 40: } 41: } 42: }
43: Console.ReadLine(); 44: } 45: } 46: } 47: }
第一个要注意的是第三行,使用了一个别名。因为AutoCAD和ObjectDBX命名空间有许多相同的类名,因此,你必须使用全名,而不能使用简写的形式,但ObjectDBX写起来比较麻烦,所以用别名dbx来使输入方便一些。
程序前面部分的代码,你可以参考我写的“利用C#进行AutoCAD的二次开发“这篇文章。让我们来看第21行,程序定义了一个字符串progid,作为第24句的函数GetInterfaceObject的参数,该函数是用来产生一个AxDbDocument对象。但要注意, GetInterfaceObject函数返回的类型是object,所以你必须用强制转换把它变为AxDbDocument类。然后在第25行使用24行产生的AxDbDocument对象来”打开“一个.dwg文件(其实没有打开),需要注意的是这个文件的路径必须是正确的。这个文件就是我们要获得的块信息所在的文件。 由于ObjectDBX 没有选择集,所以只有通过遍历文件的模型空间来获得块的信息(26-28行)。 余下语句的说明我已经写在程序的注释中了。
你可以发现ObjectDBX的工作原理在C#中与VBA是类似的,只不过要进行必要的类型转换。
vb.net二次开发AutoCAD中画圆示例
Imports Autodesk
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Interop.Common imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.Geometry
Imports System
Private Sub btnCircle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCircle.Click '定义圆的圆心
Dim center As Point3d = New Point3d(100, 100, 0)
'定义圆的半径
Dim radius As Double = 50
'定义一个Circle对象来表示你要生成的圆,传入的第二个参数为圆的法向, '就是把圆生、//成在什么面上,因为AutoCAD程序一般都是平面问题, '因此你一般都把这个法向量定义成//z轴方向。 Dim circle As Circle
circle = New Circle(center, New Vector3d(0, 0, 1), radius)
Dim bt As BlockTable Dim btr As BlockTableRecord
Dim db As Database
'获得当前活动AutoCAD文档所在的数据库
db = Application.DocumentManager.MdiActiveDocument.Database
'获得事务处理管理器
Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = db.TransactionManager
'定义事务处理
Dim trans As Transaction
Try
'开始事务处理,也就是往CAD中加入东西 trans = tm.StartTransaction
bt = tm.GetObject(db.BlockTableId, OpenMode.ForRead, False)
'获得块表记录
btr = tm.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False)
'向块表记录加入圆的相关信息 btr.AppendEntity(Circle)
'向AutoCAD加入圆
tm.AddNewlyCreatedDBObject(Circle, True)
trans.Commit()
Catch ex As Exception
Throw New ApplicationException(ex.Message) End Try
end sub
(参照了明经通道里的二次开发相关内容)
相关推荐: