Interfejs API SolidWorks Tworzenie części wirtualnej w złożeniu

Witaj społeczność.

 

Aby opracować makro w mojej firmie, chciałbym zautomatyzować tworzenie wirtualnych części w montażu.

Jednak nie mogę opracować kodu, który pozwala na tę akcję.

 

Poniżej znajduje się początek moich badań.

 

Dim swApp As Object
Sub main()

Ustaw swApp = Application.SldWorks
Ustaw swmodel = swApp.ActiveDoc
Dim swModelTitle As SldWorks.ModelDoc2


     
'-------------------------------------------------------------------------------------------------------------
"Sprawdzanie, czy dokument pliku asm jest otwarty
'-------------------------------------------------------------------------------------------------------------

     Jeśli nie swmodel jest niczym, to' jeśli otwarty jest plik SW
     Debug.Print "otwierany jest plik SW" ' następnie msg debug i kontynuuj

     W przeciwnym razie: MsgBox ("Nie ma otwartego pliku SW, otwórz zestaw i uruchom ponownie makro") 'jeśli nie ma otwartego pliku SW => msg
Wyjdź z subwoofera
    Zakończ jeżeli:
    

     
     Dim type_doc As String (Ciąg)
     type_doc = swDocumentTypes_e.swDocPART
     Debug.Print type_doc
     
     Jeśli swmodel. GetType = swDocumentTypes_e.swDocASSEMBLY Następnie
     Debug.Print "Otwarty plik jest plikiem zestawu"
     W przeciwnym razie: Debug.Print "otwarty plik nie jest plikiem zestawu, otwórz zestaw i uruchom ponownie makro"
     MsgBox ("otwarty plik nie jest plikiem zestawu, otwórz zestaw i uruchom ponownie makro")
Wyjdź z subwoofera
      Zakończ jeżeli:
      

'----------------------------------------------------------------------------------------------------------
'Pobieranie nazwy pliku
'----------------------------------------------------------------------------------------------------------
Przyciemnij ścieżkę jako ciąg
Dim name_asm As String
name_asm = SWmodel. GetTitle (DostaćTytuł)
path = model SW. GetPathName (Nazwa_ścieżki)
Debug.Print "nazwa pliku: " & name_asm
Debug.Print "ścieżka:" & ścieżka
Słońce nom_asm
nom_asm = Left(name_asm, (InStrRev(name_asm, ".", -1, vbTextCompare) - 1))
Debug.Print nom_asm


'-----------------------------------------------------------------------------------------------------------
"Tworzenie części do nadruku
'-----------------------------------------------------------------------------------------------------------


Dim nom_pe As String
nom_pe = "EMP_" & nom_asm
Debug.Print "odcisk nazwy części: " & nom_pe
Słońce new_part

boolstatus = swmodel. Extension.SelectByID2("Płaszczyzna twarzy", "PŁASZCZYZNA", 0, 0, 0, fałsz, 0, nic, 0) 'Wybieranie płaszczyzny ściany
new_part = SWmodel. InsertNewVirtualPart(boolstatus, nom_pe)

SWMODEL. ForceRebuild3 Prawda
SWMODEL. ViewZoomtofit2 (WidokPowiększenieDofit2)


Koniec subwoofera

 

 

Kod błędu uzyskany na linii new_part = ....

 

Czy masz pojęcie, co robię źle???

Przyznam, że przykład pomocy API wprawia mnie w zakłopotanie...

 

 

 

 


sans_titre.png

Witam

Podstawową zasadą programowania jest poprawne deklarowanie zmiennych.

W tym przypadku wiersz, w którym wystąpił błąd:

Niedziela rozpocznie deklarację

New_part nazwę zmiennej

jak ustawić typ

... A Rodzaj

 

Więc brakuje ci typu. Myślę, że jest to rodzaj elementu, który warto zobaczyć w pomocy...

1 polubienie

Witam

A priori mieszasz nazwę z samym komponentem.

Wymieniać:

Dim nom_pe As String

Dim nom_pe As Component2 (Ciemny Jako składnik2

I usuń linię:

nom_pe = "EMP_" & nom_asm

Edycja: zobacz poprawione makro w PJ.

Edycja 2:

Jeśli chcesz zmienić nazwę, musisz wykonać następujące czynności:

nom_pe.Nazwa2 = EMP_" & nom_asm

Zaktualizowałem makro na komputerze.


macro_piece_virtuelle.pdf
1 polubienie

@ remrem

Jestem początkujący w prog i nadal mam duże luki

Pomyślałam, że nie stawiając... Pozostawiono wybór progowi, aby wybrał najbardziej odpowiedni typ zmiennej.

 

@.PL

Nadal otrzymuję ten sam komunikat o błędzie.

 

Czy błąd występuje w tym samym wierszu?

Czy w 3D SolidWorks jest zaznaczona strona?

Edycja: wypróbuj modyfikację jako załącznik.

Jeśli wystąpi błąd, określ, w którym wierszu proszę.


macro_piece_virtuelle.txt

Tak, zawsze na tej samej linii.

Mam płaszczyznę przednią, która jest wybrana w poprzednim wierszu.

 

W rzeczywistości właśnie dlatego musisz wyrobić sobie nawyk poprawnego deklarowania wszystkich zmiennych.

Jeśli nie zadeklarujemy zmiennych, używają one domyślnego typu wariantu. Może to powodować problemy z funkcjonalnością i wydajnością...

1 polubienie

zawsze wiersz poniżej w błędzie

new_part = SWmodel. InsertNewVirtualPart(boolstatus, nom_pe)
 

Błąd wykonania 13 Niezgodność typu

 

 

Głupie pytanie, które na pewno nie ma nic wspólnego z problemem, ale "_" nie jest źródłem błędu?

Nie sądzę, ponieważ często używałem go w poprzednim makra, które zrobiłem wcześniej.

 

Nie miałem zbyt wielu problemów.

 

W końcu, biorąc pod uwagę mój brak doświadczenia, nie mogę niczego zagwarantować...

 

1 polubienie

Prawdopodobnie nie będę w stanie tego przetestować do jutra wieczorem.

 @.PL

 

Nie martw się, już bardzo miło jest spróbować mi pomóc...

Będę kontynuował moje badania i testy bez względu na wszystko i opublikuję, jeśli to się rozwinie.

 

 

Dobry wieczór

Patrząc na pomoc API, zmienne e-typy w parametrze nie są dobre.

Moim zdaniem prawe pismo odręczne to to to w załączonym pliku (sprawdzone i sprawne).


correction_macro_piece_virtuelle.txt

@lyric.

 

Rzeczywiście, działa cudownie.

Wielkie podziękowania dla Ciebie.

Na razie przyznaję, że nie do końca rozumiem dlaczego i jak. Przyjrzę się tym linijkom kodu, aby zrozumieć tajniki). 

 

