Décomposer pièce mécanosoudé

Bonjour,

Nous travaillons grâce à l''environnement mécanosoudé (SW 2017). Lors de la création de nos nomenclatures générales, si l'on veut avoir la liste de chaque corps, sans avoir l'affichage des pièces correspondantes, nous devons décomposer à la main chaque pièce (ainsi que chaque assemblage), ce qui peut parfois être fastidieux, notamment lorsque SW décide de recomposer de temps à autre nos assemblages.

Existe-t-il une façon d'avoir une nomenclature ne comportant que la liste des corps d'un assemblage ? Ou une façon de "tout décomposer" dans une nomenclature ? (macro ?)

Un grand merci d'avance, vous nous faites gagner un temps considérable.

Bonjour,

Je me permets de remonter le sujet, au cas où certains auraient des idées :)

Merci d'avance ! 

Bonjour

Pour que nos collègues puissent vous aider il faudrait préciser ce que vous voulez lorsque vous dites " sans avoir l'affichage des pièces correspondantes, "

Pouvez-vous faire quelques impression d'écran de ce que vous obtenez avec la méthode fastidieuse  vous dites : nous devons décomposer à la main chaque pièce (ainsi que chaque assemblage), )

Nous avons des collègues costauds sur ces sujets, ils sauront quoi dire à la vue de votre travail actuel.

Cordialement

