MAKRO: ustaw domyślną warstwę rysunku na -Zgodnie ze standardem-

Cześć wszystkim!

W ramach ewolucji standardów skórek oprogramowania w firmie zdałem sobie sprawę, że wczytywanie nowego standardu skórki nie jest niezawodne: nie wszystkie warstwy są obecne, a co gorsza, przypisania nie zawsze są właściwe.

Muszę więc zautomatyzować wiele rzeczy:

  1. Sprawdź istnienie każdej warstwy, w przeciwnym razie utwórz brakujące (niektóre mają niestandardowe kolory → trzeba ustawić kolor za pomocą kodu RGB

  2. Sprawdź warstwy przypisane do każdego elementu (wymiary, etykieta pozycji, oś środkowa, przekrój itp.) we właściwościach dokumentu

  3. Wymuś ustawienie domyślnej warstwy dokumentu na -Zgodnie ze standardem- (podczas otwierania warstwa domyślna jest ustawiona na -Brak-, a ja chcę ją zmienić na -Zgodnie ze standardem-).

  4. Ponowne przypisywanie elementów klipu do odpowiednich warstw

Zacząłem od ostatniego punktu, do którego szybko znalazłem na forum elementy, które mi pomogły, ale mimo to utknąłem:

Mój kod:

Dim swApp                       As SldWorks.SldWorks
Dim swModel                     As SldWorks.ModelDoc2
Dim swLayerMgr                  As SldWorks.LayerMgr
Dim vLayerArr                   As Variant
Dim vLayer                      As Variant
Dim swLayer                     As SldWorks.Layer
Dim swDraw                      As SldWorks.DrawingDoc
Dim vSheets                 As Variant
Dim vSheet                  As Variant
Dim swView                      As SldWorks.View               
Dim swAnn                       As SldWorks.Annotation          
Dim swNote                      As SldWorks.Note                
Dim swDispDim                   As SldWorks.DisplayDimension
Dim swGtol                      As SldWorks.Gtol                
Dim swDatum                     As SldWorks.DatumTag           
Dim swAnnSFSymbol               As SldWorks.SFSymbol           
Dim swAnnWeldSymbol             As SldWorks.WeldSymbol          
Dim swCtrMark                   As SldWorks.CenterMark          
Dim swCenterLine                As SldWorks.Centerline          
Dim swTables                As Variant
Dim swTable                 As Variant

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
    MsgBox "Ouvrez et/ou activez une mise en plan."
    Exit Sub 
End If
If swModel.GetType <> swDocumentTypes_e.swDocDRAWING Then
    MsgBox "Ouvrez et/ou activez une mise en plan."
    Exit Sub 
End If

Set swDraw = swModel

vSheets = swDraw.GetSheetNames
For Each vSheet In vSheets
    swDraw.ActivateSheet vSheet

    Set swView = swDraw.GetFirstView

    Set swView = swView.GetNextView
    While Not swView Is Nothing

        Set swCtrMark = swView.GetFirstCenterMark
        While Not swCtrMark Is Nothing
            Set swAnn = swCtrMark.GetAnnotation
            swAnn.Layer = "Axes"
            Set swCtrMark = swCtrMark.GetNext
        Wend

        Set swCenterLine = swView.GetFirstCenterLine
        While Not swCenterLine Is Nothing
            Set swAnn = swCenterLine.GetAnnotation
            swAnn.Layer = "Axes"
            Set swCenterLine = swCenterLine.GetNext
        Wend

        Set swDatum = swView.GetFirstDatumTag
        While Not swDatum Is Nothing
            Set swAnn = swDatum.GetAnnotation
            swAnn.Layer = "Références"
            Set swDatum = swDatum.GetNext
        Wend

        Set swGtol = swView.GetFirstGTOL
        While Not swGtol Is Nothing
            Set swAnn = swGtol.GetAnnotation
            swAnn.Layer = "Cotes"
            Set swGtol = swGtol.GetNextGTOL
        Wend

        Set swAnnSFSymbol = swView.GetFirstSFSymbol
        While Not swAnnSFSymbol Is Nothing
            Set swAnn = swAnnSFSymbol.GetAnnotation
            swAnn.Layer = "État de surface"
            Set swAnnSFSymbol = swAnnSFSymbol.GetNext
        Wend

        Set swAnnWeldSymbol = swView.GetFirstWeldSymbol
        While Not swAnnWeldSymbol Is Nothing
            Set swAnn = swAnnWeldSymbol.GetAnnotation
            swAnn.Layer = "Soudures"
            Set swAnnWeldSymbol = swAnnWeldSymbol.GetNext
        Wend

        Set swDispDim = swView.GetFirstDisplayDimension5
        While Not swDispDim Is Nothing
            Set swAnn = swDispDim.GetAnnotation
            swAnn.Layer = "Cotes"
            Set swDispDim = swDispDim.GetNext5
        Wend

  
        Set swView = swView.GetNextView
    Wend
Next
swModel.ClearSelection2 True

Problemy /4:

  • Ustawienie swNote = swView.GetFirstNote pozwala mi wybrać notatki dołączone do widoków.
    Ale jak po kolei wybrać notatki dołączone do arkusza?

  • Który interfejs API wybrać etykiety pozycji?

  • Które interfejsy API wybrać linie i etykiety cięcia?

Problemy /3:

  • Próbowałem z swDraw.SetCurrentLayer("-Zgodnie ze standardem-"), ale -Zgodnie ze standardem- nie jest to naprawdę policzek... Nic się nie dzieje. Doszedłem do wniosku, że może jest przypisany do pierwszego indeksu na liście warstw, ale swDraw.SetCurrentLayer(0) też nie działa.
    Czy ktoś ma pomysł?

Co do pierwszych 2 punktów jeszcze nie zacząłem się do nich przyglądać, ale jeśli ktoś ma elementy, a może nawet kod, który pozwala na ich wykonanie to jestem zainteresowany!

Z góry dzięki!

Witam;
Aby przeglądać wszystkie notatki:
https://help.solidworks.com/2021/English/api/sldworksapi/Get_Views_and_Notes_Example_VB.htm

Z drugiej strony używam makra do rysunków, aby ponownie załadować standard ORAZ mapę bazową, co daje całkiem dobre wyniki...

Aby powiązać go z warunkiem:
filetype = swModel.GetType ' Podaje typ dokumentu otwartego za pomocą:0=swDocNONE; 1=swDocPART; 2=swDocASSEMBLY; 3=swDocRYSUNEK
Jeśli typ pliku = 3 To' Jeśli otwarty plik jest rysunkiem

Dim vSheetProps     As Variant
Dim nErrors         As Long
Dim nTemplatePath   As String
Dim swPaperWidth    As String
Dim swPaperHeight   As String


' Repertoire contenant les modeles des fonds de plans
Const sTemplatePath As String = "W:\Modeles_solidworks\Fonds_de_plans_2023" 'A ADAPTER :EMPLACEMENT DE VOS FOND DE PLAN PERSONNALISE

' Formats des differents fond de plans disponibles dans le Repertoire ci-dessous

Const A0HTemplateName As String = "A0H PERSO 2023.slddrt" 'A ADAPTER : VOTRE FOND DE PLAN PERSONNALISE
Const A1HTemplateName As String = "A1H PERSO 2023.slddrt"
Const A1VTemplateName As String = "A1V PERSO 2023.slddrt"
Const A2HTemplateName As String = "A2H PERSO 2023.slddrt"
Const A2VTemplateName As String = "A2V PERSO 2023.slddrt"
Const A3HTemplateName As String = "A3H PERSO 2023.slddrt"
Const A3VTemplateName As String = "A3V PERSO 2023.slddrt"
Const A4HTemplateName As String = "A4H PERSO 2023.slddrt"
Const A4VTemplateName As String = "A4V PERSO 2023.slddrt"

Sub Formats()

 Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim vSheetProps As Variant
   

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    Set swSheet = swDraw.GetCurrentSheet
    

        'swModel.ActivateSheet vSheetName
            Set swSheet = swModel.GetCurrentSheet
            vSheetProps = swSheet.GetProperties
            swPaperWidth = vSheetProps(5)
            swPaperHeight = vSheetProps(6)
        Select Case swPaperWidth & swPaperHeight ' Comparaison de la Longueur et de la Largeur du fond de plan present (Unité en Metres)
        
Case "1,189" & "0,841" ' Format A0H
        nTemplatePath = sTemplatePath & "\" & A0HTemplateName
        boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A0.sldstd")
       
Case "0,841" & "0,594" ' Format A1H
        nTemplatePath = sTemplatePath & "\" & A1HTemplateName
        boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A1.sldstd")
        
Case "0,594" & "0,841" ' Format A1V
        nTemplatePath = sTemplatePath & "\" & A1VTemplateName
        boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A1.sldstd")

Case "0,594" & "0,42" ' Format A2H
        nTemplatePath = sTemplatePath & "\" & A2HTemplateName
        boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A2.sldstd")

Case "0,42" & "0,594" ' Format A2V
        nTemplatePath = sTemplatePath & "\" & A2VTemplateName
        boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A2.sldstd")

Case "0,42" & "0,297" ' Format A3H
        nTemplatePath = sTemplatePath & "\" & A3HTemplateName
        boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A3.sldstd")

Case "0,297" & "0,42" ' Format A3V
        nTemplatePath = sTemplatePath & "\" & A3VTemplateName
        boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A3.sldstd")

Case "0,297" & "0,21" ' Format A4H
        nTemplatePath = sTemplatePath & "\" & A4HTemplateName
        boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A4.sldstd")

Case "0,21" & "0,297" ' Format A4V
        nTemplatePath = sTemplatePath & "\" & A4VTemplateName
        boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A4.sldstd")

        Case Else
        nTemplatePath = sTemplatePath & "\" & A2HTemplateName 'Format par défaut si le fond de plan present n'est pas dans la liste ci-dessus
        boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A2.sldstd")
        
End Select
        
   'On Supprime le fond de plan initial
    swModel.SetupSheet5 swSheet.GetName, swDwgPapersUserDefined, swDwgTemplateNone, vSheetProps(2), vSheetProps(3), vSheetProps(4), "", vSheetProps(5), vSheetProps(6), "Default", True
    
    'On Recharge le nouveau fond de plan
    swModel.SetupSheet5 swSheet.GetName, swDwgPapersUserDefined, swDwgTemplateCustom, vSheetProps(2), vSheetProps(3), vSheetProps(4), nTemplatePath, vSheetProps(5), vSheetProps(6), "Default", True
    
 Call table_rev
        
    swModel.ViewZoomtofit2
    
End Sub

2 polubienia

Witam

Taka sama odpowiedź jak @Maclane.
Aby odpowiedzieć jasno,

Nie ma potrzeby dodawania i ustawiania warstw, brakujące wraz z ich ustawieniami kolorów są importowane podczas zmiany tła. Z drugiej strony, jeśli istnieją warstwy o tych samych nazwach, które zostały zmienione w ustawieniach kolorów, będziesz musiał ustawić kolor.
Inną kwestią, jeśli w starych warstwach jest więcej warstw, będziesz musiał je również wyczyścić i zobaczyć, aby przenieść to, co by się na nich znajdowało, na inną warstwę przed usunięciem warstwy.
Jeśli chodzi o etykiety widoku i linie kadrowania, gdy tylko zmienisz standard zawijania, zostanie on zastosowany do dokumentu bez konieczności zaznaczania obiektów.

Na koniec mam kawałek kodu, który robi trochę tego wszystkiego. Mam też inny fragment kodu, który pozwoliłby Ci skanować wszystkie typy obiektów i prawdopodobnie pobrać ich warstwę (nie używam go do tego w pierwszej kolejności).
Kod @Maclane to już dobry początek.
W kodzie, aby zeskanować mapę bazową, musisz pozostać w pierwszej " pętli " związanej z:

Set swView = swDraw.GetFirstView

Zasadniczo ta linia kodu polega na wejściu w tło planu, jeśli napiszesz tylko na końcu Set swView = swView.GetNextView, przejdziesz do skanu widoków planu.
Musisz więc zapętlić mapę bazową, aby odzyskać wszystko, co się tam znajduje, i zastosować żądane leczenie.
Aby zastosować do warstwy " Zgodnie ze standardem ", nie widziałem metody w API i wydaje mi się, że na 2022 roku trochę się psuje (kolejny temat pamięci na forum w ręcznej aplikacji Edycja: Przywracanie /reaktywacja warstwy " Zgodnie ze standardem " - Plan 2D / Rysunek - forum myCAD (visiativ.com)).

2 polubienia

Re, nieprzetestowany kod, ale powinien zrobić robotę myślę, że:

Dim swApp                       As SldWorks.SldWorks
Dim swModel                     As SldWorks.ModelDoc2
Dim swLayerMgr                  As SldWorks.LayerMgr
Dim vLayerArr                   As Variant
Dim vLayer                      As Variant
Dim swLayer                     As SldWorks.Layer
Dim swDraw                      As SldWorks.DrawingDoc
Dim vSheets                     As Variant
Dim vSheet                      As Variant
Dim swView                      As SldWorks.View
Dim swAnn                       As SldWorks.Annotation
Dim swNote                      As SldWorks.Note
Dim swTables                    As Variant
Dim swTable                     As Variant
Dim vSheetProps                 As Variant
Dim nErrors                     As Long
Dim nTemplatePath               As String
Dim swPaperWidth                As String
Dim swPaperHeight               As String
Dim Count                       As Integer
Dim i                           As Long
Dim j                           As Long

' Repertoire contenant les modeles des fonds de plans
Const sTemplatePath As String = "W:\Modeles_solidworks\Fonds_de_plans_2023" 'A ADAPTER :EMPLACEMENT DE VOS FOND DE PLAN PERSONNALISE

' Formats des differents fond de plans disponibles dans le Repertoire ci-dessous

Const A0HTemplateName As String = "A0H PERSO 2023.slddrt" 'A ADAPTER : VOTRE FOND DE PLAN PERSONNALISE
Const A1HTemplateName As String = "A1H PERSO 2023.slddrt"
Const A1VTemplateName As String = "A1V PERSO 2023.slddrt"
Const A2HTemplateName As String = "A2H PERSO 2023.slddrt"
Const A2VTemplateName As String = "A2V PERSO 2023.slddrt"
Const A3HTemplateName As String = "A3H PERSO 2023.slddrt"
Const A3VTemplateName As String = "A3V PERSO 2023.slddrt"
Const A4HTemplateName As String = "A4H PERSO 2023.slddrt"
Const A4VTemplateName As String = "A4V PERSO 2023.slddrt"

Sub Main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
    MsgBox "Ouvrez et/ou activez une mise en plan."
    Exit Sub
End If
If swModel.GetType <> swDocumentTypes_e.swDocDRAWING Then
    MsgBox "Ouvrez et/ou activez une mise en plan."
    Exit Sub
End If

Set swDraw = swModel
If swDraw.GetSheetCount > 1 Then
    vSheets = swDraw.GetSheetNames
    For j = 0 To UBound(vSheets)
        boolstatus = swDraw.ActivateSheet(vSheets(j))
        Call ChangeSheetFormat
        ProcessDrawing swApp, swDraw
        Call PurgeCalques
    Next j
    boolstatus = swDraw.ActivateSheet(vSheets(0))
Else
    Call ChangeSheetFormat
    ProcessDrawing swApp, swDraw
    Call PurgeCalques
End If
End Sub

Sub ChangeSheetFormat()
   
Set swSheet = swDraw.GetCurrentSheet
vSheetProps = swSheet.GetProperties
swPaperWidth = vSheetProps(5)
swPaperHeight = vSheetProps(6)
Select Case swPaperWidth & swPaperHeight ' Comparaison de la Longueur et de la Largeur du fond de plan present (Unité en Metres)
       
Case "1,189" & "0,841" ' Format A0H
       nTemplatePath = sTemplatePath & "\" & A0HTemplateName
       boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A0.sldstd")
      
Case "0,841" & "0,594" ' Format A1H
       nTemplatePath = sTemplatePath & "\" & A1HTemplateName
       boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A1.sldstd")
       
Case "0,594" & "0,841" ' Format A1V
       nTemplatePath = sTemplatePath & "\" & A1VTemplateName
       boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A1.sldstd")

Case "0,594" & "0,42" ' Format A2H
       nTemplatePath = sTemplatePath & "\" & A2HTemplateName
       boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A2.sldstd")

Case "0,42" & "0,594" ' Format A2V
       nTemplatePath = sTemplatePath & "\" & A2VTemplateName
       boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A2.sldstd")

Case "0,42" & "0,297" ' Format A3H
       nTemplatePath = sTemplatePath & "\" & A3HTemplateName
       boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A3.sldstd")

Case "0,297" & "0,42" ' Format A3V
       nTemplatePath = sTemplatePath & "\" & A3VTemplateName
       boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A3.sldstd")

Case "0,297" & "0,21" ' Format A4H
       nTemplatePath = sTemplatePath & "\" & A4HTemplateName
       boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A4.sldstd")

Case "0,21" & "0,297" ' Format A4V
       nTemplatePath = sTemplatePath & "\" & A4VTemplateName
       boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A4.sldstd")

       Case Else
       nTemplatePath = sTemplatePath & "\" & A2HTemplateName 'Format par défaut si le fond de plan present n'est pas dans la liste ci-dessus
       boolstatus = swModel.Extension.LoadDraftingStandard("W:\Modeles_solidworks\Normes_de_mise_en_plans\ISO-PERSO_A2.sldstd")
       
End Select
       
  'On Supprime le fond de plan initial
   swModel.SetupSheet5 swSheet.GetName, swDwgPapersUserDefined, swDwgTemplateNone, vSheetProps(2), vSheetProps(3), vSheetProps(4), "", vSheetProps(5), vSheetProps(6), "Default", True
   
   'On Recharge le nouveau fond de plan
   swModel.SetupSheet5 swSheet.GetName, swDwgPapersUserDefined, swDwgTemplateCustom, vSheetProps(2), vSheetProps(3), vSheetProps(4), nTemplatePath, vSheetProps(5), vSheetProps(6), "Default", True
   
swModel.ForceRebuild3 (False)
swModel.ViewZoomtofit2
   
End Sub
Sub ProcessDrawing(swApp As SldWorks.SldWorks, swDraw As SldWorks.DrawingDoc)

    Set swView = swDraw.GetFirstView
    Do While Not Nothing Is swView
        Set swAnn = swView.GetFirstAnnotation3
        Do While Not Nothing Is swAnn
            ProcessAnnotation swApp, swAnn
            Set swAnn = swAnn.GetNext3
        Loop
        Set swView = swView.GetNextView
    Loop
End Sub
Sub ProcessAnnotation(swApp As SldWorks.SldWorks, swAnn As SldWorks.Annotation)
    Dim swAnnCThread                As SldWorks.CThread
    Dim swAnnDatumTag               As SldWorks.DatumTag
    Dim swAnnDatumTargetSym         As SldWorks.DatumTargetSym
    Dim swAnnDisplayDimension       As SldWorks.DisplayDimension
    Dim swAnnGTol                   As SldWorks.Gtol
    Dim swAnnNote                   As SldWorks.Note
    Dim swAnnSFSymbol               As SldWorks.SFSymbol
    Dim swAnnWeldSymbol             As SldWorks.WeldSymbol
    Dim swAnnCustomSymbol           As SldWorks.CustomSymbol
    Dim swAnnDowelSym               As SldWorks.DowelSymbol
    Dim swAnnLeader                 As SldWorks.MultiJogLeader
    Dim swAnnCenterMarkSym          As SldWorks.CenterMark
    Dim swAnnTable                  As SldWorks.TableAnnotation
    Dim swAnnCenterLine             As SldWorks.Centerline
    Dim swAnnDatumOrigin            As SldWorks.DatumOrigin
    Dim swDim                       As SldWorks.Dimension
    Dim swDimensionTolerance        As SldWorks.DimensionTolerance
    Dim idx                         As Long
    Dim params                      As Variant
    Dim arrSymbols                  As Variant
    Dim nNumCol                     As Long
    Dim nNumRow                     As Long
    Dim sTableText                  As String
    Dim sSurface                    As String
    Dim sIsIndNote                  As String
    Dim j                           As Long
    Dim sGtol                       As String
    Dim sWeldNote                   As String
    Dim TableAnchor                 As TableAnchor
    
   
    Select Case swAnn.GetType
        Case swCenterMarkSym
            Set swAnn = swAnnCenterMarkSym.GetAnnotation
            swAnn.Layer = "Axes"
        Case swCenterLine
            Set swAnn = swAnnCenterLine.GetAnnotation
            swAnn.Layer = "Axes"
        Case swDatumTag
            Set swAnn = swAnnDatumTag.GetAnnotation
            swAnn.Layer = "Références"
        Case swDisplayDimension
            Set swAnn = swDispDim.GetAnnotation
            swAnn.Layer = "Cotes"
        Case swGtol
            Set swAnn = swAnnGTol.GetAnnotation
            swAnn.Layer = "Cotes"
        Case swSFSymbol
            Set swAnn = swAnnSFSymbol.GetAnnotation
            swAnn.Layer = "État de surface"
        Case swWeldSymbol
            Set swAnn = swAnnWeldSymbol.GetAnnotation
            swAnn.Layer = "Soudures"
    End Select
End Sub
Sub PurgeCalques()

Count = swLayerMgr.GetCount
vLayer = swLayerMgr.GetLayerList
For i = 0 To Count - 1
If vLayer(i) = "CARTOUCHE" Or _
vLayer(i) = "TEXTE FIXE CARTOUCHE" Or _
vLayer(i) = "Champs paramétrés" Or _
vLayer(i) = "cotation cartouche" Or _
vLayer(i) = "Consultation" Or _
vLayer(i) = "Cartouche de signature" Or _
vLayer(i) = "Indice()" Then
Else
swLayerMgr.DeleteLayer (vLayer(i))
End If
Next i
End Sub

2 polubienia

Dziękuję za odpowiedzi. Twoje wyjaśnienia pomogły mi lepiej zrozumieć kilka rzeczy.

Automatyczne przeładowywanie mapy bazowej za każdym razem, gdy dokument rysunkowy jest otwierany podczas edycji, jest już od dłuższego czasu obecne w firmie (dodatek opracowany przez serwis IT), ale nie jestem fanem, podobnie jak producenci: resetuje on punkty kontrolne. I z jakiegoś powodu wszystkie warstwy w nowym szablonie dokumentu (.drwdot i .slddrt), zawsze mam warstwę, która jest zapomniana, i to nie zawsze taka sama! Stąd moja potrzeba sprawdzenia istnienia każdej warstwy...

Jeśli obiekty zostały utworzone w warstwie " -Brak- ", zmiana standardu zawijania nie ma wpływu na żadne obiekty; dlatego potrzebuję kodu do przetwarzania obiektów, a zwłaszcza do przedefiniowania domyślnej warstwy na " -Zgodnie ze standardem ", ale dla tego ostatniego punktu nie mogłem nic znaleźć.

Udało mi się uporać konkretnie z etykietami pozycji, sprawdzając styl bąbelków:

        Set swNote = swView.GetFirstNote
        While Not swNote Is Nothing
            Set swAnn = swNote.GetAnnotation
            If swAnn.GetSpecificAnnotation.GetBalloonStyle = swBS_SplitCirc Then swAnn.Layer = "Vues dérivées"                    
            Set swNote = swNote.GetNext
        Wend

Myślę też, że wymyśliłem, jak radzić sobie z liniami cięcia i przerywanymi liniami widzenia...

1 polubienie

Witam

Pominąłem fragment kodu, który aktualizuje ustawienia cięcia...
Jestem w fazie testów wydajnościowych na mojej stacji roboczej, gdy tylko odzyskam rękę, udostępniam fragment kodu

Jeśli to pomoże, niektóre ustawienia do zaktualizowania w szablonie dokumentu:

Sub ParamDraw()

'Paramètres vues en coupe
If swModelDocExt.GetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingSectionViewLineStyleDisplay, _
swUserPreferenceOption_e.swDetailingNoOptionSpecified) <> 0 Then
    bRet = swModelDocExt.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingSectionViewLineStyleDisplay, _
    swUserPreferenceOption_e.swDetailingNoOptionSpecified, 0)
