使用vba进行solidworks开发指南_第1页
使用vba进行solidworks开发指南_第2页
使用vba进行solidworks开发指南_第3页
使用vba进行solidworks开发指南_第4页
使用vba进行solidworks开发指南_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z.目录EndIf

EndSub两个函数的VB语法表述如下,具体请参考API帮助:ModelDocE*tension::SelectByID2Synta*(OLEAutomation)retval=ModelDocE*tension.SelectByID2(Name,Type,*,Y,Z,Append,Mark,Callout.SelectOption)SelectionMgr::GetSelectedObject5Synta*(OLEAutomation)retval=SelectionMgr.GetSelectedObject5(AtInde*)在选择对象这个话题中我们还要讨论几个API:ModelDoc2::ClearSelection2此API清空SW的选择列表,即取消所有选择。还有activate系列:retval=SldWorks.ActivateDoc2(name,silent,&errors)‘激活文档retval=DrawingDoc.ActivateSheet(SheetName) ‘激活工程图纸retval=DrawingDoc.ActivateView(viewName) ‘激活视图voidModelDoc2.ActivateSelectedFeature() ‘激活选中特征选择的话题就到这里完毕。上面有一处关于swSelectOptionDefault的注释大家可能会有疑惑,这里附加上对solidworksAPI中定义Enum的介绍。为了让API的参数更直观,swAPI中有很多类似的enum定义,它将一系列小整数和字符串描述符对应,在api的语法参考中都描述了相应的代表对象。具体实现细节需要参考VB的语法,这里我们需要明白,如果你在程序前面定义了OptionE*plicit〔强制声明〕选项,那你需要在使用这些enum时候定义它或使用不直观的整数作为参数。PublicenumswDocumentTypes_e‘这是一个sw文档类型的列举项swDocNONE=0 ‘什么也不是swDocPART=1 ‘零件类型在做为参数时使用1和使用swDocPART效果是一样的,只是swDocPART意义更加明显swDocASSEMBLY=2 ‘装配体类型swDocDRAWING=3 ‘工程图类型EndEnum访问并修改特征:我们已经学习了如何选中一个对象,下面我们针对特征来讨论如何得到选中特征对象的属性并修改它。得到所选择特征的一些属性信息:‘+++++++++++++++++++++++++++++++++

'filename:getchoosed.swp

'date

:2005-03-22

'usedtogetthesimpleholeinfomationdep&dia

'+++++++++++++++++++++++++++++++++++OptionE*plicit

DimswAppAsSldWorks.SldWorks

DimModelAsModelDoc2

DimcurfeatureAsfeature

DimboolstatusAsBoolean

DimfeatdataAsSimpleHoleFeatureData2

'声明一个简单直孔特征数据对象

DimcomponentAsComponent2

‘声明一个组件对象

DimdepAsDouble ‘孔深

DimdiaAsDouble ‘孔径

DimSelMgrAsSelectionMgr ‘选择管理器

DimncountAsIntegerSubgetselected()SetswApp=Application.SldWorksSetModel=swApp.ActiveDocSetSelMgr=Model.SelectionManagerSetcurfeature=SelMgr.GetSelectedObject5(1)

'得到当前选中的第一个特征

Debug.printcurfeature.Name

Setfeatdata=curfeature.GetDefinition '得到特征的定义boolstatus=featdata.AccessSelections(Model,component)'可以对数据进展访问了ncount=featdata.GetFeatureScopeBodiesCount

‘此方法得到拉伸特征在多实体零件中所作用的实体数Debug.printncount

dep=featdata.Depth

‘访问属性depth和diameter

dia=featdata.DiameterDebug.printdia&"*"&dep‘Debug.print"errorarden"

'在solidworks中可以使用swAPP.sendmsgtouser2替代msgbo*

featdata.ReleaseSelectionAccess‘取消特征数据访问

Model.Save

Model.EditRebuild ‘重建模型

EndSub上面程序运行前,假设你选择了一个简单直孔特征。然后得到这个孔的一些参数:孔深、直径。最初做上面程序的时候,我想象中用Setcurfeature=SelMgr.GetSelectedObject5(1)

