Tutorial KinematicController/pl

Wprowadzenie
Ten poradnik opisuje jak z kilku linijek kodu Python wygenerować prosty kontroler kinematyczny do użycia z zespołami utworzonymi za pomocą środowiska pracy Złożenie 3.

Do kodowania można użyć dowolnego edytora tekstu. Mój wybór to Atom, ale wbudowany edytor FreeCAD też działa dobrze.

Poniższe przykłady kodu można skopiować i wkleić do pustego pliku tekstowego, a następnie zapisać pod wybraną nazwą jako plik typu lub.

Podstawowa struktura
Podstawowa struktura składa się z funkcji oraz przełącznika sprawdzającego, czy makro jest używane jako kontener dla klas, metod itp. czy też jest uruchamiane samodzielnie. Tylko druga opcja powoduje uruchomienie funkcji. Funkcja ta jest na razie pusta.

Wyznacz więzy prowadzące
Więzy prowadzące są obiektami w obrębie dokumentu FreeCAD. Należy je oznaczyć, aby można było je odnaleźć.

Dla tego kontrolera przyrostek musi być dołączony do etykiety wiązania prowadzącego. Może on być oddzielony znakiem lub  dla jasności, ponieważ będziemy sprawdzać tylko czy etykieta kończy się.

Funkcja, która otrzymuje obiekt dokumentu i zwraca listę więzów prowadzących (nazwy w tym przypadku) wykona zadanie.

Funkcja ładuje aktywny dokument do zmiennej, a następnie wywołuje funkcję  i przekazuje jej zawartość. Zwrócona lista jest ładowana do, która następnie jest sprawdzana, czy zawiera przynajmniej jeden element. Jeśli tak jest, lista jest ostatecznie wyświetlona w widoku Raportu.

Dotychczasowe makrodefinicje ...

Panel sterowania
Panel sterowania jest zbudowany z widżetów Qt, jedno główne okno zawierające kilka widżetów wejścia / wyjścia.

Każdy widżet musi zostać zaimportowany, zanim będzie można go użyć, ale można je zaimportować jako pojedynczy zestaw. Linia importu jest umieszczona w pobliżu górnej części pliku.

Okno główne
W głównym oknie linia importu wygląda tak:

Okno główne o nazwie to obiekt klasy utworzony z widżetu.

Posiada ona dwie metody init. Metoda inicjalizuje nowy obiekt klasy, obsługuje przychodzące argumenty oraz uruchamia metodę, która zarządza wszystkimi widżetami w obrębie okna głównego.

Aby uruchomić pojedynczy panel sterowania, zostanie utworzona instancja tej klasy o nazwie, z (obiekt dokumentu) oraz  (pierwsze z listy wiązań dotyczących prowadzenia) przekazanymi do tej instancji. Na koniec metoda klasy otwiera okno dialogowe.

Aby obsłużyć więcej niż jeden sterownik, musimy sprawdzić listę sterowników i utworzyć instancję dla każdej pozycji na liście i przenieść bieżącą pozycję.

Te linie zastępują polecenie w gałęzi else funkcji.

Uwaga: Zebranie pozwala na uruchomienie wszystkich paneli jednocześnie. (Nie potrafię jeszcze wyjaśnić tego zachowania...)

Uruchomienie makra spowoduje wyświetlenie nowego, pustego okna dialogowego czekającego na widżety:



Dotychczasowe makrodefinicje ...

Ustawienie parametrów
Teraz przyszedł czas na wypełnienie metody :

reprezentuje wiązanie napędowe, a przechowuje słowo kluczowe dla jego typu. To ostatnie jest używane do wyboru odpowiedniej właściwości z każdym wiązaniem.

Metoda getDriverType
Do późniejszego użycia potrzebujemy typ sterownika (Kąt, Odległość, Długość) i dlatego należy zdefiniować metodę :

Metoda ta sprawdza, czy typ podanego wiązania można znaleźć na jednej z list i zwraca, który rodzaj wymiaru ma być kontrolowany.

Zakłada się, że w dokumencie kinematycznym sterownik jest zaznaczony poprawnie i działa, jeśli jest edytowany ręcznie. W tym przypadku nie ma potrzeby filtrowania wiązań geometrycznych takich jak Współliniowość czy Zbieżność punktu (ale tutaj byłoby to uzasadnione ...).

Ustawienia okna
Rozmiar okna jest określony przez jego minimalny i maksymalny wymiar. Użycie tych samych wartości powoduje, że rozmiar jest stały.