End If

bRet = swModelDocExt.GetUserPreferenceToggle(swUserPreferenceToggle_e.swDetailingSectionViewLabels_PerStandard, _
swUserPreferenceOption_e.swDetailingNoOptionSpecified)
If bRet Then
    bRet = swModelDocExt.SetUserPreferenceToggle(swUserPreferenceToggle_e.swDetailingSectionViewLabels_PerStandard, _
    swUserPreferenceOption_e.swDetailingNoOptionSpecified, False)
End If
     
If swModelDocExt.GetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingSectionViewLabels_Name, swUserPreferenceOption_e.swDetailingNoOptionSpecified) <> swDetailingViewLabelsName_none Then
    bRet = swModelDocExt.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingSectionViewLabels_Name, swUserPreferenceOption_e.swDetailingNoOptionSpecified, swDetailingViewLabelsName_none)
End If
    
If swModelDocExt.GetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingSectionViewLabels_Scale, swUserPreferenceOption_e.swDetailingNoOptionSpecified) <> 3 Then
    bRet = swModelDocExt.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingSectionViewLabels_Scale, swUserPreferenceOption_e.swDetailingNoOptionSpecified, 3)
    bRet = swModelDocExt.SetUserPreferenceString(swUserPreferenceStringValue_e.swDetailingSectionViewLabels_CustomScale, swUserPreferenceOption_e.swDetailingSectionView, "SCALE")
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Paramètres vues de détail

