• No results found

5.2 Uzly

5.2.12 Tagy a skupiny tag˚ u

Tagy a skupiny tag˚u jsou pˇr´ıtomny i v p˚uvodn´ı verzi protokolu. Umoˇzˇnuj´ı do uzl˚u ukl´adat jednak dodateˇcn´e informace jako napˇr´ıklad textov´e pozn´amky, skuteˇcn´e jm´eno autora, datum posledn´ı zmˇeny, apod. Tagy a skupiny tag˚u z´aroveˇn umoˇzˇnuj´ı do uzl˚u ukl´adat i dalˇs´ı uˇziteˇcn´e informace jako je hmotnost objektu, teplota, atd.

Koncept nov´eho datov´eho modelu poˇc´ıt´a s t´ım, ˇze spousta specializo-van´ych typ˚u objekt˚u je nahrazena jedn´ım obecn´ym typem uzl˚u. V´yznam jednotliv´ych uzl˚u by mˇel b´yt pops´an pr´avˇe pomoc´ı tag˚u. Z´aroveˇn byly tagy uzp˚usobeny k efektivn´ımu ukl´ad´an´ı uˇziteˇcn´ych informac´ı. ˇCasto mˇenit infor-mace v tagech je nyn´ı stejnˇe efektivn´ı jako mˇenit je ve vrstv´ach.

Kaˇzd´y objekt m˚uˇze tedy obsahovat tagy, kter´e maj´ı (v r´amci sv´e skupiny) sv´e jedineˇcn´e jm´eno, jedineˇcn´y ˇc´ıseln´y identifik´ator, typ a hodnotu. Tagy nav´ıc mus´ı b´yt uspoˇr´ad´any do skupin tag˚u jeˇz maj´ı (v r´amci objektu) sv´e jedineˇcn´e jm´eno a identifik´ator.

Tag m˚uˇze m´ıt vˇzdy jeden z n´asleduj´ıc´ıch typ˚u:

• int8 (signed char)

• uint8 (unsigned char)

• int16 (signed short)

• uint16 (unsigned short)

• int32 (signed int)

• uint32 (unsigned int)

• real32 (float)

• real64 (double)

• string8 (unsigned char, *char)

Jm´ena tag˚u i skupiny tag˚u mohou b´yt dlouh´a pouze 255 znak˚u. Pˇr´ıklad struktury vytvoˇren´e ze skupin tag˚u a vlastn´ıch tag˚u m˚uˇze m´ıt n´asleduj´ıc´ı podobu:

• TagGroup(name: Asset, ID: 0)

– Tag(name: Name, ID: 0, type: string8, value: Obj.001) – Tag(name: Author, ID: 1, type: string8, value: Jan Nov´y) – Tag(name: Version, ID: 2, type: uint8, value: 5)

– Tag(name: Subversion, ID: 3, type: uint8, value: 3)

• TagGroup(name: Transformation, ID: 1)

– Tag(name: PosX, ID: 0, type: real32, value: 10.23) – Tag(name: PosY, ID: 1, type: real32, value: 7.68) – Tag(name: PosZ, ID: 2, type: real32, value: -0.03) – Tag(name: QuatW, ID: 3, type: real32, value: 1.77) – Tag(name: QuatX, ID: 4, type: real32, value: -3.2) – Tag(name: QuatY, ID: 5, type: real32, value: -7.04) – Tag(name: QuatZ, ID: 6, type: real32, value: 0.0) – Tag(name: ScaleX, ID: 7, type: real32, value: 1.0) – Tag(name: ScaleY, ID: 8, type: real32, value: 2.0) – Tag(name: ScaleZ, ID: 9, type: real32, value: 1.0)

Skupiny tag˚u i samotn´e tagy obsahuj´ı kromˇe jedineˇcn´eho jm´ena i je-dineˇcn´y ˇc´ıseln´y identifik´ator z toho d˚uvodu, ˇze se n´aslednˇe zjednoduˇsuj´ı pˇr´ıkazy odkazuj´ıc´ı se na dan´e skupiny tag˚u a tagy. ˇRetˇezec by ve vˇetˇsinˇe pˇr´ıpad˚u v pˇr´ıkazu zab´ıral v´ıce m´ısta jak dvou bytov´e ID.