Tytuł pokazuje nazwę sterownika i czy jest to kąt, odległość czy długość. Wreszcie okno ma pozostać na wierzchu wszystkich okien.

Ustawienie dodatkowych parametrów
Kolejnym krokiem jest wyodrębnienie aktualnej wartości sterownika i ustawienie domyślnych wartości początkowych i końcowych w zależności od typu sterownika.

Odległość nie może być ujemna i dokładnie zero stanowi zagadkę dla rozwiązania, dlatego wartość początkowa jest ustawiona na 0,001. Kąty przyjmują wartości ujemne i otrzymują wartości symetryczne. (Czy długości przyjmują wartości ujemne trzeba ostatecznie udowodnić ...)

Przyrostek jednostki musi zostać zachowany, aby na końcu zwrócić wartość do właściwości wiązanie. Odległości i długości wymagają wartości z jednostkami.

Radzenie sobie z jednostkami i wyświetlanie wartości jako ciągów w kilku widżetach wymaga dość często konwersji liczb na ciągi i odwrotnie.

Aby uzupełnić parametry ustawiamy domyślną liczbę kroków, które powinny być obliczane podczas automatyzacji ruchu, a jeśli przełącznik jest ustawiony na wartość, to przy każdym kroku ruchu będzie robione zdjęcie.

Etykiety
Teraz dodano trzy etykiety, które wyświetlają wartość początkową, końcową i bieżącą.

Najpierw należy zaimportować klasę, tzn. rozszerzyć listę importu w sposób następujący:

Wracając do metody wstawiamy:

Umieszczenie odbywa się za pomocą dziedziczonej metody. W tym przypadku wykorzystywany jest opis prostokąta (pozycja X, pozycja Y, szerokość, wysokość).

Pierwszy i trzeci wiersz można by połączyć, ale nie jest to zalecane ze względu na przejrzystość:

Uruchomienie makra z dokumentem zespołu kinematycznego spowoduje powstanie okna dialogowego jak poniżej:



Dotychczasowe makrodefinicje ...

Suwak
Aby zmienić bieżącą wartość na dowolną liczbę między wartością początkową a końcową, przydatny byłby widżet suwaka.

Najpierw należy zaimportować klasę, tzn. rozszerzyć listę importu w sposób następujący:

Wracając do metody i zaraz po sekcji labels wstawiamy:

Przycisk suwaka jest umieszczany za pomocą metody. Jego wartość musi być obliczona z bieżącej wartości i współczynnika kroku. Stosunek ten musi być obliczany przy każdej zmianie wartości początkowej lub końcowej, dlatego po metodzie wstawiamy kolejną metodę.

Praca z proporcją zamiast zmiany wartości minimalnych i maksymalnych suwaka ma tę zaletę, że pozwala na uzyskanie większej rozdzielczości dla małych wartości.

A po niej przychodzi kolejna metoda określająca, co zrobić, gdy zmieni się pozycja suwaka lub jego wartość. Metoda jest wywoływana przez metodę, która jako argument przekazuje również wartość suwaka.

Przelicza bieżącą wartość z pozycji suwaka, przepisuje tekst etykiety i zmienia właściwość wiązania zgodnie z typem sterownika.

Uruchomienie polecenia uruchamia solver do ponownego ułożenia części zespołu ze zmienioną wartością.

Okno dialogowe z suwakiem powinno wyglądać tak i jest gotowe do sterowania ruchem:



Możemy uruchomić okno dialogowe dla dowolnego otwartego dokumentu, nie będą one ze sobą kolidować.

Text entry fields
To set the start and end value we use a line edit widget.

First the class must be imported i.e. the import list has to be extended like this:

Back in the method and between the labels and the slider sections we insert:

The entry fields display the default start and end values. They are not complete until we add the methods to deal with altered entries. This will be done by the methods and  that are inserted between the  and the  methods.

Both convert the received string value to a floating point number and change either or  and the corresponding label accordingly. After that the slider value is updated.

The dialog window with text entry fields should look like this and is ready to change the range of a motion:



Dotychczasowe makrodefinicje ...

Motion
To get the assembly in motion we need:
 * Buttons to trigger motion in the desired direction.
 * An input field to alter the number of steps for faster or smoother motions.
 * A check box to indicate if we want to shoot a sequence of images.