选中特征以后就可以直接curfeature.Depth了。在参考了API帮助后,我才了解到特征的数据需要先AccessSelections后才能访问。总结一下,要访问一个特征,需要经历这样的步骤:定义一个特征对象及特征数据对象:dim....as...选中这个特征:比方使用GetSelectedObject5还有SelectebyID等...得到特征的定义:GetDefinition进展访问:AccessSelections上面的程序没有if选择的容错机制,实际编码中,每个可能出现错误的地方都应该使用if来控制,如下面这句话boolstatus=featdata.AccessSelections(Model,component)。我们就需要通过boolstatus的值来判断上面这个语句运行的是否正确,这里的boolstatus很明显是一个布尔型变量:Ifnotboolstatusthen‘上面语句运行不成功,写错误报告或退出代码Endif已经可以访问特征的各参数了,现在我们来修改它:要修改前面的步骤不能少,当我们已经可以读取一些特征时,我们就可以给他设定一些值。当然有时需要调用特定的参数。solidworks是ole和com的,所以要习惯这样。在修改完特征后需要调用函数modifydefinition()来实现变化。我们给一个例子,这个例子比前面的都要全面,它有很好的容错引导机制,可以直接拿来成为一个稳定的宏程序。‘+++++++++++++++++++++++++++++++++

'filename:doubleBE.swp

'date

:2005-03-22

'Thise*ampledoublesthelengthofthebasee*trude.这个例子将拉伸凸台的长度增加一倍

'+++++++++++++++++++++++++++++++++++DimswAppAsSldWorks.SldWorksDimModelAsModelDoc2DimComponentAsComponent2DimCurFeatureAsfeatureDimisGoodAsBooleanDimFeatDataAsObject '先声明为object,后面自动匹配为E*trudeFeatureData对象DimDepthAsDoubleDimSelMgrAsSelectionMgrSubdoubleBE()

SetswApp=CreateObject("sldWorks.application")

SetModel=swApp.ActiveDoc

'确定model是零件或正配体,不是就退出。在这里swDocPART和swDocASSEMBLY如果不能通过编译则参考’上面的enum介绍,换为1和2

IfModel.GetType<>swDocPARTAndModel.GetType<>swDocASSEMBLYThen

Msg="OnlyAllowedonPartsorAssemblies"'Definemessage

Style=vbOKOnly'OKButtononly

Title="Error"'Definetitle

CallMsgBo*(Msg,Style,Title)'Displayerrormessage

E*itSub'E*itthisprogram

EndIf

'得到SelectionManager

SetSelMgr=Model.SelectionManager

'得到所选的第一个对象

SetCurFeature=SelMgr.GetSelectedObject3(1)

IfCurFeatureIsNothingThen

'什么都没有选中

swApp.SendMsgToUser2"PleaseselecttheBase-E*trude",swMbWarning,swMbOk

E*itSub

EndIf

'Checkthefeature'stypename

'Makesureitisane*trusion

IfNotCurFeature.GetTypeName=swTnE*trusionThen

’在这里使用swTnE*trusion我的环境没有通过,改成了E*trusion才ok,参考BodyFeatures_e的定义

swApp.SendMsgToUser2"请选择拉伸基体特征",swMbWarning,swMbOk

E*itSub

EndIf

'得到特征数据

SetFeatData=CurFeature.GetDefinition

'Gettheaccessselectionsforthefeaturedata

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

isGood=FeatData.AccessSelections(Model,Component)

'Informtheuserofanerror

IfNotisGoodThen

swApp.SendMsgToUser2"Unabletoobtainaccessselections",swMbWarning,swMbOk

E*itSub

EndIf

'确认用户选择的是基体拉伸特征

IfNotFeatData.IsBaseE*trudeThen

swApp.SendMsgToUser2"PleaseselecttheBase-E*trude",swMbWarning,swMbOk

FeatData.ReleaseSelectionAccess

E*itSub

EndIf

'得到深度并增加到2倍

Depth=FeatData.GetDepth(True)

FeatData.SetDepthTrue,Depth*2

'执行修改

isGood=CurFeature.ModifyDefinition(FeatData,Model,Component)

'改变步成功

IfNotisGoodThen

swApp.SendMsgToUser2"无法修改特征数据",swMbWarning,swMbOk

'取消对数据的访问

FeatData.ReleaseSelectionAccess

EndIfEndSubTIPs:如果出现特征出现"退回〞状态,只能在代码执行到最后调用

Model.Save

