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

SolidWorks PDM二次开发—登陆

SolidWorks PDM二次开发—登陆

打开API帮助文件

我们打开SolidWorks PDM Professional API帮助文件,文件名为API_GB.chm

查找 一下登陆的关键字: Login
就能发现如下几个关键方法:

登陆操作

下面是API中对这几个登陆的解释:

  1. Login:Logs in to the specified vault using the specified user name and password.

  2. LoginAuto:Logs in to the specified vault.

  3. LoginEx:Allows an application that is not supplied and supported by SOLIDWORKS Corporation to:

    			log into SOLIDWORKS PDM Professional
    			- or - 
    			log into a vault view
    			- or - 
    			directly access the vault database
    			when the same user is not already logged into a local view.
    
  4. LogInWindowsUser:Logs into SOLIDWORKS PDM Professional as the specified user.

接下来看代码:


			var vault = new EdmVault5();  //新建一库实例
            //检查登陆
            
            #region 登陆方式1
	          	if (!vault.IsLoggedIn)  //检查是否已经登陆
	            {
	                vault.Login("Admin", "XXXXXX", "PDMTraining");                
	            }
            #endregion
          
  			#region 登陆方式2
				//调用PDM自己的登陆界面进行登陆。
            	vault.LoginAuto("PDMTraining",0);
          
            #endregion
            
            #region 登陆方式3
            	//后端静默登陆,适合需要进行提权时进行后台处理。
            	(vault as IEdmVault13).LoginEx("Admin","*****","PDMTraining",0);

            #endregion
            
            #region 登陆方式4
            	//使用windows用户登陆
            	(vault as IEdmVault11).LogInWindowsUser("Admin", "*****", "PDMTraining");

            #endregion 
			  
	

上面就是登陆的一些方法,需要根据实际情况选择。

获取库名

下面再讲一个获取库名称列表的方法:

			#region 获取库列表

            EdmViewInfo[] edmViewInfos = null;
            (vault as IEdmVault13).GetVaultViews(out edmViewInfos, false);

            List<string> vaultNames = new List<string>();

            if (edmViewInfos != null)
            {
                foreach (var edmViewInfo in edmViewInfos)
                {

                    vaultNames.Add(edmViewInfo.mbsVaultName);
                }
            }

            Debug.Print(vaultNames.Count().ToString());

            #endregion

posted @
2021-10-24 10:26 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

如何 SolidWorks 减小文件大小?

如何 SolidWorks 减小文件大小?

今天在无意中看到了官方培训视频中关于如何减小文件大小的视频,虽然有些方法在实际中操作过,但是有些新方法可以知道一下。
常规的就是把文件另存,这样大小有时候会小很多,尤其是多配置的情况下。
也许后续在SolidWorks二次开发过程中考虑到网络或者文件尺寸因素的情况下,可能用的到。

方法有以下:

  • 保存为最新版本的文件
  • 压缩复杂的特征
  • 方块法
  • 压缩基体特征法
  • 降低显示质量

下面是例子:
原始文件2014 989kb

– 保存为最新版本的文件
这个不解释,就是文件升级。
保存为2020之后 文件变为784kb – 压缩复杂的特征 这个就是把零件中比较复杂的特征压缩掉,可以用过自带的工具体现:

把耗时的特征压缩掉之后 ,另存后大小变为了127kb

– 方块法
这个就是把原有的零件用一个块块包起来。


此时文件大小变成了 378kb:

– 压缩基体特征法

第一个特征压缩掉之后, 其实相当于所有的特征都压缩了。这个方法以前也用过。只是不知道如果有很多特征本来压缩的时候是不是会有问题(无法还原),大家可以自行测试。
这个状态下文件尺寸是 107kb

官方的视频操作中用的是这个方法来重新解除压缩。

– 降低显示质量


上面是高质量的情况下,保存的尺寸

下面是修改为不随文件保存tessellation信息之后 ,文件的大小: 412kb

关于多配置的文件,有些选项可以控制。但是如果配置都随文件保存的话,文件尺寸就很大,如果不保存的话,文件小,但是使用时会重新计算。


posted @
2021-10-22 16:25 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

SolidWorks 二次开发—SelectionManager的学习以及妙用

SolidWorks 二次开发—SelectionManager的学习以及妙用

SelectionManager的妙用


SelectionManager的介绍

官方API相关解释:
ISelectionMgr Interface: Allows you to get information about selected objects, obtain API objects representing the selected item, and get your selection coordinates interpreted in model or sketch space.
允许您获取有关所选对象的信息,获取表示所选项目的 API 对象,并在模型或草图空间中解释您的选择坐标。


SelectionManager Property (IModelDoc2):Gets the ISelectionMgr object for this document, which makes the currently selected object available. 获取此文档的ISelectionMgr对象,这使当前选定的对象可用。