Pour décomposer chaque assemblage, il faut aller dans les propriétés de la configuration (même s'il n'y en a qu'une) et choisir "montrer" :

Pour décomposer automatiquement une pièce en corps, je ne vois qu'une macro.

@Zozo_mp : on peut avec SW afficher, dans une nomenclature, la liste des corps composant une pièce à la place de la pièce elle-même (selon la même logique qu'avec un sous-ensemble de "complaisance").

1 « J'aime »

Bonjour,

Merci pour vos réponses :)

Par exemple, si j'ai un assemblage contenant 20 pièces, chacunes mécanosoudées et composées de plusieurs corps chacuns. 
Si je veux que dans ma nomenclature n'apparaisse que les corps, il faut que je décompose à chaque fois mes vingt pièces (et parfois on en a beaucoup plus).

Ici ma pièce est A, et est composée de A1 jusqu'à A10.

Par ailleurs, mes sous-assemblages sont systématiquement en "Montrer", et ça ne décompose pas l'assemblage. Ce ne serait pas uniquement une option permettant d'afficher ou non les pièces composant l'assemblage dans la nomenclature ?

Pour une macro, auriez vous des pistes à me donner ? Je ne suis pas à l'aise avec ce langage.

Merci encore !

Bonjour,

Pour le faire par macro tu peux utiliser la fonction "Dissolve" que tu trouveras ICI avec un exemple d'utilisation ICI.

Cordialement,

2 « J'aime »

Merci beaucoup :

J'ai pu faire une première macro qui décompose bien la table, ligne par ligne en partant de la fin, donc déjà une bonne nouvelle ! :) 
Pour gagner en rapidité, j'aimerais décomposer uniquement les lignes nécessaires (donc celles correspondant à des subassembly ou weldment), y a-t-il moyen de récupérer le type de cellule ? Je ne trouve pas ce qu'il me faut dans la doc.

Je ne pense pas que cela soit possible de récupérer le type d'article d'une ligne car c'est en général un tableau de texte que l'on récupère quand on analyse une nomenclature par les API. A toi de voir si tu peux ajouter une colonne qui peut te servir de critère de sélection comme "SW-Nom de fichier(File Name)" par exemple.

1 « J'aime »

Oui j'y ai pensé, le problème c'est qu'une pièce non-mécanosoudée sera en .sldprt (par exemple toute la visserie), mais n'a quand même pas besoin d'être décomposée. 
Ceci dit c'est une première amélioration en effet !

J'ai vu qu'il y avait la fonction "GetComponents2", qui permet de retourner un component. N'y a-t-il pas moyen grâce à cela ? 
http://help.solidworks.com/2017/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IBomTableAnnotation~GetComponents2.html

J'ai tenté de rajouter une colonne avec le nom du fichier, mais je n'y parviens pas, en fait je bloque à l'étape de définir le type de colonne. J'arrive à rajouter la colonne, mais celle-ci est vide. Le but est bien d'identifier l'extension du fichier, pour ne décomposer que les .sldprt et .sldasm
Après cette étape, je pense savoir comment faire.

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
    
Sub main()

    Dim swFeat As SldWorks.Feature
    Dim swBomFeat As SldWorks.BomFeature
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

    Set selmgr = swModel.SelectionManager
    Set vTable = selmgr.GetSelectedObject6(1, -1)
    
    DisolveBomSelect vTable

    MsgBox "Nomenclature décomposée"
    
End Sub

Sub DisolveBomSelect(vTable As Variant)
    Dim swTable As SldWorks.TableAnnotation
    Dim swAnn As SldWorks.Annotation
    Dim nNombreLignes As Long
    Dim sRowStr As String
    Dim i As Long
    
    Set swTable = vTable
    Set swAnn = swTable.GetAnnotation
    
    nNombreLignes = swTable.RowCount
    nNombreColonnes = swTable.ColumnCount

    etape = swTable.InsertColumn2(swTableItemInsertPosition_Last, 0, "New Column", swInsertColumn_DefaultWidth)
    
    swAnn.Visible = swAnnotationHidden
    
    For i = nNombreLignes - 1 To 0 Step -1
         swTable.Dissolve (i)
    Next i
   
    swAnn.Visible = swAnnotationVisible
End Sub

 

Bonjour,

Tu insert bien ta colonne mais tu ne lui donne pas son type, regarde sur l'exemple suivant, il y a aussi une ligne avec la fonction SetColumnType.

Cordialement,

1 « J'aime »

Oui j'ai bien essayé avec un SetColumnCustomProperty, mais je n'obtiens qu'une erreur du à un mauvais type. Peut-être qu'il me faut un setcolumntype avant.

Bonjour,

En relisant un peu le fil de la discussion, j'avoue ne plus trop réussir à suivre :

- étape 1 : la question est pour tout décomposer.

- étape 2 : ne décomposer que certaines lignes pour gagner du temps.

- étape 3 : ne pas décomposer suivant le type de fichier car (par exemple) des sdlprt peuvent être des vis et ne doivent pas être décomposées.

- étape 4 : insérer une colonne car le but est bien d'identifier l'extension du fichier, pour ne décomposer que les sldprt et sldasm.

Je pense qu'avant de continuer le code il est nécessaire de bien définir le besoin (tout décomposer : oui ou non ?) et, si c'est non, de bien définir les critères de sélection des lignes à décomposer. La fonction "GetComponents2" peut effectivement être une autre piste de réflexion en fonction de ce que tu veux décomposer.

Et pour l'insertion d'une nouvelle colonne il est peut-être plus facile de tout simplement le faire dans le modèle de nomenclature plutôt que de chercher à le faire par le code...

Cordialement,

2 « J'aime »

Bonjour,

Le but reste le même : avoir une nomenclature totalement décomposée rapidement, mais en fonction des difficultés de mises en oeuvre il y a en effet des étapes intermédiaires. 
J'ai bel et bien une macro qui décompose tous les composants, le problème étant la lourdeur de cette macro, qui décompose également les corps mécano-soudés et les .sldprt non-mécanosoudés, qui n'ont pas besoin de l'être, faisant perdre du temps (la fonction dissolve n'est pas une foudre de guerre). 

Mon idéal serait donc de ne décomposer que les assemblages et les pièces mécano-soudées, mais puisque je n'y parvenait pas, je me suis rabattu sur la différenciation par le nom de fichier. 

Désolé pour le flou de mes demandes, j'espère que ce message permettra d'y voir un peu plus clair :) 
 

Bonjour,

Voici un exemple qui s'appuie sur le repère de nomenclature pour savoir si il faut décomposer ou pas, il faut que la nomenclature soit sous forme de liste en tabulation (La coche pour la liste détaillée des pièces soudées n'est pas obligatoire) :

C'est un exemple, à toi d'adapter suivant ton besoin...

Cordialement,

Option Explicit

Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swFeat As SldWorks.Feature
    Dim swBomFeat As SldWorks.BomFeature

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    Set swFeat = swModel.FirstFeature

    Do While Not swFeat Is Nothing
        If "BomFeat" = swFeat.GetTypeName Then
            Set swBomFeat = swFeat.GetSpecificFeature2
            ProcessBomFeature swApp, swModel, swBomFeat
        End If
        Set swFeat = swFeat.GetNextFeature
    Loop
