Procházet zdrojové kódy

UITree3新框架;

scbc.sat2 před 5 roky
rodič
revize
feb2521728
5 změnil soubory, kde provedl 662 přidání a 0 odebrání
  1. 25 0
      UITree3/Constant.py
  2. 322 0
      UITree3/ExcelParser.py
  3. 144 0
      UITree3/INIConfig.py
  4. 39 0
      UITree3/MenuTree逻辑整理.txt
  5. 132 0
      UITree3/Option.py

+ 25 - 0
UITree3/Constant.py

@@ -0,0 +1,25 @@
+# -*- coding:utf-8 -*-
+import os, sys, time
+
+class TreeConst():
+    G_LEVEL = ['First', 'Second', 'Third', 'Fourth', 'Fifth', 'Sixth', 'Seventh', 'Eighth', 'Ninth', 'Tenth',
+               'Eleventh', 'Twelfth']
+    Parent_Name = u'parent'
+    Parent_ShortKey = u'shortcut_key'
+    Parent_ToParentKey = u'toparent_key'
+    Parent_Layout = u'layout'
+    Option_Name = u'option'
+    Option_ForOCR = u'option_for_ocr'
+    Option_MoveKey = u'move_key'
+    Option_EnterKey = u'enter_key'
+    Option_Others = u'others'
+    Value_Name = u'value_name'
+    Value_Value = u'value'
+    Value_ForOCR = u'value_for_ocr'
+    Value_MoveKey = u'move_key'
+    Value_EnterKey = u'enter_key'
+    Value_Others = u'others'
+    FLevel_Params=[Parent_Name, Parent_ShortKey, Parent_ToParentKey, Parent_Layout, Option_Name, Option_ForOCR, Option_MoveKey, Option_EnterKey, Option_Others]
+    NLevel_Params=[Parent_Name, Parent_ToParentKey, Parent_Layout, Option_Name, Option_ForOCR, Option_MoveKey, Option_EnterKey, Option_Others]
+    VLevel_Params=[Value_Name, Value_Value, Value_ForOCR, Value_MoveKey,Value_EnterKey, Value_Others]
+    DLevel_Params = NLevel_Params

+ 322 - 0
UITree3/ExcelParser.py

