sw二次开发文档

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VBA(Visual Basic for Application)实际就是集成在应用程序内部的开发语言,可以看作是VB的简化版本。

使用VBA 编写的程序即称为“宏”。

注意,VBA编写的宏是不能脱离应用程序而独立运行的,例如SW的宏必须在SW环境下运行。

在SW中打开VBA的方法:使用菜单【工具/宏操作/新建...】或者【工具/宏操作/编辑】
第一课简单的VB知识
VB是我们使用的开发工具,多了解VB知识有助于我们更好的进行SW的二次开发。

如有可能,请尽可能抽出时间认真学习VB。

VB是面向对象的开发工具。

所以“对象”是我们所需要操作的核心。

对象代表应用程序中的元素,例如草图直线、拉伸特征。

如果我们需要在SW中画一条直线,实际就是添加一个草图直线对象。

如果需要修改拉伸特征的定义实际就是编辑拉伸特征对象。

每个对象都有自己的“属性”和“方法”。

“属性”描述了对象的特性,例如Layer(图层)对象有这样几个属性:Name(名称),Color(颜色),Widty(线宽)。

显然,只要我们将这几个属性一一表述清楚就可以准确的描述出这个图层对象的特性。

“方法”就是对象所能进行的操作。

例如PartDoc(零件文档)对象有这个方法:SaveToFile2。

只要我们获得了PartDoc 对象,就可以使用这个方法将当前选择的曲面或实体保存为文件。

提示:对于简单的VB知识,可以查看VBA的帮助。

(打开VBA的编程界面,然后使用菜单【帮助/VB 帮助】,或者直接按 F1 键)
第二课 SW的对象模型
我们可以SW的API帮助查询SW相关的对象、属性和方法。

打开SW,使用菜单【帮助/SW API和插件帮助主题】,在弹出的帮助窗口中选择【索引】标签,并输入关键字“object”,然后双击想要查看的主题(object diagram, SolidWorks API)。

如需要进一步查询某个对象的具体信息,可以点击图片中对应的对象明。

例如,我们单击“SldWorks”,(如果你很熟悉对象名,可以直接在索引中输入对象名,这样查询对象的属性和方法更便捷) 。

第三课开始简单的编程
如何使用SW提供的这些对象进行我们的二次开发,我们来看看下面这个简单的例子。

我们可以看到SW众多的对象中,SolidWorks对象(SW应用程序对象)处于最顶层,所以获得SldWorks对象是首先要做的Set swApp = Application.SldWorks
上面这条语句的作用是将swApp变量设置成为SW应用程序对象,获得应用程序对象之后,我们就可以使用他的方法来完成我没需要的功能。

例如,现在我们需要知道当前SW所使用的语言。

Lang = swApp.GetCurrentLanguage()
使用swApp对象的GetCurrentlanguage方法,并将返回值赋予变量Lang。

