Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Tarcze enkodera w PostScript

22 Jun 2005 00:51 5693 4
  • Level 18  
    Jakiś czas temu, gdy bawiłem się PostScript'em
    napisałem mały programik przydatny przy robieniu tarcz enkoderów.
    Jeśli było by zainteresowanie z Waszej strony, mógł bym ten programik tu umieścić wraz ze stosownym opisem.

    Na rysunku próbka możliwości ;)
  • Level 12  
    Witam

    Jestem bardzo zainteresowany tym programem , gdyby to nie sprawiło problemu prosił bym o umieszczenie na serwerze ew: usolo(malpa)yahoo.com

    pozdrawiam
  • Level 18  
    Skoro jest przynajniej jeden zainteresowany to warto się podzielić.
    Oto więc opis i sam program.

    Cechy
    Poniższe rozwiązanie nie wymusza na nas używania pirackiego oprogramowania oraz działa praktycznie w dowolnym systemie operacyjnym.
    Rozdzielczość wydruku zależy jedynie od parametrów urządzenia, na którym będziemy drukować. Jeżeli potrzebujemy 1200dpi wystarczy jedynie znaleźć odpowiednią drukarkę, a nie zmieniać coś w w rysunku.

    Co będzie potrzebne?
    Potrzebne będą trzy rzeczy: dowolny edytor tekstowy (np. Notepad), drukarka z obsługą PostScript'u oraz papier lub folia do drukowania. Jeżeli nie mamy drukarki z obsługą PostScript'u, wystarczy program mogący odczytywać i drukować pliki w tym formacie, może to być na przykład darmowy GhostScript. Dla osób, które chciały by się pobawić PostScript'em polecam edytor z możliwością kolorowania składni.

    Kilka uwag technicznych
    - Podstawowa jednostka miary to punkt (1 punkt = 1/72 cala).
    - Punkt o współrzędnych (0,0) początkowo znajduje się w lewym dolnym rogu kartki.
    - Komentarze w PostScript zaczynają się od znaku procent % i kończą znakiem nowej linii.
    - PostScript rozróżnia wielkość liter, zatem zmienna, Zmienna i ZMIENNA to trzy różne rzeczy.

    Program enkoder
    Postaram się krótko opisać podstawowe elementy, z których będziemy później składać nasze tarcze enkoderów. Parametry przekazywane do funkcji ujęte są w nawiasach ostrych: <zmienna>.

    Jednostki miary
    Dostępne są trzy funkcje umożliwiające określenie rozmiarów w bardziej użytecznych jednostkach niż punkt. Są to inch, cm i mm. Stosuje się je w sposób naturalny, podając przed nazwą jednostki odpowiednią wartość. Istotna jest spacja pomiędzy wartością a jednostką miary!
    Code:
    1 cm
    
    0.73 inch
    14 mm


    Kierunek obrotu
    Do dyspozycji mamy dwie stałe określające kierunek obrotu: CW i CCW. Stałe te są wykorzystywane przy wywoływaniu funkcji qrotate.

    Funkcja ring
    Służy do rysowania czarnego okręgu o podanym promieniu.
    Sposób wywołania: <promień> ring
    Code:
    30 mm ring


    Funkcja mask
    Służy do rysowania białego koła o podanym promieniu.
    Sposób wywołania: <promień> mask
    Code:
    1.2 cm mask


    Funkcja circle
    Rysuje obwiedzione na czarno białe koło o podanym promieniu.
    Sposób wywołania: <promień> circle
    Code:
    1 inch circle


    Funkcja cross
    Rysuje czarny krzyż wpisany w niewidoczny okrąg o podanym promieniu.
    Sposób wywołania: <promień> cross
    W przykładzie rozmiar podano w punktach.
    Code:
    36 cross



    Funkcja wheel
    Rysuje okrąg składający się z podanej ilości segmentów.
    Sposób wywołania: <promień_wewnętrzny> <promień_zewnętrzny> <segmenty> wheel
    Parametr <segmenty> określa ilość białych i czarnych segmentów, przy czym rysowane są tylko czarne.
    Code:
    1 cm 2 cm 16 wheel


    Funkcja qrotate
    Obraca układ współrzędnych o 1/2 segmentu w kierunku określonym przez <kierunek>. Parametr <segmenty> podajemy aby było wiadomo jaki kąt ma jeden segment.
    Sposób wywołania: <kierunek> <segmenty> qrotate
    Code:
    CW 16 qrotate


    Funkcja userwheel
    Jest to jedyna funkcja, którą zalecam modyfikować. W miejscu pomiędzy liniami zawierającymi %begin i %end możemy wstawić wywołania wyżej opisanych funkcji w celu stworzenia odpowiedniego koła enkodera.
    Sposób wywołania: <x> <y> userwheel
    Parametry <x> i <y> określają położenie środka rysowanego koła na kartce. Znając rozmiar kartki, marginesy przy drukowaniu oraz rozmiar naszego koła, z łatwością możemy określić wartości tych parametrów.
    Code:
    /userwheel {
    
      gsave
      translate
      %twoj kod
      %begin
      ...
      %end
      grestore
    } def


    Na dołączonym rysunku przedstawiono działanie funkcji składowych. Kolor szary odpowiada niezadrukowanej powierzchni papieru. Przykład e) pokazuje działanie funkcji wheel wywołanej z następującymi parametrami: 0.5 cm 1 cm 16 wheel.


    Jak rysować?
    Do tej pory opisałem jedynie funkcje. Sama obecność ich definicji w pliku nie spowoduje jeszcze, że zostaną wykonane, jak zresztą w większości języków programowania. Aby coś się narysowało powinniśmy:
    - wypełnić funkcję userwheel odpowiednimi wywołaniami funkcji składowych
    - przynajmniej raz wywołać naszą funkcję pisząc na przykład 10 cm 10 cm userwheel
    - wreszcie na samym końcu napisać polecenie showpage, które powoduje zamknięcie bieżącej strony i wysłanie jej do drukarki.

    W programie na samym końcu jest przykładowy fragment rysujący dwa identyczne koła na jednej kartce.
    Code:
    %%main program
    
    10 cm 7.5 cm userwheel
    10 cm 20 cm userwheel
    %%main program end
    showpage



    Przykłady
    Poniżej zamieszczono przykładowe kody odpowiedzialne za wyrysowanie kół z pierwszego postu w tym wątku.
    Wybrany kod należy wstawić pomiędzy %begin i %end w funkcji userwheel.
    Code:
    .5 cm .7 cm 2 wheel
    
    .7 cm .9 cm 4 wheel
    .9 cm 1.1 cm 8 wheel
    1.1 cm 1.3 cm 16 wheel
    1.3 cm 1.5 cm 32 wheel
    1.5 cm 1.7 cm 64 wheel
    1.7 cm 1.9 cm 128 wheel
    1.9 cm 2.1 cm 256 wheel


    2.15 cm ring
    .45 cm ring
    .3 cm cross


    Code:
    1 cm 1.5 cm 32 wheel
    
    CW 32 qrotate
    1.5 cm 2 cm 32 wheel
    2.1 cm ring
    .9 cm ring
    .7 cm cross
    .2 cm mask


    Uwagi
    - Jeżeli rysowane linie okażą się za cienkie (dotyczy funkcji ring, circle i cross), można zmienić wartość w linii 10: 0.1 setlinewidth na większą.

    - Wywołanie funkcji qrotate spowoduje obrócenie układu współrzędnych na stałe (patrz drugi przykład). Można to zignorować lub wywołać funkcję qrotate z przeciwnym kierunkiem obrotu i taką samą ilością segmentów.

    I to tyle na temat programu.
    W razie pytań jestem do dyspozycji.

    Owocnego użytkowania.
  • Level 18  
    Nastała ostatnio jakaś mania na zamykanie tematów.
    Czemu ona miała by służyć, nie wiem, ale na szczęście sa mądrzejsi ode mnie ;)

    Cóż, ja w tym temacie już nic więcej nie dodam.
    Pozostają jedynie ludzie, którzy będą mieli pytania.
    Jeśli temat zostanie zamknięty, pozostanie im PW.