@@ -0,0 +1,322 @@
+# -*- coding:utf-8 -*-
+import os, sys, time
+import xlrd
+import xlwt
+import json
+# 字典不排序;
+from collections import OrderedDict
+from xlwt import XFStyle, Pattern
+from UIT_treeConstant import TreeConst
+from UIT_log import info,debug,error
+
+INFO =True
+DEBUG =True
+ERROR = True
+
+class CExcelParser():
+    cls = "CExcelParser"
+    def __init__(self, xls_path=None,UITree=None):
+        self.UITree = UITree
+        if type(xls_path) == str:
+            xls_path = xls_path.decode('utf-8')
+        self.xls_path = xls_path
+
+    def read_excel(self, path=None):
+        if path is not None:
+            # 如果是gbk字符,转utf8
+            if type(path) == str:
+                path = path.decode('utf-8')
+            self.xls_path = path
+
+        # 打开文件;
+        wb = xlrd.open_workbook(filename=self.xls_path)
+        if wb is None:
+            return
+
+        # 获取所有sheet;
+        sheet = None
+        for sh_name in wb.sheet_names():
+            sheet = wb.sheet_by_name(sh_name)
+            self.parse_excel(sheet, False)
+
+        # print "self.valueParams.values:", self.valueParams.values, type(self.valueParams.values)
+        # print "self.pathParams.paths:", self.pathParams.paths, type(self.pathParams.paths)
+
+        # try:
+        #     print json.dumps(self.pathParams.paths)
+        #     print '\r\n'
+        #     print json.dumps(self.valueParams.values)
+        #     print '\r\n'
+        #     # print self.pathParams.paths,'\r\n', self.valueParams.values
+        # except Exception, e:
+        #     print e
+
+    # endfun
+
+    def parse_excel(self, sheet, bpath=True):
+        # 返回由该行中所有单元格的数据组成的列表
+        pKeys = sheet.row_values(0)
+        info(self.cls,"parse_excel","params sheet %s keys: %s"%(sheet.name,str(pKeys)),INFO)
+        # 逐行表;
+        parentName = None
+        if u"Value" == sheet.name:
+            # 逐行遍历(首行除外);
+            for i in range(1, sheet.nrows):
+                rowDict = {}
+                # 获取每行内容;
+                oneRow = tuple(sheet.row_values(i))
+                # 遍历单元格;
+                for index in range(oneRow.__len__()):
+                    item = oneRow[index]
+                    rowDict[pKeys[index]] = item
+                if rowDict[TreeConst.Value_Name] is None or rowDict[TreeConst.Value_Name].__len__() < 1:
+                    if parentName is None:
+                        error(self.cls, "parse_excel", "Level %s error row %s:" % (sheet.name, str(oneRow)), ERROR)
+                        break
+                    else:
+                        rowDict[TreeConst.Value_Name] = parentName
+                        self.UITree.valueParams.addOption(rowDict)
+                elif rowDict[TreeConst.Value_Name].__len__() > 0:
+                    parentName = rowDict[TreeConst.Value_Name]
+                    self.UITree.valueParams.addParent(rowDict)
+        elif "Dialog" == sheet.name:
+            self.parsePath(sheet, pKeys, self.UITree.dialogParams)
+        else:  # 路径;
+            self.parsePath(sheet,pKeys, self.UITree.pathParams)
+
+
+    def parsePath(self, sheet,pKeys, treeParams):
+        parentName = None
+        for i in range(1, sheet.nrows):
+            # 获取每行内容;
+            oneRow = tuple(sheet.row_values(i))
+            rowDict = {}
+            for index in range(oneRow.__len__()):
+                item = oneRow[index]
+                rowDict[pKeys[index]] = item
+            if rowDict[TreeConst.Parent_Name] is None or rowDict[TreeConst.Parent_Name].__len__() < 1:
+                if parentName is None:
+                    error(self.cls, "parse_excel", "Level %s error row %s:" % (sheet.name, str(oneRow)), ERROR)
+                    break
+                else:
+                    rowDict[TreeConst.Parent_Name] = parentName
+                    treeParams.addOption(sheet.name, rowDict)
+            elif rowDict[TreeConst.FLevel_Params[0]].__len__() > 0:
+                parentName = rowDict[TreeConst.Parent_Name]
+                treeParams.addParent(sheet.name, rowDict)
+
+    # endfun
+
+    def saveExcelData(self, checkOptionPathExcelData, repeatOptionList, all_UI_TestLanguagePath):
+
+        # 设置字体
+        font = xlwt.Font()
+        font.bold = True
+
+        # 设置边框
+        borders = xlwt.Borders()
+        borders.left = xlwt.Borders.THIN
+        borders.right = xlwt.Borders.THIN
+        borders.top = xlwt.Borders.THIN
+        borders.bottom = xlwt.Borders.THIN
+
+        # 设置居中
+        alignment = xlwt.Alignment()
+        # alignment.horz = xlwt.Alignment.HORZ_CENTER  # 水平方向
+        alignment.horz = xlwt.Alignment.HORZ_LEFT  # 水平方向
+        alignment.vert = xlwt.Alignment.VERT_TOP  # 垂直方向
+        alignment.wrap = 1
+
+        # 设置背景颜色
+        pattern = xlwt.Pattern()
+        pattern.pattern = xlwt.Pattern.SOLID_PATTERN
+        pattern.pattern_fore_colour = 3  # 背景颜色
+
+        # 定义不同的excel style
+        style1 = xlwt.XFStyle()
+        style1.font = font
+        style1.borders = borders
+        style1.alignment = alignment
+
+        style2 = xlwt.XFStyle()
+        style2.borders = borders
+        style2.alignment = alignment
+
+        style = XFStyle()
+        style.borders = borders
+        style.alignment = alignment
+        pattern = Pattern()
+        pattern.pattern = Pattern.SOLID_PATTERN
+        pattern.pattern_fore_colour = xlwt.Style.colour_map['red']  # 设置单元格背景色为黄色
+        style.pattern = pattern
+
+        # style_align = xlwt.easyxf('align: wrap on')
+
+        if os.path.exists(all_UI_TestLanguagePath):
+            try:
+                os.remove(all_UI_TestLanguagePath)
+            except Exception, e:
+                print e
+                return False
+        # 创建工作簿;
+        book = xlwt.Workbook(encoding='utf-8')
+        # 创建sheet;
+        sheet = book.add_sheet(u'到达Option路径检测', cell_overwrite_ok=True)
+        # 设置表格自适应宽度的数组
+        col_width = [2, 25, 15, 120]
+        # 创建标题行;
+        row0 = [u'序号', u'Option名称', u'检测到达路径结果', u'到达Option路径']
+
+        for i in range(len(row0)):
+            sheet.write(0, i, row0[i], style=style1)
+        index = 1
+
+        for checkdata in checkOptionPathExcelData:
+            sheet.write(index, 0, index, style=style2)
+            for j in range(len(checkdata)):
+                # 如果结果不为Pass则在表格中标红
+                if j == 1 and checkdata[j] != 'Pass':
+                    sheet.write(index, j + 1, checkdata[j], style=style)
+                else:
+                    # if j == 1:
+                    #     sheet.write(index, j + 1, checkdata[j], style=style_align)
+                    # else:
+                    sheet.write(index, j + 1, checkdata[j], style=style2)
+
+                # if col_width[j] < self.len_byte(checkdata[j]):
+                #     col_width[j] = self.len_byte(checkdata[j])
+            index += 1
+        # 设置栏位宽度,栏位宽度小于10时候采用默认宽度
+        for i in range(len(col_width)):
+            if col_width[i] > 10:
+                sheet.col(i).width = 256 * (col_width[i] + 1)
+
+        sheet2 = book.add_sheet(u'Option查重', cell_overwrite_ok=True)
+        # 设置表格自适应宽度的数组
+        col_width2 = [2, 30, 30]
+        # 创建标题行;
+        row02 = [u'序号', u'重复Option名称', u'重复Option在源表格的sheet名称']
+
+        for i in range(len(row02)):
+            sheet2.write(0, i, row02[i], style=style1)
+        index2 = 1
+        for repeatOption in repeatOptionList:
+            sheet2.write(index2, 0, index2, style=style2)
+            for j in range(len(repeatOption)):
+                sheet2.write(index2, j + 1, repeatOption[j], style=style2)
+            index2 += 1
+        # 设置栏位宽度,栏位宽度小于10时候采用默认宽度
+        for i in range(len(col_width2)):
+            if col_width2[i] > 10:
+                sheet2.col(i).width = 256 * (col_width2[i] + 1)
+
+        # 保存xls;
+        try:
+            book.save(all_UI_TestLanguagePath)
+            return True
+        except Exception, e:
+            print e
+            return False
+
+    # 新增表格查询接口
+
+    # # 获取表格Value层级中,value_name下包含的value列表
+    # def getSubValueList(self, value_name):
+    #     valueList = []
+    #     if self.valueParams.values.has_key(value_name):
+    #         # print parser.valueParams.values["source"]
+    #         # print parser.valueParams.values["source"]["value"]
+    #         valueDictList = self.valueParams.values[value_name]["value"]
+    #         for valueDict in valueDictList:
+    #             valueList.append(valueDict["value"])
+    #     # print "valueList:", valueList, type(valueList)
+    #     return valueList
+
+
+if __name__ == "__main__":
+    # path = r'E:\svn\SAT\项目资料\第四期-推广使用和画面检测\06-设计文档\01-蓝图设计\UiTree3.0方案\MenuTree_MS6586_EU.xls'
+    # path = r'E:\SAT\resource\MenuTree\MS3663\DVB-T2 panasonic\MenuTree.xls'
+    # path = r'E:/SAT/resource\MenuTree\MS6586\ATSC\MenuTree.xls'
+    path = r'E:\SAT\resource\MenuTree\MS6586\ATSC\MenuTree_DVBT.xls'
+    # path = r'E:\MenuTree.xls'
+    # path = r'E:\SAT\resource\MenuTree\6586\MS6586_ATSC\MenuTree.xls'
+    # path = getMenuTree3SelectedProjectCfgPath() + '\\MenuTree.xls'
+    parser = CExcelParser(path)
+    parser.read_excel()
+    dataDict = parser.get_parent_ocr_dict("network")
+    print "dataDict:", dataDict, type(dataDict)
+    # parent = "source"
+    # option = "atv"
+    # parser.getOptionTextList(parent, option)
+    # value_name = "source"
+    # value = "atv"
+    # parser.getValueTextList(value_name, value)
+    # SubValueList1 = parser.getSubValueList("source")
+    # SubValueList2 = parser.getSubValueList("backlight")
+    # parent = "picture"
+    # parent = "manual_tuning"
+    # parser.getSubOptionList(parent)
+    # optionList = []
+    # paths = parser.pathParams.paths
+    #
+    # for level in paths:
+    #     if paths[level].has_key(parent):
+    #         optionDictList = paths[level][parent]["value"]
+    #         for optionDict in optionDictList:
+    #             optionList.append(optionDict["option"])
+    # print "optionList:", optionList, type(optionList)
+
+    # print parser.get_value("source", "")
+    # checkOptionPathExcelData = parser.getCheckOptionPathExcelData()
+    # print "checkOptionPathExcelData:", checkOptionPathExcelData
+    # repeatOptionList = parser.getRepeatOptionList()
+    # isSaveExcelTrue = parser.saveExcelData(checkOptionPathExcelData, repeatOptionList,
+    #                                        r'E:\MenuTree_Check_Option_Result.xls')
+    # path = r'E:\SAT\resource\MenuTree\6586\MS6586_ATSC\MenuTree.xls'
+    # path = getMenuTree3SelectedProjectCfgPath() + '\\MenuTree.xls'
+
+    # print "isSaveExcelTrue:", isSaveExcelTrue
+    # valueSheetOptionList = parser.getValueSheetOptionList()
+
+    # repeatValueName_ValueSheet = parser.getRepeatValueName_ValueSheet()
+    # repeatOption_otherSheet = parser.getRepeatOption_otherSheet()
+
+    # optionPath, optionPathResult = parser.checkOptionPath("picture_preset11")
+    # print "optionPath:", optionPath, type(optionPath)
+    # print "optionPathResult:", optionPathResult, type(optionPathResult)
+    # optionPath, optionPathResult = parser.checkOptionPath("instant_power_on")
+    # print "optionPath:", optionPath, type(optionPath)
+    # print "optionPathResult:", optionPathResult, type(optionPathResult)
+
+    # path_params = parser.get_option_paths("picture_preset")
+    # print "path_params:", path_params, type(path_params)
+
+    # print "path_params[0][0]:",path_params[0][0]
+    # print parser.get_option_paths('picture')
+    # print parser.get_option('picture')
+    # print parser.get_value('backlight',10)
+    # print parser.get_parent_ocr_dict('source_hdmi1')
+    # print parser.get_parent_ocr_list('channel')
+    # print parser.get_parent_ocr_dict('channel')
+    # print parser.get_parent_ocr_dict('other_setting')
+    # print parser.get_parent_ocr_list('5khz')
+    # print parser.get_parent_ocr_dict('picture_preset', True)
+    # print parser.get_pair_values('picture_preset', False)
+    # print parser.get_pair_values('source')
+    # print parser.get_ocr_list('Second','picture','picture_preset')
+    # vp, pp = parser.get_menu_paths("auto_volume_control", "off")
+    # print vp
+    # vp, pp = parser.get_menu_paths("picture_preset", "dynamic")
+    # print vp
+    # pp = parser.get_option_paths('picture_preset')
+    # print pp.__len__(), pp[g_level[0]]
+    # print "\r\nvp:", vp, type(vp)
+    # print "\r\npp:", pp, type(pp)
+    # # print json.dumps(pp)
+    # revpp = reversed(pp)
+    # for item in revpp:
+    #     print item, pp[item]
+
+    # print 'value:\r\n'
+    # print vp
+    # # print "revpp:", revpp, type(revpp)

