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
编辑 
收藏 
举报  
来源

C# SolidWorks 二次开发 API—获取所有特征名称思路2

C# SolidWorks 二次开发 API—获取所有特征名称思路2

之前那篇各种遍历的博文中有写过怎么遍历零件中的特征 。
这两天翻了翻api,看看有没有更简单的办法获取所有特征的名称。
发现发一个新的办法,分享一下。


看到了吗,之前这里有个FeatureNames,是属于这个不熟悉的单词里的。

突然秒懂呀,想起来Solidworks里面有个功能是可以统计特征的复杂程度以及重建时间等信息的。

再深入一点点,看看这个怎么描述的。

哇,太直接了,返回的直接是数组。是不是比遍历更直接?
而且里面还有例子:

我就直接贴了,大小写下注释:

This example shows how to get the statistics of all of the features in a part document.

//-------------------------------------------
// Preconditions:
// 1. Open a part that has multiple features. 打一个带多个特征的零件
// 2. Open the Immediate window.
//
// Postconditions:
// 1. Gets the statistics for the features in 得到零件的特征统计信息
// the part.
// 2. Examine the Immediate window.
//-------------------------------------------
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using System;
using System.Diagnostics;
namespace GetFeatureStatisticsForPart_CSharp.csproj
{
    partial 
 class SolidWorksMacro
    {
        public  void Main()
        {
            FeatureStatistics swFeatStat = default(FeatureStatistics);
            FeatureManager swFeatMgr = default(FeatureManager);
            ModelDoc2 swModel = default(ModelDoc2);
            String[] featnames = null;
            Int32[] feattypes = null;
            Object[]  features = null;
            Double[] featureUpdateTimes = null;
            Double[] featureUpdatePercentTimes = null;
            int iter = 0;

            swModel = (ModelDoc2)swApp.ActiveDoc;
            swFeatMgr = swModel.FeatureManager;
            swFeatStat = swFeatMgr.FeatureStatistics;

            swFeatStat.Refresh();

            Debug.Print("Model name: " + swFeatStat.PartName); //名称
            Debug.Print(" Number of features: " + swFeatStat.FeatureCount);//特征数量
            Debug.Print(" Number of solid bodies: " + swFeatStat.SolidBodiesCount);//实体数量 
            Debug.Print(" Number of surface bodies: " + swFeatStat.SurfaceBodiesCount);//面体数量 
            Debug.Print(" Total rebuild time: " + swFeatStat.TotalRebuildTime);//重建时长
            Debug.Print("");
            features  = (Object[])swFeatStat.Features;
            featnames = (String[])swFeatStat.FeatureNames;
            feattypes = (Int32[])swFeatStat.FeatureTypes;
            featureUpdateTimes = (Double[])swFeatStat.FeatureUpdateTimes;
            featureUpdatePercentTimes = (Double[])swFeatStat.FeatureUpdatePercentageTimes;
            if  ((featnames != null))
            {
                for  (iter = 0; iter <= featnames.GetUpperBound(0); iter++)
                {
                    Debug.Print(" Feature name: " + featnames[iter]); //特征名称
                    Debug.Print(" Feature created: " + ((Feature)features[iter]).DateCreated);//创建时间
                    Debug.Print(" Feature type as defined in sw_SelectType_e: " + feattypes[iter]);//类型
                    Debug.Print(" Update time: " + featureUpdateTimes[iter]);//更新时间
                    Debug.Print(" Update % time: " + featureUpdatePercentTimes[iter]);//特征更新时长
                    Debug.Print("");
                }
            }
        }
        public SldWorks swApp; //这个是要自己处理得到实例对象的。
    }
}

好了,我就拿VBA的跑个结果:

然后可以自己把这个封装一下,变成一个ModelDoc2的扩展方法,后面用起来就非常方便了。
当前 这个适合不需要知道特征之前 的层级关系的时候。

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

C# SolidWorks二次开发-工程图-更换工程图图纸格式/模板

C# SolidWorks二次开发-工程图-更换工程图图纸格式/模板

这两天有朋友提问,怎么更换工程图模板。
正好晚上还能挤点时间,就来写一篇文件解答一下。
首先,更换工程图模板,你需要知道手动怎么修改。
如下图,我这个没有模板,只有个纸张大小。

对着视图,右键属性。

可以看到我这里没有选择图纸格式:

下面就录制一下宏,先看有没有对应的操作可以记录:
录制的时候我选择了一下标准的a4

应该更改之后 :

发现有了变化,我们看下录到的代码:

更是够简单,里面参数有个a4的值 ,说明我们录到了这个方法,关键字就是SetupSheet5

打开我们的神器:

然后进入最新版本的SetupSheet6:



从上面可以看出来,这个是设置图纸的一些参数,包括图纸格式,比例,上下左右的间距,第一视角或者第三视角。

而且下面还有例子:我就不去看了。

