Kod VBA do zmiany odniesienia podczas otwierania pliku . SLDPRT (Biblioteka SLDPRT)

Witam

W pliku . SLDPRT (nr 1), używam funkcji kombajnu z odnośnikiem zewnętrznym (plik nr(2) . SLDPRT również),  w celu uzyskania pożądanego ostatecznego kształtu bezpośrednio przez skurcz.

Plik nr 1 jest standardową bazą danych, a plik nr 2 ma zmienną geometrię.

Dla nowego wariantu otwieram plik nr 1, klikając zakładkę "Referencje... " i tak zamieniam plik nr 2 na plik nr 3 z nową geometrią.

Obecnie mam makro, które pozwala mi wybrać, które pliki 3D mają zostać otwarte, ale czy istnieje sposób na automatyczne otwieranie tego typu pliku przy jednoczesnym dawaniu użytkownikowi ręki, aby mógł wybrać część zamienną?

Z góry dziękuję za pomoc.

 

 

Witam

Czy możesz zamieścić kilka przykładowych plików, abyśmy mogli Ci pomóc?

Pozdrowienia.

2 polubienia

Witaj Yves.T,

Nie mogę dołączyć oryginalnych części ze względu na poufność, ale umieściłem 3 proste elementy jako przykłady, aby wyjaśnić zasadę.

Element 1 zbudowany z kombinacji elementu 2 lub 3 w zależności od wyboru odniesienia do otworu.

Dziękuję.


changement_ref.rar

Dla mnie jedynym sposobem na zastąpienie wstawki części w części jest zastąpienie odniesień przed otwarciem tego pliku.

Witam

W dołączonym makrze pierwszy plik do wyboru jest plikiem nadrzędnym, a drugi jest plikiem do odjęcia. Zwróć uwagę na nazwy ciał w twoich plikach, powinno to działać z twoimi przykładowymi plikami.

Pozdrowienia


combiner.swp

Witaj d.roger i dziękuję za czas spędzony na próbie znalezienia rozwiązania.

Właśnie wypróbowałem makro, otwiera ono plik nadrzędny, ale podczas drugiego wyboru plik do odjęcia otwiera się w drzewie bez zastępowania tego, który już istnieje!

Małe wyjaśnienie dotyczące nazw ciał do odjęcia, za każdym razem będą one inne. (P1, P2, P3....)

Pozdrowienia.

Witam

Wersja 2 makra ....

Pozdrowienia


combiner.swp
1 polubienie

@d. Zrozumiałem,

Świetnie, wersja Macro 2 działa z częściami podanymi jako przykład.

Z drugiej strony, jeśli uruchomię go z innym plikiem o innej strukturze drzewa (patrz załączony obrazek), makro zostanie wykonane bez wykonywania funkcji kombajnu.

W tym przykładzie część M2031 została zastąpiona częścią M2032, ale nie została usunięta z korpusu głównego.

Czy może to wynikać z faktu, że po funkcji łączenia istnieją inne operacje kompilacji? (tu rewolucja i święto)

Dziękuję.

 


arborescence_inf_.gif

Tak, wynika to z faktu, że rodzaj obróbki wykonywanej na częściach jest inny, wynika to z linii:

boolstatus = Part.Extension.SelectByID2("Revolution1", "SOLIDBODY", 0, 0, 0, Fałsz, 1, Nic, 0)
boolstatus = Part.Extension.SelectByID2("<" & NewName & ">-<Revolution1>", "SOLIDBODY", 0, 0, 0, True, 2, Nic, 0)

Lub nazwy wybranych ciał to Revolution1, aby to poprawić, musisz przeanalizować drzewo tworzenia i pobrać nazwy ciał, nie mam na to czasu w tej chwili, ale jeśli chcesz to zrobić, powinieneś być w stanie użyć następujących linii:

Ustaw cechę = Part.FirstFeature
Przyciemnij kawałek jako ciąg
Chociaż nie funkcja jest niczym
 FeatureName = Feature.Name
 Jeśli Feature.GetTypeName2 = "Zapasy", to
    Element = NazwaElementu
 Zakończ jeżeli:
 Ustaw cechę = Feature.GetNextFeature()
Wend

, aby to zrobić.

Pozdrowienia

1 polubienie

OK!

 Postaram się temu przyjrzeć, ale wcale nie czuję się komfortowo z kodami VBA! 

Istnieje duże prawdopodobieństwo, że ponownie poproszę Cię o pomoc w naprawieniu makra, gdy tylko będziesz dostępny!

 Jeszcze raz dziękujemy i życzę miłego weekendu!

 

 

Witam wszystkich!

Próbowałem zaadaptować makro D.Rogera, ale funkcja "połącz" nadal nie działa:

'Wyszukaj w menedżerze cech części, która ma zostać odjęta (zajęło mi trochę czasu, aby zrozumieć, skąd wzięła się nazwa "Stock": naciśnij CTRL G w oknie wykonywania, aby wyświetlić listę nazw i typów każdej cechy!)

