Bonjour,
Avec la macro utilisée il te faut modifier les options d'export des formats dxf/dwg dans les options de solidworks :

Cordialement,
Bonjour,
Avec la macro utilisée il te faut modifier les options d'export des formats dxf/dwg dans les options de solidworks :

Cordialement,
Bonjour,
Le résultat est le même, j'ai toujours 4 fichiers au lie de 2
Contrairement aux PDF
Bonjour,
Pour ma part, je suis paramétré sur "Exporter toutes les feuilles dans un fichier" et je n'ai aucun problème.
Il n'y a que si le paramétrage est sur "Exporter toutes les feuilles dans des fichiers séparés" où l'export génère 4 fichiers.
Ce que j'ai pu constater également, c'est qu'il faut forcer le changement de paramétrage deux fois pour que ce soit pris en compte correctement (bug probable de SW2020).
SW n'avait pas pris en compte le paramètre "Exporter toutes les feuilles dans un fichier"
J'ai bien 2 fichiers avec la bonne syntaxe mais c'est la même feuille dans les 2, celle qui est "active" à l'écran.
En regardant la macro, il y a plusieurs fois "swExpPdfData" et "SldWorks.ExportPdfData"
et une ligne outFile = outFile & IIf(INCLUDE_DRAWING_NAME, drawName & "_", "") & sheetName & ".dxf" ou c'est ".pdf" dans la macro PDF qui fonctionne
Est-ce les .....ExpPdfData qu'il faut remplacer par l'équivalent pour les DXF ?
Oups, je regarde plus en détail, je n'ai pas ouvert les fichiers.
Re,
Normalement le code ci-dessous répond au besoin
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim sPathname As String
Dim vSheetName As Variant
Dim nErrors As Long
Dim nWarnings As Long
Dim i As Long
Dim bRet As Boolean
Dim lParam As Long
Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
lParam = swApp.GetUserPreferenceIntegerValue(swDxfMultiSheetOption)
'Changement paramétrage export dxf si différent de feuille active
If lParam <> 0 Then
bRet = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swDxfMultiSheetOption, swDxfMultisheet_e.swDxfActiveSheetOnly)
End If
sPathname = swModel.GetPathName
sPathname = Left(sPathname, Len(sPathname) - 7)
vSheetName = swDraw.GetSheetNames
For i = 0 To UBound(vSheetName)
bRet = swDraw.ActivateSheet(vSheetName(i))
bRet = swModel.SaveAs4(sPathname & "_" & vSheetName(i) & ".dxf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, nErrors, nWarnings)
Next i
' Retour à la Feuille 1
bRet = swDraw.ActivateSheet(vSheetName(0))
' Remise en place du paramétrage initial
bRet = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swDxfMultiSheetOption, lParam)
End Sub
Merci,
Elle fonctionne parfaitement ;-)
Bonjour,
Désolé de dépoussiérer le sujet, mais j’ai essayé cette macro sur SW2025 et cela ne fonctionne pas.
C’est exactement ce que je cherche à faire également, je fais de la mise en plan de pièces à corps soudés multiples.
Merci beaucoup
Manu
Bonjour @Emmanuel_SERVEL et bienvenue.
Pour pouvoir vous aider il nous faudrait plus d’informations:
Vous dites que la macro ne fonctionne pas sous Sw2025, quel et le message d’erreur ?
Votre version de Solidworks est-elle une version Locale ou 3Dexperience ?
Avez-vous pensé à charger les Références Solidworks dans votre éditeur VBA?