完整的程序是这样:
ASP/Visual Basic代码
1. Sub main()
2. Set swApp = Application.SldWorks
3. Lang = swApp.GetCurrentLanguage()
4. MsgBox Lang '弹出消息框,显示当前SW使用的语言
5. End Sub
具体的操作方法是这样:
•打开SW;
•使用菜单【工具/宏操作/新建...】;
•输入文件名,并保存;
•显示VBA的工作界面;
•删除窗口中自动生成的程序代码,然后将上面的程序复制到窗口中(中括号内的部分,不包括中括号;
•使用工具栏上的保存按钮,保存结果;
•使用菜单【运行/运行子过程】,或者单击工具栏上的运行按钮(蓝色箭头);
•显示运行结果。

第四课关于变量的声明
一般在变量使用前,都要首先声明变量,下面来看看声明对象变量的方法:
Dim swApp As Objict
swApp As SldWorks.SldWorks
上面两段语句的作用都是声明了对象变量“swApp”。

前一段语句将变量声明为一般的对象类型,后一段语句将变量声明为指定的对象类型(此例中声明为Solidworks应用程序对象)。

声明指定的对象类型提供自动的类型检查,更快的代码,并增加可读性。

建议尽量使用这种声明的方法。

如果有的对象只有在程序执行时才能确定起变量的类型,在编程时不能确定其确切的类型,那么就可以将其声明为一般的对象类型。

下面列举几个SW种常用对象的声明:
Dim swApp As SldWorks.SldWorks 'SW应用程序对象
Dim swModel As SldWorks.ModelDoc2 '文档对象
Dim swPart As SldWorks.PartDoc '零件文档对象
Dim swAssembly As SldWorks.AssemblyDoc '装配体文档对象
Dim swDrawing As SldWorks.DrawingDoc '工程图文档对象
Dim swFeature As SldWorks.Feature '特征对象
Dim swSelectMgr As SldWorks.SelectionMgr '选择管理器对象
第五课在开发环境中添加类型库的引用
先看看添加引用的方法:通过菜单【工具/引用...】,在对话框中选择下面两项 (根据SW的不同,名称可能略有不同)。

SldWorks 2006 Type Library
SolidWorks 2006 Constant Type Library
前一项定义了SW中的所有对象。

如果在你的程序中需要操作SW的对象,就不要忘记选中它。

在默认的环境中已经选择了这项。

(如果你需要在程序中操作Excel对象,例如读取表格数据,那么不要忘了选中Execl对象库的应用)。

后一项定义了二次开发中会用到的SW中所有的常量,默认环境中没有选择,需要自己添加引用。

让我们举个例子看看它用什么作用。

下面是一个典型的创建新文档的语句
set newDoc = SldWorks.NewDocument ( ***, swDwgPaperA3size, ***, *** )
set newDoc = SldWorks.NewDocument ( ***, 8, ***, *** )
两句语句作用是相同的,但是前一句的可读性更好,我们可以很直观的看到创建了一个A3大小的文档。

如果没有添加对SW常量的引用,那么,前一种写法将导致程序运行出错。

第六课赋值和引用 (Let & Set)
对于变量的赋值,我们使用Let语句,如:Let a = 10
我们也可以省略Let,如上句也可写成:a = 10
对于对象的引用,我们使用Set语句,如:Set obj1 = ***;注意,Set不能省略。

赋值和引用是有区别的,如:
a = 10
b = a
上例中出现了两个变量,这两个变量是独立的,虽然此时他们的值都是10,但是,如果修改其中一个变量的值并不会影响另一个变量。

Set obj1 = ***"q [m R ` ? A2B
Set obj2 = obj1
上例中也出现了两个变量,但他们引用了同一个对象,无论如何修改对象,都会同时反映到两个变量。

其实,引用只是建立了一个访问对象的路径,即使上例中两个变量都被释放,对象依然存在,只是暂时不能被访问而已。

第七课录制宏——快速写代码的方法
所谓录制宏,就是记录人的操作过程,并将其转换成程序代码。

注意,并不是所有的操作都能被转换成代码的,而且,自动录制的程序对环境的要求比较严谨,导致录制的程序兼容性很差。

所以,在真正的开发中,录制宏只能担当辅助的角色。

但是录制宏易学易用,值得初学者学习。

以下是录制的过程,以及得到的程序。

第八课修改特征定义
手动修改特征定义是我们经常作的事,当然,也可以使用程序自动完成。

(修改特征定义的操作是不能用录制宏功能记录的),让我们利用上边录制的程序来练练如何修改特征定义。

1. 获得特征对象(Feature Object)的引用
我们可以很容易的找到程序中添加拉伸特征的语句,但是他没有建立引用。

自己手动改一下;
原来:Part.FeatureManager.FeatureExtrusion True, False, False, 0, ...
改为:Set featObject = Part.FeatureManager.FeatureExtrusion (True, False, False, 0, ...)
2. 获得特征定义对象(Feature Definition Object)的引用
注意,特征对象中保存的数据主要是特征的名称,特征的显示状态等信息,而特征定义对象中保存的信息才是我们需要的。

可以用 "GetDefinition" 方法获得特征定义对象的引用
Set featObjDef = featObject.GetDefinition()
3. 使用对象的属性和方法以获得需要的数据,例如获取拉伸特征第一方向的拉伸深度
a = featObjDef.GetDepth(True)
4. 修改特征定义,设置拉伸深度为原来的两倍
featObjDef.SetDepth True, a * 2
5. 更新特征定义
featObject.ModifyDefinition featObjDef, Part, Nothing
编辑原文件,按以上步骤修改,并且在文档头部添加适当的变量声明,然后看看运行结果。

特别注意,无论你的模型使用的是什么单位制,在二次开发时,一律使用米(m)为长度单位,弧度(rad)为角度单位。

可以尝试一下,修改特征定义中的其他项目。

使用VBA进行solidworks开发指南
专业交流2009-05-07 23:21 阅读69 评论0 字号:大大中中小小作者:marsarden 转载请注明
在对solidworks原有功能进行改善的过程中,有效地利用solidworks提供给我们的应用编程接口(API)来编写提高我
们工作效率的程序是其中手段之一。

本文在于总结作者进行此类开发的经验,给大家提供一些经验性建议。

目录
第1章概述 (2)
1.1 内容简介 (2)
1.2 名词解释 (2)
1.3 预备知识 (3)
第2章录制、编辑、运行宏 (3)
2.1 录制、编辑、运行宏基本步骤: (3)
2.2 一些基本的建议: (3)
第3章代码格式及帮助信息 (5)
3.1 代码格式: (5)
3.2 获得帮助: (6)
第4章常用对象模型 (7)
4.1 综述: (7)
4.2 SldWorks.SldWorks : 8
4.3 SldWorks.ModelDoc2: (8)
4.4 SldWorks.PartDoc、SldWorks.AssemblyDoc、SldWorks.DrawingDoc: (9)
4.5 SldWorks.feature、SldWorks.Sketch : (9)
第5章零件 PartDoc. 9
5.1 综述: (9)
5.2 选择对象的话题: (10)
5.3 访问并修改特征: 12
5.4 草图的话题: (17)
第6章装配体 (18)
6.1 综述: (18)
6.2 组件的话题:插入零部件到装配体 (19)
6.3 配合的话题:在装配体中添加配合 (22)
6.4 由于说到参考,顺便讨论一下配合参考: (26)
第7章工程图 (28)
7.1 综述: (28)
7.2 注释的话题: (29)
7.3 生成图纸的话题:并讨论如何解决实际问题 (30)
第8章总结: (40)
第1章 arden says:像这样的 Part.ActiveView().RotateAboutCenter 0.0662574, 0.0346621 无情的删掉吧
3、Delete all ModelDocExtension::SelectByID2 calls appearing immediately before ModelDoc2::ClearSelection2 calls. However, do not delete ModelDocExtension::SelectByID2 calls appearing immediately after ModelDoc2::ClearSelection2 calls. Delete all ModelDoc2::ClearSelection2 calls appearing immediately before ModelDocExtension::SelectByID2.
删除所有紧挨ModelDoc2::ClearSelection2之前的ModelDocExtension::SelectByID2调用,不要删除紧挨ModelDoc2::ClearSelection2调用后的ModelDocExtension::SelectByID2。

删除所有紧挨ModelDocExtension::SelectByID2之前的ModelDoc2::ClearSelection2。

下图为VBA的集成编辑环境:
编辑完成后,按照程序的要求来运行宏,在VBA编辑器中点“运行”开始执行程序,需要注意,有些宏程序的运
行有前提条件,比如需要事先选择好一个特征等。

第一次运行不一定成功,这时候就要对宏代码进行调整,反复一个编
辑代码、测试运行的循环,最后得到比较满意的结果。

加载宏到solidworks有很多种方法我们只介绍最简单的三种:快捷键、菜单、工具栏按钮。

可以参考文档《SW技术文
档-2005041402-加载宏到solidworks的三种方法.doc》
swDocumentTypes_e 文档类型
Input:
(long) Options
Mode in which to open the document as defined in swOpenDocOptions_e 打开选项
Input:
输入
(BSTR) Configuration
Model configuration in which to open this document 配置设置
Applies to parts and assemblies, not drawings 只在零件和装配体适用
If this argument is empty or the specified configuration is not present in the model, the model is opened in the last-used configuration. 如果未指定任何配置将使用最后一次打开的配置。

Output:输出
(long) Errors
Load errors as defined in swFileLoadError_e 打开错误
Output:
(long) Warnings
Warnings or extra information generated during the open operation as defined in swFileLoadWarning_e 打开警告
Return:返回
(LPDISPATCH) retval
Pointer to a Dispatch object, the newly loaded ModelDoc2, or NULL if failed to open
Remarks备注:
When opening a parent document (assembly, drawing, and so on):
SolidWorks also opens any additional documents that are referenced in the parent document (parts, subassemblies, and so on).
SolidWorks follows certain rules in trying to locate its referenced documents. If explicit Search Folders have not been set using Tools, Options, System Options, ExternalReferences, then the first place SolidWorks looks for the referenced documents is in the current working directory. If SolidWorks finds the referenced file in the current working directory, then it is loaded from that directory. ……
我们应该具备的素质就是,可以按照上面的参考内容明白API的使用方法和规则。

而我们常常需要注意的焦点是语法(Syntax)知道需要输入什么参数返回什么对象就基本OK了,不要被前面一片英文所迷惑。

最后我们介绍一下API帮助的目录:
Solidworks 2005 API Release Notes :此文档树下为sw2005版本的新特性:新对象新函数等
Programmer’s Guide :此文档树目录下为sw编程向导,提供了开始编程的向导、sw对象模型总揽和实际编程中的注意事项等内容。

Examples :此文档树目录下为sw所有示例工程,分为c++和VB两中语言大类。

我们经常需要访问的地方。

APIs :sw提供的所有API定义及参考。

Obsolete APIs :sw已过时的API。

swSelectType_e中定义)并且函数并不返回所选择对象而是一个执行状态。

