⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 awizard__define.pro

📁 DICOM viewer - this software is used to view a set of DICOM images.
💻 PRO
字号:
;*********************************************************************
pro awizard::add_tag, tag_str

    x = [200,150,150,50,30]

    nr = n_elements(*self.remove)

    new_remove = widget_base(self.dynamic_base, row = 1, ys = self.ysize, $
        uvalue = {tag:tag_str.tag, flag:tag_str.flag,index:nr}, uname = tag_str.tag, $
        xs = total(x))

    l = widget_label(new_remove, ys = 20, xs = x[0], $
        value = tag_str.desc)

    t = widget_text(new_remove, scr_ys = 20, scr_xs = x[1], $
        value = self.anonymizer->get_dicom_value_string(tag_str.tag))

    new_text = widget_text(new_remove, value = tag_str.value, $
        /edit, scr_ys = 20, scr_xs = x[2], uname = 'remove')

    remove = widget_button(new_remove, value = 'Remove', $
        xs = x[3], ys = 20, uvalue = 'remove')

    *self.remove = nr gt 0 ? $
        [*self.remove, new_remove] : new_remove

    *self.new_tags = n_elements(*self.new_tags) gt 0 ? $
        [*self.new_tags, tag_str.tag] : [tag_str.tag]

    self -> tlb_resize

end



;*********************************************************************
pro awizard::cleanup


    ptr_free, self.text, self.remove, $
        self.new_tags, self.removed_tags
    obj_destroy, self.pref

    if self.tlb ge 0 then $
        widget_control, self.tlb, /destroy

end



;*********************************************************************
pro awizard::close_wizard

    if obj_valid(self.pref) then $
        self.pref -> close_dialog

    if ~ptr_valid(self.new_tags) then return
    if ~ptr_valid(self.removed_tags) then return

    nrt = n_elements(*self.removed_tags)
    if nrt gt 0 then $
        for i = 0, nrt-1 do $
            self.anonymizer -> define_tags, (*self.removed_tags)[i]

    nnt = n_elements(*self.new_tags)
    if nnt gt 0 then $
        for i = 0, nnt-1 do begin

            self.anonymizer -> define_tags, (*self.new_tags)[i], /remove

        endfor

; Clean up...
    ptr_free, self.new_tags, self.remove, self.removed_tags
    self.new_tags = ptr_new(/allocate)
    self.removed_tags = ptr_new(/allocate)
    self.remove = ptr_new(/allocate)

end




;*********************************************************************
function awizard::init, anonymizer, $
    user_preferences = up, $
    no_block = nb, $
    from_application = fa

    resolve_routine, 'wizard_event'

    if n_elements(anonymizer) eq 0 then $
        return, 0

    if ~obj_valid(anonymizer[0]) then $
        return, 0

    self.anonymizer = anonymizer[0]
    self.text = ptr_new(/allocate)
    self.new_tags = ptr_new(/allocate)
    self.removed_tags = ptr_new(/allocate)
    self.pref = obj_new('apreferences', self.anonymizer, $
        self, user_pref = keyword_set(up))
    self.remove = ptr_new(/allocate)
    self.tlb = -1
    self.ysize = 23

    self.from_application = keyword_set(fa)

    self.no_block = keyword_set(nb)

    return, 1

end




;*********************************************************************
pro awizard::launch_wizard, $
    static_tags = in_static_tags, $
    dynamic_tags = in_dynamic_tags, $
    value_only = val_only, $
    no_block = nb, $
    from_application = fa

    compile_opt idl2

    device, get_screen_size = ss

    val_only = keyword_set(val_only)
    if n_elements(nb) gt 0 then $
        self.no_block = keyword_set(nb)

    w = where(in_static_tags.flag gt 0)
    static_tags = (w[0] gt -1) ? $
        in_static_tags[w] : in_static_tags

    x = [200,150,150,50,30]

    device, get_screen_size = ss

    self.tlb = widget_base(col = 1, title = 'Set Anonymized Tags', $
        mbar = menu)
    prefbutton = widget_button(menu, value = 'File', /menu)
    b = widget_button(prefbutton, value = 'Default Preferences...', uvalue = 'pref')
    b = widget_button(prefbutton, value = 'Only Use Defined Values', uvalue = 'val', $
        /checked_menu)

    if val_only then $
        widget_control, b, /set_button

    base = widget_base(self.tlb, col = 1)

    nt = n_elements(static_tags)
    *self.text = lonarr(nt)
    self.static_base = widget_base(base, /frame, $
        xs = total(x), col = 1)

; Set up the widget labels displaying the attribute name:
    for i = 0, nt-1 do begin

