lister les piéces d'un assemblage (résolu)

vos questions concernant les API SolidWorks

lister les piéces d'un assemblage (résolu)

Messagepar adn56 » Ven 21 Déc 2012, 16:16

Bonjour à tous, voila ma question
J'écris un code qui vérifié la cohérence d'un assemblage (dépendance, et propriétés perso)
j'arrive à faire tout ce que je veux sauf une seul chose !
compter les piéces ! une semaine que je bosse la dessus, j'ai essayé
aussi bien les getfirstdocuments, comme les enumdocuments
mais à chaque fois cela me donne le même résultat qu'un simple getdependencies...
En clair si j'ai 5 fois la même piéce dans l'assemblage je ne le sais pas :x

Exemple de test sous VB.NET
Code: Tout sélectionner
Dim swApp As sldworks.SldWorks

        Dim swModel As sldworks.ModelDoc2
        'Dim swComp As sldworks.Component2
        ' Dim swSelMgr As sldworks.SelectionMgr



        swApp = CType(System.Runtime.InteropServices.Marshal.GetActiveObject("SldWorks.Application") _
             , SolidWorks.Interop.sldworks.SldWorks)
        ' Dim obj As sldworks.EnumDocuments2 = swApp.EnumDocuments2()



        swModel = CType(swApp.IGetFirstDocument2, sldworks.ModelDoc2)
        'obj.Next(1, swModel, 2)
        Do While Not swModel Is Nothing
            ' swSelMgr = CType(swModel.SelectionManager, sldworks.SelectionMgr)
            'swComp = CType(swSelMgr.GetSelectedObject6(-1, 0), sldworks.Component2)

            MsgBox("" & " - " & swModel.GetTitle & "")
            swModel = CType(swModel.GetNext, sldworks.ModelDoc2)

        Loop

    End Sub


Par pitié je cherche depuis une semaine, je devient fou :cry:
ou est la propriété d'occurence ? Help please...
Dernière édition par adn56 le Mer 30 Jan 2013, 13:30, édité 1 fois.
programmation is good for you ^^
Avatar de l’utilisateur
adn56
Ewok SolidWorks
 
Messages: 26
Inscription: Jeu 29 Nov 2012, 18:11

Re: lister les piéces d'un assemblage

Messagepar adn56 » Ven 21 Déc 2012, 17:31

j'suis dégouté, visiblement le sujet à été traité et résolu chez vous en 2010,mais plus aucun lien fonctionne !
svp, personne peut me filer une piste de recherche ?
j'ai vu le code traversing assembly, je vais essayer de la traduire en .NET, mais c'est chaud.. en tout cas sachez que je ferais part de me recherche et si des personne on besoin d'aide en VB.NET je suis la !
programmation is good for you ^^
Avatar de l’utilisateur
adn56
Ewok SolidWorks
 
Messages: 26
Inscription: Jeu 29 Nov 2012, 18:11

Re: lister les piéces d'un assemblage

Messagepar Titifonky » Ven 21 Déc 2012, 23:56

Voici une macro qui permet de comptabiliser les composants d'un assemblage avec quelques filtres possibles sur les configurations, exclus ou supprimé.
Il faut lancer la sub présente dans le module Macro_ListerLesComposants.

PS : Le fichier est compréssé avec 7zip sinon il passe pas en pièce jointe du message, limité à 256ko

Bon courage
Fichiers joints
Frameworks2013.7z
(159.24 Kio) Téléchargé 411 fois
Titifonky
Padawan SolidWorks
 
Messages: 89
Inscription: Mar 05 Avr 2011, 8:23
Localisation: Lille .............. SW Premium 2013 .......... Seven 64b

Re: lister les piéces d'un assemblage

Messagepar Polaroid » Lun 24 Déc 2012, 9:09

Merci Titifonky !
Forum CAO 3D, le forum d'aide et de discussions techniques autour du logiciel SolidWorks.
Polaroid
Padawan SolidWorks
 
Messages: 74
Inscription: Mer 22 Juin 2005, 19:20

