Witam, zamierzam czytać i edytować notatki lub atrybuty w blokach VBA lub instancjach bloków na rysunkach SolidWorks.
Mogę pobrać obiekty blokowe lub instancje bloku, ale po wykonaniu następujących funkcji tworzę błędy:
swBlockDef.GetNotes
swBlockDef.GetNoteCount
z swBlockDef jako SldWorks.BlockDefinition
lub
swlockInst.GetAnnotation
swlockInst.GetAttributes
swlockInst.GetAttributeCount
swlockInst.GetAttributeValue
swlockInst.SetAttributeValue
z swlockInst jako SldWorks.BlockInstance
W przeszłości z powodzeniem używałem już swBlockDef.GetNotes, ale teraz już nie działa.
Czy ktoś ma dla mnie rozwiązanie?
Z góry dziękuję
Witam serdecznie;
Byłoby łatwiej, gdybyś opublikował (między tagami) całe makro...
Wygląda na to, że SldWorks.BlockDefinition jest przestarzały od wersji 2007:

https://help.solidworks.com/2022/english/api/sldworksapi/get_block_information_example_vb.htm?verRedirect=1
ekstrakt:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' OLD BLOCKS: Obsolete and not supported block
' interfaces as of SOLIDWORKS 2007
'Dim swBlockDef As SldWorks.BlockDefinition
'Dim swBlockInst As SldWorks.BlockInstance
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' NEW BLOCKS: New block interfaces as of SOLIDWORKS 2007
Dim swBlockDef As SldWorks.SketchBlockDefinition
Dim swBlockInst As SldWorks.SketchBlockInstance
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Konieczne wydaje się zastąpienie go przez:
SldWorks.SketchBlockDefinition
z atrybutami:
https://help.solidworks.com/2022/english/api/sldworksapiprogguide/Overview/Block_Definitions_and_Block_Instances.htm
Pozdrowienia.
Witam
Używam SldWorks.SketchBlockDefinition i SldWorks.SketchBlockInstance
Mogę pobrać obiekty block i Blockinstance.
Dopiero po tym mam problemy...
Witam
Musisz spojrzeć na ten przykład API: Pobierz przykład informacji o bloku (VBA) - 2024 - Pomoc SOLIDWORKS API
Dostęp do nut zawartych w bloku jest uzyskiwany w zmiennej typu variant.
Powinieneś wypróbować ten kod, który istnieje od bardzo dawna.
Z mojej strony to już nie działa.
To niewiele znaczy " to już nie działa ":
- Masz komunikaty o błędach? Jeśli tak, to które + zrzut ekranu.
- Jakie zmiany zostały wprowadzone między " to działa " a " już nie działa ".
- Nie określono bieżącej wersji Solidworks.
Makro, które Ci zaproponowałem (które jest takie samo jak to w @Cyril_f ( ... paskudny kopiarka VAS) działa na moim Solidworks 2022 SP4
:
Oto wynik...
File = XXXXXXctif_Brosses.SLDDRW
Block definition linked to file? Faux
File name:
Name of block instance: Orientation-3
Block instance(0):
Angle = 0 deg
Scale = 0,7
TextDisplay = 3
------------------------------------
Block definition linked to file? Faux
File name:
Name of block instance: logo revtech-3
Block instance(0):
Angle = 0 deg
Scale = 0,7
TextDisplay = 3
------------------------------------
1 polubienie
Ups, przepraszam. Zmęczony w tej chwili nie zwróciłem uwagi na link w Twojej odpowiedzi.
Witam
Poniżej znajduje się kod, którego używam do moich testów
Gdy vNote to vNote() jako sldworks.note, to niezgodność typu kodu błędu wykonania 13
Gdy vNote jest wariantem, wiersz vNote = swBlockDef.GetNotes daje vNote równa się puste
I wiersz vNote = swlockInst.GetAttributes, a następnie kod błędu ‹ - 670099352 (d80f1868) ›: Automatyzacja błędów
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim SwSketchMgr As SldWorks.SketchManager
Dim vBlockDef() As SldWorks.BlockDefinition
Dim swBlockDef As SldWorks.BlockDefinition
Dim vBlockInst() As SldWorks.BlockInstance
Dim swlockInst As SldWorks.BlockInstance
Dim vNote As Variant
'Dim vNote() As SldWorks.Note
Dim swNote As SldWorks.Note
Dim i As Long
Dim j As Long
Dim k As Long
Dim Text As String
Set swApp = CreateObject("SldWorks.Application")
Set swModel = swApp.ActiveDoc
Set SwSketchMgr = swModel.SketchManager
vBlockDef = SwSketchMgr.GetSketchBlockDefinitions
If Not IsEmpty(vBlockDef) Then
For i = 0 To UBound(vBlockDef)
Set swBlockDef = vBlockDef(i)
Text = swBlockDef.Name
vNote = swBlockDef.GetNotes 'vide ou erreur
If Not IsEmpty(vNote) Then
For j = 0 To UBound(vNote)
swNote = vNote(j)
Text = swNote.GetText
Next
End If
vBlockInst = swBlockDef.GetInstances
If Not IsEmpty(vBlockInst) Then
For j = 0 To UBound(vBlockInst)
Set swlockInst = vBlockInst(j)
Text = swlockInst.Name
vNote = swlockInst.GetAttributes 'Erreur d'exécution '-670099352 (d80f1868)': Erreur Automation
If Not IsEmpty(vNote) Then
For k = 0 To UBound(vNote)
Set swNote = vNote(k)
Text = swNote.TagName
Next
End If
Next
End If
Next i
End If
End Sub
Witam
Czyli dużo błędów w kodzie.
Poniżej znajduje się poprawiony kod, który powinien działać (działa na 2024 SP5), zaczerpnięty z kodu pomocy API.
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim SwSketchMgr As SldWorks.SketchManager
Dim vBlockDef As Variant
Dim swBlockDef As SldWorks.SketchBlockDefinition
Dim vBlockInst As Variant
Dim swBlockInst As SldWorks.SketchBlockInstance
Dim vNote As Variant
Dim swNote As SldWorks.Note
Dim i As Long
Dim j As Long
Dim k As Long
Dim Text As String
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set SwSketchMgr = swModel.SketchManager
vBlockDef = SwSketchMgr.GetSketchBlockDefinitions
If Not IsEmpty(vBlockDef) Then
For i = 0 To UBound(vBlockDef)
Set swBlockDef = vBlockDef(i)
vNote = swBlockDef.GetNotes 'vide ou erreur
If Not IsEmpty(vNote) Then
For j = 0 To UBound(vNote)
Set swNote = vNote(j)
Text = swNote.GetText
Next
End If
vBlockInst = swBlockDef.GetInstances
If Not IsEmpty(vBlockInst) Then
For j = 0 To UBound(vBlockInst)
Set swBlockInst = vBlockInst(j)
Text = swBlockInst.Name
vNote = swBlockInst.GetAttributes
If Not IsEmpty(vNote) Then
For k = 0 To UBound(vNote)
Set swNote = vNote(k)
Text = swNote.TagName
Next
End If
Next
End If
Next i
End If
End Sub
Zasadniczo, deklarowanie zmiennych, które są niepoprawne:
Dim vBlockDef() As SldWorks.BlockDefinition
Typ zmiennej Variant i brak nawiasów do umieszczenia w nazwie tej zmiennej.
Brak zestawu zmiennej swNote i wielu innych.
1 polubienie
Witam
Masz rację co do brakujących zestawów w swNote = vNote(i)
Z drugiej strony, gdy Dim vBlockDef As Variant, otrzymuję błąd w wierszu Set swBlockDef = vBlockDef(i), że jestem, gdy Dim vBlockDef() As SldWorks.BlockDefinition
Która wersja oprogramowania?
Nie mam żadnych błędów na SW 2024.
Makro @Cyril_f działa również w Solidworks 2022.
Kiedy mówisz o błędzie, podaj jego numer (lub zrób zrzut ekranu).
Jestem w SW2022 sp5.0
To dziwne z mojej strony:
Gdy vNote jako wariant, to vNote = swBlockDef.GetNotes lub vNote = swlockInst.GetAttributes są puste
Gdy vNote() As SldWorks.Note, te same funkcje tworzą błąd wykonania 13: Niezgodność typów
Powinniśmy przyjrzeć się referencjom (Tools-> References).
Moje to te, ale mój kod zawiera różne makra, które wymagają więcej odwołań niż jest to konieczne na potrzeby makra blokowego.

Kolejnym problemem, który już mi się przydarzył, jest wersja VBA, która nie jest właściwa i generuje błędy operacyjne macOS
Właśnie przeprowadziłem test makra @Cyril_f na starym pliku sprzed 2007 roku...
W takim przypadku zmienne są faktycznie puste.
=> W tej sytuacji musisz skorzystać z informacji podanych w przykładzie, który już dwukrotnie Ci przedstawiliśmy:
https://help.solidworks.com/2022/english/api/sldworksapi/get_block_information_example_vb.htm?verRedirect=1
z:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' OLD BLOCKS: Obsolete and not supported block
' interfaces as of SOLIDWORKS 2007
'Dim swBlockDef As SldWorks.BlockDefinition
'Dim swBlockInst As SldWorks.BlockInstance
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' NEW BLOCKS: New block interfaces as of SOLIDWORKS 2007
Dim swBlockDef As SldWorks.SketchBlockDefinition
Dim swBlockInst As SldWorks.SketchBlockInstance
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Nie chcąc cię urazić, @Patrick_CHARDON , nie wydajesz się zbyt komfortowo z deklaracjami zmiennych. Polecam zaufać @Cyril_f, ponadto jego makro współpracuje z nami.
Co dokładnie chcesz uzyskać jako informacje od swojego koźlaka, prawdopodobnie możemy Ci pomóc, ale jeśli tak naprawdę nie wiemy, co próbujesz zrobić, jest to skomplikowane... A teraz kręcimy się w kółko...
1 polubienie