Ustaw cechę = Part.FirstFeature
        Dim Piece1 As Ciąg
        Chociaż nie funkcja jest niczym
        FeatureName = Feature.Name
         Jeśli Feature.GetTypeName2 = "Zapasy", to
         Element1 = NazwaCechy
         Zakończ jeżeli:
        Ustaw cechę = Feature.GetNextFeature()
        Wend

 

Wybór głównej bryły
    boolstatus = Part.Extension.SelectByID2("Usunięto mat.-Extru.3", "SOLIDBODY", 0, 0, 0, Fałsz, 1, Nic, 0) 

"Wybór udziału do odjęcia
    boolstatus = Part.Extension.SelectByID2(Element1, "BODYFEATURE", 0, 0, 0, Prawda, 2, Nic, 0) 

"Łączenie ciał
    Set myFeature = Part.FeatureManager.InsertCombineFeature(15902, Nic, Nic)

2 kawałki są dobrze dobrane, ale ostatnia linia, która powinna wykonać odejmowanie ciał, pozostaje nieaktywna.?!

Powinienem być w stanie wybrać bryły objętościowe części, która ma zostać odjęta, ale bez brania tej z korpusu głównego, próbowałem za pomocą "SolidBodyFolder"... Ale to też nie działa!

Jestem pewien, że nie ma tego dużo, ale moja wiedza na temat VBA nie wystarczy, aby rozwiązać ten punkt sporny.

Jeśli ktoś może mnie poprowadzić po możliwym rozwiązaniu?!

Dziękuję.


lyncoa_20171010.gif

... W rzeczywistości zgadza się, linia kodu "combine" działa z:

boolstatus = Part.Extension.SelectByID2("<M2032_REN306VF_sortie-mold>-<REN305-02A.1\\Główny korpus>", "SOLIDBODY", 0, 0, 0, Prawda, 2, Nic, 0)
    boolstatus = Part.Extension.SelectByID2("<M2032_REN306VF_sortie-mold>-<REN305_01A.1\\Main body>", "SOLIDBODY", 0, 0, 0, True, 2, Nic, 0)
    boolstatus = Part.Extension.SelectByID2("<M2032_REN306VF_sortie-mold>-<REN305_CC.1\\Główny korpus>", "SOLIDBODY", 0, 0, 0, Prawda, 2, Nic, 0)

    Set myFeature = Part.FeatureManager.InsertCombineFeature(15902, Nic, Nic)

... ale nazwy ciał będą się zmieniać z każdą nową częścią (Ex <M2031_REN305VF_sortie-mold>-<REN304_CC.1\\Main body>)!

Muszę więc znaleźć sposób, aby wybrać objętość nowo wstawionej części.

Czy ktoś może mi pomóc rozwiązać ten problem?

Z góry dziękuję.


lyncoa_20171011.gif

Witam

Można użyć pętli na obiektach, która pobiera funkcję "SOLIDBODYFOLDER".

Po znalezieniu przypisz ją do zmiennej bodyfolder za pomocą funkcji. Funkcja GetSpecificFeature()

Wszystko, co pozostaje do zrobienia, to zapętlenie brył i wybranie ich za pomocą Body.Select(). Wydaje mi się, że za pomocą tej metody można dodać flagę. Jeśli nie, użyj menedżera wyboru, aby dokonać wyboru.

Witaj Yves.T,

 Próbowałem z pętlą (z kodem D.Rogera), która miała odzyskać głośność mojego utworu1 (patrz poniżej)...

... ale też nie działa! Zamierzam się drapać dalej, ale chyba brakuje mi zamówienia!

Czy masz przykład dla "funkcji. GetSpecificFeature()" i przepraszam za moje pytanie dla początkujących, ale co masz na myśli mówiąc "dodaj flagę"?

Ustaw cechę = Part.FirstFeature
        Dim Piece1 As Ciąg
        Chociaż nie funkcja jest niczym
        FeatureName = Feature.Name
         Jeśli Feature.GetTypeName2 = "Zapasy", to
         Element1 = NazwaCechy
         Zakończ jeżeli:
        Ustaw cechę = Feature.GetNextFeature()
        Wend
       
    Wybór głównej bryły
    boolstatus = Part.Extension.SelectByID2("Usunięto mat.-Extru.3", "SOLIDBODY", 0, 0, 0, Fałsz, 1, Nic, 0)
    "Wybór udziału do odjęcia
    boolstatus = Part.Extension.SelectByID2("<Piece1>-<Volumes>", "BDYFOLDER", 0, 0, 0, Prawda, 2, Nic, 0)

    Set myFeature = Part.FeatureManager.InsertCombineFeature(15902, Nic, Nic)

Dziękuję.

Podam przykład pętli, która odzyskuje ciała w VBA.