End Sub

Sub ProcessTableAnn(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, swTableAnn As SldWorks.TableAnnotation, ConfigName As String)
    On Error Resume Next
    
    Dim nNumRow As Long
    Dim nNumColumn As Long
    Dim j As Long
    Dim i As Long
    Dim NumberComposant As String
    Dim ItemNumber As String
    Dim ItemNumberPrec As String
    Dim PartNumber As String
    Dim MomTableau() As String
    Dim n As Integer
    Dim nb As Integer
    n = 0
    nb = 0

    nNumRow = swTableAnn.RowCount

    Dim swBOMTableAnn As BomTableAnnotation
    Set swBOMTableAnn = swTableAnn

    For j = 0 To nNumRow - 1
        NumberComposant = swBOMTableAnn.GetComponentsCount2(j, ConfigName, ItemNumber, PartNumber)
        
        If ItemNumber = ItemNumberPrec & ".1" Then
            ReDim Preserve MomTableau(n)
            MomTableau(n) = j - 1
            n = n + 1
        End If

        ItemNumberPrec = ItemNumber
    Next j

    nb = UBound(MomTableau)
    While nb >= 0
        swBOMTableAnn.Dissolve (MomTableau(nb))
        nb = nb - 1
    Wend
End Sub

 
Sub ProcessBomFeature(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, swBomFeat As SldWorks.BomFeature)
    Dim swFeat As SldWorks.Feature
    Dim vTableArr As Variant
    Dim vTable As Variant
    Dim vConfigArray As Variant
    Dim vConfig As Variant
    Dim ConfigName As String
    Dim swTable As SldWorks.TableAnnotation

    Set swFeat = swBomFeat.GetFeature
    vTableArr = swBomFeat.GetTableAnnotations

    For Each vTable In vTableArr
        Set swTable = vTable
        vConfigArray = swBomFeat.GetConfigurations(True, True)
        For Each vConfig In vConfigArray
             ConfigName = vConfig
             ProcessTableAnn swApp, swModel, swTable, ConfigName
        Next vConfig
    Next vTable
End Sub

 

Déjà merci beaucoup pour ta réponse, c'est vraiment génial ! Ta solution par la numérotation est très habile !

J'essaie, j'essaie de l'adapter exactement à mon utilisation, mais, forcément, le bat blesse.

Mon utilisation idéale serait de décomposer uniquement la nomenclature active.
J'utilise donc le GetSelectedObject6(1, -1).

Mais, il renvoie une table, et je n'arrive pas à faire en sorte de récupérer la BOM correspondante, pour pouvoir récupérer la configuration, visiblement indispensable pour le GetComponentsCount.

SI je comprends bien ton code, tu regardes toutes les BOM, pour chacunes d'elles tu regardes toutes les tables correspondantes, et tu les décomposes chacunes.

Mon code, tout bête vu mon niveau, était le suivant :

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
    
Sub main()

    Dim swFeat As SldWorks.Feature
    Dim swBomFeat As SldWorks.BomFeature
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

    Set selmgr = swModel.SelectionManager
    Set vTable = selmgr.GetSelectedObject6(1, -1)
    
    DisolveBomSelect vTable

    MsgBox "Nomenclature décomposée"
    
End Sub

Sub DisolveBomSelect(vTable As Variant)
    Dim swTable As SldWorks.TableAnnotation
    Dim nNombreLignes As Long
    Dim sRowStr As String
    Dim i As Long
    
    Set swTable = vTable
    Set swAnn = swTable.GetAnnotation
    
    nNombreLignes = swTable.RowCount
    nNombreColonnes = swTable.ColumnCount
    
    
    For i = nNombreLignes - 1 To 0 Step -1
         swTable.Dissolve (i)
    Next i
End Sub

 

Bonjour,

essaye avec le code ci-dessous, attention, la sélection de la nomenclature doit se faire dans l'arbre de création et non pas sur le plan.

Cordialement,

Option Explicit

Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swFeat As SldWorks.Feature
    Dim swBomFeat As SldWorks.BomFeature
    Dim selmgr As SelectionMgr

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    
    Set selmgr = swModel.SelectionManager
    Set swBomFeat = selmgr.GetSelectedObject6(1, 0)
    ProcessBomFeature swApp, swModel, swBomFeat
