CAD二次开发过程记录-C#

  最近因为工作原因,需要进行cad的二次开发,从来没有接触过CAD的新手需要将CAD相关的概念先熟悉一遍。单位领导给了我一本《AutoCAD VBA&VB.Net 开发基础与实例教程(第二版)》,单这本书我就看了三个周,然而因为书上代码量太大,并没有把代码全部自己验证一遍,有的代码太长,将随书附赠的cd中的代码copy过来进行了验证,不知为何cd中的代码与书中竟然不同,我只得自己研究代码撰写的逻辑,很令人头疼。

  1、目前最需要看的就是块和表格这一章还有外部数据库与外部文件。其实块和表格这一块没看大懂,我看了纯介绍cad的视频,其实块的生成也没有那么复杂,可能在第一次生成块的时候需要绘制一个精细的模型,后期使用时不会因为数据的因素影响整个项目了。

  2、以前从来没有接触过C#,因此这次也准备了蛮久的C#基础知识,俗话说语言都是相通的,其实还是要看很多细节的语法,但是有了编程思想,看语法也不会太难。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

8.6日已经完成功能开发了 ,在同事赵总的帮助下,终于将LINQ语句写好,并且我也学会了搜索需要的属性

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using Autodesk.AutoCAD.Runtime;
  7 using Excel = NetOffice.ExcelApi;
  8 using NetOffice.ExcelApi.Enums;
  9 using NetOffice.ExcelApi.Tools.Contribution;
 10 using Autodesk.AutoCAD.EditorInput;
 11 using Autodesk.AutoCAD.ApplicationServices;
 12 using Autodesk.AutoCAD.DatabaseServices;
 13 using Autodesk.AutoCAD.ApplicationServices.Core;
 14 using Autodesk.AutoCAD.Colors;
 15 using COMMON;
 16 
 17 namespace CADEXCEL
 18 {
 19     public static class CADEXCEL
 20     {
 21         [CommandMethod("cadtoexcel")]
 22         public static void RunExample()
 23         {
 24             // start excel and turn off msg boxes
 25             Excel.Application excelApplication = new Excel.Application(); ;
 26             excelApplication.DisplayAlerts = false;
 27 
 28             // create a utils instance, not need for but helpful to keep the lines of code low
 29             CommonUtils utils = new CommonUtils(excelApplication);
 30             // add a new workbook
 31             Excel.Workbook workBook = excelApplication.Workbooks.Add();
 32             Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Worksheets[1];
 33 
 34             
 35             
 36 
 37             Document doc = Application.DocumentManager.MdiActiveDocument;
 38             Database db = doc.Database;
 39             using (Transaction trans = db.TransactionManager.StartTransaction())
 40             {
 41                 Editor ed = db.GetEditor();
 42                 
 43                 var blocks = (from b in db.GetEntsInModelSpace<BlockReference>()
 44                               
 45                              // group b by b.Name into g
 46                               
 47                               orderby b.Id descending
 48                               select new { b.Name, Number = b.Id, Xposition=b.Position.X,
 49                                   YPosition =b.Position.Y,Zposition=b.Position.Z,
 50                                   b.Rotation
 51                               }).ToList();
 52 
 53                
 54                 workSheet.Cells[1,1].Value = "序号";
 55                 workSheet.Cells[1,2].Value= "名称";
 56                 workSheet.Cells[1,3].Value = "编号";
 57                 workSheet.Cells[1,4].Value = "旋转";
 58                 workSheet.Cells[1,5].Value = "X";
 59                 workSheet.Cells[1, 6].Value = "Y";
 60                 workSheet.Cells[1, 7].Value = "Z";
 61                 workSheet.Cells[1, 8].Value = "";
 62                 workSheet.Cells[1, 9].Value = "";
 63                 workSheet.Cells[1, 10].Value = "";
 64                 
 65 
 66 
 67                 int i = 2;
 68                 foreach(var block in blocks)
 69                 {
 70                     //设置单元格的文本内容
 71                     workSheet.Cells[i, 1].Value= (i - 1).ToString();
 72                     workSheet.Cells[i, 2].Value = block.Name;
 73                     workSheet.Cells[i, 3].Value = block.Number.ToString();
 74                     workSheet.Cells[i, 4].Value = block.Rotation;
 75                     workSheet.Cells[i, 5].Value = block.Xposition;
 76                     workSheet.Cells[i, 6].Value = block.YPosition;
 77                     workSheet.Cells[i, 7].Value = block.Zposition;
 78                     i++;
 79                     
 80 
 81                 }
 82                 for (int m = 1; m < 100; m++)
 83                 {
 84                     workSheet.Columns[m].AutoFit();
 85                     workSheet.Rows[m].AutoFit();
 86                 }
 87                 trans.Commit();
 88 
 89             }
 90 
 91 
 92             workBook.SaveAs(@"C:\Users\lenovo\Desktop\Example11.XLS");
 93 
 94             // close excel and dispose reference
 95             excelApplication.Quit();
 96             excelApplication.Dispose();
 97 
 98 
 99         }
100         public static DynamicBlockReferencePropertyCollection GetDynProperties(this ObjectId blockId)
101         {
102             //获取块参照
103             BlockReference br = blockId.GetObject(OpenMode.ForRead) as BlockReference;
104             //如果不是动态块,则返回
105             if (br == null && !br.IsDynamicBlock) return null;
106             //返回动态块的动态属性
107             return br.DynamicBlockReferencePropertyCollection;
108         }
109         public static string GetDynBlockValue(this ObjectId blockId, string propName)
110         {
111             string propValue = null;//用于返回动态属性值的变量
112             var props = blockId.GetDynProperties();//获得动态块的所有动态属性
113 
114             //遍历动态属性
115             foreach (DynamicBlockReferenceProperty prop in props)
116             {
117                 //如果动态属性的名称与输入的名称相同
118                 if (prop.PropertyName == propName)
119                 {
120                     //获取动态属性值并结束遍历
121                     propValue = prop.Value.ToString();
122                     break;
123                 }
124             }
125             return propValue;//返回动态属性值
126         }
127         /// <summary>
128         /// 根据数据库获取命令行对象
129         /// </summary>
130         /// <param name="db">数据库对象</param>
131         /// <returns>返回命令行对象</returns>
132         public static Editor GetEditor(this Database db)
133         {
134             return Application.DocumentManager.GetDocument(db).Editor;
135         }
136         /// <summary>
137         /// 获取模型空间中类型为T的所有实体(对象打开为读)
138         /// </summary>
139         /// <typeparam name="T">实体的类型</typeparam>
140         /// <param name="db">数据库对象</param>
141         /// <returns>返回模型空间中类型为T的实体</returns>
142         public static List<T> GetEntsInModelSpace<T>(this Database db) where T : Entity
143         {
144             return GetEntsInModelSpace<T>(db, OpenMode.ForRead, false);
145         }
146 
147         /// <summary>
148         /// 获取模型空间中类型为T的所有实体
149         /// </summary>
150         /// <typeparam name="T">实体的类型</typeparam>
151         /// <param name="db">数据库对象</param>
152         /// <param name="mode">实体打开方式</param>
153         /// <param name="openErased">是否打开已删除的实体</param>
154         /// <returns>返回模型空间中类型为T的实体</returns>
155         public static List<T> GetEntsInModelSpace<T>(this Database db, OpenMode mode, bool openErased) where T : Entity
156         {
157             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
158             //声明一个List类的变量,用于返回类型为T为的实体列表
159             List<T> ents = new List<T>();
160             //获取类型T代表的DXF代码名用于构建选择集过滤器
161             string dxfname = RXClass.GetClass(typeof(T)).DxfName;
162             //构建选择集过滤器        
163             TypedValue[] values = { new TypedValue((int)DxfCode.Start, dxfname),
164                                     new TypedValue((int)DxfCode.LayoutName,"Model")};
165             SelectionFilter filter = new SelectionFilter(values);
166             //选择符合条件的所有实体
167             PromptSelectionResult entSelected = ed.SelectAll(filter);
168             if (entSelected.Status == PromptStatus.OK)
169             {
170                 //循环遍历符合条件的实体
171                 foreach (var id in entSelected.Value.GetObjectIds())
172                 {
173                     //将实体强制转化为T类型的对象
174                     //不能将实体直接转化成泛型T,必须首先转换成object类
175                     T t = (T)(object)id.GetObject(mode, openErased);
176                     ents.Add(t);//将实体添加到返回列表中
177                 }
178             }
179             return ents;//返回类型为T为的实体列表
180         }
181 
182         public static ObjectId AddTableStyle(string style)
183         {
184             ObjectId styleId; // 存储表格样式的Id
185             Database db = HostApplicationServices.WorkingDatabase;
186             using (Transaction trans = db.TransactionManager.StartTransaction())
187             {
188                 // 打开表格样式字典
189                 DBDictionary dict = (DBDictionary)db.TableStyleDictionaryId.GetObject(OpenMode.ForRead);
190                 if (dict.Contains(style)) // 如果存在指定的表格样式
191                     styleId = dict.GetAt(style); // 获取表格样式的Id
192                 else
193                 {
194                     TableStyle ts = new TableStyle(); // 新建一个表格样式
195                     // 设置表格的标题行为灰色
196                     ts.SetBackgroundColor(Color.FromColorIndex(ColorMethod.ByAci, 8), (int)RowType.TitleRow);
197                     // 设置表格所有行的外边框的线宽为0.30mm
198                     ts.SetGridLineWeight(LineWeight.LineWeight030, (int)GridLineType.OuterGridLines, TableTools.AllRows);
199                     // 不加粗表格表头行的底部边框
200                     ts.SetGridLineWeight(LineWeight.LineWeight000, (int)GridLineType.HorizontalBottom, (int)RowType.HeaderRow);
201                     // 不加粗表格数据行的顶部边框
202                     ts.SetGridLineWeight(LineWeight.LineWeight000, (int)GridLineType.HorizontalTop, (int)RowType.DataRow);
203                     // 设置表格中所有行的文本高度为1
204                     ts.SetTextHeight(1, TableTools.AllRows);
205                     // 设置表格中所有行的对齐方式为正中
206                     ts.SetAlignment(CellAlignment.MiddleCenter, TableTools.AllRows);
207                     dict.UpgradeOpen();//切换表格样式字典为写的状态
208                     // 将新的表格样式添加到样式字典并获取其Id
209                     styleId = dict.SetAt(style, ts);
210                     // 将新建的表格样式添加到事务处理中
211                     trans.AddNewlyCreatedDBObject(ts, true);
212                     trans.Commit();
213                 }
214             }
215             return styleId; // 返回表格样式的Id
216         }
217 
218 
219 
220     }
221         
222 
223     }

在这个功能完成之后,接下来在做保存的dwg格式的图纸自动转换成pdf格式的开发,希望可以在一周内做完吧。

转载于:https://www.cnblogs.com/yth0812/p/9370069.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值