+ 144 - 0
UITree3/INIConfig.py

@@ -0,0 +1,144 @@
+# -*- coding:utf-8 -*-
+import string
+import os
+import sys
+import time
+from configparser import ConfigParser
+import json
+
+# 功能基类,请勿添加外部逻辑功能;
+class CINIConfig():
+    def __init__(self, ini_path):
+        self.path = ini_path
+        self.cfgParser = ConfigParser()
+
+    # 保存修改;
+    def save_config(self):
+        with open(self.path, 'wb') as configfile:
+            self.cfgParser.write(configfile)
+
+    # 字符转字典;
+    def get_dict(self, value):
+        return json.loads(value)
+
+    def get_value_dict(self, section, option):
+        value = self.get_value(section, option)
+        if value is None:
+            return {}
+        return json.loads(value)
+
+    # 获取参数值;默认返回字符串
+    def get_value(self, section, option):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        if self.cfgParser.has_option(section, option):
+            return self.cfgParser.get(section, option)
+        return None
+
+    # 获取参数值;
+    def get_int(self, section, option):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        if self.cfgParser.has_option(section, option):
+            return self.cfgParser.getint(section, option)
+        return None
+
+    # 获取参数值;
+    def get_float(self, section, option):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        if self.cfgParser.has_option(section, option):
+            return self.cfgParser.getfloat(section, option)
+        return None
+
+    # 获取参数值;
+    def get_boolean(self, section, option):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        if self.cfgParser.has_option(section, option):
+            return self.cfgParser.getboolean(section, option)
+        return None
+
+    # 获取键值;
+    def get_options(self, section):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        if self.cfgParser.has_section(section):
+            return self.cfgParser.options(section)
+        return None
+
+    # 获取所有sections;
+    def get_sections(self):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        return self.cfgParser.sections()
+
+    # 获取指定section所有items;
+    def get_items(self, section):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        if self.cfgParser.has_section(section):
+            return self.cfgParser.items(section)
+        return None
+
+    # 添加section;
+    def add_section(self, section):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        if self.cfgParser.has_section(section) is False:
+            self.cfgParser.add_section(section)
+        # 保存修改;
+        self.save_config()
+
+    # 设置值;
+    def set_value(self, section, option, value):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        if self.cfgParser.has_section(section) is False:
+            self.cfgParser.add_section(section)
+        self.cfgParser.set(section, option, value)
+        # 保存修改;
+        self.save_config()
+
+    # 删除指定option;
+    def del_option(self, section, option):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        self.cfgParser.remove_option(section, option)
+        # 保存修改;
+        self.save_config()
+
+    # 删除section;
+    def del_section(self, section):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        self.cfgParser.remove_section(section)
+        # 保存修改;
+        self.save_config()
+
+    # 是否有section存在;
+    def has_section(self, section):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        return self.cfgParser.has_section(section)
+
+    # 某section下是否有option存在;
+    def has_option(self, section, option):
+        # 读取配置文件;
+        self.cfgParser.read(self.path)
+        return self.cfgParser.has_option(section, option)
+
+
+if __name__ == "__main__":
+    # tconfig = TConfig(r'E:\SAT\SAT_API\ssat_sdk\MenuTree3\MenuTree.ini')
+    tconfig = CINIConfig(r'E:\SAT\resource\MenuTree\NT72\DVB_nafrican\MenuTree.ini')
+    # print tconfig.get_options('First')
+    # print tconfig.get_sections()
+    # print tconfig.get_items('First')
+    value = tconfig.get_value('value', 'Setting')
+    print value
+    # print tconfig.get_dict(value)
+    # print tconfig.set_value('First', 'fffff','aaaa')
+    # tconfig.del_option('First','fffff')
+    # tconfig.del_section('Second')
+    # tconfig.set_value('second','setting','{"offset":10, "minPeri":0, "maxPeri":0, "minArea":0, "maxArea":0}')