bRet = swModelDocExt.GetUserPreferenceToggle(swUserPreferenceToggle_e.swDetailingDetailViewLabels_PerStandard, _
swUserPreferenceOption_e.swDetailingDetailView)
If bRet Then
    bRet = swModelDocExt.SetUserPreferenceToggle(swUserPreferenceToggle_e.swDetailingDetailViewLabels_PerStandard, _
swUserPreferenceOption_e.swDetailingDetailView, False)
End If
     
If swModelDocExt.GetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingDetailViewLabels_Name, swUserPreferenceOption_e.swDetailingDetailView) <> swDetailingViewLabelsName_custom Then
    bRet = swModelDocExt.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingDetailViewLabels_Name, swUserPreferenceOption_e.swDetailingDetailView, swDetailingViewLabelsName_e.swDetailingViewLabelsName_custom)
    bRet = swModelDocExt.SetUserPreferenceString(swUserPreferenceStringValue_e.swDetailingDetailViewLabels_CustomName, swUserPreferenceOption_e.swDetailingDetailView, "DETAIL")
End If
    
If swModelDocExt.GetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingDetailViewLabels_Scale, swUserPreferenceOption_e.swDetailingDetailView) <> 3 Then
    bRet = swModelDocExt.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingDetailViewLabels_Scale, swUserPreferenceOption_e.swDetailingDetailView, swDetailingViewLabelsScale_e.swDetailingViewLabelsScale_SCALEcustom)
    bRet = swModelDocExt.SetUserPreferenceString(swUserPreferenceStringValue_e.swDetailingDetailViewLabels_CustomScale, swUserPreferenceOption_e.swDetailingDetailView, "SCALE")
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Paramètres vues auxiliaires

