API VBA SolidWorks : lecture seule

Bonjour,

 

Je mets au point une macro VBA qui permet d'obtenir la lecture écriture sur les fichiers de bibliothèque qui sont par défaut en lecture seule.

 

J'arrive à enlever la lecture seule dans Windows (avec [SetAttr FileName, vbReadOnly] ou [SetAttr FileName, vbNormal]) mais il faut ensuite recharger le composant dans SolidWorks en en lecture écriture.

 

Avec une macro par apprentissage, en faisant "Fichier > Recharger" et en décochant la case lecture seule, je n'obtiens que :

Set Part = swApp.ActiveDoc
Part.FileReload

 

qui n'a aucun effet sur la lecture écriture.

 

J'ai trouvé l'API "ReloadOrReplace", mais je n'arrive pas à l'utiliser correctement :

ret = Part.ReloadOrReplace(0, 0, 1)

n'a pas l'effet escompté : je crois que cela correspond plutôt à "remplacer un composant dans un assemblage".

 

 

Quelqu'un a une idée ? Merci d'avance

Il est toujours dangereux de déverouiller les fichiers en lecture

il doit bien avoir une raison pour qu'ils soit verrouilleés !!

Bonjour

ReloadorReplace est bien la méthode à utiliser (elle remplace FileReload)

Il faut indiquer le nom du fichier à remplacer/recharger, dans l'aide j'ai trouvé ça :

 

This example shows how to reload the active model with the last saved version of the model.

[...]

Dim swApp As SldWorks.SldWorks

Dim swModel As SldWorks.ModelDoc2

Dim nRetVal As Long

 

Set swApp = CreateObject("SldWorks.Application")

Set swModel = swApp.ActiveDoc

' Fails for drawings because functionality is not supported in user interface

nRetVal = swModel.ReloadOrReplace(False, swModel.GetPathName, True)

J'ai pas testé, donc à confirmer

2 « J'aime »

Merci y.pacquelet je vais tester ça demain, mais je crois que je l'ai déjà utilisé de cette façon !

 

Pour info dpusel, notre bilbiothèque est en lecture seule pour éviter que tout le monde ne la modifie par inadvertance.

On a par exemple un seul fichier roulement avec de nombreuses configurations (famille de pièce) ce qui évite d'avoir 200 fichiers différents.

Si on veut ajouter un roulement, il faut obligatoirement enlever la lecture seule...mais on la remet par la suite !

Salut au forum.

Salut Lucas.

Attention, c'est pas trop conseillé d'avoir un fihier piéce avec bcp de configs. Surtout pour un roulement.

Ton fichier risque d'exploser en taille, après avoir affiché toutes les configs.

Cordialement

 

Julian

Merci du conseil, l'entreprise fonctionne comme ça depuis 2006 avant mon arrivée...

 

Voici une macro qui recharge le document actif si c'est une piece, ou le composant selectionné dans le cas d'une assemblage

 

 

Option Explicit

 

Dim swApp As SldWorks.SldWorks

Sub main()

    Dim swModel                 As SldWorks.ModelDoc2

    Dim swPart                  As SldWorks.PartDoc

    Dim swAss                   As SldWorks.AssemblyDoc

    Dim nRetVal                 As swComponentReloadError_e

    

    Set swApp = CreateObject("SldWorks.Application")

    Set swModel = swApp.ActiveDoc

 

    Select Case swModel.GetType

    Case swDocumentTypes_e.swDocPART

        Set swPart = swModel

        swModel.ForceReleaseLocks

        nRetVal = swModel.ReloadOrReplace(False, swModel.GetPathName, True)

        

    Case swDocumentTypes_e.swDocASSEMBLY

        ' On test si un composant est selectionné

        Dim blUnSelected As Boolean

        Set swAss = swModel

        Dim swSelectionMgr As SldWorks.SelectionMgr

        Set swSelectionMgr = swModel.SelectionManager

        If swSelectionMgr.GetSelectedObjectCount2(0) = 0 Then blUnSelected = True

        If swSelectionMgr.GetSelectedObjectType3(1, 0) <> swSelectType_e.swSelCOMPONENTS Then blUnSelected = True

        

        If blUnSelected Then

            MsgBox "Veuillez selectionner un composant", vbInformation

            Exit Sub

        End If

        

        ' On recupere le composant selectionné

        Dim swComponent As SldWorks.Component2

        Set swComponent = swSelectionMgr.GetSelectedObject6(1, 0)

        

        ' On le recharge

        Dim swDoc As SldWorks.ModelDoc2

        Set swDoc = swComponent.GetModelDoc2

        

        swDoc.ForceReleaseLocks

        nRetVal = swDoc.ReloadOrReplace(False, UCase(swDoc.GetPathName), True)

     End Select

       

     ' Message de comfirmation

     Dim stErr As Variant

     stErr = Array("Okay", "Access error", "Version error", "Modified not reloaded error", "Invalid option", _

                  "File not saved error", "Invalid component error", "Unexpected error", "Component light weight error", _

                  "File doesnt exist error", "File invalid or same name error", "Document has no view", "Document already opened error", _

                  "Document event error", "Document not changed", "Reload cancel")

     

     MsgBox CStr(stErr(nRetVal))

       

        

        

'        ' Ou on le remplace

'        Dim stPath As String: stPath = ...

'        Dim stConfigName As String: stConfigName = ...

'        Dim blRet As Boolean

'        blRet = swAss.ReplaceComponents(stPath, stConfigName, True, True)

'

'        If blRet Then

'            MsgBox "Remplacement réussi", vbInformation

'        Else

'            MsgBox "Remplacement échoué", vbExclamation

'        End If

    

 

   

End Sub


replace.zip
8 « J'aime »