您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > SolidWorks根据装配体生成工程图的宏程序
在网上看到的:在WIN7SW2014下现在不能用,看看改了能用不?烦请懂的人指点下,并将文件上传到群里来:SolidWorks生成工程图纸程序下面代码是工程图助手中的“生成工程图”模块内容。它按照我们的图纸存储规范,把一个产品的每个装配体都生成一个solidworks的工程图文件。面对一个问题,我们在试图使用VBA来改善工作的时候,可以参考下面的思路来进行,当然,这也只是个人的一些经验之说,并不是最好的工作方式:首先我们需要了解实际工作情况,发现问题所在:工艺人员在试图提高solidworks工作效率的时候提到了使用SolidWorksTaskScheduler来自动出图纸的方法(具体方法就不讨论了)。大家经过一段时间的使用后发现,使用SolidWorksTaskScheduler有一定的局限性,需要问题在于,它将每个solidworks文件—包括零件、装配体—都生成了一个工程图文件。然而这样得到的结果便是一个零部件稍多的产品,将会自动生成很多的工程图文件,不便于管理。我们的习惯是,按照装配体来出图纸,将一个装配体中的零部件在一个工程图文件中表示。这样表达清楚而且便于管理。恩,这就是现实的问题所在。然后,我们要考虑可行性:思考了SolidWorksTaskScheduler的实现,发现使用VBA在技术方面可以实现此类功能,并且有一定的规律可以遵守而不需要太多的人为判断就可以达到要求。这里插一句,在使用SolidWorksTaskScheduler时我发现了一个选项:备份任务文件,而这个任务文件上所记录的正式一段使用VBA写的宏代码。接下来,需要现场调研确定需求目标:在了解了solidworks使用相应的规范和工艺员在实际工作中的要求后我们对问题目标有了一个比较明确的概念。我们要做的项目需要完成这样的工作:它针对一个产品中的每个装配体生成一个工作图文件,每本工程图文件中需要一张装配体的三视图和其每个子零件的三视图图纸。并将它们存储在和“图纸”文件夹(存放solidworks模型)同级的目录下的“工程图”文件夹里。做好了准备工作,即可开始写程序。将需求的内容转化成软件问题描述,并描述其大致方法:1、得到产品文件的每个装配体:我们可以通过文件夹中文件的遍历,按照后缀名“.sldasm”来得到一个目录下所有的装配体;也可以通过遍历一个产品总装配体的组件来得到每一个子装配体模型。实际的编码中我们选择了后者,因为它虽然给编写代码结构带来了复杂度,但是正确性和稳定性都要好过前者。装配体的组件是一个树型结构,使用递归式是比较灵活的方法,前面章节也已经介绍过。2、生成工程图并插入零件的模型三视图:SolidWorksTaskScheduler使用预定义的模型视图来完成自动生成的功能,但是,一旦需要在原有的图纸上插入新图纸时,就不能够继承图纸模版的预定义试图了。所以需要使用CreateDrawViewFromModelView2和CreateUnfoldedViewAt3来替代。一切准备完毕后就可以设计程序框架进行编码了:这里定义了三个过程,main、traverseasm、createdraw。它们的定义和完成的作用如下:Main():模块主函数没有参数和返回值,它得到当前打开装配体的路径、设置“工程图文件夹路径”、运行traverseasm过程。Traverseasm(filepathasstring):此过程接受一个装配体的存储路径字符串参数,完成装配体的递归遍历工作,得到每一个装配体,并让每一个装配体都作为参数运行createdraw过程。Createdraw(filepathasstring):此过程接受一个装配体的存储路径字符串参数,生成此装配体的工程图。'/************************************************************'drawcreator:根据装配体生成工程图'main:'getopenedasmmodelinfomation:'filepathname'drawpathname'makedirpathisdrawpathname'calltraverseasmwithargumentfilepathname''traverseasm:'foritselfcallcreatedrawwithargumentitself'traversetheasmmodelcomponent'foreachsubasmmodel:'calltraverseasm''createdraw:'createadrawdocwithgivenDrawTemplate'inserteachsubpartmodelcomponentasheet''************************************************************/OptionExplicit'定义部分:DimSwAppAsSldWorks.SldWorksDimDrawPathNameAsStringDimFileAsStringDimnErrorsAsLongDimnWarningsAsLongDimStatofanNoAsBooleanDimPosAsInteger'/******************'submaingoeshere:'*******************SubMain()OnErrorResumeNextDimActModelAsSldWorks.ModelDoc2DimYesOrNoAsVbMsgBoxResultSetSwApp=CreateObject(SldWorks.Application)SetActModel=SwApp.ActiveDocIfActModelIsNothingThenMsgBox请先打开装配体EndIf'得到装配体文件路径File=ActModel.GetPathName'得到工程图保存路径DrawPathName=Left(File,InStrRev(File,\)-1)DrawPathName=Left(DrawPathName,InStrRev(DrawPathName,\))DrawPathName=DrawPathName+工程图\'创建文件夹MkDir(DrawPathName)'调试信息:Debug.PrintDrawPathNameDebug.PrintFile'shouldisetallobjectnothing?SetActModel=NothingSetSwApp=NothingYesOrNo=MsgBox(需要自动在零件工程图中插入模型项目么?,vbOKCancel,提示)IfYesOrNo=vbOKThenStatofanNo=TrueElseStatofanNo=FalseEndIfSwApp.Visible=False'调用函数遍历装配体组件TraverseAsmFileSwApp.Visible=TrueEndSub'/************************'subtraverseasmgoeshere:''*************************SubTraverseAsm(FilePathAsString)'TraverseAsm遍历ASM文件DimSwModel2AsSldWorks.ModelDoc2DimSwConf2AsSldWorks.ConfigurationDimSwRootComp2AsSldWorks.Component2DimSwChildComp2AsSldWorks.Component2DimvChildComp2AsVariantDimFileType2AsStringDimnAsLongSetSwApp=CreateObject(SldWorks.Application)IfSwAppIsNothingThenMsgBox创建SW对象失败ExitSubEndIfSetSwModel2=SwApp.OpenDoc6(FilePath,2,0,,nErrors,nWarnings)'fileopengoodIfSwModel2IsNothingThenMsgBox加载装配体失败ExitSubEndIfSetSwConf2=SwModel2.GetActiveConfiguration'needtochangeSwModeltotraverseSetSwRootComp2=SwConf2.GetRootComponentvChildComp2=SwRootComp2.GetChildrenForn=0ToUBound(vChildComp2)SetSwChildComp2=vChildComp2(n)FileType2=UCase(Right(SwChildComp2.GetPathName,6))IfFileType2=SLDASMThenTraverseAsmSwChildComp2.GetPathNameEndIfNextDebug.PrintSwModel2.GetPathNameIfNotMid(SwModel2.GetTitle,1,2)=镜向ThenCreateDrawSwModel2.GetPathNameEndIfEndSub'/**************************************************'subcreatedrawgoeshere:'**************************************************/SubCreateDraw(FilePathAsString)DimSwModelAsSldWorks.ModelDoc2DimSwSaveAsSldWorks.ModelDoc2DimSwDrawAsSldWorks.DrawingDocDimSwChildCompAsSldWorks.Component2DimSwChildCmp2AsSldWorks.Component2DimSwConfAsSldWorks.ConfigurationDimSwRootCompAsSldWorks.Component2DimCurSheetAsSldWorks.SheetDimSwViewAsSldWorks.ViewDimvChildCompAsVariantDimSheetArrAsStringDimSpadStrAsStringDimAsmFileAsStringDimDrawFielAsStringDimDrawDirAsStringDimDrawTempAsStringDimDeStringAsStringDimtmpStringAsStringDimsTmpStrAsStringDimFileTypeAsStringDimSheetNameAsStringDimViewNameAsStringDimsFileNameAsStringDimFileAsStringDimiAsLongDimisOkAsBooleanDimwGoodAsIntegerAsmFile=FilePathDrawDir=DrawPathName'foreasytouseispecifiedatemplatefileDrawTemp=SwApp.GetExecutablePath&\lang\chinese-simplified\Tutorial\auto.DRWDOTSheetArr=ardenmakeastupidwaybutrunsokSetSwApp=CreateObject(SldWorks.Application)IfSwAppIsNothingThenMsgBox创建SW对象失败ExitSubEndIfSetSwModel=SwApp.OpenDoc6(AsmFile,2,0,,nErrors,nWarnings)IfSwModelIsNothingThenMsgBo
本文标题:SolidWorks根据装配体生成工程图的宏程序
链接地址:https://www.777doc.com/doc-4217287 .html