bRet = swModelDocExt.GetUserPreferenceToggle(swUserPreferenceToggle_e.swDetailingAuxViewLabels_PerStandard, _
swUserPreferenceOption_e.swDetailingNoOptionSpecified)
If bRet Then
    bRet = swModelDocExt.SetUserPreferenceToggle(swUserPreferenceToggle_e.swDetailingAuxViewLabels_PerStandard, _
swUserPreferenceOption_e.swDetailingNoOptionSpecified, False)
End If
     
If swModelDocExt.GetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingAuxViewLabels_Name, swUserPreferenceOption_e.swDetailingNoOptionSpecified) <> swDetailingViewLabelsName_custom Then
    bRet = swModelDocExt.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingAuxViewLabels_Name, swUserPreferenceOption_e.swDetailingNoOptionSpecified, swDetailingViewLabelsName_e.swDetailingViewLabelsName_custom)
    bRet = swModelDocExt.SetUserPreferenceString(swUserPreferenceStringValue_e.swDetailingAuxViewLabels_CustomName, swUserPreferenceOption_e.swDetailingAuxiliaryView, "VIEW")
End If
    
If swModelDocExt.GetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingAuxViewLabels_Scale, swUserPreferenceOption_e.swDetailingNoOptionSpecified) <> 3 Then
    bRet = swModelDocExt.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swDetailingAuxViewLabels_Scale, swUserPreferenceOption_e.swDetailingNoOptionSpecified, swDetailingViewLabelsScale_e.swDetailingViewLabelsScale_SCALEcustom)
    bRet = swModelDocExt.SetUserPreferenceString(swUserPreferenceStringValue_e.swDetailingAuxViewLabels_CustomScale, swUserPreferenceOption_e.swDetailingAuxiliaryView, "SCALE")
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Paramètre mise à jour auto nomenclature

