Code VBA pour changement de reference lors de l'ouverture d'un fichier .SLDPRT

Bonjour,

Dans un fichier .SLDPRT (n°1), j'utilise la fonction combiner avec une reference externe (fichier n°(2) .SLDPRT également),  afin d'obtenir directement par retrait, la forme finale souhaitée.

Le fichier n°1 étant une base standard et le fichier n°2 ayant une géométrie variable.

Lors d'une nouvelle variante, j'ouvre le fichier n°1 en cliquant sur l'onglet "Références..." et ainsi je remplace le fichier n°2 par un fichier n°3 avec nouvelle géométrie.

J'ai actuellement une macro qui me permet de selectionner les 3D à ouvrir, mais y a t'il un moyen pour ouvrir ce type de fichier automatiquement tout en donnant la main à l'utilisateur afin qu'il puisse selectionner la pièce de remplacement?

Merci d'avance pour votre aide.

 

 

Bonjour,

Pouvez vous mettre des fichiers exemple pour que l'on puisse vous aider?

Cordialement.

2 « J'aime »

Bonjour Yves.T,

je ne peux pas joindre les pièces d'origines pour des raisons de confidentialité, mais j'ai mis 3 pièces simples en exemples pour expliquer le principe.

Pièce 1 construite avec combinaison de Pièce 2 ou 3 suivant le choix de la réference à l'ouverture.

Merci.


changement_ref.rar

Pour moi le seul moyen de remplacer une pièce insérer dans une pièce est bien de passer par remplacer les référence avant d'ouvrir ce fichier.

Bonjour,

Dans la macro jointe le premier fichier à sélectionner est le fichier père et le deuxième est le fichier à soustraire. Attention aux noms des corps dans tes fichiers, cela devrait fonctionner avec tes fichiers en exemple.

Cordialement,


combiner.swp

Bonjour d.roger et merci du temps consacré à essayer de trouver une solution.

je viens d'essayer la macro, celle-ci ouvre bien le fichier père, mais lors de la seconde selection, le fichier à soustraire s'ouvre dans l'arborescence sans remplacer celui déja en place!

Petite precision concernant le nom des corps à soustraires, ils seront différent à chaque fois. (P1, P2, P3....)

Cordialement.

Bonjour,

Version 2 de la macro ....

Cordialement,


combiner.swp
1 « J'aime »

@d.roger,

Super, la Macro version 2 marche avec les pièces données pour exemple.

