• 第三方窗口的集成2


    接着上一篇,今天做了一点小改动,使用反射实例化对象来实现可插拔,即换掉功能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:UsersAdministratorDocumentsVisual Studio 2012ProjectsLiuAddinMDIinDebugmodel下面是SldModel所在的dll的文件夹。
            private void Form1_Load(object sender, EventArgs e)
            {
                
                //根据model下面的dll生成菜单栏
                //遍历sldPath下面所有的文件
                DirectoryInfo inf = new DirectoryInfo(@"C:UsersAdministratorDocumentsVisual Studio 2012ProjectsLiuAddinMDIinDebugmodel");
                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:UsersAdministratorDocumentsVisual Studio 2012ProjectsLiuAddinMDIinDebugmodel
            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();
            }
  • 相关阅读:
    mkfs -t ext3 错误/dev/sdxx is apparently in use by the system; 解决方法 分类: arm-linux-Ubuntu 2015-01-24 09:43 514人阅读 评论(0) 收藏
    Linux下挂载新硬盘方法 分类: arm-linux-Ubuntu 2015-01-24 09:41 550人阅读 评论(2) 收藏
    RHCE6.4 rpm 安装gcc 分类: arm-linux-Ubuntu 2015-01-23 10:52 339人阅读 评论(0) 收藏
    ubuntu14.04 编译安装highpoint rocketraid 2720驱动 分类: arm-linux-Ubuntu 2015-01-22 17:18 321人阅读 评论(0) 收藏
    Red Hat Enterprise Linux 6 “桌面”、“工作站”、“服务器” 版本差异比较 分类: arm-linux-Ubuntu 2015-01-21 08:49 604人阅读 评论(0) 收藏
    c++11 : range-based for loop
    ntp server
    LevelDB 之 arena
    2-sat
    各种蕴含算法思想的DP
  • 原文地址:https://www.cnblogs.com/hosseini/p/7660510.html
Copyright © 2020-2023  润新知