bRet = swModelDocExt.GetUserPreferenceToggle(swUserPreferenceToggle_e.swDetailingAutoUpdateBOM, swUserPreferenceOption_e.swDetailingNoOptionSpecified)
If bRet = False Then
    bRet = swModelDocExt.SetUserPreferenceToggle(swUserPreferenceToggle_e.swDetailingAutoUpdateBOM, swUserPreferenceOption_e.swDetailingNoOptionSpecified, True)
End If

End Sub

Aby przetworzyć linie cięcia, napisałem ten kod:

Dim swApp                       As SldWorks.SldWorks
Dim swModel                     As SldWorks.ModelDoc2
Dim vSheets                 As Variant
Dim vSheet                  As Variant
Dim swView                      As SldWorks.View 
Dim swSectionLines            As Variant
Dim swSectionLine             As Variant
Dim swSectionLineAnn              As SldWorks.DrSection

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
    MsgBox "Ouvrez et/ou activez une mise en plan."
    Exit Sub
End If
If swModel.GetType <> swDocumentTypes_e.swDocDRAWING Then
    MsgBox "Ouvrez et/ou activez une mise en plan."
    Exit Sub
End If

Set swDraw = swModel
vSheets = swDraw.GetSheetNames
For Each vSheet In vSheets
    swDraw.ActivateSheet vSheet

    Set swView = swDraw.GetFirstView 
