Utilisation du cube de visualisation dans un assemblage

Bonjour a tous,

Dans un assemblage est il possible de créer un cube de visualisation pour toutes les pièce présente dans ce même assemblage?

car j'ai l'impression qu'il faut éditer chaque pièce pour créer le cube.

Il y a t il un moyen de le faire ou d'automatiser par une boucle vba la création d'un cube de visualisation pour chaque pièce.

Merci d'avance.

Bonjour,

Pour le créer sur les pièces, par macro comme en manuel, il faut éditer chaque pièce.

Mais c'est plus rapide et simple par macro puisque c'est fait en un clic.

Cordialement,

Bonjour et merci d.roger pour ton intervention,

Je code en VBA pour Excel, mais le VBA pour Solidworks me pose quelque problème.

J'ai essayer de modifier un code ouvrant toutes les pièce d'un assemblage et de créer le cube de visualisation a chaque ouverture, mais ça ne me crée pas de cube.

Et je ne vois pas ou ça pèche.

Au cas ou je mets la macro si quelqu'un voit ou est le problème.


remplprop.swp

Tu crée le cube sur la variable Part avec cette ligne "Set BoundingBox = Part.FeatureManager.InsertGlobalBoundingBox(swGlobalBoundingBoxFitOptions_e.swBoundingBoxType_BestFit, False, False, longstatus)" hors la variable "Part" est rattachée à ton assemblage puisque c'est le "swApp.ActiveDoc" du début donc quand je lance ta macro le cube se crée sur l'assemblage. Il faut créer ton cube sur la variable "swModel" qui est la pièce que tu ouvres  par l'action de la ligne "Set swModel = swApp.ActivateDoc(Document)" donc une première modification est de corriger, à minima, les lignes comme suit :

If Not CmpDoc.GetPathName Like "*\AppData\*" Then

    T = CmpDoc.CustomInfo("Type")
    If T = "" Then
        Set swModel = swApp.ActivateDoc(Document)
        swModel.ForceRebuild                        ' Reconstruction
        swModel.ShowNamedView2 "*Isométric", -1     ' Vue Isométrique
        swModel.ViewDisplayShaded                   ' Vue Ombrée
        swModel.ViewZoomtofit2                      ' Zoom au mieux
        Dim BoundingBox As Object
        Set BoundingBox = swModel.FeatureManager.InsertGlobalBoundingBox(swGlobalBoundingBoxFitOptions_e.swBoundingBoxType_BestFit, False, False, longstatus)

        
        Part.GraphicsRedraw2
'Dim BoundingBox As Object
'Set BoundingBox = Part.FeatureManager.InsertGlobalBoundingBox(swGlobalBoundingBoxFitOptions_e.swBoundingBoxType_BestFit, False, False, longstatus)
Part.ClearSelection2 True

Cette macro devient alors fonctionnelle...

Cordialement,

Comme sur l'autre discussion :

 

Et met tes pièces en mode résolu sinon ça ne marchera pas ...

Cordialement,

1 « J'aime »

Merci pour cette première étape, par contre j'ai 7 pièces dans mon assemblage et il n'y a que 4 pièce qui on un cube de visualisation les 3 dernières n'en n'on pas.

Il doit y avoir  un soucis dans la boucle, qu'il ferait qu'elle ne tient pas compte de toutes les pièces?

Désolé mais c'est quoi le mode résolu, excuse mon ignorance.

Lors du chargement d'un assemblage dans Solidworks il est possible soit d'ouvrir les pièces en mode résolu soit en mode allégé, la différence est que soit les pièces sont réellement ouverte soit seul une visualisation graphique de celles-ci s'affiche à l'écran. Voir ICI pour les avantages du mode résolu et ICI pour les pièces allégées.

Donc faire un clic droit sur l'assemblage et sélectionner "Régler pièces allégées sur Résolues" dans le menu contextuel puis réessaye ta macro.

Cordialement,

Ok merci pour les précisions.

Et j'étais bien en résolu et je n'ai toujours que 4 pièces sur 7 qui ont un cube de visualisation.

Quand je lance la macro modifiée sur un assemblage plus important cela me crée bien tous les cubes de visualisation, tu n'as pas de pièces surfaciques ? et quelle version de SW ?

Non je n'ai pas de pièces surfaciques et ma version et une 2018

Je viens de refaire des essais et toujours pareil voici mon assemblage si tu veux bien faire des essais


mb_entree.zip

J'ai fait un essai sur un autre assemblage avec 7 pièces et là ça fonctionne, je ne sais pas pourquoi ça ne fonctionne pas avec celui la.

Tu verras peut être quelque chose de ton coté.

Est que tu peux me dire si ce code fonctionne sur des pièces symétrisés ou avec une répétition de composant.

Je vais faire des essais de mon coté pour vérifier, mais ton avis m'interresse

J'obtiens le cube de visualisation sur toutes les pièces de ton assemblages.

J'ai modifié le code comme ce qui suit pour supprimer tout un tas de lignes qui ne servent probablement à rien :

Dim swApp As Object
'Dim Part As Object
Dim longstatus As Long, longwarnings As Long
Dim swModel             As SldWorks.ModelDoc2
Dim bRet                As Boolean
Dim swErrors            As Long
Dim swWarnings          As Long
Dim i                   As Long
'Dim j                   As Long
'Dim cCnt                As Long
Dim Assembly            As ModelDoc2
Dim myAsy               As AssemblyDoc
Dim myCmps
Dim CmpDoc              As ModelDoc2
Dim myCmp               As Component2
'Dim tCmp                As Component2

