📄 retrievecommon_456.pro
字号:
;
;
;
;非自动生成功能部分,后添加功能
;
;
;
;
;----------------------------------
;和界面相关的控件设置函数及表格的相关操作
;-----------------------
;得到控件的Geometry
pro GetComponentGeometry_456, inTopBaseID, inTableName, otGeometry
iComponent = WIDGET_INFO(inTopBaseID, FIND_BY_UNAME = inTableName);获取控件的ID号
otGeometry = WIDGET_INFO(iComponent, /GEOMETRY);获取控件的Geometry
end
;-----------------------
;清除Table中内容
pro ClearTable_456, inTopBaseID, inTableName
idTable = WIDGET_INFO(inTopBaseID, FIND_BY_UNAME = inTableName) & IF idTable EQ 0 THEN RETURN
;将表格两列的值都设为None
WIDGET_CONTROL, idTable, Set_Value = [['-None-'],['-None-']], TABLE_YSIZE = 0
;将表格设置为只有一行,Set_UValue对应的是pUValueTable,pUValueTable将返回Set_UValue当中的值,即行数
WIDGET_CONTROL, idTable, Set_UValue = {RowCount:0}
end
;-----------------------
;设置单选框状态
pro SetRatioStatus_456, inTopLevelBase, inRatioName, inStatus
;获取RatioButton的ID
idRatio = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inRatioName) & IF idRatio EQ 0 THEN RETURN
;如果inStatus的状态值为1则设置RatioStatus为选中状态
IF inStatus EQ 1 THEN WIDGET_CONTROL, idRatio, /SET_BUTTON
;否则设置其为未选中状态
IF inStatus EQ 0 THEN WIDGET_CONTROL, idRatio, SET_BUTTON = 0
end
;-----------------------
;得到单选框状态
pro GetRatioStatus_456, inTopLevelBase, inRatioName, otStatus
idRatio = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inRatioName) & IF idRatio EQ 0 THEN RETURN
otStatus = WIDGET_INFO(idRatio, /BUTTON_SET)
end
;-----------------------
;设置控件为可用还是不可用状态(0不可用状态,1可用状态)
;如果inTLB,则inComponent是在TLB中的ID,如果不是inTLB,则inComponent是控件名称
pro SetComponentSensitive_456, inTopLevelBase, inComponent, inStatus, inTLB = inTLB
IF N_ELEMENTS(inTLB) NE 0 THEN BEGIN
WIDGET_CONTROL, inComponent, SENSITIVE = inStatus
ENDIF ELSE BEGIN
idComponent = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inComponent) & IF idComponent EQ 0 THEN RETURN
WIDGET_CONTROL, idComponent, SENSITIVE = inStatus
ENDELSE
end
;-----------------------
;设置复选框状态
pro SetCheckBoxStatus_456, inTopLevelBase, inCheckBoxName, inStatus
idCheck = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inCheckBoxName) & IF idCheck EQ 0 THEN RETURN
IF inStatus EQ 1 THEN WIDGET_CONTROL, idCheck, /SET_BUTTON
IF inStatus EQ 0 THEN WIDGET_CONTROL, idCheck, SET_BUTTON = 0
end
;-----------------------
;打开HDF文件,并返回文件的路径
pro SelectHdfPathFromDialog_456, otFiles, otPath
COMPILE_OPT IDL2
filters = [['*.hdf'], ['科学数据集格式(*.hdf)']]
;返回文件名及文件路径,可以同时选中多个文件
otFiles = DIALOG_PICKFILE(/READ, /MULTIPLE_FILES, /MUST_EXIST, FILTER = filters, GET_PATH = otPath)
end
;-----------------------
;把数据添加到Table中
pro AddArrayToTable_456, inTopBaseID, inTableName, inArray, inAppend = inAppend
IF (N_ELEMENTS(inArray))[0] EQ 0 THEN RETURN
idTable = WIDGET_INFO(inTopBaseID, FIND_BY_UNAME = inTableName) & IF idTable EQ 0 THEN RETURN
WIDGET_CONTROL, idTable, Get_UValue = pUValueTable;返回表格的行数,Set_UValue在ClearTable当中已设置
IF (pUValueTable.RowCount NE 0) && (N_ELEMENTS(inAppend) NE 0) THEN BEGIN
WIDGET_CONTROL, idTable, Get_Value = pValueTable ;对应Set_Value,Set_Value在ClearTable当中已设置,即返回表格当中的内容
pValueTable = [pValueTable, inArray];如果不为空表,则将原先的文件和后面打开添加进去的文件合并,再用于重新填一次表
ENDIF ELSE pValueTable = inArray;如果行数等于0即还未添加打开文件,即表格还为空表,直接打开HDF文件填入表格即可
iTotalCount = (SIZE(pValueTable, /DIMENSIONS))[0];计算总共有几行
WIDGET_CONTROL, idTable, Set_Value = pValueTable, TABLE_YSIZE = iTotalCount;填表
WIDGET_CONTROL, idTable, Set_UValue = {RowCount:iTotalCount};根据iTotalCount来设置总共的行数
end
;-----------------------
;从Table中删除选中的内容
pro RemoveSelectedRowsFromTable_456, inTopBaseID, inTableName
;获取表格的ID
idTable = WIDGET_INFO(inTopBaseID, FIND_BY_UNAME = inTableName) & IF idTable EQ 0 THEN RETURN
WIDGET_CONTROL, idTable, Get_UValue = pUVale & IF pUVale.RowCount EQ 0 THEN RETURN;获取表格当中的内容,如果表格为0行则返回 ,为0行即没有可删除的行
arrEvnelope = WIDGET_INFO(idTable, /TABLE_SELECT);将表格当中选中的暂时存放到变量arrEvnelope当中去,table_select通过选中的单元格其左、上、右、下来定义选中单元的位置
iRowMin = arrEvnelope[1] & iRowMax = arrEvnelope[3] & IF iRowMin EQ -1 THEN RETURN
;用iRowMin,iRowMin来定义选中哪些行;不能同时选中不相邻的行,只能同时选中相邻的行
;get remained index
GetArrayFromTable_456, inTopBaseID, inTableName, otArray
;返回表格的行数
iRowCount = (SIZE(otArray, /DIMENSIONS))[0] & IF iRowCount EQ 0 THEN RETURN;size函数的返回值为:2,3,3,7,9/2表示数组为2维;3行3列;数据类型是7即字符串string类型,9个元素
iIndex = LonArr(iRowCount);根据表格的行数创建一个跟表格的行数一样的数组
iIndex[iRowMin : iRowMax] = 1 ;将选中的那行对应的数组元素其值置为1,为选中的默认为0
iIndex = Where(iIndex EQ 0, count);计算未选中的行数,并返回其所在数组的下标
IF count EQ 0 THEN BEGIN;如果表格当中的数据全部被选中删除的话
ClearTable_456, inTopBaseID, inTableName;则将表格置为空
ENDIF ELSE BEGIN
otArray = otArray[iIndex, *];将剩下的文件对重新存放到数组当中
AddArrayToTable_456, inTopBaseID, inTableName, otArray;将剩下的文件对重新填一次表格
ENDELSE
end
;-----------------------
;从Table中得到数组,即将文件对以数组的形式返回
pro GetArrayFromTable_456, inTopBaseID, inTableName, otArray
idTable = WIDGET_INFO(inTopBaseID, FIND_BY_UNAME = inTableName) & IF idTable EQ 0 THEN RETURN
WIDGET_CONTROL, idTable, Get_Value = otArray
end
;-----------------------
;;从Table中删除配对结果为无效的数据
pro RemoveBadRowsFromTable_456, inTopBaseID, inTableName
GetArrayFromTable_456, inTopBaseID, inTableName, otArray
RemoveBadRowsFromArray_456, otArray, otGoodCount ;从表格当中移除配对为无效的行,返回配对为有效的行数
IF otGoodCount EQ 0 THEN BEGIN
ClearTable_456, inTopBaseID, inTableName ;如果无配对结果为有效的文件对,则直接将表格置为空
ENDIF ELSE BEGIN
AddArrayToTable_456, inTopBaseID, inTableName, otArray ; 重新加载一次表格,只填入配对结果为有效的文件对
ENDELSE
end
;-----------------------
;移除无效匹配数据
pro RemoveBadRowsFromArray_456, inOtArray, otGoodCount
goodIndex = Where(StrMatch(inOtArray[*, 1], '*有效*', /FOLD_CASE) EQ 1, otGoodCount);返回打开文件表格中其匹配状态为有效的行的ID
IF otGoodCount NE 0 THEN BEGIN
inOtArray = inOtArray(goodIndex, *);重新创建一个数组,用于保存文件匹配状态为有效的文件对,goodIndex行和所有列
ENDIF ELSE BEGIN
FreeVariable_457, inOtArray;如果无配对结果为有效的文件对,则直接释放表格当中的全部数据
ENDELSE
end
;-----------------------
;打开保存文件对话框
pro SelectDirectoryFromDialog_456, otDirectory, inTitle = inTitle
otDirectory = DIALOG_PICKFILE(/READ, /MUST_EXIST, /DIRECTORY, TITLE = inTitle);选择保存目录
end
;-----------------------
;返回选择的保存路径
pro SetTextCaption_456, inTopLevelBase, inTextName, inTextCaption
idText = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inTextName) & IF idText EQ 0 THEN RETURN
WIDGET_CONTROL, idText, SET_VALUE = inTextCaption ;设置保存路径Text里的内容,即选中的保存路径
end
;-----------------------
;得到Text的caption
pro GetTextCaption_456, inTopLevelBase, inTextName, otTextCaption
;返回Text控件的ID
idText = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inTextName) & IF idText EQ 0 THEN RETURN
WIDGET_CONTROL, idText, GET_VALUE = otTextCaption;返回Text当中的内容
end
;-----------------------
;得到复选框状态
pro GetCheckBoxStatus_456, inTopLevelBase, inCheckBoxName, otStatus
idCheck = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inCheckBoxName) & IF idCheck EQ 0 THEN RETURN
otStatus = WIDGET_INFO(idCheck, /BUTTON_SET)
end
;----------------------------------
;设置窗口的位置
PRO SetTLBPosition_400, inSetedBaseId, inCenterOwner = inCenterOwner, inCenterWindow = inCenterWindow
IF N_ELEMENTS(inCenterOwner) NE 0 THEN BEGIN;如果前一级窗体存在的话
ownerGeometry = WIDGET_INFO(inCenterOwner, /GEOMETRY);则获取前一级窗体的Geometry信息
xSize = ownerGeometry.SCR_XSIZE & ySize = ownerGeometry.SCR_YSIZE;获取前一级窗体的大小
xOff = ownerGeometry.XOFFSET & yOff = ownerGeometry.YOFFSET;获取前一级窗体的位置
ENDIF ELSE IF N_ELEMENTS(inCenterWindow) NE 0 THEN BEGIN;如果前一级窗体不存在的话,则获取系统桌面的大小和原点位置
dimensions = GET_SCREEN_SIZE()
xSize = dimensions[0] & ySize = dimensions[1] & xOff = 0 & yOff = 0
ENDIF
;获取正要显示的窗体的Geometry信息
setedGeometry = WIDGET_INFO(inSetedBaseId, /GEOMETRY);获取正要显示的窗体的Geometry信息,其中参数inSetedBaseId为正要显示的窗体
xMeSize = setedGeometry.SCR_XSIZE & yMeSize = setedGeometry.SCR_YSIZE;获取窗体的大小
;set seted size
;设置正要显示的窗体的显示位置,在前一级窗体或者系统界面的中间
xMeOff = Long(xOff + (xSize - xMesize) / 2)
yMeOff = Long(yOff + (ySize - yMesize) / 2)
IF (xMeOff LE 0) OR (yMeOff LE 0) THEN BEGIN
SetTLBPosition_400, inSetedBaseId, /inCenterWindow & RETURN
ENDIF
WIDGET_CONTROL, inSetedBaseId, XOFFSET = xMeOff, YOFFSET = yMeOff ;在设置好的位置显示窗体
END
;----------------------------------
;判断是否是MODIS02的文件
PRO MatchMOD02Files_803, inTopBaseID, inFiles ,inFilepath, inOldFiles
iFileCount = N_ELEMENTS(inFiles) & IF iFileCount EQ 0 THEN RETURN ;如果还未打开文件则返回
clmMODIS02Files=STRARR(iFileCount)
clmStatus=STRARR(iFileCount)
jj=0
for ii = 0 , iFileCount - 1 do begin
;方法1、判断每个数据是不是modis数据,这个判断是从文件里面的sd来判断的速度比较慢
; FileIsMOD021KM_322, inFiles[ii], ot1KMFlag
; FileIsMOD02HKM_322, inFiles[ii], otHKMFlag
; FileIsMOD02QKM_322, inFiles[ii], otQKMFlag
; if ot1KMFlag eq 1 then begin
;方法2、从文件名来判断,速度快,但文件命名规则要以MOD开头,有一定局限性
;HDFName = StrMid( inFiles[ii], strlen(inFilepath[0]), 8) ;因为inFiles包括文件的存储路径,所以要取MODIS021KM的文件名要先从inFiles当中取出文件存储路径的头几位,然后取8位,即为MODIS021KM的文件名称
HDFName = StrMid( inFiles[ii], strlen(inFilepath[0]), 5) ;因为inFiles包括文件的存储路径,所以要取MODIS02的文件名要先从inFiles当中取出文件存储路径的头几位,然后取5位,即可知道该文件是否为MODIS02的文件
;if strcmp(HDFName,'MOD021KM') eq 1 then begin ;保留,用于只需输入文件为MODIS021KM的文件时使用
if strcmp(HDFName,'MOD02') eq 1 then begin
clmMODIS02Files[jj]=inFiles[ii]
clmStatus[jj]='有效'
jj=jj+1 ;jj为有效的行数
endif else begin
clmMODIS02Files[jj]=inFiles[ii]
clmStatus[jj]='无效'
jj=jj+1 ;jj为行数
endelse
endfor
;把原来表格中有的数据保留,并把新的数据添加进去
iFileIndex = Where(clmMODIS02Files NE '-None-', fileCount);判断选中的MODIS02文件的个数
IF fileCount NE 0 THEN BEGIN ;如果文件个数不为0
IF inOldFiles[0, 0] NE '-None-' THEN BEGIN ;判断原来表格当中文件是否为空,如果不为空则继续在表格当中添加文件
strMODISFiles = [inOldFiles[*, 0], clmMODIS02Files[iFileIndex]];将新选中的文件跟原来表格中的文件合并,并重新输出
strStatus = [inOldFiles[*, 1], clmStatus[iFileIndex]] ;将状态合并并重新输出
ENDIF ELSE Begin ;如果原来表格为空,则直接输出选中的文件
strMODISFiles = clmMODIS02Files[iFileIndex]
strStatus = clmStatus[iFileIndex]
ENDELSE
ENDIF ELSE Begin ;如果没有新选中的文件,则输出原来表格中的内容
strMODISFiles = inOldFiles[*, 0]
strStatus = inOldFiles[*, 1]
ENDELSE
;把文件加载到Table中
AddArrayToTable_456, inTopBaseID, 'WID_TABLE_InputFiles', [[strMODISFiles], [strStatus]]
END
;--------------------
;释放变量
pro FreeVariable_457, inVar
IF N_ELEMENTS(inVar) EQ 0 THEN RETURN
tempVar = Temporary(inVar);保存变量inVar到tempVar当中,并释放变量inVar
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -