Catia V5 宏:不完整的重命名功能
Catia V5 Macro: Incomplete renaming function
我已经处理这个问题一段时间了,甚至得到了帮助,但我无法解决。
以下宏根据用户和 CADSelection 重命名 PartName
或 InstanceName
。
问题是它在 PartName
改动中不起作用。
有人可以帮我完成这个宏吗?最好解释一下我做错了什么?
Sub CATMain()
If CATIA.Documents.Count = 0 Then
MsgBox "There are no CATIA documents open. Please open a CATIA document and try again.", ,msgboxtext
Exit Sub
End If
If InStr(CATIA.ActiveDocument.Name, ".CATProduct") < 1 Then
MsgBox "The active document is not a Product. Please open a CATIA Product and try again.", ,msgboxtext
Exit Sub
End If
Dim oSelection As Selection
Set oSelection = CATIA.ActiveDocument.Selection
If oSelection.Count < 1 then
MsgBox "Pick some components using cad selection."
Else
'****** Alter Instance Name *****'
Dim msg
msg = MsgBox ("Click ""Yes"" to change Instance Name, ""No"" to change Part Name or ""Cancel"" to exit", _
vbYesNoCancel, "Renaming Tool")
if vbYes = msg then
'****** Inputbox for Instance name alteration *****
Dim NewIName As String
NewIName = InputBox("Please input the desired Instance Name. Example: E","Instance name alteration","E")
'****** Inputbox for Instance number alteration *****
Dim NewINumber As Integer
NewINumber = InputBox("Please input the initial number for the 1st component. Example: 1","Instance numbering alteration","1")
Dim oIBody
Dim InstName As Body
For oIBody = 1 to oSelection.Count
Set InstName = oSelection.Item(oIBody).Value
'****** Instance name alteration *****
InstName.Parent.Parent.ReferenceProduct.Products.Item( _
InstName.Name).Name= NewIName + CStr(NewINumber)
NewINumber=NewINumber+1
Next
elseif vbNo = msg then
'****** Inputbox for Part name alteration *****
Dim NewPName As String
NewPName = InputBox("Please input the desired Part Name. Example: E","Part Name alteration","E")
'****** Inputbox for Part number alteration *****
Dim NewPNumber As Integer
NewPNumber = InputBox("Please input the initial number for the 1st Component. Example: 1","Part numbering alteration","1")
Dim oPBody
Dim PartName As Body
For oPBody = 1 to oSelection.Count
Set PartName = oSelection.Item(oPBody).Value
'****** Part name alteration *****
PartName.ReferenceProduct.Name= NewPName + CStr(NewPNumber)
NewPNumber=NewPNumber+1
Next
End If
End If
oSelection.Clear
End Sub
部件 "name" 实际上是部件号,使用 "PartNumber" 属性 进行了更改。
所以尝试改变
PartName.ReferenceProduct.Name= NewPName + CStr(NewPNumber)
到
PartName.ReferenceProduct.PartNumber= NewPName + CStr(NewPNumber)
这不会影响文档名称,除非您还没有保存您的零件。
还有什么:
1) 您的变量命名令人困惑。您在一个地方调用产品 "InstName",在另一个地方调用 "PartName"。乍一看,我以为那些是字符串。使用 oProduct 会减少混淆。
2) 您似乎非常确信用户已经预先选择了正确的类型。由于您是在程序集中选择,而不是使用 Selection.Item(i).Value,您可以使用 Selection.item(i).LeafProduct,它始终是选择的任何对象的实例产品。即使用户选择了一个表面,它也会 return 包含所选表面的实例产品。
我已经处理这个问题一段时间了,甚至得到了帮助,但我无法解决。
以下宏根据用户和 CADSelection 重命名 PartName
或 InstanceName
。
问题是它在 PartName
改动中不起作用。
有人可以帮我完成这个宏吗?最好解释一下我做错了什么?
Sub CATMain()
If CATIA.Documents.Count = 0 Then
MsgBox "There are no CATIA documents open. Please open a CATIA document and try again.", ,msgboxtext
Exit Sub
End If
If InStr(CATIA.ActiveDocument.Name, ".CATProduct") < 1 Then
MsgBox "The active document is not a Product. Please open a CATIA Product and try again.", ,msgboxtext
Exit Sub
End If
Dim oSelection As Selection
Set oSelection = CATIA.ActiveDocument.Selection
If oSelection.Count < 1 then
MsgBox "Pick some components using cad selection."
Else
'****** Alter Instance Name *****'
Dim msg
msg = MsgBox ("Click ""Yes"" to change Instance Name, ""No"" to change Part Name or ""Cancel"" to exit", _
vbYesNoCancel, "Renaming Tool")
if vbYes = msg then
'****** Inputbox for Instance name alteration *****
Dim NewIName As String
NewIName = InputBox("Please input the desired Instance Name. Example: E","Instance name alteration","E")
'****** Inputbox for Instance number alteration *****
Dim NewINumber As Integer
NewINumber = InputBox("Please input the initial number for the 1st component. Example: 1","Instance numbering alteration","1")
Dim oIBody
Dim InstName As Body
For oIBody = 1 to oSelection.Count
Set InstName = oSelection.Item(oIBody).Value
'****** Instance name alteration *****
InstName.Parent.Parent.ReferenceProduct.Products.Item( _
InstName.Name).Name= NewIName + CStr(NewINumber)
NewINumber=NewINumber+1
Next
elseif vbNo = msg then
'****** Inputbox for Part name alteration *****
Dim NewPName As String
NewPName = InputBox("Please input the desired Part Name. Example: E","Part Name alteration","E")
'****** Inputbox for Part number alteration *****
Dim NewPNumber As Integer
NewPNumber = InputBox("Please input the initial number for the 1st Component. Example: 1","Part numbering alteration","1")
Dim oPBody
Dim PartName As Body
For oPBody = 1 to oSelection.Count
Set PartName = oSelection.Item(oPBody).Value
'****** Part name alteration *****
PartName.ReferenceProduct.Name= NewPName + CStr(NewPNumber)
NewPNumber=NewPNumber+1
Next
End If
End If
oSelection.Clear
End Sub
部件 "name" 实际上是部件号,使用 "PartNumber" 属性 进行了更改。
所以尝试改变
PartName.ReferenceProduct.Name= NewPName + CStr(NewPNumber)
到
PartName.ReferenceProduct.PartNumber= NewPName + CStr(NewPNumber)
这不会影响文档名称,除非您还没有保存您的零件。
还有什么:
1) 您的变量命名令人困惑。您在一个地方调用产品 "InstName",在另一个地方调用 "PartName"。乍一看,我以为那些是字符串。使用 oProduct 会减少混淆。
2) 您似乎非常确信用户已经预先选择了正确的类型。由于您是在程序集中选择,而不是使用 Selection.Item(i).Value,您可以使用 Selection.item(i).LeafProduct,它始终是选择的任何对象的实例产品。即使用户选择了一个表面,它也会 return 包含所选表面的实例产品。