如果想得到我们刚才选择的对象,则需要用到另一个函数GetSelectedObject5。

使用GetSelectedObject5之前需要介绍一下SelectionMgr对象:此对象允许你得到所选择对象的信息,对其进行一些操作。

GetSelectedObject5就是SelectionMgr对象的一个方法。

可以使用ModelDoc2.SelectionManager来得到一个SelectionMgr对象。

并且需要注意的是sw将所选择的对象进行了索引,我们可能同时选中了多个对象,通过GetSelectedObject5(index)中得index值来得到不同的选择对象。

看下面程序,它使用SelectByID2将当前打开的模型文件中的特征“拉伸1”选中,如果选择成功的话再使用GetSelectedObject5得到此特征:
‘++++++++++++++++++++++++++++++++
‘Filename Selefeat.swp : Select feature”拉伸1”
‘++++++++++++++++++++++++++++++++
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim Model As ModelDoc2
Dim feature As feature ‘定义一个特征对象
Dim boolstatus As Variant ‘定义api返回值
Sub main()
Set swApp = Application.SldWorks
Set Model = swApp.ActiveDoc ‘前面已经介绍,上面两句话基本上是固定模式
' 选择叫"拉伸1"的特征
boolstatus = Model.Extension.SelectByID2("拉伸1", "BODYFEATURE", 0, 0, 0, False, 0, Nothing, swSelectOptionDefault)
'主要就是这一句话,在写Option Explicit后函数的最后一个参数swSelectOptionDefault可以使用0来代替
If boolstatus = True Then '如果有“拉伸1”这个特征下面的代码将其选中
Dim SelMgr As SelectionMgr ‘声明一个selectionmgr 对象
Set SelMgr = Model.SelectionManager ‘得到当前模型的选择对象
Set feature = SelMgr.GetSelectedObject5(1) '此处使用一个索引来得到特征
Debug.Print ‘在立即窗口打印特征的name属性
Else
Debug.Print "Error"
End If
End Sub
两个函数的VB语法表述如下,具体请参考API帮助:
ModelDocExtension::SelectByID2
Syntax (OLE Automation)
retval = ModelDocExtension.SelectByID2 ( Name, Type, X, Y, Z, Append, Mark, Callout. SelectOption ) SelectionMgr::GetSelectedObject5
Syntax (OLE Automation)
retval = SelectionMgr.GetSelectedObject5 ( AtIndex )
在选择对象这个话题中我们还要讨论几个API:
ModelDoc2::ClearSelection2 此API清空SW的选择列表,即取消所有选择。

