api solidworks création d'une pièce virtuelle dans un assemblage

Bonjour la communauté.

 

Dans le but de l'élaboration d'une macro au sein de mon entreprise je souhaiterais autaumatiser la création de pièces virtuelle dans l'assemblage.

Cependant je n'arrive pas a élaborer le code permettant cette action.

 

ci dessous le debut de mes recherches.

 

Dim swApp As Object
Sub main()

Set swApp = Application.SldWorks
Set swmodel = swApp.ActiveDoc
Dim swModelTitle As SldWorks.ModelDoc2


     
'-------------------------------------------------------------------------------------------------------------
'Vérification qu 'un document fichier asm est ouvert
'-------------------------------------------------------------------------------------------------------------

     If Not swmodel Is Nothing Then 'si un fichier SW est ouvert
     Debug.Print "un fichier SW est ouvert" 'alors msg debug et poursuite

     Else: MsgBox ("Il n'y a pas de fichier SW ouvert, merci d'ouvrir un assemblage et relancer la macro") 'si pas de fichier SW ouvert => msg
Exit Sub
    End If
    

     
     Dim type_doc As String
     type_doc = swDocumentTypes_e.swDocPART
     Debug.Print type_doc
     
     If swmodel.GetType = swDocumentTypes_e.swDocASSEMBLY Then
     Debug.Print "Le fichier ouvert est un fichier assemblage"
     Else: Debug.Print "le fichier ouvert n'est pas un fichier assemblage, merci d'ouvrir un assemblage et relancer la macro"
     MsgBox ("le fichier ouvert n'est pas un fichier assemblage, merci d'ouvrir un assemblage et relancer la macro")
Exit Sub
      End If
      

'----------------------------------------------------------------------------------------------------------
'Récupéartion du nom du fichier
'----------------------------------------------------------------------------------------------------------
Dim chemin As String
Dim name_asm As String
name_asm = swmodel.GetTitle
chemin = swmodel.GetPathName
Debug.Print "nom du fichier : " & name_asm
Debug.Print "chemin d'acces : " & chemin
Dim nom_asm
nom_asm = Left(name_asm, (InStrRev(name_asm, ".", -1, vbTextCompare) - 1))
Debug.Print nom_asm


'-----------------------------------------------------------------------------------------------------------
'Création pièce empreinte
'-----------------------------------------------------------------------------------------------------------


Dim nom_pe As String
nom_pe = "EMP_" & nom_asm
Debug.Print "nom pièce empreinte : " & nom_pe
Dim new_part

boolstatus = swmodel.Extension.SelectByID2("Plan de face", "PLANE", 0, 0, 0, False, 0, Nothing, 0) 'Sélection du plan de face
new_part = swmodel.InsertNewVirtualPart(boolstatus, nom_pe)

swmodel.ForceRebuild3 True
swmodel.ViewZoomtofit2


End Sub

 

 

le code erreur obtenu sur la ligne new_part = ....

 

avez vous une idée de ce que je fait mal???

j'avoue que l'exemple de l'aide API me laisse perplexe...

 

 

 

 


sans_titre.png

Salut,

Une règle de base en programmation, c'est de correctement déclarer tes variables.

En l'occurence, la ligne sur laquelle il y a une erreur :

Dim pour lancer la déclaration

New_part le nom de la variable

as pour définir le type

... un type

 

Il te manque donc le type. je pense qu'il s'agit du type pièce à voir dans l'aide...

1 « J'aime »

Salut,

A priori tu mélanges le nom avec le composant en soi.

Change :

Dim nom_pe As String

En 

Dim nom_pe As Component2

Et supprimes la ligne :

nom_pe = "EMP_" & nom_asm

Edit : voir la macro corrigée en PJ.

Edit 2 :

Si tu veux changer le nom, il faut faire par la suite :

nom_pe.Name2 = EMP_" & nom_asm

J'ai remis à jour la macro en PJ.


macro_piece_virtuelle.pdf
1 « J'aime »

@ remrem

Je debute en prog et ai encore de grosse lacune

Je pensais que le fait de ne pas mettre as ... laissait au prog le choix de prendre le type de variable le plus adapté.

 

@.PL

J'ai toujours le même message d'erreur.

 

L'erreur est sur la même ligne ?

Dans le 3D de SolidWorks, il y a bien une face sélectionnée ?

Edit : essaye la modification en pièce jointe.

S'il y a une erreur, précise bien sur quelle ligne stp.


macro_piece_virtuelle.txt

oui toujours sur la même ligne .

J'ai l eplan de face qui est sélectionnéà la ligne précédente.

 

En fait c'est pour cela qu'il faut prendre l'habitude de déclarer toutes les variables correctement.

Si on déclare pas les variables elles utilisent le type variant par défaut. Ce qui peut poser des problèmes de fonctionnalité et de performances...

