Zmiana położenia komponentu za pomocą makra API

Witam

 

Od dzisiejszego ranka szukam rozwiązania mojego problemu, ale nie mogę go znaleźć. Chciałbym wstawić komponenty i zmienić ich położenie w zespole zgodnie z początkiem zespołu lub określonym punktem, punkt 1, punkt 2 ...

 

Udaje mi się automatycznie utworzyć zespół, otworzyć wszystkie moje pliki, a nawet wstawić je do mojego zestawu. Pierwszy komponent nie wstawił się nawet w punkcie początkowym złożenia i nie wiem, jak można przestawić całość na początku układu współrzędnych lub na punkty.

Jeśli ktoś zna te dwie małe linijki kodu, oto kilka linijek kodu, które są interesujące: 

'Ouverture de l'assemblage
Set Part = swApp.OpenDoc6(ActiveSheet.Range("H100"), 2, 0, "", longstatus, longwarnings)
swApp.ActivateDoc2 ActiveSheet.Range("H100"), False, longstatus

'--------------------------------------------
'assemblage des plans
boolstatus = Part.AddComponent(ActiveSheet.Range("H101"), ActiveSheet.Range("E101"), ActiveSheet.Range("F101"), ActiveSheet.Range("G101"))
boolstatus = Part.AddComponent(ActiveSheet.Range("H102"), ActiveSheet.Range("E102"), ActiveSheet.Range("F102"), ActiveSheet.Range("G102"))

 

 

Potrzebuję tylko więcej linii między każdym wstawieniem, aby zdefiniować punkt pozycjonowania każdej części/zestawu.

 

Witam

Sprawdź tutaj , czy  to może Ci pomóc.

Dziękuję za szybką odpowiedź, ale chciałem bezpośrednio wyłożyć kod i nie łamać sobie głowy :'(

 

Mówiąc bardziej poważnie, udaje mi się wstawić moje części, które chcę przesunąć po włożeniu. Nie mogę znaleźć pracy. 

Czy istnieje sposób na załadowanie komponentu bezpośrednio do zespołu bez jego wstępnego ładowania, aby odbić się od stacji roboczej?

Witam

Prawdopodobnie jest to, czego chcesz w tej dyskusji.

Pozdrowienia

Witam Cię d.roger.

Przede wszystkim chcę podziękować za odpowiedź, napisałeś zaraz po tym, jak znalazłem funkcję "mate" , zdałem sobie sprawę, że nadal możesz robić makra "ręcznie", aby porównać i odblokować.

Więc wymyśliłem coś takiego:

'assemblage des plans
boolstatus = Part.AddComponent(ActiveSheet.Range("H101"), ActiveSheet.Range("E101"), ActiveSheet.Range("F101"), ActiveSheet.Range("G101"))
    'positionnement de la pièce
            'suppression du "fixe" sur la première pièce
            boolstatus = Part.Extension.SelectByID2("K101", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
            Part.unFixComponent
    Part.ClearSelection2 True
    boolstatus = Part.Extension.SelectByID2("J100", "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("J101" & "K101", "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)
   ' Dim swMate As Mate2
    Set swMate = Part.AddMate5(20, -1, False, 0.824524202641418, 0.001, 0.001, 0.001, 0.001, 0.5235987755983, 0.5235987755983, 0.5235987755983, False, False, 0, longstatus)
    Part.ClearSelection2 True
    boolstatus = Part.Extension.SelectByID2("K101", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
    Part.FixComponent
    Part.ClearSelection2 True

 

Mój problem polega na tym, że nie wybiera mojego komponentu, który jest wymieniony jako "K101", więc nie ma żadnych ograniczeń ani niczego ustawionego. Co za makro, pełne linii na nic :'(

 

Dziękuję za pomoc, wciąż czekam na odpowiedni link lub rozwiązanie.

Do czego odpowiadają Twoje "J100", "J101" i "K101"?

Biorąc pod uwagę fragment kodu, zakładam, że są to wartości pobrane z komórek w pliku Excel, ale czy te wartości respektują niezbędne nazewnictwo?

Lubię co:

- dla "K101", jeśli jest to komponent o nazwie "Część1", który jest częścią zespołu o nazwie "Złożenie2", powinno to być "Część1-1@Assemblage2".

- dla "J100", jeśli jest to początek Assemblage2, powinno to być "Point1@Origine@Assemblage2".

- dla "J101", jeśli jest to początek Części1, powinno to być "Point1@Origine@Pièce1-1@Assemblage2".

Umieść wiersz "MsgBox (longstatus)" po wierszu "Set swMate = Part.AddMate5(20, -1, False, 0.824524202641418, 0.001, 0.001, 0.001, 0.523598775983, 0.523598775983, 0.523598775983, False, False, 0, longstatus)", co pozwoli Ci pobrać kod błędu, aby porównać z tymi.

I oczywiście, jak wspomniano w innej dyskusji, sprawdź, czy twoje części są w trybie rozwiązanym w Solidworks, w przeciwnym razie to nie zadziała...

Pozdrowienia

2 polubienia

Witam

 

Już przepraszam za to czekanie z odpowiedzią, właśnie spojrzałem z powrotem na mój temat i oto co z tego wyszło:

Moje makro dobrze otwiera wszystkie moje części/zespół, przed otwarciem głównego zespołu i włożeniem różnych komponentów prawdopodobnie będę musiał znaleźć sposób, aby je otwierać i zamykać po kolei, w przeciwnym razie będzie to ciężkie.

 

Podczas wstawiania różnych komponentów do mojego zespołu, są one dobrze rozdzielone, ale wszystkie są umieszczone w swoim punkcie ciężkości, pomimo mojego swMate. Więc na razie jestem zablokowany.

 

Dziękuję za odpowiedź d.roger. Pola, do których się odwołujemy, są zwykle dobrze wypełnione. Wstawiłem linię MsgBox (longstatus), zwraca ona komunikat 4 = Nieprawidłowe wybory dla wiązania. Wnioskuję więc, że moje pudełka nie są prawidłowo wypełnione.

W J umieszczam moje punkty odniesienia "Point1@Origine@". Jako pochodzenie montażu mam tylko "Point1@Origine"

W K nazywam moje komponenty 'Part1-1@assemblage1'

Ta część ma być tam przerobiona, chcę tylko, aby moja edycja działała, ale z moimi dwiema liniami kodu:

boolstatus = Part.Extension.SelectByID2("J100", "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("J101" & "K101", "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)

 

Normalnie nie mam żadnych błędów, prawda?

 

Ostatnia rzecz, moje komponenty nie naprawiają się w moim zespole po moim makra, ale mam te trzy linie:

    boolstatus = Part.Extension.SelectByID2("K101", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
    Part.FixComponent
    Part.ClearSelection2 True

 

 

Dziękuję, na bieżąco informuję o moich postępach.

Witam

Twoje wybory nie są zatem dobre, ponieważ solidworks szuka elementów o nazwach "J100", "J101" i "K101" w twoich częściach i złożeniach, musisz pobrać wartości komórek  w programie Excel, a następnie przekazać je do zmiennych łańcuchowych, które następnie przypisz do funkcji SelectByID2.

Dim FirstSelection As String
FirstSelection = 'valeur de la cellule Excel (attention ce n'est pas le numéro de la cellule)'
Dim SecondSelection As String
SecondSelection = 'valeur de la cellule Excel (attention ce n'est pas le numéro de la cellule)'
        
Part.ClearSelection2 True
boolstatus = swAssemblyDoc.Extension.SelectByID2(FirstSelection, "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = swAssemblyDoc.Extension.SelectByID2(SecondSelection, "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)

Pozdrowienia

Witam

 

Rzeczywiście, zwrócenie wartości J100 lub J101 nie było dobrym pomysłem, błędem początkującego lub kogoś nieprzyzwyczajonego do VBA. Wziąłem więc to, co było na stacji frontowej, aby ruszyć do przodu, oto jak to wygląda:

 

        For i = 101 To 103
boolstatus = Part.AddComponent(ActiveSheet.Range("H" & i), 0, 0, 0)

Dim CompInsert As String
CompInsert = ActiveSheet.Range("E" & i) & "-1@" & ActiveSheet.Range("E100")
Dim FirstSelection As String
FirstSelection = "Point1@Origine@" & CompInsert
Dim SecondSelection As String
SecondSelection = "Point1@Origine"

    'positionnement de la pièce
            'suppression du "fixe" sur la première pièce
            boolstatus = Part.Extension.SelectByID2(CompInsert, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
            Part.unFixComponent

Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2(FirstSelection, "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = Part.Extension.SelectByID2(SecondSelection, "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)
            
Set swMate = Part.AddMate5(20, -1, False, 0, 0.001, 0.001, 0.001, 0.001, 0.5235987755983, 0.5235987755983, 0.5235987755983, False, False, 0, longstatus)

 

Na chwilę obecną mojemu makro udaje się wykonać następujące operacje:

Otwórz wszystkie komponenty jeden po drugim, aby uniknąć trybu nierozwiązanego, pomyślę później o mniej kłopotliwym rozwiązaniu.

Otwiera mój główny zespół lub wstawia komponenty.

To sprawia, że komponent jest "darmowy". (Zmienna "CompInsert" ok)

Umieszcza moje komponenty origin/origin i naprawia je.

 

Dziękuję za pomoc, teraz muszę znaleźć sposób, aby otworzyć moje komponenty bezpośrednio w moim zespole i je rozwiązać.

Nie ma potrzeby otwierania wszystkich komponentów, aby umieścić je w rozwiązanej formie, wystarczy wyświetlić listę gwintów złożenia załadowanego do Solidworks za pomocą funkcji "GetRootComponent3", a następnie umieścić je w trybie rozpoznania za pomocą funkcji "SetComponentDelete".

Pozdrowienia