Re: lister les piéces d'un assemblage

Messagepar adn56 » Mer 26 Déc 2012, 18:15

je regarde cela dés que possible, je ne manquerais pas de vous faire partager mes codes.
d'avance merci à toi !
A lire en diagonale ton code est trés bien formaté, utilisation de classe et tout pour un bon codage, il n'y a plus qu'a le comprendre et à le traduire en .NET, je vois que tu utilises la fonction getchlidren pour la recherche, et je suppose une fonction récursive ?
Bref je décrypte tout ça, mais si tu as 5 min pour donner l'algo de ton code pour cette fonction je t'en serais redevable ^^
Merci encore et bonne fêtes :mrgreen:
programmation is good for you ^^
Avatar de l’utilisateur
adn56
Ewok SolidWorks
 
Messages: 26
Inscription: Jeu 29 Nov 2012, 18:11

Re: lister les piéces d'un assemblage

Messagepar Titifonky » Mer 26 Déc 2012, 23:29

Pour SW chaque pièce ou assemblage est un composant.
L'assemblage est donc hiérarchisé comme ceci :

Exemple :

Composant racine
I-- Composant 1 (Pièce)
I-- Composant 2 (Pièce)
I-- Composant 3 (Assemblage)
________I-- Composant 4 (Pièce)
________I-- Composant 5 (Assemblage)
________________I-- Composant 6 (Pièce)
________________I-- Composant 7 (Pièce)
________I-- Composant 8 (Pièce)
I-- Composant 9 (Pièce)

Voici donc l'algo :
Pour le besoin de l'algo, j'ai crée une classe ExtComposant avec une référence au composant et une propriété Nb.
Fonction de base
__On créer une collection permettant de récupérer la liste des pièces.
__On récupère le modèle courant
__On récupère la configuration courante
__On récupère le composant racine de la configuration courante, c'est à dire le modèle actuelle sous forme de composant.
__On lance la fonction récursive avec comme argument le composant racine
__
__On renvoi la collection de composants
Fin de la fonction de base

Fonction récursive
__On liste les composants enfant du composant.
__On boucle sur la liste des composants enfants.
______Si le composant enfant est une pièce
_________Si le composant enfant n'est pas dans la collection, on l'ajoute.
_________Sinon, on rajoute 1 au nb du composant enfant
______Si le composant est un assemblage et qu'il n'est pas supprimé, on lance la fonction récursive
__Fin de la boucle sur les composants enfants
Fin de la fonction récursive
Titifonky
Padawan SolidWorks
 
Messages: 89
Inscription: Mar 05 Avr 2011, 8:23
Localisation: Lille .............. SW Premium 2013 .......... Seven 64b

Re: lister les piéces d'un assemblage

Messagepar adn56 » Ven 28 Déc 2012, 10:45

oui c'est bien ce que j'ai lu, en revanche l'utilisation massive des classes rends le code difficile à transposer en .net (nombre des instruction n'existe pas en .net et les déclarations d'object COM pause des soucis de cast et de déclaration, il va faloir que je déclassifie ce code pour en retrouver l'expression basique à base de model2 et non plus de Extmodel. ça devrait le faire avec le temps. Ce que j'ai du mal à comprendre dans cette philosophie d'API c'est les différences entre model2, component2, feature, FeatureManager, TreeControlItem et extension qui permette tous visiblement de faire plus ou moins la meme chose, c'est déroutant...
Exemple de code d'une fonction de recherche récursive avec l'objet FeatureManager et le TreeControlItem (comme par hazars qui n'existe pas sous 2007 sp 0 -_- j'suis maudit...)

Code: Tout sélectionner
Sub main()

        Dim swApp As SldWorks.SldWorks

        Dim myModel As SldWorks.ModelDoc2

        Dim featureMgr As SldWorks.FeatureManager

        Dim rootNode As SldWorks.TreeControlItem

        Set swApp = Application.SldWorks

        Set myModel = swApp.ActiveDoc

        Set featureMgr = myModel.FeatureManager

        Set rootNode = featureMgr.GetFeatureTreeRootItem()

        If Not rootNode Is Nothing Then

            Debug.Print

            traverseLevel = 0

            traverse_node (rootNode) ' fonction récursive (code de la fonction traverse_node sur demande)

        End If

    End Sub


