Solidworks 二次开发简介

1 概述
2 什么是Solidworks二次开发?
3 Solidworks二次开发的意义
4 Solidworks二次开发的应用
5 Solidworks二次开发的工具
6 Solidworks二次开发的步骤
7 Solidworks二次开发的技巧
8 Solidworks二次开发的优势
9 Solidworks二次开发的挑战
10 如何学习Solidworks二次开发?
11 Solidworks二次开发的未来
12 成功案例
13 结论
14 常见问题解答
Solidworks二次开发

  1. 概述
  2. 什么是Solidworks二次开发?
    2.1 Solidworks二次开发的意义
    2.2 Solidworks二次开发的应用
    2.3 Solidworks二次开发的工具
  3. Solidworks二次开发的步骤
  4. Solidworks二次开发的技巧
  5. Solidworks二次开发的优势
  6. Solidworks二次开发的挑战
  7. 如何学习Solidworks二次开发?
  8. Solidworks二次开发的未来
  9. 成功案例
  10. 结论
  11. 常见问题解答
    Solidworks二次开发
  12. 概述
    Solidworks是一种广泛应用于工程设计领域的软件,而Solidworks二次开发是在其基础上进行二次开发,以满足个性化需求和提升工作效率。

  13. 什么是Solidworks二次开发?
    2.1 Solidworks二次开发的意义
    Solidworks二次开发可以根据用户的具体需求,定制化功能,使得软件更加适用于不同行业和项目。

2.2 Solidworks二次开发的应用
Solidworks二次开发广泛应用于机械设计、汽车制造、航空航天等领域,为工程师提供更加灵活的工具和解决方案。

2.3 Solidworks二次开发的工具
Solidworks二次开发的工具包括API(应用程序接口)、宏、插件等,用户可以根据需要选择合适的工具进行开发。

  1. Solidworks二次开发的步骤
    Solidworks二次开发的步骤包括需求分析、设计、编码、测试和部署等,确保开发过程顺利进行。

  2. Solidworks二次开发的技巧
    在Solidworks二次开发中,掌握好编程技巧和Solidworks API的使用是非常重要的。

  3. Solidworks二次开发的优势
    Solidworks二次开发的优势在于可以满足个性化需求,提高工作效率,并且可以与现有系统无缝集成。

  4. Solidworks二次开发的挑战
    尽管Solidworks二次开发有诸多优势,但也面临着技术难度较高、学习曲线陡峭等挑战。

  5. 如何学习Solidworks二次开发?
    想要学习Solidworks二次开发,可以通过官方文档、在线教程、参加培训班等方式进行学习。

  6. Solidworks二次开发的未来
    随着工业技术的不断发展,Solidworks二次开发将会越来越受到重视,为各行业提供更加个性化的解决方案。

  7. 成功案例
    列举一些成功应用Solidworks二次开发的案例,展示其在实际应用中的价值和作用。

  8. 结论
    Solidworks二次开发是一项非常有前景的工作,通过学习和实践,可以为个人和企业带来巨大的价值。

  9. 常见问题解答
  10. Solidworks二次开发难吗?

学习任何新技能都会面临一定的挑战,Solidworks二次开发也不例外。但只要您有耐心和毅力,掌握Solidworks二次开发并不是一件太困难的事情。

  1. 学习Solidworks二次开发需要具备什么样的基础?

最好具备一定的编程基础,熟悉面向对象的编程语言会有所帮助。另外,对Solidworks软件的基本操作也是必备的。

  1. Solidworks二次开发有哪些实际应用?

Solidworks二次开发可以应用于各种工程设计项目,比如自动化设计、定制化功能开发等。具体应用取决于您的需求和创造力。

  1. 学习Solidworks二次开发需要多长时间?

这取决于个人的学习速度和投入时间。一般来说,掌握基本的Solidworks二次开发技能可能需要几个月到一年的时间。

  1. 学会Solidworks二次开发之后,可以从中获得什么?

定制化工具和功能:通过二次开发,您可以根据特定需求创建定制化的工具和功能,以提高工作效率和自动化工作流程[1].
增强用户体验:二次开发可以帮助改善Solidworks的用户体验,例如添加新的按钮、工具栏或界面元素来使操作更加直观和便捷[2].
自动化任务:您可以利用二次开发创建脚本和宏来自动执行重复性任务,从而节省时间和减少错误[4].
提高生产效率:通过开发定制化的解决方案,您可以加快产品设计和开发过程,从而提高生产效率和降低成本[5].
🌐 Sources
zhuanlan.zhihu.com – 畅谈SolidWorks与API 二次开发
zhihu.com – 如何进行Solidworks二次开发?
csdn.net – C# Solidworks二次开发:自动创建虚拟零件及使用注意事项
ugapi.com – 智汇3D联合SolidWorks二次开发圈内多位资深开发者

