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

SolidWorks二次开发-工程图-预定义视图

SolidWorks二次开发-工程图-预定义视图

知识点: 利用预定义视图来创建工程图

今天还比较早,来补个知识点吧。

我们来学习一下工程图,大家知道在做工程图模板的时候可以先预定一个视图在工程图上。

比如: 我想要在某个固定的位置放上一个固定的视图,下次用这个工程图模板出图的时候,这个预定义视图就会根据我们关联的模型来显示。

下面是插件预定义视图的菜单:


比如我在图纸的右上角插入一个轴侧图,带颜色 显示的那种。

视图名称我们改成了MyView1

然后我们看下用代码怎么用我们刚定义的模板来新建工程图,并且给零件出个图纸。

关键代码:

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

            string dotPath = @"D:\09_Study\CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\DrawingTemplate.DRWDOT";

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

            ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;
            //选中视图,并获取
            var boolstatus = swModel.Extension.SelectByID2("MyView1", "DRAWINGVIEW", 0, 0, 0, false, 0, null, 0);

            var thisView = (View)swModel.ISelectionManager.GetSelectedObject5(1);

            DrawingDoc drawingDoc = (DrawingDoc)swModel;

            string partPath = @"D:\09_Study\CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\globalvariable.SLDPRT";
            //给预定义视图插入模型
            drawingDoc.InsertModelInPredefinedView(partPath);

            //设置视图的比例
            thisView.ScaleDecimal = 0.2;

            swModel.EditRebuild3();
        }

使用频率: 中

结果预览:


总结:

这种方式适合于动态创建工程图,如果是已经做好的工程图就不需要用到这个功能了。

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

SolidWorks PDM二次开发—连接PDM

SolidWorks PDM二次开发—连接PDM

我们今天开始PDM开发学习的第一步—连接到PDM!

好像不是第一步,第一步应该是环境安装。这个我就不讲了,基本上安装上就行了。
环境ok的话,管理端界面(我新建了一个PDMTraining的库)

本地库界面:(里面文件夹是我新建的)

好了,现在我们看下怎么操作:
新建一窗口程序 ,然后设计一个高大上的页面,加上一个按钮!
如下图:

增加PDM库的引用:

然后贴下代码:

    private void btnConnectToPDM_Click(object sender, EventArgs e)
        {
            try
            {
                //new 一个库对象
                var vault = new EdmVault5();
                //登陆到库中 -有好几种api,大家自己查询 
                vault.LoginAuto("PDMTraining", this.Handle.ToInt32());

                //如果用户登录成功,显示下本地库根目录路径
                if (vault.IsLoggedIn)
                {
                    MessageBox.Show(vault.RootFolderPath);
                }




                string message = "";
                IEdmFile5 file5 = null;  //文件对象
                IEdmFolder5 folder5 = null; //文件夹对象
                folder5 = vault.RootFolder; //根目录

                IEdmPos5 pos5 = null;
                pos5 = folder5.GetFirstFilePosition();  //第一个文件
                if (pos5.IsNull)
                {
                    message = "The root folder of your vault does not contain any files";
                    MessageBox.Show(message);
                    return;
                }

                message = "The root folder of your vault contains these files:" + "\n";

                //获取所有文件
                while (!pos5.IsNull)
                {
                    file5 = folder5.GetNextFile(pos5);
                    message = message + file5.Name + "\n";
                }

                MessageBox.Show(message);
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                MessageBox.Show("Hresult=0x" + ex.ErrorCode.ToString("x") + "\n" + ex.Message);
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
                throw;
            }
        }

当前库状态:

结果提示:

好了,说明我们连接成功了,并且递归显示了文件的路径。

还是老样子,上码云下载源码:
https://gitee.com/painezeng/solidworks-pdmprofessional-apistudy

觉得写的马马虎虎,能看的过去的,麻烦加个关注,点个赞。
有钱的打个赏,没钱的尽量打个赏。哈哈

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

