OptionExcel.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. # -*- coding:utf-8 -*-
  2. import os, json
  3. from collections import OrderedDict
  4. from UIT_PathManage import UITPathManage
  5. from TExcelParser import CExcelParser
  6. from ssat_sdk.utils.string_util import strToList
  7. from xlsConst import xlsConst as xlsc
  8. from BaseLog import CBaseLog
  9. from ExtraData import CExtraData
  10. def parseMoveKey(keyStr):
  11. return strToList(keyStr, ";")
  12. g_level = ['First', 'Second', 'Third', 'Fourth', 'Fifth', 'Sixth',
  13. 'Seventh', 'Eighth', 'Ninth', 'Tenth', 'Eleventh', 'Twelfth']
  14. class CPathParams(CBaseLog):
  15. def __init__(self):
  16. self.paths = OrderedDict()
  17. def addParent(self, level, pDict):
  18. if level not in self.paths:
  19. self.paths[level] = {}
  20. # endif
  21. pDict["value"] = []
  22. pDict[xlsc.move_key] = parseMoveKey(pDict[xlsc.move_key])
  23. if pDict[xlsc.parent] in self.paths:
  24. self.error("Parent %s conflict." % (pDict[xlsc.parent]))
  25. self.paths[level][pDict[xlsc.parent]] = pDict
  26. def addOption(self, level, pDict):
  27. if level in self.paths:
  28. if pDict[xlsc.parent] in self.paths[level]:
  29. if pDict[xlsc.option].__len__() > 0:
  30. self.paths[level][pDict[xlsc.parent]]["value"].append(pDict)
  31. else:
  32. self.error("Parent %s not exist." % (pDict[xlsc.parent]))
  33. else:
  34. self.error("Level %s not exist." % (level))
  35. class CValueParams(CBaseLog):
  36. def __init__(self):
  37. self.values = OrderedDict()
  38. def addParent(self, pDict):
  39. if pDict[xlsc.value_name] in self.values:
  40. self.error("Parent %s conflict." % (pDict[xlsc.value_name]))
  41. pDict["value"] = []
  42. pDict[xlsc.move_key] = parseMoveKey(pDict[xlsc.move_key])
  43. self.values[pDict[xlsc.value_name]] = pDict
  44. def addOption(self, pDict):
  45. if pDict[xlsc.value_name] in self.values:
  46. if pDict[xlsc.value].__len__() > 0:
  47. self.values[pDict[xlsc.value_name]]["value"].append(pDict)
  48. else:
  49. self.error("Parent %s not exist." % (pDict[xlsc.value_name]))
  50. class CDialogParams(CBaseLog):
  51. def __init__(self):
  52. self.dialogs = OrderedDict()
  53. def addParent(self, level, pDict):
  54. # endif
  55. if pDict[xlsc.parent] in self.dialogs:
  56. self.error("Parent %s conflict." % (pDict[xlsc.parent]))
  57. pDict["value"] = []
  58. pDict[xlsc.move_key] = parseMoveKey(pDict[xlsc.move_key])
  59. self.dialogs[pDict[xlsc.parent]] = pDict
  60. def addOption(self, level, pDict):
  61. if pDict[xlsc.parent] in self.dialogs:
  62. if pDict[xlsc.option].__len__() > 0:
  63. self.dialogs[pDict[xlsc.parent]]["value"].append(pDict)
  64. else:
  65. self.error("Parent %s not exist." % pDict[xlsc.parent])
  66. # 注意:所有不对外暴露的变量和函数需要私有化,以明确哪些接口和参数是对外的。
  67. # 这样便于后期维护时,根据对外的变量和函数来做处理。
  68. class COptionExcel(CBaseLog):
  69. def __init__(self, exData):
  70. self.__excelParse = CExcelParser(self)
  71. self.__exData = exData
  72. self.__pathParams = CPathParams()
  73. self.__valueParams = CValueParams()
  74. self.__dialogParams = CDialogParams()
  75. # 加载excel;
  76. self.loadExcel()
  77. @property
  78. def pathParams(self):
  79. return self.__pathParams
  80. @property
  81. def valueParams(self):
  82. return self.__valueParams
  83. @property
  84. def dialogParams(self):
  85. return self.__dialogParams
  86. # 加载已知表格;
  87. def loadExcel(self):
  88. self.info(u"加载excel表")
  89. if self.__exData.listExcelPath.__len__() == 0:
  90. self.error(u"没有任何excel表格可加载")
  91. for xls in self.__exData.listExcelPath:
  92. self.info(u"当前加载:%s" % xls)
  93. self.__excelParse.read_excel(xls)
  94. # 加载其他表格;
  95. def addExcel(self, xlsPath):
  96. self.__excelParse.read_excel(xlsPath)
  97. '''
  98. 函数:获取指定option下的所有子项名称(option作为parent,获取该父项下的所有option字段)
  99. 参数:optionName 作为parent的option;
  100. 返回:该option作为父节点的所有子option名称数组;
  101. 示例:['picture_preset', 'brightness', 'backlight']
  102. 测试:通过。 对应UIT_tree.py中的getSubOptionList。
  103. '''
  104. def getOptionAllChildItemName(self, optionName):
  105. optionList = []
  106. paths = self.__pathParams.paths
  107. for level in paths:
  108. if optionName in paths[level]:
  109. optionDictList = paths[level][optionName]["value"]
  110. for optionDict in optionDictList:
  111. optionList.append(optionDict["option"])
  112. return optionList
  113. '''
  114. 函数:获取指定option/value_name下的所有子项(option/value)的ocr值, 1d表示One-dimensional(一维数组);
  115. 参数:
  116. optionName 指定的option节点(也可以是value name);
  117. isOption 是否为路径节点,True路径节点,False为value表的value name节点;
  118. 返回:数组
  119. 示例:
  120. [
  121. ['suboption1 ocr', 'ocr2', 'ocr3'],
  122. ['suboption2 ocr'],
  123. ['suboption3 orc']
  124. ]
  125. 测试:通过。UIT_tree中的x
  126. '''
  127. def getOptionAllChildItemTextList1d(self, optionName, isOption=True):
  128. if type(optionName) == str:
  129. optionName = unicode(optionName)
  130. list_ocr = []
  131. # 路径表或值表;
  132. if isOption is True:
  133. found = False
  134. for lev in self.__pathParams.paths:
  135. for parent in self.__pathParams.paths[lev]:
  136. if parent.lower() == optionName.lower():
  137. found = True
  138. for item in self.__pathParams.paths[lev][optionName]["value"]:
  139. list_ocr.extend(item['option_for_ocr'].split(';'))
  140. break
  141. # endif
  142. # endfor
  143. if found is True:
  144. break
  145. # endfor
  146. else:
  147. if optionName in self.__valueParams.values:
  148. self.info(u"找到%s的value表数据" % optionName)
  149. for item in self.__valueParams.values[optionName]["value"]:
  150. list_ocr.extend(item['value_for_ocr'].split(';'))
  151. else:
  152. self.error(u"没有找到%s的value表数据" % optionName)
  153. # endif
  154. return list_ocr
  155. '''
  156. 函数:获取指定option/value_name下的所有子项(option/value)的ocr值,2d表示Two-dimensional(二维数组);
  157. 参数:
  158. optionName 指定的option节点(也可以是value name);
  159. isOption 是否为路径节点,True路径节点,False为value表的value name节点;
  160. 返回:字典
  161. 示例:
  162. [
  163. ['suboption1 ocr', 'ocr2', 'ocr3'],
  164. ['suboption2 ocr'],
  165. ['suboption3 orc']
  166. ]
  167. 测试:通过。对应UIT_tree中的get_ocr_list
  168. '''
  169. def getOptionAllChildItemTextList2d(self, optionName, isOption=True):
  170. if type(optionName) == str:
  171. optionName = unicode(optionName)
  172. list_ocr = []
  173. # 路径表或值表;
  174. if isOption is True:
  175. found = False
  176. for lev in self.__pathParams.paths:
  177. for parent in self.__pathParams.paths[lev]:
  178. if parent.lower() == optionName.lower():
  179. found = True
  180. for item in self.__pathParams.paths[lev][optionName]["value"]:
  181. list_ocr.append(item['option_for_ocr'].split(';'))
  182. break
  183. # endif
  184. # endfor
  185. if found is True:
  186. break
  187. # endfor
  188. else:
  189. if optionName in self.__valueParams.values:
  190. self.info(u"找到%s的value表数据" % optionName)
  191. for item in self.__valueParams.values[optionName]["value"]:
  192. list_ocr.append(item['value_for_ocr'].split(';'))
  193. else:
  194. self.error(u"没有找到%s的value表数据" % optionName)
  195. # endif
  196. return list_ocr
  197. '''
  198. 函数:获取指定option/value_name下的所有子项(option/value)的ocr键对值;
  199. 参数:
  200. optionName 指定的option节点(也可以是value name);
  201. isOption 是否为路径节点,True路径节点,False为value表的value name节点;
  202. 返回:数组
  203. 示例:
  204. optionName = option
  205. isOption = True
  206. 返回:
  207. [
  208. {'childoption1': 'childoption1 for ocr'},
  209. {'childoption2': 'childoption2 for ocr'},
  210. {'childoption3': 'childoption3 for ocr'},
  211. ]
  212. 测试:通过。对应UIT_tree中的get_pair_values
  213. '''
  214. def getOptionAllChildItemMap(self, optionName, isOption=True):
  215. if type(optionName) == str:
  216. optionName = unicode(optionName)
  217. pairs = []
  218. # 路径表或值表;
  219. if isOption is True:
  220. found = False
  221. for lev in self.__pathParams.paths:
  222. for item in self.__pathParams.paths[lev]:
  223. if item.lower() == optionName.lower():
  224. found = True
  225. for item in self.__pathParams.paths[lev][optionName]["value"]:
  226. pairs.append({item['option']: item['option_for_ocr'].split(';')})
  227. break
  228. # endif
  229. # endfor
  230. if found is True:
  231. break
  232. # endfor
  233. else:
  234. if optionName in self.__valueParams.values:
  235. for item in self.__valueParams.values[optionName]["value"]:
  236. pairs.append({item['value']: item['value_for_ocr'].split(';')})
  237. # endif
  238. return pairs
  239. '''
  240. 函数:获取指定option/value_name下的所有兄弟项(相同parent)的ocr键对值;
  241. 参数:
  242. optionName 指定的option节点(也可以是value name);
  243. isOption 是否为路径节点,True路径节点,False为value表的value name节点;
  244. 返回:数组
  245. 示例:
  246. [
  247. {'sibling option1': 'sibling option1 for ocr'},
  248. {'sibling option2': 'sibling option2 for ocr'}
  249. ]
  250. 测试:。
  251. '''
  252. def getOptionAllSiblingItemMap(self, optionName, isOption=True):
  253. pass
  254. '''
  255. 函数:获取指定option/value_name下的所有兄弟项(相同parent)的 ocr:option 字典值;
  256. 参数:
  257. optionName 指定的option节点(也可以是value name);
  258. isOption 是否为路径节点,True路径节点,False为value表的value name节点;
  259. 返回:字典
  260. 示例:
  261. {
  262. 'sibling option1_ocr': 'sibling option1',
  263. 'sibling option2_ocr': 'sibling option2',
  264. 'sibling option3_ocr': 'sibling option3',
  265. }
  266. 测试:通过。对应UIT_tree中的get_parent_ocr_dict
  267. '''
  268. def getOptionAllSiblingItemDict(self, optionName, isOption=True):
  269. # 编码转换;
  270. if type(optionName) == str:
  271. optionName = unicode(optionName)
  272. found = False
  273. dict_ocr = {}
  274. list_ocr = []
  275. if isOption is True:
  276. # 首先,字典不排序,需要倒序;
  277. paths = reversed(self.__pathParams.paths)
  278. for level in paths:
  279. for parent in self.__pathParams.paths[level]:
  280. for vals in self.__pathParams.paths[level][parent]["value"]:
  281. if vals['option'].lower() == optionName.lower():
  282. found = True
  283. break
  284. # endfor
  285. # 找到退出;
  286. if found is True:
  287. break
  288. # endfor
  289. # 找到退出;
  290. if found is True:
  291. break
  292. # 遍历value列表;
  293. if found is True:
  294. for val in self.__pathParams.paths[level][parent]["value"]:
  295. list_ocr = val['option_for_ocr'].split(';')
  296. for ocr in list_ocr:
  297. dict_ocr[ocr.lower()] = val['option']
  298. else:
  299. if optionName in self.__valueParams.values:
  300. for val in self.__valueParams.values[optionName]["value"]:
  301. list_ocr = val['value_for_ocr'].split(';')
  302. for ocr in list_ocr:
  303. dict_ocr[ocr.lower()] = val['value']
  304. print 'unsorted=', dict_ocr
  305. # 按长度排序;
  306. list_ocr = sorted(dict_ocr.keys(), key=lambda key: len(key), reverse=True)
  307. dict_reuslt = OrderedDict()
  308. for ocr in list_ocr:
  309. dict_reuslt[ocr] = dict_ocr[ocr]
  310. # 返回结果;
  311. return dict_reuslt
  312. '''
  313. 函数:获取指定option所有兄弟项(相同parent)的ocr值, 1d表示One-dimensional(一维数组);
  314. 参数:
  315. optionName 指定的option节点(也可以是value name);
  316. isOption 是否为路径节点,True路径节点,False为value表的value name节点;
  317. 返回:数组
  318. 示例:
  319. [
  320. ['option1 ocr', 'ocr2', 'ocr3'],
  321. ['option2 ocr'],
  322. ['option3 orc']
  323. ]
  324. 测试:通过。对应UIT_tree中的get_parent_ocr_list
  325. '''
  326. def getOptionAllSiblingItemTextList1d(self, optionName):
  327. # 编码转换;
  328. if type(optionName) == str:
  329. optionName = unicode(optionName)
  330. found = False
  331. list_ocr = []
  332. # 首先,字典不排序,需要倒序;
  333. paths = reversed(self.__pathParams.paths)
  334. for level in paths:
  335. for parent in self.__pathParams.paths[level]:
  336. for vals in self.__pathParams.paths[level][parent]["value"]:
  337. if vals['option'].lower() == optionName.lower():
  338. found = True
  339. break
  340. # endfor
  341. # 找到退出;
  342. if found is True:
  343. break
  344. # endfor
  345. # 找到退出;
  346. if found is True:
  347. break
  348. # endfor
  349. # 遍历value列表;
  350. if found is True:
  351. for val in self.__pathParams.paths[level][parent]["value"]:
  352. list_ocr.extend(val['option_for_ocr'].split(';'))
  353. # 按长度排序;
  354. list_ocr.sort(key=lambda i: len(i), reverse=True)
  355. # 返回结果;
  356. return list_ocr
  357. '''
  358. 函数:获取指定option的ocr文本描述,以list返回
  359. 参数:optionName 要返回文本描述的option节点
  360. 返回:数据
  361. 示例:optionName = 'picture_reset'时,返回['picture reset', 'plcture reset']
  362. 测试:通过。对应UIT_tree.py中的getOptionTextList、get_option_ocr(这两个函数返回值一样,参数不一样而已)。
  363. '''
  364. def getOptionText(self, optionName):
  365. # 编码转换;
  366. if type(optionName) == str:
  367. optionName = unicode(optionName)
  368. found = False
  369. list_ocr = []
  370. # 首先,字典不排序,需要倒序;
  371. paths = reversed(self.__pathParams.paths)
  372. for level in paths:
  373. for parent in self.__pathParams.paths[level]:
  374. for vals in self.__pathParams.paths[level][parent]["value"]:
  375. if vals['option'].lower() == optionName.lower():
  376. list_ocr = vals['option_for_ocr'].split(';')
  377. found = True
  378. break
  379. # endfor
  380. # 找到退出;
  381. if found is True:
  382. break
  383. # endfor
  384. # 找到退出;
  385. if found is True:
  386. break
  387. # endfor
  388. # 返回结果;
  389. return list_ocr
  390. '''
  391. 函数:获取指定option的value表详细数据,如果参数value未指定具体值则获取全部valueName的详细数据;
  392. 参数:
  393. optionName 指定的value表中的option(即value name)名称
  394. value 要获取的值名称,如果空则获取全部值
  395. 返回:自定义的字典
  396. 示例:
  397. {
  398. "option":"option名称",
  399. "values":[option在value表中的所有value字段],
  400. "value_for_ocr":[option在value表中所有value_for_ocr字段],
  401. "enter_key":"",
  402. "move_key":"",
  403. "others":"",
  404. }
  405. 测试:通过。对应UIT_tree中的get_value
  406. '''
  407. def getOptionValueInfo(self, optionName, value=""):
  408. # 编码转换;
  409. if type(optionName) == str:
  410. option = unicode(optionName)
  411. # option/value name是否在value表中的;
  412. if optionName not in self.__valueParams.values:
  413. return []
  414. optValues = self.__valueParams.values[option]["value"]
  415. valueList = []
  416. valueOcrList = []
  417. for item in optValues:
  418. valueList.append(item["value"])
  419. valueOcrList.append(item["value_for_ocr"])
  420. vp = {"option": option, "value": valueList, "value_for_ocr": valueOcrList,
  421. "enter_key": self.valueParams.values[option]["enter_key"],
  422. "move_key": self.valueParams.values[option]["move_key"],
  423. "others": self.valueParams.values[option]['others']}
  424. # 找到value对应的ocr;
  425. if value != "":
  426. vp["value"] = value
  427. for item in self.valueParams.values[option]["value"]:
  428. if "range(" in item["value"]:
  429. vp["value_for_ocr"] = item["value_for_ocr"].split(';')
  430. break
  431. elif item["value"].lower() == value.lower():
  432. vp["value_for_ocr"] = item["value_for_ocr"].split(';')
  433. break
  434. # endfor
  435. # endif
  436. # 返回结果;
  437. return vp
  438. '''
  439. 函数:获取value表中的指定option(value name)的value的文本内容;
  440. 参数:
  441. optionName 指定value中的option(value name)
  442. value 指定option的value字段名称;
  443. 返回:数组
  444. 示例:
  445. 测试:通过。对应UIT_tree中的getValueTextList。
  446. '''
  447. def getOptionValueText(self, optionName, value):
  448. valueTextList = []
  449. if optionName in self.__valueParams.values:
  450. valueDictList = self.valueParams.values[optionName]["value"]
  451. for valueDict in valueDictList:
  452. if valueDict["value"] == value:
  453. value_for_ocr = valueDict["value_for_ocr"]
  454. valueTextList = value_for_ocr.split(';')
  455. break
  456. return valueTextList
  457. '''
  458. 函数:获取指定option的详细信息;
  459. 参数:
  460. optionName 指定的路径表中的option名称
  461. 返回:字典
  462. 示例:
  463. {
  464. "layers":"第几层",
  465. "level":"",
  466. "parent":"",
  467. "first_parent": "",
  468. "enter_key":"",
  469. "move_key":"",
  470. "others":"",
  471. "option_move_key":"",
  472. "option_enter_key":"",
  473. "option_others":"",
  474. "option_ocr":[],
  475. }
  476. 测试:通过。对应UIT_tree中的get_option
  477. '''
  478. def getOptionInfo(self, optionName):
  479. # 编码转换;
  480. if type(optionName) == str:
  481. option = unicode(optionName)
  482. found = False
  483. layers = 0
  484. dict_option = {}
  485. # 首先,字典不排序,需要倒序;
  486. paths = reversed(self.__pathParams.paths)
  487. for level in paths:
  488. for parent in self.__pathParams.paths[level]:
  489. for vals in self.__pathParams.paths[level][parent]["value"]:
  490. if vals['option'].lower() == option.lower():
  491. if dict_option.__len__() == 0:
  492. found = True
  493. dict_option['level'] = level
  494. dict_option['parent'] = parent
  495. dict_option['others'] = self.__pathParams.paths[level][parent]['others']
  496. dict_option['enter_key'] = self.__pathParams.paths[level][parent]['enter_key']
  497. dict_option['move_key'] = self.__pathParams.paths[level][parent]['move_key']
  498. dict_option['option_ocr'] = vals['option_for_ocr'].split(';')
  499. dict_option['option_move_key'] = vals['move_key']
  500. dict_option['option_enter_key'] = vals['enter_key']
  501. dict_option['option_others'] = vals['others']
  502. option = parent
  503. layers += 1 # 层数;
  504. break
  505. # endfor
  506. # endfor
  507. # endfor
  508. if found is True:
  509. dict_option['layers'] = layers
  510. # first层次的parent名称;
  511. dict_option['first_parent'] = option
  512. # 返回结果;
  513. return found, dict_option
  514. '''
  515. 函数:获取指定的option在value表中的所有value字段;
  516. 参数:
  517. optionName 指定value表中的option(value name)名称。
  518. 返回:数组
  519. 示例:
  520. 测试:通过。对应UIT_tree中的getSubValueList
  521. '''
  522. def getOptionAllValueName(self, optionName):
  523. valueList = []
  524. if self.valueParams.values.has_key(optionName):
  525. valueDictList = self.valueParams.values[optionName]["value"]
  526. for valueDict in valueDictList:
  527. valueList.append(valueDict["value"])
  528. # print "valueList:", valueList, type(valueList)
  529. if valueList.__len__() == 1 and "range(" in valueList[0]:
  530. value_for_ocr_low = str(valueList[0]).lower()
  531. str_num = value_for_ocr_low.replace("range", "")
  532. list_num = eval(str_num)
  533. min_num = list_num[0]
  534. max_num = list_num[1]
  535. return [min_num, max_num]
  536. return valueList
  537. if __name__ == "__main__":
  538. exData = CExtraData()
  539. opxls = COptionExcel(exData)
  540. # print json.dumps(opxls.pathParams.paths)
  541. # print "getOptionAllChildItemName", opxls.getOptionAllChildItemName('picture')
  542. # print "getOptionAllChildItemTextList1d", opxls.getOptionAllChildItemTextList1d('picture')
  543. # print "getOptionAllChildItemTextList2d", opxls.getOptionAllChildItemTextList2d('picture')
  544. # print "getOptionAllChildItemMap", opxls.getOptionAllChildItemMap('picture')
  545. # print "getOptionAllSiblingItemMap", opxls.getOptionAllSiblingItemMap('picture')
  546. # print u"getOptionAllSiblingItemDict", opxls.getOptionAllSiblingItemDict('picture')
  547. # print u"getOptionAllSiblingItemTextList1d", opxls.getOptionAllSiblingItemTextList1d('picture')
  548. # print u"getOptionText", opxls.getOptionText('picture')
  549. # print "getOptionValueInfo", opxls.getOptionValueInfo('picture')
  550. # print "getOptionValueText", opxls.getOptionValueText('picture', 'sharpness')
  551. # print "getOptionInfo", opxls.getOptionInfo('picture_reset')
  552. print "getOptionAllValueName", opxls.getOptionAllValueName('r_gain')