Model.Rebuild这两个函数来自动更新。上面的程序中使用了新的没有介绍的API,只作了简单注释性介绍,如果不理解读者可以到API帮助中查看它的细节。这里只看其中一个API,它可能会经常使用:如果我们定义了一个特征对象:dimcurfeatureassldworks.feature又通过SelectMgr得到了这个特征,然后可以使用来判断是那种:SelectCasecurfeature.GetTypeNameCase"Cut"

'一个拉伸切除特征dosth.Case"HoleWzd"

'一个异型孔特征dosth.CaseElseEndSelectendselect这是语法:Synta*(OLEAutomation)retval=Feature.GetTypeName()它会返回一个(BSTR)retvalFeaturetypeasdefinedinBodyFeatures_e其中BodyFeatures_e内容比拟多,在这里都列出来也没什么用,大家可以参考solidworksAPI帮助。草图的话题:Solidwork中对草图的控制,下面的例子很详细。特征下的草图在solidwork中其实是特征的子特征,我们可以对特征进展GetFirstSubFeature、及GetNe*tSubFeature得到。下面是插入新草图的例如:InsertSketch2插入一个新草图,CreateLine2画一条线。Thise*ampleshowshowtoopenasketch,sketchaline,andclosethesketch.'------------------------------------------'Preconditions:'

(1)Modeldocumentisopen.'

(2)Planarfaceorasketchisselected.'Postconditions:Asketchisopened,alineissketched,andthesketchisclosed.'------------------------------------------OptionE*plicitSubmain()

DimswApp

AsSldWorks.SldWorks

DimswModel

AsSldWorks.ModelDoc2

DimswSkSeg

AsSldWorks.SketchSegment

DimswSkLine

AsSldWorks.SketchLine

SetswApp=Application.SldWorks

SetswModel=swApp.ActiveDoc

'Asketchontheselectedplanarfaceortheselectedsketchisopened

swModel.InsertSketch2True

'Alineissketched