d'ailleurs il faut que je regarde comment tu sors de la fonction récursive, car c'est un des soucis de ce genre d'appel, et ton expérience va bien m'aider. Encore merci pour ton aide avec l'algo, y'a plus qu'a décortiquer toutes tes classes pour retranscrire le code (que je mettrais en partage ICI)
Tout en priant pour que tu ne fasse pas appel à des nouvelles fonctions car j'utilise pour mes test un vieux SW2007 pour ensuite le valider sur la version 2012 du bureau. Kenavo l'ami !
programmation is good for you ^^
Avatar de l’utilisateur
adn56
Ewok SolidWorks
 
Messages: 26
Inscription: Jeu 29 Nov 2012, 18:11

Re: lister les piéces d'un assemblage

Messagepar adn56 » Ven 28 Déc 2012, 17:21

Bien décidément je suis maudit,j'ai converti le code exemple en vb.net, mais il ne marche qu'a partir de la version 2008+
Du coup je me dis, tiens si j'essayais celui de titifonky ?
Bha pareil, je lance la macro sur la sub ListerLesComposants et PAN !
dés la première ligne ou il fait une instance de la classe ExtSldWorks il plante Evil
En fait je pige pas, l'erreur est sur la ligne suivante :
Code: Tout sélectionner
Private pSw                 As SldWorks.SldWorks

c'est pourtant comme cela qu'il faut faire pour déclaré l'API SW -_-'
j'ai essayé de remplacer le private par un DIM, mais même punition, bibliothèque introuvable Oo"
je viens de tester une autre macro avec le même texte et elle fonctionne :| la j'avoue je pige plus, problème de version je suppose ?
programmation is good for you ^^
Avatar de l’utilisateur
adn56
Ewok SolidWorks
 
Messages: 26
Inscription: Jeu 29 Nov 2012, 18:11

Re: lister les piéces d'un assemblage

Messagepar Titifonky » Ven 28 Déc 2012, 17:32

Surement un pb de reference aux dlls
Titifonky
Padawan SolidWorks
 
Messages: 89
Inscription: Mar 05 Avr 2011, 8:23
Localisation: Lille .............. SW Premium 2013 .......... Seven 64b

Re: lister les piéces d'un assemblage

Messagepar adn56 » Ven 28 Déc 2012, 18:21

c'est ce que je me suis dis, mais bon, étrange tout de même...
Enfin voila j'ai reussi à trouver un code qui marche pour lire [url]toutes[/url] les piéces d'un assemblage.
il y a bien sur la fameuse fonction récursive ^^, bon c'est de la bricole mais le débug affiche bien les 455 piéces (pour 25 en dépendencies ;) )
Voici ma contribution (macro SW2007) le code complet en vb.net stand alone suivra avec le travail sur la collection des piéces trouvés.
Merci pour ton aide et au plaisir d'améliorer cela avec toi ;)

Code: Tout sélectionner
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim Part As SldWorks.ModelDoc2
Dim SelMgr As SldWorks.SelectionMgr
Dim boolstatus As Boolean
Dim i As Integer 'nombre de piéces

Sub main()
i = 0
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
Set SelMgr = Part.SelectionManager

Dim rootDoc As SldWorks.ModelDoc2
Dim rootConfig As SldWorks.Configuration
Dim rootComp As SldWorks.Component2
Dim configMgr As SldWorks.ConfigurationManager

Set rootDoc = swApp.ActiveDoc
Set configMgr = Part.ConfigurationManager
Set rootConfig = configMgr.ActiveConfiguration
Set rootComp = rootConfig.GetRootComponent

Call TraverseComponents(rootComp)

End Sub


