Obsah

Dicom Viewer a Dicom TimeLine

vetva v gite duch/merge8Tučné

Dôležité pre fungovanie týchto prvkov je nutné mať spustený, nakonfigurovaný Orthanc server, nastavenú komunikáciu s PACS serverom a dostupný DCMTK toolkit.

V dennej operatíve sú dva nové prvky Dicom viewer a Dicom - Timeline.

Dicom viewer

Primitívny náhľadový priehľadač snímok z RTG, CT a pod… Slúži na zobrazovanie jednotlivých DICOM obrázkov v okne tabu. Pomocou klasického ovládania môže byť zväčšovaný alebo zmenšovaný. DICOM obrázok sa následne proporcionálne zmenší/zväčší. V prípade zobrazenie obrázka sa zobrazí aj v pravom hornom rohu, jednoduché kontextové menu.

Show in Browser

zobrazí aktuálne zobrazenú DICOM inštanciu v plnej veľkosti v okne prehliadača, vo formáte HTML. Vrátane základných DICOM tagov

Full Size/Normal Size

zobrazí DICOM inštanciu v Dennej operatíve v plnej veľkosti a pomocou dragovania ju možné prezerať v okne prehliadača detialnejšie

Windows

zmení Window Center a Window Width pri CT štúdiach, zatiaľ len na Bone, Brain, Lung, Mediastinum, Abdomen. Požiadavka sa posiela na server, kde sa spracuje…

Nastavenia

Pre fuknčnosť je nutné nastaviť

Dicom TimeLine

Vychádza zo základnej TimeLine-y a slúži na zobrazenie jednotlivých štúdii, zoradených chronologicky (dľa nastavenia) pre daného pacientka alebo pre daný výber štúdii.

Zakladné nastavenie v XML (Controls Layout)

<layout version="5" updated="2017-01-31">
  <contentTemplate type="DICOM_STUDY" insert="append" clear="yes">
    {include file="dailyop:dicom/study_content1"}
  </contentTemplate>
  <trigger group="rowSlotExtraContent">
    {$rowType}-ec:{$hasExtraHeaderContent}
  </trigger>
  <trigger group="rowBase">
    {$rowType}-d:{$$display}
  </trigger>
  <declare>
    * extra_header_content_mc
		Extra obsah, napr. z modulov.
 
	* base1_mc
		Základňa pre výpočet výšky elementu.
 
	* line1_mc
		Deliaca čiara.
 
 
	* date_mc
		Informácie o čase medického záznamu.
 
		//row/contentFunction/control[@controlId="date_mc"]/data[@id="base"]
			Základné vizuálne nastavenie.
 
		//row/contentFunction/control[@controlId="date_mc"][@date="date"]
			Bude vždy zobrazený dátum.
 
		//row/contentFunction/control[@controlId="date_mc"][@date="human"]
			Dnes a včera bude ako text.
 
		//row/contentFunction/control[@controlId="date_mc"][@time="hide"]
			Skrytie času.
 
 
	* title_mc
		Názov štúdie.
 
		//row/contentFunction/control[@controlId="date_mc"][@display="patient"]
			S nazvom studie sa zobrazi aj meno pacienta.
 
		//row/contentFunction/control[@controlId="title_mc"]/data[@id="base"]
			Základné vizuálne nastavenie.
 
		//row/contentFunction/control[@controlId="title_mc"]/data[@id="study"]
			Základné vizuálne nastavenie pre nazov studie.
 
		//row/contentFunction/control[@controlId="title_mc"]/data[@id="base"]
			Základné vizuálne nastavenie pre meno pacienta.
  </declare>
  <row>
    <trigger group="rowSlotExtraContent" id="dicom_study-ec:1" />
    <contentFunction>
      <control controlId="extra_header_content_mc" />
    </contentFunction>
    <control controlId="extra_header_content_mc" left="6" top="16" visible="yes" xscale="90" rightBase="__row.right" right="0" _border="yes" initFirst="yes" />
    <control controlId="base1_mc" topBase="extra_header_content_mc.bottom" top="0" />
    <control controlId="line1_mc" topBase="extra_header_content_mc.bottom" top="0" />
  </row>
  <row>
    <trigger group="rowSlotExtraContent" id="dicom_study-ec:0" />
    <control controlId="base1_mc" top="27" />
    <control controlId="line1_mc" top="27" />
    <control controlId="extra_header_content_mc" top="15" visible="no" />
  </row>
  <row>
    <trigger group="rowBase" id="dicom_study-d:header" />
    <trigger group="rowBase" id="dicom_study-d:full" />
    <trigger group="rowBase" id="dicom_study-d:teaser" />
    <contentFunction>
      <control controlId="date_mc" date="human" runLater="yes" />
      <control controlId="title_mc" _display="patient" runLater="yes" />
      <control controlId="patient_mc" runLater="yes" />
      <control controlId="init_handlers" runLater="yes" />
    </contentFunction>
    <control controlId="__row" height="28" elementHeight="28" rightBase="__panel.right" right="-19">
      <background>
        <key color="#ffcc00" position="0" />
        <key color="#ffffcc" position="53" />
      </background>
    </control>
    <control controlId="__row" heightBase="base1_mc.top" height="1" elementHeightBase="base1_mc.top" elementHeight="0" rightBase="__panel.right" right="-19" />
    <control controlId="report_mc" visible="no" />
    <control controlId="line1_mc" visible="no" />
    <control controlId="title_mc" left="6" top="0" width="150" xscale="85" visible="yes" _border="1" />
    <control controlId="date_mc" leftBase="title_mc.right" left="2" top="0" rightBase="__row.right" right="-4" visible="yes" _border="1" />
    <control controlId="patient_mc" _leftBase="title_mc.right" left="6" top="14" width="100" xscale="85" visible="yes" border="0" />
  </row>
  <row>
    <trigger group="rowBase" id="dicom_study-d:teaser" />
    <contentFunction>
      <control controlId="fill_content" type="teaser" />
    </contentFunction>
    <control controlId="__row" heightBase="base1_mc.top" height="0" elementHeightUnset="yes" />
    <control controlId="line1_mc" left="10" rightBase="__row.right" right="-10" visible="no" />
    <control controlId="report_mc" left="8" topBase="base1_mc.top" width="200" top="1" bottomBase="__row.bottom" bottom="0" rightBase="__row.right" right="-1" visible="yes" />
  </row>
  <row>
    <trigger group="rowBase" id="dicom_study-d:full" />
    <contentFunction>
      <control controlId="fill_content" type="full" />
    </contentFunction>
    <control controlId="line1_mc" left="10" rightBase="__row.right" right="-10" visible="yes" />
    <control controlId="report_mc" left="8" topBase="base1_mc.top" top="1" width="200" rightBase="__row.right" right="-8" visible="yes" selectable="yes" _border="1" />
    <control controlId="__row" heightBase="report_mc.bottom" height="2" elementHeightUnset="yes" />
  </row>
