Imports Inventor Imports Inventor.SelectionFilterEnum Imports Inventor.DocumentTypeEnum Imports Inventor.DrawingViewTypeEnum Imports Inventor.PropertyTypeEnum Imports Inventor.BOMStructureEnum Imports Inventor.IOMechanismEnum Imports System.Windows.Forms Imports Inventor.PrintOrientationEnum Imports System.Text Imports System.Collections.ObjectModel Module InventorBasic Public Structure StockNumPartName Dim IsGet As Boolean Dim StockNum As String Dim PartName As String Dim PartNum As String End Structure Public ThisApplication As Inventor.Application 'Public ThisApprenticeApp As Inventor.ApprenticeServerComponent '学徒服务器 Public WithEvents ThisApplicationEvents As ApplicationEvents Public ClientID As String Public DWG As String = ".dwg" Public IAM As String = ".iam" Public IPT As String = ".ipt" Public IDW As String = ".idw" Public ContentCenterFiles As String '零件库文件夹 Public IsAutoSetPartName As Boolean 'true 为进行中,false则退出进程 Public Map_StochNum As String '映射图号 Public Map_PartName As String '映射文件名 Public Map_PartNum As String '映射存货编码 Public Map_Mir_StochNum As String '映射对称件图号 Public Map_Mir_PartName As String '映射对称件文件名 Public Map_DrawingScale As String '映射比例 Public Map_Mass As String '映射质量 Public Map_PrintDay As String '映射打印时间 Public IsOpenPrint As String '设置打印时间后是否进入打印预览 Public IsDayAndName As String '同时签字 Public EngineerName As String '工程师 Public BOMTiTle As String '导出BOM用的项目 Public Mass_Accuracy As String '质量精度 Public Area_Accuracy As String '面积精度 Public IsSetDrawingScale As String '打开工程图时是否写 比例 到ipro 是赋值为1 Public IsSetMass As String '打开工程图时是否写 质量 到ipro 是赋值为1 Public CheckUpdate As String '启动检查更新 Public TotalItem As Integer 'BOM序号 Public OPosition(9) As Point '点 Public TempPoint(9) As SketchPoint '临时绘制的点 Public IsShowUpdateMsg As Boolean '检查更新时是否显示是最新版本的msgbox '------------------------------------------------------------------------------- Public Sub SetStatusBarText(Optional ByVal StatusBarText As String = "就绪") ThisApplication.StatusBarText = StatusBarText End Sub 'inventor是否打开文件,未打开文件返回false Public Function IsInventorOpenDoc() As Boolean Try If ThisApplication.FileManager.Files.Count = 0 Then MsgBox("未打开文件", MsgBoxStyle.Critical) Return False Exit Function Else Return True End If Catch ex As Exception MsgBox(ex.Message) End Try End Function '更改零件/部件文件名 Public Function RenameAssPartDocumentName(ByVal oInventorDocument As Inventor.Document, ByVal OldComponentOccurrence As ComponentOccurrence, ByVal NewFileName As String) As Boolean Dim OldFullFileName As String '被替换的旧文件全名 Dim OldFileName As String '被替换的旧文件仅文件名 OldFullFileName = OldComponentOccurrence.ReferencedDocumentDescriptor.FullDocumentName OldFileName = GetFileNameInfo(OldFullFileName).ONlyName If IsFileExsts(OldFullFileName) = False Then MsgBox("文件: " & OldFullFileName & "不存在!", MsgBoxStyle.Critical, "修改文件名") Return True Exit Function End If 'Dim oOccDef As PartComponentDefinition 'oOccDef = OldOcc.Definition 'If Not oOccDef.IsContentMember = False Then '跳过零件库文件 ' MsgBox(OldFullFileName & "为零件库文件", MsgBoxStyle.Information) ' 'OldInventorDoc.Close() ' Return False ' Exit Function 'End If If InStr(OldFullFileName, ContentCenterFiles) > 0 Then '跳过零件库文件 MsgBox("无法修改资源中心文件: " & OldFullFileName, MsgBoxStyle.Information, "修改文件名") 'OldInventorDoc.Close() Return True Exit Function End If Select Case OldComponentOccurrence.DefinitionDocumentType Case kPartDocumentObject, kAssemblyDocumentObject '选择的是部件或零件 Dim NewFullFileName As String '新文件全名 '新图号 'frmain.Focus() '取消输入 If NewFileName = "" Then Return True Exit Select End If '新旧文件名一致 If OldFileName = NewFileName Then MsgBox("未重新命名 ", MsgBoxStyle.Information, "修改文件名") Return True Exit Select End If '替换旧文件全名为新文件全名 NewFullFileName = GetNewFileName(OldFullFileName, NewFileName) '检查新文件是否存在 If IsFileExsts(NewFullFileName) = True Then Select Case MsgBox("存在文件:" & NewFullFileName & vbCrLf & "是-直接替换" & vbCrLf & "否-重新生成替换" & vbCrLf & "取消-退出重新命名 ", MsgBoxStyle.Information + MsgBoxStyle.YesNoCancel) Case MsgBoxResult.Yes '直接用新文件替换 '全部替换为新文件 If MsgBox("是否替换全部零件?", MsgBoxStyle.YesNo + MsgBoxStyle.Question + MsgBoxStyle.SystemModal) = MsgBoxResult.Yes Then OldComponentOccurrence.Replace(NewFullFileName, True) Else OldComponentOccurrence.Replace(NewFullFileName, False) End If Return True Case MsgBoxResult.No '重新另存为新文件,再替换 Case MsgBoxResult.Cancel '取消退出 Return False End Select End If '打开旧文件,不显示 Dim OldInventorDocument As Inventor.Document OldInventorDocument = ThisApplication.Documents.Open(OldFullFileName, False) '另存为新文件 OldInventorDocument.SaveAs(NewFullFileName, True) '关闭旧图 OldInventorDocument.Close() '全部替换为新文件 If MsgBox("是否替换全部零件?", MsgBoxStyle.YesNo + MsgBoxStyle.Question + MsgBoxStyle.SystemModal + MsgBoxStyle.DefaultButton1) = MsgBoxResult.Yes Then OldComponentOccurrence.Replace(NewFullFileName, True) Else OldComponentOccurrence.Replace(NewFullFileName, False) End If ThisApplication.Documents.ItemByName(OldFullFileName).Close() '后台打开文件,修改ipro oInventorDocument = ThisApplication.Documents.Open(NewFullFileName, False) '打开文件,不显示 SetDocumentIpropertyFromFileName(oInventorDocument, True) '设置Iproperty,打开文件后需关闭 Dim IsSaveAsOld As MsgBoxResult IsSaveAsOld = MsgBox("是否更改原文件为备份文件,扩展名增加 .old ?", MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, "备份文件") '是否有对应的工程图文件,同时复制后修改文件名和模型链接 Dim OldIdwFullFileName As String OldIdwFullFileName = GetNewExtensionFileName(OldFullFileName, ".idw") '旧工程图 Dim TempFullFileName As String '更改旧模型文件的名字存档 If IsFileExsts(OldIdwFullFileName) = True Then Dim NewIdwFullFileName As String NewIdwFullFileName = GetNewExtensionFileName(NewFullFileName, ".idw") '新工程图 FileSystem.FileCopy(OldIdwFullFileName, NewIdwFullFileName) '复制为新工程图 'MsgBox("找到有对应的旧工程图,生成新的工程图,将打开,请链接到文件:" & vbCrLf & NewFullFileName & vbCrLf & "该文件名已复制,粘贴到对话框即可。", MsgBoxStyle.Information) 'Windows.Forms.Clipboard.SetText(NewFullFileName) 'ThisApplication.Documents.Open(NewIdwFullFileName, False) '打开新的工程图,使其手动链接零件或部件 'ThisApplication.Documents.ItemByName(NewIdwFullFileName).Save2() '保存链接并关闭工程图 'ThisApplication.Documents.ItemByName(NewIdwFullFileName).Close() oInventorDocument = ThisApplication.Documents.Open(NewIdwFullFileName, False) '打开文件,不显示 oInventorDocument.ReferencedDocumentDescriptors(1).ReferencedFileDescriptor.ReplaceReference(NewFullFileName) oInventorDocument.Save2() oInventorDocument.Close() If IsSaveAsOld = MsgBoxResult.Yes Then TempFullFileName = OldIdwFullFileName & ".old" '暂时更改旧工程图文件的名字存档 ReFileName(OldIdwFullFileName, TempFullFileName) 'ReFileName(TempFullFileName, OldFullFileName) '恢复旧零件或部件文件名 End If End If If IsSaveAsOld = MsgBoxResult.Yes Then TempFullFileName = OldFullFileName & ".old" ReFileName(OldFullFileName, TempFullFileName) End If Return True Case MsgBox("选择的文件不是零件或部件", MsgBoxStyle.Information) Return False End Select End Function '更改镜像零件文件名 Public Function RenameMirrorAssPartDocumentName(ByVal oInventorDocument As Inventor.Document, ByVal OldComponentOccurrence As ComponentOccurrence, ByVal NewFileName As String) As Boolean Dim OldFullFileName As String '被替换的旧文件全名 Dim OldFileName As String '被替换的旧文件仅文件名 OldFullFileName = OldComponentOccurrence.ReferencedDocumentDescriptor.FullDocumentName OldFileName = GetFileNameInfo(OldFullFileName).ONlyName If IsFileExsts(OldFullFileName) = False Then MsgBox(OldFullFileName & "不存在!", MsgBoxStyle.Critical) Return True Exit Function End If 'Dim oOccDef As PartComponentDefinition 'oOccDef = OldOcc.Definition 'If Not oOccDef.IsContentMember = False Then '跳过零件库文件 ' MsgBox(OldFullFileName & "为零件库文件", MsgBoxStyle.Information) ' 'OldInventorDoc.Close() ' Return False ' Exit Function 'End If If InStr(OldFullFileName, ContentCenterFiles) > 0 Then '跳过零件库文件 MsgBox(OldFullFileName & "为零件库文件", MsgBoxStyle.Information) 'OldInventorDoc.Close() Return True Exit Function End If 'Select Case OldOcc.DefinitionDocumentType ' Case kPartDocumentObject, kAssemblyDocumentObject '选择的是部件或零件 Dim NewFullFileName As String '新文件全名 'Dim NewFileName As String '新文件仅文件名 '新图号 'frmain.Focus() 'NewFileName = InputBox("重命名 " & OldFullFileName, "重命名", OldFileName) '输入新文件名 ''取消输入 'If NewFileName = "" Then ' Return True ' Exit Select 'End If '替换旧文件全名为新文件全名 NewFullFileName = GetNewFileName(OldFullFileName, NewFileName) '检查新文件是否存在 If IsFileExsts(NewFullFileName) = True Then Select Case MsgBox("存在文件:" & NewFullFileName & " ,是-直接替换 否-重新生成替换 取消-退出重新命名 ", MsgBoxStyle.Information + MsgBoxStyle.YesNoCancel) Case MsgBoxResult.Yes '直接用新文件替换 '全部替换为新文件 If MsgBox("是否替换全部零件?", MsgBoxStyle.YesNo + MsgBoxStyle.Question + MsgBoxStyle.SystemModal) = MsgBoxResult.Yes Then OldComponentOccurrence.Replace(NewFullFileName, True) Else OldComponentOccurrence.Replace(NewFullFileName, False) End If Return True Case MsgBoxResult.No '重新另存为新文件,再替换 Case MsgBoxResult.Cancel '取消退出 Return False End Select End If '打开旧文件,不显示 Dim OldInventorDocument As Inventor.Document OldInventorDocument = ThisApplication.Documents.Open(OldFullFileName, False) '基础文件 Dim ReferencedFullFileName As String Dim ReferencedFullFileNameTemp As String ReferencedFullFileName = OldInventorDocument.ReferencedDocuments(1).FullFileName ReferencedFullFileNameTemp = ReferencedFullFileName & ".old" '重命名基础文件 ReFileName(ReferencedFullFileName, ReferencedFullFileNameTemp) '另存为新文件 OldInventorDocument.SaveAs(NewFullFileName, True) '关闭旧图 OldInventorDocument.Close() '全部替换为新文件 If MsgBox("是否替换全部零件?", MsgBoxStyle.YesNo + MsgBoxStyle.Question + MsgBoxStyle.SystemModal) = MsgBoxResult.Yes Then MsgBox("选择 " & NewFullFileName & " 的基础文件!") OldComponentOccurrence.Replace(NewFullFileName, True) Else MsgBox("选择 " & NewFullFileName & " 的基础文件!") OldComponentOccurrence.Replace(NewFullFileName, False) End If ThisApplication.Documents.ItemByName(OldFullFileName).Close() '后台打开文件,修改ipro oInventorDocument = ThisApplication.Documents.Open(NewFullFileName, False) '打开文件,不显示 SetDocumentIpropertyFromFileName(oInventorDocument, True) '设置Iproperty,打开文件后需关闭 '还原早一个版本的文件() ReFileName(ReferencedFullFileNameTemp, ReferencedFullFileName) Return True ' Case MsgBox("选择的文件不是零件或部件", MsgBoxStyle.Information) 'Return False 'End Select End Function '根据文件名提取到iproperty ( 文件对象 ; 文件是否需打开,打开的文件用后要关闭) Public Function SetDocumentIpropertyFromFileName(ByVal oInventorDocument As Inventor.Document, ByVal IsNeedClose As Boolean) As Boolean Dim FullFileName As String '当前文件全名 Dim FileName As String FullFileName = oInventorDocument.FullFileName FileName = GetFileNameInfo(FullFileName).ONlyName If InStr(FullFileName, ContentCenterFiles) > 0 Then '跳过零件库文件 MsgBox("无法修改资源中心文件: " & FullFileName, MsgBoxStyle.Information, "修改iProperty") Return True Exit Function End If Dim StockNumPartName As StockNumPartName StockNumPartName = GetStockNumPartName(FullFileName) Dim oPropSets As PropertySets Dim oPropSet As PropertySet Dim propitem As [Property] oPropSets = oInventorDocument.PropertySets oPropSet = oPropSets.Item(3) For Each propitem In oPropSet '设置iproperty Select Case propitem.DisplayName Case Map_PartName If StockNumPartName.PartName <> "" Then propitem.Value = StockNumPartName.PartName End If Case Map_StochNum If StockNumPartName.StockNum <> "" Then propitem.Value = StockNumPartName.StockNum End If Case Map_PartNum If StockNumPartName.PartNum <> "" Then propitem.Value = StockNumPartName.PartNum End If Case "描述" ' propitem.Value = "" End Select Next 999: '是否为打开的文件,是的话就关闭 If IsNeedClose = True Then oInventorDocument.Close(True) End If Return True End Function '修改部件包含文件的iProperty ( 部件文件对象 ; 文件是否需打开,打开的文件用后要关闭) Public Function SetDocumentsInAssIpropertyFromFileName(ByVal oAssemblyDocument As AssemblyDocument, ByVal IsNeedClose As Boolean) As Boolean ' 获取所有引用文档 Dim FirstLevelOnly As Boolean Select Case MsgBox("修改模式:是-仅修改第一级零件 否-修改所有级别零件 ", MsgBoxStyle.Question + MsgBoxStyle.YesNoCancel, "修改模式") Case MsgBoxResult.Yes 'RefDocs = AsmDoc.ReferencedDocuments FirstLevelOnly = True Case MsgBoxResult.No 'RefDocs = AsmDoc.AllReferencedDocuments FirstLevelOnly = False Case Else Return True End Select '============================================================================================== '基于bom结构化数据,可跳过参考的文件 ' Set a reference to the BOM Dim oBOM As BOM oBOM = oAssemblyDocument.ComponentDefinition.BOM oBOM.StructuredViewEnabled = True 'Set a reference to the "Structured" BOMView Dim oBOMView As BOMView '获取结构化的bom页面 For Each oBOMView In oBOM.BOMViews If oBOMView.ViewType = BOMViewTypeEnum.kStructuredBOMViewType Then '遍历这个bom页面 QueryBOMRowToSetiPro(oBOMView.BOMRows, FirstLevelOnly) End If Next '============================================================================================== Return True End Function '遍历BOM结构,查询row文件修改ipro Public Sub QueryBOMRowToSetiPro(ByVal oBOMRows As BOMRowsEnumerator, ByVal FirstLevelOnly As Boolean) Dim i As Integer Dim iStepCount As Short iStepCount = oBOMRows.Count 'Create a new ProgressBar object. Dim oProgressBar As Inventor.ProgressBar oProgressBar = ThisApplication.CreateProgressBar(False, iStepCount, "当前文件: ") For i = 1 To oBOMRows.Count ' Get the current row. Dim oBOMRow As BOMRow oBOMRow = oBOMRows.Item(i) Dim oFullFileName As String oFullFileName = oBOMRow.ReferencedFileDescriptor.FullFileName '测试文件 Debug.Print(oFullFileName) ' Set the message for the progress bar oProgressBar.Message = oFullFileName If IsFileExsts(oFullFileName) = False Then '跳过不存在的文件 GoTo 999 End If If InStr(oFullFileName, ContentCenterFiles) > 0 Then '跳过零件库文件 GoTo 999 End If Dim oInventorDocument As Inventor.Document oInventorDocument = ThisApplication.Documents.Open(oFullFileName, False) '打开文件,不显示 SetDocumentIpropertyFromFileName(oInventorDocument, True) '设置Iproperty,打开文件后需关闭 '遍历下一级 If (Not oBOMRow.ChildRows Is Nothing) And FirstLevelOnly = False Then Call QueryBOMRowToSetiPro(oBOMRow.ChildRows, FirstLevelOnly) End If 999: oProgressBar.UpdateProgress() Next oProgressBar.Close() End Sub '自动生成零件图号(部件文件对象;进度条) Public Function AutoSetPartNumber(ByVal oAssemblyDocument As AssemblyDocument) As Boolean 'With ProgressBar ' .Minimum = 0 ' '.Maximum = AsmDoc.ReferencedDocuments.Count ' .Value = 0 'End With Dim FullFileName As String '当前部件全名 Dim FileName As String '当前部件名 Dim BasicNumber As String '当前部件图号 '部件全文件名 和 仅文件名 FullFileName = oAssemblyDocument.FullFileName FileName = GetFileNameInfo(FullFileName).ONlyName 'Dim i As Integer 'Dim s As String ''获取汉字的位置 'i = 1 'Do ' s = Mid(FileName, i, 1) ' i = i + 1 ' If s = "" Then ' Exit Do ' End If 'Loop Until (CheckCharType(s) = "Unicode字符") ''判断图号情况 'Select Case True '第一个字符为汉字 ' Case i = 2 ' BasicNumber = InputBox("部件 " & FullFileName & " 无图号,输入图号", "输入图号", "") ' If BasicNumber.ToString = "" Then ' Return False ' Exit Function ' End If ' Case s = "" '无汉字 ' BasicNumber = GetFileNameInfo(FullFileName).ONlyName ' Case Else '正常情况 ' BasicNumber = Left(FileName, i - 2) 'End Select Dim StockNumPartName As StockNumPartName '获取图号和零件名 StockNumPartName = GetStockNumPartName(FullFileName) '未获取图号,退出 If StockNumPartName.IsGet = False Then Return False End If '基本图号 BasicNumber = StockNumPartName.StockNum Dim PartNumberStep As Integer '零件图号变化步长 Dim AssNumberStep As Integer '部件图号变化步长 AssNumberStep = Val(InputBox("输入部件文件的编号变化,部件XXX-0000000 下第一个部件为XXX-0000100 则 输入 100 ")) If AssNumberStep = 0 Then Return False Exit Function End If PartNumberStep = Val(InputBox("输入零件文件的编号变化,部件XXX-0000000 下第一个零件为XXX-0000001 则 输入 1 ")) If PartNumberStep = 0 Then Return False Exit Function End If '重命名还是续命名 Dim PartNumberItem As Integer '第几个零件文件 Dim AssNumberItem As Integer '第几个部件文件 If MsgBox("是否续编部件文件名?", MsgBoxStyle.YesNo + MsgBoxStyle.Question) = MsgBoxResult.Yes Then 'Dim BasicOcc As ComponentOccurrence '选择续编的的部件或零件 'Dim BasicFullFileName As String '续编的文档全名 'Dim BasicFileName As String '续编的文件名 'BasicOcc = ThisApplication.CommandManager.Pick(kAssemblyOccurrenceFilter, "选择续编的部件文件") 'BasicFullFileName = BasicOcc.ReferencedDocumentDescriptor.FullDocumentName 'BasicFileName = GetStockNumPartName(BasicFullFileName).StockNum 'AssNumberItem = (Val(BasicFileName) - Val(BasicNumber)) / AssNumberStep AssNumberItem = Val(InputBox("输入续编部件文件的文件名,部件XXX-0000200 则 输入 200 ", "续编部件", "")) / AssNumberStep Else '重0开始命名,不续编 AssNumberItem = 0 End If If MsgBox("是否续编零件文件名?", MsgBoxStyle.YesNo + MsgBoxStyle.Question) = MsgBoxResult.Yes Then 'Dim BasicOcc As ComponentOccurrence '选择续编的的部件或零件 'Dim BasicFullFileName As String '续编的文档全名 'Dim BasicFileName As String '续编的文件名 'BasicOcc = ThisApplication.CommandManager.Pick(kAssemblyOccurrenceFilter, "选择续编的零件文件") 'BasicFullFileName = BasicOcc.ReferencedDocumentDescriptor.FullDocumentName 'BasicFileName = GetStockNumPartName(BasicFullFileName).StockNum 'Dim a As Double = GetNumbers(BasicFileName) 'Dim b As Double = GetNumbers(BasicNumber) 'PartNumberItem = (a - b) / PartNumberStep PartNumberItem = Val(InputBox("输入续编零件文件的文件名,零件XXX-0000105 则 输入 5 ", "续编零件", "")) / PartNumberStep Else '重0开始命名,不续编 PartNumberItem = 0 End If Dim OldComponentOccurrence As ComponentOccurrence '选择的部件或零件 Dim OldInventorDocument As Document '旧的文档 Dim OldFullFileName As String '旧的文档全名 Dim OldFileName As String '旧的文件名 Dim OldFileInfo As FileNameInfo Dim NewInventorDocument As Document Dim NewFullFileName As String '新的文档全名 Dim NewFileName As String '新的文档名 Dim NewStockNum As String = Nothing '新的图号 ' 获取所有引用文档 Dim oDocumentsEnumerator As DocumentsEnumerator oDocumentsEnumerator = oAssemblyDocument.ReferencedDocuments ' 遍历这些文档 Do OldComponentOccurrence = ThisApplication.CommandManager.Pick(kAssemblyOccurrenceFilter, "选择要编号的文件") If OldComponentOccurrence Is Nothing Then '取消选择 Exit Do End If OldFullFileName = OldComponentOccurrence.ReferencedDocumentDescriptor.FullDocumentName '旧文件全文件名 OldFileInfo = GetFileNameInfo(OldFullFileName) OldFileName = OldFileInfo.ONlyName '旧文件 仅文件名 If IsFileExsts(OldFullFileName) = False Then '跳过不存在的文件 MsgBox(OldFullFileName & "不存在", MsgBoxStyle.Critical) GoTo 999 End If If InStr(OldFullFileName, ContentCenterFiles) > 0 Then '跳过零件库文件 MsgBox(OldFullFileName & "为零件库文件", MsgBoxStyle.Information) 'OldInventorDoc.Close() GoTo 999 End If '如果旧文件目录下有一个文件名相同的已有零件号的文件,是否替换或者重新命名当前文件 For Each FoundFile As String In My.Computer.FileSystem.GetFiles(OldFileInfo.Folder, FileIO.SearchOption.SearchTopLevelOnly) ' OldFileInfo.ExtensionName) If InStr(GetFileNameInfo(FoundFile).SigleName, OldFileInfo.SigleName) > 1 Then '存在一个已命名图号的文件 Select Case MsgBox("存在一个已命名图号的文件:" & FoundFile & " ,是-直接替换 否-重新生成替换 ", MsgBoxStyle.Information + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton1, "自动生成零件图号") Case MsgBoxResult.Yes '替换文件 OldComponentOccurrence.Replace(FoundFile, True) GoTo 999 Case MsgBoxResult.No '重新命名 End Select Exit For End If Next If IsAutoSetPartName = False Then Exit Do End If If CheckCharType(Strings.Left(OldFileName, 1)) = "Unicode字符" Then '第一个为中文就编号 Select Case OldComponentOccurrence.ReferencedDocumentDescriptor.ReferencedDocumentType '零件和部件分别计数 Case kPartDocumentObject '零件 PartNumberItem = PartNumberItem + 1 '第几个文件 NewStockNum = Strings.Left(BasicNumber, (Strings.Len(BasicNumber)) - Len((PartNumberStep * PartNumberItem).ToString)) '获取不改变的前部分图号 NewStockNum = NewStockNum & (PartNumberStep * PartNumberItem).ToString '获取全图号 Case kAssemblyDocumentObject '部件 AssNumberItem = AssNumberItem + 1 NewStockNum = Strings.Left(BasicNumber, (Strings.Len(BasicNumber)) - Len((AssNumberStep * AssNumberItem).ToString)) NewStockNum = NewStockNum & (AssNumberStep * AssNumberItem).ToString Case Else End Select NewFileName = NewStockNum & OldFileName '获取全文件名 NewFullFileName = GetNewFileName(OldFullFileName, NewFileName) '替换旧文件全名为新文件全名 '后台打开旧文件,另存为新文件 OldInventorDocument = ThisApplication.Documents.Open(OldFullFileName, False) OldInventorDocument.SaveAs(NewFullFileName, True) '另存为新图号文件 OldInventorDocument.Close() '替换旧文件 OldComponentOccurrence.Replace(NewFullFileName, True) '后台打开新文件,修改ipro NewInventorDocument = ThisApplication.Documents.Open(NewFullFileName, False) '打开文件,不显示 SetDocumentIpropertyFromFileName(NewInventorDocument, False) '设置Iproperty,打开文件后需关闭 '是否有对应的工程图文件,同时复制后修改文件名和模型链接 Dim OldIdwFullFileName As String OldIdwFullFileName = GetNewExtensionFileName(OldFullFileName, ".idw") '旧工程图 If IsFileExsts(OldIdwFullFileName) = True Then Dim NewIdwFullFileName As String NewIdwFullFileName = GetNewExtensionFileName(NewFullFileName, ".idw") '新工程图 FileSystem.FileCopy(OldIdwFullFileName, NewIdwFullFileName) '复制为新工程图 Dim TempFullFileName As String '暂时更改旧文件名字 TempFullFileName = OldFullFileName & ".old" ReFileName(OldFullFileName, TempFullFileName) MsgBox("找到有对应的旧工程图,生成新的工程图,将打开,请链接到文件:" & vbCrLf & NewFullFileName & vbCrLf & "该文件名已复制,粘贴到对话框即可。", MsgBoxStyle.Information) Windows.Forms.Clipboard.SetText(NewFullFileName) ThisApplication.Documents.Open(NewIdwFullFileName, False) '打开新的工程图,使其手动链接零件或部件 ThisApplication.Documents.ItemByName(NewIdwFullFileName).Save2() '保存链接并关闭工程图 ThisApplication.Documents.ItemByName(NewIdwFullFileName).Close() 'ReFileName(TempFullFileName, OldFullFileName) '恢复旧零件或部件文件名 End If Else MsgBox(OldFullFileName & "可能已有图号", MsgBoxStyle.Information) End If 999: 'TSProgressBar.Value = TSProgressBar.Value + 1 Loop While True Return True End Function '另存为dwg Public Function SaveAsDwg(ByVal oDrawingDocument As Inventor.DrawingDocument) As String Dim IdwFullFileName As String '工程图全文件名 Dim DwgFullFileName As String 'cad 文件全文件名 IdwFullFileName = oDrawingDocument.FullFileName DwgFullFileName = Strings.Replace(IdwFullFileName, LCaseGetFileExtension(IdwFullFileName), ".dwg") If IsFileExsts(DwgFullFileName) Then Dim msg As MsgBoxResult = MsgBox("已存在文件: " & DwgFullFileName & " 是否覆盖(是)或另存为(否)?", MsgBoxStyle.Question + MsgBoxStyle.YesNoCancel, "另存为Dwg") Select Case msg Case MsgBoxResult.Yes Case MsgBoxResult.No Dim ofd As New SaveFileDialog With ofd .Title = "选择 dwg 文件" .Filter = "AutoCAD文件(*.dwg)|*.dwg" .InitialDirectory = GetParentFolder(oDrawingDocument.FullDocumentName) If .ShowDialog = DialogResult.OK Then DwgFullFileName = .FileName Else Return "取消" End If End With Case MsgBoxResult.Cancel Return "取消" End Select End If 'IdwDoc.SaveAs(DwgFullFileName, True) 'If IsFileExsts(DwgFullFileName) = False Then ' DwgFullFileName = Strings.Replace(DwgFullFileName, ".dwg", ".zip") 'End If ' 获取对应的Translator. Dim oTranslatorAddIn As TranslatorAddIn oTranslatorAddIn = ThisApplication.ApplicationAddIns.ItemById("{C24E3AC2-122E-11D5-8E91-0010B541CD80}") ' 获取当前零件或装配文档. Dim oTransientObjects As TransientObjects oTransientObjects = ThisApplication.TransientObjects ' 设置导出文件 Dim oTranslationContext As TranslationContext oTranslationContext = oTransientObjects.CreateTranslationContext oTranslationContext.Type = kFileBrowseIOMechanism ' 获取可操作的选项 Dim options As NameValueMap options = oTransientObjects.CreateNameValueMap If oTranslatorAddIn.HasSaveCopyAsOptions(oDrawingDocument, oTranslationContext, options) Then ' 设置导出样式. options.Value("Solid") = True ' 导出 solids. options.Value("Surface") = False ' 导出 surfaces. options.Value("Sketch") = False ' 导出 sketches. ' 设置导出DWG的版本. ' 23 = ACAD 2000 ' 25 = ACAD 2004 ' 27 = ACAD 2007 ' 29 = ACAD 2010 options.Value("DwgVersion") = 23 End If ' 设置导出文件名. Dim oDataMedium As DataMedium oDataMedium = oTransientObjects.CreateDataMedium oDataMedium.FileName = DwgFullFileName ' 调用SaveCopyAs Call oTranslatorAddIn.SaveCopyAs(oDrawingDocument, oTranslationContext, options, oDataMedium) Return DwgFullFileName End Function '另存为pdf Public Function SaveAsPdf(ByVal InventorDocument As Inventor.Document) As String Dim InventorFullFileName As String '工程图全文件名 Dim PdfFullFileName As String 'pdf 文件全文件名 InventorFullFileName = InventorDocument.FullFileName PdfFullFileName = Strings.Replace(InventorFullFileName, LCaseGetFileExtension(InventorFullFileName), ".pdf") If IsFileExsts(PdfFullFileName) Then Dim msg As MsgBoxResult = MsgBox("已存在文件: " & PdfFullFileName & " 是否覆盖(是)或另存为(否)?", MsgBoxStyle.Question + MsgBoxStyle.YesNoCancel, "另存为Dwg") Select Case msg Case MsgBoxResult.Yes Case MsgBoxResult.No Dim ofd As New SaveFileDialog With ofd .Title = "选择 Pdf 文件" .Filter = "Adobe PDF文件(*.pdf)|*.pdf" .InitialDirectory = GetParentFolder(InventorDocument.FullDocumentName) If .ShowDialog = DialogResult.OK Then PdfFullFileName = .FileName Else Return "取消" End If End With Case MsgBoxResult.Cancel Return "取消" End Select End If InventorDocument.SaveAs(PdfFullFileName, True) Return PdfFullFileName End Function '设置工程图自定义比例 Public Function SetDrawingScale(ByVal oDrawingDocument As DrawingDocument) As Boolean Dim oView As DrawingView For Each oView In oDrawingDocument.Sheets(1).DrawingViews If GetViewType(oView) = "主视图" Then 'View.Scale.ToString() Dim oPropertyName As String oPropertyName = Map_DrawingScale Dim StrScale As String StrScale = oView.ScaleString Dim pEachScale As [Property] Try '若该iProperty已经存在,则直接修改其值 pEachScale = oDrawingDocument.PropertySets.Item("User Defined Properties").Item(oPropertyName) pEachScale.Value = StrScale Catch ' 若该iProperty不存在,则添加一个 oDrawingDocument.PropertySets.Item("User Defined Properties").Add(StrScale, oPropertyName) End Try oDrawingDocument.Update() '刷新数据 Return True End If Next Return False End Function '获取零部件质量 Public Function GetMass(ByVal oInventorDocument As Inventor.Document) As Double Dim valMass As Double If oInventorDocument.DocumentType = kPartDocumentObject Then Dim IptDoc As PartDocument IptDoc = oInventorDocument valMass = IptDoc.ComponentDefinition.MassProperties.Mass ElseIf oInventorDocument.DocumentType = kAssemblyDocumentObject Then Dim AsmDoc As AssemblyDocument AsmDoc = oInventorDocument valMass = AsmDoc.ComponentDefinition.MassProperties.Mass Else valMass = 0 End If valMass = valMass + 0.00000001 Dim Val_Mass_Accuracy As Integer Val_Mass_Accuracy = Val(Mass_Accuracy) valMass = Math.Round(valMass, Val_Mass_Accuracy) Return valMass End Function '获取零部件面积 Public Function GetArea(ByVal oInventorDocument As Inventor.Document) As Double Dim valArea As Double If oInventorDocument.DocumentType = kPartDocumentObject Then Dim IptDoc As PartDocument IptDoc = oInventorDocument valArea = IptDoc.ComponentDefinition.MassProperties.Area / 10 ^ 4 ElseIf oInventorDocument.DocumentType = kAssemblyDocumentObject Then Dim AsmDoc As AssemblyDocument AsmDoc = oInventorDocument valArea = AsmDoc.ComponentDefinition.MassProperties.Area / 10 ^ 4 Else valArea = 0 End If valArea = valArea + 0.00000001 Dim Val_Area_Accuracy As Integer Val_Area_Accuracy = Val(Area_Accuracy) valArea = Math.Round(valArea, Val_Area_Accuracy) Return valArea End Function '设置工程图自定义质量 Public Function SetMass(ByVal oDrawingDocument As DrawingDocument) As Boolean Dim oPropertyName As String oPropertyName = "质量" Dim InventorDoc As Inventor.Document Dim valMass As Double = 0 Dim TempdoubleMass As Double = 0 For Each InventorDoc In oDrawingDocument.ReferencedDocuments TempdoubleMass = GetMass(InventorDoc) If TempdoubleMass > valMass Then valMass = TempdoubleMass End If Next Dim strMass As String strMass = valMass.ToString Dim pEachScale As [Property] Try '若该iProperty已经存在,则直接修改其值 pEachScale = oDrawingDocument.PropertySets.Item("User Defined Properties").Item(oPropertyName) pEachScale.Value = strMass Catch ' 若该iProperty不存在,则添加一个 oDrawingDocument.PropertySets.Item("User Defined Properties").Add(strMass, oPropertyName) End Try oDrawingDocument.Update() '刷新数据 Return True End Function '获取视图类型 Public Function GetViewType(ByVal oDrawingView As DrawingView) As String '遍历每个视图 Select Case (oDrawingView.ViewType) Case kStandardDrawingViewType Return ("主视图") Case kAssociativeDraftDrawingViewType Return ("关联草图视图") Case kAuxiliaryDrawingViewType Return ("辅助视图") Case kCustomDrawingViewType Return ("自定义视图") Case kDefaultDrawingViewType Return ("缺省视图") Case kDetailDrawingViewType Return ("详细视图") Case kDraftDrawingViewType Return ("草图视图") Case kOLEAttachmentDrawingViewType Return ("OLE附着视图") Case kOverlayDrawingViewType Return ("覆盖视图") Case kProjectedDrawingViewType Return ("投影视图") Case kSectionDrawingViewType Return ("局部视图") End Select Return "无法识别" End Function '设置工程图自定义属性:对称件IPro Public Function SetDrawingMirPartIPro(ByVal oDrawingDocument As DrawingDocument) As Boolean Dim oSheet As Sheet oSheet = oDrawingDocument.ActiveSheet Dim oView As DrawingView oView = oSheet.DrawingViews.Item(1) Dim oRef As DocumentDescriptor oRef = oView.ReferencedDocumentDescriptor '获取本零件文件夹路径 Dim MirFile_FullFileName As String Dim ofd As New OpenFileDialog With ofd .Multiselect = False .Title = "选择 ipt iam 文件" .Filter = "Inventor 文件(*.ipt;*.iam)|*.ipt;*.iam|Inventor 零件(*.ipt)|*.ipt|Inventor 部件(*.iam)|*.iam" .InitialDirectory = GetParentFolder(oRef.FullDocumentName) If .ShowDialog = DialogResult.OK Then MirFile_FullFileName = .FileName Else Return True Exit Function End If End With '获取镜像零件ipro Dim StockNumPartName As StockNumPartName StockNumPartName = GetStockNumPartName(MirFile_FullFileName) '设置ipro Dim pEachScale As [Property] Try '若该iProperty已经存在,则直接修改其值 pEachScale = oDrawingDocument.PropertySets.Item("User Defined Properties").Item(Map_Mir_StochNum) pEachScale.Value = StockNumPartName.StockNum pEachScale = oDrawingDocument.PropertySets.Item("User Defined Properties").Item(Map_Mir_PartName) pEachScale.Value = StockNumPartName.PartName Catch ' 若该iProperty不存在,则添加一个 oDrawingDocument.PropertySets.Item("User Defined Properties").Add(StockNumPartName.StockNum, Map_Mir_StochNum) oDrawingDocument.PropertySets.Item("User Defined Properties").Add(StockNumPartName.PartName, Map_Mir_PartName) End Try oDrawingDocument.Update() '刷新数据 Return True End Function '设置打印时间 'Public Function SetPrintTime(ByVal IdwDoc As DrawingDocument, ByVal AddTime As Short) As Boolean ' Dim pEachScale As [Property] ' Dim Print_Day As String ' Print_Day = " " ' Select Case AddTime ' Case 0 '清除数据改为空白 ' Case 1 '当前日写数据 ' Print_Day = Today.Year & "." & Today.Month & "." & Today.Day ' Case 2 '自定义日期写数据 ' Print_Day = Today.Year & "." & Today.Month & "." & Today.Day ' Print_Day = InputBox("输入日期", "日期", Print_Day) ' End Select ' Try ' '若该iProperty已经存在,则直接修改其值 ' pEachScale = IdwDoc.PropertySets.Item("User Defined Properties").Item(Map_PrintDay) ' pEachScale.Value = Print_Day ' Catch ' ' 若该iProperty不存在,则添加一个 ' IdwDoc.PropertySets.Item("User Defined Properties").Add(Print_Day, Map_PrintDay) ' End Try ' IdwDoc.Update() '刷新数据 ' Return True 'End Function '设置签字 Public Function SetSign(ByVal oDrawingDocument As DrawingDocument, ByVal EngineerName As String, ByVal Print_Day As String, ByVal IsOPenPrintDialog As Boolean) As Boolean Dim oPropSets As PropertySets Dim oPropSet As PropertySet Dim propitem As [Property] oPropSets = oDrawingDocument.PropertySets oPropSet = oPropSets.Item(3) For Each propitem In oPropSet '设置iproperty Select Case propitem.DisplayName Case "工程师" propitem.Value = EngineerName End Select Next Dim pEachScale As [Property] Try '若该iProperty已经存在,则直接修改其值 pEachScale = oDrawingDocument.PropertySets.Item("User Defined Properties").Item(Map_PrintDay) pEachScale.Value = Print_Day Catch ' 若该iProperty不存在,则添加一个 oDrawingDocument.PropertySets.Item("User Defined Properties").Add(Print_Day, Map_PrintDay) End Try oDrawingDocument.Update() '刷新数据 '打开打印窗口() If IsOpenPrint = 1 And IsOPenPrintDialog = True Then Dim oCommmandbars As CommandControl For Each oCommmandbars In ThisApplication.UserInterfaceManager.FileBrowserControls If oCommmandbars.DisplayName = "打印" Then Dim oCommandbarPrint As CommandControl For Each oCommandbarPrint In oCommmandbars.ChildControls If oCommandbarPrint.DisplayName = "打印" Then oCommandbarPrint.ControlDefinition.Execute2(True) End If Next Exit For End If Next End If Return True End Function '获取单个描述 Public Function GetPropitem(ByVal oInventorDocument As Inventor.Document, ByVal propitemName As String) As String Dim oPropSets As PropertySets Dim oPropSet As PropertySet Dim propitem As [Property] oPropSets = oInventorDocument.PropertySets oPropSet = oPropSets.Item(3) '获取iproperty Dim StockNumPartName As StockNumPartName = Nothing For Each propitem In oPropSet Select Case propitem.DisplayName Case propitemName Return propitem.Value End Select Next oInventorDocument.Update() '刷新数据 Return True End Function '设置单个propitem Public Function SetPropitem(ByVal oInventorDocument As Inventor.Document, ByVal propitemName As String, ByVal propitemValue As String) As Boolean Dim oPropSets As PropertySets Dim oPropSet As PropertySet Dim propitem As [Property] oPropSets = oInventorDocument.PropertySets oPropSet = oPropSets.Item(3) '获取iproperty Dim StockNumPartName As StockNumPartName = Nothing For Each propitem In oPropSet Select Case propitem.DisplayName Case propitemName propitem.Value = propitemValue End Select Next oInventorDocument.Update() '刷新数据 Return True End Function '获取 StockNumPartName Public Function GetPropitems(ByVal oInventorDocument As Inventor.Document) As StockNumPartName Dim oPropSets As PropertySets Dim oPropSet As PropertySet Dim propitem As [Property] oPropSets = oInventorDocument.PropertySets oPropSet = oPropSets.Item(3) Dim oStockNumPartName As StockNumPartName = Nothing For Each propitem In oPropSet Select Case propitem.DisplayName Case Map_PartName oStockNumPartName.PartName = propitem.Value Case Map_StochNum oStockNumPartName.StockNum = propitem.Value Case Map_PartNum oStockNumPartName.PartNum = propitem.Value End Select Next oInventorDocument.Update() '刷新数据 Return oStockNumPartName End Function '设置 StockNumPartName Public Function SetPropitems(ByVal oInventorDocument As Inventor.Document, ByVal oStockNumPartName As StockNumPartName) As Boolean Dim oPropSets As PropertySets Dim oPropSet As PropertySet Dim propitem As [Property] oPropSets = oInventorDocument.PropertySets oPropSet = oPropSets.Item(3) For Each propitem In oPropSet Select Case propitem.DisplayName Case Map_PartName propitem.Value = oStockNumPartName.PartName Case Map_StochNum propitem.Value = oStockNumPartName.StockNum Case Map_PartNum propitem.Value = oStockNumPartName.PartNum End Select Next oInventorDocument.Update() '刷新数据 Return True End Function '提取iproperty更改文件名 Public Function GetIpropertyToRename(ByVal InventorDoc As Inventor.Document, ByVal OldOcc As ComponentOccurrence) As Boolean Dim OldFullFileName As String '被替换的旧文件全名 Dim OldFileName As String '被替换的旧文件仅文件名 OldFullFileName = OldOcc.ReferencedDocumentDescriptor.FullDocumentName OldFileName = GetFileNameInfo(OldFullFileName).ONlyName If IsFileExsts(OldFullFileName) = False Then MsgBox("文件: " & OldFullFileName & "不存在!", MsgBoxStyle.Critical, "修改文件名") Return True Exit Function End If If InStr(OldFullFileName, ContentCenterFiles) > 0 Then '跳过零件库文件 MsgBox("无法修改资源中心文件: " & OldFullFileName, MsgBoxStyle.Information, "修改文件名") 'OldInventorDoc.Close() Return True Exit Function End If Select Case OldOcc.DefinitionDocumentType Case kPartDocumentObject, kAssemblyDocumentObject '选择的是部件或零件 Dim NewFullFileName As String '新文件全名 Dim NewFileName As String '新文件仅文件名 '新图号 'frmain.Focus() '打开旧文件,不显示 Dim OldInventorDoc As Document OldInventorDoc = ThisApplication.Documents.Open(OldFullFileName, False) Dim oPropSets As PropertySets Dim oPropSet As PropertySet Dim propitem As [Property] oPropSets = OldInventorDoc.PropertySets oPropSet = oPropSets.Item(3) '获取iproperty Dim StockNumPartName As StockNumPartName = Nothing For Each propitem In oPropSet Select Case propitem.DisplayName Case Map_PartName StockNumPartName.PartName = propitem.Value Case Map_StochNum StockNumPartName.StockNum = propitem.Value Case "描述" ' propitem.Value = "" End Select Next '新文件名 NewFileName = StockNumPartName.StockNum & StockNumPartName.PartName '替换旧文件全名为新文件全名 NewFullFileName = GetNewFileName(OldFullFileName, NewFileName) If NewFullFileName = OldFullFileName Then MsgBox("iProperty与文件名匹配,无需重命名文件!", MsgBoxStyle.Information) '关闭旧图,不保存 OldInventorDoc.Close(True) Return True End If '检查新文件是否存在 If IsFileExsts(NewFullFileName) = True Then Select Case MsgBox("存在文件:" & NewFullFileName & " ,是-直接替换 否-重新生成替换 取消-退出重新命名 ", MsgBoxStyle.Information + MsgBoxStyle.YesNoCancel) Case MsgBoxResult.Yes '直接用新文件替换 '全部替换为新文件 'If MsgBox("是否替换全部零件?", MsgBoxStyle.YesNo + MsgBoxStyle.Question + MsgBoxStyle.SystemModal) = MsgBoxResult.Yes Then OldOcc.Replace(NewFullFileName, True) 'Else 'OldOcc.Replace(NewFullFileName, False) 'End If OldInventorDoc.Close(True) Return True Case MsgBoxResult.No '重新另存为新文件,再替换 Case MsgBoxResult.Cancel '取消退出 '关闭旧图 OldInventorDoc.Close(True) Return True End Select End If '另存为新文件 OldInventorDoc.SaveAs(NewFullFileName, True) '全部替换为新文件 OldOcc.Replace(NewFullFileName, True) '后台打开新文件,修改ipro Dim NewInventorDoc As Inventor.Document NewInventorDoc = ThisApplication.Documents.Open(NewFullFileName, False) '打开文件,不显示 '设置新文件的Iproperty,打开文件后不关闭 SetDocumentIpropertyFromFileName(NewInventorDoc, False) '检查是否有对应的工程图文件,同时复制后修改文件名和模型链接 Dim OldIdwFullFileName As String OldIdwFullFileName = GetNewExtensionFileName(OldFullFileName, ".idw") '旧工程图 If IsFileExsts(OldIdwFullFileName) = True Then Dim NewIdwFullFileName As String '新工程图 NewIdwFullFileName = GetNewExtensionFileName(NewFullFileName, ".idw") '复制为新工程图 FileSystem.FileCopy(OldIdwFullFileName, NewIdwFullFileName) Dim NewIdwDoc As Inventor.DrawingDocument '打开新工程图文件,不显示 NewIdwDoc = ThisApplication.Documents.Open(NewIdwFullFileName, False) '在新工程图中替换新的零件部件引用 NewIdwDoc.ReferencedDocumentDescriptors(1).ReferencedFileDescriptor.ReplaceReference(NewFullFileName) '保存关闭新工程图 NewIdwDoc.Save2() NewIdwDoc.Close() '关闭旧的零件部件 OldInventorDoc.Close(True) NewInventorDoc.Close() End If Return True Case MsgBox("选择的文件不是零件或部件", MsgBoxStyle.Information) Return False End Select End Function '设置序号 Public Function SetSerialNumber(ByVal oDrawingDocument As DrawingDocument) As Boolean Dim oActiveSheet As Sheet oActiveSheet = oDrawingDocument.ActiveSheet If oActiveSheet.PartsLists.Count = 0 Then MsgBox("该工程图无明细表", MsgBoxStyle.Critical) Return False Exit Function End If Dim FirstBalloonNumber As Short Dim BalloonNumber As Short FirstBalloonNumber = InputBox("输入第一个序号:", "重建序号", "1") BalloonNumber = FirstBalloonNumber ' '设置序号为0 Dim partslistrow As Inventor.PartsListRow For Each partslistrow In oActiveSheet.PartsLists.Item(1).PartsListRows If partslistrow.Item(1).Value >= FirstBalloonNumber Then partslistrow.Item(1).Value = 0 End If Next '获取当前balloon的textstyle Dim OldBalloonTextStyl As String = oDrawingDocument.StylesManager.ActiveStandardStyle.ActiveObjectDefaults.BalloonStyle.TextStyle.Name '获取当前balloonstyle Dim oActiveBalloonStyle As BalloonStyle = oDrawingDocument.StylesManager.ActiveStandardStyle.ActiveObjectDefaults.BalloonStyle '新建 ZeroBalloonText Try If oDrawingDocument.StylesManager.TextStyles.Item("ZeroBalloonText") Is Nothing Then End If Catch ex As Exception Dim oZeroBalloonText As TextStyle oZeroBalloonText = oDrawingDocument.StylesManager.TextStyles.Item(OldBalloonTextStyl).Copy("ZeroBalloonText") Dim oZeroBalloonTextColor As Color = ThisApplication.TransientObjects.CreateColor(255, 0, 128) oZeroBalloonText.Color = oZeroBalloonTextColor End Try '设置当前balloon style 为新的 zeroballoonstyle oActiveBalloonStyle.TextStyle = oDrawingDocument.StylesManager.TextStyles.Item("ZeroBalloonText") ' '' '' ' '' '' '点击每个序号组 ' '' '' Dim oBalloon As Balloon ' '' '' For i = 1 To oActiveSheet.PartsLists.Item(1).PartsListRows.Count ' '' '' oBalloon = ThisApplication.CommandManager.Pick(kDrawingBalloonFilter, "选择引出序号") ' '' '' '遍历序号组中的序号,不为0就设置序号,并加1,设置下一个,有序号则跳过 ' '' '' For Each oBalloonValueSet As BalloonValueSet In oBalloon.BalloonValueSets ' '' '' If oBalloonValueSet.Value = 0 Then ' '' '' oBalloonValueSet.Value = i ' '' '' i = i + 1 ' '' '' End If ' '' '' Next ' '' '' '多加的1要减去 ' '' '' i = i - 1 ' '' '' Next '点击每个序号组 Try Dim oBalloon As Balloon Do oBalloon = ThisApplication.CommandManager.Pick(kDrawingBalloonFilter, "选择引出序号") For Each oBalloonValueSet As BalloonValueSet In oBalloon.BalloonValueSets 'If (oBalloonValueSet.Value >= FirstBalloonNumber) Then If oBalloonValueSet.Value = 0 Then oBalloonValueSet.Value = BalloonNumber BalloonNumber = BalloonNumber + 1 End If Next Loop While True Catch ex As Exception 'esc 退出后,还原balloon style oActiveBalloonStyle.TextStyle = oDrawingDocument.StylesManager.TextStyles.Item(OldBalloonTextStyl) Return True End Try End Function '检查序号完整性 Public Function CheckSerialNumber(ByVal oDrawingDocument As DrawingDocument) As Boolean Dim oActiveSheet As Sheet oActiveSheet = oDrawingDocument.ActiveSheet If oActiveSheet.Balloons.Count = 0 Then MsgBox("该工程图无序号,请添加 序号", MsgBoxStyle.Critical) Return False Exit Function End If If oActiveSheet.PartsLists.Count = 0 Then MsgBox("该工程图无明细表,请插入一个 明细表 ", MsgBoxStyle.Critical) Return False Exit Function End If Dim oPartsListRows As PartsListRows = oActiveSheet.PartsLists.Item(1).PartsListRows Dim strList As String = "" For Each oPartsListRow As PartsListRow In oPartsListRows If oPartsListRow.Ballooned = False Then strList = strList & oPartsListRow.Item(1).Value & " , " End If Next If Strings.Len(strList) > 1 Then MsgBox("明细表:" & strList & " 无序号", MsgBoxStyle.Information, "检查序号完整性") Return False Else Return True End If End Function Public Function InsertSerialNumber(ByVal oDrawingDocument As DrawingDocument) As Boolean Dim oActiveSheet As Sheet oActiveSheet = oDrawingDocument.ActiveSheet If oActiveSheet.PartsLists.Count = 0 Then MsgBox("该工程图无明细表", MsgBoxStyle.Critical) Return False Exit Function End If Dim FirstBalloonNumber As Short FirstBalloonNumber = InputBox("输入要插入的序号,并点击该序号的标注标识", "插入序号") If FirstBalloonNumber = "" Then Return False End If '点击被插入的序号标识 Dim oBalloon As Balloon oBalloon = ThisApplication.CommandManager.Pick(kDrawingBalloonFilter, "选择被插入的引出序号标识") ' 设置序号+1 For Each oPartsListRow As Inventor.PartsListRow In oActiveSheet.PartsLists.Item(1).PartsListRows If oPartsListRow.Item(1).Value >= FirstBalloonNumber Then oPartsListRow.Item(1).Value = oPartsListRow.Item(1).Value + 1 End If Next '设置插入序号对应的标识 For Each oBalloonValueSet As BalloonValueSet In oBalloon.BalloonValueSets If oBalloonValueSet.Value = 0 Then oBalloonValueSet.Value = FirstBalloonNumber Else MsgBox("该标识数值不为0,请重新选择。", MsgBoxStyle.Information) End If Next Return True End Function '设置当前部件下级为虚拟件 Public Function SetBOMStructuret(ByVal oAssemblyDocument As AssemblyDocument) As Boolean '设置结构类型 Dim BOMStructureType As BOMStructureEnum Dim intBOMStructureType As String intBOMStructureType = InputBox("输入要设置的类型:" & vbCrLf & "1——普通件" & vbCrLf & vbCrLf & "2——虚拟件", "BOM结构类型", 2) Select Case intBOMStructureType Case "" Return True Case "1" '普通件 BOMStructureType = kNormalBOMStructure Case "2" '虚拟件 BOMStructureType = kPhantomBOMStructure End Select ' Set a reference to the BOM Dim oBOM As BOM oBOM = oAssemblyDocument.ComponentDefinition.BOM ' Set the structured view to 'all levels' oBOM.StructuredViewFirstLevelOnly = False ' Make sure that the structured view is enabled. oBOM.StructuredViewEnabled = True ' Set a reference to the "Structured" BOMView '获取结构化的bom页面 For Each oBOMView As BOMView In oBOM.BOMViews If oBOMView.ViewType = BOMViewTypeEnum.kModelDataBOMViewType Then '遍历这个bom页面 SetPhantomBOMStructuretSub(oBOMView.BOMRows, BOMStructureType) End If Next Return True End Function '设置当前部件下级为虚拟件,遍历子程序 Public Sub SetPhantomBOMStructuretSub(ByVal oBOMRows As BOMRowsEnumerator, ByVal BOMStructureType As BOMStructureEnum) Dim i As Long For i = 1 To oBOMRows.Count Dim oRow As BOMRow oRow = oBOMRows.Item(i) Dim oCompDef As ComponentDefinition oCompDef = oRow.ComponentDefinitions.Item(1) Debug.Print(oCompDef.Document.FullFileName) ' 遍历下一级 If Not oRow.ChildRows Is Nothing Then Call SetPhantomBOMStructuretSub(oRow.ChildRows, BOMStructureType) End If '跳过参考件 If oRow.BOMStructure <> kInseparableBOMStructure Then oRow.BOMStructure = BOMStructureType End If Next End Sub '在尺寸前添加φ Public Function ADDFai(ByVal oInventorDocument As Inventor.Document) As Boolean Dim oLinearGeneralDimension As LinearGeneralDimension '选择的部件或零件 Dim strDimension As String Dim strFai As String ' 是否已经选择了尺寸 If oInventorDocument.SelectSet.Count <> 0 Then For Each oSelect As Object In oInventorDocument.SelectSet If oSelect.Type = ObjectTypeEnum.kLinearGeneralDimensionObject Then '添加Φ,内部代号n strFai = "n" strDimension = strFai & "" oSelect.Text.FormattedText = strDimension End If Next Else oLinearGeneralDimension = ThisApplication.CommandManager.Pick(kDrawingDefaultFilter, "选择要添加Φ的尺寸") If oLinearGeneralDimension Is Nothing Then '取消选择 Return True Exit Function End If strFai = "n" strDimension = strFai & "" oLinearGeneralDimension.Text.FormattedText = strDimension End If Return True End Function '检查模型是否有对应的工程图 Public Function CheckIsInvHaveIdw(ByVal oAssemblyDocument As AssemblyDocument, ByVal StrInName As String) As Boolean ' Set a reference to the BOM Dim oBOM As BOM oBOM = oAssemblyDocument.ComponentDefinition.BOM ' Set the structured view to 'all levels' oBOM.StructuredViewFirstLevelOnly = False ' Make sure that the structured view is enabled. oBOM.StructuredViewEnabled = True ' Set a reference to the "Structured" BOMView '获取结构化的bom页面 For Each oBOMView As BOMView In oBOM.BOMViews If oBOMView.ViewType = BOMViewTypeEnum.kStructuredBOMViewType Then '遍历这个bom页面 CheckIsInvHaveIdwSub(oBOMView.BOMRows, StrInName) End If Next Return True End Function '检查模型是否有对应的工程图 Public Sub CheckIsInvHaveIdwSub(ByVal oBOMRows As BOMRowsEnumerator, ByVal StrInName As String) Dim i As Long For i = 1 To oBOMRows.Count Dim oRow As BOMRow oRow = oBOMRows.Item(i) Dim oCompDef As ComponentDefinition oCompDef = oRow.ComponentDefinitions.Item(1) Debug.Print(oCompDef.Document.FullFileName) Dim InventorFullName As String '模型文件 Dim IdwFullFileName As String '工程图全文件名 InventorFullName = oCompDef.Document.FullFileName If IsFileExsts(InventorFullName) = False Then '跳过不存在的文件 GoTo 999 End If If InStr(InventorFullName, ContentCenterFiles) > 0 Then '跳过零件库文件 GoTo 999 End If '检查收否含有指定的字符串 If InStr(Strings.LCase(InventorFullName), Strings.LCase(StrInName)) = 0 Then GoTo 999 End If IdwFullFileName = Strings.Replace(InventorFullName, LCaseGetFileExtension(InventorFullName), ".idw") If IsFileExsts(IdwFullFileName) = False Then ThisApplication.Documents.Open(InventorFullName) End If ' 遍历下一级 If Not oRow.ChildRows Is Nothing Then Call CheckIsInvHaveIdwSub(oRow.ChildRows, StrInName) End If 999: Next End Sub '打开部件中所有子集对应的工程图 ,部件文件,指定的图号 Public Function OpenAllDrwInAsm(ByVal oAssemblyDocument As AssemblyDocument, ByVal StockNum As String) As Boolean ' Set a reference to the BOM Dim oBOM As BOM oBOM = oAssemblyDocument.ComponentDefinition.BOM ' Set the structured view to 'all levels' oBOM.StructuredViewFirstLevelOnly = False ' Make sure that the structured view is enabled. oBOM.StructuredViewEnabled = True ' Set a reference to the "Structured" BOMView Dim oBOMView As BOMView '获取结构化的bom页面 For Each oBOMView In oBOM.BOMViews If oBOMView.ViewType = BOMViewTypeEnum.kStructuredBOMViewType Then '遍历这个bom页面 OpenAllDrwInAsmSub(oBOMView.BOMRows, StockNum) End If Next Return True End Function '打开部件中所有子集对应的工程图 Public Sub OpenAllDrwInAsmSub(ByVal oBOMRows As BOMRowsEnumerator, ByVal StockNum As String) Dim i As Long For i = 1 To oBOMRows.Count Dim oRow As BOMRow oRow = oBOMRows.Item(i) Dim oComponentDefinition As ComponentDefinition oComponentDefinition = oRow.ComponentDefinitions.Item(1) Debug.Print(oComponentDefinition.Document.FullFileName) Dim InventorFullName As String '模型文件 Dim IdwFullFileName As String '工程图全文件名 InventorFullName = oComponentDefinition.Document.FullFileName If IsFileExsts(InventorFullName) = False Then '跳过不存在的文件 GoTo 999 End If If InStr(InventorFullName, ContentCenterFiles) > 0 Then '跳过零件库文件 GoTo 999 End If '获取对应工程图文件名 IdwFullFileName = Strings.Replace(InventorFullName, LCaseGetFileExtension(InventorFullName), ".idw") Select Case StockNum Case "" '打开全部 '存在对于工程图,打开它 If IsFileExsts(IdwFullFileName) = True Then ThisApplication.Documents.Open(IdwFullFileName) End If Case Else '打开指定图号 If Strings.InStr(Strings.LCase(GetFileNameInfo(InventorFullName).ONlyName), Strings.LCase(StockNum)) = 0 Then Exit Select End If If IsFileExsts(IdwFullFileName) = True Then ThisApplication.Documents.Open(IdwFullFileName) End If End Select '遍历下一级 If Not oRow.ChildRows Is Nothing Then Call OpenAllDrwInAsmSub(oRow.ChildRows, StockNum) End If 999: Next End Sub '打开活动文件对应的工程图 Public Sub OpenDrawingDocument(ByVal InventorDocument As Inventor.Document) Try SetStatusBarText() 'If IsInventorOpenDoc() = False Then ' Exit Sub 'End If 'If ThisApplication.ActiveDocument.DocumentType = kDrawingDocumentObject Then ' MsgBox("该功能仅适用于部件或零件", MsgBoxStyle.Information) ' 'Return False ' Exit Sub 'End If Dim InventorFullName As String '模型文件 Dim IdwFullFileName As String '工程图全文件名 InventorFullName = InventorDocument.FullDocumentName IdwFullFileName = Strings.Replace(InventorFullName, LCaseGetFileExtension(InventorFullName), ".idw") '当前文件夹查询没有就 到父文件夹查询 If IsFileExsts(IdwFullFileName) = False Then SearchDrawingDocumentInPresentFolder(InventorDocument, 3) End If '查询到工程图 If IsFileExsts(IdwFullFileName) Then ThisApplication.Documents.Open(IdwFullFileName) Else If SearchDrawingDocumentInPresentFolder(InventorDocument, 3) = False Then MsgBox(InventorFullName & "没有对应的工程图。", MsgBoxStyle.Information, "打开工程图") End If End If Catch ex As Exception MsgBox(ex.Message) End Try End Sub '到父文件夹查询工程图 ,inventor 文档 ,向上查询的层级 Public Function SearchDrawingDocumentInPresentFolder(ByVal InventorDocument As Inventor.Document, PresidentLevel As Integer) As Boolean Dim PrsentFolder As String '父文件夹 Dim InventorFullFileName As String '模型文件全名 Dim InventorFileName As String '模型文件名 Dim IdwFullFileName As String '工程图全文件名 Dim IdwFileName As String '工程图名 Dim i As Integer InventorFullFileName = InventorDocument.FullDocumentName InventorFileName = GetFileNameInfo(InventorFullFileName).SigleName IdwFileName = GetFileNameInfo(InventorFullFileName).ONlyName + IDW i = 0 PrsentFolder = System.IO.Directory.GetParent(InventorFullFileName).FullName Do If IsDirectoryExists(PrsentFolder) = True Then PrsentFolder = System.IO.Directory.GetParent(PrsentFolder).FullName i = i + 1 Else Exit Do End If Loop While (i <> PresidentLevel) Dim Files As ReadOnlyCollection(Of String) Files = My.Computer.FileSystem.GetFiles(PrsentFolder, FileIO.SearchOption.SearchAllSubDirectories, IdwFileName) If files.Count <> 0 Then For Each IdwFullFileName In files ThisApplication.Documents.Open(IdwFullFileName) Next Return True Else Return False End If End Function '------------------------------------------------------------------------------------------------------- '批量替换部件下子集的名字 ' 组件,被替换的文件名,替换的文件名 Public Function ReplaceNameInAsm(ByVal AsmDoc As Document, ByVal OldName As String, ByVal NewName As String, ByVal IsSaveAsOld As MsgBoxResult) As Boolean Dim TempFullFileName As String '更改旧模型文件的名字存档 For Each InventorDocument As Inventor.Document In AsmDoc.ReferencedDocuments Dim OldFullFileName As String '被替换的旧文件全名 Dim OldFileName As String '被替换的旧文件仅文件名 Dim NewFullFileName As String '新文件全名 Dim NewFileName As String '新文件名 'InventorDoc = ThisApplication.Documents.ItemByName(OldFullFileName) OldFullFileName = InventorDocument.FullDocumentName If IsFileExsts(OldFullFileName) = False Then '跳过不存在的文件 GoTo 999 End If If InStr(OldFullFileName, ContentCenterFiles) > 0 Then '跳过零件库文件 GoTo 999 End If OldFileName = GetFileNameInfo(OldFullFileName).SigleName '替换旧文件全名为新文件全名 If InStr(OldFileName, OldName) Then NewFileName = Replace(OldFileName, OldName, NewName) NewFullFileName = GetFileNameInfo(OldFullFileName).Folder & "\" & NewFileName '打开旧文件,不显示 Dim OldDoc As Inventor.Document OldDoc = ThisApplication.Documents.Open(OldFullFileName, False) '另存为新文件 OldDoc.SaveAs(NewFullFileName, False) '关闭旧图 OldDoc.Close() '后台打开文件,修改ipro Dim NewInventorDocument As Inventor.Document NewInventorDocument = ThisApplication.Documents.Open(NewFullFileName, False) '打开文件,不显示 SetDocumentIpropertyFromFileName(NewInventorDocument, True) '设置Iproperty,打开文件后需关闭 Dim oCO As Inventor.ComponentOccurrences oCO = AsmDoc.ComponentDefinition.Occurrences '全部替换为新文件 For Each ooCO As ComponentOccurrence In oCO If ooCO.ReferencedDocumentDescriptor.FullDocumentName = OldFullFileName Then ooCO.Replace(NewFullFileName, True) Exit For End If Next '是否有对应的工程图文件,同时复制后修改文件名和模型链接 Dim OldIdwFullFileName As String OldIdwFullFileName = GetNewExtensionFileName(OldFullFileName, ".idw") '旧工程图 'Dim TempFullFileName As String '更改旧模型文件的名字存档 If IsFileExsts(OldIdwFullFileName) = True Then Dim NewIdwFullFileName As String NewIdwFullFileName = GetNewExtensionFileName(NewFullFileName, ".idw") '新工程图 FileSystem.FileCopy(OldIdwFullFileName, NewIdwFullFileName) '复制为新工程图 'MsgBox("找到有对应的旧工程图,生成新的工程图,将打开,请链接到文件:" & vbCrLf & NewFullFileName & vbCrLf & "该文件名已复制,粘贴到对话框即可。", MsgBoxStyle.Information) 'Windows.Forms.Clipboard.SetText(NewFullFileName) 'ThisApplication.Documents.Open(NewIdwFullFileName, False) '打开新的工程图,使其手动链接零件或部件 'ThisApplication.Documents.ItemByName(NewIdwFullFileName).Save2() '保存链接并关闭工程图 'ThisApplication.Documents.ItemByName(NewIdwFullFileName).Close() InventorDocument = ThisApplication.Documents.Open(NewIdwFullFileName, False) '打开文件,不显示 InventorDocument.ReferencedDocumentDescriptors(1).ReferencedFileDescriptor.ReplaceReference(NewFullFileName) InventorDocument.Save2() InventorDocument.Close() If IsSaveAsOld = MsgBoxResult.Yes Then TempFullFileName = OldIdwFullFileName & ".old" '暂时更改旧工程图文件的名字存档 ReFileName(OldIdwFullFileName, TempFullFileName) 'ReFileName(TempFullFileName, OldFullFileName) '恢复旧零件或部件文件名 End If End If If IsSaveAsOld = MsgBoxResult.Yes Then TempFullFileName = OldFullFileName & ".old" '暂时更改旧工程图文件的名字存档 ReFileName(OldFullFileName, TempFullFileName) End If '是部件的遍历新文件的子集 NewInventorDocument = ThisApplication.Documents.Open(NewFullFileName, False) If NewInventorDocument.DocumentType = kAssemblyDocumentObject Then ReplaceNameInAsm(NewInventorDocument, OldName, NewName, IsSaveAsOld) End If NewInventorDocument.Close(True) End If 999: Next Return True End Function '导出 bom 平面性 Public Function ExportBOMAsFlat(ByVal oAssemblyDocument As AssemblyDocument, ByVal ExcelFullFileName As String) As Boolean Dim FirstLevelOnly As Boolean FirstLevelOnly = False '============================================================================================== '基于bom结构化数据,可跳过参考的文件 ' Set a reference to the BOM Dim oBOM As BOM oBOM = oAssemblyDocument.ComponentDefinition.BOM oBOM.StructuredViewEnabled = True oBOM.StructuredViewFirstLevelOnly = False 'Set a reference to the "Structured" BOMView Dim oBOMView As BOMView 'Dim ColumnsTitle As String 'ColumnsTitle = "库存编号|空格|零件代号|材料|质量|所属装配代号|数量|总数量|描述" Dim IOS2 As System.IO.StreamWriter If IsFileExsts(ExcelFullFileName) = False Then IOS2 = New IO.StreamWriter(ExcelFullFileName, False, System.Text.Encoding.Default) Else IOS2 = New IO.StreamWriter(ExcelFullFileName, True, System.Text.Encoding.Default) End If '写BOM表头 Dim strColumnsTitle As String strColumnsTitle = "序号," & Strings.Replace(BOMTiTle, "|", ",") IOS2.WriteLine(strColumnsTitle) IOS2.Close() TotalItem = 1 '获取结构化的bom页面 For Each oBOMView In oBOM.BOMViews If oBOMView.ViewType = BOMViewTypeEnum.kStructuredBOMViewType Then '遍历这个bom页面 QueryBOMRowPropertieToExcel(ExcelFullFileName, oBOMView.BOMRows, FirstLevelOnly, BOMTiTle, "0", 1) End If Next Return True End Function '在 bom平面性导出,遍历bom 行文件ipro Private Sub QueryBOMRowPropertieToExcel(ByVal ExcelFullFileName As String, ByVal oBOMRows As BOMRowsEnumerator, ByVal FirstLevelOnly As Boolean, ByVal ColumnsTitle As String, _ ByVal Level As String, ByVal PresentNumber As Integer) Dim i As Short Dim j As Short Dim iStepCount As Short iStepCount = oBOMRows.Count 'Create a new ProgressBar object. 'Dim oProgressBar As Inventor.ProgressBar 'oProgressBar = ThisApplication.CreateProgressBar(False, iStepCount, "当前文件: ") '赋值数组 Dim oBOMRowData(2000, 1) As String ReDim oBOMRowData(oBOMRows.Count - 1, 1) For i = 1 To oBOMRows.Count oBOMRowData(i - 1, 0) = oBOMRows.Item(i).ItemNumber oBOMRowData(i - 1, 1) = oBOMRows.Item(i).ReferencedFileDescriptor.FullFileName Next '冒泡排序() Dim Temp As String '不定义变量类型,以自动适应数组Ar的类型 Dim Flag As Boolean Dim n As Integer = oBOMRowData.Length / oBOMRowData.Rank - 1 For i = 0 To n Flag = False '从第1个元素开始,比较每两个相邻元素的大小,让大元素下沉,小元素上浮 '经过一轮循环,可使数组中最大元素下沉到数组最底部 '进入下一轮循环,只对前 n - i 个元素进行相邻比较(已排到后面的不用比较) For j = 0 To n - i - 1 If Val(oBOMRowData(j, 0)) > Val(oBOMRowData(j + 1, 0)) Then Temp = oBOMRowData(j, 0) oBOMRowData(j, 0) = oBOMRowData(j + 1, 0) oBOMRowData(j + 1, 0) = Temp Temp = oBOMRowData(j, 1) oBOMRowData(j, 1) = oBOMRowData(j + 1, 1) oBOMRowData(j + 1, 1) = Temp Flag = True '如果有排序行为,则设为 True End If Next If Flag = False Then '如未排序,说明已完成整个排序过程,退出 Exit For End If Next '循环每一行 For i = 0 To n '文件指针 Dim FilePointItemNumber As String FilePointItemNumber = oBOMRowData(i, 1) '寻找指针的行,开始提取数据 For j = 1 To oBOMRows.Count Dim oRow As BOMRow oRow = oBOMRows.Item(j) Dim InventorDocFullFileName As String InventorDocFullFileName = oRow.ReferencedFileDescriptor.FullFileName If InventorDocFullFileName = FilePointItemNumber Then ' Set the message for the progress bar 'oProgressBar.Message = InventorDocFullFileName If IsFileExsts(InventorDocFullFileName) = False Then '跳过不存在的文件 GoTo 999 End If '数据操作 '======================================== '测试文件 'Debug.Print(ItemNumber & ":" & InventorDocFullFileName) Dim oInventorDocument As Inventor.Document oInventorDocument = ThisApplication.Documents.Open(InventorDocFullFileName, False) SetStatusBarText(InventorDocFullFileName) Dim oPropSets As PropertySets Dim oPropSet As PropertySet oPropSets = oInventorDocument.PropertySets oPropSet = oPropSets.Item(3) Dim Array_ColumnsTitle() As String Dim Array_ColumnsTitleValue() As String Array_ColumnsTitle = Split(ColumnsTitle, "|") ReDim Array_ColumnsTitleValue(Array_ColumnsTitle.Length) Dim propitem As [Property] For k = 0 To Array_ColumnsTitle.Length - 1 Step 1 Select Case Array_ColumnsTitle(k) Case "空格" Array_ColumnsTitleValue(k) = "" Case Map_PartName propitem = oPropSet.ItemByPropId(Inventor.PropertiesForDesignTrackingPropertiesEnum.kPartNumberDesignTrackingProperties) Array_ColumnsTitleValue(k) = propitem.Value Case Map_StochNum propitem = oPropSet.ItemByPropId(Inventor.PropertiesForDesignTrackingPropertiesEnum.kStockNumberDesignTrackingProperties) Array_ColumnsTitleValue(k) = propitem.Value Case "描述" propitem = oPropSet.ItemByPropId(Inventor.PropertiesForDesignTrackingPropertiesEnum.kDescriptionDesignTrackingProperties) Array_ColumnsTitleValue(k) = propitem.Value Case "材料" Dim strMaterialName As String If oInventorDocument.DocumentType = kPartDocumentObject Then Dim IptDoc As PartDocument IptDoc = oInventorDocument strMaterialName = IptDoc.ComponentDefinition.Material.Name Else strMaterialName = "" End If Array_ColumnsTitleValue(k) = strMaterialName Case "成本中心" propitem = oPropSet.ItemByPropId(Inventor.PropertiesForDesignTrackingPropertiesEnum.kCostCenterDesignTrackingProperties) Array_ColumnsTitleValue(k) = propitem.Value Case "质量" Dim strMass As String strMass = GetMass(oInventorDocument) Array_ColumnsTitleValue(k) = strMass Case "面积" Dim strArea As String strArea = GetArea(oInventorDocument) Array_ColumnsTitleValue(k) = strArea Case "数量" Array_ColumnsTitleValue(k) = oRow.ItemQuantity.ToString Case "所属装配" Dim StockNumPartName As StockNumPartName StockNumPartName = GetStockNumPartName(oRow.ReferencedFileDescriptor.Parent.FullFileName) Array_ColumnsTitleValue(k) = StockNumPartName.StockNum & StockNumPartName.PartName Case "所属装配代号" Dim StockNumPartName As StockNumPartName StockNumPartName = GetStockNumPartName(oRow.ReferencedFileDescriptor.Parent.FullFileName) Array_ColumnsTitleValue(k) = StockNumPartName.StockNum Case "总数量" Array_ColumnsTitleValue(k) = (oRow.ItemQuantity * PresentNumber).ToString Case "缩略图" 'propitem = oPropSet.ItemByPropId(Inventor.PropertiesForDesignTrackingPropertiesEnum.kPartIconDesignTrackingProperties) 'Array_ColumnsTitleValue(k) = propitem.Value End Select Array_ColumnsTitleValue(k) = Strings.Replace(Array_ColumnsTitleValue(k), ",", ",") Next k oInventorDocument.Close(False) Select Case oInventorDocument.DocumentType Case kAssemblyDocumentObject Threading.Thread.Sleep(1000) Case kPartDocumentObject Threading.Thread.Sleep(200) End Select '集合数组数据 Dim ColumnsTitleValue As String ColumnsTitleValue = TotalItem & "," & Join(Array_ColumnsTitleValue, ",") TotalItem = TotalItem + 1 '测试数据 'Debug.Print(ColumnsTitleValue) '写数据到文件 Dim IOS As System.IO.StreamWriter If IsFileExsts(ExcelFullFileName) = False Then IOS = New IO.StreamWriter(ExcelFullFileName, False, System.Text.Encoding.Default) Else IOS = New IO.StreamWriter(ExcelFullFileName, True, System.Text.Encoding.Default) End If IOS.WriteLine(ColumnsTitleValue) IOS.Close() '========================================== 999: 'oProgressBar.UpdateProgress() Exit For End If Next j Next i 'Debug.Print("==================================") '写数据到文件 Dim IOS2 As System.IO.StreamWriter If IsFileExsts(ExcelFullFileName) = False Then IOS2 = New IO.StreamWriter(ExcelFullFileName, False, System.Text.Encoding.Default) Else IOS2 = New IO.StreamWriter(ExcelFullFileName, True, System.Text.Encoding.Default) End If '写空白行 IOS2.WriteLine("") IOS2.Close() For i = 1 To oBOMRows.Count ' Get the current row. Dim PointItemNumber As String If Level = "0" Then PointItemNumber = i Else PointItemNumber = Level & "." & i End If For j = 1 To oBOMRows.Count Dim oRow As BOMRow oRow = oBOMRows.Item(j) Dim ItemNumber As String ItemNumber = oRow.ItemNumber Dim DocFullFileName As String DocFullFileName = oRow.ReferencedFileDescriptor.FullFileName If ItemNumber = PointItemNumber Then '测试文件 'Debug.Print(ItemNumber & ":" & DocFullFileName) ' Set the message for the progress bar 'oProgressBar.Message = DocFullFileName If IsFileExsts(DocFullFileName) = False Then '跳过不存在的文件 GoTo 99 End If '数据操作 '======================================== '========================================== '遍历下一级 If (Not oRow.ChildRows Is Nothing) And FirstLevelOnly = False Then Call QueryBOMRowPropertieToExcel(ExcelFullFileName, oRow.ChildRows, FirstLevelOnly, ColumnsTitle, PointItemNumber, oRow.ItemQuantity) End If 99: 'oProgressBar.UpdateProgress() Exit For End If Next j Next i 88: 'oProgressBar.Close() End Sub '保存文件时的事件 'Public Sub ThisApplicationEvents_OnOnSaveDocument(ByVal DocumentObject As Inventor._Document, _ ' ByVal BeforeOrAfter As Inventor.EventTimingEnum, _ ' ByVal Context As Inventor.NameValueMap, _ ' ByRef HandlingCode As Inventor.HandlingCodeEnum) Handles ThisApplicationEvents.OnSaveDocument 'End Sub '打开文件时的事件 'Public Sub ThisApplicationEvents_OnOpenDocument(ByVal oInventorDocument As Inventor.Document, _ ' ByVal FullDocumentName As String, _ ' ByVal BeforeOrAfter As Inventor.EventTimingEnum, _ ' ByVal Context As Inventor.NameValueMap, _ ' ByRef HandlingCode As Inventor.HandlingCodeEnum) Handles ThisApplicationEvents.OnOpenDocument ' '当打开文件为工程图 ' If oInventorDocument.DocumentType = kDrawingDocumentObject Then ' '写入主视图比例 ' 'If IsSetDrawingScale = 1 Then ' SetDrawingScale(oInventorDocument) ' 'End If ' '写入零部件质量 ' 'If IsSetMass = 1 Then ' SetMass(oInventorDocument) ' 'End If ' End If 'End Sub '激活一个文档时的事件 Public Sub ThisApplicationEvents_OnActivateDocument(ByVal oInventorDocument As Inventor.Document, _ ByVal BeforeOrAfter As Inventor.EventTimingEnum, _ ByVal Context As Inventor.NameValueMap, _ ByRef HandlingCode As Inventor.HandlingCodeEnum) Handles ThisApplicationEvents.OnActivateDocument '当打开文件为工程图 If oInventorDocument.DocumentType = kDrawingDocumentObject Then '写入主视图比例 'If IsSetDrawingScale = 1 Then SetDrawingScale(oInventorDocument) 'End If '写入零部件质量 'If IsSetMass = 1 Then SetMass(oInventorDocument) 'End If End If End Sub '刷新引用 Public Function RefreshShowName(ByVal AsmDoc As Document) As Boolean ' 获取装配定义 Dim oAssemblyComponentDefinition As AssemblyComponentDefinition oAssemblyComponentDefinition = AsmDoc.ComponentDefinition Dim ShortName1 As String Dim ShortName2 As String Dim NumName As String Dim i As Integer For Each oOcc In oAssemblyComponentDefinition.Occurrences If InStr(oOcc.ReferencedDocumentDescriptor.FullDocumentName, ContentCenterFiles) > 0 Then '跳过零件库文件 GoTo 999 End If Debug.Print(oOcc.Name) Debug.Print(oOcc.ReferencedDocumentDescriptor.FullDocumentName) i = InStr(oOcc.Name, ":") ShortName1 = Strings.Left(oOcc.Name, i - 1) NumName = Strings.Right(oOcc.Name, Len(oOcc.Name) - i + 1) ShortName2 = GetFileNameInfo(oOcc.ReferencedDocumentDescriptor.FullDocumentName).ONlyName If ShortName1 <> ShortName2 Then oOcc.Name = ShortName2 & NumName End If 999: Next Return True End Function '对齐XYZ平面 Public Function FlushXYZPlane() As Boolean Dim InventorDocument As Inventor.Document InventorDocument = ThisApplication.ActiveDocument Dim oAsmCompDef As AssemblyComponentDefinition oAsmCompDef = InventorDocument.ComponentDefinition ' Get references to the two occurrences to constrain. ' This arbitrarily gets the first and second occurrence. Dim oComponentOccurrence1 As ComponentOccurrence oComponentOccurrence1 = ThisApplication.CommandManager.Pick(kAssemblyLeafOccurrenceFilter, "选择第一个部件或零件") If oComponentOccurrence1 Is Nothing Then '取消选择 Exit Function End If Dim oComponentOccurrence2 As ComponentOccurrence oComponentOccurrence2 = ThisApplication.CommandManager.Pick(kAssemblyLeafOccurrenceFilter, "选择第二个部件或零件") If oComponentOccurrence2 Is Nothing Then '取消选择 Exit Function End If ' Get the XY plane from each occurrence. This goes to the ' component definition of the part to get this information. ' This is the same as accessing the part document directly. ' The work plane obtained is in the context of the part, ' not the assembly. For i = 1 To 3 Dim oPartPlane1 As WorkPlane oPartPlane1 = oComponentOccurrence1.Definition.WorkPlanes.Item(i) Dim oPartPlane2 As WorkPlane oPartPlane2 = oComponentOccurrence2.Definition.WorkPlanes.Item(i) ' Because we need the work plane in the context of the assembly ' we need to create proxies for the work planes. The proxies ' represent the work planes in the context of the assembly. Dim oAsmPlane1 As WorkPlaneProxy = Nothing oComponentOccurrence1.CreateGeometryProxy(oPartPlane1, oAsmPlane1) Dim oAsmPlane2 As WorkPlaneProxy = Nothing oComponentOccurrence2.CreateGeometryProxy(oPartPlane2, oAsmPlane2) ' Create the constraint using the work plane proxies. Dim oMate As FlushConstraint oMate = oAsmCompDef.Constraints.AddFlushConstraint(oAsmPlane1, oAsmPlane2, 0) Next Return True End Function '获取未读取的文件所在部件并打开该部件 ( 部件文件对象 ; 文件是否需打开,打开的文件用后要关闭) Public Function GetUnkonwDocumentWithBOM(ByVal AsmDoc As AssemblyDocument, ByVal IsNeedClose As Boolean) As Boolean ' 获取所有引用文档 Dim FirstLevelOnly As Boolean FirstLevelOnly = False '============================================================================================== '基于bom结构化数据,可跳过参考的文件 ' Set a reference to the BOM Dim oBOM As BOM oBOM = AsmDoc.ComponentDefinition.BOM oBOM.StructuredViewEnabled = True 'Set a reference to the "Structured" BOMView Dim oBOMView As BOMView '获取结构化的bom页面 For Each oBOMView In oBOM.BOMViews If oBOMView.ViewType = BOMViewTypeEnum.kModelDataBOMViewType Then '遍历这个bom页面 QueryBOMRowToOpenUnkonwDocument(oBOMView.BOMRows, FirstLevelOnly) End If Next '============================================================================================== Return True End Function '遍历BOM结构,获取未读取的文件所在部件并打开该部件 Public Sub QueryBOMRowToOpenUnkonwDocument(ByVal oBOMRows As BOMRowsEnumerator, ByVal FirstLevelOnly As Boolean) Dim i As Integer Dim iStepCount As Short 'Dim oBOMRows As BOMRowsEnumerator 'oBOMRows = oBOM.oBOMView.BOMRows iStepCount = oBOMRows.Count 'Create a new ProgressBar object. 'Dim oProgressBar As Inventor.ProgressBar 'oProgressBar = ThisApplication.CreateProgressBar(False, iStepCount, "当前文件: ") For i = 1 To oBOMRows.Count ' Get the current row. Dim oRow As BOMRow oRow = oBOMRows.Item(i) Dim FullFileName As String FullFileName = oRow.ReferencedFileDescriptor.FullFileName '测试文件 Debug.Print(FullFileName) ' Set the message for the progress bar 'oProgressBar.Message = FullFileName 'If InStr(FullFileName, ContentCenterFiles) > 0 Then '跳过零件库文件 ' GoTo 999 'End If '文件不存在,就打开父级文件 If IsFileExsts(FullFileName) = False Then Dim InventorDoc As Inventor.Document '父级文件名 FullFileName = oRow.ReferencedFileDescriptor.Parent.FullFileName InventorDoc = ThisApplication.Documents.Open(FullFileName, True) '打开文件,显示 End If '遍历下一级 If (Not oRow.ChildRows Is Nothing) And FirstLevelOnly = False Then Call QueryBOMRowToOpenUnkonwDocument(oRow.ChildRows, FirstLevelOnly) End If 999: 'oProgressBar.UpdateProgress() Next 'oProgressBar.Close() End Sub '尺寸精度圆整 Public Function SetDrawingDimPrecision() As Boolean Try SetStatusBarText() If IsInventorOpenDoc() = False Then Exit Function End If If ThisApplication.ActiveDocument.DocumentType <> kDrawingDocumentObject Then MsgBox("该功能仅适用于工程图", MsgBoxStyle.Information) Exit Function End If Dim oDrawingDocument As DrawingDocument oDrawingDocument = ThisApplication.ActiveDocument Dim oLinearGeneralDimension As LinearGeneralDimension '选择的部件或零件 ' 是否已经选择了尺寸 If oDrawingDocument.SelectSet.Count <> 0 Then For Each oSelect As Object In oDrawingDocument.SelectSet If oSelect.Type = ObjectTypeEnum.kLinearGeneralDimensionObject Then oSelect.Precision = 0 End If Next Else oLinearGeneralDimension = ThisApplication.CommandManager.Pick(kDrawingDefaultFilter, "选择要添加Φ的尺寸") If oLinearGeneralDimension Is Nothing Then '取消选择 Return True Exit Function End If oLinearGeneralDimension.Precision = 0 End If Catch ex As Exception MsgBox(ex.Message) End Try End Function End Module