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

Solidworks PDM二次开发—文件夹相关操作

Solidworks PDM二次开发—文件夹相关操作

前言

好久没有更新Solidworks PDM的操作了,今天我们来学习一下文件夹的几个常用操作。

新建文件夹

可以参考api中的帮助 Add Folder Example (C#) —这里面有相关的卡设置

               //new 一个库对象
                var vault = new EdmVault5();

                //登陆到库中
                vault.LoginAuto("PDM2020Default", this.Handle.ToInt32());

                var vault2 = (IEdmVault7)vault;

                //本地根目录
                var rootPath = vault2.RootFolderPath;

                               
                var rootFolder = vault2.RootFolder;

                //新建子文件夹
                //这里路径可以多个子层级 如A\B\C 

                var newFolder = rootFolder.CreateFolderPath($@"\newTempFolder", this.Handle.ToInt32());
 IEdmFolder5 parentFolder = default(IEdmFolder5);
                parentFolder = vault2.GetFolderFromPath(ListBox.Items[0].ToString());
 
                dynamic folderName = "Temp";
                IEdmUserMgr5 usrMgr = default(IEdmUserMgr5);
                usrMgr = (IEdmUserMgr5)parentFolder.Vault;
 
                EdmFolderData data = default(EdmFolderData);
                data = new EdmFolderData();
 
                data.SetUserRights(usrMgr.GetUser("Engineer1").ID, (int)EdmRightFlags.EdmRight_Read | (int)EdmRightFlags.EdmRight_Lock);
                data.SetGroupRights(usrMgr.GetUserGroup("Administrators").ID, (int)EdmRightFlags.EdmRight_All);
 
                IEdmCard5 card = default(IEdmCard5);
                card = parentFolder.Vault.RootFolder.GetCard("doc");
                data.SetCardSource(card.ID, "doc");
 
                IEdmFolder5 folder = default(IEdmFolder5);
                folder = parentFolder.AddFolder(this.Handle.ToInt32(), folderName, data);
                Interaction.MsgBox("Created " + folderName + " successfully with ID, " + Conversion.Str(folder.ID) + ", in " + parentFolder.Name);

获取文件夹对象

 	            //读取文件夹 

                //var tempFolderObj = vault2.GetFolderFromPath($@"文件夹路径");


                IEdmEnumeratorVariable6 EnumVarFolder = (IEdmEnumeratorVariable6)folderObj;

                object ResValueObjFolder = null;
                //object ResValueObjFolderDB = null;
                //从数据库中读
                //EnumVarFolder.GetVarFromDb("项目编号", "", out ResValueObjFolderDB);

                EnumVarFolder.GetVar("项目编号", "", out ResValueObjFolder);
                if (ResValueObjFolder != null)
                {
                    MessageBox.Show($"项目编号:" + ResValueObjFolder);
                }

删除文件夹

 			//删除文件夹 DeleteFolder Method (IEdmFolder5)

                rootFolder.DeleteFolder(this.Handle.ToInt32(), folderObj.ID, true);

刷新文件夹

     			//刷新本地文件夹

                rootFolder.Refresh();

结果正常:

结束,收工。

var code = "a7325120-55a0-49ed-9394-1bfdcde9edb6"

posted @
2023-04-25 15:47 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

SolidWorks二次开发-示例67.创建标准的三视图(工程图)

SolidWorks二次开发-示例67.创建标准的三视图(工程图)

一不小心,又快一个月没有交作业了,不知道有没有人期待我的作业。
不过今天会让大家失望,今天是补交作业。
补一下之前未写的示例:
67.创建标准的三视图

具体的我就不细讲了,直接上代码了:

private void btnCreate3thSTDView_Click(object sender, EventArgs e)
        {
            SldWorks swApp = Utility.ConnectToSolidWorks();

            string dotPath = @"D:\09_Study\CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\Drawing.drwdot";

            //用我们的模板新建一个工程图
            var Part = swApp.NewDocument(dotPath, 12, 0, 0);

            ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;        
        
            DrawingDoc drawingDoc = (DrawingDoc)swModel;

            string partPath = @"D:\09_Study\CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\bodies.sldasm";

            //在右侧工程图窗体刷新所有视图
            //drawingDoc.GenerateViewPaletteViews(partPath);

            //给视图插入模型 参数指定视图方向 与坐标

            var view1=  drawingDoc.CreateDrawViewFromModelView3(partPath, "*Front", 0.1, 0.1, 0);

            var boolstatus = swModel.Extension.SelectByID2(view1.Name, "DRAWINGVIEW", 0, 0, 0, false, 0, null, 0);

            //创建第一个关联视图
            var view2 = drawingDoc.CreateUnfoldedViewAt3(0.25, 0.1, 0, false);

             boolstatus = swModel.Extension.SelectByID2(view1.Name, "DRAWINGVIEW", 0, 0, 0, false, 0, null, 0);

            //创建第二个关联视图
            var view3 = drawingDoc.CreateUnfoldedViewAt3(0.1, 0.18, 0, false);

            //设定比例
            view1.ScaleDecimal = 0.25;


            swModel.EditRebuild3();


        }

上结果 :

好了,我写完了。
完了之后 ,我问了下GPT,看它能给我什么样的方案。

发现它可以呀,一个方法搞定。
然后我就看了看api帮助。然后发现这个方法只有一个参数呀,为什么GPT的这么多?
看来它又学了个”绝招“。 当然这个方法也是可以的,就是需要再对视图的位置进行一些调整。

posted @
2023-04-23 15:44 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

如何利用chatGPT/GPT4高效学习Solidworks二次开发

如何利用chatGPT/GPT4高效学习Solidworks二次开发

最近比较火的无疑是ChatGPT/GPT4,它的出现是不是像大家所想的,能够改变世界。
比如说让我丢了饭碗
![在这里插入图片描述](https://img-blog.csdnimg.cn/3ab46dde8f89452da5c524f770de19b7.png)

要不我们来试试它?

先用这个试试,据说这个比较方便,直接是在对应的文件中进行对话。

安装后,直接在左侧建立一个你熟悉的后缀格式。我就用main.cs吧

按Ctrl+K和它进行对话。


看看它的结果:

哇靠,写的水平可以呀。我假装看不懂。让他给我在上面加一些注释吧。

这时它是上下文模式,会在右侧提示结果,并提示你是否要接受修改。

我就直接复制-替换。

这样对一个新手来说,是不是比较友好了?
在它提供的信息不出意外的情况下,至少各个逻辑和方法写的比较清楚了。
我们再来继续问:


它在下方增加了如下代码:关键是他还主动给你用中文写好了注释。
虽然我原来的意图是SolidWorks中已经打开零件,直接可以读取。
但是写的方法是传的一个文件路径,主动帮你打开,再读取属性,第一眼看起来所写的代码问题不大。

public static Dictionary<string, string> GetCustomProperties(string filePath)
{
    SldWorks swApp = null;
    try
    {
        // 创建 SolidWorks 应用程序对象
        swApp = (SldWorks)Activator.CreateInstance(Type.GetTypeFromProgID("SldWorks.Application"));
        // 设置 SolidWorks 应用程序对象可见
        swApp.Visible = true;
        // 打开文件
        ModelDoc2 swModel = (ModelDoc2)swApp.OpenDoc6(filePath, (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", 0, 0);
        // 获取自定义属性
        CustomPropertyManager swCustPropMgr = swModel.Extension.CustomPropertyManager[""];
        object[] names = (object[])swCustPropMgr.GetNames();
        object[] values = (object[])swCustPropMgr.GetValues(names);
        // 将自定义属性存入字典
        Dictionary<string, string> customProperties = new Dictionary<string, string>();
        for (int i = 0; i < names.Length; i++)
        {
            customProperties.Add(names[i].ToString(), values[i].ToString());
        }
        // 关闭文件
        swApp.CloseDoc(filePath);
        // 返回自定义属性字典
        return customProperties;
    }
    catch (Exception ex)
    {
        // 输出读取自定义属性错误信息
        Console.WriteLine("读取自定义属性出错: " + ex.Message);
        return null;
    }
    finally
    {
        // 如果 SolidWorks 应用程序对象不为空,退出应用程序
        if (swApp != null)
        {
            swApp.ExitApp();
        }
    }
}

我们来实际测试一下。

直接开个vs,并引用一下solidworks的两个库。

建立 了一个控制台程序,调用第一个写的方法。
它会自动创建一个Solidworks,并显示了版本。


功能的显示了版本号。
但不幸的是,第二个功能中出现了不存在方法,我查了api 帮助,根本找不到这个。所以这个可能是它在学习过程中别人写过的扩展方法。


没办法,我们只能自己改进了。
这只是简单的做,其实Solidworks中提供了GetAll的方法可以直接得到所有的属性。

调试运行一下,发现读起来没有问题,所以效果还算不错。

就目前的体现来说,整体效果还算不错,相当于找一个会抄作业的助手 。
反正就是有啥问题就去问,对不对自己再验证。
这样对于新手来说,还是比自己去百度或者Google搜索效率更高。
至于能不能干掉我们的饭碗,应该还是需要一定时间的。

posted @
2023-03-31 13:49 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源