Forward and Backward buttons
To move the assembly parts automatically we need two buttons to trigger the motions, one towards the start position and one towards the end position. These two and a close button will use a widget.

Małe złożenia obliczają się trochę za szybko i pokazują skoki zamiast płynnego ruchu. Aby go spowolnić, używamy metody modułu, który najpierw trzeba zaimportować.

Kolejny import i kolejny widżet:

Wracając do metody wstawiamy przyciski po sekcji slider:

Metody zajmujące się wciskanymi przyciskami to, oraz. Są one wstawiane po metodzie.

Metoda wywołuje dziedziczoną metodę, która po prostu zamyka okno dialogowe i tym samym kończy działanie makrodefinicji.

Zarówno jak i  liczą kroki, które pozostały do wykonania, aby osiągnąć żądaną pozycję i obliczają długość kroku zgodnie na podstawie ich liczby. Wstępnie przyjmiemy domyślną liczbę 10 kroków.

Każda runda pętli while zwiększa / zmniejsza bieżącą wartość i aktualizuje wartości suwaków, co powoduje uruchomienie w tle (patrz Akapit Suwak). Po przerwie, aby komputer dostarczył kolejny zaktualizowany widok 3D, odliczanie kroków pozostałych do przejścia kończy pętlę.

With no steps left the slider is set to the first/last slider position, just in case if a rounding error had occurred.

The dialog window with buttons should look like this and can now move the assembly by 10 steps towards the wanted start/end position:



Dotychczasowe makrodefinicje ...

Liczba kroków
Domyślnym ustawieniem jest uzyskanie szybkiego wrażenia, czy zespół porusza się zgodnie z oczekiwaniami, bez marnowania zbyt wiele czasu obliczeniowego.

Jeśli części skaczą, a nie poruszają się płynnie, lub jeśli sterowniki oparte na kątach mają tendencję do powodowania problemów, gdy różnica między dwoma kątami jest zbyt duża, to oba te przypadki można naprawić poprzez zwiększenie liczby kroków.

I tak kolejny widżet edycji linii jest używany do zmiany liczby kroków (umieszczony po istniejących widżetach edycji linii):

Powiązana metoda po prostu wypełnia parametr  wprowadzoną wartością. Jest ona wstawiana po metodzie.

Okno dialogowe umożliwiające zmianę liczby kroków powinno wyglądać następująco:



Sekwencja obrazów
Gdy ruch wykonywany przez złożenie spełnia nasze oczekiwania, możemy zrobić zdjęcie każdego kroku. Powstała sekwencja zdjęć może posłużyć do stworzenia krótkiej animacji gif.

Do realizacji tej funkcjonalności potrzebujemy widżetu, oraz katalogu do przechowywania obrazków.

Jeszcze jeden import i widżet:

Wracając do metody wstawiamy pole wyboru po sekcji suwaka:

Metoda synchronizuje parametr  i wyświetlenie znaku kontrolnego.

Do określenia parametrów wyjściowych używamy metody :

Przede wszystkim ścieżka do obrazów musi być dostosowana do Twojego systemu operacyjnego. Ostatnią częścią jest określenie nazwy obrazu bez numeru bieżącego i tagu pliku. Na razie trzeba to zrobić samodzielnie.

Następnie podążaj za tagiem pliku, aby zakończyć nazwę obrazu, nadać wysokość i szerokość obrazu oraz sposób wypełnienia tła ( (tło widoku 3D),, lub ).

Aby zawsze mieć trzycyfrową liczbę, należy przed parametrem licznika umieścić wiodące zera.

W końcu oskryptowana wersja polecenia Zrzut ekranu jest używana do robienia zdjęcia na podstawie wspomnianych parametrów.

Nadal nie zrobiono zdjęć!!! Nie ma problemu, ponieważ ta metoda nie została jeszcze wywołana, a więc musimy wstawić wywołanie w pętli while i. Zaraz po wstawiamy tę linię:

Teraz makrodefinicja powinno być gotowa do sterowania złożeniem oraz do robienia zdjęć do animowanego gifa.

Końcowa wersja okna dialogowego:



I wreszcie całe makro

'''Nie zapomnij ustawić ścieżki w metodzie output!

Kilka niedoskonałości

 * Kolejność sekwencji obrazów jest odwrócona, ponieważ używamy zmiennej steps_left, która jest odliczana.
 * Katalog obrazów i nazwa obrazu są zakodowane na sztywno.
 * Wiele kontrolerów nie jest zsynchronizowanych.