End Sub

Sub ProcessTableAnn(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, swTableAnn As SldWorks.TableAnnotation, ConfigName As String)
    On Error Resume Next
    
    Dim nNumRow As Long
    Dim nNumColumn As Long
    Dim j As Long
    Dim i As Long
    Dim NumberComposant As String
    Dim ItemNumber As String
    Dim ItemNumberPrec As String
    Dim PartNumber As String
    'Dim RowLocked As Boolean
    'Dim RowHeight As Double
    Dim MomTableau() As String
    Dim n As Integer
    Dim nb As Integer
    n = 0
    nb = 0

    nNumRow = swTableAnn.RowCount

    Dim swBOMTableAnn As BomTableAnnotation
    Set swBOMTableAnn = swTableAnn

    For j = 0 To nNumRow - 1
        NumberComposant = swBOMTableAnn.GetComponentsCount2(j, ConfigName, ItemNumber, PartNumber)

        If ItemNumber = ItemNumberPrec & ".1" Then
            'Debug.Print "Ligne à décomposer : " & j - 1
            ReDim Preserve MomTableau(n)
            MomTableau(n) = j - 1
            n = n + 1
        End If

        ItemNumberPrec = ItemNumber
    Next j

    nb = UBound(MomTableau)
    While nb >= 0
        swBOMTableAnn.Dissolve (MomTableau(nb))
        nb = nb - 1
    Wend
End Sub

 
Sub ProcessBomFeature(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, swBomFeat As SldWorks.BomFeature)
    Dim swFeat As SldWorks.Feature
    Dim vTableArr As Variant
    Dim vTable As Variant
    Dim vConfigArray As Variant
    Dim vConfig As Variant
    Dim ConfigName As String
    Dim swTable As SldWorks.TableAnnotation

    Set swFeat = swBomFeat.GetFeature
    vTableArr = swBomFeat.GetTableAnnotations

    ConfigName = swBomFeat.Configuration

    For Each vTable In vTableArr
        Set swTable = vTable
        ProcessTableAnn swApp, swModel, swTable, ConfigName
    Next vTable
End Sub

 

Salut,

J'avais bien pensé à ça, du coup j'imagine que si tu proposes cette solution c'est que par la sélection sur le plan ce n'est pas possible ?

Merci infiniment encore une fois

Bonjour,

Si c'est possible, voir la version ci-dessous avec sélection de la nomenclature sur le plan.

Cordialement,

Option Explicit

Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim selmgr As SelectionMgr

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    
    Dim vTable As SldWorks.TableAnnotation
    Set selmgr = swModel.SelectionManager
    Set vTable = selmgr.GetSelectedObject6(1, -1)

    ProcessTableAnn swApp, swModel, vTable
End Sub

Sub ProcessTableAnn(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, swTableAnn As SldWorks.TableAnnotation)
    On Error Resume Next
    
    Dim nNumRow As Long
    Dim nNumColumn As Long
    Dim j As Long
    Dim i As Long
    Dim NumberComposant As String
    Dim ItemNumber As String
    Dim ItemNumberPrec As String
    Dim PartNumber As String
    Dim MomTableau() As String
    Dim n As Integer
    Dim nb As Integer
    n = 0
    nb = 0

    nNumRow = swTableAnn.RowCount

    Dim swBOMTableAnn As BomTableAnnotation
    Set swBOMTableAnn = swTableAnn
    
    Dim ConfigName As String
    ConfigName = swBOMTableAnn.Configuration

    For j = 0 To nNumRow - 1
        NumberComposant = swBOMTableAnn.GetComponentsCount2(j, ConfigName, ItemNumber, PartNumber)
        
        If ItemNumber = ItemNumberPrec & ".1" Then
            ReDim Preserve MomTableau(n)
            MomTableau(n) = j - 1
            n = n + 1
        End If

        ItemNumberPrec = ItemNumber
    Next j

    nb = UBound(MomTableau)
    While nb >= 0
        swBOMTableAnn.Dissolve (MomTableau(nb))
        nb = nb - 1
    Wend
End Sub

 

1 « J'aime »

Un énoooorme merci !
C'est par-fait !

Merci !!