SolidWorks二次开发-Pack And Go实例

SolidWorks二次开发指的是使用SolidWorks软件提供的开发工具和API(应用程序接口),对SolidWorks软件进行定制化开发,以适应用户特定需求的过程。通过这种方式,用户可以自定义SolidWorks的功能、界面和工具,使其更加符合其工作流程和需求,提高工作效率和精度。SolidWorks二次开发需要具备一定的编程和软件开发技能,比如熟悉C++、C#、VB、Python等编程语言,并熟悉SolidWorks API的使用方法。

刚好最近没什么主题写文章,有个网友自学开发,问到打包的改名问题。我就来写个例子吧,因为官方的例子只写了加前缀和生缀,没有写如何修改每个零件的名称,以及如何保持标准件的原始引用关系。

举个例子,下面这个零件有三个零件一个工程图
在这里插入图片描述

在这里插入图片描述
如果用英文系统或者英文版solidworks的人肯定能看出来,这个操作是Pack And Go
所以先在api帮助中找一找。
在这里插入图片描述
再具体的例子我就不讲了,直接上引起代码:


        private void btnPackAndGo_Click(object sender, EventArgs e)
        {

            SldWorks swApp = Utility.ConnectToSolidWorks();

            string sourceAsmFile = @"D:\09_Study\CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\TempAssembly.sldasm";
            string targetAsmFolder = @"D:\PackPath\";
            Dictionary<string, string> replaceList= new Dictionary<string, string>();

            replaceList.Add("TempAssembly", "我的新装配");
            replaceList.Add("clamp1", "新零件1");
            replaceList.Add("clamp3", "新零件6");
            replaceList.Add("MateTest", "配合测试");

            PackAndGo(swApp, sourceAsmFile, targetAsmFolder, true,replaceList,"SW-","");

        }

        /// <summary>
        /// 利用solidworks打包
        /// </summary>
        /// <param name="swApp"></param>
        /// <param name="sourceAsmFile">源装配体路径</param>
        /// <param name="targetAsmFile">目标路径</param>
        /// <param name="includeDwg">是否包含图纸</param>
        /// <param name="replaceList">替换内容</param>
        /// <param name="AddPrefix">前缀</param>
        /// <param name="AddSuffix">后缀</param>
        private void PackAndGo(SldWorks swApp, string sourceAsmFile,string targetAsmFolder,bool includeDwg, Dictionary<string,string> replaceList,string AddPrefix="",string AddSuffix="")
        {
            ModelDoc2 swModelDoc = default(ModelDoc2);
            ModelDocExtension swModelDocExt = default(ModelDocExtension);
            PackAndGo swPackAndGo = default(PackAndGo);         
            bool status = false;
            int warnings = 0;
            int errors = 0;
            int i = 0;
            int namesCount = 0;
            string myPath = null;
            int[] statuses = null;

            // Open assembly

            swModelDoc = (ModelDoc2)swApp.OpenDoc6(sourceAsmFile, (int)swDocumentTypes_e.swDocASSEMBLY, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", ref errors, ref warnings);
            swModelDocExt = (ModelDocExtension)swModelDoc.Extension;

            // Get Pack and Go object
            Debug.Print("Pack and Go");
            swPackAndGo = (PackAndGo)swModelDocExt.GetPackAndGo();

            // Get number of documents in assembly
            namesCount = swPackAndGo.GetDocumentNamesCount();
            Debug.Print("  Number of model documents: " + namesCount);

            // Include any drawings, SOLIDWORKS Simulation results, and SOLIDWORKS Toolbox components
            swPackAndGo.IncludeDrawings = includeDwg;
            Debug.Print(" Include drawings: " + swPackAndGo.IncludeDrawings);
            swPackAndGo.IncludeSimulationResults = true;
            Debug.Print(" Include SOLIDWORKS Simulation results: " + swPackAndGo.IncludeSimulationResults);
            swPackAndGo.IncludeToolboxComponents = true;
            Debug.Print(" Include SOLIDWORKS Toolbox components: " + swPackAndGo.IncludeToolboxComponents);

            // Get current paths and filenames of the assembly's documents
            object fileNames;
            object[] pgFileNames = new object[namesCount - 1];
            status = swPackAndGo.GetDocumentNames(out fileNames);
            pgFileNames = (object[])fileNames;

            Debug.Print("");
            Debug.Print("  Current path and filenames: ");
            if ((pgFileNames != null))
            {
                for (i = 0; i <= pgFileNames.GetUpperBound(0); i++)
                {
                    Debug.Print("    The path and filename is: " + pgFileNames[i]);
                }
            }

            // Get current save-to paths and filenames of the assembly's documents
            object pgFileStatus;
            status = swPackAndGo.GetDocumentSaveToNames(out fileNames, out pgFileStatus);
            pgFileNames = (object[])fileNames;
            Debug.Print("");
            Debug.Print("  Current default save-to filenames: ");
            if ((pgFileNames != null))
            {
                for (i = 0; i <= pgFileNames.GetUpperBound(0); i++)
                {
                    Debug.Print("   The path and filename is: " + pgFileNames[i]);
                }
            }

            // Set folder where to save the files

            status = swPackAndGo.SetSaveToName(true, targetAsmFolder);

            // Flatten the Pack and Go folder structure; save all files to the root directory
            swPackAndGo.FlattenToSingleFolder = true;

            // Add a prefix and suffix to the filenames
            swPackAndGo.AddPrefix = AddPrefix;
            swPackAndGo.AddSuffix = AddSuffix;

            // Verify document paths and filenames after adding prefix and suffix
            object getFileNames;
            object getDocumentStatus;
            string[] pgGetFileNames = new string[namesCount - 1];

            status = swPackAndGo.GetDocumentSaveToNames(out getFileNames, out getDocumentStatus);
            pgGetFileNames = (string[])getFileNames;
            Debug.Print("");
            Debug.Print("  My Pack and Go path and filenames after adding prefix and suffix: ");
            for (i = 0; i <= pgGetFileNames.Count()-1; i++)
            {

                Debug.Print("  替换前  My path and filename is: " + pgGetFileNames[i]);

                foreach (var replaceItem  in replaceList)
                {
                    pgGetFileNames[i]= pgGetFileNames[i].Replace(replaceItem.Key, replaceItem.Value);
                }

                Debug.Print("  替换后  My path and filename is: " + pgGetFileNames[i]);

             }

            //重新保存名称
            swPackAndGo.SetDocumentSaveToNames(pgGetFileNames);

            // 执行打包。
            statuses = (int[])swModelDocExt.SavePackAndGo(swPackAndGo);

            swApp.CloseDoc(swApp.IActiveDoc2.GetPathName());

        }

执行完结果 就这样了,打开是正常的。
在这里插入图片描述
好了,今天就写这么多了。这是是经常用的一个方法,需要大家自己消化。

SolidWorks二次开发—打开文件那些事

月末了,这个月的任务还没完成,难道是因为太忙了吗,好像不是。
今天就简单记录一下前一段时间有人问的一个问题,怎么知道文件在没有在solidworks中打开。如果没打开就做A ,已经打开了就做B. 别乱想,只是说某个动作哈。
大家看过之前的教程的都知道Opendoc这个方法。
这个就是打开某个已经存在的文件并返回它的指针(瞎翻译的哈)
在这里插入图片描述
但是这个和网友问的问题没什么直接关系,要想知道文件有没有打开,常规思路就有以下几种:

  • 遍历已经打开的文件,进行对比
Traverse All Open Documents Example (C++ COM)
  • 切换到该名称的文件,如果成功则表示已经打开。
var swModel= swApp.IActivateDoc("xxx.sldprt");
  • 直接利用打开命令,看看执行完是不是当前零件。(如果文件已经打开,会返回一个对象,但没有激活)
            //打开文件
            var fileName = @"XXXXX";
            int errors = 0;
            int warnings = 0;

            var swModel = (ModelDoc2)swApp.OpenDoc6(fileName, (int)swDocumentTypes_e.swDocASSEMBLY, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", ref errors, ref warnings);
有没有更厉害的办法呢,我们再找一找。我假装我英文很牛B,搜索一下opened document
发现以下内容,最后一个有点像。

在这里插入图片描述

在这里插入图片描述
到目前为止,最直接的方法就是GetOpenDocumentByName
在这里插入图片描述
示例代码如下:


            var partOpened = swApp.GetOpenDocumentByName(@"D:9_StudyCSharpAndSolidWorksCSharpAndSolidWorksTemplateModelclamp3.sldprt");

            if (partOpened!=null)
            {
                MessageBox.Show("该文件已经被打开");
            }
            else
            {
                MessageBox.Show("该文件已经没有被打开。");
            }

好了,结束了。

收藏好地址,以防找不到。
https://gitee.com/painezeng/CSharpAndSolidWorks