Macro pour extraction de cotes dimensionnelles à partir de Solidworks

Bonjour à tous, 

Je travaille à l'automatisation d'un process de CFAO et j'aimerai pouvoir extraire à partir d'une pièce ou d'un assemblage Solidworks les cotes et leurs dimensions (pour chaque fonction de la/les pièces) vers un fichier externe. 

J'ai trouver grâce à M. Boutherand sur un ancien article de ''myCadblog'' une macro qui permet d'extraire ces données via un fichier excel. Seulement cette macro semble être obsolète (voir code ci dessous).

Sauriez vous m'aider à l'actualiser? (Pour info: je suis sous Solidworks 2014)

Merci beaucoup par avance pour vos retour!

Romain

 

  • Sub AddAllDimensions()
  •     Dim swDisplayDimension As SldWorks.DisplayDimension
  •     Dim swDimension As SldWorks.Dimension
  •     Dim swFeature As SldWorks.Feature
  •     On Error GoTo SiErr
  •     'récupére l'application SolidWorks
  •     Set swApp = CreateObject("SldWorks.Application")
  •     'on récupére le document actif
  •     Set swDoc = swApp.ActiveDoc
  •     'récupére la première fonction
  •     Set swFeature = swDoc.FirstFeature
  •     
  •     If swFeature Is Nothing Then
  •         MsgBox "le document est vide", vbExclamation
  •         Exit Sub
  •     End If
  •  
  •     Do
  •         'Sur chaque fonction on récupére les cotes
  •         Set swDisplayDimension = swFeature.GetFirstDisplayDimension
  •         If Not swDisplayDimension Is Nothing Then
  •             Do
  •                 Set swDimension = swDisplayDimension.GetDimension
  •                 'on ajoute à la liste
  •                 Call AddDimToSheet(swDisplayDimension)
  •                 Set swDisplayDimension = swFeature.GetNextDisplayDimension(swDisplayDimension)
  •             Loop Until swDisplayDimension Is Nothing
  •         End If
  •         Set swFeature = swFeature.GetNextFeature
  •     Loop Until swFeature Is Nothing
  •  
  •     Exit Sub
  •  
  • SiErr:
  •     Set swDisplayDimension = Nothing
  •     Resume Next
  • End Sub

 

 

1 « J'aime »

peut etre un probleme de 32 bit a 64 bit ou de langage macro vba

http://help.solidworks.com/2013/French/WhatsNew/c_application_programming_interface_wn2012.htm?format=P

@+ ;-)

1 « J'aime »

J'ai legerement modifié la macro, elle liste maintenant les cotes et leur valeurs

reste a ajouter vos traitements

la voici 

 


macro1.zip
8 « J'aime »

@ gt22: Merci  je vais regarder le doc de près.

 

@jfaradon: Merci pour la modif de la macro, en effet celà récupère bien les cotes mais du coup uniquement sous solidworks en affichant un msgbox non?

A la base la macro tourne dans un fichier excel pour pouvoir extraire les cotes dans des cellules.

 

Est ce que c'est possible de la faire tourner sous excel? 

 

Merci pour vos réponses rapides!

Bonsoir,

 

juste une petite question extraire les valeurs ok, mais si vous avez des tolérance comment cela se passera avec les usinage en CFAO ?

Car je trouve la question trés intéressante mais ce point sur les tolérances me comme qui dirait turlupine !

 

Merci.

2 « J'aime »

Bonsoir Matthieu, 

 

Les tolérances n'ont pas d'importance dans notre process industriel (déclaration étrange sortie de son contexte :) ) mais c'est pourtant le cas. L'application est assez particulière, loin des précisions mécaniques classiques...

Ce dont j'ai besoin à la conception, c'est grâce à une bibliothèque de fonctions ou les usinages sont standardisés dans leurs formes (esquisse + fonction d'enlèvement de matière) et pour lesquels je redéfinis à chaque fois les dimensions des cotes, de dessiner mes pièces et de les assembler. 

A partir du dessin de chaque pièce ou de l'assemblage, je souhaite extraire une nomenclature de chaque pièce, les fonctions appliquées sur chaque pièce (les usinages en prod.) et les cotes que j'ai utilisé pour chaque fonction. Le programme de fabrication n'a besoin que du nom des pièces, des fonctions appliquées à ces pièces et de certaines des cotes qui définissent le positionnement des fonctions sur la pièce (la position des usinages en prod.).

 

Voilà pour la petite histoire. :)

 

Bonne soirée. 

2 « J'aime »

Bonjour à tous,

J'ai finalement réussi à faire fonctionner la macro! 

Voir le résultat en pièce jointe...

Par contre, ça n'a l'air de marcher que pour les pièces, et non pour les assemblages, alors qu'il n'y a pas de spécification .part dans le code de la macro, est ce normal?

 

Bonne journée!

 

 


