SolidWorks二次开发API (C#)—删除草图中的错误关系

SolidWorks二次开发API (C#)—删除草图中的错误关系

下面这个图有没有见过?


是不是好像在哪见过,而且还比较讨厌?
这就是传说中的关系有问题了,这个关系就是大家常说的“关系”。自己想想这个关系重要不重要。

好了,正文到此结束。 大家耗子尾汁…


下面是菜单:

  1. 编辑草图
  2. 获取草图中的关系
  3. 删除错误的关系

首先打开我精心设计的一个零件:
大概用了十多年时间吧,不要问:

然后进行关键代码的编写:

不好意思 ,上面贴错了。。。

    /// <summary>
        /// 删除草图中的错误关系
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDeleteRelation_Click(object sender, EventArgs e)
        {
            SldWorks swApp = PStandAlone.GetSolidWorks();

            var swModel = swApp.IActiveDoc2;

            //请先打开 D:\09_Study\CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\57_DeleteRelation.sldprt

            swModel.Extension.SelectByID2("Sketch11", "SKETCH", 0, 0, 0, false, 1, null, 0);
            swModel.EditSketch();

            swModel.ClearSelection2(true);

            var swSketch = swModel.IGetActiveSketch2();

            var skRelMgr = swSketch.RelationManager;

            var vRel = (object[])skRelMgr.GetRelations((int)swSketchRelationFilterType_e.swDangling + (int)swSketchRelationFilterType_e.swOverDefining);

            if (vRel != null)
            {
                for (int j = vRel.Length - 1; j >= 0; j--)
                {
                    var swSkRel = (SketchRelation)vRel[j];

                    //这一句是删除
                    skRelMgr.DeleteRelation(swSkRel);

                    //这一句是压缩掉 swSkRel.Suppressed = true;
                }
            }


            swModel.ForceRebuild3(true);




        }

执行还我漂漂拳之后 ,世界终于安静了。



如果真设计成这样,估计饭碗都保不住了。

这只是提供了一个思路,大家别想多了。

所有源代码获取:
https://gitee.com/painezeng/CSharpAndSolidWorks

https://github.com/painezeng/CSharpAndSolidWorks

posted @
2022-06-17 11:05 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks二次开发—获取和创建DimXpert(MBD)尺寸

C# SolidWorks二次开发—获取和创建DimXpert(MBD)尺寸

这里写自定义目录标题

MBD

MBD 代表 Model Based Definition(基于模型的定义),这是一种使用 3D 模型(如实体模型)、产品和制造信息 (PMI) 以及相关元数据来定义单个部件和产品装配体的方法。相比之下,传统上的其他方法都需要使用 2D 工程图来提供此类细节。

示例图

我找了一张图,这是PTC网站上的,我觉得看着不错。

我的解释

就是把常规的2d工程图甩掉,在模型上定义加工尺寸与信息。因为复杂的2d图需要你有丰富的3维构造想向力。而基于三维的话,更直观,还能动态旋转,想怎么看就怎么看。

本文章的目标

通过代码来自动创建3d尺寸标注,以及读取标注。

模型实现步骤

先建一个简单的模型,这里我们采用mbd提供的模板

就这样吧,太复杂 了怕我自己看不懂。

然后采用SolidWorks中的自动尺寸方案,然后出来的效果图(尺寸位置有手动整理)


整体效果还不错,我是选择了左下角的两个面为基准。(当然也发现六边形的孔它不标,可能要手动再增加)

选中某个尺寸,会自动高亮有对应的实体面。
像这个有两个对象,还会自动在前面2x

大家可能发现,尺寸有两种颜色 100和200是我在草图中有标注过的尺寸,它是黑色,而且没有公差。
其它出来的尺寸是自动公差的,这个值 是和前面选择的模型模板属于哪个尺寸级别有关的。公差带范围不一样。

如何修改公差

手动改:

文档属性里面可以控制默认值(这个值 改了之后 再增加的尺寸才会使用设置中的默认值) :

如何读取:

那肯定是查Api帮助。

这个示意是遍历了所有的尺寸特征(大家可以自己去试试,我就不贴了)
我就做个简单的(主要是复杂的我也不会)

执行这个按钮之前,我选中了这个尺寸。

private void btnCreateDimXpert_Click(object sender, EventArgs e)
        {

            var swApp = PStandAlone.GetSolidWorks();

            var swModel = (ModelDoc2)swApp.ActiveDoc;       

            var selectedObject = (object)swModel.ISelectionManager.GetSelectedObject6( 1, -1);

            var dimXpertFeature = selectedObject as DimXpertFeature;                   

            var dimType = dimXpertFeature.Type;

            var dimAnnotations = (object[])dimXpertFeature.GetAppliedAnnotations();

            for (int i = 0; i < dimAnnotations.Length; i++)
            {
                var tempAnno = (DimXpertAnnotation)dimAnnotations[i];

                var dimTol = (DimXpertDimensionTolerance)tempAnno;              

                MessageBox.Show(dimTol.GetNominalValue().ToString());
            }
        }

它居然给了提示了四个尺寸值 。
这样说明了一个问题,它设计的时候是针对 一个整体,这个特征上有四个尺寸来定义。
如果你想获取具体的公差值信息,可以参考Api帮助中的获取公差示例https://help.solidworks.com/2018/english/api/swdocmgrapi/get_dimxpert_tolerance5_example_csharp.htm

如何创建这些尺寸


通过查找 ,找到一个自动尺寸方案的示例。 这个示例我就不说了。因为我也看不懂,哈哈
https://help.solidworks.com/2018/english/api/swdimxpertapi/auto_dimension_scheme_example_csharp.htm

我就弄个简单的版本。
利用神器宏录制器,录制一个。

然后改成C#版本

   //先打开 MBDTest_Clear.SLDPRT
            #region C#转换版
            var boolstatus = swModel.Extension.SelectByRay(-0.199999999999932, 7.99159865590582E-03, 2.08147507191825E-03, 0.388737791327055, 0.42257073135628, -0.81872883581512, 1.1566601033182E-03, 2, false, 0, 0);
            boolstatus =swModel.Extension.SelectByRay(-0.193540180170828, 0, 7.74886573458389E-03, 0.388737791327055, 0.42257073135628, -0.81872883581512, 1.1566601033182E-03, 2, true, 0, 0);
            boolstatus =swModel.Extension.SelectByRay(-8.93087496499163E-02, 7.75246027125149E-02, 6.27227943436992E-03, 0.388737791327055, 0.42257073135628, -0.81872883581512, 1.1566601033182E-03, 2, true, 0, 0);
            boolstatus =swModel.ISelectionManager.SetSelectedObjectMark(3, 51,(int)swSelectionMarkAction_e.swSelectionMarkSet);
            boolstatus =swModel.Extension.SelectByRay(-0.117784661174085, 3.60124267366473E-02, 4.68486280385605E-03, 0.388737791327055, 0.42257073135628, -0.81872883581512, 1.1566601033182E-03, 2, true, 0, 0);
            boolstatus =swModel.ISelectionManager.SetSelectedObjectMark(4, 52, (int)swSelectionMarkAction_e.swSelectionMarkSet);
            var swConfig = swModel.ConfigurationManager.ActiveConfiguration;

            var swDimXPertMgr = swModel.Extension.DimXpertManager[swConfig.Name, true];
            var swDimXPertPart = (DimXpertPart)swDimXPertMgr.DimXpertPart;
            var swADSOpt = swDimXPertPart.GetAutoDimSchemeOption();

            swADSOpt.PartType = (int)swDimXpertAutoDimSchemePartType_e.swDimXpertAutoDimSchemePartType_Prismatic;
            swADSOpt.ToleranceType = (int)swDimXpertAutoDimSchemeToleranceType_e.swDimXpertAutoDimSchemeToleranceType_PlusMinus;
            swADSOpt.PatternType = (int)swDimXpertAutoDimSchemePatternType_e.swDimXpertAutoDimSchemePatternType_Linear;
            swADSOpt.PolarPatternHoleCount = 5;
            swADSOpt.ScopeAllFeature = false;
            boolstatus = swDimXPertPart.AutoDimensionScheme(swADSOpt);

            swModel.ClearSelection2(true);

            #endregion

运行结果:
效果还是可以的,时间有限,就写这么多了。

总结

这个对于简单零件来说还是特别方便的,复杂 的就需要去进行什么视图的处理了,不然太多尺寸一起显示,就太麻烦了。

posted @
2022-06-17 11:05 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

SolidWorks PDM二次开发—检出与检入

SolidWorks PDM二次开发—检出与检入

五一放假后半段了,今天来聊一下PDM中的检出与检入文件。

一翻译,发现检出 和检入的英文是Check Out Check in

好,打开api help。
在索引中发现这个是关于bom对象的。我要找的是文件的。

然后到搜索里面找一下: 发现了指定检入 和检出 文件的示例:

它这里面每个例子都是完整的,需要自己按它的操作一步步来创建窗体。

我们进去找一下最关键的地方,它这里用的是pdm提供的批量的方法。
我们这一次是想检出指定的一个文件,经过查找 ,发现对单个文件的检出 ,其实用的不是check out和check in 这个词。
用的是LockFile 和UnLockFile,看下面的描述。 难怪 上一个文章显示信息的时候,也是用的是否锁定。
所以简单理解 就是文件锁定,肯定是别人检出了。

先手动检入一个文件:

执行完之后 ,文件已经被已经登陆的当前用户检出了。

再看一下检入的动作,看代码的提示发现有两个可以进行的操作:

这两个的区别还是比较明显的,就是一个是不检出文件,这个是如果改了就放弃保存了。
另一个才是真正的检入。


两个方法有些不同的参数:

在执行完上面一条,文件当前已经被检入了。看下历史记录:

上代码: 其实内容比较简单:

 try
            {
               

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

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

                var rootPath = vault2.RootFolderPath;

                string filePath = $@"{rootPath}\PDMTraining\文件1.txt";

                IEdmFile14 aFile = default(IEdmFile16);
                IEdmFolder5 ppoRetParentFolder;
                aFile = (IEdmFile16)vault2.GetFileFromPath(filePath, out ppoRetParentFolder);

                aFile.LockFile(ppoRetParentFolder.ID,0,0);

                if (aFile.IsLocked)
                {
                    MessageBox.Show("检出成功。");

                    //把文件内容做修改后保存后,检入。

                    aFile.UnlockFile(0,"修改内容为2",0,null); //检入

                    //aFile.UndoLockFile(0,true); //撤销检出

                    if (!aFile.IsLocked)
                    {
                        MessageBox.Show("检入成功。");
                    }


                }


            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
                throw;
            }

posted @
2022-05-03 16:28 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks 二次开发 API—修改焊接件的截面大小

C# SolidWorks 二次开发 API—修改焊接件的截面大小

今天再来讲一下小知识点,如何更换焊接特征的截面。
如下图,有一个ABC的特征,截面用的是20×20的。


这个截面路径需要自己在这里去设置:

今天这个其实与之前的一篇文章类似,就是那个读取配合信息。是去读取或者修改featureData数据。
不过首先是要知道特征是什么,这就需要自己去api中查找了,怎么找我之前 的博客中写的很清楚了,我就不再详细介绍了。

            //请先打开WeldmentTest.sldprt
            //下面的功能是把原有的特征数据从020x020换成030x030.SLDLFP

            var swApp = PStandAlone.GetSolidWorks();

            var swModel = (ModelDoc2)swApp.ActiveDoc;

            var swWeldFeat = (Feature)(swModel as PartDoc).FeatureByName("ABC");

            var swWeldFeatData = (StructuralMemberFeatureData)swWeldFeat.GetDefinition();

            swWeldFeatData.AccessSelections(swModel, null);

            var profilePath = swWeldFeatData.WeldmentProfilePath;

            var newPath = profilePath.Replace("020x020", "030x030");

            swWeldFeatData.WeldmentProfilePath = newPath;

            var boolstatus = swWeldFeat.ModifyDefinition(swWeldFeatData, swModel, null);

            swWeldFeatData.ReleaseSelectionAccess();

            swModel.EditRebuild3();

当执行完成,我们就能发现截面变成了30×30的那个了。
时间有限,不讲太深了。

posted @
2022-03-22 20:00 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks 二次开发 API—后台隐藏打开指定类型的文件

C# SolidWorks 二次开发 API—后台隐藏打开指定类型的文件

今天来聊一下另一个小方法:在SolidWorks中设置对象的可见性。
关键字 DocumentVisible
查下自带的帮助文件:

这个主要用在我想后台打开一些文件进行特殊操作,而不想让用户知道。 比如装配一个新零件时,必须要先打开零件,这一步就可以在内存中操作,让用户看不到打开的过程。 或者是修改零件名称时,让工程图也自动后台修改名称和引用关系,而看不到打开的过程。
相当于在内存中打开文件,而界面上不显示 。
其实这也是solidworks经常使用的方法,比如,你开了一个装配体。 在没有打开下面子零件地时候,你是感觉不到零件的。
如下图,我们开了一个bodies装配,其实在右侧的文件夹图标内是可以看到,其它子零件全部被打开了的,只是是隐藏状态。

如果打开其中的一个,它的图标就会亮。

下面简单介绍一下用法:
可以设置显示或者隐藏的类型有下面8种,再具体的可以参考api

 private void btnOpenWithHide_Click(object sender, EventArgs e)
        {
            SldWorks swApp = PStandAlone.GetSolidWorks();//连接solidworks

            //设置零件不显示
            swApp.DocumentVisible(false, (int)swDocumentTypes_e.swDocPART);

            //你的操作....

            //设置零件为正常的显示
            swApp.DocumentVisible(true, (int)swDocumentTypes_e.swDocPART);

        }

需要注意的是api帮助文件中的备注,在修改过设置之后 ,还要改回来,不然用户再操作sw打开文件时可能就看起来没有反映了。

posted @
2022-03-21 15:43 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

SolidWorks PDM二次开发—获取库中的文件信息

SolidWorks PDM二次开发—获取库中的文件信息

在休息了一个月之后,博客继续开始更新。
今天我们简单一点,直接上代码。

		private void btnGetSelectFileInfo_Click(object sender, EventArgs e)
        {
            try
            {
                var vault = new EdmVault5();
                //登陆到库中
                vault.LoginAuto("PDM2020Default", this.Handle.ToInt32());

                //如果用户登录成功,显示下本地库根目录路径
                if (!vault.IsLoggedIn) return;
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.InitialDirectory = vault.RootFolderPath;
                openFileDialog.Multiselect = false;
                if (openFileDialog.ShowDialog() != DialogResult.OK) return;
                GetFileInformation(vault, openFileDialog.FileNames[0]);
                return;
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
                throw;
            }
        }


   		 /// <summary>
        /// 显示库文件中的一信息
        /// </summary>
        /// <param name="vault1">库对象</param>
        /// <param name="filePath">文件路径</param>
        private void GetFileInformation(IEdmVault5 vault1, string filePath)
        {
            try
            {
                IEdmVault7 vault2 = null;
                vault2 = (IEdmVault7)vault1;

                IEdmFile14 aFile = default(IEdmFile16);
                IEdmFolder5 ppoRetParentFolder;
                aFile = (IEdmFile16)vault2.GetFileFromPath(filePath, out ppoRetParentFolder);

                //Get configurations 获取配置
                string msg = "Configurations: " + "\r\n";
                IEdmFolder5 folder = default(IEdmFolder5);
                folder = vault2.RootFolder;

                EdmStrLst5 cfgList = default(EdmStrLst5);
                cfgList = aFile.GetConfigurations();

                IEdmPos5 pos = default(IEdmPos5);
                pos = cfgList.GetHeadPosition();
                while (!pos.IsNull)
                {
                    var cfgName = cfgList.GetNext(pos);
                    msg = msg + cfgName + "\r\n";
                }

                msg = msg + "\r\n";

                //Get type of file 文件类型
                int typ = 0;
                typ = (int)aFile.FileType;
                msg = msg + "EdmFileType: " + typ + "\r\n";

                msg = msg + "\r\n";

                //Get category of file 文件类别
                IEdmCategory6 cat = default(IEdmCategory6);
                cat = aFile.Category;
                if ((cat != null))
                {
                    msg = msg + "Category: " + cat.Name + ", Category ID: " + aFile.CategoryID + "\r\n";
                    msg = msg + "\r\n";
                }

                //Get local file timestamp 文件时间戳
                filePath = aFile.Name;
                object fileDate = null;
                fileDate = aFile.GetLocalFileDate(filePath);

                if ((fileDate != null))
                {
                    string text = null;
                    text = fileDate.ToString();
                    msg = msg + aFile.GetLocalPath(folder.ID) + " was modified " + text + "\r\n";
                }
                else
                {
                    msg = msg + "There is no local copy of the file" + "\r\n";
                }

                msg = msg + "\r\n";

                //Get local version number 本地版本
                int versionNo = 0;
                versionNo = aFile.GetLocalVersionNo(aFile.GetLocalPath(folder.ID));

                if (versionNo == -1)
                {
                    msg = msg + "The local copy of " + aFile.Name + " does not match any existing versions" +
                          "\r\n";
                }
                else
                {
                    string versionStr = null;
                    versionStr = versionNo.ToString();
                    msg = msg + "The local copy of " + aFile.Name + " has version " + versionStr + "\r\n";
                }

                msg = msg + "\r\n";

                //Get current version 当前版本
                int ver = 0;
                ver = aFile.CurrentVersion;
                msg = msg + "Current version: " + ver + "\r\n";

                msg = msg + "\r\n";

                //Get local revision name 本地修订名称
                string revName = null;
                revName = aFile.GetLocalRevisionName(aFile.GetLocalPath(folder.ID));

                if (string.IsNullOrEmpty(revName))
                {
                    msg = msg + "The local copy of " + aFile.Name + " does not match any existing revisions" +
                          "\r\n";
                }
                else
                {
                    msg = msg + "The local copy of " + aFile.Name + " has revision name " + revName + "\r\n";
                }

                msg = msg + "\r\n";

                //Get current revision 获取当前修订
                revName = aFile.CurrentRevision;
                msg = msg + "Current revision: " + revName + "\r\n";

                msg = msg + "\r\n";

                //Get current workflow state 当前流程状态
                IEdmState5 state = default(IEdmState5);
                state = aFile.CurrentState;
                msg = msg + "Current workflow state: " + state.Name + "\r\n";

                msg = msg + "\r\n";

                //Get whether the file is checked out 是否检出
                bool checkedOut = false;
                checkedOut = aFile.IsLocked;
                msg = msg + "File is checked out? " + checkedOut + "\r\n";
                if (checkedOut)
                {
                    msg = msg + "Lock path: " + aFile.LockPath + "\r\n";
                    msg = msg + "Locked by: " + aFile.LockedByUser.Name + ", User ID: " + aFile.LockedByUserID +
                          "\r\n";
                    msg = msg + "Locked in: " + aFile.LockedInFolder.Name + ", Folder ID: " + aFile.LockedInFolderID +
                          "\r\n";
                    msg = msg + "Locked on: " + aFile.LockedOnComputer + ", Vault View ID: " + aFile.LockedOnViewID;
                }


                MessageBox.Show(msg);
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + " " + ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


结果显示:

文件还是老地方:
https://gitee.com/painezeng/solidworks-pdmprofessional-apistudy.git

posted @
2022-03-02 21:39 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源