我们就学习一下在C#中写下这个方法:

        private void btnModifyTemplate_Click(object sender, EventArgs e)
        {
            //先打开Measure.slddrw
            SldWorks swApp = Utility.ConnectToSolidWorks();

            if (swApp != null)
            {
                ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc; //当前文档

                var swDrawing = (DrawingDoc)swModel; //转换成工程图对象

                var res=  swDrawing.SetupSheet6("Sheet1", (int)swDwgPaperSizes_e.swDwgPaperA3size,
                    (int)swDwgTemplates_e.swDwgTemplateA3size, 1, 5, true, "a3 - din.slddrt", 0, 0, "默认", false, 0, 0, 0, 0, 0, 0);
                if (res)
                {
                    MessageBox.Show("更换成功。");
                }

            }
        }

执行完这个代码:

尺寸确实变了,这个我就不细研究了,也许上面有参数有些不对。

上面代码中参数的1 和 5 就是图纸的比例:

当然,如果 不希望改其它参数,就需要把这些参数设置和之前一样的值 。
可以用过下面这个方法来获取当前图纸的一些参数:

当前如果是其它的,比如公司的模板什么的,可以指定一个完整的路径。

                var res = swDrawing.SetupSheet6("Sheet1", (int)swDwgPaperSizes_e.swDwgPaperA4size,
                    (int)swDwgTemplates_e.swDwgTemplateA4size, 1, 5, true, @"E:\01_Work\22_Gitee\CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\sheetformat\a4 - gb.slddrt", 0, 0, "默认", true, 0, 0, 0, 0, 0, 0);


好了,今天就写这么多了,马上就要过年了,年前不一定有时间再写。提前祝大家过个好年,希望不要被隔离在家。

源代码: https://gitee.com/painezeng/CSharpAndSolidWorks
第一次使用可以看下下面这个视频 :

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

C# SolidWorks二次开发-工程图-遍历选中视图中的草图

C# SolidWorks二次开发-工程图-遍历选中视图中的草图

知识点: 遍历选中视图中的草图

我们来继续学习一下工程图里的东西,如下图,我们可以在工程图中画草图,也可以在某个视图中画草图,你不要问我为什么要画,因为我也不知道你要干什么。


今天就简单介绍一下,如何获取这几条线的信息。
大家都知道零件的时候画草图都是要先定义基准面的,而且画完左侧特征树上也会显示一个特征,但是我们在图纸上或者视图上画的时候,却不用,也没有显示特征。
所以我猜侧,这里是Solidworks做了隐藏及优化,图纸或者视图上的草图只能有一个,所有就不用再显示 出来了。

动手-> 去api 帮助里面找一找相关的帮助,看看有没有什么新发现。

—————————————————————————–华丽的分割线—————————————————————————————–

好像发现了什么:

找到了个View的接口:

关键信息在这里:
Remarks
Each drawing view contains an underlying sketch. The user can activate the sketch for a drawing view by double-clicking the view. Once the drawing view is active, you can add sketch directly to the view’s sketch.

我假装看不懂,哈哈。翻译一下:

那就好办了,就是先搞到一个View对象,再GetSketch,这样我们就有和零件草图一样的对象了,这样我们就可以遍历里面的直线、点、文字这些信息了。

其实代码我写好很久了,一直没有发文章解释一下。

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

            ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;

            SelectionMgr selectionMgr = (SelectionMgr)swModel.SelectionManager;

            //获取选择的视图对象
            View view = (View)selectionMgr.GetSelectedObject5(1);

            //获取视图的草图
            var viewSketch = view.IGetSketch();

            //var pointsCount = viewSketch.GetSketchPointsCount2();

            var points = (object[])viewSketch.GetSketchPoints2();

            var skSegs = (object[])viewSketch.GetSketchSegments();

            List<SketchPoint> segmentPoints = new List<SketchPoint>();
            if (points != null)
            {
                for (int i = 0; i < points.Length; i++)
                {
                    var thisPoint = (SketchPoint)points[i];

                    Debug.Print(thisPoint.Type.ToString());

                    if (thisPoint.Type == 1)
                    {
                        // thisPoint.Select(true);

                        segmentPoints.Add(thisPoint);
                    }
                }
            }
            List<SketchSegment> segmentCenterLines = new List<SketchSegment>();

            if (skSegs != null)
            {
                for (int i = 0; i < skSegs.Length; i++)
                {
                    var thisSeg = (SketchSegment)skSegs[i];
                    // thisSeg.Select(false);
                    if (thisSeg.Style == (int)swLineStyles_e.swLineCENTER)
                    {
                        //thisSeg.Select(true);
                        segmentCenterLines.Add(thisSeg);
                    }
                }
            }
        }

其它来不及解释了,大家自己思考吧,顺便来个小调查,谢谢大家。

posted @
2021-12-01 09:20 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源