Remarks:
ISelectionMgr objects are transient because they are invalid as soon as another selection is made. So, do not hold on to these pointers for any length of time.
备注:ISelectionMgr对象是暂时的,因为一旦做出另一个选择,它们就无效。因此,不要长时间持有这些指针。

属性和方法:

http://help.solidworks.com/2018/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.ISelectionMgr_members.html

常用属性和方法:

EnableContourSelection

		启用或者禁用轮廓选择
		Enables and disables contour selection.  

EnableSelection

		启用或者禁用选择
		Enables or disables selection.  

SelectionColor

	    获取或设置选择颜色
	    Gets or sets the selection color.  

GetSelectedObject6(int Index, int Mark)

(http://help.solidworks.com/2018/english/api/sldworksapi/solidworks.interop.sldworkssolidworks.interop.sldworks.iselectionmgrgetselectedobject6.html)
这个方法是获取当前选中的对象,可以通过swSelectType_e这个对象类型来判断具体的选择。
注意: Index是从1开始,可以指定获取到第几个。
Mark是可以指定标记值。可用于过滤,0 表示没有标记的对象。

	官方api示例: [Get Areas of MidSurface Faces (C#)](http://help.solidworks.com/2018/english/api/sldworksapi/Get_Areas_of_MidSurface_Faces_Example_CSharp.htm)

GetSelectedObjectCount2

这个一般用于配合上面的方法一起使用,用于获取对象数量。

GetSelectedObjectsComponent4

这个我们之前的例子中有讲过,获取选中对象所属的组件实例(适用于装配体和工程图中)。
Gets the selected component in an assembly or drawing.  

GetSelectedObjectType3

这个就是获取选中对象的类型。
	Gets the type of object selected.  

GetSelectionPoint2

这个可以直接获取鼠标点击的那个点的坐标。(全局的)
Gets the selected point in model space coordinates from the currently selected object.  
![在这里插入图片描述](https://img-blog.csdnimg.cn/2b172b282761407bb0dfea65e8f200cc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAUGFpbmUgWmVuZw==,size_10,color_FFFFFF,t_70,g_se,x_16)

GetSelectionPointInSketchSpace2

这个返回草图空间的选中点坐标。
Gets the selection point projected on to the active sketch and returned in sketch space. 

IsInEditTarget2

获取选中的对象是否属于正在编辑的对象。
Gets whether the selected object is in the edit target.  

SetSelectedObjectMark

设置Mark值给指定的选择对象
Sets the mark value for the specified selection.  

SetSelectionPoint2

设置选择的点在模型空间中
Sets the selection point in model space.

SuspendSelectionList / ResumeSelectionList

	Suspends the current selection list.   /  Reinstates the previously suspended selection list.  
	暂停当前​​选择列表。  /   	恢复先前暂停的选择列表。 
	 
	这两个方法才是我们今天要讲的主角。

思考题

在之前 ,如果你让用户选择了5个对象,你要针对每一个对象进行处理,而且中间还要进行一些对象的选择的时候。你是怎么做的?

常用方案

之前我的做法是把每一个对象保存起来,利用持久id或者对象 来一个一个进行处理,但是这样比较麻烦。

正确答案

先看下这一对方法的解释:

感觉就是你可以把当前选择的所有对象暂存,你可以进行一些操作,比如重新选择对象。 用完之后再把之前暂存的选择集恢复出来,就还是原来和状态。 这样你还可以继续进行下一个对象的处理。

具体可以看这个官方的示例:

Add Objects to Selection List Example (C#)


关键代码区域:

				// Start a new selection list

	            ret = selMgr.SuspendSelectionList();    

	            Debug.Print("The current selection list with " + ret + " object (Sketch1) is suspended.");

	            // Add two objects to the new selection list

	            numAdded = selMgr.AddSelectionListObjects((arrObjIn), selData);

	            Debug.Print("A new selection list is started.");


	            // Get number of objects in the new selection list (should be 2)

	            count = selMgr.GetSelectedObjectCount();

	            Debug.Print("The selection list now contains " + count + " objects.");


	            // Get the last object in the new selection list

	            selobj = selMgr.GetSelectedObject6(count, 	-1);

	            Debug.Print("The last object in the selection list is of swSelectType_e = " + selMgr.GetSelectedObjectType3(count, -1) + ".");


	            // Go back to the previous selection list

	            selMgr.ResumeSelectionList();

	            Debug.Print("The previous selection list is resumed.");


	            // Get the number of objects in the selection list (should be 1)

	            count = selMgr.GetSelectedObjectCount();

	            Debug.Print("The selection list now contains " + count + " object (Sketch1).");

总结

像这种方法,如果只是靠宏录制,你永远也不会知道还有这种操作,所以还是要学会常查API,翻一翻,看一看,就会有新的收获 。

如果这篇文章对你有帮助,就点个赞呗。

最后假期余额已不足,祝大家节日快乐。

posted @
2021-10-05 10:18 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源