</layout>

a pre zobrazenie jedotlivých sérií ppo rozkliknutí štúdie je nutné mať template v databáze omegy t.j.

{include file="dailyop:dicom/study_content1"}

je nutné mať v tabuľke st2_dailyop_library nahratý riadok s daným templatom

{*$smarty.now*}
{strip}
<b>{*$series_name|escape*}</b>
{foreach from=$series_data item=serie key=k}
 
{assign var="description" value=$serie.MainDicomTags.SeriesDescription}
{assign var="modality" value=$serie.MainDicomTags.Modality}
<a href="asfunction:_DAILY_OPERATIONS_FORM.runControl,c_24|series|{$serie.ID}"><b><u>
{if $description}
{$description}
{else}
{$modality}
{/if}
</b></u></i> ({$serie.Instances|@count})</a>
{if $k < $series_data|@count-1} &#8226; {/if}
{/foreach}
{/strip}

Takto tu bude vyzerať po rozkliknutí

Vyššie uvedený kód ma na starosti správne zobrazenie jednotlivých serií vrámci štúdie. Po kliknutí na danú sériu sa táto načíta do Dicom Viewera, a pre tento účel je nutné vytvoriť na ploche tab-u Action Control a do Actions tohoto prvku vložiť následovný kód. Taktiež je nutné do Control ID vložiť názov, ktorý používame vo vyššie uvedenom template (napr. c_24)

<runFunction controlId="dicom_view" function="setType" pass="arguments">
  <param valueHelperDataId="_runControlArg0" />
</runFunction>
<runFunction controlId="dicom_view" function="setUuid" pass="arguments">
  <param valueHelperDataId="_runControlArg1" />
</runFunction>
<updateControl controlId="dicom_view" />

Na to aby sa pri preklikavan9 jednotlivých štúdii premazal obsah Dicom Viewera je nutné vytvorenie Action Control, ktoré bude počúvať na udalosť z timeline-y (broadcast on select) a bude obsahovať nasledovaný kód v tab-e Actions

<runFunction controlId="dicom_view" function="clear" />

Tlačidlá s požiadavku na zobrazenie dľa parametrov

<runFunction controlId="sel_pacient" function="clearFnc" />
<runFunction controlId="dicomTl1" function="setDicomSearchParameters" pass="arguments">
  <param type="object">
    <param key="type" value="date_word" />
    <param key="query" value="lastHour" />
    <param key="modality" value="CR" />
  </param>
</runFunction>

Prvý riadok na starosti to, že ak sme mali vybraného pacienta pomocou smartSearchu tento sa premaže. Druhý riadok zavolá funkciu v DicomTimeline, do ktorej pošleme argument typu object

<param key="type" value="date_word" />
key value
type date_word (hľadá podľa dátumu slova)
type patient (hľadá podľa pacienta)
<param key="query" value="lastHour" />
key value
query lastHour (hľadá dľa slovného výrazu, v PHP je to názov funkcie)
<param key="modality" value="CR" />
key value
modality CR (napr. CR, CT, PT, XA a pod, modalita v DICOMe) len jedna modalita

Uvedený príklad vyhľadá všetky klasické RTG snímky za poslednú hodinu

Pozor!!!! Pre ďalšie je nutné dorobenie funkcie v PHP (nie je nutná kompilácia flashu)

Vyhľadávanie pomocu smartSearch-u

Na plochu vložíme Medic Patient Select Control, nastavíme mu Data ID a to vložime aj do DicomTimeLine-y do Patient Data ID.

Nezabudnúť ošetriť zmazanie DicomViewera cez runControl tag a funckciu clear….

Vyhľadávanie podľa vloženého mena alebo rodného čísla

Na plochu vložíme InputBox control a nastavíme Data ID napr. na inputbin_txt. Ďalej vytvoríme Button control, zapneme Broadcast on click a do tabu actions vložime následovný xml kód

<runFunction controlId="sel_pacient" function="clearFnc" />
<runFunction controlId="dicomTl1" function="setDicomSearchParameters" pass="arguments">
  <param type="object">
    <param key="type" value="patient" />
    <param key="query" value="bin" />
    <param key="binNum" valueFormDataId="inputbin_txt" />
  </param>
</runFunction>
<updateControl controlId="dicomTl1" />