cad.net 做一个启动cad的程序吧,通过注册表获取cad安装路径

实例是用winform做的...主要是消息机制部分...

实例代码: 

var cadProcess = new CadProcess();
if (cadProcess.Record.Length == 0)
{
    cadProcess.Run(CadProcess.RunCadVer.All);
}
if (cadProcess.Record.Length == 0)
{
    MessageBox.Show("你没有安装cad吗?");
    return;
}

 

//启动cad 

cad.net 做一个启动cad的程序吧,通过注册表获取cad安装路径
using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;

namespace JoinBoxCurrency
{
    public class CadProcess
    {
        public enum RunCadVer
        {
            Minimum,
            Maximum,
            All,
        }
        public Process[] Record { get; private set; }

        const string _acad = "acad";
        const string _acadexe = "\\acad.exe";
        string _workingDirectory;

        /// <summary>
        /// 获取已经打开的cad程序
        /// </summary>
        public void GetExisting()
        {
            Process[] pros = Process.GetProcessesByName(_acad);
            if (pros.Length > 0)
            {
                Record = pros;
            }
        }

        /// <summary>
        /// 构造函数,初始化
        /// </summary>
        public CadProcess()
        {
            Record = new Process[0];
            _workingDirectory = Environment.GetEnvironmentVariable("TEMP");
        }

        /// <summary>
        /// 启动cad程序
        /// </summary>
        /// <param name="runCadVer">启动什么版本</param>
        public void Run(RunCadVer runCadVer = RunCadVer.Minimum)
        {
            string progID = "AutoCAD.Application.";
            string exePath = null;

            //获取本机cad路径
            var regedit = new AcadDirs();
            if (regedit.Dirs.Count == 0)
            {
                return;
            }

            //按照版本排序
            var ob = regedit.Dirs.OrderBy(cad => cad.Version).ToList();
            switch (runCadVer)
            {
                case RunCadVer.Minimum:
                    {
                        progID += ob[0].Version;
                        exePath = ob[0].Location + _acadexe;
                        Run(progID, exePath);
                    }
                    break;
                case RunCadVer.Maximum:
                    {
                        progID += ob[ob.Count].Version;
                        exePath = ob[ob.Count].Location + _acadexe;
                        Run(progID, exePath);
                    }
                    break;
                case RunCadVer.All:
                    {
                        foreach (var reg in regedit.Dirs)
                        {
                            Run(progID + reg.Version, reg.Location + _acadexe);
                        }
                    }
                    break;
            }
        }


        private void Run(string progID, string exePath)
        {
            //处理GetActiveObject在电脑睡眠之后获取就会失败.所以要ProcessStartInfo
            //https://blog.csdn.net/yuandingmao/article/details/5558763?_t_t_t=0.8027849649079144
            //string progID = "AutoCAD.Application.17.1";
            //string exePath = @"C:\Program Files (x86)\AutoCAD 2008\acad.exe";

            object acApp = null;
            try
            {
                acApp = Marshal.GetActiveObject(progID);
            }
            catch { }
            if (acApp == null)
            {
                try
                {
                    // var psi = new ProcessStartInfo(exePath, "/p myprofile");//使用cad配置,myprofile是配置名称,默认就不写
                    var psi = new ProcessStartInfo(exePath, "/nologo")
                    {
                        WorkingDirectory = _workingDirectory//这里什么路径都可以的
                    };
                    Process pr = Process.Start(psi);
                    pr.WaitForInputIdle();
                    while (acApp == null)
                    {
                        try
                        {
                            acApp = Marshal.GetActiveObject(progID);
                        }
                        catch
                        {
                            Application.DoEvents();
                        }
                        Thread.Sleep(500);
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception("无法创建或附加到AutoCAD对象: " + ex.Message);
                }
            }
            if (acApp != null)
            {
                GetExisting();
            }
        }
    }
}
View Code

 

//通过注册表获取cad安装路径

cad.net 做一个启动cad的程序吧,通过注册表获取cad安装路径
using System.Collections.Generic;
using System.IO;
using Microsoft.Win32;

namespace JoinBoxCurrency
{
    public class AcadDirs
    { 
        public List<AcadProductKey> Dirs { get;}
        /// <summary>
        /// 通过注册表获取本机所有cad的安装路径
        /// </summary>
        public AcadDirs()
        {
            Dirs = new List<AcadProductKey>();

            RegistryKey Adsk = Registry.CurrentUser.OpenSubKey(@"Software\Autodesk\AutoCAD");
            if (Adsk == null)
            {
                return;
            }
            foreach (string ver in Adsk.GetSubKeyNames())
            {
                try
                {
                    RegistryKey emnuAcad = Adsk.OpenSubKey(ver);
                    var curver = emnuAcad.GetValue("CurVer");
                    if (curver == null)
                    {
                        return;
                    }
                    string app = curver.ToString();
                    string fmt = @"Software\Autodesk\AutoCAD\{0}\{1}";
                    emnuAcad = Registry.LocalMachine.OpenSubKey(string.Format(fmt, ver, app));
                    if (emnuAcad == null)
                    {
                        fmt = @"Software\Wow6432Node\Autodesk\AutoCAD\{0}\{1}";
                        emnuAcad = Registry.LocalMachine.OpenSubKey(string.Format(fmt, ver, app));
                    }

                    var acadLocation = emnuAcad.GetValue("AcadLocation");
                    if (acadLocation == null)
                    {
                        return;
                    }
                    string location = acadLocation.ToString();
                    if (File.Exists(location + "\\acad.exe"))
                    {
                        var produ = emnuAcad.GetValue("ProductName");
                        if (produ == null)
                        {
                            return;
                        }
                        string productname = produ.ToString();
                        var release = emnuAcad.GetValue("Release");
                        if (release == null)
                        {
                            return;
                        }
                        string[] strVer = release.ToString().Split(.);
                        var pro = new AcadProductKey()
                        {
                            ProductKey = emnuAcad,
                            Location = location,
                            ProductName = productname,
                            Version = double.Parse(strVer[0] + "." + strVer[1]),
                        };
                        Dirs.Add(pro);
                    }
                }
                catch { }
            }
        }

        public struct AcadProductKey
        {
            /// <summary>
            /// 注册表位置
            /// </summary>
            public RegistryKey ProductKey;
            /// <summary>
            /// cad安装路径
            /// </summary>
            public string Location;
            /// <summary>
            /// cad名称
            /// </summary>
            public string ProductName;
            /// <summary>
            /// cad版本号 17.1之类的
            /// </summary>
            public double Version;
        }
    }
}
View Code

 

cad.net 做一个启动cad的程序吧,通过注册表获取cad安装路径

上一篇:.net core使用rabbitmq消息队列 (二)


下一篇:.NET Core项目部署时端口号的自定义方式