While Not swView Is Nothing
    
If swView.GetSectionLineCount2(1) > 0 Then
    Set swSectionLines = swView.GetSectionLines
        For Each swSectionLine In swSectionLines
            Set swBreakLineAnn = swSectionLine
            swSectionLineAnn.Layer = "Vues dérivées"
        Next
    Else: End If
        Set swView = swView.GetNextView
    Wend
Next
swModel.ClearSelection2 True

Ale to nie działa. Mam błąd "Niezgodność typu" na

    Set swSectionLines = swView.GetSectionLines

Kto ma pomysł?

Nie miałem czasu na szczegółowe przyjrzenie się i wątpię, że będę miał czas w tym tygodniu, ale mam wrażenie, że nie ma możliwości zrobienia Zestawu do modyfikacji warstwy na tej funkcji.
Jeśli chodzi o sam problem z niekompatybilnością, myślę, że brakuje parametrów lub funkcji do wywołania wcześniej (na przykład GetSectionLineInfo).

1 polubienie

Dzięki temu udało mi się przebić przez linie cięcia i widoki szczegółów.

Mój kod:


Function ChangeLayer(TypeElement As Integer)
    Dim swApp                       As SldWorks.SldWorks
    Dim swModel                     As SldWorks.ModelDoc2
    Dim swLayerMgr                  As SldWorks.LayerMgr
    Dim vLayerArr                   As Variant
    Dim vLayer                      As Variant
    Dim swLayer                     As SldWorks.Layer
    Dim swDraw                      As SldWorks.DrawingDoc
    Dim vSheets                 As Variant
    Dim vSheet                  As Variant
    Dim MySheet                 As Variant
    Dim swSheet                     As SldWorks.Sheet
    Dim swView                      As SldWorks.View                '//vue de mise en plan//'
    Dim vSectionLines           As Variant
    Dim vSectionLine            As Variant
    Dim swSectionLine              As SldWorks.DrSection
    Dim vDetailCircles            As Variant
    Dim vDetailCircle             As Variant
    Dim swDetailCircle                As SldWorks.DetailCircle
    Dim ret                     As Boolean

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

  
    Set swDraw = swApp.ActiveDoc
    vSheets = swDraw.GetSheetNames
    For Each vSheet In vSheets
        swDraw.ActivateSheet vSheet                                 '//Pour chaque feuille de la mise en plan//'
        Set swView = swDraw.GetFirstView '//la feuille (fond de plan inclu)//'
        Set swView = swView.GetNextView '//la première vue//'

                    '//Traitement des vues de détail//'
                    vDetailCircles = swView.GetDetailCircles
                    If Not IsEmpty(vDetailCircles) Then
                        For Each vDetailCircle In vDetailCircles
                            Set swDetailCircle = vDetailCircle
                            swDetailCircle.Layer = "VUE DÉRIVÉE"
                        Next
                    End If

                    '//Traitement des vues en coupe//'
                    vSectionLines = swView.GetSectionLines
                    If Not IsEmpty(vSectionLines) Then
                        For Each vSectionLine In vSectionLines
                            Set swSectionLine = vSectionLine
                            swSectionLine.Layer = "COUPE"
                        Next
                    End If
                    '//Reconstruit affichage de la vue//'
                    ret = swDraw.Rebuild(swRebuildOptions_e.swCurrentSheetDisp)
 Set swView = swView.GetNextView
            Wend
    Next
    swModel.ClearSelection2 True
    swModel.ViewZoomtofit2          '//zoom au mieux sur la feuille//'
    