SolidWorks二次开发—简单的参数化示例

SolidWorks二次开发—简单的参数化示例

参数化设计? 我们看下百度的解释

哇,好像没几个字,你会了吗?

我用小白的口气解释一下: 就像我有个生产苹果的机器 ,你想要苹果的时候告诉我你想要多大的苹果就行。 这里面苹果的大小就是一个参数。小朋友 可能 只要直径10cm的苹果就能吃饱,但是大人就得要直径20cm的苹果。所以这个生产苹果的机器 就只需要这一个参数就行了。
这就参数化设计,元芳,你怎么看?
在SolidWorks中做参数化开发有不同的方式,大多都采用先建立好一套初始模型,然后通过程序 修改参数来得到新的模型,从而完成设计。
当然也有些是直接采用api接口直接进行绘制的,这种就相对来说比较复杂,不适合大量的操作。

下面我们就用一个简单的例子,来实战一下:

我们先弄一个简单的界面,里面有一些参数:
其实就是一个零件上有很多个小孔, 通过些小孔控制整个零件的尺寸,来设计零件。

下面是主要的代码(Vb.net版本):

Function ModifyActionModel() As Boolean
        Try
            Dim swModel As ModelDoc2
            Dim swEqnMgr As EquationMgr

            Dim eqName As String

            swApp = GetObject(, "SldWorks.Application")
            swModel = swApp.ActiveDoc

            If swModel Is Nothing Then

                MsgBox("当前模型为空。请打开后重试")

            End If
			
			'通过这个属性来检查零件是否能通过工具修改
            Dim ActionPartCode = swModel.CustomInfo2("", "CodeID")
            If ActionPartCode = "B0000001" Then


            Else

                MsgBox("当前模型不是工具生成的零件,所以无法修改。")

                Return False

            End If
			
            swEqnMgr = swModel.GetEquationMgr
            ProgressStatus.Value = 40
            Dim str1 As String = """"
			'通过修改方程式来控制模型
            For i = 0 To swEqnMgr.GetCount - 1

                eqName = Mid(swEqnMgr.Equation(i), 1, (InStrRev(swEqnMgr.Equation(i), "=")) - 1)

                If InStr(eqName, Chr(34) & "circle_R" & Chr(34)) Then swEqnMgr.Equation(i) = """circle_R""= " & Val(txtR.Text)
                If InStr(eqName, Chr(34) & "number_X" & Chr(34)) Then swEqnMgr.Equation(i) = """number_X""= " & Val(cobXQty.Text)
                If InStr(eqName, Chr(34) & "number_Y" & Chr(34)) Then swEqnMgr.Equation(i) = """number_Y""= " & Val(cobYQty.Text)
                If InStr(eqName, Chr(34) & "circle_x" & Chr(34)) Then swEqnMgr.Equation(i) = """circle_x""= " & Val(txtLeft.Text)
                If InStr(eqName, Chr(34) & "circle_Y" & Chr(34)) Then swEqnMgr.Equation(i) = """circle_Y""= " & Val(txtRight.Text)
                If InStr(eqName, Chr(34) & "box_Height" & Chr(34)) Then swEqnMgr.Equation(i) = """box_Height""= " & Val(txtHeight.Text)
                If InStr(eqName, Chr(34) & "circle_Dim" & Chr(34)) Then swEqnMgr.Equation(i) = """circle_Dim""= " & Val(Double.Parse(txtR.Text) + Double.Parse(txtGap.Text))

            Next
            ProgressStatus.Value = 80
            Dim ret As Integer

            ret = swEqnMgr.EvaluateAll
            ret = swModel.ForceRebuild3(True) 'Rebuid model
            ProgressStatus.Value = 100
            Return True
        Catch ex As Exception
            Return False

        End Try

    End Function

这样就完成了设计,至于工具编程涉及的功能我之前 的博文中都有写到。
比如修改尺寸,属性 ,方程式,压缩特征等等。。。

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