Interfejs API VBA SolidWorks: Tylko do odczytu

Witam

 

Tworzę makro VBA, które umożliwia odczyt i zapis w plikach biblioteki, które są domyślnie tylko do odczytu.

 

Udaje mi się usunąć komponent tylko do odczytu w systemie Windows (za pomocą [SetAttr FileName, vbReadOnly] lub [SetAttr FileName, vbNormal]), ale potem muszę ponownie załadować komponent w SolidWorks do odczytu i zapisu.

 

Z makrem przez szkolenie, wykonując "File > Reload" i odznaczając pole tylko do odczytu, otrzymuję tylko:

Ustaw część = swApp.ActiveDoc
Part.FileReload (Załaduj ponownie)

 

co nie ma wpływu na czytanie i pisanie.

 

Znalazłem API "ReloadOrReplace", ale nie mogę go poprawnie używać:

ret = Część.PrzeładujOrZamień(0, 0, 1)

nie przynosi pożądanego efektu: Myślę, że bardziej odpowiada to "wymianie komponentu w zespole".

 

 

Ktoś ma pomysł? Z góry dziękuję

Odblokowywanie odczytanych plików jest zawsze niebezpieczne

Musi być jakiś powód, dla którego mają być zamknięte!!

Witam

ReloadorReplace to metoda, której należy użyć (zastępuje FileReload)

Musisz wskazać nazwę pliku, który ma zostać podmieniony/ponownie załadowany, w pomocy znalazłem to:

 

W tym przykładzie pokazano, jak ponownie załadować aktywny model przy użyciu ostatniej zapisanej wersji modelu.

[...]

Dim swApp jako SldWorks.SldWorks

Dim swModel As SldWorks.ModelDoc2

Dim nRetVal tak długo

 

Ustaw swApp = CreateObject("SldWorks.Application")

Ustaw swModel = swApp.ActiveDoc

' Niepowodzenie w przypadku rysunków, ponieważ funkcja nie jest obsługiwana w interfejsie użytkownika

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

Nie testowałem, więc do potwierdzenia

2 polubienia

Dziękuję y.pacquelet Przetestuję to jutro, ale myślę, że już go używałem w ten sposób!

 

FYI , nasza biblioteka jest tylko do odczytu, aby zapobiec przypadkowemu jej zmodyfikowaniu.

Na przykład mamy pojedynczy plik rolkowy z wieloma konfiguracjami (rodzina części), co pozwala uniknąć posiadania 200 różnych plików.

Jeśli chcesz dodać łożysko, musisz usunąć funkcję tylko do odczytu... Ale potem odłożyliśmy go z powrotem!

Witam na forum.

Cześć Lucas.

Bądź ostrożny, nie jest zbyt wskazane, aby mieć bardziej płaski pokój z wieloma konfiguracjami. Zwłaszcza dla obrotu.

Twój plik może rozbić się pod względem rozmiaru po wyświetleniu wszystkich konfiguracji.

Pozdrowienia

 

Juliański

Dziękuję za radę, firma działa w ten sposób od 2006 roku, zanim przyjechałem...

 

Oto makro, które ponownie wczytuje aktywny dokument, jeśli jest to część, lub wybrany komponent w przypadku złożenia

 

 

Opcja jawna

 

Dim swApp jako SldWorks.SldWorks

Sub main()

Dim swModel                 As SldWorks.ModelDoc2   

Przyciemnij swPart                  jako SldWorks.PartDoc   

Dim swAss                   jako SldWorks.AssemblyDoc   

Dim nRetVal                 As swComponentReloadError_e   

    

    Ustaw swApp = CreateObject("SldWorks.Application")

    Ustaw swModel = swApp.ActiveDoc

 

    Wybierz przypadek swModel.GetType

    Ramka swDocumentTypes_e.swDocPART

        Ustaw swPart = swModel

        swModel.ForceReleaseLocks

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

        

    Pudełko swDocumentTypes_e.swDocASSEMBLY

        ' Sprawdzamy, czy komponent jest wybrany

        Dim blUnselected As Boolean

        Ustaw swAss = swModel

        Dim swSelectionMgr As SldWorks.SelectionMgr

        Ustaw swSelectionMgr = swModel.SelectionManager

        Jeśli swSelectionMgr.GetSelectedObjectCount2(0) = 0, to blUnSelected = True

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

        

        Jeśli blUnselected to

            MsgBox "Proszę wybrać komponent", vbInformation

            Wyjdź z subwoofera

        Zakończ jeżeli:

        

        ' Pobieramy wybrany komponent

        Przyciemnij swComponent jako SldWorks.Component2

        Ustaw swComponent = swSelectionMgr.GetSelectedObject6(1, 0)

        

        ' Ładujemy go

        Dim swDoc jako SldWorks.ModelDoc2

        Ustaw swDoc = swComponent.GetModelDoc2

        

        swDoc.ForceReleaseLocks

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

     Zakończ wybór

       

     ' Wiadomość o potwierdzeniu

     Dim stErr As Variant

     stErr = Array("Dobrze", "Błąd dostępu", "Błąd wersji", "Zmodyfikowano błąd nie został ponownie załadowany", "Nieprawidłowa opcja", _

                  "Błąd niezapisania pliku", "Błąd nieprawidłowego komponentu", "Nieoczekiwany błąd", "Błąd lekkiego komponentu", _

                  "Błąd "Plik nie istnieje", "Błąd nieprawidłowego pliku lub tej samej nazwy", "Dokument nie ma widoku", "Błąd już otwartego dokumentu", _

                  "Błąd zdarzenia dokumentu", "Dokument nie został zmieniony", "Anuluj ponowne ładowanie")

     

     MsgBox CStr(stErr(nRetVal))

       

        

        

       Albo go zastępujemy

       ' Dim stPath As String: stPath = ...

       ' Dim stConfigName As String: stConfigName = ...

       ' Dim blRet As Boolean

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

'

       ' Jeśli blRet to

           ' MsgBox "Wymiana powiodła się", vbInformation

       ' W przeciwnym razie

           ' MsgBox ' Zamiana nie powiodła się, vbExquiation

       ' Koniec, jeśli

    

 

   

Koniec subwoofera


replace.zip
8 polubień