Zmienianie typu ujęć projekcyjnych w partii

Witam

Natknąłem się na problem. W celu ujednolicenia plików rysunkowych ze starych opracowań dla mojego klienta, staram się umieścić wszystkie plany z powrotem w odwzorowaniu typu "europejskiego", ponieważ niestety z jakiegoś nieznanego mi powodu niektóre plany są w odwzorowaniu amerykańskim.

Chodzi o to, aby robić to dla każdego projektu, ponieważ prawie zawsze zaczynamy od starych badań.

Używam już integracji MyCadTools do wykonywania wielu operacji normalizacyjnych i próbowałem zmienić opcję dokumentu " swDrawingProjectionType " na 1, co odpowiada typowi projekcji "pierwszy kąt" (europa), zobacz stronę pomocy API: https://help.solidworks.com/2021/English/api/swconst/SolidWorks.Interop.swconst~SolidWorks.Interop.swconst.swDrawingProjectionType_e.html

Niestety wydaje się, że to nie działa, a problem może wynikać z faktu, że tak naprawdę nie jest to opcja związana z dokumentem, ale z arkuszem...

Czy dobra dusza ma obejście, być może makro, które mogę uruchomić integrację?

Z góry dziękujemy!

Miłego dnia


capture_decran_2022-09-08_105908.png

Z opcją kopiowania, możliwość kopiowania opcji z jednego dokumentu do drugiego.

Plan jest konwertowany ręcznie i używany do kopiowania opcji do innego, aby sprawdzić, czy działa.

https://help.visiativ.com/mycadtools/2021/fr/CopyOptions5.html

Albo w integracji modyfikujesz standard ubierania się na taki, który oszczędzasz z już zmodyfikowanego planu.

 

Lub zmień mapę tła na inną, która została już zmodyfikowana. Poprzez integrację lub w razie potrzeby dołączone makro (należy zmodyfikować ścieżkę map bazowych) do przetestowania na planie, a następnie poprzez + integrację, aby uruchomić makro na każdej mapie bazowej.

Option Explicit
'Site avec exemple: https://www.lynkoa.com/forum/mises-en-plan/modifier-une-note-sur-un-fond-de-plan-solidworks-avec-une-macro
Public Enum swDocumentTypes_e
    swDocNONE = 0       ' Used to be TYPE_NONE

    swDocPART = 1       ' Used to be TYPE_PART

    swDocASSEMBLY = 2   ' Used to be TYPE_ASSEMBLY

    swDocDRAWING = 3    ' Used to be TYPE_DRAWING
End Enum

Dim swSheet         As SldWorks.Sheet
Dim swApp           As Object
Dim swModel         As SldWorks.ModelDoc2
Dim swDraw          As SldWorks.DrawingDoc
Dim swModelDocExt   As ModelDocExtension
Dim sTemplate       As String
Dim stemplatepath   As String
Dim Count           As Integer
Dim vSheetNameArr   As Variant
Dim vSheetName      As Variant
Dim vSheetProps     As Variant
Dim bRet            As Boolean
Dim tolerie         As Boolean
Dim swView          As SldWorks.View
Dim userName        As String
Dim cDirTemplate    As String
Dim cTemplateA4     As String
Dim cTemplateA4_Laser As String
Dim cTemplateA3     As String
Dim cTemplateA2     As String
Dim cTemplateA1     As String
Dim cTemplateA0     As String
Dim cTemplateA0plus As String







Sub main()
'Variable à remplacer lors d'un changement de fond de plan
'Constantes à remplacer lors de changement de fond de plan
cDirTemplate = "U:\Entreprise\Service BE\1-Commun service\Solidworks\Configuration\Modèle de documents\Modèle SW 2020\Fond de plan C\" 'Mettre le chemin d'accès aux fonds de plans sous ce format: C:\xxx\xxx\
cTemplateA4 = "a4-c.slddrt" 'A renommer si vos templates s'appelle autrement
cTemplateA4_Laser = "a4-DECOUPE-c.slddrt"
cTemplateA3 = "a3-c.slddrt"
cTemplateA2 = "a2-c.slddrt"
cTemplateA1 = "a1-c.slddrt"
cTemplateA0 = "A0-c.slddrt"
cTemplateA0plus = "A0+-c.slddrt"



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