Jeszcze raz dziękuję

 

Szczęśliwy tata

Witaj Happydad,

Aby to zrozumieć, szybkie spojrzenie na pomoc interfejsu API poprzez umieszczenie funkcji InsertNewVirtualPart jako kryterium wyszukiwania w dużej mierze wyjaśni, skąd pochodzi problem.

Wyjaśniony jest typ zmiennej oczekiwanej jako parametr przez tę funkcję i stąd bierze się problem (pierwszy niezgodny parametr).

Kropka txt w tekście nie działa, gdy kopiuję tekst do pustego makra w vba (między innymi pb akcentów).

Czy ktoś może opublikować .swp lub .swb proszę?

' Makro funkcjonalne daje to, gdy jest ustalone;)

Dim swApp As Object
Sub main()
Ustaw swApp = Application.SldWorks
Ustaw swmodel = swApp.ActiveDoc
Dim swModelTitle As SldWorks.ModelDoc2
'-------------------------------------------------------------------------------------------------------------
"Sprawdzanie, czy dokument pliku asm jest otwarty
'-------------------------------------------------------------------------------------------------------------
     Jeśli nie swmodel jest niczym, to' jeśli otwarty jest plik SW
     Debug.Print "otwierany jest plik SW" ' następnie msg debug i kontynuuj
     W przeciwnym razie: MsgBox ("Nie ma otwartego pliku SW, otwórz zestaw i uruchom ponownie makro") 'jeśli nie ma otwartego pliku SW => msg
Wyjdź z subwoofera
    Zakończ jeżeli:
     Dim type_doc As String (Ciąg)
     type_doc = swDocumentTypes_e.swDocPART
     Debug.Print type_doc
     Jeśli swmodel. GetType = swDocumentTypes_e.swDocASSEMBLY Następnie
     Debug.Print "Otwarty plik jest plikiem zestawu"
     W przeciwnym razie: Debug.Print "otwarty plik nie jest plikiem zestawu, otwórz zestaw i uruchom ponownie makro"
     MsgBox ("otwarty plik nie jest plikiem zestawu, otwórz zestaw i uruchom ponownie makro")
Wyjdź z subwoofera
      Zakończ jeżeli:
'----------------------------------------------------------------------------------------------------------
'Pobrano©artion nazwy pliku
'----------------------------------------------------------------------------------------------------------
Przyciemnij ścieżkę jako ciąg
Dim name_asm As String
name_asm = SWmodel. GetTitle (DostaćTytuł)
path = model SW. GetPathName (Nazwa_ścieżki)
Debug.Print "nazwa pliku: " & name_asm
Debug.Print "ścieżka:" & ścieżka
Słońce nom_asm
nom_asm = Left(name_asm, (InStrRev(name_asm, ".", -1, vbTextCompare) - 1))
Debug.Print nom_asm
'-----------------------------------------------------------------------------------------------------------
"Tworzenie części do nadruku
'-----------------------------------------------------------------------------------------------------------
Dim nom_pe jako SldWorks.Component2
Sun swSelMgr jako SldWorks.SelectionMgr
Dim swPlaneFeature jako SldWorks.Feature
Dim swPlane jako SldWorks.RefPlane
Słońce new_part tak długo
Dim boolstatus As Boolean

Ustaw swSelMgr = swmodel. Menedżer wyboru
boolstatus = swmodel. Extension.SelectByID2("Płaszczyzna twarzy", "PŁASZCZYZNA", 0, 0, 0, fałsz, 0, nic, 0) 'Wybieranie płaszczyzny ściany
Ustaw swPlaneFeature = swSelMgr.GetSelectedObject6(1, -1)
Ustaw swPlane = swPlaneFeature.GetSpecificFeature2

new_part = SWmodel. InsertNewVirtualPart(swPlane, nom_pe)

nom_pe. Name2 = "Do EMP_" & nom_asm

SWMODEL. ForceRebuild3 Prawda
SWMODEL. ViewZoomtofit2 (WidokPowiększenieDofit2)
Koniec subwoofera