1 « J'aime »

toujours la ligne ci dessous en erreur

new_part = swmodel.InsertNewVirtualPart(boolstatus, nom_pe)
 

erreur d'éxecution 13 imcompatibilité de type

 

 

Question bete qui n'a surement rien à voir avec le probleme, mais le "_" n'est pas une source d'erreur ?

Je ne pense pas car je l'ai utilisé beaucoup dans une précédente macro que j'ai faite auparavent.

 

Je n'ai pas eu de problèmes outre mesure.

 

Après vu mon inexpérience je ne peux rien assurer...

 

1 « J'aime »

Je ne pourrais probablement pas tester avant demain soir.

@.PL 

 

Pas de soucis c'est déjà très sympa d'essayer de m'aider...

Je vais continuer quoi qu'il arrive mes recherches et tests et posterais si cela évolue..

 

 

Bonsoir,

En regardant l'aide de l'API, les types e variables en paramètre ne sont pas bon.

A mon sens, la bonne écriture est celle dans le fichier joint (testé et fonctionnel).


correction_macro_piece_virtuelle.txt

@lyric.

 

En effet cela fonctionne a merveille.

Un grand merci a toi.

Pour l'instant j'avoue ne pas comprendre trop le pourquoi du comment. Je vais me pencher sur ces lignes de codes afin d'en comprendre les tenant et les aboutissants.) 

 

Encore Merci

 

Happydad

Bonjour Happydad,

Pour comprendre, un petit tour sur l'aide de l'API en mettant la fonction InsertNewVirtualPart comme critère de recherche explicitera en grande partie d'où provenait le problème.

Le type de variable attendu en paramètre par cette fonction est explicité et c'est de là que provenanit le problème (premier paramètre incompatible).

Le point txt de lyric ne fonctionne pas quand je copie le texte dans une macro vierge en vba (pb d'accents entre autres).

Quelqu'un peut poster le .swp ou .swb s'il vous plait??

' la macro fonctionnel donne cela une fois corrigé ;)

Dim swApp As Object
Sub main()
Set swApp = Application.SldWorks
Set swmodel = swApp.ActiveDoc
Dim swModelTitle As SldWorks.ModelDoc2
'-------------------------------------------------------------------------------------------------------------
'Vérification qu 'un document fichier asm est ouvert
'-------------------------------------------------------------------------------------------------------------
     If Not swmodel Is Nothing Then 'si un fichier SW est ouvert
     Debug.Print "un fichier SW est ouvert" 'alors msg debug et poursuite
     Else: MsgBox ("Il n'y a pas de fichier SW ouvert, merci d'ouvrir un assemblage et relancer la macro") 'si pas de fichier SW ouvert => msg
Exit Sub
    End If
     Dim type_doc As String
     type_doc = swDocumentTypes_e.swDocPART
     Debug.Print type_doc
     If swmodel.GetType = swDocumentTypes_e.swDocASSEMBLY Then
     Debug.Print "Le fichier ouvert est un fichier assemblage"
     Else: Debug.Print "le fichier ouvert n'est pas un fichier assemblage, merci d'ouvrir un assemblage et relancer la macro"
     MsgBox ("le fichier ouvert n'est pas un fichier assemblage, merci d'ouvrir un assemblage et relancer la macro")
Exit Sub
      End If
'----------------------------------------------------------------------------------------------------------
'Récupé©artion du nom du fichier
'----------------------------------------------------------------------------------------------------------
Dim chemin As String
Dim name_asm As String
name_asm = swmodel.GetTitle
chemin = swmodel.GetPathName
Debug.Print "nom du fichier : " & name_asm
Debug.Print "chemin d'acces : " & chemin
Dim nom_asm
nom_asm = Left(name_asm, (InStrRev(name_asm, ".", -1, vbTextCompare) - 1))
Debug.Print nom_asm
'-----------------------------------------------------------------------------------------------------------
'Création pièce empreinte
'-----------------------------------------------------------------------------------------------------------
Dim nom_pe As SldWorks.Component2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swPlaneFeature As SldWorks.Feature
Dim swPlane As SldWorks.RefPlane
Dim new_part As Long
Dim boolstatus As Boolean

Set swSelMgr = swmodel.SelectionManager
boolstatus = swmodel.Extension.SelectByID2("Plan de face", "PLANE", 0, 0, 0, False, 0, Nothing, 0) 'Sélection du plan de face
Set swPlaneFeature = swSelMgr.GetSelectedObject6(1, -1)
Set swPlane = swPlaneFeature.GetSpecificFeature2

new_part = swmodel.InsertNewVirtualPart(swPlane, nom_pe)

nom_pe.Name2 = "À EMP_" & nom_asm

swmodel.ForceRebuild3 True
swmodel.ViewZoomtofit2
End Sub