Skupiny tag˚u

Skupinu tag˚u lze vytvoˇrit pomoc´ı pˇr´ıkazu TagGroup Create jehoˇz struk-tura je uvedena v pˇr´ıloze na obr´azku 10.13 na stranˇe 153. Souˇc´ast´ı tohoto pˇr´ıkazu je v r´amci objektu jedineˇcn´y ˇc´ıseln´y identifik´ator skupiny a jm´eno skupiny. Pˇr´ıkazy TagGroup Create by mˇel server poslat klientovi pro vˇsechny skupiny tag˚u v objektu, kdyˇz se k tomuto objektu pˇrihl´as´ı pomoc´ı pˇr´ıkazu Node Subscribe.

Skupinu tag˚u vˇcetnˇe vˇsech tag˚u uvnitˇr t´eto skupiny lze zruˇsit pomoc´ı pˇr´ıkazu TagGroup Destroy jeˇz je uveden v pˇr´ıloze na obr´azku 10.14 na stranˇe 153. Skupinu tag˚u m˚uˇze zruˇsit kaˇzd´y uˇzivatel, kter´y m´a pr´avo do dan´eho uzlu zapisovat.

Jm´ena skupin a jejich v´yznam by mˇely b´yt definovan´y v DED. Klient se potom m˚uˇze na z´akladˇe jm´ena skupiny tag˚u rozhodnout, jestli obsahu dan´e skupiny rozum´ı, pˇr´ıpadnˇe jestli ho dan´a skupina zaj´ım´a. V takov´em pˇr´ıpadˇe se m˚uˇze do skupiny tag˚u pˇrihl´asit pˇr´ıkazem TagGroup Subscribe jehoˇz struk-tura je uvedena v pˇr´ıloze na obr´azku 10.15 na stranˇe 153. Od skupiny tag˚u se lze odhl´asit pomoc´ı pˇr´ıkazu TagGroup Unsubscribe, jehoˇz struktura je uve-dena na obr´azku 10.16.

Tagy

Kdyˇz se klient pˇrihl´as´ı k nepr´azdn´e skupinˇe tag˚u, server mu poˇsle sadu pˇr´ıkaz˚u Tag Create pro vˇsechny tagy v dan´e skupinˇe. Struktura dan´eho pˇr´ıkazu je uvedena na obr´azku 5.17. Aby se klient nemusel pˇrihlaˇsovat ke kaˇzd´emu tagu zvl´aˇst’, tak je klient automaticky pˇrihl´aˇsen ke vˇsem tag˚um v dan´e skupinˇe. Server m˚uˇze poslat vlastn´ı hodnotu tagu v pˇr´ıkazu Tag Set teprve, aˇz obdrˇz´ı od klienta potvrzen´ı o doruˇcen´ı paketu s pˇr´ıkazem Tag Create.

0 1 1 2 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +---+---+---+---+

| OpCode=48 | Length | Node ID (high) |

+---+---+---+---+

| Node ID (low) | TagGroup ID |

+---+---+---+---+

| Tag ID | String Length | ... |

+---+---+---+---+

| ... | Type |

+---+---+---+---+

Obr´azek 5.17: Struktura pˇr´ıkazu pro vytvoˇren´ı nov´eho tagu

Tagy m˚uˇze pomoc´ı pˇr´ıkazu Tag Create vytv´aˇret i klient, ale poloˇzka Tag ID mus´ı b´yt nastavena na hodnotu 0xFFFF, protoˇze jedineˇcn´y identifik´ator

