Verander type projectie-opnamen in batch

Hallo

Ik stuitte op een probleem. Om tekenbestanden van oude studies voor mijn klant te standaardiseren, probeer ik alle plannen terug te zetten in "Europese" projectie, want helaas, om de een of andere reden weet ik het niet, zijn sommige plannen in Amerikaanse projectie.

Het is een kwestie van dit voor elk project te doen, want we vertrekken bijna altijd vanuit oude studies.

Ik gebruik MyCadTools Integration al om veel normalisatiebewerkingen uit te voeren, en ik heb geprobeerd de optie van het document " swDrawingProjectionType " te wijzigen in 1, wat overeenkomt met het projectietype "eerste hoek" (europa), zie de API-helppagina: https://help.solidworks.com/2021/English/api/swconst/SolidWorks.Interop.swconst~SolidWorks.Interop.swconst.swDrawingProjectionType_e.html

Helaas lijkt het niet te werken, en het probleem kan voortkomen uit het feit dat het niet echt een optie is met betrekking tot het document, maar met het blad...

Heeft een goede ziel een workaround, eventueel een macro die ik Integration kan laten draaien?

Bij voorbaat dank!

Fijne dag


capture_decran_2022-09-08_105908.png

Met kopieeroptie, de mogelijkheid om opties van het ene document naar het andere te kopiëren.

U converteert een plan handmatig en gebruikt het om de opties naar een ander te kopiëren om te zien of het werkt.

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

Of anders wijzigt u bij de integratie de kledingstandaard door een die u opslaat uit een reeds gewijzigd plan.

 

Of verander anders de achtergrondkaart door een andere die al is gewijzigd. Via integratie of indien nodig macro bijgevoegd (je moet het pad van de basiskaarten wijzigen) om op een plan te testen en vervolgens via + integratie om de macro op elke basiskaart te starten.

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

 

Heel erg bedankt sbadenis,

Ik heb het net geprobeerd met CopyOption, het werkt niet op deze optie van het projectietype.

In mijn procedure wijzig ik al de basiskaart, en de aankleedstandaard, (via Integratie) maar dit heeft ook geen effect op het type projectie.

Dit alles lijkt logisch in die zin dat deze parameter niet gekoppeld is aan de baseline, noch aan de documentopties, noch aan de inpakstandaard, maar specifiek aan elk vel van een .slddrw.

Dus ik denk dat de enige oplossing een macro zou zijn die deze instelling recursief voor elk blad zou kunnen wijzigen. Je zou dan kunnen overwegen om de macro via Integratie uit te voeren. Helaas zijn mijn macrovaardigheden daar veel te zwak voor...

Na het proberen van mijn oplossing met de macro werkt perfect om de achtergrond plan te veranderen door een met Euro projectie.

Aan de andere kant blijven de weergaven slecht geplaatst, ze moeten handmatig aan de rechterkant worden geplaatst, zoals wanneer je de manipulatie handmatig uitvoert door het type projectie te wijzigen.

Dus voor mij is het probleem ingewikkelder dan verwacht en moeilijk om het te automatiseren. Ik ben bang dat menselijke tussenkomst verplicht is, zelfs als je besluit mijn methode te gebruiken voor de verandering van projectie (via mijn macro voor het wijzigen van de achtergrond)

Voor mijn macro bijgevoegd het deel te wijzigen met de sjabloonpaden (vooraf opgeslagen basiskaart)

2 likes

Bedankt Sbadenis, het werkt inderdaad perfect met deze macro. Ik had niet goed naar de code gekeken, en inderdaad, deze methode verandert niet alleen de achtergrond, maar dwingt ook het herladen af (handig als de bestandsnaam identiek is), en herdefinieert ook alle eigenschappen die verband houden met het blad, inclusief het type projectie.

Aan de andere kant worstelde ik een beetje omdat ik de foutmelding "De achtergrondkaart komt niet overeen met een bekend frame" kreeg en ik begreep niet waar het probleem vandaan kwam. Door een beetje te graven begreep ik dat de macro het A4-formaat verticaal test en niet horizontaal:

If vSheetProps(0) = "7"

Je moet dus 7 door 6 vervangen om het A4H-formaat te testen. Of voeg een voorwaarde toe.

Ik heb het ingebouwd in mijn integratieproces en het doet zijn werk.

Aan de andere kant is het waar dat je de weergaven achteraf altijd met de hand zult moeten verplaatsen ... Maar eerlijk gezegd is het al goed om te weten dat al mijn opnamen met het juiste type projectie aan de basis zullen zijn. Hoe dan ook, ik neem ze allemaal een voor een door..

Dus heel erg bedankt voor het onderzoeken.

1 like