Par contre si je la lance avec un autre fichier ayant une arborescence differente (voir image en pièce jointe, la macro s'execute sans réaliser la fonction combiner.

Dans cet exemple, la pièce M2031 à bien été remplacée par la pièce M2032, mais pas soustrait au corps principale.

Est-ce que cela peut venir du fait qu'il y ait d'autres opérations de construction aprés la fonction combiner?(ici une révolution et un congé)

Merci.

 


arborescence_inf_.gif

Oui cela vient du fait que le type d'usinage effectué sur les pièces est différent, cela vient des lignes :

boolstatus = Part.Extension.SelectByID2("Révolution1", "SOLIDBODY", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("<" & NewName & ">-<Révolution1>", "SOLIDBODY", 0, 0, 0, True, 2, Nothing, 0)

Ou les noms des corps sélectionnés sont Révolution1, pour corriger ça il faut analyser l'arbre de création et récupérer les noms des corps, je n'ai pas le temps de le faire pour le moment mais si tu veux le faire tu dois pouvoir t'aider des lignes :

Set Feature = Part.FirstFeature
Dim Piece As String
While Not Feature Is Nothing
 FeatureName = Feature.Name
 If Feature.GetTypeName2 = "Stock" Then
    Piece = FeatureName
 End If
 Set Feature = Feature.GetNextFeature()
Wend

pour le faire.

Cordialement,

1 « J'aime »

Ok!

 je vais essayé de regarder ça, mais je ne suis pas du tout à l'aise avec les codes VBA! 

Il y a une forte probabilité que je sollicite à nouveau ton aide pour corriger la macro dès que tu auras de la disponibilité!

Encore merci et bon week end!

 

 

Rebonjour à tous!

j'ai essayé d'adapter la macro de d.roger, mais la fonction "combiner" ne s'execute toujours pas:

'Recherche dans le feature manager de la pièce à soustraire (j'ai mis du temps à comprendre d'ou venait le nom "Stock": faire CTRL G dans la fenêtre d'execution pour faire apparaître la liste des noms et type de chacune des features!)

Set Feature = Part.FirstFeature
        Dim Piece1 As String
        While Not Feature Is Nothing
        FeatureName = Feature.Name
         If Feature.GetTypeName2 = "Stock" Then
         Piece1 = FeatureName
         End If
        Set Feature = Feature.GetNextFeature()
        Wend

 

'selection du corps principal
    boolstatus = Part.Extension.SelectByID2("Enlèv. mat.-Extru.3", "SOLIDBODY", 0, 0, 0, False, 1, Nothing, 0) 

'selection de la part à soustraire
    boolstatus = Part.Extension.SelectByID2(Piece1, "BODYFEATURE", 0, 0, 0, True, 2, Nothing, 0) 

'Combiner les corps
    Set myFeature = Part.FeatureManager.InsertCombineFeature(15902, Nothing, Nothing)

Les 2 pièces sont bien selectionnées, mais la dernière ligne qui devrait réaliser la soustraction des corps reste inactive.!?!

Il faudrait que je puisse selectionner les coprs volumiques de la pièce à soustraire mais sans prendre celui du corps principal, j'ai essayé avec "SolidBodyFolder"...mais ça ne fonctionne pas non plus!

Je suis sur qu'il n'y a pas grand chose, mais mes connaissances en VBA ne sont pas suffisantes pour résoudre ce point bloquant.

Si quelqu'un peu m'orienter sur une solution éventuelle !?!

Merci.


lyncoa_20171010.gif

...en fait c'est bien ça, la ligne de code "combiner" marche avec:

boolstatus = Part.Extension.SelectByID2("<M2032_REN306VF_sortie-moule>-<REN305-02A.1\\Corps principal>", "SOLIDBODY", 0, 0, 0, True, 2, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("<M2032_REN306VF_sortie-moule>-<REN305_01A.1\\Corps principal>", "SOLIDBODY", 0, 0, 0, True, 2, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("<M2032_REN306VF_sortie-moule>-<REN305_CC.1\\Corps principal>", "SOLIDBODY", 0, 0, 0, True, 2, Nothing, 0)

    Set myFeature = Part.FeatureManager.InsertCombineFeature(15902, Nothing, Nothing)

...mais le nom des corps changera à chaque nouvelle pièce(Ex <M2031_REN305VF_sortie-moule>-<REN304_CC.1\\Corps principal>)!

Il faut donc que je trouve une façon pour selectionner les corps volumique de la nouvelle pièce insérée.

est-ce que quelqu'un peut m'aider à résoudre ce problème?

Merci d'avance.


lyncoa_20171011.gif

Bonjour,

Vous pouvez utiliser une boucle sur les feature qui va chercher une feature de type "SOLIDBODYFOLDER".

Une fois trouvé, l'assigner à une variable de type bodyfolder en utilisant feature.GetSpecificFeature()

Il ne reste plus qu'à boucler sur les solides et à les sélectionner avec Body.Select(). Il me semble qu'il est possible d'ajouter un flag avec cette méthode. Si ce n'est pas le cas, utilisez le selection manager pour faire les sélections.

Bonjour Yves.T,

j'avais essayé avec une boucle (avec le code de d.roger) qui devait récupérer le corps volumique de ma pièce1 (voir ci-dessosu)...

... mais fonctionne pas non plus! Je vais continuer à gratouiller, mais il doit me manquer une commande!

Est-ce qu tu aurais un exemple pour "feature.GetSpecificFeature()" et désolé pour ma question de débutant, mais qu'entend tu par "ajouter un flag"?

Set Feature = Part.FirstFeature
        Dim Piece1 As String
        While Not Feature Is Nothing
        FeatureName = Feature.Name
         If Feature.GetTypeName2 = "Stock" Then
         Piece1 = FeatureName
         End If
        Set Feature = Feature.GetNextFeature()
        Wend
       
    'selection du corps principal
    boolstatus = Part.Extension.SelectByID2("Enlèv. mat.-Extru.3", "SOLIDBODY", 0, 0, 0, False, 1, Nothing, 0)
    'selection de la part à soustraire
    boolstatus = Part.Extension.SelectByID2("<Piece1>-<Corps volumiques>", "BDYFOLDER", 0, 0, 0, True, 2, Nothing, 0)

    Set myFeature = Part.FeatureManager.InsertCombineFeature(15902, Nothing, Nothing)

Merci.

Je vais vous faire un exemple pour une boucle qui récupère les corps en VBA.

La boucle que vous avez mis en exemple récupère le nom d'une feature si c'est du type "Stock".

J'ai pas vérifié mais je ne suis pas sur que "Stock" soit une des valeurs retournées par GetTypeName2. . C'est à vérifier dans l'aide.

boolstatus = Part.Extension.SelectByID2("<Piece1>-<Corps volumiques>", "BODYFOLDER", 0, 0, 0, True, 2, Nothing, 0)

Dans cette instruction, vous lui demandez de sélectionner un objet nommé <Piece1>-<Corps volumiques> de type BODYFOLDER. il ne rique pas de le trouver :) mettez BODY à la place.

Dans les fonctions Select (SelectById, SelectById2,...) il y a un paramètre qui sert à mettre un indicateur sur une sélection, c'est ça un flag (drapeau).

Dans certaines fonctions de Solidworks, il est possible de sélectionner plusieurs objets (Exemple : dans un bossage, on sélectionne les esquisses de contours puis les courbes guides) le flag permet à solidworks de placer dans la bonne "case" les objets sélectionnés. Les sélections avec le flag 1 seront les contours, le flag 2, les courbes guides.

Bonjour,

C'est bricolé vite fait mais essaye avec la macro jointe pour voir si cela te convient.

Cordialement,


combiner.swp
1 « J'aime »

Vous trouverez en pièces jointes une macro commentée exemple

Seules conditions pour qu'elle fonctionne:

Nommer le corps principal en "MainBody"

Avoir + d'un corps volumique


feature.swp
1 « J'aime »

Bonjour et désolé pour le retour tardif, beaucoup de sujets en cours...!

@d.roger,

j'aimerais savoir "bricoler" le vba comme tu le fais, mais je crois qu'il me reste encore du chemin!

la macro fonctionne super bien (en single), mais quand je la fais appellée par une autre macro, il a fallu que j'enlève 'Option Explicit , que je lui rajoute un petit bout de code pour voir l'application Solidworks...

'Permet de voir l'application SolidWorks.
swApp.Visible = True
If swApp Is Nothing Then
Set swApp = CreateObject("SldWorks.Application")
swApp.Visible = True
End If

... et au final ça bug sur...

"Set Feature = Part.FeatureManager.InsertCombineFeature(swBodyOperationType_e.SWBODYCUT, Nothing, Nothing)"

...et ne semble pas enchainer sur le "Sub SelectBodies(swApp As SldWorks.SldWorks..."

Problème de communication donc ?!?

@Yves.T,

Pour renommer les corps principaux en "MainBody" cela devrait pouvoir ce faire, par contre il pourra y avoir un seul corp volumique pafrois. En tout cas merci pour les commentaires dans la macro, cela aide vraiment à la comprehension, je vais voir si je peux adapter!

Bonjour,

Déjà merci pour le compliment du début mais en vba je ne fais que "bricoler", c'est un langage de programmation que Yves.T maitrise beaucoup plus que moi qui suit plus orienté sur le C#.

Pour la suppression du option explicit, soit. Pour les lignes permettant d'afficher Solidworks OK si le lancement de la macro se fait par le biais d'une autre macro. Pour le Sub SelectBodies(.....), celui-ci a déjà été appelé au moment du bug donc pas de problème à ce niveau là et pour le bug sur la ligne "Set Feature = Part.FeatureManager.InsertCombineFeature(swBodyOperationType_e.SWBODYCUT, Nothing, Nothing)" , comme la très justement indiqué Yves.T dans sa macro ("mais surtout, on utilise la marque pour récupérer les bons") tu peux remplacer la ligne :

"Set Feature = Part.FeatureManager.InsertCombineFeature(swBodyOperationType_e.SWBODYCUT, Nothing, Nothing)"

par  les lignes :

Dim SelMgr As SelectionMgr
Set SelMgr = Part.SelectionManager
Set Feature = Part.FeatureManager.InsertCombineFeature(swBodyOperationType_e.SWBODYCUT, SelMgr.GetSelectedObject6(1, 1), SelMgr.GetSelectedObject6(1, 2))

A voir si cela fonctionne comme tu le veux.

Cordialement,

Bonjour d.roger,

Je viens de remplacer les lignes de code et ça bloc sur :

"Set Feature = Part.FeatureManager.InsertCombineFeature(swBodyOperationType_e.SWBODYCUT, SelMgr.GetSelectedObject6(1, 1), SelMgr.GetSelectedObject6(1, 2))"

Erreur 424 : objet requis

cordialement