SetswSkSeg=swModel.CreateLine2(0#,0#,0#,0.1,0.1,0#)

SetswSkLine=swSkSeg‘注意此处的SketchLine和SketchSegment对象

'Sketchise*ited

swModel.InsertSketch2TrueEndSub下面是我从以前的工程中节选的一段代码,它访问特征中的草图数据:DimcurfeatureAsSldWorks.featureDimswsketchfeatAsSldWorks.featureDimswSketchAsSldWorks.Sketch ‘草图对象DimswsketchsegAsSldWorks.SketchSegment ‘草图段对象DimswsketcharcAsSldWorks.SketchArc ‘圆弧对象DimswsegarrAsVariantDimswsegAsVariantDimswcenterAsSldWorks.SketchPoint ‘草图点对象DimswendAsSldWorks.SketchPoint ‘草图点对象Setswsketchfeat=curfeature.GetFirstSubFeature ‘得到特征的子特征Ifswsketchfeat.GetTypeName="ProfileFeature"Then ‘如果是草图特征SetswSketch=swsketchfeat.GetSpecificFeature ‘得到草图特征swsegarr=swSketch.GetSketchSegments ‘得到此草图对象的草图段ForEachswsegInswsegarr Setswsketchseg=swsegIfswsketchseg.GetType=1Then'1说明为arc,之前没有定义enum Setswsketcharc=swsketchseg dia=Fi*(swsketcharc.GetRadius*1000*2+0.5)'得到直径ElseMsgBo*"不是圆的草图"E*itSubEndIfE*itForNe*tEndIf关于零件的讨论就到此为止,其中的细节太多,本手册只能做为一个编程的指南而不是整体的参考,更多的内容需要读者在实际工作中参考API帮助来完成。第6章装配体综述:装配体是由零件和子装配体组成的,其对象模型如下列图。相比零件来说,它增加了配合mate2和组件component2两个对象。配合是零部件之间的几何关系,组件为组成此装配体的零部件,本文只对其组件和配合分两个主题来讨论。组件的话题:插入零部件到装配体在往装配体中插入零部件时,我们使用addcomponent函数。如果需要选定零部件的配置,则需要使用addcomponent4。先学习下语法:addcomponent4:retval=AssemblyDoc.AddComponent4(compName,configName,*,y,z)Input: (BSTR)compName PathnameofaloadedpartorassemblytoaddasacomponentInput: (BSTR)configName NameoftheconfigurationfromwhichtoloadthecomponentInput: (double)* *coordinateofthecomponentcenterInput: (double)y YcoordinateofthecomponentcenterInput: (double)z ZcoordinateofthecomponentcenterOutput: (LPCOMPONENT2)retval PointertotheComponent2object需要注意的是:参数1为文件的全名〔包括路径〕;参数2为文件的配置名称;当函数执行成功购返回一个指向该零件的指针。于是我们可以如下写一个小程序,用来给装配体中插零件:‘++++++++++++++++++++++++++++++++‘filename:insertPart.swp‘writebyarden2005-4-4‘函数在当前工作目录CurrentWorkingDirectory插入一个名为"零件1.SLDPRT〞的零件‘前提条件为当前工作目录有名字为〞零件1.sldprt〞的零件‘它有配置名为"配置1〞‘+++++++++++++++++++++++++++++++++DimswAppAsSldWorks.SldWorksDimModelAsModelDoc2DimpthAsStringDimstrpathAsStringSubinsertPart()SetswApp=Application.SldWorksstrpath=swApp.GetCurrentWorkingDirectory‘当前工作路径SetModel=swApp.ActiveDocpth=strpath&"零件1.SLDPRT"‘得到文件的FULLPATH全名Model.AddComponent4pth,"配置1",0,0,0‘添加零部件EndSub然而,这个程序比不是想象中则好用。为什么呢??回头看addcomponent4的remark,上面这样写:Thespecifiedfilemustbeloadedinmemory.AfileisloadedintomemorywhenyouloadthefileinyourSolidWorkssession(SldWorks::OpenDoc6)oropenanassemblythatalreadycontainsthefile.就是说你想指定的插入的文件必须在调用函数之前已经在内存中加载了。不习惯,你就不能直接翻开多简单,没方法,我还没有找到好的方法,只能按人家的来:看看下面的函数Opendoc6,它翻开一个文档:Opendoc6:retval=SldWorks.OpenDoc6(filename,type,options,configuration,&Errors,&Warnings)Input: (BSTR)Filename Documentnameorfullpathifnotincurrentdirectory,includinge*tensionInput: (long)Type DocumenttypeasdefinedinswDocumentTypes_eInput: (long)Options ModeinwhichtoopenthedocumentasdefinedinswOpenDocOptions_eInput: (BSTR)Configuration Modelconfigurationinwhichtoopenthisdocument:Appliestopartsandassemblies,notdrawingsIfthisargumentisemptyorthespecifiedconfigurationisnotpresentinthemodel,themodelisopenedinthelast-usedconfiguration.Output: (long)Errors LoaderrorsasdefinedinswFileLoadError_eOutput: (long)Warnings Warningsore*trainformationgeneratedduringtheopenoperationasdefinedinswFileLoadWarning_eReturn: (LPDISPATCH)retval PointertoaDispatchobject,thenewlyloadedModelDoc2,orNULLiffailedtoopen这个函数参数1就是文档的全名,参数2是要插入的类型描述,其中0123分别表示:0 swDocNONE:不是sw文件1 swDocPART:零件2 swDocASSEMBLY:装配体3 swDocDRAWING:工程图如果想使用swDocNONE,需要定义:PublicEnumswDocumentTypes_e

swDocNONE=0

swDocPART=1

swDocASSEMBLY=2

swDocDRAWING=3EndEnum参数3是翻开文档的模式,一般我们就选择swOpenDocOptions_Silent

用0表示,当然还有只读、只看等选项参数4是翻开选项,一般置空后面是两个OutPut,用来显示错误翻开时的提示函数返回一个指向翻开文件的指针。按照上面的要求我们在向装配体中插入一个零部件时,需要这样步骤:1、得到装配体2、使用opendoc6翻开需要插入的零件3、使用addcomponent4插入零件到装配体我们上面的程序需要这样来修改一下,添加了一个翻开文档的函数:'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++'insertpart03/21/05byarden'插入零件1'前提条件:在装配体所在文件夹中有零件"零件1〞存在,并且零件1有配置"配置1〞'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DimswAppAsSldWorks.SldWorksDimModelAsModelDoc2DimYSBmodelAsModelDoc2DimpthAsStringDimstrpathAsStringDimnErrorsAsLongDimnWarningsAsLongSubinsertpart()SetswApp=Application.SldWorksstrpath=swApp.GetCurrentWorkingDirectorySetModel=swApp.ActiveDocpth=strpath&"零件1.SLDPRT"openYSB(pth)‘在添加零部件之前,先翻开它Model.AddComponent4pth,"配置1",0,0,0EndSub'这个函数翻开零件1Subopenpart(ByValpthAsString)DimpathAsStringDimnewswappAsSldWorks.SldWorksSetnewswapp=Application.SldWorkspath=pthSetYSBmodel=newswapp.OpenDoc6(path,1,swOpenDocOPtions_Silent,"",nErrors,nWarnings)YSBmodel.Visible=False‘我不想看到零件1EndSub配合的话题:在装配体中添加配合下面我们来在一个装配体中自动判断插入适宜的零件,并添加配合。在前面已经根本上说明了如何得到零部件的数据信息、如何插入零部件、如何得到已经选择的特征等。下面只介绍怎样进展配合。在做配合时,需要经常选择到零件的面、线等,这是一个问题,还有就是介绍一下addmate2函数的使用:一般进展配合我们按照下面的次序来进展:1-ModelDoc.ClearSelection2‘取消所有选择2-选择需要配合的实体〔entity〕3-使用AddMate2函数进展配合4-再次使用 ModelDoc.ClearSelection2‘取消所有选择主要的问题在于如何选择适宜的面:由于面的命名没有什么规律,很多时候是程序自动来命名的,这样,不方便使用selectbyID来选择,我也不想使用坐标值来选择一个面,那样做更加糟糕。在得到一个组件〔component〕或者一个特征〔feature〕时,我们有getfaces、getfirstface、getne*tface等方法,我们可以使用这些方法遍历一个组件或特征等的各个面,来到达选择面的目的,看下面程序:‘+++++++++++++++++++++++++++‘selectface‘+++++++++++++++++++++++++++PrivateFunctionselectface(dcomAsSldWorks.Component2,tpAsInteger)AsBooleanSetswdowelbody=dcom.GetBody()IfswdowelbodyIsNothingThen'错误处理MsgBo*"选择零件失败"selectface=FalseE*itFunctionEndIfSetswDCface=swdowelbody.GetFirstFace‘得到第一个面DoWhileNotswDCfaceIsNothing ‘遍历各个面SetswDsurface=swDCface.GetSurface‘得到外表对象IfswDsurface.IsCylinderThen ‘如果是圆柱面Iftp=0Then'meanscylinderSetswDEnt=swDCfaceswDEnt.Select4True,selDdataselectface=TrueE*itFunctionEndIfElse‘如果是其它,当然实际中我们可能需要使用select来定义好多分支Iftp=1Then'meansplaneSetswDEnt=swDCfaceswDEnt.Select4True,selDdataselectface=TrueE*itFunctionEndIfEndIfSetswDCface=swDCface.GetNe*tFaceLoopEndFunction此函数承受两个参数,第一个是一个component对象,第二个用来标识选择类型:0表示圆柱面,1表示平面。此函数运行完成后将选择指定组件的指定类型的一个面。需要注意的是我们需要在判断面类型时候需要转换到surface对象。而且选择需要定义一个entity对象,用来select4,到达选择的目的。可能这个过程有些复杂,大家按照这个顺序多测试几次,就明白了它的工作原理。上面的函数写的并不好,是从我的工程中截取的一段。下面介绍一下addmate2函数:Synta*(OLEAutomation)OLE语法:pMateObjOut=AssemblyDoc.AddMate2(mateTypeFromEnum,alignFromEnum,flip,distance,distAbsUpperLimit,distAbsLowerLimit,gearRatioNumerator,gearRatioDenominator,angle,angleAbsUpperLimit,angleAbsLowerLimit,errorStatus)参数:Input:(long)mateTypeFromEnumTypeofmateasdefinedinswMateType_e配合类型Input:(long)alignFromEnumTypeofalignmentasdefinedinswMateAlign_e对齐选项Input:(VARIANT_BOOL)flipTRUEtoflipthecomponent,FALSEotherwise是否翻转Input:(double)distanceDistancevaluetousewithdistanceorlimitmates距离Input:(double)distAbsUpperLimitAbsolutema*imumdistancevalue(see\l"Remarks#Remarks"Remarks)距离限制ma*Input:(double)distAbsLowerLimitAbsoluteminimumdistancevalue

(seeRemarks)距离限制minInput:(double)gearRatioNumeratorGearrationumeratorvalueforgearmates齿轮配合分子值Input:(double)gearR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论