pro tag vyb´ır´a opˇet server. Klient mus´ı pˇr´ıkaz Tag Create pos´ılat s jedineˇcn´ym jm´enem. Kdyˇz server obdrˇz´ı pˇr´ıkaz Tag Create s jiˇz pouˇz´ıvan´ym jm´enem, tak tento pˇr´ıkaz zahod´ı, pˇr´ıpadnˇe m˚uˇze klientovi poslat pˇr´ıkaz s negativn´ım potvrzen´ım dan´e zpr´avy.

Obr´azek 5.18: Struktura pˇr´ıkazu pro nastaven´ı hodnoty tagu real32 Vlastn´ı hodnota tagu je pˇren´aˇsena v samostatn´em pˇr´ıkazu Tag Set, jenˇz se liˇs´ı podle typu tagu a zp˚usobu opakov´an´ı adresy pˇr´ıkazu. Pˇr´ıkaz pro nastaven´ı tagu real32 je uveden na obr´azku 5.18.

Kdyˇz se v jednom paketu vyskytuje mnoho pˇr´ıkaz˚u Tag Set, kter´e maj´ı totoˇznou znaˇcnou ˇc´ast adresy, tak by bylo neefektivn´ı tuto adresu opakovat.

Z tohoto d˚uvodu existuj´ı pro kaˇzd´y typ tagu 4 r˚uzn´e varianty pˇr´ıkazu Tag Set, jeˇz se liˇs´ı ve zp˚usobu opakov´an´ı jednotliv´ych poloˇzek adresy. Celkem je specifikov´ano 36 variant pˇr´ıkaz˚u Tag Set. Zp˚usoby opakov´an´ı pro typ real32 jsou uvedeny na obr´azku 5.19.

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

Obr´azek 5.19: Jednotliv´e varianty opakov´an´ı adresy pˇr´ıkazu Tag Set (real32) Prvn´ı varianta (a) opakov´an´ı je totoˇzn´a se zp˚usobem opakov´an´ım u pˇred-choz´ıch pˇr´ıkaz˚u. To znamen´a, ˇze za poloˇzkami OpCode a Length se

opa-kuje vˇzdy cel´a adresa pˇr´ıkazu (Node ID, TagGroup ID a Tag ID ), kter´a je n´asledov´ana vlastn´ı hodnotou Value. Druh´a varianta (b) umoˇzˇnuje uv´est poloˇzku Node ID pouze jednou a u zbyl´ych adres uv´adˇet pouze TagGroup ID a Tag ID. Tˇret´ı varianta (c) umoˇzˇnuje sd´ılet i poloˇzku TagGroup ID.

Posledn´ı variantu (d) je moˇzn´e pouˇz´ıt v pˇr´ıpadˇe, ˇze odes´ılatel chce odeslat nˇekolik pˇr´ıkaz˚u Tag Set, jeˇz maj´ı stejn´y typ, stejn´e Node ID, TagGroup ID a Tag ID je u kaˇzd´eho n´asleduj´ıc´ıho pˇr´ıkazu inkrementov´ano o jedna.

Kaˇzd´a varianta je vhodn´a pro jin´e kombinace pˇr´ıkaz˚u a odes´ılatel by mˇel vˇzdy vybrat vhodnou metodu opakov´an´ı podle toho, jak´e m´a pˇr´ıkazy v odes´ılac´ı frontˇe. Kdyˇz budeme uvaˇzovat pˇr´ıklad ze strany 87, tak pˇri zmˇenˇe polohy, rotace ˇci velikosti objektu se nejl´epe hod´ı posledn´ı varianta (d) z obr´ a-zku 5.19. Zmˇena pozice z pˇr´ıkladu na stranˇe 87 lze pak efektivnˇe pˇren´est pomoc´ı pˇr´ıkazu, jenˇz je uveden´y na obr´azku 5.20.

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

|73| *| ** | *** |**** | 10.23 | 7.68 | -0.03 |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

* - Length=22, ** - Node ID=65560, *** - TagGroup ID=1, **** - Tag ID=0

Obr´azek 5.20: Pˇr´ıklad komprese pˇr´ıkazu Tag Set, jeˇz byl pouˇzit´y pro pˇrenos pozice