Brak dostępu do Solidworks podczas uruchamiania makra za pomocą przycisku

Witam

Chciałbym uruchomić moje makro z "przycisku makra" bezpośrednio w Solidworks. Kiedy uruchamiam moje makro z Visual Basic 6, nie mam żadnych problemów, natomiast jeśli uruchamiam je z przycisku, który utworzyłem w Solidworks, nic nie działa. Rzeczywiście, chcę wybrać kilka powierzchni, ale nie mam dostępu do Solidworks po uruchomieniu makra.

Oto fragment mojego kodu:

 

Dim swApp           jako SldWorks.SldWorks
Dim swModel         As SldWorks.ModelDoc2
Sun swSelMgr        jako SldWorks.SelectionMgr
Przyciemnij matefeature     jako SldWorks.Mate2
Dim swFace1         jako SldWorks.Face2
Dim swFace2         jako SldWorks.Face2

Dim bool1           As Boolean
Dim bool2           As Boolean

Dim CurFaceName As String (Ciąg znaków Dim CurFaceName)    
Dim FaceName1       As Ciąg
Dim FaceName2       As Ciąg

Dim MateName        As Ciąg
Dim MateName2       As Ciąg

Przyciemnij część            jako obiekt

 

Sub Square90XL()

    Ustaw swApp = Application.SldWorks
    Ustaw swModel = swApp.ActiveDoc
    Ustaw swSelMgr = swModel.SelectionManager
    
    bool1 = Fałsz
    Rób, dopóki wartość logiczna1 = Prawda
        Jeśli swSelMgr.GetSelectedObjectType3(1, -1) = swSelFACES Then
            Ustaw swFace1 = swSelMgr.GetSelectedObject6(1, -1)
            bool1 = Prawda
        Zakończ jeżeli:
    Pętla
    swModel.ClearSelection
        
    bool2 = Fałsz
    Rób, dopóki bool2 = Prawda
        Jeśli swSelMgr.GetSelectedObjectType3(1, -1) = swSelFACES Then
            Ustaw swFace2 = swSelMgr.GetSelectedObject6(1, -1)
            bool2 = Prawda
        Zakończ jeżeli:
    Pętla
    
    Robić
    swFace2.Select (0)
    Obrót.Pokaż
    Pętla do momentu, gdy wartość2 = Prawda
    
    swFace1.Select (1)
    swFace2.Select (1)
    Ustaw część = swApp.ActiveDoc
    Set matefeature = Part.AddMate3(swMateCOINCIDENT, swMateAlignCLOSEST, True, 0, 0, 0, 0, 0, 0, 0, 0, False, mateError)
    matefeature.name = NazwaWiązania
    Part.ClearSelection

...

 

Z góry dzięki,

 

Gael

Której wersji SolidWorks używasz?

Wersja VBA używana w SolidWorks 2013 to VBA7, może problem bierze się stamtąd, ale nie jestem ekspertem od programowania.

4 polubienia

Witam

Aby uzupełnić odpowiedź fthomasa, proponuję Ci ten artykuł , który opublikowaliśmy i który wyjaśnia problem kompatybilności między poziomami wersji oprogramowania i VBA.

Pozdrowienia

3 polubienia

Witam

 

Myślę, że musisz zmodyfikować te wiersze kodu:

    Ustaw swApp = Application.SldWorks

 

Przez te:
    Ustaw swApp = SldWorks.SldWorks

 

Obiekt Application nie zwraca bieżącej sesji Solidworks, ale nowy obiekt Solidworks

2 polubienia

Witam

 

Jeśli makro wyświetla okno, upewnij się, że nie jest ono modalne

 

Jeśli nie, nie mogę powiedzieć ci więcej na podstawie fragmentu, który tu umieszczasz:

Ale jeśli dołączysz makro jako załącznik, mogę się temu przyjrzeć

 

Pozdrowienia

8 polubień

Cze wszystkim

Dziękuję za odpowiedzi!!

 

@jmsavoyat i @fthomas Więc nadal używam Solidworks 2010 64 bity, więc nie ma problemów z vb7

 

@ etienne.canuel Kiedy zmieniam wiersz kodu przez to, co mi mówisz, otrzymuję bałagan błędu ...

 

@ jfaradon Myślę, że to nie jest problem z otwartym oknem, czy nie, ponieważ mam do niego dostęp, mogę go kliknąć i zamyka się dobrze. Próbowałem z innymi programami i mam ten sam problem tylko wtedy, gdy uruchamiam makro za pomocą przycisku polecenia (który stworzyłem) znajdującego się w zakładce montażu. Jeśli uruchomię go z VB6, nie martw się. Problem polega na tym, że nie mam dostępu do Solidworks, który jest niezbędny w moim programie, muszę kliknąć z 2 stron... Jedynym wyjściem, jakie mam, jest ctrl + pauza...

 

Załączam swój kod.

Dla tych, którzy go pobierają, umieszczam z częściami, które powinny zostać wstawione (będą musieli zmienić ścieżkę do otwierania części w programie w formularzach użytkownika "kwadrat" i "tabela").

