Mamy skrypt podczas otwierania rysunków (i przycisk makra do ręcznego uruchamiania), aby ponownie załadować mapę bazową na wszystkich arkuszach rysunku.
Mapa bazowa składa się z 3 bloków (kaseta, linijka, znacznik orientacji).
Zdałem sobie sprawę, że skrypt, który korzysta z interfejsów API SetUpSheet* i ReloadTemplate, duplikuje dla każdego arkusza 3 bloki rysunku.
Podczas gdy ręczna operacja dodawania arkusza lub ponownego wczytywania mapy bazowej na istniejącym arkuszu, system prosi nas o wybór, czy zmienić nazwę nowych bloków, czy użyć istniejących, nasz skrypt wydaje się automatycznie odpowiadać twierdząco na to pytanie:
Jak automatycznie odpowiadać "nie" i nie duplikować bloków? Których interfejsów API i/lub wartości parametrów interfejsu API mogę użyć, aby osiągnąć pożądane zachowanie?
Mamy plany, które mogą mieć nawet 112 stron; Kończymy z 336 blokami w drzewie.
Kod, o którym mowa, robi wiele innych rzeczy na poziomach Solidworks, SmarTeam i innych, które nie są istotne do udostępniania. Część tego kodu, która ponownie wczytuje mapę bazową, jest mniej więcej taka sama (parametry API SetUpSheet), jak znajduje się w pomocy.
Ale oto kod, który sprawia mi problemy:
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim swView As SldWorks.View
Dim vSheetProps As Variant
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
Set swSheet = swDraw.GetCurrentSheet
vSheetProps = swSheet.GetProperties
Dim size As String
If vSheetProps(0) = 7 Then
'7 = A4 Portrait
templateFormat = "A4.SLDDRT"
size = "A4"
ElseIf vSheetProps(0) = 8 Then
'8 = A3 Paysage
templateFormat = "A3.SLDDRT"
size = "A3"
ElseIf vSheetProps(0) = 9 Then
'9 = A2 Paysage
templateFormat = "A2.SLDDRT"
size = "A2"
ElseIf vSheetProps(0) = 10 Then
'10 = A1 Paysage
templateFormat = "A1.SLDDRT"
size = "A1"
ElseIf vSheetProps(0) = 11 Then
'11 = A0 Paysage
templateFormat = "A0.SLDDRT"
size = "A0"
End If
boolstatus = swModel.SetupSheet5( _
swSheet.GetName, _
vSheetProps(0), _
vSheetProps(1), _
vSheetProps(2), _
vSheetProps(3), _
True, _
templateFormat, _
vSheetProps(5), _
vSheetProps(6), _
"Par défaut", _
True _
)
swSheet.ReloadTemplate False
End Sub
Nie możesz mieć takiego wyboru w przypadku interfejsu API. Jeśli chcesz uniknąć wszystkich tych bloków w swoim drzewie, najprostszym sposobem jest usunięcie go z mapy bazowej i naprawienie szkiców (lub zwymiarowanie ich i ukrycie wymiarów). W przeciwnym razie można utworzyć kod, który usunie wszystkie bloki z wyjątkiem bloków na pierwszym arkuszu, a następnie wstawi je do kolejnych arkuszy. Takie podejście będzie trzymać się pożądanego zachowania, ale kodowanie wymaga trochę więcej pracy (chociaż...)