Function TraverseComponents(parentComp As SldWorks.Component2)
    Dim vChildComponents As Variant
    Dim vObj As Variant
    Dim childComp As SldWorks.Component2
    Dim childDoc As SldWorks.ModelDoc2
    Dim childConfigName As String

    vChildComponents = parentComp.GetChildren

    For Each vObj In vChildComponents
        Set childComp = vObj
        Set childDoc = childComp.GetModelDoc
        childConfigName = childComp.ReferencedConfiguration
        i = i + 1
   
 Debug.Print i, childComp.Name2, childComp.GetPathName, childComp.IsHidden(True), childComp.IsFixed, childComp.GetSuppression, childComp.Solving

        Call TraverseComponents(childComp)

    Next vObj

End Function
programmation is good for you ^^
Avatar de l’utilisateur
adn56
Ewok SolidWorks
 
Messages: 26
Inscription: Jeu 29 Nov 2012, 18:11

Re: lister les piéces d'un assemblage

Messagepar Titifonky » Ven 28 Déc 2012, 19:26

Tu as quelle version de SW ?
Titifonky
Padawan SolidWorks
 
Messages: 89
Inscription: Mar 05 Avr 2011, 8:23
Localisation: Lille .............. SW Premium 2013 .......... Seven 64b

Re: lister les piéces d'un assemblage

Messagepar adn56 » Sam 29 Déc 2012, 10:20

je suis avec un vieux 2007 pour les essais et sur un 2011 au bureau
programmation is good for you ^^
Avatar de l’utilisateur
adn56
Ewok SolidWorks
 
Messages: 26
Inscription: Jeu 29 Nov 2012, 18:11

Re: lister les piéces d'un assemblage

Messagepar adn56 » Sam 19 Jan 2013, 17:11

Bien j'ai bien avancé depuis, un soft pour les attributs et un autre pour les nomenclatures avec tout un tas de test sur la composition de l'affaire (EX : les dépendances sont elles bien toutes dans le dossier affaire, il y a t'il un plan pour cette piéce, le format du nom de fichier, les qte prévu et celle réellement trouvé dans l'assemblage, la visserie est elle renseigné enfin bref plein de chose que nous utilisons en standard au BE.) le résultat est assez sympa en vb.net, seul contrainte avec SW de lancé.

Si une demande se fait sentir je posterai le codage minimum pour intéragir avec SW en VB.NET (option explicit et strict sur On)
Merci encore pour le coup de main et à charge de revanche ;)
kenavo
programmation is good for you ^^
Avatar de l’utilisateur
adn56
Ewok SolidWorks
 
Messages: 26
Inscription: Jeu 29 Nov 2012, 18:11

Re: lister les piéces d'un assemblage

Messagepar Titifonky » Lun 21 Jan 2013, 8:40

Bonjour,
Il existe des solutions pour "scanner" les fichiers SW et les éditer sans ouvrir SW. Tu peux aller voir dans l'aide de l'api "SolidWorks Document Manager API".
C'est une macro ou un programme externe ?
Je trouve d'ailleurs que les macros VB ou C# sont extrêmement lentes à l’exécution par rapport à un équivalent VBA.
Titifonky
Padawan SolidWorks
 
Messages: 89
Inscription: Mar 05 Avr 2011, 8:23
Localisation: Lille .............. SW Premium 2013 .......... Seven 64b

Re: lister les piéces d'un assemblage

Messagepar adn56 » Mer 23 Jan 2013, 13:04

salut, c'est un programme externe et autonome, pour des assemblage de moins mille piéces c'est plutot rapide.
Pour ce qui est de traiter les nomenclatures et autre copie de projet sans avoir SW d'ouvert, j'ai vu ça, mais c'est soumis à licence désormais, non ?

je pense faire un sujet bientôt sur les bases en vs studio de $soft ;)
kenavo
programmation is good for you ^^
Avatar de l’utilisateur
adn56
Ewok SolidWorks
 
Messages: 26
Inscription: Jeu 29 Nov 2012, 18:11

Suivante

Retourner vers Questions générales sur les API

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités

banniere