Strona główna » Poradniki » Grafika SVG » Definiowanie obiektów
 

Definiowanie obiektów

Wstęp

Podczas tworzenie grafiki SVG może przydać się możliwość definiowania własnych typów obiektów. Jest to szczególnie przydatne kiedy ten sam obiekt występuje wiele razy na rysunku. Bardzo często tego typu obiekt będzie bardziej złożony niż wbudowane typy takie jak prostokąt czy koło. Weźmy pod uwagę tego typu rysunek:

Napisanie powyższego przykładu sprowadzałoby się do napisania trzech razy tego samego obiektu i jedynie zmiany koloru wypełnienia. Nie jest to słuszne rozwiązanie, ponieważ jeśli chciałoby się zmienić typ obiektu, który został przedstawiony na rysunku np. zamiast pięciokąta żeby był sześciokąt to należałoby zmienić każdy obiekt oddzielnie. Najbardziej efektywnym rozwiązaniem jest zdefiniowanie typu obiektu.

Defniowanie obiektu

Przestrzeń nazw

W celu powielania wybranego obiektu należy najpierw zadeklarować, że dany obrazek SVG będzie korzystał z przestrzeni nazw xlink. W tym celu należy wpisać odpowiedni atrybut jak w linijce (3.):

  1. <svg width="300" height="100" viewBox="0 0 161 50"
  2.   xmlns="http://www.w3.org/2000/svg"
  3.   xmlns:xlink="http://www.w3.org/1999/xlink">

Definicja

Obiekt definiuje się tak samo jak np. gradienty w sekcji defs. Definiowanym obiektem może być wszystko: linia, wielokąt czy grupa obiektów. Definiowany obiekt musi mieć określony identyfikator id, aby można się było do niego odwołać. Przykładowa deklaracja pięciokąta będzie wyglądać następująco:

  1.   <defs>
  2.     <polygon id="e00" stroke="black"
  3.       points="0,29.666 25.235,48 50.470,29.666 40.837,0 9.639,0"/>
  4.   </defs>

Użycie

Tak przygotowany obiekt można już wykorzystać. W tym celu należy użyć obiektu use, a następnie podać pozycję przy pomocy atrybutów x i y. Następnie odwołanie do obiektu należy wykonać poprzez atrybut xlink:href i podać jako wartość #, a po nim identyfikator zdefiniowanego obiektu. Opcjonalnie można ustalić atrybuty takie jak fill, stroke, lecz o tym szerzej w dalszej części artykułu.

  1.   <use x="0" y="1" xlink:href="#e00" fill="red"/>
  2.   <use x="55" y="1" xlink:href="#e00" fill="green"/>
  3.   <use x="110" y="1" xlink:href="#e00" fill="blue"/>
  4. </svg>

Efektem końcowym przedstawionego kodu jest obrazek taki jak został przedstawiony na początku artykułu. W dalszej części zostanie dokładnie wytłumaczone jak w pełni wykorzystać definicję obiektu.

Tworzenie znaków

Zależności

Załóżmy, że definiujemy obiekt, który będzie przedstawiał znak drogowy. W tym przykładzie wyjaśnione zostanie jak prawidłowo napisać definicję znaków zakazu oraz nakazu. Przede wszystkim najpierw należy zauważyć, że oba znaki mają kształt koła i wiszą na słupku.

Dla słupka można ustalić zarówno wypełnienie jak i kolor obramowania. Jednak oba rodzaje znaków mają jedynie wspólny kształt. Zarówno kolor obramowania jak i wypełnienia nie powinien być ustalany domyślnie w definicji obiektu, ponieważ nie będzie możliwości jego zmiany. W tym przypadku zostanie wykorzystana grupa, ponieważ obiekt będzie składał się z dwóch podelementów (słupka i koła).