还有activate系列:
retval = SldWorks.ActivateDoc2 ( name, silent, &errors ) ‘激活文档
retval = DrawingDoc.ActivateSheet( SheetName ) ‘激活工程图纸
retval = DrawingDoc.ActivateView ( viewName) ‘激活视图
void ModelDoc2.ActivateSelectedFeature () ‘激活选中特征
选择的话题就到这里结束。

上面有一处关于swSelectOptionDefault的注释大家可能会有疑惑,这里附加上对solidworks API中定义Enum 的介绍。

为了让API的参数更直观,swAPI中有很多类似的enum定义,它将一系列小整数和字符串描述符对应,在api 的语法参考中都描述了相应的代表对象。

具体实现细节需要参考VB的语法,这里我们需要明白,如果你在程序前面定义了Option Explicit(强制声明)选项,那你需要在使用这些enum时候定义它或使用不直观的整数作为参数。

Public enum swDocumentTypes_e ‘这是一个sw文档类型的列举项
swDocNONE=0 ‘什么也不是
swDocPART=1 ‘零件类型在做为参数时使用1和使用swDocPART效果是相同的,只是swDocPART 意义更加明显
swDocASSEMBLY=2 ‘装配体类型
swDocDRAWING=3 ‘工程图类型
End Enum
arden" '在solidworks中可以使用swAPP.sendmsgtouser2 替代msgbox
featdata.ReleaseSelectionAccess ‘取消特征数据访问
Model.Save
Model.EditRebuild ‘重建模型
End Sub
上面程序运行前,假设你选择了一个简单直孔特征。

然后得到这个孔的一些参数:孔深、直径。

最初做上面程序的时候,我想象中用Set curfeature = SelMgr.GetSelectedObject5(1) 选中特征以后就可以直接curfeature. Depth了。

