njsgcs 2024-06-08 13:20 采纳率: 100%
浏览 11
已结题

c# solidworks 插件 。exe窗口程序 怎么给solidwo插件发送命令或者信息.。调用sw插件的类,和方法


```c#
      public bool ConnectToSW(object ThisSW, int Cookie)
      {
          iSwApp = (ISldWorks)ThisSW;
          addinCookieID = Cookie;
          //iSwApp.SendMsgToUser(Convert.ToString( Cookie));
          iSwApp.SetAddinCallbackInfo(0, this, addinCookieID);
          iCmdMgr = iSwApp.GetCommandManager(addinCookieID);
          
          主窗口 = new 主窗口(SwApp);
          主窗口.Show();             
           //AddCommandMgr();
          var SwEventPtr = (SolidWorks.Interop.sldworks.SldWorks)iSwApp;
          
          SwEventPtr.FileOpenNotify2 += new DSldWorksEvents_FileOpenNotify2EventHandler( swApp_FileOpenNotify2);
          

          return true;
      }



     private int swApp_FileOpenNotify2(string name)
     {
      
         ModelDoc2 swModel = (ModelDoc2)iSwApp.ActiveDoc;
         string 零件名= Path.GetFileNameWithoutExtension(name);

   
         if (主窗口.属性实例!=null&& 主窗口.属性实例.prtname无后缀!= 零件名
             || 主窗口.属性实例 == null || 主窗口.属性实例 == default)
         {
             主窗口.聊天记录 = "";
             主窗口.创建基本实例();
         }
         if (swModel.GetType() == (int)swDocumentTypes_e.swDocPART)
         {

             主窗口.过零件图();
         }
         else if (swModel.GetType() == (int)swDocumentTypes_e.swDocDRAWING)
         {

             主窗口.过工程图();
         }
         else if (swModel.GetType() == (int)swDocumentTypes_e.swDocASSEMBLY) {
             主窗口.属性实例.装配图=true;
         }
         return 0; // 返回 0 表示成功
     }

 public void 创建基本实例() {
     属性实例 = new3d得到属性实例();
     属性实例.sldWorks = SwApp2;
     string 项目地址;
     if (!保存地址.得到项目地址(out 项目地址)) { return; }
     this.属性实例.项目地址 = 项目地址;
     属性实例.地址读取();


 }
        public 主窗口(ISldWorks SwApp)
        {

            聊天记录 = "";
            SwApp2 = SwApp;
            InitializeComponent();



            输入窗口 输入窗口 = new 输入窗口();
            输入窗口.InputValueEntered += (sender, e2) =>//////////我要用exe  winform替代这个窗口
            {
                输入内容 = e2.Value;
                读取信息();
                输入窗口.textBox1.Text = "";
            };
            输入窗口.Show();
            this.StartPosition = FormStartPosition.Manual;
            int screenWidth = Screen.PrimaryScreen.WorkingArea.Width;
            int screenHeight = Screen.PrimaryScreen.WorkingArea.Height;
            this.Location = new Point(screenWidth - this.Width, 0);
            int extendedStyle = (int)GetWindowLong(this.Handle, GWL_EXSTYLE);
            SetWindowLong(this.Handle, GWL_EXSTYLE, (uint)extendedStyle | WS_EX_LAYERED | WS_EX_TRANSPARENT);

        }
   private void 读取信息()///////我要用exe  winform调用插件的这个这个方法
   {            else if (输入内容 == "1*2")
            {
                属性实例.聊天记录 = "";
                this.从3d实例生成dxf();                ///////此处或者别的命令需要调用当前属性实例的内容  而属性实例是在打开文件的时候插件自动产生的
                聊天记录 = 聊天记录 + "1*2   生成dxf" + "\n" + 属性实例.聊天记录;
            }
}

```

  • 写回答

