Nie można usunąć

Witam
Mam makro działające w 98% i trochę suszę się na pozostałe 2%.
To makro automatycznie dodaje oznaczenia na końcu linii gięcia, na warstwie znakowania i w kolorze żółtym.
Problem wynika z jakiejś części, gdy rozmiar części jest zmniejszony, oznaczenie wychodzi z części.
Poprzez ponowne uruchomienie makra ma ono na celu wymazanie linii oznaczeń, poza czasem (rzadko) oznaczenie nie jest usuwane.
W górnej części okna pojawia się komunikat w trybie debugowania:
" Żaden z tych elementów nie może zostać usunięty "


Oto część mojego kodu, która służy do usunięcia znaczników:

Sub suppressMarquage()
    Dim swModel                 As Object
    Dim vSkSegArr               As Variant
    Dim vSkSeg                  As Variant
    Dim swSkSeg                 As SldWorks.SketchSegment
    Dim boolstatus              As Boolean
    Dim longstatus              As Long, longwarnings As Long
    Dim Numberline              As Integer
    Dim lNumSegments            As Long
    Dim myModelView             As Object
    
'On supprime le marquage existant
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    
    Set myModelView = swModel.ActiveView
    myModelView.FrameState = swWindowState_e.swWindowMaximized
    Set swView = swDraw.GetFirstView.GetNextView


    lNumSegments = swView.GetLineCount2(1)

    If lNumSegments > 0 Then
        Set swSketch = swView.GetSketch
        vSkSegArr = swSketch.GetSketchSegments
        For Each vSkSeg In vSkSegArr
            Set swSkSeg = vSkSeg
            boolstatus = swModel.Extension.SelectByID2(swSkSeg.GetName, "SKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
            swModel.EditDelete
        Next vSkSeg
    End If
    
'On supprime l'annotation marquage
    Dim bFind                       As Boolean
    Dim swNote                      As SldWorks.Note
    Dim swAnn                       As SldWorks.Annotation
    Dim bret                        As Boolean
    Set swNote = swView.GetFirstNote
    Do While Not swNote Is Nothing
                            bFind = False
                            Debug.Print "Note:" & swNote.GetText
                            If swNote.GetText Like "*Marquage laser*" Then
                                bFind = True
                                Debug.Print "bFind:" & bFind
                                Set swAnn = swNote.GetAnnotation
                                bret = swAnn.Select2(True, 0)
                                Set swNote = swNote.GetNext
                                swModel.EditDelete
                                
                            End If
        If Not bFind Then Set swNote = swNote.GetNext
    Loop
End Sub

A w razie potrzeby przykład posła do PE, który nie działa dobrze (sw 2020)
Jeśli ktoś ma jakiś trop, to zbyt długo zwlekam z tym tematem!:grin:
PI_200416-test. SLDPRT (580.9 KB)
PI_200416-test. SLDDRW (287.8 KB)

Witam

Spróbuj zastąpić to:

    Set myModelView = swModel.ActiveView
    myModelView.FrameState = swWindowState_e.swWindowMaximized
    Set swView = swDraw.GetFirstView.GetNextView

W ten sposób:

    Set myModelView = swModel.ActiveView
    myModelView.FrameState = swWindowState_e.swWindowMaximized
    Set swView = swDraw.GetFirstView
    Set swView = swView.GetNextView
    boolstatus = swDraw.ActivateView(swView.GetName2)

Edycja: Zadeklaruj również zmienne z odpowiednim typem:

    Dim swModel                 As SldWorks.ModelDoc2
    Dim swDraw                  As SldWorks.DrawingDoc
    Dim swView                  As SldWorks.View

Itd

1 polubienie

Dla zmiennych były one globalne, stąd pominięcie w moim (częściowym) kodzie:
image
Co do reszty, wydaje się doskonale funkcjonalny, w rzeczywistości fakt aktywacji widoku wydaje się znacznie lepszy!
Dziękuję @Cyril_f .
Dla mojej kultury i w celu mojego ciągłego doskonalenia, jak prosiliście o debugowanie?

Tak więc do debugowania dodałem debug.print w nazwie widoku i nazwie szkicu, aby sprawdzić, czy wybory są dobre.
To, co mnie zaniepokoiło, to fakt, że podczas procesu krok po kroku miał tendencję do wybierania arkusza w drzewie zamiast widoku (prawdopodobnie związane z tym wierszem:

Set myModelView = swModel.ActiveView
    myModelView.FrameState = swWindowState_e.swWindowMaximized

Usunięcie go nic nie zmieniło, przypomniałem sobie wtedy, że funkcja swView.GetNExtView nie aktywowała widoku punktu widzenia SW więc aktywując ją wymuszamy zaznaczenie na odpowiednim poziomie (na rysunku mogą być linie poza widokami i mapą bazową).

2 polubienia

I pomyśleć, że to jest to, co w ogóle radzę (dodając debug.print), to czasami najgorszy obuty szewc! :rofl: :rofl: :rofl:

Dzięki za pomoc i wyjaśnienie!

1 polubienie