+ 39 - 0
UITree3/MenuTree逻辑整理.txt

@@ -0,0 +1,39 @@
+一、对外接口层:
+所有接口前缀加"I"
+
+
+二、动作逻辑层:
+Option的所有动作逻辑
+1、调用(顶层)快捷键
+6、调用当前节点返回键
+2、当前节点移动下一节点
+3、当前节点移动上一节点
+4、是否在当前节点
+5、是否在第一节点
+7、获取当前节点名称
+8、获取当前节点配置
+9、获取当前节点xls
+10、
+
+
+三、数据获取层:
+获取指定节点(Option)的节点路径;
+获取指定节点(Option)的配置信息;
+
+
+
+
+四、焦点定位层:
+
+
+
+
+五、文字识别层:
+
+
+
+六、对象类:
+Option的动作类,对应动作逻辑;
+Option的数据类,对应数据获取;
+Option的定位类,对应焦点定位;
+Option的文字类,对应文字识别;

+ 132 - 0
UITree3/Option.py

@@ -0,0 +1,132 @@
+# -*- coding:utf-8 -*-
+
+'''
+注:私有变量和函数,前面加双下划线(不要在后面也加双下划线);
+'''
+
+# 使用inspect模块动态获取当前运行的函数名
+import inspect
+from datetime import datetime
+
+# 日志基类;
+class CBaseLog:
+    def __init__(self):
+        pass
+
+    def __log(self, msg):
+        print msg
+        
+    def debug(self, fun, msg):
+        # 时间/类名:函数/内容
+        logstr = "%s【DEBUG】%s::%s %s"%( datetime.now().strftime('%Y-%m-%d %H:%M:%S'), self.__class__.__name__, fun, msg )
+        self.__log(logstr)
+        
+    def info(self, fun, msg):
+        # 时间/类名:函数/内容
+        logstr = "%s【INFO】%s::%s %s"%( datetime.now().strftime('%Y-%m-%d %H:%M:%S'), self.__class__.__name__, fun, msg )
+        self.__log(logstr)
+    
+    def error(self, fun, msg):
+        # 时间/类名:函数/内容
+        logstr = "%s【ERROR】%s::%s %s"%( datetime.now().strftime('%Y-%m-%d %H:%M:%S'), self.__class__.__name__, fun, msg )
+        self.__log(logstr)
+        
+    def printlog(self, msg):
+        # 时间/类名/内容
+        logstr = "%s【LOG】%s %s"%( datetime.now().strftime('%Y-%m-%d %H:%M:%S'), self.__class__.__name__, msg )
+        self.__log(logstr)
+    
+
+# 外部数据
+class XData(CBaseLog):
+    cls = 'xdata'
+    def __init__(self):
+        # 配置文件路径;
+        self.ConfigPath = ""
+        # Menutree资源目录(包含了Excel文件路径);
+        self.MenuTreeDir = ""
+        # MenuTree低下的xls或xlsx文件集;
+        self.ListExcelPath = []
+
+# Option数据逻辑类;
+class COptionDataLogic(CBaseLog):
+    cls = 'option_datalogic'
+    def __init__(self):
+        # 配置文件对象;
+        self.__config = None
+        # excel文件对象;
+        self.__excel = None
+        # 
+        
+    def __LoadConfig(self):
+        pass
+        
+    def __LoadExcel(self):
+        pass
+
+# Option定位逻辑类;
+class COptionFocusLogic(CBaseLog):
+    def __init__(self):
+        pass
+        
+
+# Option的文字识别逻辑类;
+class COptionOCRLogic(CBaseLog):
+    def __init__(self):
+        pass
+
+# Option的动作逻辑类
+class COptionActionLogic(CBaseLog):
+	# 目标节点名称, 目标节点设置值
+	def __init__(self, tagOptionName, tagOptionSetValue):
+		# 私有变量:节点位置,默认根结点(0)
+		self.__pos = 0
+		# 节点路径;
+		self.__paths = None
+		# 加载节点数据;
+		self.__LoadOptionData()
+		
+	def __LoadOptionData(self):
+		pass
+		
+	# 是否在第一节点(根结点)
+	def IsOnFirstOption(self):
+		pass
+		
+	# 调用根节点快捷键(中间节点不需要快捷键;);
+	def CallFirstOptionShortCutKey(self):
+		pass
+		
+	# 调用当前结点的toparent_key;
+	def CallCurOptionBackKey(self):
+		pass
+		
+	# 是否聚集到当前(self.__pos)节点;
+	def IsOnCurOption(self):
+		pass
+	
+	# 从当前节点开始向后移动;
+	def Move2NextOption(self):
+		pass
+		
+	# 从当前节点开始向前返回;
+	def Move2PrevOption(self):
+		pass
+	
+	# 获取当前Option名称;
+	def GetCurOptionName(self):
+		pass
+	
+	# 获取当前Option配置;	
+	def GetCurOptoinConfig(self):
+		pass
+		
+	# 获取当前Option表信息;
+	def GetCurOptionExcelInfo(self):
+		pass
+	
+	
+if __name__ == "__main__":
+    pass
+	
+