在参考了API帮助后,我才了解到特征的数据需要先AccessSelections后才能访问。

总结一下,要访问一个特征,需要经历这样的步骤:
定义一个特征对象及特征数据对象: dim....as ...
选中这个特征:比如使用GetSelectedObject5 还有SelectebyID等...
得到特征的定义:GetDefinition
进行访问:AccessSelections
上面的程序没有if选择的容错机制,实际编码中,每个可能出现错误的地方都应该使用if来控制,如下面这句话
boolstatus =featdata.AccessSelections(Model, component)。

我们就需要通过boolstatus的值来判断上面这个语句运行的是否正确,这里的boolstatus很明显是一个布尔型变量:
If not boolstatus then
‘上面语句运行不成功,写错误报告或退出代码
Endif
已经可以访问特征的各参数了,现在我们来修改它:
要修改前面的步骤不能少,当我们已经可以读取一些特征时,我们就可以给他设定一些值。

当然有时需要调用特定的参数。

solidworks是ole和com的,所以要习惯这样。

在修改完特征后需要调用函数modifydefinition()来实现变化。

我们给一个例子,这个例子比前面的都要全面,它有很好的容错引导机制,可以直接拿来成为一个稳定的宏程序。

‘+++++++++++++++++++++++++++++++++
'filename : doubleBE.swp
'date :2005-03-22
' This example doubles the length of the base extrude.这个例子将拉伸凸台的长度增加一倍
'+++++++++++++++++++++++++++++++++++
Dim swApp As SldWorks.SldWorks
Dim Model As ModelDoc2
Dim Component As Component2
Dim CurFeature As feature
Dim isGood As Boolean
Dim FeatData As Object '先声明为object,后面自动匹配为 ExtrudeFeatureData 对象
Dim Depth As Double
Dim SelMgr As SelectionMgr
Sub doubleBE()
Set swApp = CreateObject("sldWorks.application")
Set Model = swApp.ActiveDoc
'确定model是零件或正配体,不是就退出。

在这里swDocPART 和swDocASSEMBLY如果不能通过编译则参考
’上面的enum介绍,换为1和2
If Model.GetType <> swDocPART And Model.GetType <> swDocASSEMBLY Then
Msg = "Only Allowed on Parts or Assemblies" ' Define message
Style = vbOKOnly ' OK Button only
Title = "Error" ' Define title
Call MsgBox(Msg, Style, Title) ' Display error message
Exit Sub ' Exit this program
End If
' 得到 Selection Manager
Set SelMgr = Model.SelectionManager
' 得到所选的第一个对象
Set CurFeature = SelMgr.GetSelectedObject3(1)
If CurFeature Is Nothing Then
' 什么都没有选中
swApp.SendMsgToUser2 "Please select the Base-Extrude", swMbWarning, swMbOk
Exit Sub
End If
' Check the feature's type name
' Make sure it is an extrusion
If Not CurFeature.GetTypeName = swTnExtrusion Then
’在这里使用swTnExtrusion我的环境没有通过,改成了Extrusion才ok,参考BodyFeatures_e的定义
swApp.SendMsgToUser2 "请选择拉伸基体特征", swMbWarning, swMbOk
Exit Sub
End If
' 得到特征数据
Set FeatData = CurFeature.GetDefinition
' Get the access selections for the feature data
' 注意:访问单独零件时参数Component 为 NULL。

如果我们在装配体中使用AccessSelections,将访问最高级文档此时我们的component参数需要制定component来得到其他零件。

isGood = FeatData.AccessSelections(Model, Component)
' Inform the user of an error
If Not isGood Then
swApp.SendMsgToUser2 "Unable to obtain access selections", swMbWarning, swMbOk
Exit Sub
End If
' 确认用户选择的是基体拉伸特征
If Not FeatData.IsBaseExtrude Then
swApp.SendMsgToUser2 "Please select the Base-Extrude", swMbWarning, swMbOk
FeatData.ReleaseSelectionAccess
Exit Sub
End If
' 得到深度并增加到2倍
Depth = FeatData.GetDepth(True)
FeatData.SetDepth True, Depth * 2
' 执行修改
isGood = CurFeature.ModifyDefinition(FeatData, Model, Component)
' 改变步成功
If Not isGood Then
swApp.SendMsgToUser2 "无法修改特征数据", swMbWarning, swMbOk
' 取消对数据的访问
FeatData.ReleaseSelectionAccess
End If
End Sub
TIPs:
如果出现特征出现“退回”状态,只能在代码执行到最后调用
Model.Save
Model.Rebuild
这两个函数来自动更新。

