using Autodesk.AutoCAD; using Autodesk.AutoCAD.Interop; using Autodesk.AutoCAD.Interop.Common; //using Autodesk.AutoCAD; //using Autodesk.AutoCAD.Interop; //using Autodesk.AutoCAD.Interop.Common; using Microsoft.Win32; using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace MetroGauges.General { public class CadHelper { private static WpfCadTool frm; //"Autodesk.AutoCAD.17" stands for AutoCAD 2007-2009 //"Autodesk.AutoCAD.18" stands for AutoCAD 2010-2012 //"Autodesk.AutoCAD.19" stands for AutoCAD 2013-2014 //"Autodesk.AutoCAD.20" stands for AutoCAD 2015-2016 //"Autodesk.AutoCAD.21" stands for AutoCAD 2017 const string _autocadClassId = "AutoCAD.Application.19"; public const int RED = 0X0A; public const int GREEN = 0X0B; public const int BLUE = 0X0C; public const int YELLOW = 0X0D; public const int CYAN = 0X0E; public static WpfCadTool CadTool { get { if (frm == null) { frm = new WpfCadTool(); } return frm; } } /// /// 在现有的cad绘图界面画图 /// public CadHelper() { initCad(); } /// /// 新建一个名为name的绘图界面绘图 /// /// 绘图界面名字 public CadHelper(string name) { initCad(); AddNewGraph(name); } private void AddNewGraph(string name) { if (!IsCadRunning()) { return; } AcadApplication CadApp = _application; CadApp.Documents.Add(name); } public void ZoomAll() { AcadApplication CadApp = _application; CadApp.Visible = true; CadApp.ZoomAll(); } public bool AddLayer(string name, int color) { if (!IsCadRunning()) { return false; } AcadApplication CadApp = _application; AcadDocument CadDoc; try { CadDoc = CadApp.ActiveDocument; } catch (Exception) { CadApp.Documents.Add(); } AcadLayer newLayer = CadApp.ActiveDocument.Layers.Add(name); CadApp.ActiveDocument.ActiveLayer = newLayer; switch (color) { case RED: newLayer.color = AcColor.acRed; break; case GREEN: newLayer.color = AcColor.acGreen; break; case BLUE: newLayer.color = AcColor.acBlue; break; case YELLOW: newLayer.color = AcColor.acYellow; break; case CYAN: newLayer.color = AcColor.acCyan; break; default: newLayer.color = AcColor.acWhite; break; } return true; } //画线 public bool DrawLine(double[] startPoint, double[] endPoint) { if (!IsCadRunning()) { return false; } if (startPoint == null || startPoint.Length < 2 || endPoint == null || endPoint.Length < 2) { return false; } double[] sp = startPoint; double[] ep = endPoint; if (sp.Length == 2) { sp = new double[3]; sp[0] = startPoint[0]; sp[1] = startPoint[1]; sp[2] = 0.0; } if (ep.Length == 2) { ep = new double[3]; ep[0] = endPoint[0]; ep[1] = endPoint[1]; ep[2] = 0.0; } AcadApplication CadApp = _application; CadApp.ActiveDocument.ModelSpace.AddLine(sp, ep); return true; } //画圆 public bool DrawCircle(double[] Centre, double Radius)//画圆 { if (!IsCadRunning()) { return false; } AcadCircle CircleObj; double[] C = Centre; if (C.Length == 2) { C = new double[3]; C[0] = Centre[0]; C[1] = Centre[1]; C[2] = 0.0; } AcadApplication CadApp = _application; CircleObj = CadApp.ActiveDocument.ModelSpace.AddCircle(C, Radius); return true; } //画矩形 public bool DrawRectang(double[] Point0, double[] Point1, double[] Point2, double[] Point3)//画矩形 { if (!IsCadRunning()) { return false; } double[] P0 = Point0; double[] P1 = Point1; double[] P2 = Point2; double[] P3 = Point3; if (P0.Length == 2) { P0 = new double[3]; P0[0] = Point0[0]; P0[1] = Point0[1]; P0[2] = 0.0; } if (P1.Length == 2) { P1 = new double[3]; P1[0] = Point1[0]; P1[1] = Point1[1]; P1[2] = 0.0; } if (P2.Length == 2) { P2 = new double[3]; P2[0] = Point2[0]; P2[1] = Point2[1]; P2[2] = 0.0; } if (P3.Length == 2) { P3 = new double[3]; P3[0] = Point3[0]; P3[1] = Point3[1]; P3[2] = 0.0; } AcadApplication CadApp = _application; CadApp.ActiveDocument.ModelSpace.AddLine(P0, P1); CadApp.ActiveDocument.ModelSpace.AddLine(P1, P2); CadApp.ActiveDocument.ModelSpace.AddLine(P2, P3); CadApp.ActiveDocument.ModelSpace.AddLine(P3, P0); return true; } public bool DrawText(string text, double[] insertPoint)//坐标点标注 { return DrawText(text, insertPoint, 5.0); } public bool DrawText(string text, double[] insertPoint, double height) { if (!IsCadRunning()) { return false; } if (insertPoint == null || insertPoint.Length < 2) { return false; } double[] p = insertPoint; if (p.Length == 2) { p = new double[3]; p[0] = insertPoint[0]; p[1] = insertPoint[1]; p[2] = 0.0; } AcadApplication CadApp = _application; AcadDocument CadDoc; try { CadDoc = CadApp.ActiveDocument; } catch (Exception) { CadApp.Documents.Add(); } CadApp.ActiveDocument.ModelSpace.AddText(text, p, height); return true; } private static dynamic _application; public bool IsCadRunning() { if (_application == null) { return false; } return true; } private void GetAutoCAD() { _application = Marshal.GetActiveObject(_autocadClassId); AcadApplication cad = _application as AcadApplication; cad.BeginQuit += Cad_BeginQuit; } private void Cad_BeginQuit(ref bool Cancel) { frm.Dispatcher.Invoke(new Action(() => { frm.Hide(); })); } private void StartAutoCad() { var t = Type.GetTypeFromProgID(_autocadClassId, true); // Create a new instance Autocad. var obj = Activator.CreateInstance(t, true); // No need for casting with dynamics _application = obj; //_application = new AcadApplication(); //AcadApplication CadApp = _application; //CadApp.Visible = true; AcadApplication cad = _application as AcadApplication; cad.BeginQuit += Cad_BeginQuit; } private void initCad() { try { initCadWithEx(); } catch (Exception) { _application = null; initCad(); } } private void initCadWithEx() { Console.WriteLine("Loading Autocad: {0}", _autocadClassId); if (_application == null) { try { GetAutoCAD(); } catch (COMException)//删除ex参数 { try { StartAutoCad(); } catch (Exception e2x) { Console.WriteLine(e2x); //ThrowComException(ex); _application = null; } } catch (Exception ex) { Console.WriteLine(ex); //ThrowComException(ex); _application = null; } } } public List GetAutoCADLocations() //获取系统各CAD版本集合的这个方法摘自才鸟新书里的例子 { //用于存储系统中安装的AutoCAD路径列表 List locations = new List(); // 获取HKEY_LOCAL_MACHINE键 RegistryKey keyLocalMachine = Registry.LocalMachine; // 打开AutoCAD所属的注册表键:HKEY_LOCAL_MACHINE\Software\Autodesk\AutoCAD RegistryKey keyAutoCAD = keyLocalMachine.OpenSubKey("Software\\Autodesk\\AutoCAD"); //获得表示系统中安装的各版本的AutoCAD注册表键 string[] cadVersions = keyAutoCAD.GetSubKeyNames(); foreach (string cadVersion in cadVersions) { //打开特定版本的AutoCAD注册表键 RegistryKey keyCADVersion = keyAutoCAD.OpenSubKey(cadVersion); //获取表示各语言版本的AutoCAD注册表键值 string[] cadNames = keyCADVersion.GetSubKeyNames(); foreach (string cadName in cadNames) { if (cadName.EndsWith("804"))//中文版本 { //打开中文版本的AutoCAD所属的注册表键 RegistryKey keyCADName = keyCADVersion.OpenSubKey(cadName); //获取AutoCAD的安装路径 string location = keyCADName.GetValue("Location").ToString(); locations.Add(location);//将路径添加到列表中 } } } return locations;//返回系统中安装的AutoCAD路径列表 } } }