Nástroje používateľa

Nástoje správy stránok


dev:omega:dicom

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ť

  • Control ID (napr. dicom_view)
  • Update na udalosti (napr. e_dicom)

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

  • Na ploche vytvoríme nový Button Control.
  • Nastavíme broadcast on click
  • do Actions vložíme nasledovné
<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" />
dev/omega/dicom.txt · Posledná úprava: 2017/03/08 16:18 od Boris Duchaj