上面的程序中使用了新的没有介绍的API,只作了简单注释性介绍,如果不理解读者可以到API帮助中查看它的细节。

这里只看其中一个API,它可能会经常使用:
如果我们定义了一个特征对象:
dim curfeature as sldworks.feature
又通过SelectMgr得到了这个特征,然后可以使用feature.GetTypeName来判断是那种:
Select Case curfeature.GetTypeName
Case "Cut" '一个拉伸切除特征
do sth.
Case "HoleWzd" '一个异型孔特征
do sth.
Case Else
End Select
end select
这是语法:
Syntax (OLE Automation)
retval = Feature.GetTypeName ()
它会返回一个 (BSTR) retval Feature type as defined in BodyFeatures_e
其中BodyFeatures_e 内容比较多,在这里都列出来也没什么用,大家可以参考solidworks API帮助。

arden 2005-4-4
‘函数在当前工作目录CurrentWorkingDirectory插入一个名为“零件1.SLDPRT”的零件
‘前提条件为当前工作目录有名字为”零件1.sldprt”的零件
‘它有配置名为“配置1”
‘+++++++++++++++++++++++++++++++++
Dim swApp As SldWorks.SldWorks
Dim Model As ModelDoc2
Dim pth As String
Dim strpath As String
Sub insertPart()
Set swApp = Application.SldWorks
strpath = swApp.GetCurrentWorkingDirectory ‘当前工作路径
Set Model = swApp.ActiveDoc
pth = strpath & "零件1.SLDPRT" ‘得到文件的FULLPATH全名
Model.AddComponent4 pth, "配置1", 0, 0, 0 ‘添加零部件
End Sub
然而,这个程序比不是想象中那么好用。

为什么呢??回头看addcomponent4的remark,上面这样写:
The specified file must be loaded in memory. A file is loaded into memory when you load the file in your SolidWorks session (SldWorks::OpenDoc6) or open an assembly that already contains the file.
就是说你想指定的插入的文件必须在调用函数之前已经在内存中加载了。

不习惯,你就不能直接打开多简单,没办法,我还没有找到好的方法,只能按人家的来:
看看下面的函数Opendoc6,它打开一个文档:
Opendoc6:
retval = SldWorks.OpenDoc6 ( filename, type, options, configuration, &Errors, &Warnings )
Input: (BSTR) Filename Document name or full path if not in current directory, including extension
Input: (long) Type Document type as defined in swDocumentTypes_e Input: (long) Options Mode in which to open the document as defined in swOpenDocOptions_e
Input: (BSTR) Configuration Model configuration in which to open this document:Applies to parts and assemblies, not drawings
If this argument is empty or the specified configuration is not present in the model,
the model is opened in the last-used configuration.
Output: (long) Errors Load errors as defined in swFileLoadError_e Output: (long) Warnings Warnings or extra information generated during the open operation as defined in swFileLoadWarning_e
Return: (LPDISPATCH) retval Pointer to a Dispatch object, the newly loaded ModelDoc2, or NULL if failed to open
这个函数参数1就是文档的全名,参数2是要插入的类型描述,其中0123分别表示:
0 swDocNONE:不是sw文件
1 swDocPART:零件
2 swDocASSEMBLY:装配体
3 swDocDRAWING:工程图
如果想使用swDocNONE,需要定义:
Public Enum swDocumentTypes_e
swDocNONE = 0
swDocPART= 1
swDocASSEMBLY = 2
swDocDRAWING=3
End Enum
参数3是打开文档的模式,一般我们就选择swOpenDocOptions_Silent 用0 表示,当然还有只读、只看等选项参数4是打开选项,一般置空
后面是两个OutPut,用来显示错误打开时的提示
函数返回一个指向打开文件的指针。

