SolidWorks VBA API: Alleen-lezen

Hallo

 

Ik ben bezig met het ontwikkelen van een VBA-macro waarmee je kunt lezen schrijven op bibliotheekbestanden die standaard alleen-lezen zijn.

 

Het lukt me om de read-only in Windows te verwijderen (met [SetAttr FileName, vbReadOnly] of [SetAttr FileName, vbNormal]) maar dan moet ik de component opnieuw laden in SolidWorks in read-write.

 

Met een macro door training, door te doen "File > Reload" en het vinkje uit te vinken van de alleen-lezen box, krijg ik alleen:

Deel instellen = swApp.ActiveDoc
Deel.BestandHerladen

 

wat geen effect heeft op lezen en schrijven.

 

Ik heb de API "ReloadOrReplace" gevonden, maar ik kan deze niet correct gebruiken:

ret = Deel.HerladenOrVervangen(0, 0, 1)

heeft niet het gewenste effect: ik denk dat het meer overeenkomt met "het vervangen van een onderdeel in een assemblage".

 

 

Iemand een idee? Bij voorbaat dank

Het is altijd gevaarlijk om gelezen bestanden te ontgrendelen

Er moet een reden zijn om ze op slot te doen!!

Hallo

ReloadorReplace is de te gebruiken methode (het vervangt FileReload)

Je moet de naam van het bestand dat moet worden vervangen / opnieuw geladen aangeven, in de help vond ik dit:

 

In dit voorbeeld ziet u hoe u het actieve model opnieuw laadt met de laatst opgeslagen versie van het model.

[...]

Dim swApp als SldWorks.SldWorks

Dim swModel als SldWorks.ModelDoc2

Dim nRetVal zo lang

 

Stel swApp = CreateObject("SldWorks.Application") in

Stel swModel = swApp.ActiveDoc in

' Mislukt voor tekeningen omdat functionaliteit niet wordt ondersteund in de gebruikersinterface

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

Ik heb niet getest, dus nog te bevestigen

2 likes

Bedankt y.pacquelet , ik zal dit morgen testen, maar ik denk dat ik het al op deze manier heb gebruikt!

 

Ter info , onze bibliotheek is alleen-lezen om te voorkomen dat iedereen deze per ongeluk wijzigt.

We hebben bijvoorbeeld een enkel rollend bestand met veel configuraties (deelfamilie) waardoor we geen 200 verschillende bestanden hoeven te hebben.

Als u een lager wilt toevoegen, moet u de alleen-lezen functie verwijderen... Maar we hebben het daarna weer teruggezet!

Hallo op het forum.

Hoi Lucas.

Wees voorzichtig, het is niet al te raadzaam om een vijfdere kamer te hebben met veel configuraties. Zeker voor een omzet.

Uw bestand kan in grootte exploderen na het weergeven van alle configuraties.

Vriendelijke groeten

 

Julian

Bedankt voor het advies, het bedrijf werkt al zo sinds 2006 voordat ik aankwam...

 

Hier is een macro die het actieve document opnieuw laadt als het een onderdeel is, of het geselecteerde onderdeel in het geval van een assemblage

 

 

Optie Expliciete

 

Dim swApp als SldWorks.SldWorks

Sub hoofd()

Dim swModel                 als SldWorks.ModelDoc2   

Dim swPart                  As SldWorks.PartDoc   

Dim swAss                   als SldWorks.AssemblyDoc   

Dim nRetVal                 As swComponentReloadError_e   

    

    Stel swApp = CreateObject("SldWorks.Application") in

    Stel swModel = swApp.ActiveDoc in

 

    Selecteer Case swModel.GetType

    Kader swDocumentTypes_e.swDocPART

        Stel swPart in = swModel

        swModel.ForceReleaseLocks

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

        

    Doos swDocumentTypes_e.swDocASSEMBLY

        'We testen of een component is geselecteerd

        Dim blUnGeselecteerd als Booleaans

        Stel swAss in = swModel

        Dim swSelectionMgr As SldWorks.SelectionMgr

        Stel swSelectionMgr = swModel.SelectionManager in

        Als swSelectionMgr.GetSelectedObjectCount2(0) = 0 Dan is blUnSelected = Waar

        Als swSelectionMgr.GetSelectedObjectType3(1, 0) <> swSelectType_e.swSelCOMPONENTS Dan blUnSelected = Waar

        

        Als blUnSelected Dan

            MsgBox "Selecteer a.u.b. een component", vbInformatie

            Sub afsluiten

        Einde als

        

        ' We halen het geselecteerde onderdeel op

        Dim swComponent als SldWorks.Component2

        Stel swComponent in = swSelectionMgr.GetSelectedObject6(1, 0)

        

        'We laden het op

        Dim swDoc als SldWorks.ModelDoc2

        Stel swDoc = swComponent.GetModelDoc2 in

        

        swDoc.ForceReleaseLocks

        nRetVal = swDoc.ReloadOrReplace(Onwaar, UCase(swDoc.GetPathName), Waar)

     Einde selecteren

       

     ' Bericht van bevestiging

     Dim stErr als variant

     stErr = Array("Oké", "Toegangsfout", "Versiefout", "Gewijzigde niet opnieuw geladen fout", "Ongeldige optie", _

                  "Fout bestand niet opgeslagen", "Ongeldige componentfout", "Onverwachte fout", "Component lichtgewicht fout", _

                  "Fout Bestand bestaat niet", "Fout bestand ongeldig of dezelfde naam", "Document heeft geen weergave", "Fout Document al geopend", _

                  "Fout documentgebeurtenis", "Document niet gewijzigd", "Herladen annuleren")

     

     MsgBox CStr(stErr(nRetVal))

       

        

        

       '' Of we vervangen hem

       ' Dim stPath As String: stPath = ...

       ' dim stConfigName als tekenreeks: stConfigName = ...

       ' Dim blRet als Booleaanse

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

'

       ' Indien blRet Dan

           ' MsgBox "Vervanging geslaagd", vbInformation

       ' Anders

           'MsgBox' Vervanging mislukt, vbExclamation

       ' Einde als

    

 

   

Einde Sub


replace.zip
8 likes