extraction_test.jpg

Romain,

 

Voici une modification pour prendre ne compte les assemblages

Le code sur la partie récupération des valeurs de feature est le meme

 

 

 

Dim swApp As SldWorks.SldWorks

Dim swDoc As SldWorks.ModelDoc2

Dim swAss As SldWorks.AssemblyDoc

Dim swPart As SldWorks.PartDoc

Dim swFeature As SldWorks.Feature

 

Sub main()

 

 

    On Error GoTo SiErr

    'récupére l'application SolidWorks

    Set swApp = CreateObject("SldWorks.Application")

    'on récupére le document actif

    Set swDoc = swApp.ActiveDoc

    

    Select Case swDoc.GetType

        Case swDocumentTypes_e.swDocPART

            Set swPart = swDoc

            Call TraverseFeature(swPart)

        Case swDocumentTypes_e.swDocASSEMBLY

            Set swAss = swDoc

            Dim swComponents As Variant

            swComponents = swAss.GetComponents(False)

            For i = 0 To UBound(swComponents)

                Call TraverseFeature(swComponents(i).GetModelDoc)

            Next i

        Case swDocumentTypes_e.swDocDRAWING

            MsgBox "Pas sur une mise en plan", vbExclamation

            End

    End Select

    

 

SiErr:

    MsgBox Err.Description, vbCritical

    End

End Sub

 

Sub TraverseFeature(ByRef swDoc As SldWorks.ModelDoc2)

    Dim swDisplayDimension As SldWorks.DisplayDimension

    Dim swDimension As SldWorks.Dimension

    Dim swFeature As SldWorks.Feature

 

    ' Si le document n'existe pas (pas disponible, composant supprimé par exemple)

    If swDoc Is Nothing Then Exit Sub

    

    

    'récupére la première fonction

    Set swFeature = swDoc.FirstFeature

    

    If swFeature Is Nothing Then

        MsgBox "le document est vide", vbExclamation

        Exit Sub

    End If

 

    Do

        'Sur chaque fonction on récupére les cotes

        Set swDisplayDimension = swFeature.GetFirstDisplayDimension

        If Not swDisplayDimension Is Nothing Then

            Do

                Set swDimension = swDisplayDimension.GetDimension

                'on ajoute à la liste

                If MsgBox(swDimension.FullName & " = " & swDimension.GetValue2(""), vbOKCancel, swDoc.GetTitle) = vbCancel Then End

                Set swDisplayDimension = swFeature.GetNextDisplayDimension(swDisplayDimension)

            Loop Until swDisplayDimension Is Nothing

        End If

        Set swFeature = swFeature.GetNextFeature

    Loop Until swFeature Is Nothing

 

    Exit Sub

 

SiErr:

    MsgBox Err.Description, vbCritical

    End

End Sub

9 « J'aime »

Bonsoir jfaradon, 

 

Désolé je viens juste de me rendre compte que c'était vous qui aviez développer la macro d'origine et le fichier excel associé... :S

 

Merci pour votre nouveau code, par contre j'ai du mal à l'intégrer à l'ensemble actuel de macros dans le fichier excel. Dois-je remplacer toute le code ''Sub AddAlldimensions()'' par le nouveau? Je n'étais pas au BE aujourd'hui pour tester...

 

Merci beaucoup.

 

Bonne soirée. 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Bonjour!

 

J'ai intégré le tout ce matin, ça marche!!

J'ai déclaré ''i'' As Integer et c'est bon. 

 

Par contre j'ai juste un msgbox d'erreur à la fin (voir image jointe) je n'arrive pas à voir d'ou elle vient...

 

Merci infiniment en tout cas. Je n'avais pas le réflexe des forums en matière de conception et vos compétences et votre réactivité est extraordinaire.

 

Bonne journée!

 

Romain


msgbox_error.jpg

Bonjour que faut il rajouter pour extraire sa dans un fichier excel ? ou txt ? 

2 « J'aime »

Bonjour et merci pour ce code. J'ai essayé de m'en inspirer pour extraire des cotes sous forme d'annotations dans un assemblage. Je pose donc ma question ici, ce qui me parait plus judicieux.

Les cotes (entre 2 composants donc) ont un nom du type RD1@annotations. Est-il possible d'accéder à leurs valeurs via une macro ? J'ai regardé dans l'API, mais je sèche (FeatureByName ?)

Deuxième question un peu du même ordre, j'aimerais piloter la valeur d'une contarinte dans l'assemblage.

Le but, faire varier un angle et récupérer les cotes mesurées par des annotations directement sous Excel.

Merci de votre aide.

1 « J'aime »
Bonjour, les anciennes questions sont très peu suivies sur ce forum car il n'y a pas la possibilité de trier par dernière activité. Si vous avez une question n'hésitez pas à la poser sur le forum, et là vous aurez des reponses rapides !