If swModel Is Nothing Then
    MsgBox ("Pas de document ouvert")
    Else
        If swModel.GetType <> 3 Then
            MsgBox ("Il ne s'agît pas d'une mise en plan")
        Else
        Set swDraw = swModel
                Set swModelDocExt = swModel.Extension

        vSheetNameArr = swDraw.GetSheetNames
                For Each vSheetName In vSheetNameArr
                Debug.Print vSheetName
                
                        bRet = swDraw.ActivateSheet(vSheetName): Debug.Assert bRet
                        Set swSheet = swDraw.GetCurrentSheet
                        
                        'Ajout SD test nom template pas utile dans la macro (pour version future?):
                        Set swSheet = swDraw.GetCurrentSheet
                        sTemplate = Mid(swSheet.GetTemplateName, InStrRev(swSheet.GetTemplateName, "\") + 1)
                        Debug.Print sTemplate
                        
                        Set swView = swDraw.GetFirstView
                        Set swView = swView.GetNextView
                        'On récupère le nom de la config de la vue
                        Debug.Print "Nom de la vue" & swView.Name
                        Debug.Print "Configuration" & swView.ReferencedConfiguration
                        
                        
                        
                        vSheetProps = swSheet.GetProperties
                        Debug.Print "vSheetProps(0)=" & vSheetProps(0)
                        If vSheetProps(0) = "7" And swView.ReferencedConfiguration Like "*FLAT-PATTERN" Then 'A4
                            stemplatepath = cDirTemplate & cTemplateA3
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            stemplatepath = cDirTemplate & cTemplateA4_Laser
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            swModel.ForceRebuild3 (False)
                        ElseIf vSheetProps(0) = "7" Then 'A4
                            stemplatepath = cDirTemplate & cTemplateA3
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            stemplatepath = cDirTemplate & cTemplateA4
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            swModel.ForceRebuild3 (False) 'A2
                        ElseIf vSheetProps(0) = "8" Then 'A3
                            stemplatepath = cDirTemplate & cTemplateA4
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            stemplatepath = cDirTemplate & cTemplateA3
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            swModel.ForceRebuild3 (False) 'A2
                        ElseIf vSheetProps(0) = "9" Then
                            stemplatepath = cDirTemplate & cTemplateA4
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            stemplatepath = cDirTemplate & cTemplateA2
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            swModel.ForceRebuild3 (False)
                        ElseIf vSheetProps(0) = "10" Then 'A1
                            stemplatepath = cDirTemplate & cTemplateA4
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            stemplatepath = cDirTemplate & cTemplateA1
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            swModel.ForceRebuild3 (False)
                        ElseIf vSheetProps(0) = "11" Then 'A0
                            stemplatepath = cDirTemplate & cTemplateA4
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            stemplatepath = cDirTemplate & cTemplateA0
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            swModel.ForceRebuild3 (False)
                        ElseIf vSheetProps(0) = "11" Then 'A0+
                            stemplatepath = cDirTemplate & cTemplateA4
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            stemplatepath = cDirTemplate & cTemplateA0plus
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            swModel.ForceRebuild3 (False)
            ElseIf vSheetProps(0) <> "7" Then 'Pour les formats un peu exotiques non gérés
                            If vSheetProps(0) <> "8" Then
                            If vSheetProps(0) <> "9" Then
                            If vSheetProps(0) <> "10" Then
                            If vSheetProps(0) <> "11" Then
                            If vSheetProps(0) <> "12" Then
                                MsgBox "Le fond de plan ne correspond à aucune trame connue" & vbCrLf & "Aucun changement appliqué"
                                Exit Sub
                            End If: End If: End If: End If: End If
                        End If
                    Next
    End If
End If
swModel.Save2 (True) 'Sauvegarde des changements
End Sub

 

Dziękuję bardzo sbadenis,

Właśnie próbowałem z CopyOption, nie działa to w tej opcji typu projekcji.

W mojej procedurze modyfikuję już mapę bazową i standard ubierania (poprzez integrację), ale nie ma to również wpływu na rodzaj rzutowania.

Wszystko to wydaje się logiczne w tym sensie, że ten parametr nie jest powiązany ani z linią bazową, ani z opcjami dokumentu, ani ze standardem zawijania, ale konkretnie z każdym arkuszem .slddrw.

Myślę więc, że jedynym rozwiązaniem byłoby makro, które mogłoby zmieniać to ustawienie rekurencyjnie dla każdego arkusza. Następnie można rozważyć uruchomienie makra za pomocą integracji. Niestety, moje umiejętności makro są na to zdecydowanie za słabe...

Po wypróbowaniu mojego rozwiązania z makrem działa idealnie, aby zmienić plan tła na taki z projekcją euro.

Z drugiej strony, widoki pozostają źle umieszczone, muszą być umieszczone ręcznie po prawej stronie, tak jak w przypadku ręcznej manipulacji poprzez zmianę rodzaju projekcji.

Dla mnie problem jest więc bardziej skomplikowany niż się spodziewałem i trudny do zautomatyzowania. Obawiam się, że interwencja człowieka jest obowiązkowa, nawet jeśli zdecydujesz się użyć mojej metody zmiany projekcji (za pomocą mojego makra do zmiany tła)

Do mojego makra dołączono część do modyfikacji ze ścieżkami szablonu (wstępnie zapisana mapa bazowa)

2 polubienia

Dziękuję sbadenis, rzeczywiście działa doskonale z tym makrem. Nie przyjrzałem się dokładnie kodowi i rzeczywiście, ta metoda nie tylko zmienia tło, ale także wymusza ponowne załadowanie (przydatne, gdy nazwa pliku jest identyczna), a także redefiniuje wszystkie właściwości związane z arkuszem, w tym typ projekcji.

Z drugiej strony trochę się męczyłem, ponieważ pojawił się komunikat o błędzie "Mapa tła nie odpowiada żadnej znanej ramce" i nie rozumiałem, skąd wziął się problem. Kopiąc trochę zrozumiałem, że makro testuje format A4 w pionie, a nie w poziomie:

If vSheetProps(0) = "7"

Musisz więc zamienić 7 na 6, aby przetestować format A4H. Lub dodaj warunek.

Wbudowałem go w mój proces integracji i spełnia swoje zadanie.

Z drugiej strony prawdą jest, że zawsze po fakcie będziesz musiał ręcznie przesuwać widoki... Ale szczerze mówiąc, dobrze jest już wiedzieć, że wszystkie moje ujęcia będą z odpowiednim rodzajem projekcji u podstawy. W każdym razie przeglądam je wszystkie po kolei po fakcie..

Dlatego bardzo dziękuję za przyjrzenie się tej sprawie.

1 polubienie