Kod

  1. <svg width="250" height="150" viewBox="0 0 250 150"
  2.   xmlns="http://www.w3.org/2000/svg"
  3.   xmlns:xlink="http://www.w3.org/1999/xlink">
  4.   <defs>
  5.     <g id="e01">
  6.       <rect x="48" y="50" width="4" height="100"
  7.         stroke="black" stroke-width="2" fill="gray"/>
  8.       <circle cx="50" cy="50" r="40"/>
  9.     </g>
  10.   </defs>
  11.   <use x="0" y="0" xlink:href="#e01"
  12.     fill="white" stroke="red" stroke-width="8"/>
  13.   <use x="150" y="0" xlink:href="#e01"
  14.     fill="blue" stroke="lightgray" stroke-width="4"/>
  15. </svg>

(5. - 9.) Definicja obiektu, który składa się z (6. - 7.) prostokąta jako słupek oraz (8.) koła. Następnie (11. - 14.) wyświetlane są dwa różne znaki chociaż korzystają z tego samego obiektu wyjściowego.

Wynik

Efektem napisanego kodu SVG jest poniższy rysunek:

Warto zauważyć, że kolor wypełnienia oraz obramowania został pobrany z przekazanych argumentów w obiekcie use. W przypadku, gdyby słupek nie miał ustalonego koloru wypełnienia to miałby on ten sam kolor wypełnienia co znak. Analogicznie też tak będzie dla dowolnej właściwości np. obramowania. Przykładowo po usunięciu zapisu wypełnienia i obramowania słupka rysunek wyglądałby następująco:

Taki rezultat może znaleźć zastosowanie w innym projekcie.

Uniwersalność definicji

Jeśli obiekt został zdefiniowany prawidłowo to można go wykorzystywać jego dowolne przekształcenie. Innymi słowy nie ma potrzeby zmieniać, albo dodawać kolejnej definicji, aby uzyskać obiekt mniejszy lub większy. W celu prezentacji tego problemu warto się przyjrzeć poniższemu rysunkowi:

W kodzie rysunku nie zostały zdefiniowanych pięć obiektów, ani dwóch definicji. Jest tylko jedna definicja i została wykorzystana pięć razy. Do powiększenia i obrócenia obiektu został wykorzystany atrybut transform. Poniżej znajduje się kod rysunku, który sugeruje dobrze przeanalizować, aby zrozumieć jak można ten sam obiekt wykorzystać kilka razy:

  1. <svg width="300" height="140" viewBox="0 20 200 80"
  2.   xmlns="http://www.w3.org/2000/svg"
  3.   xmlns:xlink="http://www.w3.org/1999/xlink">
  4.   <defs>
  5.     <rect id="e03" x="0" y="0" width="50" height="50"
  6.       stroke="black"/>
  7.   </defs>
  8.   <use x="30" y="35" xlink:href="#e03" fill="green"
  9.     transform="rotate(45 55 60)"/>
  10.   <use x="100" y="35" xlink:href="#e03" fill="green"
  11.     transform="rotate(45 125 60)"/>
  12.   <use x="15" y="95" xlink:href="#e03" fill="red"
  13.     transform="scale(0.5, 0.5) rotate(45 40 120)"/>
  14.   <use x="155" y="95" xlink:href="#e03" fill="orange"
  15.     transform="scale(0.5, 0.5) rotate(45 180 120)"/>
  16.   <use x="295" y="95" xlink:href="#e03" fill="red"
  17.     transform="scale(0.5, 0.5) rotate(45 320 120)"/>
  18. </svg>

Zadania

Zadanie 1

Na poniższym obrazku została wykorzystana następująca definicja:

  1.   <defs>
  2.     <rect id="z00" x="0" y="0" width="100" height="100"/>
  3.   </defs>

Każdy kolejny kwadrat jest 20% mniejszy od poprzedniego. Ponadto nieparzyste kwadraty są wyrównane do prawego górnego rogu poprzedniego kwadratu, a parzyste do lewego dolnego rogu poprzedniego kwadratu. Użyta paleta kolorów może być dowolna niż przedstawiona na rysunku.

Zadanie 2