Sub main()
    'Dim myModelView As Object

    Set swApp = Application.SldWorks
    'Set Part = swApp.ActiveDoc
    Set Assembly = swApp.ActiveDoc
    Set myAsy = Assembly

    myCmps = myAsy.GetComponents(False)
    For i = 0 To UBound(myCmps)
        Set myCmp = myCmps(i)
        If (myCmp.GetSuppression = 3) Or (myCmp.GetSuppression = 2) Then
            'cCnt = 0
            Set CmpDoc = myCmp.GetModelDoc
            'Cfg = myCmp.ReferencedConfiguration
            
            'compte le nombre d'occurences des composants
            'For j = 0 To UBound(myCmps)
            'Set tCmp = myCmps(j)
                'If tCmp.GetSuppression <> 0 Then
                    'If tCmp.GetModelDoc2 Is CmpDoc Then
                        'If tCmp.ReferencedConfiguration = Cfg Then
                            'cCnt = cCnt + 1
                        'End If
                    'End If
                'End If
            'Next j
            Document = CmpDoc.GetPathName
            'remplissage propriété Type
            
            'If Not CmpDoc.GetPathName Like "*\AppData\*" Then
            
                'T = CmpDoc.CustomInfo("Type")
                'Debug.Print T
                'If T = "" Then
                    Set swModel = swApp.ActivateDoc(Document)
                    'swModel.ForceRebuild                        ' Reconstruction
                    'swModel.ShowNamedView2 "*Isométric", -1     ' Vue Isométrique
                    'swModel.ViewDisplayShaded                   ' Vue Ombrée
                    'swModel.ViewZoomtofit2                      ' Zoom au mieux
                    Dim BoundingBox As Object
                    Set BoundingBox = swModel.FeatureManager.InsertGlobalBoundingBox(swGlobalBoundingBoxFitOptions_e.swBoundingBoxType_BestFit, False, False, longstatus)
             
                    'Part.GraphicsRedraw2
                    'Dim BoundingBox As Object
                    'Set BoundingBox = Part.FeatureManager.InsertGlobalBoundingBox(swGlobalBoundingBoxFitOptions_e.swBoundingBoxType_BestFit, False, False, longstatus)
                    'Part.ClearSelection2 True
                    
                
                    'Enregistre et ferme le document actif en mode silencieux
                    bRet = CmpDoc.Save3(swSaveAsOptions_Silent, swErrors, swWarnings)
                    swApp.CloseDoc (Document)
                'Else
                'End If
            'End If
        End If
    Next i
    
    MsgBox "Cube créé", vbExclamation

End Sub

 

3 « J'aime »

Ok merci pour ton retour, donc je ne comprend pas pourquoi chez moi j'ai soucis, mais j'aurai peut être une explication plus tard.

Merci pour ton épuration du code j'ai également travaillé de mon coté pour supprimer ce qui ne sert pas, mais je vais comparer avec le tiens.

En attendant un grand merci pour ton aide.

Si j'ai un soucis je reviendrai sur le fil en attendant je vais valider ton dernier post

Une autre question qui me travaille, on ouvre toutes les pièces, mais dans un assemblage on peut éditer sans ouvrir et ça fait gagner du temps.

Est il possible de faire la même chose avec cette macro

PS: ton code était bien plus épuré que le mien.

Bonjour,

Oui, c'est possible avec la fonction EditPart2 mais attention à ne pas se mélanger les pinceaux entre les ModelDoc2AssemblyDoc et Component2.

Cordialement,

Bonjour,

Aurais tu quelque chose qui me permette de comprendre la différence entre ces fonctions?

Car mes recherche sont trop vague pour m'y retrouver.

Bonjour,

Voici un exemple qui doit faire la même chose que la macro déjà fournie :

Option Explicit

Dim swApp As Object
Dim longstatus As Long
Dim swModel As SldWorks.ModelDoc2
Dim bRet As Boolean
Dim swErrors As Long
Dim swWarnings As Long
Dim i As Long
Dim Assembly As ModelDoc2
Dim myAssy As AssemblyDoc
Dim myCmps As Variant
Dim myCmp As Component2
Dim nInfo As Long

Sub main()
    Set swApp = Application.SldWorks
    Set Assembly = swApp.ActiveDoc
    Set myAssy = Assembly

    myCmps = myAssy.GetComponents(False)
    For i = 0 To UBound(myCmps)
        Set myCmp = myCmps(i)
        If (myCmp.GetSuppression = 3) Or (myCmp.GetSuppression = 2) Then
            bRet = myCmp.Select2(False, 0)
            bRet = myAssy.EditPart2(True, True, nInfo)
            Set swModel = myAssy.GetEditTarget

            Dim BoundingBox As Object
            Set BoundingBox = swModel.FeatureManager.InsertGlobalBoundingBox(swGlobalBoundingBoxFitOptions_e.swBoundingBoxType_BestFit, False, False, longstatus)

            bRet = swModel.Save3(swSaveAsOptions_Silent, swErrors, swWarnings)

            myAssy.EditAssembly
        End If
    Next i
    
    Assembly.ForceRebuild3 True
    
    MsgBox "Cubes créés", vbExclamation

End Sub

Cordialement,

Bonsoir,

Je viens d'essayer ton code, mais il me fait planter Solidworks 2018.

Sans me mettre aucun éléments de pourquoi il a planter.

Peux tu m'aiguiller?