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 !!