;        yoff = self.ysize*i

        temp = widget_base(self.static_base)

        l = widget_label(temp, ys = 20, xs = x[0], $
            value = (static_tags)[i].desc, $
            xoff = 0, yoff = yoff)

        t = widget_text(temp, scr_ys = 20, scr_xs = x[1], $
            value = self.anonymizer->get_dicom_value_string((static_tags)[i].tag), $
            xoff = x[0]+5, yoff = yoff)

        (*self.text)[i] = widget_text(temp, value = (static_tags)[i].value, $
            /edit, scr_ys = 20, scr_xs = x[2], xoff = total(x[0:1])+10, yoff = yoff, $
            uvalue = {tag:static_tags[i].tag,flag:static_tags[i].flag})

    endfor


; DYNAMIC TAGS...
    self.dynamic_base = widget_base(base, col = 1, /scroll, $
        xs = total(x), /frame)

    if n_elements(in_dynamic_tags) gt 0 then begin

        w = where(in_dynamic_tags.flag gt 0)

        if w[0] gt -1 then begin

            dynamic_tags = in_dynamic_tags[w]

            nd = n_elements(dynamic_tags)
            *self.remove = lonarr(nd)

            for i = 0, nd-1 do begin

                (*self.remove)[i] = widget_base(self.dynamic_base, row = 1, $
                    uvalue = {tag:(dynamic_tags[i]).tag,flag:(dynamic_tags[i]).flag,index:i}, $
                    xs = total(x), ys = self.ysize, $
                    uname = (dynamic_tags[i]).tag)

                l = widget_label((*self.remove)[i], ys = 20, xs = x[0], $
                    value = (dynamic_tags)[i].desc)

                t = widget_text((*self.remove)[i], scr_ys = 20, scr_xs = x[1], $
                    value = self.anonymizer->get_dicom_value_string((dynamic_tags)[i].tag))

                text = widget_text((*self.remove)[i], value = (dynamic_tags)[i].value, $
                    /edit, scr_ys = 20, scr_xs = x[2], uname = 'remove')

                remove = widget_button((*self.remove)[i], value = 'Remove', $
                    uvalue = 'remove', xs = x[3], ys = 20)

            endfor

        endif

    endif

    base = widget_base(self.tlb, row = 1)

    if n_elements(fa) gt 0 then $
        self.from_application = keyword_set(fa)

    if ((~self.no_block) and (self.from_application)) then $
        b = widget_button(base, value = 'Anonymize', uvalue = 'anonymize', $
        tooltip = 'Write Anonymized File')
    b = widget_button(base, value = 'Accept', uvalue = 'accept', $
        tooltip = 'Save Attribute/Values for this session')
    b = widget_button(base, value = 'Close', uvalue = 'cancel', $
        tooltip = 'Close this dialog')

    widget_control, self.tlb, /realize, set_uvalue = self

    self -> tlb_resize
    self -> update_sensitivity

    xmanager, 'wizard', self.tlb, cleanup = 'wizard_cleanup', $
        no_block = self.no_block

end



;*********************************************************************
pro awizard::preferences_wizard

    self.pref -> launch_dialog

end




;*********************************************************************
function awizard::query_wizard_dialog

    return, self.tlb ge 0

end



;*********************************************************************
pro awizard::remove_tag, tag

    if n_elements(tag) gt 0 then $
        self.anonymizer -> define_tags, tag, /remove

    nnt = n_elements(*self.new_tags)

    if nnt gt 0 then begin

        w = *self.new_tags eq tag
        if total(w) gt 0 then begin
        ; Remove tag from NEW_TAGS list

            if nnt eq 1 then begin

            ; Reset pointer
                ptr_free, self.new_tags
                self.new_tags = ptr_new(/allocate)

            endif else begin

                ind = where(~w)
                *self.new_tags = (*self.new_tags)[ind]

            end

            return
        endif

    endif

; Add tag to REMOVED_TAGS list
    *self.removed_tags = n_elements(*self.removed_tags) gt 0 ? $
        [*self.removed_tags,tag] : [tag]

end



;*********************************************************************
pro awizard::remove_tag_base, tag

    n = n_elements(*self.remove)
    wid = widget_info(self.tlb, find_by_uname = tag)

    if wid eq 0 then $
        return

    widget_control, wid, get_uvalue = state
    ind = state.index

    widget_control, wid, /destroy

    temp_remove = *self.remove

    if n eq 1 then begin

        void = temporary(*self.remove)

    endif else begin

        *self.remove = lonarr(n-1)

        index = 0

        for i = 0, n-1 do begin

            if i ne ind then begin

                (*self.remove)[index] = temp_remove[i]
                widget_control, (*self.remove)[index], get_uvalue = state
                state.index = index
                widget_control, (*self.remove)[index], set_uvalue = state
                index++

            endif

        endfor

    endelse

    self -> tlb_resize

