收藏 分销(赏)

sw二次开发文档.doc

上传人:pc****0 文档编号:5707975 上传时间:2024-11-15 格式:DOC 页数:21 大小:181KB 下载积分:10 金币
下载 相关 举报
sw二次开发文档.doc_第1页
第1页 / 共21页
sw二次开发文档.doc_第2页
第2页 / 共21页


点击查看更多>>
资源描述
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 = ***www.CAxH"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 feature.Name ‘ 在立即窗口 打印 特征的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帮助。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 环境建筑 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服