📄 awizard__define.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 + -