版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-.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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年中国饼干市场需求动态及竞争趋势预测报告
- 2024-2030年中国饮料代糖市场消费规模及运营态势剖析研究报告
- 2024-2030年中国食用橄榄油市场需求规模与未来销售渠道趋势研究报告
- 2024-2030年中国食品级纤维素行业市场发展趋势与前景展望战略分析报告
- 2024-2030年中国食品工业辐射加工行业运行态势与应用前景预测报告
- 2024-2030年中国食品乳化剂市场运行状况监测与投资潜力建议研究报告
- 2024-2030年中国风机制造行业经营优势现状与投资价值评估研究报告
- 2024-2030年中国顺丁烯二酸酐市场供需现状及发展规模预测研究报告
- 2024-2030年中国非酒类行业市场发展趋势与前景展望战略分析报告
- 2024-2030年中国零售行业十四五发展分析及投资前景与战略规划研究报告
- 《乡土中国》中的核心概念总结
- 出租客运公司文化与团队建设
- 中职语文教案:高尔基(节选)教案
- 工业产品质量安全风险管控清单及日管控、周排查、月调度记录表
- 《跨文化交流》课件
- 边坡防护钢管脚手架搭设施工方案
- 釉上彩绘工艺课件
- Linux操作系统实用教程-统信UOS 课件 第2章 国产操作系统图形化界面使用
- 灵活运用课文插图 省赛获奖
- 光是怎样传播的学习任务单
- 《连加、连减》(说课课件)-二年级上册数学人教版
评论
0/150
提交评论