OptionExcel.py 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. # -*- coding:utf-8 -*-
  2. import os, json
  3. from collections import OrderedDict
  4. from TExcelParser import CExcelParser
  5. from ssat_sdk.utils.string_util import strToList
  6. from xlsConst import xlsConst as xlsc
  7. from BaseLog import CBaseLog
  8. from ExtraData import CExtraData
  9. def parseMoveKey(keyStr):
  10. return strToList(keyStr, ";")
  11. g_level = ['First', 'Second', 'Third', 'Fourth', 'Fifth', 'Sixth',
  12. 'Seventh', 'Eighth', 'Ninth', 'Tenth', 'Eleventh', 'Twelfth']
  13. class CPathParams(CBaseLog):
  14. def __init__(self):
  15. CBaseLog.__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. CBaseLog.__init__(self)
  38. self.values = OrderedDict()
  39. def addParent(self, pDict):
  40. if pDict[xlsc.value_name] in self.values:
  41. self.error("Parent %s conflict." % (pDict[xlsc.value_name]))
  42. pDict["value"] = []
  43. pDict[xlsc.move_key] = parseMoveKey(pDict[xlsc.move_key])
  44. self.values[pDict[xlsc.value_name]] = pDict
  45. def addOption(self, pDict):
  46. if pDict[xlsc.value_name] in self.values:
  47. if pDict[xlsc.value].__len__() > 0:
  48. self.values[pDict[xlsc.value_name]]["value"].append(pDict)
  49. else:
  50. self.error("Parent %s not exist." % (pDict[xlsc.value_name]))
  51. class CDialogParams(CBaseLog):
  52. def __init__(self):
  53. CBaseLog.__init__(self)
  54. self.dialogs = OrderedDict()
  55. def addParent(self, level, pDict):
  56. # endif
  57. if pDict[xlsc.parent] in self.dialogs:
  58. self.error("Parent %s conflict." % (pDict[xlsc.parent]))
  59. pDict["value"] = []
  60. pDict[xlsc.move_key] = parseMoveKey(pDict[xlsc.move_key])
  61. self.dialogs[pDict[xlsc.parent]] = pDict
  62. def addOption(self, level, pDict):
  63. if pDict[xlsc.parent] in self.dialogs:
  64. if pDict[xlsc.option].__len__() > 0:
  65. self.dialogs[pDict[xlsc.parent]]["value"].append(pDict)
  66. else:
  67. self.error("Parent %s not exist." % pDict[xlsc.parent])
  68. # 注意:所有不对外暴露的变量和函数需要私有化,以明确哪些接口和参数是对外的。
  69. # 这样便于后期维护时,根据对外的变量和函数来做处理。
  70. class COptionExcel(CBaseLog):
  71. def __init__(self, exData):
  72. CBaseLog.__init__(self)
  73. self.__excelParse = CExcelParser(self)
  74. self.__exData = exData
  75. self.__pathParams = CPathParams()
  76. self.__valueParams = CValueParams()
  77. self.__dialogParams = CDialogParams()
  78. # 加载excel;
  79. self.loadExcel()
  80. @property
  81. def pathParams(self):
  82. return self.__pathParams
  83. @property
  84. def valueParams(self):
  85. return self.__valueParams
  86. @property
  87. def dialogParams(self):
  88. return self.__dialogParams
  89. # 加载已知表格;
  90. def loadExcel(self):
  91. self.info(u"加载excel表")
  92. if self.__exData.listExcelPath.__len__() == 0:
  93. self.error(u"没有任何excel表格可加载")
  94. for xls in self.__exData.listExcelPath:
  95. self.info(u"当前加载:%s" % xls)
  96. self.__excelParse.read_excel(xls)
  97. # 加载其他表格;
  98. def addExcel(self, xlsPath):
  99. self.__excelParse.read_excel(xlsPath)
  100. '''
  101. 函数:获取指定option下的所有子项名称(option作为parent,获取该父项下的所有option字段)
  102. 参数:optionName 作为parent的option;
  103. 返回:该option作为父节点的所有子option名称数组;
  104. 示例:['picture_preset', 'brightness', 'backlight']
  105. 测试:通过。 对应UIT_tree.py中的getSubOptionList。
  106. '''
  107. def getOptionAllChildItemName(self, optionName):
  108. optionList = []
  109. paths = self.__pathParams.paths
  110. for level in paths:
  111. if optionName in paths[level]:
  112. optionDictList = paths[level][optionName]["value"]
  113. for optionDict in optionDictList:
  114. optionList.append(optionDict["option"])
  115. return optionList
  116. '''
  117. 函数:获取指定option/value_name下的所有子项(option/value)的ocr值, 1d表示One-dimensional(一维数组);
  118. 参数:
  119. optionName 指定的option节点(也可以是value name);
  120. isOption 是否为路径节点,True路径节点,False为value表的value name节点;
  121. 返回:数组
  122. 示例:
  123. [
  124. ['suboption1 ocr', 'ocr2', 'ocr3'],
  125. ['suboption2 ocr'],
  126. ['suboption3 orc']
  127. ]
  128. 测试:通过。UIT_tree中的x
  129. '''
  130. def getOptionAllChildItemTextList1d(self, optionName, isOption=True):
  131. if type(optionName) == str:
  132. optionName = unicode(optionName)
  133. list_ocr = []
  134. # 路径表或值表;
  135. if isOption is True:
  136. found = False
  137. for lev in self.__pathParams.paths:
  138. for parent in self.__pathParams.paths[lev]:
  139. if parent.lower() == optionName.lower():
  140. found = True
  141. for item in self.__pathParams.paths[lev][optionName]["value"]:
  142. list_ocr.extend(item['option_for_ocr'].split(';'))
  143. break
  144. # endif
  145. # endfor
  146. if found is True:
  147. break
  148. # endfor
  149. else:
  150. if optionName in self.__valueParams.values:
  151. self.info(u"找到%s的value表数据" % optionName)
  152. for item in self.__valueParams.values[optionName]["value"]:
  153. list_ocr.extend(item['value_for_ocr'].split(';'))
  154. else:
  155. self.error(u"没有找到%s的value表数据" % optionName)
  156. # endif
  157. return list_ocr
  158. '''
  159. 函数:获取指定option/value_name下的所有子项(option/value)的ocr值,2d表示Two-dimensional(二维数组);
  160. 参数:
  161. optionName 指定的option节点(也可以是value name);
  162. isOption 是否为路径节点,True路径节点,False为value表的value name节点;
  163. 返回:字典
  164. 示例:
  165. [
  166. ['suboption1 ocr', 'ocr2', 'ocr3'],
  167. ['suboption2 ocr'],
  168. ['suboption3 orc']
  169. ]
  170. 测试:通过。对应UIT_tree中的get_ocr_list
  171. '''
  172. def getOptionAllChildItemTextList2d(self, optionName, isOption=True):
  173. if type(optionName) == str:
  174. optionName = unicode(optionName)
  175. list_ocr = []
  176. # 路径表或值表;
  177. if isOption is True:
  178. found = False
  179. for lev in self.__pathParams.paths:
  180. for parent in self.__pathParams.paths[lev]:
  181. if parent.lower() == optionName.lower():
  182. found = True
  183. for item in self.__pathParams.paths[lev][optionName]["value"]:
  184. list_ocr.append(item['option_for_ocr'].split(';'))
  185. break
  186. # endif
  187. # endfor
  188. if found is True:
  189. break
  190. # endfor
  191. else:
  192. if optionName in self.__valueParams.values:
  193. self.info(u"找到%s的value表数据" % optionName)
  194. for item in self.__valueParams.values[optionName]["value"]:
  195. list_ocr.append(item['value_for_ocr'].split(';'))
  196. else:
  197. self.error(u"没有找到%s的value表数据" % optionName)
  198. # endif
  199. return list_ocr
  200. '''
  201. 函数:获取指定option/value_name下的所有子项(option/value)的ocr键对值;
  202. 参数:
  203. optionName 指定的option节点(也可以是value name);
  204. isOption 是否为路径节点,True路径节点,False为value表的value name节点;
  205. 返回:数组
  206. 示例:
  207. optionName = option
  208. isOption = True
  209. 返回:
  210. [
  211. {'childoption1': 'childoption1 for ocr'},
  212. {'childoption2': 'childoption2 for ocr'},
  213. {'childoption3': 'childoption3 for ocr'},
  214. ]
  215. 测试:通过。对应UIT_tree中的get_pair_values
  216. '''
  217. def getOptionAllChildItemMap(self, optionName, isOption=True):
  218. if type(optionName) == str:
  219. optionName = unicode(optionName)
  220. pairs = []
  221. # 路径表或值表;
  222. if isOption is True:
  223. found = False
  224. for lev in self.__pathParams.paths:
  225. for item in self.__pathParams.paths[lev]:
  226. if item.lower() == optionName.lower():
  227. found = True
  228. for item in self.__pathParams.paths[lev][optionName]["value"]:
  229. pairs.append({item['option']: item['option_for_ocr'].split(';')})
  230. break
  231. # endif
  232. # endfor
  233. if found is True:
  234. break
  235. # endfor
  236. else:
  237. if optionName in self.__valueParams.values:
  238. for item in self.__valueParams.values[optionName]["value"]:
  239. pairs.append({item['value']: item['value_for_ocr'].split(';')})
  240. # endif
  241. return pairs
  242. '''
  243. 函数:获取指定option/value_name下的所有兄弟项(相同parent)的ocr键对值;
  244. 参数:
  245. optionName 指定的option节点(也可以是value name);
  246. isOption 是否为路径节点,True路径节点,False为value表的value name节点;
  247. 返回:数组
  248. 示例:
  249. [
  250. {'sibling option1': 'sibling option1 for ocr'},
  251. {'sibling option2': 'sibling option2 for ocr'}
  252. ]
  253. 测试:。
  254. '''
  255. def getOptionAllSiblingItemMap(self, optionName, isOption=True):
  256. pass
  257. '''
  258. 函数:获取指定option/value_name下的所有兄弟项(包括自己,相同parent)的 ocr:option 字典值;
  259. 参数:
  260. optionName 指定的option节点(也可以是value name);
  261. isOption 是否为路径节点,True路径节点,False为value表的value name节点;
  262. 注:value表中的option实际并没有兄弟项,取的是该option(value name)所有value项
  263. 返回:字典
  264. 示例:
  265. {
  266. 'sibling option1_ocr': 'sibling option1',
  267. 'sibling option2_ocr': 'sibling option2',
  268. 'sibling option3_ocr': 'sibling option3',
  269. }
  270. 测试:通过。对应UIT_tree中的get_parent_ocr_dict
  271. '''
  272. def getOptionAllSiblingItemDict(self, optionName, isOption=True):
  273. # 编码转换;
  274. if type(optionName) == str:
  275. optionName = unicode(optionName)
  276. found = False
  277. dict_ocr = {}
  278. list_ocr = []
  279. if isOption is True:
  280. # 首先,字典不排序,需要倒序;
  281. paths = reversed(self.__pathParams.paths)
  282. for level in paths:
  283. for parent in self.__pathParams.paths[level]:
  284. for vals in self.__pathParams.paths[level][parent]["value"]:
  285. if vals['option'].lower() == optionName.lower():
  286. found = True
  287. break
  288. # endfor
  289. # 找到退出;
  290. if found is True:
  291. break
  292. # endfor
  293. # 找到退出;
  294. if found is True:
  295. break
  296. # 遍历value列表;
  297. if found is True:
  298. for val in self.__pathParams.paths[level][parent]["value"]:
  299. list_ocr = val['option_for_ocr'].split(';')
  300. for ocr in list_ocr:
  301. dict_ocr[ocr.lower()] = val['option']
  302. else:
  303. if optionName in self.__valueParams.values:
  304. for val in self.__valueParams.values[optionName]["value"]:
  305. list_ocr = val['value_for_ocr'].split(';')
  306. for ocr in list_ocr:
  307. dict_ocr[ocr.lower()] = val['value']
  308. print 'unsorted=', dict_ocr
  309. # 按长度排序;
  310. list_ocr = sorted(dict_ocr.keys(), key=lambda key: len(key), reverse=True)
  311. dict_reuslt = OrderedDict()
  312. for ocr in list_ocr:
  313. dict_reuslt[ocr] = dict_ocr[ocr]
  314. # 返回结果;
  315. return dict_reuslt
  316. '''
  317. 函数:获取指定option所有兄弟项(相同parent)的ocr值, 1d表示One-dimensional(一维数组);
  318. 参数:
  319. optionName 指定的option节点(也可以是value name);
  320. isOption 是否为路径节点,True路径节点,False为value表的value name节点;
  321. 返回:数组
  322. 示例:
  323. [
  324. ['option1 ocr', 'ocr2', 'ocr3'],
  325. ['option2 ocr'],
  326. ['option3 orc']
  327. ]
  328. 测试:通过。对应UIT_tree中的get_parent_ocr_list
  329. '''
  330. def getOptionAllSiblingItemTextList1d(self, optionName):
  331. # 编码转换;
  332. if type(optionName) == str:
  333. optionName = unicode(optionName)
  334. found = False
  335. list_ocr = []
  336. # 首先,字典不排序,需要倒序;
  337. paths = reversed(self.__pathParams.paths)
  338. for level in paths:
  339. for parent in self.__pathParams.paths[level]:
  340. for vals in self.__pathParams.paths[level][parent]["value"]:
  341. if vals['option'].lower() == optionName.lower():
  342. found = True
  343. break
  344. # endfor
  345. # 找到退出;
  346. if found is True:
  347. break
  348. # endfor
  349. # 找到退出;
  350. if found is True:
  351. break
  352. # endfor
  353. # 遍历value列表;
  354. if found is True:
  355. for val in self.__pathParams.paths[level][parent]["value"]:
  356. list_ocr.extend(val['option_for_ocr'].split(';'))
  357. # 按长度排序;
  358. list_ocr.sort(key=lambda i: len(i), reverse=True)
  359. # 返回结果;
  360. return list_ocr
  361. def getOptionAllSiblingItemTextList2d(self, optionName):
  362. # 编码转换;
  363. if type(optionName) == str:
  364. optionName = unicode(optionName)
  365. found = False
  366. list_ocr = []
  367. # 首先,字典不排序,需要倒序;
  368. paths = reversed(self.__pathParams.paths)
  369. for level in paths:
  370. for parent in self.__pathParams.paths[level]:
  371. for vals in self.__pathParams.paths[level][parent]["value"]:
  372. if vals['option'].lower() == optionName.lower():
  373. found = True
  374. break
  375. # endfor
  376. # 找到退出;
  377. if found is True:
  378. break
  379. # endfor
  380. # 找到退出;
  381. if found is True:
  382. break
  383. # endfor
  384. # 遍历value列表;
  385. if found is True:
  386. for val in self.__pathParams.paths[level][parent]["value"]:
  387. list_ocr.append(val['option_for_ocr'].split(';'))
  388. # 按长度排序;
  389. list_ocr.sort(key=lambda i: len(i), reverse=True)
  390. # 返回结果;
  391. return list_ocr
  392. '''
  393. 函数:获取指定option的所有兄弟项名称;
  394. 参数:
  395. 返回:
  396. '''
  397. def getOptionAllSiblingItemName(self, optionName):
  398. # 编码转换;
  399. if type(optionName) == str:
  400. optionName = unicode(optionName)
  401. found = False
  402. listName = []
  403. # 首先,字典不排序,需要倒序;
  404. paths = reversed(self.__pathParams.paths)
  405. for level in paths:
  406. for parent in self.__pathParams.paths[level]:
  407. for vals in self.__pathParams.paths[level][parent]["value"]:
  408. if vals['option'].lower() == optionName.lower():
  409. found = True
  410. break
  411. # endfor
  412. # 找到退出;
  413. if found is True:
  414. break
  415. # endfor
  416. # 找到退出;
  417. if found is True:
  418. break
  419. # endfor
  420. # 遍历value列表;
  421. if found is True:
  422. for val in self.__pathParams.paths[level][parent]["value"]:
  423. listName.append(val['option'])
  424. # 返回结果;
  425. return listName
  426. '''
  427. 函数:获取指定option的ocr文本描述,以list返回
  428. 参数:optionName 要返回文本描述的option节点
  429. 返回:数据
  430. 示例:optionName = 'picture_reset'时,返回['picture reset', 'plcture reset']
  431. 测试:通过。对应UIT_tree.py中的getOptionTextList、get_option_ocr(这两个函数返回值一样,参数不一样而已)。
  432. '''
  433. def getOptionText(self, optionName):
  434. # 编码转换;
  435. if type(optionName) == str:
  436. optionName = unicode(optionName)
  437. found = False
  438. list_ocr = []
  439. # 首先,字典不排序,需要倒序;
  440. paths = reversed(self.__pathParams.paths)
  441. for level in paths:
  442. for parent in self.__pathParams.paths[level]:
  443. for vals in self.__pathParams.paths[level][parent]["value"]:
  444. if vals['option'].lower() == optionName.lower():
  445. list_ocr = vals['option_for_ocr'].split(';')
  446. found = True
  447. break
  448. # endfor
  449. # 找到退出;
  450. if found is True:
  451. break
  452. # endfor
  453. # 找到退出;
  454. if found is True:
  455. break
  456. # endfor
  457. # 返回结果;
  458. return list_ocr
  459. '''
  460. 函数:获取指定option的value表详细数据,如果参数value未指定具体值则获取全部valueName的详细数据;
  461. 参数:
  462. optionName 指定的value表中的option(即value name)名称
  463. value 要获取的值名称,如果空则获取全部值
  464. 返回:自定义的字典
  465. 示例:
  466. {
  467. "option":"option名称",
  468. "values":[option在value表中的所有value字段],
  469. "value_for_ocr":[option在value表中所有value_for_ocr字段],
  470. "enter_key":"",
  471. "move_key":"",
  472. "others":"",
  473. }
  474. 测试:通过。对应UIT_tree中的get_value
  475. '''
  476. def getOptionValueInfo(self, optionName, value=""):
  477. # 编码转换;
  478. if type(optionName) == str:
  479. optionName = unicode(optionName)
  480. # option/value name是否在value表中的;
  481. if optionName not in self.__valueParams.values:
  482. return []
  483. optValues = self.__valueParams.values[optionName]["value"]
  484. valueList = []
  485. valueOcrList = []
  486. for item in optValues:
  487. valueList.append(item["value"])
  488. valueOcrList.append(item["value_for_ocr"])
  489. vp = {
  490. "option": optionName,
  491. "value": valueList,
  492. "value_for_ocr": valueOcrList,
  493. "enter_key": self.__valueParams.values[optionName]["enter_key"],
  494. "move_key": self.__valueParams.values[optionName]["move_key"],
  495. "others": self.__valueParams.values[optionName]['others'],
  496. # toparent_key,有则读取,无则留空
  497. "toparent_key": self.__valueParams.values[optionName]['toparent_key'] \
  498. if 'toparent_key' in self.__valueParams.values[optionName]\
  499. else "",
  500. "layout": self.__valueParams.values[optionName]['layout'] \
  501. if 'layout' in self.__valueParams.values[optionName]\
  502. else ""
  503. }
  504. bFound = False
  505. # 找到value对应的ocr;
  506. if value is not None and value != "":
  507. vp["value"] = value
  508. for item in self.__valueParams.values[optionName]["value"]:
  509. if "range(" in item["value"]:
  510. bFound = True
  511. vp["value_for_ocr"] = item["value_for_ocr"].split(';')
  512. break
  513. elif item["value"].lower() == value.lower():
  514. bFound = True
  515. vp["value_for_ocr"] = item["value_for_ocr"].split(';')
  516. break
  517. # endfor
  518. else:
  519. bFound = True
  520. # 返回结果;
  521. return vp if bFound else []
  522. '''
  523. 函数:获取value表中的指定option(value name)的value的文本内容;
  524. 参数:
  525. optionName 指定value中的option(value name)
  526. value 指定option的value字段名称;
  527. 返回:数组
  528. 示例:
  529. 测试:通过。对应UIT_tree中的getValueTextList。
  530. '''
  531. def getOptionValueText(self, optionName, value=""):
  532. if optionName is None or optionName.__len__() == 0:
  533. self.error(u"optionName空,退出执行")
  534. return []
  535. # 如果是整数或浮点数,退出;
  536. if type(value) == int or type(value) == float:
  537. self.info(u"value类型是整数或浮点数")
  538. valueTextList = []
  539. if optionName in self.__valueParams.values:
  540. valueDictList = self.valueParams.values[optionName]["value"]
  541. for valueDict in valueDictList:
  542. if value is None or value == "":
  543. value_for_ocr = valueDict["value_for_ocr"]
  544. valueTextList.extend(value_for_ocr.split(';'))
  545. else:
  546. # 如果是字符串;
  547. if type(value) == str:
  548. if valueDict["value"].lower() == value.lower():
  549. value_for_ocr = valueDict["value_for_ocr"]
  550. valueTextList = value_for_ocr.split(';')
  551. break
  552. # 如果是整数或浮点数;
  553. elif type(value) == int or type(value) == float:
  554. value_for_ocr = valueDict["value_for_ocr"]
  555. if "range" in value_for_ocr:
  556. value_for_ocr = value_for_ocr.replace("range", "")
  557. valueTextList = list(eval(value_for_ocr))
  558. break
  559. # endif
  560. # endfor
  561. # endif
  562. # 返回结果;
  563. return valueTextList
  564. '''
  565. 函数:获取指定option的详细信息;
  566. 参数:
  567. optionName 指定的路径表中的option名称
  568. 返回:字典
  569. 示例:
  570. {
  571. "layers":"第几层",
  572. "level":"",
  573. "parent":"",
  574. "first_parent": "",
  575. "enter_key":"",
  576. "move_key":"",
  577. "others":"",
  578. "option_move_key":"",
  579. "option_enter_key":"",
  580. "option_others":"",
  581. "option_ocr":[],
  582. }
  583. 测试:通过。对应UIT_tree中的get_option
  584. '''
  585. def getOptionInfo(self, optionName, paths=None):
  586. # 参数校验;
  587. if optionName is None or optionName.__len__() == 0:
  588. self.error(u"optionName空,退出执行")
  589. return False, {}
  590. # 编码转换;
  591. if type(optionName) == str:
  592. optionName = unicode(optionName)
  593. found = False
  594. dict_option = {}
  595. if paths is None:
  596. # 首先,字典不排序,需要倒序;
  597. paths = reversed(self.__pathParams.paths)
  598. for level in paths:
  599. for parent in self.__pathParams.paths[level]:
  600. # 如果找到的是顶层信息(如source).
  601. if level == "First" and parent.lower() == optionName.lower():
  602. found = True
  603. dict_option['level'] = level
  604. dict_option['parent'] = parent
  605. dict_option['others'] = self.__pathParams.paths[level][parent]['others']
  606. dict_option['enter_key'] = self.__pathParams.paths[level][parent]['enter_key']
  607. dict_option['move_key'] = self.__pathParams.paths[level][parent]['move_key']
  608. # 根节点没有以下信息,置空。
  609. # 读取toparent_key
  610. if 'toparent_key' in self.__pathParams.paths[level][parent]:
  611. dict_option['toparent_key'] = self.__pathParams.paths[level][parent]['toparent_key']
  612. else:
  613. dict_option['toparent_key'] = ''
  614. # 读取layout
  615. if 'layout' in self.__pathParams.paths[level][parent]:
  616. dict_option['layout'] = self.__pathParams.paths[level][parent]['layout']
  617. else:
  618. dict_option['layout'] = ''
  619. dict_option['option_ocr'] = []
  620. dict_option['option_move_key'] = []
  621. dict_option['option_enter_key'] = []
  622. dict_option['option_others'] = []
  623. dict_option['layers'] = g_level.index(level)
  624. option = parent
  625. break
  626. else:
  627. for vals in self.__pathParams.paths[level][parent]["value"]:
  628. if vals['option'].lower() == optionName.lower():
  629. if dict_option.__len__() == 0:
  630. found = True
  631. dict_option['level'] = level
  632. dict_option['parent'] = parent
  633. dict_option['others'] = self.__pathParams.paths[level][parent]['others']
  634. dict_option['enter_key'] = self.__pathParams.paths[level][parent]['enter_key']
  635. dict_option['move_key'] = self.__pathParams.paths[level][parent]['move_key']
  636. # 读取toparent_key
  637. if 'toparent_key' in self.__pathParams.paths[level][parent]:
  638. dict_option['toparent_key'] = self.__pathParams.paths[level][parent]['toparent_key']
  639. else:
  640. dict_option['toparent_key'] = ''
  641. # 读取layout
  642. if 'layout' in self.__pathParams.paths[level][parent]:
  643. dict_option['layout'] = self.__pathParams.paths[level][parent]['layout']
  644. else:
  645. dict_option['layout'] = ''
  646. dict_option['option_ocr'] = vals['option_for_ocr'].split(';')
  647. dict_option['option_move_key'] = vals['move_key']
  648. dict_option['option_enter_key'] = vals['enter_key']
  649. dict_option['option_others'] = vals['others']
  650. dict_option['layers'] = g_level.index(level)
  651. option = parent
  652. break
  653. # endfor
  654. # endif
  655. # endfor
  656. # endfor
  657. if found is True:
  658. # first层次的parent名称;
  659. dict_option['first_parent'] = option
  660. else:
  661. for level in paths:
  662. if paths[level]['option'].lower() == optionName.lower():
  663. found = True
  664. dict_option['layers'] = g_level.index(level)
  665. dict_option['first_parent'] = paths['First']['parent']
  666. dict_option['level'] = level
  667. dict_option['parent'] = paths[level]['parent']
  668. dict_option['others'] = paths[level]['others']
  669. dict_option['enter_key'] = paths[level]['enter_key']
  670. dict_option['move_key'] = paths[level]['move_key']
  671. if 'toparent_key'in paths[level]:
  672. dict_option['toparent_key'] = paths[level]['toparent_key']
  673. else:
  674. dict_option['toparent_key'] = ''
  675. if 'layout'in paths[level]:
  676. dict_option['layout'] = paths[level]['layout']
  677. else:
  678. dict_option['layout'] = ''
  679. dict_option['option_ocr'] = paths[level]['option_for_ocr'] # 已经是list了。
  680. dict_option['option_move_key'] = paths[level]['move_key']
  681. dict_option['option_enter_key'] = paths[level]['enter_key']
  682. dict_option['option_others'] = paths[level]['others']
  683. break
  684. # endif
  685. # endfor
  686. # endif
  687. # 返回结果;
  688. return found, dict_option
  689. '''
  690. 函数:获取指定parent的详细信息;
  691. 参数:
  692. parentName 指定的路径表中的parent名称
  693. 返回:字典
  694. 示例:
  695. {
  696. "layers":"第几层",
  697. "level":"",
  698. "others":"",
  699. "toparent_key": "",
  700. "enter_key":"",
  701. "move_key":"",
  702. "layout":"",
  703. "option":[parent下的optionName列表],
  704. }
  705. 测试:通过。对应UIT_tree中的get_option
  706. '''
  707. def getParentInfo(self, parentName):
  708. # 参数校验;
  709. if parentName is None or parentName.__len__() == 0:
  710. self.error(u"optionName空,退出执行")
  711. return False, {}
  712. # 编码转换;
  713. if type(parentName) == str:
  714. parentName = unicode(parentName)
  715. found = False
  716. dict_parent = {}
  717. # 先读取非value层的parent;
  718. paths = reversed(self.__pathParams.paths)
  719. for level in paths:
  720. for parent in self.__pathParams.paths[level]:
  721. if parent.lower() == parentName.lower():
  722. found = True
  723. dict_parent['level'] = level
  724. dict_parent['others'] = self.__pathParams.paths[level][parent]['others']
  725. dict_parent['enter_key'] = self.__pathParams.paths[level][parent]['enter_key']
  726. dict_parent['move_key'] = self.__pathParams.paths[level][parent]['move_key']
  727. # 读取toparent_key
  728. if 'toparent_key' in self.__pathParams.paths[level][parent]:
  729. dict_parent['toparent_key'] = self.__pathParams.paths[level][parent]['toparent_key']
  730. else:
  731. dict_parent['toparent_key'] = ''
  732. # 读取layout
  733. if 'layout' in self.__pathParams.paths[level][parent]:
  734. dict_parent['layout'] = self.__pathParams.paths[level][parent]['layout']
  735. else:
  736. dict_parent['layout'] = ''
  737. dict_parent['layers'] = g_level.index(level)
  738. optionList = []
  739. for val in self.__pathParams.paths[level][parent]['value']:
  740. if 'option' in val:
  741. optionList.append(val['option'])
  742. dict_parent['option'] = optionList
  743. return found, dict_parent
  744. return found, dict_parent
  745. '''
  746. 函数:获取指定的option在value表中的所有value字段;
  747. 参数:
  748. optionName 指定value表中的option(value name)名称。
  749. 返回:数组
  750. 示例:
  751. 测试:通过。对应UIT_tree中的getSubValueList
  752. '''
  753. def getOptionAllValueName(self, optionName):
  754. valueList = []
  755. if optionName in self.valueParams.values:
  756. valueDictList = self.valueParams.values[optionName]["value"]
  757. for valueDict in valueDictList:
  758. valueList.append(valueDict["value"])
  759. # print "valueList:", valueList, type(valueList)
  760. if valueList.__len__() == 1 and "range(" in valueList[0]:
  761. value_for_ocr_low = str(valueList[0]).lower()
  762. str_num = value_for_ocr_low.replace("range", "")
  763. list_num = eval(str_num)
  764. min_num = list_num[0]
  765. max_num = list_num[1]
  766. return [min_num, max_num]
  767. return valueList
  768. '''
  769. 函数:获取指定option的路径。
  770. 参数:
  771. 返回:
  772. 示例:
  773. 测试:。
  774. '''
  775. def getOptionPaths(self, optionName):
  776. # 对参数进行校验;
  777. if optionName is None or optionName.__len__() == 0:
  778. self.error('optionName空,执行退出')
  779. return None
  780. # pp必须不排序;
  781. pp = OrderedDict()
  782. # 首先,字典不排序,需要倒序;
  783. paths = reversed(self.__pathParams.paths)
  784. for level in paths:
  785. found = False
  786. for parent in self.__pathParams.paths[level]:
  787. for item in self.__pathParams.paths[level][parent]["value"]:
  788. if item["option"].lower() == optionName.lower():
  789. pp[level] = {
  790. "parent": parent,
  791. "move_key": self.__pathParams.paths[level][parent][xlsc.move_key],
  792. "enter_key": self.__pathParams.paths[level][parent][xlsc.enter_key],
  793. "others": self.__pathParams.paths[level][parent][xlsc.others],
  794. "toparent_key": self.__pathParams.paths[level][parent][xlsc.toparent_key]\
  795. if xlsc.toparent_key in self.__pathParams.paths[level][parent]\
  796. else "",
  797. "layout": self.__pathParams.paths[level][parent][xlsc.layout]\
  798. if xlsc.layout in self.__pathParams.paths[level][parent]\
  799. else "",
  800. "option": item[xlsc.option],
  801. "option_for_ocr": item[xlsc.option_for_ocr].split(';'),
  802. "option_move_key": item[xlsc.move_key],
  803. "option_enter_key": item[xlsc.enter_key],
  804. "option_others": item[xlsc.others]
  805. }
  806. optionName = parent
  807. found = True
  808. break
  809. if found:
  810. break
  811. else:
  812. if level == "First" and parent == optionName:
  813. pp[level] = {
  814. "parent": parent,
  815. "move_key": self.__pathParams.paths[level][parent][xlsc.move_key],
  816. "enter_key": self.__pathParams.paths[level][parent][xlsc.enter_key],
  817. "others": self.__pathParams.paths[level][parent][xlsc.others],
  818. "toparent_key": self.__pathParams.paths[level][parent][xlsc.toparent_key]\
  819. if xlsc.toparent_key in self.__pathParams.paths[level][parent]\
  820. else "",
  821. "layout": self.__pathParams.paths[level][parent][xlsc.layout]\
  822. if xlsc.layout in self.__pathParams.paths[level][parent]\
  823. else "",
  824. # 根结点没有以下信息,置空;
  825. "option": parent,
  826. "option_for_ocr": [],
  827. "option_move_key": [],
  828. "option_enter_key": [],
  829. "option_others": []
  830. }
  831. found = True
  832. break
  833. # endif
  834. # endfor
  835. # endfor
  836. # 需要对path倒序使用;
  837. # dict_pp = OrderedDict()
  838. # # 逆序路径key;
  839. # revpp = reversed(pp)
  840. # for path in revpp:
  841. # dict_pp[path] = {"parent": pp[path]['parent'],"move_key": pp[path]['move_key'],"enter_key": pp[path]['enter_key'],"others":pp[path]['others'],"option": pp[path]['option'],"option_for_ocr": pp[path]['option_for_ocr']}
  842. # # 返回逆序后的结果;
  843. # return dict_pp
  844. return pp
  845. '''
  846. 函数:获取指定option和value的路径及value信息。
  847. 参数:
  848. 返回:
  849. 示例:
  850. 测试:通过。
  851. '''
  852. def getOptionPathsAndValue(self, optionName, value):
  853. # 对参数进行校验;
  854. if optionName is None or optionName.__len__() == 0:
  855. self.error('optionName空,执行退出')
  856. return None, None
  857. if value.__len__() == 0:
  858. self.error('value空,执行退出')
  859. return {}, OrderedDict()
  860. vp = self.getOptionValueInfo(optionName, value)
  861. pp = self.getOptionPaths(optionName)
  862. return vp, pp
  863. '''
  864. 函数:检验路径是否有效。
  865. 参数:
  866. 返回:
  867. 示例:
  868. 测试:通过。
  869. '''
  870. def checkOptionPaths(self, optionNameOrPaths):
  871. optionPathResult = "Fail"
  872. # 进行参数校验;
  873. if optionNameOrPaths is None or optionNameOrPaths.__len__() == 0:
  874. self.error('optionNameOrPaths空,执行退出')
  875. return None, optionPathResult
  876. path_params = optionNameOrPaths
  877. if type(optionNameOrPaths) == str:
  878. path_params = self.getOptionPaths(optionNameOrPaths)
  879. # 如果传入的option不存在则直接返回
  880. if path_params.__len__() <= 0:
  881. optionPathResult = "NoExit"
  882. optionPath = u"表格中不存在到达Option: %s 的路径" % str(optionNameOrPaths)
  883. return optionPath, optionPathResult
  884. else:
  885. optionPath = str(path_params)
  886. # 逆序路径key;
  887. revpp = reversed(path_params)
  888. level_count = 0
  889. for level in revpp:
  890. if str(level) == str(g_level[level_count]):
  891. level_count = level_count + 1
  892. else:
  893. # 如果执行路径不是按照First、Second......执行则返回执行出错
  894. return optionPath, optionPathResult
  895. optionPathResult = "Pass"
  896. return optionPath, optionPathResult
  897. if __name__ == "__main__":
  898. exData = CExtraData()
  899. opxls = COptionExcel(exData)
  900. # print json.dumps(opxls.pathParams.paths)
  901. # print "getOptionAllChildItemName", opxls.getOptionAllChildItemName('source')
  902. # print "getOptionAllChildItemTextList1d", opxls.getOptionAllChildItemTextList1d('picture')
  903. # print "getOptionAllChildItemTextList2d", opxls.getOptionAllChildItemTextList2d('picture')
  904. # print "getOptionAllChildItemMap", opxls.getOptionAllChildItemMap('picture')
  905. # print "getOptionAllSiblingItemMap", opxls.getOptionAllSiblingItemMap('picture')
  906. # print u"getOptionAllSiblingItemDict", opxls.getOptionAllSiblingItemDict('picture')
  907. # print u"getOptionAllSiblingItemTextList1d", opxls.getOptionAllSiblingItemTextList1d('picture')
  908. # print u"getOptionText", opxls.getOptionText('picture')
  909. # print "getOptionValueInfo", opxls.getOptionValueInfo('source')
  910. # print "getOptionValueText", opxls.getOptionValueText('source', 'atv')
  911. # print "getOptionValueText", opxls.getOptionValueText('source', 'dtv')
  912. print "getParentInfo", opxls.getParentInfo('picture_preset')
  913. # print "getOptionInfo", opxls.getOptionInfo('picture_preset')
  914. # print "getOptionInfo", opxls.getOptionInfo('picture')
  915. # print "getOptionAllValueName", opxls.getOptionAllValueName('source')
  916. # ##########################################
  917. # paths = opxls.getOptionPaths('source')
  918. # print "getOptionPaths", paths
  919. # print "checkOptionPaths", opxls.checkOptionPaths('sharpness')
  920. # print "checkOptionPaths", opxls.checkOptionPaths(opxls.getOptionPaths('sharpness'))
  921. # print "getOptionPathsAndValue", opxls.getOptionPathsAndValue('picture', 'sharpness')