按照上面的要求我们在向装配体中插入一个零部件时,需要这样步骤:
1、得到装配体
2、使用opendoc6打开需要插入的零件
3、使用addcomponent4插入零件到装配体
我们上面的程序需要这样来修改一下,添加了一个打开文档的函数:
' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' insertpart 03/21/05 by
arden
'插入零件1
'前提条件:在装配体所在文件夹中有零件“零件1”存在,并且零件1有配置“配置1”
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dim swApp As SldWorks.SldWorks
Dim Model As ModelDoc2
Dim YSBmodel As ModelDoc2
Dim pth As String
Dim strpath As String
Dim nErrors As Long
Dim nWarnings As Long
Sub insertpart()
Set swApp = Application.SldWorks
strpath = swApp.GetCurrentWorkingDirectory
Set Model = swApp.ActiveDoc
pth = strpath & "零件1.SLDPRT"
openYSB (pth) ‘在添加零部件之前,先打开它
Model.AddComponent4 pth, "配置1", 0, 0, 0
End Sub
'这个函数打开零件1
Sub openpart(ByVal pth As String)
Dim path As String
Dim newswapp As SldWorks.SldWorks
Set newswapp = Application.SldWorks
path = pth
Set YSBmodel = newswapp.OpenDoc6(path, 1, swOpenDocOPtions_Silent, "", nErrors, nWarnings) YSBmodel.Visible = False ‘我不想看到零件1
End Sub
swMateType_e
配合类型
Input:
(long) alignFromEnum
Type of alignment as defined in swMateAlign_e
对齐选项
Input:
(VARIANT_BOOL) flip
TRUE to flip the component, FALSE otherwise
是否翻转
Input:
(double) distance
Distance value to use with distance or limit mates
距离
Input:
(double) distAbsUpperLimit
Absolute maximum distance value (see Remarks)
距离限制max
Input:
(double) distAbsLowerLimit
Absolute minimum distance value (see Remarks)
距离限制min
Input:
(double) gearRatioNumerator
Gear ratio numerator value for gear mates
齿轮配合分子值
Input:
(double) gearRatioDenominator
Gear ratio denominator value for gear mates
齿轮配合分母值
Input:
(double) angle
Angle value to use with angle mates
角度
Input:
(double) angleAbsUpperLimit
Absolute maximum angle value
角度限制max
Input:
(double) angleAbsLowerLimit
Absolute minimum angle value
角度限制min
Output:
(long) errorStatus
Success or error as defined by swAddMateError_e
错误报告
Return:
(LPMATE2) pMateObjOut
Pointer to the Mate2 object
返回指向配合的指针
ModelDoc2::ClearSelection2(VARIANT_TRUE) before selecting entities to mate.
ModelDocExtension::SelectByID2 with Mark = 1 to select entities to mate.
ModelDoc2::ClearSelection2(VARIANT_TRUE) after the mate is created.
If mateTypeFromEnum is swMateCAMFOLLOWER, then use a selection mark of 8 for the cam-follower face.
如果配合类型为凸轮,在表面标示8. 注:这个我也不太明白哈哈
If nothing is preselected, then errorStatus is swAddMateError_IncorrectSeletions and pMateObjOut is NULL/Nothing.
如果实现没有限定实体来配合,将会抱错swAddMateError_IncorrectSeletions,函数返回NULL或者Nothing
上面就是API帮助所说的话,下面给出一段示例程序,假设之前我们已经选择了两个半径一样的圆柱面,那么我们来定义一个同心配合:
Set swmatefeat = swassy.AddMate2(1, 0, False, 0, 0, 0, 0, 0, 0, 0, 0, nErrors)
其中的 Dim swassy As SldWorks.AssemblyDoc
Dim swmatefeat As Object
注:在编程中有时候不能实现确定一个对象的类型,我们可以声明一个Object对象,让VB自己去匹配。

但这样做是影响了效率代码也不清晰。

要完成一个距离或者角度要麻烦一些,就像上面的remark中说明的:
Set swmatefeat = swassy.AddMate2(5, 1, True, 0.001, 0.001, 0.001, 0, 0, 0, 0, 0, nErrors)
在这里我们需要将min和max都设置成与距离值相等,要不然配合会认为我们设定了高级配合中的限制条件,会报错。

并且第三个参数和第二个参数需要按实际情况来确定。

最后我们列出AddMate2的类型,里面的英文我认识的不多,大部分都是查字典和实验得到的所以列出来,你需要的时候不用实验和查字典了:
swMateType_e
‘Specifies values for assembly-mate information.
swMateCOINCIDENT 0 重合
swMateCONCENTRIC 1 同心
swMatePERPENDICULAR 2 垂直
swMatePARALLEL 3 平行
swMateTANGENT 4 相切
swMateDISTANCE 5 距离
swMateANGLE 6 角度
swMateUNKNOWN 7 未知
swMateSYMMETRIC 8 对称
swMateCAMFOLLOWER 9 凸轮
swMateGEAR 10 齿轮
下面的代码选择了零件的两个面,然后为此零件添加一个配合参考,先选择的面为配合参考的第一参考面。

并且是同向、重合配合。

第二个为反向、重合配合。

需要看Part.FeatureManager.InsertMateReference函数。

第一个参数是配合参考的名称,后面三个为一组定义一个参考。

第一个为选择的实体entity,然后是配合类型(整数索引),正反向(整数索引)。