Zasadniczo jest to wstawianie części z ograniczeniem koincydencji.

Wstawianie formularza użytkownika będzie działać tylko z tabelą i kwadratem. Głównym modułem jest "insertion_contrainte". Tabela musi być wstawiona w 1 !!

Nie umieściłem końca mojego kodu, ponieważ jest bezużyteczny, to prawie to samo i jeśli działa na początku, będzie działać na reszcie!

 

Dziękuję

 

Gael

 


programme.7z

Dsl nie widziałem, ale w moim programie są 2 błędy

Oto poprawiony program w załączniku

 

Gael


programme.7z

Prawdopodobnie nie odwołałeś się do odpowiednich bibliotek/bibliotek DLL do swojego makra.

Aby upewnić się, że są one aktywowane, najprostszym sposobem jest utworzenie nowego makra z menu solidworks, usunięcie linii kodu automatycznie utworzonych przez solidworks, a następnie wklejenie kodu.

 

W przeciwnym razie, jeśli wiesz trochę na ten temat, możesz przejść do VBA, a następnie do menu narzędzia->referencje, a następnie wybrać biblioteki solidworks/dll odpowiadające Twojej wersji.

Z pamięci musisz zaznaczyć te:

Biblioteka typów SldWorks xxxx

Biblioteka typów stałych SolidWorks xxxx

Biblioteka typów poleceń SolidWorks xxxx

(Zastąp xxxx wersją Solidworks)

Dziękuję za odpowiedź, ale to jeszcze nie to...

Szukam dalej

Witam

Jeśli dobrze rozumiem, twoje makro służy do tworzenia ograniczenia, a kiedy uruchamiasz swoje makro w Microsoft Visual Basic (tym w SW, na który się zgadzamy) działa i możesz wybrać swoje twarze.

 

Ale kiedy uruchamiasz go ze SlidWorks, "nic nie działa":

Co to oznacza? Co się dzieje?

Makro idzie tak szybko, że nie masz czasu na wybór powierzchni?

 

 

Rozwiązanie, które może zadziałać: wybierz dwie strony PRZED uruchomieniem makra.

Być może ze względu na szybkość wykonania, nie można wybrać powierzchni w SolidWorks po uruchomieniu makra za pomocą przycisku, rozwiązanie: pauza.

Musisz wstawić ten wiersz do swojego kodu:

Application.Wait Time + TimeSerial(0, 0, 1)  

 

Efekt:

 

bool1 = Fałsz

    Rób, dopóki wartość logiczna1 = Prawda
        Jeśli swSelMgr.GetSelectedObjectType3(1, -1) = swSelFACES Then
            Ustaw swFace1 = swSelMgr.GetSelectedObject6(1, -1)
            bool1 = Prawda
        Zakończ jeżeli:

        Application.Wait Time + TimeSerial(0, 0, 1)  
    Pętla
    swModel.ClearSelection
        
    bool2 = Fałsz
    Rób, dopóki bool2 = Prawda
        Jeśli swSelMgr.GetSelectedObjectType3(1, -1) = swSelFACES Then
            Ustaw swFace2 = swSelMgr.GetSelectedObject6(1, -1)
            bool2 = Prawda
        Zakończ jeżeli:

        Application.Wait Time + TimeSerial(0, 0, 1)  
    Pętla

 

 

Czy to tak działa? Aby zobaczyć, jak skrócić czas przerwy do mniej niż sekundy, jeśli jest dla Ciebie za długa.

Dsl za opóźnienie, ale byłem na wakacjach.

Nie, to wcale nie mój problem, ponieważ używam do, dopóki nie będę miał tyle czasu, ile potrzebuję, aby wybrać twarz.

Właściwie chcę uruchomić makro z przycisku makra, który utworzyłem w Solidworks, ale po kliknięciu na niego mój program uruchamia się poprawnie, ale nie mogę wybrać twarzy, podczas gdy po uruchomieniu makra VB6 mogę wybrać moje twarze.

Więc jestem zablokowany, skontaktowałem się z Solidworks i czekam na ich odpowiedź.

Dziękuję

Witam

 

"Nie, to w ogóle nie jest mój problem, ponieważ używam do, dopóki nie mam tyle czasu, ile potrzebuję, aby wybrać twarz".

=> FAŁSZ!

 

Właśnie testowałem z przerwą i działa!

Z drugiej strony, proponowana przeze mnie pauza nie działa, trzeba użyć opcji "do events".

Makro, które działa, jest dołączone.

 

Lub przykładowy kod znajduje się tutaj:

    swModel.ClearSelection
   bool1 = Fałsz
   Rób, dopóki wartość logiczna1 = Prawda
       Jeśli swSelMgr.GetSelectedObjectType3(1, -1) = swSelFACES Then
           Ustaw swFace1 = swSelMgr.GetSelectedObject6(1, -1)
           bool1 = Prawda
       Zakończ jeżeli:
        Dla Y = 1 TB 50000
            DoWydarzenia
        Następny y
    Pętla
 


insertion__contrainte.swp