12条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2024-06-08 13:28
    关注

    🕒下午好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:桃李春风一杯酒,江 湖夜雨十年灯。

    你想要实现的是从外部的.exe程序向Solidworks插件发送命令并传递数据。这可以通过以下几种方法实现:

    方法一:使用COM Interop(推荐)

    1. 定义COM接口: 在Solidworks插件项目中创建一个COM接口,定义你需要暴露给外部程序的方法和属性。
      [ComVisible(true)]
      [Guid("YOUR_GUID_HERE")] // 替换为唯一的GUID
      public interface IMySolidworksPlugin
      {
          void ExecuteCommand(string command, string data);
          string GetProperty(string propertyName);
      }
      
    2. 实现COM接口: 修改你的插件类,实现上述接口,并在其中编写实际的命令处理逻辑。
      [ComVisible(true)]
      [Guid("YOUR_GUID_HERE")] 
      public class MySolidworksAddin : ISwAddin, IMySolidworksPlugin // 实现你的插件接口和COM接口
      {
          // ... 你的插件代码 ...
      
          public void ExecuteCommand(string command, string data)
          {
              // 根据传入的command和data执行相应的操作
              switch (command)
              {
                  case "CreateDXF":
                      this.从3d实例生成dxf();
                      break;
                  // ... 其他命令
              }
          }
      
          public string GetProperty(string propertyName)
          {
              // 根据propertyName返回属性值
              switch (propertyName)
              {
                  case "聊天记录":
                      return 属性实例.聊天记录;
                  // ... 其他属性
              }
          }
      }
      
    3. 注册COM组件: 编译插件后,需要将其注册为COM组件,以便外部程序可以找到它。
      • 你可以使用 regasm.exe 工具注册COM组件。
      • 或者,你可以在插件的安装程序中注册COM组件。
    4. 外部程序调用: 在你的.exe程序中,添加对Solidworks插件COM接口的引用。
      // 添加COM引用
      using MySolidworksPluginLib; 
      
      // 获取Solidworks插件实例
      Type swAddinType = Type.GetTypeFromProgID("MySolidworksPlugin.Addin"); // 替换为你的插件的ProgID
      IMySolidworksPlugin swPlugin = (IMySolidworksPlugin)Activator.CreateInstance(swAddinType);
      
      // 调用插件方法
      swPlugin.ExecuteCommand("CreateDXF", "");
      string chatLog = swPlugin.GetProperty("聊天记录");
      

    方法二:使用Windows消息

    1. 定义消息: 在插件和.exe程序中定义相同的Windows消息ID。
      // 定义消息ID
      const int WM_MY_MESSAGE = 0x0400 + 100; 
      
    2. 发送消息: 在.exe程序中,使用 SendMessage API 发送消息给Solidworks窗口,并传递命令和数据。
      // 获取Solidworks主窗口句柄
      IntPtr hWnd = FindWindow(null, "Solidworks"); 
      
      // 发送消息
      string command = "CreateDXF";
      string data = "";
      CopyDataStruct cds = new CopyDataStruct();
      cds.dwData = (IntPtr)1; // 自定义数据类型标识
      cds.cbData = (command + "|" + data).Length + 1; 
      cds.lpData = Marshal.StringToHGlobalAnsi(command + "|" + data);
      SendMessage(hWnd, WM_MY_MESSAGE, IntPtr.Zero, ref cds);
      
    3. 接收消息: 在Solidworks插件中,重写 WndProc 方法,处理接收到的消息并执行相应操作。
      protected override void WndProc(ref Message m)
      {
          if (m.Msg == WM_MY_MESSAGE)
          {
              // 处理接收到的消息
              CopyDataStruct cds = (CopyDataStruct)Marshal.PtrToStructure(m.LParam, typeof(CopyDataStruct));
              string data = Marshal.PtrToStringAnsi(cds.lpData);
              string[] parts = data.Split('|');
              string command = parts[0];
              string data = parts[1];
      
              // 根据 command 和 data 执行操作
          }
          base.WndProc(ref m);
      }
      

    方法三:使用文件或数据库进行通信

    • .exe程序可以将命令和数据写入文件或数据库。
    • Solidworks插件可以定期读取文件或数据库,并执行相应的操作。

    建议:

    • 方法一(COM Interop)是推荐的方法,因为它提供了更结构化、更安全的通信方式。
    • 方法二(Windows消息)比较简单直接,但容易出现消息冲突等问题。
    • 方法三(文件或数据库)适用于非实时通信场景。

    选择最适合你的方法取决于你的具体需求和项目复杂度。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(11条)

报告相同问题?

问题事件

  • 系统已结题 6月17日
  • 已采纳回答 6月9日
  • 创建了问题 6月8日

悬赏问题

  • ¥20 关于游戏c++语言代码问题
  • ¥15 如何制作永久二维码,最好是微信也可以扫开的。(相关搜索:管理系统)
  • ¥15 delphi indy cookie 有效期
  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏
  • ¥15 免费的电脑视频剪辑类软件如何盈利
  • ¥30 MPI读入tif文件并将文件路径分配给各进程时遇到问题
  • ¥15 pycharm中导入模块出错
  • ¥20 Ros2 moveit2 Windows环境配置,有偿,价格可商议。
  • ¥15 有关“完美的代价”问题的代码漏洞