DAVE的IDL教程(二)

DAVE的IDL教程(二)

面向对象编程

DATA__DEFINE.PRO

  • data__define
  • data::display
  • data::getProperty
  • data::cleanup
  • data::init

语法高亮在处理$时存在问题,有些代码行被砍掉了,只好放弃语法高亮



; DATA__DEFINE.PRO
;
; DATA object class.
;
; Written by R.M. Dimeo (12/03/02)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro data::cleanup
ptr_free,self.dataPtr
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro data::getProperty,  nchan = nchan,  $
                        ngroups = ngroups

if arg_present(nchan) then nchan = self.nchan
if arg_present(ngroups) then ngroups = self.ngroups
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro data::display,colorTable = colorTable
if n_elements(colorTable) ne 0 then self.colorTable = colorTable
loadct,self.colorTable,/silent
xsize = 400 & ysize = 400
if self.winId eq (-1L) then begin
  window,/free,xsize = xsize,ysize = ysize
  self.winId = !d.window
endif else begin
  wset,self.winId
endelse
tv,smooth(congrid(bytscl(*self.dataPtr),xsize,ysize),10)
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro data::changeCT,colorTable
self->display,colorTable = colorTable
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function data::init,data
device,decomposed = 0
loadct,0,/silent
dsize = size(data)
self.nchan = dsize[1]
self.ngroups = dsize[2]
self.dataPtr = ptr_new(data,/no_copy)
self.colorTable = 0
self.winId = -1L
return,1
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro data__define
define = {  data,       $
            nchan:0,    $
            ngroups:0,  $
            winId:0L,   $
            colorTable:0,   $
            dataPtr:ptr_new()   $
         }
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

d1 = hanning(40,20) & d2 = dist(60,60)
o1 = obj_new('data',d1)
help,/heap,/brief
Heap Variables:
    # Pointer: 1
    # Object : 1
    # Bytes Heap Memory:  3216
!MAGIC.embed = 1
o1 -> display,colorTable=5
output_5_0.png
o2 = obj_new('data',d2)
o2 -> display,colortable = 1
output_6_0.png
o1 -> getProperty, nchan = nchan, ngroups = ngroups
print,nchan,ngroups
      40      20

help,/heap,/brief
Heap Variables:
    # Pointer: 2
    # Object : 2
    # Bytes Heap Memory:  17632

抹除两个对象

obj_destroy,[o1,o2]
help,/heap,/brief
Heap Variables:
    # Pointer: 0
    # Object : 0
    # Bytes Heap Memory:  0

一个类对象,至少应包括两部分:

  1. 自定义pro
  2. 初始化函数
function data::init,data
device,decomposed = 0
loadct,0,/silent
dsize = size(data)
self.nchan = dsize[1]
self.ngroups = dsize[2]
self.dataPtr = ptr_new(data,/no_copy)
self.colorTable = 0
self.winId = -1L
return,1
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro data__define
define = { data,       $
        nchan:0,    $
        ngroups:0,  $
        winId:0L,   $
        colorTable:0,   $
        dataPtr:ptr_new()   $
     }

end


其中自定义pro为named struct,其中的元素(field)都可以用self引用   
init函数初始化对象的参数,成功返回1,否则返回0   
init和cleanup方法都成为lifecycle methods

## 继承(inheritance)
    * base class    
    * derived class
例子:
>* SHAPE__DEFINE.PRO
* CIRCLE__DEFINE.PRO
* SQUARE__DEFINE.PRO

base class为`SHAPE__DEFINE.PRO`
>```
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro shape::cleanup
ptr_free,self.xPtr, self.yPtr
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function shape::init
self.xPtr = ptr_new(/allocate_heap)
self.yPtr = ptr_new(/allocate_heap)
return,1
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro shape__define
define = { shape, $
    xPtr:ptr_new(), $
    yPtr:ptr_new() $
}
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

derived class为CIRCLE__DEFINE.PRO

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function circle::getArea
return,!pi*self.radius^2
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function circle::draw
plots,*self.xPtr,*self.yPtr,/device
return,1
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function circle::init,xc = xc,yc = yc, radius = radius
retVal =self -> shape::init()
if retVal ne 1 then return,retVal
if n_elements(xc) eq 0 then xc = 100.0
if n_elements(yc) eq 0 then yc = 100.0
if n_elements(radius) eq 0 then radius = 100.0
self.xc = xc
self.yc = yc
self.radius = radius
nth = 100
th = (2.0*!pi/(nth-1.))*findgen(nth)
*self.xPtr = xc + radius*cos(th)
*self.yPtr = yc + radius*sin(th)
return,1
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro circle__define
define = { circle, inherits SHAPE, $
        radius:0.0, $
        xc:0.0, $
        yc:0.0  }

end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



​```idl
.compile -v 'C:\Users\luowei\Documents\dave_course_codes\intro_to_idl2_programs\programs\objects\shape__define.pro'
.compile -v 'C:\Users\luowei\Documents\dave_course_codes\intro_to_idl2_programs\programs\objects\circle__define.pro'
ocircle = obj_new('circle')
print,obj_class(ocircle)
CIRCLE

print,obj_class(ocircle,/superclass)
SHAPE

!MAGIC.embed = 1
ocircle -> draw()
       1

print,ocircle->getArea()
      31415.9

obj_destroy,ocircle

图形界面类对象

OBWID__DEFINE.PRO

.compile -v 'C:\Users\luowei\Documents\dave_course_codes\intro_to_idl2_programs\programs\objects\obwid__define.pro'
o = obj_new('obwid')

idldave2_1.png

不点按钮,直接用函数来触发:

o -> genRand

idldave2_2.png

o -> quit

检查是否所有指针和对象都销毁:

help,/heap,/brief
Heap Variables:
    # Pointer: 0
    # Object : 0
    # Bytes Heap Memory:  0

上源代码:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro obWid::quit
widget_control,self.tlb,/destroy
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro obWid::genRand
rnd = randomn(s,1)
strout = strtrim(string(rnd),2)
widget_control,self.text,set_value = strout
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro obWidCleanup,tlb
widget_control,tlb,get_uvalue = self
obj_destroy,self
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro obWidEvents,event
widget_control,event.id,get_uvalue = cmd
call_method,cmd.method,cmd.object
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function obWid::init
; Create the widgets
self.tlb = widget_base(/col,title = 'First Object Widget')
self.text = widget_text(self.tlb,value = '',xsize = 50)
void = widget_button(self.tlb,value = 'Generate RND', $
uvalue = {object:self,method:'genRand'})
void = widget_button(self.tlb,value = 'QUIT', $
uvalue = {object:self,method:'quit'})
widget_control,self.tlb,/realize
widget_control,self.tlb,set_uvalue = self
xmanager,'obWid',self.tlb,event_handler = 'obWidEvents', $
/no_block,cleanup = 'obWidCleanup'
return,1
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro obWid__define
define = { obWid, $
tlb:0L, $
text:0L $
}
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

!!in an object widget
program, a method cannot be called as an event handler

### A more complicated widget object with a command line interface

>COINTOSS__DEFINE.PRO


​```idl
.compile -v 'C:\Users\luowei\Documents\dave_course_codes\intro_to_idl2_programs\programs\objects\cointoss__define.pro'

coin_example


idldave2_3.png


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容