Pętla, którą umieścisz jako przykład, pobiera nazwę funkcji, jeśli jest ona typu "Stock".

Nie sprawdzałem, ale nie jestem pewien, czy "Stock" jest jedną z wartości zwracanych przez GetTypeName2. . To jest do sprawdzenia w pomocy.

boolstatus = Part.Extension.SelectByID2("<Piece1>-<Volumes>", "BODYFOLDER", 0, 0, 0, True, 2, Nic, 0)

W tej instrukcji poprosisz go o wybranie obiektu o nazwie <Piece1>-<Bulking Bodies> typu BODYFOLDER. on raczej go nie znajdzie :) zamiast tego umieść BODY.

W funkcjach Select (SelectById, SelectById2,...) znajduje się parametr, który służy do umieszczania wskaźnika na zaznaczeniu, jest to flaga.

W niektórych funkcjach Solidworks możliwe jest wybranie kilku obiektów (Przykład: w dodaniu, wybierasz szkice konturu, a następnie krzywe prowadzące), flaga pozwala Solidworks na umieszczenie wybranych obiektów w prawym "polu". Wybory z flagą 1 będą konturami, flaga 2 krzywymi prowadzącymi.

Witam

Szybko się go skleci, ale spróbuj z dołączonym makrem, aby sprawdzić, czy Ci odpowiada.

Pozdrowienia


combiner.swp
1 polubienie

W załączeniu znajduje się przykład makra z komentarzem

Jedyne warunki, aby to zadziałało:

Nazywanie głównej treści jako "MainBody"

Mieć + korpusu woluminu


feature.swp (plik w języku angielskim)
1 polubienie

Witam i przepraszam za późny powrót, wiele tematów w toku...!

@d. Zrozumiałem,

Chciałbym wiedzieć, jak "majstrować" przy VBA tak jak Ty, ale myślę, że wciąż mam przed sobą długą drogę!

makro działa świetnie (w pojedynczym kolorze), ale kiedy wywołuję je innym makrem, musiałem usunąć "Explicit Option", dodać mały fragment kodu, aby zobaczyć aplikację Solidworks...

'Umożliwia wyświetlanie aplikacji SolidWorks.
swApp.Visible = Prawda
Jeśli swApp jest niczym, to
Ustaw swApp = CreateObject("SldWorks.Application")
swApp.Visible = Prawda
Zakończ jeżeli:

... i w końcu to się psuje...

"Ustaw cechę = Part.FeatureManager.InsertCombineFeature(swBodyOperationType_e.SWBODYCUT, nic, nic)"

... i wydaje się, że nie podąża za "Sub SelectBodies(swApp As SldWorks.SldWorks... "

Problem z komunikacją?!?

@Yves.T,

Aby zmienić nazwę głównych ciał na "MainBody", powinno być to możliwe, z drugiej strony może być tylko jedna treść woluminu pafrois. W każdym razie dziękuję za komentarze w makro, to naprawdę pomaga w zrozumieniu , zobaczę , czy mogę się dostosować!

Witam

Przede wszystkim dziękuję za komplement na początku, ale w vba po prostu "majsterkuję", to język programowania, który Yves.T opanowuje znacznie bardziej niż ja, który podążam za bardziej zorientowanym na C#.

Albo w celu usunięcia opcji jawnej. W przypadku wierszy, w których wyświetlany jest Solidworks, OK, jeśli makro jest uruchamiane za pośrednictwem innego makra. Dla Sub SelectBodies(.....), został on już wywołany w momencie wystąpienia błędu, więc nie ma problemu na tym poziomie, a dla błędu w wierszu "Set Feature = Part.FeatureManager.InsertCombineFeature(swBodyOperationType_e.SWBODYCUT, Nothing, Nothing)", jak słusznie zauważył Yves.T w swoim makrze ("ale przede wszystkim używamy znaku, aby uzyskać dobre") możesz zastąpić linię:

"Ustaw cechę = Part.FeatureManager.InsertCombineFeature(swBodyOperationType_e.SWBODYCUT, nic, nic)"

Według  linii:

Sun SelMgr jako SelectionMgr
Ustaw SelMgr = Part.SelectionManager
Ustaw cechę = Part.FeatureManager.InsertCombineFeature(swBodyOperationType_e.SWBODYCUT, SelMgr.GetSelectedObject6(1, 1), SelMgr.GetSelectedObject6(1, 2))

Zobaczmy, czy działa tak, jak chcesz.

Pozdrowienia

Witaj d.roger,

Właśnie podmieniłem linijki kodu i blokuje się na:

"Ustaw cechę = Part.FeatureManager.InsertCombineFeature(swBodyOperationType_e.SWBODYCUT, SelMgr.GetSelectedObject6(1, 1), SelMgr.GetSelectedObject6(1, 2))"

Error 424: Required Object

Pozdrowienia