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格式的开发,希望可以在一周内做完吧。