Dim swApp As SldWorks.SldWorks
Dim Part As SldWorks.ModelDoc2
Dim selmgr As SldWorks.SelectionMgr
Dim Feature As SldWorks.Feature
Dim facefst As SldWorks.face2
Dim facesed As SldWorks.face2
Dim facefstent As SldWorks.Entity
Dim facesedent As SldWorks.Entity
Dim tempfeat As Object
Sub addcleatmateref()
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
Set selmgr = Part.SelectionManager
Set tempfeat = selmgr.GetSelectedObject5(1)
If tempfeat.GetType = 2 Then
Set facefst = tempfeat
Set facefstent = facefst
Else
MsgBox "请选择平面"
End If
Set tempfeat = selmgr.GetSelectedObject5(2)
If tempfeat.GetType = 2 Then
Set facesed = tempfeat
Set facesedent = facesed
Else
MsgBox "请选择平面"
End If
Set Feature = Part.FeatureManager.InsertMateReference("配合参考1", facefstent, 2, 1, facesedent, 2, 2, Nothing, 0, 0)
End Sub
在实际的代码中,我们经常需要遍历一个装配体,下面是遍历装配体的方法:
下面的例子完全照API帮助中搬来的,它用来显示当前装配体的所有零部件。

程序使用了一个简单的递归方法遍历了装配体。

This example shows how to make all assembly components visible.
'---------------------------------------
' Preconditions: An assembly document is open.
' Postconditions: Any hidden assembly components are made visible.
'---------------------------------------
Option Explicit
Public Enum swComponentVisibilityState_e ‘装配体中组件的显示状态:0隐藏 1显示
swComponentHidden = 0
swComponentVisible = 1
End Enum
Sub TraverseComponent _
( _
swComp As ponent2, _
nLevel As Long _
) ‘递归函数
Dim vChildCompArr As Variant
Dim vChildComp As Variant
Dim swChildComp As ponent2
Dim swCompConfig As SldWorks.Configuration ‘组件配置
Dim sPadStr As String
Dim i As Long
For i = 0 To nLevel – 1 ‘这个循环没什么实际作用,打印父子装配体的缩进
sPadStr = sPadStr + " "
Next i
vChildCompArr = swComp.GetChildren ‘得到装配体的子组件 For Each vChildComp In vChildCompArr ‘对于每个子组件
Set swChildComp = vChildComp
Debug.Print sPadStr & 2 & " <" & swChildComp.ReferencedConfiguration & ">"
If swComponentHidden = swChildComp.Visible Then ‘如果他的状态是隐藏则给它显示
swChildComp.Visible = swComponentVisible
End If
TraverseComponent swChildComp, nLevel + 1 ‘如果他也有子组件,进入递归 Next
End Sub
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swConf As SldWorks.Configuration
Dim swRootComp As ponent2
Dim bRet As Boolean
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swConf = swModel.GetActiveConfiguration
Set swRootComp = swConf.GetRootComponent
Debug.Print "File = " & swModel.GetPathName
TraverseComponent swRootComp, 1
End Sub
装配体的话题到此为止,回顾一下我们学习了怎样在装配体中插入组件,怎样添加一个配合,怎么样访问装配体中的每一个子组件,内容够丰富了。

下面我们来讨论最后一个主题:工程图。

工程图
工程图中包含了两个独立的对象,图纸sheet和视图view。

但是对使用者来说很容易将图纸对象架设在视图对象上方。

因为给人直观感觉是一个工程图可能有多个sheet,每个sheet中又可以有多个view。

其实从右边的对象模型中可以看到,真正的内容还都在view对象中,而view并不受sheet限制,它们在DrawingDoc中是平行的。

我们主要通过两个话题来讨论工程图:一个是注释的问题,一个是生成图纸。

这里讨论的注释是工程图图纸格式的注释,即工程图中的说明部分的控制。

下面的程序读取当前图纸的每一个note,并在debug中打印结果。

Option Explicit
Dim swname As String
Dim swtext As String
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc ‘工程图对象
Dim swView As SldWorks.View ‘视图对象
Dim swNote As SldWorks.note ‘注释对象
Dim swAnn As SldWorks.Annotation ‘标注对象
Dim bRet As Boolean
Set swApp = CreateObject("SldWorks.Application")
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
Set swView = swDraw.GetFirstView ‘得到第一个视图
Set swNote = swView.GetFirstNote ‘得到第一个注释
swModel.ClearSelection2 (True)
Debug.Print "File = " & swModel.GetPathName
Do While Not swNote Is Nothing。

相关文档
最新文档