Macro pour ouvrir un assemblage

bonjour

 

j'essaie de créer un macro pour ouvrir un assemblage. Je me suis inspiré du document propsé par Dassault mais je n'y arrive pas...

j'obtiens un Run Time Error type 13 (typ mismatch). au niveau de ma ligne:

swModel = swApp.OpenDoc6(assemblyFile, swDocumentTypes_e.swDocASSEMBLY, swOpenDocOptions_e.swOpenDocOptions_Silent, "", errors, warnings)

Je vous joins ma macro.... Pourriez vous me dire ce que je fais mal ?

merci d'avance de votre aide

LSE

 

 

Sub main()

Dim swModel As ModelDoc2
Dim swModelDocExt As ModelDocExtension
Dim swSelMgr As SelectionMgr
Dim partFile As String
Dim assemblyFile As String
Dim drawingFile As String
Dim errors As Integer
Dim warnings As Integer


Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc
Dim myModelView As Object
Set myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized


' Open an assembly document and select all components in the assembly

assemblyFile = "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\samples\introsw\bolt-assembly.sldasm"
Set swApp = CreateObject("SldWorks.Application")
Set swModel = swApp.GetOpenDocumentByName(assemblyFile)

swModel = swApp.OpenDoc6(assemblyFile, swDocumentTypes_e.swDocASSEMBLY, swOpenDocOptions_e.swOpenDocOptions_Silent, "", errors, warnings)
swModelDocExt = swModel.Extension
swSelMgr = swModel.SelectionManager


End Sub

Plusieurs erreur dans ta macro:

pas de déclaration pour swApp:

Dim swApp As SldWorks.SldWorks

Idem pour Part (tu récupèere le document actif mais tu ne l'expoite pas en plus dans la suite)

De plus il reste encore d'autre erreue ensuite je ne sais pas de quelle modèle tu est parti mais c'est pas ce qu'il y a de plus clean.

Essaye ça et adapte le ensuite:

https://help.solidworks.com/2020/English/api/sldworksapi/Open_Assembly_Document_Example_VB.htm?verRedirect=1

1 « J'aime »

sbadenis pas sur que ton lien soit le plus simple.

La version simple, solidworks es ouvert. Il ouvre le fichier que l'on veux (chemin écris en dur, version PART et non SLDASM

Voir ici : https://help.solidworks.com/2018/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.ISldWorks~OpenDoc6.html

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim doc As SldWorks.ModelDoc2
Dim fileerror As Long
Dim filewarning As Long

Sub main()

    Set swApp = Application.SldWorks
    swApp.Visible = True
   

    ' Get the current working directory before opening the document
    Debug.Print "Current working directory is " & swApp.GetCurrentWorkingDirectory
   

    Set doc = swApp.OpenDoc6("C:\Users\Public\Documents\SOLIDWORKS\SOLIDWORKS 2018\samples\tutorial\api\chair.sldprt", swDocPART, swOpenDocOptions_Silent, "", fileerror, filewarning)

End Sub

2 « J'aime »

J'ai choisit cette version car dans la sienne il ouvrait les assemblages en masqué (option_silent)

Mais effectivement la tienne est plus simple @mandragore .

Bonjour,

Je n'ai pas essayé la macro mais à la remarque : "j'obtiens un Run Time Error type 13 (typ mismatch)", je ne serais pas surpris que cela vienne du typage des variables "Dim errors As Integer" et "Dim warnings As Integer" qui normalement doivent être des "Long". Il faut aussi bien sûr vérifier que le fichier défini dans la variable "assemblyFile" soit bien existant.

Pour la question "Pourriez vous me dire ce que je fais mal ?" je ne m'étalerai pas, mes imminents collègues sbadenis et mandragore ayant déjà commencés à répondre ... mais je suis d'accord, voir plus, avec la remarque "mais c'est pas ce qu'il y a de plus clean" de sbadenis.

Cordialement,

1 « J'aime »

Merci bien pour vos réponses et votre réactivité !

 Je viens de tester les 2 propositions  mais je ne comprends pas car rien ne se passe.

Je n'ai plus de message d'erreur mais l'assemblage demandé ne s'ouvre pas pour autant...

avez vous une idée...

merci

 

Dans l'une comme dans l'autre assure toi, que le lien pointe bien vers un assemblage. Sinon cela n'ouvre rien.

Je t'invite à remplacer par le lien d'un de tes assemblages.

Si la mienne ne fonctionne pas c'est normal il es spécifier 'Part' et non ASM. Je viens de la reécrire avec ta variable et en rectifiant mon erreur. 

 

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim doc As SldWorks.ModelDoc2
Dim fileerror As Long
Dim filewarning As Long

Dim assemblyFile As String

Sub main()

    Set swApp = Application.SldWorks
    swApp.Visible = True
   

assemblyFile = "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\samples\introsw\bolt-assembly.sldasm"

 

    Set doc = swApp.OpenDoc6(assemblyFile , 2, 1, "", fileerror, filewarning)

End Sub

 

là ca devrait fonctionné j'ai remplacé 'swDocPART' par 2 qui correspond a 'swDocASSEMBLY'

Bonjour vous 2, 

cela fonctionne. un grand merci.

Le système accepte l'ouverture d'un assemblage indépendant mais pas celui d'un assemblage constituant ...

je m'explique

je suis dans 130100 qui est constitué de 130101, 130102... 

je peux ouvrir 110101 mais pas 130101 an lançant la macro depuis 130100... est ce normal ?

merci de vos lumières

Dans la théorie l'assemblage est déjà ouvert donc solidworks va pas le ré-ouvrir.

 

Il faut jouer avec d'autre fonction je pense, met ton 130101 en alléger et activer ta macro, voir si il passe en résolue.

 

C'est de l'informatique les logiciels peuvent être très 'con'. Il y a énormément de fonction différente pour chaque fonction j'ai vue un '

swApp.CreateNewWindow' qui peu surement t'aider a forcé le logiciel a ouvrire ton 130101 dans une nouvelle fenêtre.

 

Après on a pas mal de monde qui fais de l'api ici si tu nous éclaire un peu plus sur ce que tu souhaite faire et pourquoi quelqu'un la peu être déjà fais ou on pourra t'aiguiller plus rapidement.

heu... je ne suis pas du tout spécialiste...

du coup, il faudrait utiliser quoi à la place de  "Set doc = swApp.OpenDoc6  ...."?

Si ton sous-assemblage est déjà ouvert dans SW alors il faut utiliser la fonction "ActivateDoc3" pour l'ouvrir (en réalité c'est activer qu'il faut dire puisqu'il est déjà ouvert) dans une nouvelle fenêtre de SW.

Cordialement,

1 « J'aime »

@mandragore : je ne suis pas tout à fait d'accord avec la remarque "C'est de l'informatique les logiciels peuvent être très 'con'. Il y a énormément de fonction différente pour chaque fonction", je trouve que les API sont plutôt assez logiques justement. Dans le cas présent il y a bien une différence entre "ouvrir" et "activer" ...

Cordialement,

Je viens de tester. Ca marche impécable. C'était donc une question de vocabulaire. Encore un grand merci. Je poursuis...