Nota:
La fonction « SaveAs4 » est considérée comme obsolète dans l’aide des API Solidworks.
étrangement elle est remplacée par « SaveAs3 »
et leurs déclaration sont légèrement différente:
value = instance.SaveAs4(Name, Version, Options, Errors, Warnings)
et
value = instance.SaveAs3(Name, Version, Options, ExportData, AdvancedSaveAsOptions, Errors, Warnings)
Ceci dit, une fonction « obsolète » n’est pas forcément inutilisable …
Mais là on attaque un sujet qui dépend de votre niveau en programmation VBA.
Dans votre cas je pense plutôt aux Références VBA à ajouter…
Cordialement.
Bonjour,
Merci pour votre retour, en allant vérifier les références, les cases SW étaient déjà toutes cochées. J’ai simplement rajouté Microsoft Scripting Runtime, j’ai relancé la macro pour essayer et cela semble fonctionner parfaitement. Je ne sais pas si c’était cela le problème mais en tout cas je suis satisfait.
Merci beaucoup
Manu
Bonjour,
Ce n’est pas étrangement remplacé par SaveAs3, ce n’est juste pas sur les mêmes méthodes, SaveAs4 fait parti des méthodes ModelDoc2 et SaveAs3 de ModelDocExtension.
En réponse @Emmanuel_SERVEL , la référence Microsoft Scripting Runtime n’est normalement pas nécessaire pour le bout de code que j’ai donné. Le bug pouvait provenir de la fonction Left qui des fois n’est pas reconnue, il faut utiliser en remplacement VBA.Left.
Merci @Cyril_f … enrichissement de ma culture personnelle : ![]()
(et il n’y à même pas de sarcasme)
ModelDoc2 :
Représente le document principal dans SolidWorks (pièce, assemblage ou mise en plan)
ModelDocExtension :
Est une extension de ModelDoc2, accessible via la propriété .Extension d’un objet ModelDoc2* .
A été créée pour ajouter des méthodes et propriétés supplémentaires lorsque ModelDoc2 a atteint sa limite de capacité en termes de nombre de méthodes .
Permet d’accéder à des fonctionnalités avancées ou moins courantes, telles que : gestion des propriétés personnalisées, calculs de propriétés de masse, gestion des tables de nomenclature (BOM), opérations de conversion, gestion avancée de l’enregistrement (ex : SaveAs2)
Donc : ModelDocExtension :pour les opérations avancées ou spécialisées qui ne sont pas disponibles directement dans ModelDoc2, accessible via la propriété .Extension d’un objet ModelDoc2
En résumé, ModelDocExtension complète ModelDoc2 et permet d’accéder à des fonctionnalités supplémentaires nécessaires pour des macros ou des automatisations avancées dans SolidWorks
.
Bonjour, c’est de nouveau moi concernant ce sujet.
En partant de la MACRO initiale et cherchant d’autres macros sur le forum, je l’avais modifiée pour intégrer l’indice et la date à la fin de chaque fichier DXF généré.
Ci-joint le fichier de ma macro :
EXPORT_DXF_IND-DATE.swp (49,5 Ko)
J’ai deux soucis :
Le fichier fonctionne, le résultat escompté est bon mais par contre le temps de réalisation est extrêmement long. Ne connaissant rien en VBA, j’ai clairement pris des morceaux de macro à droite à gauche pour arriver à mes fins, je ne sais pas d’où cela peut venir. J’ai des fichiers plans avec parfois plus de 100 feuilles, la macro doit mettre bien 20min pour me générer toutes les feuilles en DXF.
Et l’autre point est que j’aimerais rajouter le numéro de page au début de chaque nom de fichier, mais je ne sais pas quel variable je dois appeler.
Merci pour vos retours
Cordialement
Manu
Bonjour;
Il aurait été préférable d’ouvrir une nouvelle discussion plutôt que de relancer une ancienne déjà « Résolue »…
Est-il possible que tu édite ton code directement ici (sans oublier les balises </>)…
Je ne suis jamais très chaud pour télécharger une macro directement…et au vus de ce qui est décrit pour sa conception … je suis encore moins enclin au téléchargement ![]()
Bonjour,
Merci du retour, désolé je ne suis pas un consommateur de forum, je ne connais pas les règles à respecter. ![]()
Ci-dessous ma macro :
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swCustProp As CustomPropertyManager
Dim valOut1 As String
Dim resolvedValOut1 As String
Dim sPathname As String
Dim vSheetName As Variant
Dim nErrors As Long
Dim nWarnings As Long
Dim i As Long
Dim bRet As Boolean
Dim lParam As Long
Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
lParam = swApp.GetUserPreferenceIntegerValue(swDxfMultiSheetOption)
'Changement paramétrage export dxf si différent de feuille active
If lParam <> 0 Then
bRet = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swDxfMultiSheetOption, swDxfMultisheet_e.swDxfActiveSheetOnly)
End If
' On récupère la date du jour et on la met dans un format pouvant se mettre dans le nom d'un fichier
Dim dateNow As String
dateNow = Replace(Date, "/", ".")
' On récupère les valeurs qui nous intéresse dans les propriétés personnalisées du plan
Set swCustProp = swModel.Extension.CustomPropertyManager("")
swCustProp.Get2 "Révision", valOut1, resolvedValOut1
sPathname = Replace(swModel.GetPathName, ".SLDDRW", "")
vSheetName = swDraw.GetSheetNames
For i = 0 To UBound(vSheetName)
bRet = swDraw.ActivateSheet(vSheetName(i))
bRet = swModel.SaveAs4(sPathname & " - " & resolvedValOut1 & " - " & dateNow & "_" & vSheetName(i) & ".dxf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, nErrors, nWarnings)
Next i
' Retour à la Feuille 1
bRet = swDraw.ActivateSheet(vSheetName(0))
' Remise en place du paramétrage initial
bRet = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swDxfMultiSheetOption, lParam)
End Sub
En tout cas, je vous remercie tous grandement. ![]()
Manu
Bonjour;
Globalement je ne vois pas trop d’incohérences dans le code, a voir ce qu’en disent des plus professionnels que moi
.
J’aurai juste utilisé une variable pour la propriété « Révision »
du style :
Dim MyRevision as string
puis
MyRevision = swCustProp.Get2 "Révision", valOut1, resolvedValOut1
et pour ajouter le numero de page, pourquoi ne pas utiliser (i+1) ?
Cela donnerai:
bRet = swModel.SaveAs4(sPathname & " - " & MyRevision & " - " & dateNow & "_" & vSheetName(i) & i+1 & ".dxf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, nErrors, nWarnings)
De plus, je ne suis pas un grand fan de l’utilisation de points « . » dans le nom du fichier,
Donc (mais c’est facultatif) : dateNow = Replace(Date, « / », « _ »)
Et enfin, j’ajouterai un contrôle pour vérifier que MyRevision n’est pas « Vide »:
If MyRevision ="" then
msgbox ("La propriété Révision n’existe pas.")
exit sub
end if
Pour gagner un peu de temps, il est possible de désactiver les mises à jour graphiques de Solidworks pendant le traitement:
swModel.FeatureManager.EnableFeatureTree = False 'Désactivation de la mise à jour treeManager
modView.EnableGraphicsUpdate = False 'Désactivation de la mise à jour graphique
EnableFeatureTreeWindow = False 'Désactivation de la mise à jour de la fenetre
mais il faudra les réactiver à la fin du traitement:
swModel.FeatureManager.EnableFeatureTree = True 'Activation de la mise à jour treeManager
modView.EnableGraphicsUpdate = True 'Activation de la mise à jour graphique
EnableFeatureTreeWindow = True 'Activation de la mise à jour de la fenetre
Bonjour,
Tout dépend de la « lourdeur » de chaque feuille.
Il est possible que SW rame à ce niveau (j’ai un peu le même comportement sur certaines macro qui ne font qu’un simple export PDF)
En même temps plus de 100 feuilles, pas du tout surpris que ça rame!
Et cela me conforte dans notre façon de faire:
1 pièce = un fichier = 1 plan puis assemblage (hormis construction soudée tubulaire à plusieurs corps)
OK merci pour vos retours.
J’essaie de modifier çà et j’essaie à ma prochaine génération de DXF.
Pour info, je suis en construction soudée pour de la modélisation de mobilier, donc suivant le meuble il peut y avoir beaucoup de pièces à mettre en plan. Et il m’est demandé d’épurer un maximum les feuilles, donc beaucoup de feuilles pour une seule et même pièce.
En tout cas je vous remercie tous grandement pour le temps que vous avez accordé à me répondre.