End Function

I niestety dostałem potwierdzenie, że nie ma możliwości ustawienia domyślnej warstwy dokumentu na -Zgodnie ze standardem- ponieważ nie ma dostępnego API. - Dam sobie z tym radę!

Mój problem polega teraz na tym, że mam kilka standardów skórki do zarządzania i muszę określić, który z nich jest załadowany, aby przypisać lub nie warstwę do różnych elementów.

Jeśli ktoś ma już ten kawałek kodu, jestem za tym!

Witam
Potrzebujesz tego fragmentu kodu:

Dim vDSNames                As Variant
Dim swModelDocExt           As ModelDocExtension

Set swModelDocExt = swModel.Extension
vDSNames = swModelDocExt.GetDraftingStandardNames

VDSNames będzie zawierał wszystkie standardy skórek dostępne w menu rozwijanym.
Aby dowiedzieć się, który z nich jest stosowany:

Dim sNorm as String
sNorm = swModelDocExt.GetUserPreferenceString(SwConst.swDetailingDimensionStandardName, SwConst.swDetailingNoOptionSpecified)

I na koniec, aby zastosować nowy model:

bRet = swModelDocExt.LoadDraftingStandard("xxx") 'Mettre le nom de la norme d'habillage souhaitée
2 polubienia

Wielkie podziękowania dla Was @Cyril_f i @Maclane !
Z twoją pomocą zbliżam się do końca tego, co muszę zrobić.

Na szczycie!

2 polubienia