end



;*********************************************************************
pro awizard::set_anonymizer_values, $
    nowrite = nw

    ns = n_elements(*self.text)
    nt = n_elements(*self.remove)
    tags = replicate({desc:'',tag:'',value:'',flag:0b},ns+nt)

    for i = 0, ns-1 do begin

        widget_control, (*self.text)[i], $
            get_value = val, get_uvalue = uval
        tags[i].tag = uval.tag
        tags[i].value = val

    end

    for i = 0, nt-1 do begin

        widget_control, (*self.remove)[i], get_uvalue = uval
        text = widget_info((*self.remove)[i], /child, $
            find_by_uname = 'remove')
        widget_control, text, get_value = val

        tags[i+ns].tag = uval.tag
        tags[i+ns].value = val

    endfor

    self.anonymizer -> define_tags, tags

    if ~keyword_set(nw) then $
        self.anonymizer -> setproperty, wizard_cont = 1

; Don't remove new tags from anonymizer's dynamic tag list.
    ptr_free, self.new_tags, self.removed_tags
    self.new_tags = ptr_new(/allocate)
    self.removed_tags = ptr_new(/allocate)

end



;*********************************************************************
pro awizard::save_preferences

    self.anonymizer -> save_preferences


end



;*********************************************************************
pro awizard::setproperty, $
    tlb = tlb, $
    value_only = val_only, $
    no_block = nb, $
    user_preferences = up

    if n_elements(nb) gt 0 then $
        self.no_block = keyword_set(nb)

    if n_elements(tlb) gt 0 then $
        self.tlb = tlb[0]

    if n_elements(val_only) gt 0 then $
        self.anonymizer -> setproperty, value_only = keyword_set(val_only)

    if n_elements(up) gt 0 then $
        self.pref -> setproperty, user_preferences = keyword_set(up)

end




;*********************************************************************
pro awizard::tlb_resize
; Resizes the top level base if there are too many
; Attributes being defined for the current screen
; resolution.

    device, get_screen_size = ss
    geom = widget_info(self.tlb, /geom)

    if (geom.scr_ysize + self.ysize) gt ss[1] then begin
    ; Increase

        widget_control, self.dynamic_base, scr_ysize = $
            (widget_info(self.dynamic_base, /geom)).scr_ysize - $
            geom.scr_ysize + ss[1] - self.ysize, $
            scr_xsize = geom.xsize-2*geom.xpad

    endif

;************************************
; STILL NEED TO HANDLE SIZE DECREASE
;************************************

end



;*********************************************************************
pro awizard::update_sensitivity

    self.anonymizer -> getproperty, value_only = vo

    for i = 0, n_elements(*self.text)-1 do begin

        widget_control, (*self.text)[i], get_uvalue = uval

        if uval.flag lt 2 then begin

            parent = widget_info((*self.text)[i], /parent)
            widget_control, parent, sensitive = 1-vo

        endif

    endfor

    for i = 0, n_elements(*self.remove)-1 do begin

        widget_control, (*self.remove)[i], get_uvalue = uval
        if uval.flag lt 2 then $
            widget_control, (*self.remove)[i], sensitive = 1-vo

    endfor

end



;*********************************************************************
pro awizard::update_values

    self.anonymizer -> getproperty, dynamic_tags = dt, $
                                    static_tags = st

    index = 0

    for i = 0, n_elements(st)-1 do begin

        if st[i].flag gt 0 then begin

            widget_control, (*self.text)[index], set_value = st[i].value
            index++

        endif

    endfor

    index = 0

    if (size(dt, /type) eq 8) then begin

        for i = 0, n_elements(dt)-1 do begin

            if dt[i].flag gt 0 then begin

                wid = widget_info(*self.remove[index], find_by_uname = 'remove')
                widget_control, wid[0], set_value = dt[i].value

            endif

        endfor

    endif

end




;*********************************************************************
pro awizard__define

    void = {awizard, $
            tlb:0l, $
            text:ptr_new(), $
            anonymizer:obj_new(), $
            remove:ptr_new(), $
            pref:obj_new(), $
            static_base:0l, $
            dynamic_base:0l, $
            new_tags:ptr_new(), $
            removed_tags:ptr_new(), $
            no_block:0b, $
            from_application:0b, $
            ysize:0}

end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -