Changer type projection plans en lot

Bonjour,

Je bute sur un problème. Dans l’optique de normaliser des fichiers de mise en plan issus d'anciennes études pour mon client, je cherche à remettre tous les plans en projection de type "europe", car malheureusement, pour une raison que j'ignore certains plans sont en projection USA.

Il s'agit de faire cette opération pour chaque projet, car nous partons presque toujours d'anciennes études.

J'utilise déjà Integration de MyCadTools pour réaliser pas mal d'opérations de normalisation, et j'ai essayé de changer l'option du document " swDrawingProjectionType " en mettant la valeur à 1, qui correspond au type de projection "frist angle" (europe), voir la page de l'aide API : https://help.solidworks.com/2021/English/api/swconst/SolidWorks.Interop.swconst~SolidWorks.Interop.swconst.swDrawingProjectionType_e.html

Malheureusement cela ne semble pas fonctionner, et le problème vient peut être du fait que ce n'est pas vraiment une option liée au document, mais à la feuille ...

Est-ce qu'une bonne âme aurait une solution de contournement, éventuellement une macro que je pourrais faire exécuter à Integration ?

Merci par avance !

Bonne journée


capture_decran_2022-09-08_105908.png

Avec copie option possibilité de copier les options d'un document sur un autre.

Tu convertie un plan manuellement et tu t'en sert pour copier les options sur un autre pour voir si cela fonctionne.

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

Ou sinon dans intégration tu modifie la norme d'habillage par une que tu sauvegarde d'un plan déjà modifié.

 

Ou sinon changer le fond de plan par un autre déjà modifié. Via intégration ou au besoin macro ci-jointe (il faut modifier le chemin des fonds de plan) a tester sur un plan puis via + intégration pour lancer la macro sur chaque fond de plan.

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

 

Merci beaucoup sbadenis,

Je viens d'essayer avec CopyOption, cela ne fonctionne pas sur cette option de type de projection.

Dans ma procédure je modifie déjà le fond de plan, et la norme d'habillage, (via Integration) mais cela n'a aucun effet sur le type de projection non plus.

Tout cela paraît logique dans le sens ou ce paramètre n'est ni lié au fond de plan, ni aux options du document, ni à la norme d'habillage, mais bien spécifiquement à chaque feuille d'un .slddrw.

Je pense donc que la seule solution serait une macro qui pourrait changer ce paramètre récursivement pour chaque feuille. On pourrait ensuite envisager d'executer la macro via Integration. Malheureusement, mes compétences en macro sont bien trop faibles pour cela ...

Après essai ma solution avec la macro fonctionne parfaitement pour changer le fond de plan par un avec projection Europe.

Par contre les vues restes mal placé il faut les replacé manuellement du bon côté comme quand on fait la manip manuellement en changeant le type de projection.

Donc pour moi le problème est plus compliqué que prévu et difficile de l'automatiser. Je crains qu'une intervention humaine soit obligatoire même si tu décide d'utiliser ma méthode pour le changement de projection (via ma macro pour changement de fonds de plan)

Pour ma macro ci-joint la partie à modifier avec les chemins de template (fond de plan pré-enregistré)

2 « J'aime »

Merci sbadenis, effectivement ça marche nickel avec cette macro. Je n'avais pas regardé de près le code, et effectivement, cette méthode ne fait pas que changer de fond de plan, mais aussi force le rechargement (utile lorsque nom de fichier est identique), et redéfini aussi toutes les propriétés liées à la feuille, dont le type de projection.

Par contre j'ai un peu galéré parce que j'avais le message d'erreur " Le fond de plan ne correspond à aucune trame connue", et je ne comprenais pas d'où venait le soucis. En fouillant un peu j'ai compris que la macro teste le format A4 en vertical et non en horizontal :

If vSheetProps(0) = "7"

Il faut donc remplacer 7 par 6 pour tester le format A4H. Ou rajouter une condition.

Je l'ai intégrée dans mon processus Integration, et ça fait le job.

Par contre, c'est vrai qu'il faudra toujours déplacer les vues à la main après coup ... mais franchement c'est déjà bien de savoir que tous mes plans seront avec le bon type de projection à la base. De toute façon je les passe tous en revue un par un après coup ..

Donc merci beaucoup de t'être penché dessus.

1 « J'aime »