导航

第三方窗口的集成2

Posted on 2017-10-13 12:01  Hosseini  阅读(293)  评论(0编辑  收藏  举报

接着上一篇,今天做了一点小改动,使用反射实例化对象来实现可插拔,即换掉功能dll,即可嵌入不同的CAD软件,操作不同的CAD软件。

这几天看了MVC,打算用这个模式,生搬硬套了一番,感觉还是很别扭。还是改回了我的野路子。

一共三个主要的类:

MainForm(主窗体)、BaseModel(模型基类)、SldModel(solidworks的模型类,继承至BaseModel)

对比MVC,我没有C,M和V直接发送关系。

 public class BaseModel
    {
        //1.启动
        virtual public bool Start()
        {
            return true;       
        }

        //2.关闭
        virtual public bool Kill()
        {
            return true; 
        }

        //3.获取主程序
        virtual public void GetApp()
        {
           
        }
    }
    public class SldModel:BaseModel
    {public SldWorks.SldWorks Appprivate void StartProcess(object path)
        {
            ProcessStartInfo MyStarInfo = new ProcessStartInfo();
            MyStarInfo.FileName = (string)path;
            ////窗口起始状态最大化
            MyStarInfo.WindowStyle = ProcessWindowStyle.Maximized;
            Process MyProcees = new Process();
            MyProcees.StartInfo = MyStarInfo;
            MyProcees.Start();
            MyProcees.WaitForInputIdle();
        }

        public override bool Start()
        {
            try
            {
                //启动
                StartProcess("D:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\SLDWORKS.exe");
                return true;
            }
            catch
            {
                return false;
            }
        }

        public override bool Kill()
        {
            try
            {
                App.ExitApp();
                return true;
            }
            catch
            {
                return false;
            }
        }

        public override void GetApp()
        {
          Thread.Sleep(5000);//等待启动完成     
          App = (SldWorks.SldWorks)Marshal.GetActiveObject("SldWorks.Application.24");
        } 

    }

以上是BaseModel和SldModel

接下来,在MainForm的load事件里面添加如下代码,

C:\Users\Administrator\Documents\Visual Studio 2012\Projects\LiuAddin\MDI\bin\Debug\model下面是SldModel所在的dll的文件夹。
        private void Form1_Load(object sender, EventArgs e)
        {
            
            //根据model下面的dll生成菜单栏
            //遍历sldPath下面所有的文件
            DirectoryInfo inf = new DirectoryInfo(@"C:\Users\Administrator\Documents\Visual Studio 2012\Projects\LiuAddin\MDI\bin\Debug\model");
            FileInfo[] dirInf = inf.GetFiles();

            foreach (FileInfo file in dirInf)
            {
                string ifileName = file.FullName;
                ToolStripMenuItem toolItem = new ToolStripMenuItem (file.Name);
                新建ToolStripMenuItem.DropDownItems.Add(toolItem);
                toolItem.Click+=toolItem_Click;
            }
        }

然后定义toolItem_Click事件,根据不同的菜单实例化不同的对象,调用。另外,菜单的名称我懒得改了,就是dll的名称。实际用的时候,可以改一下。

这样,下次你要加一个CATIA,写一个对应的dll,写相应的model类继承至BaseModel类,把这个dll放在

C:\Users\Administrator\Documents\Visual Studio 2012\Projects\LiuAddin\MDI\bin\Debug\model
        private void toolItem_Click(object sender, EventArgs e)
        {
            ToolStripMenuItem toolItem = (ToolStripMenuItem)sender;
            string dllname = toolItem.Text;
            string fullName = "C:\\Users\\Administrator\\Documents\\Visual Studio 2012\\Projects\\LiuAddin\\MDI\\bin\\Debug\\model\\" + dllname;
            //通过dllname反射实例化
            Assembly assembly = Assembly.LoadFile(fullName); // 加载程序集(EXE 或 DLL) 
            BaseModel model = (BaseModel)assembly.CreateInstance("SldModel.SldModel"); // 创建类的实例 

            model.Start();
            bool success = AddinForm("SolidWorks",  "SOLIDWORKS Premium 2016 x64 版", 50);
            if (success == false)
            {
                MessageBox.Show("等待超时,或者启动失败");
            }
            ThreadStart threadstart = new ThreadStart(model.GetApp);
            Thread thread = new Thread(threadstart);
            thread.Start();
        }