PaIRS-UniNa 0.2.7__cp310-cp310-macosx_11_0_universal2.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of PaIRS-UniNa might be problematic. Click here for more details.

Files changed (325) hide show
  1. PaIRS_UniNa/Calibration_Tab.py +331 -0
  2. PaIRS_UniNa/Changes.txt +135 -0
  3. PaIRS_UniNa/Custom_Top.py +303 -0
  4. PaIRS_UniNa/Explorer.py +3086 -0
  5. PaIRS_UniNa/FolderLoop.py +372 -0
  6. PaIRS_UniNa/Input_Tab.py +722 -0
  7. PaIRS_UniNa/Input_Tab_CalVi.py +788 -0
  8. PaIRS_UniNa/Input_Tab_tools.py +3024 -0
  9. PaIRS_UniNa/Log_Tab.py +110 -0
  10. PaIRS_UniNa/Output_Tab.py +924 -0
  11. PaIRS_UniNa/PaIRS.py +18 -0
  12. PaIRS_UniNa/PaIRS_PIV.py +873 -0
  13. PaIRS_UniNa/PaIRS_pypacks.py +1376 -0
  14. PaIRS_UniNa/Process_Tab.py +1757 -0
  15. PaIRS_UniNa/Process_Tab_CalVi.py +313 -0
  16. PaIRS_UniNa/Process_Tab_Disp.py +163 -0
  17. PaIRS_UniNa/Process_Tab_Min.py +120 -0
  18. PaIRS_UniNa/ResizePopup.py +55 -0
  19. PaIRS_UniNa/Saving_tools.py +296 -0
  20. PaIRS_UniNa/TabTools.py +1254 -0
  21. PaIRS_UniNa/Vis_Tab.py +2148 -0
  22. PaIRS_UniNa/Vis_Tab_CalVi.py +983 -0
  23. PaIRS_UniNa/Whatsnew.py +129 -0
  24. PaIRS_UniNa/_PaIRS_PIV.so +0 -0
  25. PaIRS_UniNa/__init__.py +6 -0
  26. PaIRS_UniNa/__main__.py +45 -0
  27. PaIRS_UniNa/addwidgets_ps.py +1133 -0
  28. PaIRS_UniNa/calib.py +1488 -0
  29. PaIRS_UniNa/calibView.py +833 -0
  30. PaIRS_UniNa/gPaIRS.py +3856 -0
  31. PaIRS_UniNa/gPalette.py +189 -0
  32. PaIRS_UniNa/icons/abort.png +0 -0
  33. PaIRS_UniNa/icons/about.png +0 -0
  34. PaIRS_UniNa/icons/align_all.png +0 -0
  35. PaIRS_UniNa/icons/announcement.png +0 -0
  36. PaIRS_UniNa/icons/automatic_levels_off.png +0 -0
  37. PaIRS_UniNa/icons/automatic_levels_on.png +0 -0
  38. PaIRS_UniNa/icons/automatic_off.png +0 -0
  39. PaIRS_UniNa/icons/automatic_on.png +0 -0
  40. PaIRS_UniNa/icons/automatic_size_off.png +0 -0
  41. PaIRS_UniNa/icons/automatic_size_on.png +0 -0
  42. PaIRS_UniNa/icons/axes.png +0 -0
  43. PaIRS_UniNa/icons/background.png +0 -0
  44. PaIRS_UniNa/icons/background_vectors.png +0 -0
  45. PaIRS_UniNa/icons/bin_off.png +0 -0
  46. PaIRS_UniNa/icons/bin_on.png +0 -0
  47. PaIRS_UniNa/icons/browse_file_c.png +0 -0
  48. PaIRS_UniNa/icons/browse_folder_c.png +0 -0
  49. PaIRS_UniNa/icons/brush_cursor.png +0 -0
  50. PaIRS_UniNa/icons/bugfix.png +0 -0
  51. PaIRS_UniNa/icons/cal_proc.png +0 -0
  52. PaIRS_UniNa/icons/cal_proc_off.png +0 -0
  53. PaIRS_UniNa/icons/cal_step.png +0 -0
  54. PaIRS_UniNa/icons/cal_step_off.png +0 -0
  55. PaIRS_UniNa/icons/calibrate.png +0 -0
  56. PaIRS_UniNa/icons/calibration_logo.png +0 -0
  57. PaIRS_UniNa/icons/change_folder.png +0 -0
  58. PaIRS_UniNa/icons/change_folder_off.png +0 -0
  59. PaIRS_UniNa/icons/checklist.png +0 -0
  60. PaIRS_UniNa/icons/clean.png +0 -0
  61. PaIRS_UniNa/icons/clean_run.png +0 -0
  62. PaIRS_UniNa/icons/close.png +0 -0
  63. PaIRS_UniNa/icons/close_all.png +0 -0
  64. PaIRS_UniNa/icons/close_project.png +0 -0
  65. PaIRS_UniNa/icons/close_workspace.png +0 -0
  66. PaIRS_UniNa/icons/colormap.png +0 -0
  67. PaIRS_UniNa/icons/colormaps/Accent.png +0 -0
  68. PaIRS_UniNa/icons/colormaps/BrBG.png +0 -0
  69. PaIRS_UniNa/icons/colormaps/Dark2.png +0 -0
  70. PaIRS_UniNa/icons/colormaps/PRGn.png +0 -0
  71. PaIRS_UniNa/icons/colormaps/Paired.png +0 -0
  72. PaIRS_UniNa/icons/colormaps/Pastel1.png +0 -0
  73. PaIRS_UniNa/icons/colormaps/Pastel2.png +0 -0
  74. PaIRS_UniNa/icons/colormaps/PiYG.png +0 -0
  75. PaIRS_UniNa/icons/colormaps/PuOr.png +0 -0
  76. PaIRS_UniNa/icons/colormaps/RdBu.png +0 -0
  77. PaIRS_UniNa/icons/colormaps/RdGy.png +0 -0
  78. PaIRS_UniNa/icons/colormaps/RdYlBu.png +0 -0
  79. PaIRS_UniNa/icons/colormaps/RdYlGn.png +0 -0
  80. PaIRS_UniNa/icons/colormaps/Set1.png +0 -0
  81. PaIRS_UniNa/icons/colormaps/Set2.png +0 -0
  82. PaIRS_UniNa/icons/colormaps/Set3.png +0 -0
  83. PaIRS_UniNa/icons/colormaps/Spectral.png +0 -0
  84. PaIRS_UniNa/icons/colormaps/Wistia.png +0 -0
  85. PaIRS_UniNa/icons/colormaps/afmhot.png +0 -0
  86. PaIRS_UniNa/icons/colormaps/autumn.png +0 -0
  87. PaIRS_UniNa/icons/colormaps/binary.png +0 -0
  88. PaIRS_UniNa/icons/colormaps/blackVector.png +0 -0
  89. PaIRS_UniNa/icons/colormaps/blueVector.png +0 -0
  90. PaIRS_UniNa/icons/colormaps/bone.png +0 -0
  91. PaIRS_UniNa/icons/colormaps/brg.png +0 -0
  92. PaIRS_UniNa/icons/colormaps/bwr.png +0 -0
  93. PaIRS_UniNa/icons/colormaps/cividis.png +0 -0
  94. PaIRS_UniNa/icons/colormaps/cool.png +0 -0
  95. PaIRS_UniNa/icons/colormaps/coolwarm.png +0 -0
  96. PaIRS_UniNa/icons/colormaps/copper.png +0 -0
  97. PaIRS_UniNa/icons/colormaps/cubehelix.png +0 -0
  98. PaIRS_UniNa/icons/colormaps/cyanVector.png +0 -0
  99. PaIRS_UniNa/icons/colormaps/flag.png +0 -0
  100. PaIRS_UniNa/icons/colormaps/gist_heat.png +0 -0
  101. PaIRS_UniNa/icons/colormaps/gray.png +0 -0
  102. PaIRS_UniNa/icons/colormaps/greenVector.png +0 -0
  103. PaIRS_UniNa/icons/colormaps/hot.png +0 -0
  104. PaIRS_UniNa/icons/colormaps/hsv.png +0 -0
  105. PaIRS_UniNa/icons/colormaps/inferno.png +0 -0
  106. PaIRS_UniNa/icons/colormaps/jet.png +0 -0
  107. PaIRS_UniNa/icons/colormaps/magentaVector.png +0 -0
  108. PaIRS_UniNa/icons/colormaps/magma.png +0 -0
  109. PaIRS_UniNa/icons/colormaps/ocean.png +0 -0
  110. PaIRS_UniNa/icons/colormaps/pink.png +0 -0
  111. PaIRS_UniNa/icons/colormaps/plasma.png +0 -0
  112. PaIRS_UniNa/icons/colormaps/prism.png +0 -0
  113. PaIRS_UniNa/icons/colormaps/rainbow.png +0 -0
  114. PaIRS_UniNa/icons/colormaps/redVector.png +0 -0
  115. PaIRS_UniNa/icons/colormaps/seismic.png +0 -0
  116. PaIRS_UniNa/icons/colormaps/spring.png +0 -0
  117. PaIRS_UniNa/icons/colormaps/summer.png +0 -0
  118. PaIRS_UniNa/icons/colormaps/tab10.png +0 -0
  119. PaIRS_UniNa/icons/colormaps/tab20.png +0 -0
  120. PaIRS_UniNa/icons/colormaps/tab20b.png +0 -0
  121. PaIRS_UniNa/icons/colormaps/tab20c.png +0 -0
  122. PaIRS_UniNa/icons/colormaps/terrain.png +0 -0
  123. PaIRS_UniNa/icons/colormaps/twilight.png +0 -0
  124. PaIRS_UniNa/icons/colormaps/viridis.png +0 -0
  125. PaIRS_UniNa/icons/colormaps/whiteVector.png +0 -0
  126. PaIRS_UniNa/icons/colormaps/winter.png +0 -0
  127. PaIRS_UniNa/icons/colormaps/yellowVector.png +0 -0
  128. PaIRS_UniNa/icons/common_region.png +0 -0
  129. PaIRS_UniNa/icons/common_region_off.png +0 -0
  130. PaIRS_UniNa/icons/completed.png +0 -0
  131. PaIRS_UniNa/icons/contourf_off.png +0 -0
  132. PaIRS_UniNa/icons/contourf_on.png +0 -0
  133. PaIRS_UniNa/icons/copy.png +0 -0
  134. PaIRS_UniNa/icons/copy_process.png +0 -0
  135. PaIRS_UniNa/icons/copy_process_off.png +0 -0
  136. PaIRS_UniNa/icons/copygrid.png +0 -0
  137. PaIRS_UniNa/icons/cursor_lamp.png +0 -0
  138. PaIRS_UniNa/icons/cut.png +0 -0
  139. PaIRS_UniNa/icons/cut_warnings.png +0 -0
  140. PaIRS_UniNa/icons/darkmode.png +0 -0
  141. PaIRS_UniNa/icons/debug_run.png +0 -0
  142. PaIRS_UniNa/icons/delete.png +0 -0
  143. PaIRS_UniNa/icons/deleteErr.png +0 -0
  144. PaIRS_UniNa/icons/disp_step.png +0 -0
  145. PaIRS_UniNa/icons/disp_step_off.png +0 -0
  146. PaIRS_UniNa/icons/down.png +0 -0
  147. PaIRS_UniNa/icons/edit_list.png +0 -0
  148. PaIRS_UniNa/icons/editing.png +0 -0
  149. PaIRS_UniNa/icons/example_list.png +0 -0
  150. PaIRS_UniNa/icons/find_all_planes.png +0 -0
  151. PaIRS_UniNa/icons/find_plane.png +0 -0
  152. PaIRS_UniNa/icons/flaticon_PaIRS.png +0 -0
  153. PaIRS_UniNa/icons/flaticon_PaIRS_beta.png +0 -0
  154. PaIRS_UniNa/icons/flaticon_PaIRS_download.png +0 -0
  155. PaIRS_UniNa/icons/flaticon_PaIRS_download_warning.png +0 -0
  156. PaIRS_UniNa/icons/flip_y_off.png +0 -0
  157. PaIRS_UniNa/icons/flip_y_on.png +0 -0
  158. PaIRS_UniNa/icons/focusErrr.png +0 -0
  159. PaIRS_UniNa/icons/gear.gif +0 -0
  160. PaIRS_UniNa/icons/gear.png +0 -0
  161. PaIRS_UniNa/icons/ger.png +0 -0
  162. PaIRS_UniNa/icons/greenv.png +0 -0
  163. PaIRS_UniNa/icons/guide.png +0 -0
  164. PaIRS_UniNa/icons/icon_CalVi.png +0 -0
  165. PaIRS_UniNa/icons/icon_PaIRS.png +0 -0
  166. PaIRS_UniNa/icons/import.png +0 -0
  167. PaIRS_UniNa/icons/import_set.png +0 -0
  168. PaIRS_UniNa/icons/information.png +0 -0
  169. PaIRS_UniNa/icons/input_logo.png +0 -0
  170. PaIRS_UniNa/icons/issue.png +0 -0
  171. PaIRS_UniNa/icons/laser_NTR.png +0 -0
  172. PaIRS_UniNa/icons/laser_TR_double.png +0 -0
  173. PaIRS_UniNa/icons/laser_TR_single.png +0 -0
  174. PaIRS_UniNa/icons/link.png +0 -0
  175. PaIRS_UniNa/icons/linked.png +0 -0
  176. PaIRS_UniNa/icons/loaded.png +0 -0
  177. PaIRS_UniNa/icons/loading_2.gif +0 -0
  178. PaIRS_UniNa/icons/log_logo.png +0 -0
  179. PaIRS_UniNa/icons/logo_CalVi.png +0 -0
  180. PaIRS_UniNa/icons/logo_CalVi_completo.png +0 -0
  181. PaIRS_UniNa/icons/logo_CalVi_party.png +0 -0
  182. PaIRS_UniNa/icons/logo_PaIRS.png +0 -0
  183. PaIRS_UniNa/icons/logo_PaIRS_completo.png +0 -0
  184. PaIRS_UniNa/icons/logo_PaIRS_download.png +0 -0
  185. PaIRS_UniNa/icons/logo_PaIRS_party_rect.png +0 -0
  186. PaIRS_UniNa/icons/logo_PaIRS_rect.png +0 -0
  187. PaIRS_UniNa/icons/logo_opaco.png +0 -0
  188. PaIRS_UniNa/icons/mask.png +0 -0
  189. PaIRS_UniNa/icons/measure.png +0 -0
  190. PaIRS_UniNa/icons/measure_off.png +0 -0
  191. PaIRS_UniNa/icons/min_proc.png +0 -0
  192. PaIRS_UniNa/icons/min_proc_off.png +0 -0
  193. PaIRS_UniNa/icons/min_step.png +0 -0
  194. PaIRS_UniNa/icons/min_step_off.png +0 -0
  195. PaIRS_UniNa/icons/minus.png +0 -0
  196. PaIRS_UniNa/icons/mirror_u.png +0 -0
  197. PaIRS_UniNa/icons/mirror_v.png +0 -0
  198. PaIRS_UniNa/icons/mirror_x.png +0 -0
  199. PaIRS_UniNa/icons/mirror_y.png +0 -0
  200. PaIRS_UniNa/icons/mtplt.png +0 -0
  201. PaIRS_UniNa/icons/new.png +0 -0
  202. PaIRS_UniNa/icons/new_workspace.png +0 -0
  203. PaIRS_UniNa/icons/news.png +0 -0
  204. PaIRS_UniNa/icons/normal_run.png +0 -0
  205. PaIRS_UniNa/icons/open.png +0 -0
  206. PaIRS_UniNa/icons/open_image.png +0 -0
  207. PaIRS_UniNa/icons/open_new_window.png +0 -0
  208. PaIRS_UniNa/icons/open_result.png +0 -0
  209. PaIRS_UniNa/icons/open_workspace.png +0 -0
  210. PaIRS_UniNa/icons/output_logo.png +0 -0
  211. PaIRS_UniNa/icons/paste_above.png +0 -0
  212. PaIRS_UniNa/icons/paste_below.png +0 -0
  213. PaIRS_UniNa/icons/pause.png +0 -0
  214. PaIRS_UniNa/icons/paused.png +0 -0
  215. PaIRS_UniNa/icons/pencil_bw.png +0 -0
  216. PaIRS_UniNa/icons/piv_proc.png +0 -0
  217. PaIRS_UniNa/icons/piv_proc_off.png +0 -0
  218. PaIRS_UniNa/icons/piv_step.png +0 -0
  219. PaIRS_UniNa/icons/piv_step_off.png +0 -0
  220. PaIRS_UniNa/icons/plane.png +0 -0
  221. PaIRS_UniNa/icons/play.png +0 -0
  222. PaIRS_UniNa/icons/plus.png +0 -0
  223. PaIRS_UniNa/icons/process_logo.png +0 -0
  224. PaIRS_UniNa/icons/process_loop.png +0 -0
  225. PaIRS_UniNa/icons/project.png +0 -0
  226. PaIRS_UniNa/icons/pylog.png +0 -0
  227. PaIRS_UniNa/icons/python_warning.png +0 -0
  228. PaIRS_UniNa/icons/queue.png +0 -0
  229. PaIRS_UniNa/icons/quit.png +0 -0
  230. PaIRS_UniNa/icons/read.png +0 -0
  231. PaIRS_UniNa/icons/read_list.png +0 -0
  232. PaIRS_UniNa/icons/redo.png +0 -0
  233. PaIRS_UniNa/icons/redx.png +0 -0
  234. PaIRS_UniNa/icons/reset.png +0 -0
  235. PaIRS_UniNa/icons/reset_levels.png +0 -0
  236. PaIRS_UniNa/icons/resize_icon.png +0 -0
  237. PaIRS_UniNa/icons/restore.png +0 -0
  238. PaIRS_UniNa/icons/restore_undo.png +0 -0
  239. PaIRS_UniNa/icons/rotate_clock.png +0 -0
  240. PaIRS_UniNa/icons/rotate_counter.png +0 -0
  241. PaIRS_UniNa/icons/rotate_v_clock.png +0 -0
  242. PaIRS_UniNa/icons/rotate_v_counter.png +0 -0
  243. PaIRS_UniNa/icons/running.gif +0 -0
  244. PaIRS_UniNa/icons/running.png +0 -0
  245. PaIRS_UniNa/icons/running_warn.png +0 -0
  246. PaIRS_UniNa/icons/sandglass.png +0 -0
  247. PaIRS_UniNa/icons/save.png +0 -0
  248. PaIRS_UniNa/icons/save_and_stop.png +0 -0
  249. PaIRS_UniNa/icons/save_cfg.png +0 -0
  250. PaIRS_UniNa/icons/saveas.png +0 -0
  251. PaIRS_UniNa/icons/saveas_workspace.png +0 -0
  252. PaIRS_UniNa/icons/scale_all.png +0 -0
  253. PaIRS_UniNa/icons/scale_down.png +0 -0
  254. PaIRS_UniNa/icons/scale_up.png +0 -0
  255. PaIRS_UniNa/icons/scan_list.png +0 -0
  256. PaIRS_UniNa/icons/scan_path.png +0 -0
  257. PaIRS_UniNa/icons/search.png +0 -0
  258. PaIRS_UniNa/icons/showIW_off.png +0 -0
  259. PaIRS_UniNa/icons/showIW_on.png +0 -0
  260. PaIRS_UniNa/icons/show_all.png +0 -0
  261. PaIRS_UniNa/icons/sort.png +0 -0
  262. PaIRS_UniNa/icons/sort_reversed.png +0 -0
  263. PaIRS_UniNa/icons/spiv_proc.png +0 -0
  264. PaIRS_UniNa/icons/spiv_proc_off.png +0 -0
  265. PaIRS_UniNa/icons/star.png +0 -0
  266. PaIRS_UniNa/icons/step_inheritance.png +0 -0
  267. PaIRS_UniNa/icons/subMIN_off.png +0 -0
  268. PaIRS_UniNa/icons/subMIN_on.png +0 -0
  269. PaIRS_UniNa/icons/tom.png +0 -0
  270. PaIRS_UniNa/icons/trash.png +0 -0
  271. PaIRS_UniNa/icons/undo.png +0 -0
  272. PaIRS_UniNa/icons/unedited.png +0 -0
  273. PaIRS_UniNa/icons/unina_dii.png +0 -0
  274. PaIRS_UniNa/icons/uninitialized.png +0 -0
  275. PaIRS_UniNa/icons/unlink.png +0 -0
  276. PaIRS_UniNa/icons/unwrap_items.png +0 -0
  277. PaIRS_UniNa/icons/up.png +0 -0
  278. PaIRS_UniNa/icons/updating_import.gif +0 -0
  279. PaIRS_UniNa/icons/updating_pairs.gif +0 -0
  280. PaIRS_UniNa/icons/vectorColor.png +0 -0
  281. PaIRS_UniNa/icons/vettore.png +0 -0
  282. PaIRS_UniNa/icons/view.png +0 -0
  283. PaIRS_UniNa/icons/view_off.png +0 -0
  284. PaIRS_UniNa/icons/vis_logo.png +0 -0
  285. PaIRS_UniNa/icons/waiting_circle.png +0 -0
  286. PaIRS_UniNa/icons/warning.png +0 -0
  287. PaIRS_UniNa/icons/warning_circle.png +0 -0
  288. PaIRS_UniNa/icons/window.png +0 -0
  289. PaIRS_UniNa/icons/workspace.png +0 -0
  290. PaIRS_UniNa/icons/wrap_items.png +0 -0
  291. PaIRS_UniNa/icons/write_list.png +0 -0
  292. PaIRS_UniNa/listLib.py +303 -0
  293. PaIRS_UniNa/mtfPIV.py +256 -0
  294. PaIRS_UniNa/parForMulti.py +435 -0
  295. PaIRS_UniNa/parForWorkers.py +593 -0
  296. PaIRS_UniNa/pivParFor.py +235 -0
  297. PaIRS_UniNa/plt_util.py +141 -0
  298. PaIRS_UniNa/preProcParFor.py +155 -0
  299. PaIRS_UniNa/procTools.py +1394 -0
  300. PaIRS_UniNa/readcfg.py +52 -0
  301. PaIRS_UniNa/rqrdpckgs.txt +9 -0
  302. PaIRS_UniNa/stereoPivParFor.py +227 -0
  303. PaIRS_UniNa/tAVarie.py +215 -0
  304. PaIRS_UniNa/tabSplitter.py +612 -0
  305. PaIRS_UniNa/ui_Calibration_Tab.py +545 -0
  306. PaIRS_UniNa/ui_Custom_Top.py +296 -0
  307. PaIRS_UniNa/ui_Input_Tab.py +1101 -0
  308. PaIRS_UniNa/ui_Input_Tab_CalVi.py +1283 -0
  309. PaIRS_UniNa/ui_Log_Tab.py +263 -0
  310. PaIRS_UniNa/ui_Output_Tab.py +2362 -0
  311. PaIRS_UniNa/ui_Process_Tab.py +3810 -0
  312. PaIRS_UniNa/ui_Process_Tab_CalVi.py +1549 -0
  313. PaIRS_UniNa/ui_Process_Tab_Disp.py +1141 -0
  314. PaIRS_UniNa/ui_Process_Tab_Min.py +437 -0
  315. PaIRS_UniNa/ui_ResizePopup.py +204 -0
  316. PaIRS_UniNa/ui_Vis_Tab.py +1628 -0
  317. PaIRS_UniNa/ui_Vis_Tab_CalVi.py +1251 -0
  318. PaIRS_UniNa/ui_Whatsnew.py +132 -0
  319. PaIRS_UniNa/ui_gPairs.py +877 -0
  320. PaIRS_UniNa/ui_infoPaIRS.py +551 -0
  321. PaIRS_UniNa/whatsnew.txt +5 -0
  322. pairs_unina-0.2.7.dist-info/METADATA +160 -0
  323. pairs_unina-0.2.7.dist-info/RECORD +325 -0
  324. pairs_unina-0.2.7.dist-info/WHEEL +5 -0
  325. pairs_unina-0.2.7.dist-info/top_level.txt +2 -0
@@ -0,0 +1,722 @@
1
+ from .ui_Input_Tab import*
2
+ from .Input_Tab_tools import*
3
+ from .TabTools import*
4
+
5
+ spin_tips={
6
+ 'inp_cam': 'Current camera number (import tool)',
7
+ 'inp_ncam': 'Number of cameras (import tool)',
8
+ 'ind_in': 'First image number',
9
+ 'npairs': 'Number of image pairs',
10
+ 'step': 'Step of image pairs',
11
+ 'img': 'Current image pair number',
12
+ 'cam': 'Current camera number',
13
+ 'ncam': 'Number of cameras',
14
+ 'frame': 'Current frame number',
15
+ }
16
+ check_tips={
17
+ 'TR_Import': 'Time-resolved sequence',
18
+ }
19
+ radio_tips={}
20
+ line_edit_tips={
21
+ 'path': 'Input folder path',
22
+ }
23
+ button_tips={
24
+ 'data': 'Input data set',
25
+ 'path': 'Input folder path',
26
+ 'scan_path': 'Re-scan path',
27
+ 'automatic_list': 'Automatic list setting',
28
+ 'tool_CollapBox_ImSet': 'Open/Close image import tool',
29
+ 'CollapBox_ImSet': 'Image import tool',
30
+ 'automatic_frame': 'Automatic frame setting',
31
+ 'example_list': 'Example list setting',
32
+ 'import': 'Image set import',
33
+ 'scan_list': 'Re-scan list',
34
+ 'warning': 'Warning',
35
+ 'cut_warnings': 'Cut items with warning',
36
+ 'edit_list': 'Edit list',
37
+ 'read_list': 'Read list image file',
38
+ 'write_list': 'Write list image file',
39
+ 'read': 'Read images from disk',
40
+ 'sort': 'Sort images',
41
+ 'sort_reversed': 'Reversly sort images',
42
+ 'wrap_items': 'Expand items',
43
+ 'unwrap_items': 'Collapse items',
44
+ 'copy': 'Copy items',
45
+ 'cut': 'Cut items',
46
+ 'paste_below': 'Paste items below',
47
+ 'paste_above': 'Paste items above',
48
+ 'clean': 'Clean list',
49
+ 'discard_changes': 'Discard changes',
50
+ 'confirm_changes': 'Accept changes',
51
+ 'up': 'Move to the top of the list',
52
+ 'down': 'Move to the bottom of the list',
53
+ }
54
+ combo_tips={
55
+ 'process': 'Type of process',
56
+ 'frame_a': 'Pattern of pattern 1',
57
+ 'frame_b': 'Pattern of pattern 2',
58
+ }
59
+
60
+ class INPpar(TABpar):
61
+ class ImportPar(TABpar):
62
+ def __init__(self,ncam=1):
63
+ self.setup(ncam)
64
+ self.OptionDone=0
65
+ super().__init__('INPpar','Input')
66
+
67
+ def setup(self,ncam=1):
68
+ self.frame_1 = [-1]*ncam
69
+ self.frame_2 = [-1]*ncam
70
+ self.inp_ncam = ncam
71
+ self.inp_cam = 1
72
+ self.ind_in = 0
73
+ self.npairs = 0
74
+ self.step = 0
75
+ self.FlagTR_Import = False
76
+ self.FlagImport = True
77
+
78
+ FlagAutoList = True
79
+ FlagAutoFrame = True
80
+ FlagExample = True
81
+
82
+ def __init__(self,Process=ProcessTypes.null,Step=StepTypes.null):
83
+ self.setup(Process,Step)
84
+ super().__init__('INPpar','Input')
85
+ self.importPar.copyfrom(self,exceptions=['name','surname'])
86
+ self.unchecked_fields+=['FlagCam','OptionValidPath','FlagAutoList','FlagAutoFrame','FlagExample',
87
+ 'inp_cam','nExImTree','exImTreeExp','FlagImport','importPar',
88
+ 'selection','FlagDone','pathCompleter'] #'FlagCollapBox'
89
+
90
+ def setup(self,Process,Step):
91
+ self.Process = Process
92
+ self.Step = Step
93
+ self.FlagCam = False
94
+
95
+ self.path = './'
96
+ self.OptionValidPath = 1
97
+
98
+ self.imSet = ImageSet()
99
+
100
+ #self.FlagCollapBox = True
101
+ self.frame_1 = [-1]
102
+ self.frame_2 = [-1]
103
+ self.inp_ncam = 3 if Process==ProcessTypes.tpiv else 2 if Process==ProcessTypes.spiv else 1
104
+ self.inp_cam = 1
105
+ self.ind_in = 0
106
+ self.npairs = 0
107
+ self.step = 0
108
+ self.FlagTR_Import = False
109
+
110
+ self.nExImTree = 3
111
+ self.exImTreeExp = [False]*self.nExImTree
112
+ self.exImList = [[[],[]]*self.inp_cam]
113
+ self.exImEx = [[[],[]]*self.inp_cam]
114
+
115
+ self.FlagImport = False
116
+ self.importPar = self.ImportPar(self.inp_ncam)
117
+
118
+ self.ncam = self.inp_ncam
119
+ self.imList = [[[],[]] for _ in range(self.ncam)]
120
+ self.imEx = [[[],[]] for _ in range(self.ncam)]
121
+ self.nimg = 0
122
+ self.selection = [0,0,0]
123
+
124
+ self.FlagMIN = Step==StepTypes.min
125
+ self.FlagTR = False
126
+ self.LaserType = 0
127
+ self.imListMin = [[[],[]] for _ in range(self.ncam)]
128
+
129
+ self.FlagCAL = Process in ProcessTypes.threeCameras
130
+ self.calList = []
131
+ self.calEx = []
132
+
133
+ #self.FlagDISP = Step==StepTypes.disp
134
+ #self.dispFile = ''
135
+
136
+ self.pathCompleter=basefold_DEBUGOptions
137
+
138
+ class Input_Tab(gPaIRS_Tab):
139
+ class Import_Tab_Signals(gPaIRS_Tab.Tab_Signals):
140
+ pass
141
+
142
+ def __init__(self,parent: QWidget =None, flagInit= __name__ == "__main__"):
143
+ pri.Time.yellow('Input: init')
144
+ super().__init__(parent,Ui_InputTab,INPpar)
145
+ self.signals=self.Import_Tab_Signals(self)
146
+ pri.Time.yellow('Input: ui')
147
+
148
+ #------------------------------------- Graphical interface: widgets
149
+ self.TABname='Input'
150
+ self.ui: Ui_InputTab
151
+ self.exImTree=self.ui.exImTree=GlobalImageTree(self,FlagNum=True)
152
+ self.ui.g_ImSet_layout.insertWidget(2,self.exImTree)
153
+ self.exImTree.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
154
+ self.exImTree.setSelectionBehavior(QTreeWidget.SelectionBehavior.SelectRows)
155
+ self.exImTree.setHeaderHidden(True)
156
+
157
+ #necessary to change the name and the order of the items
158
+ for g in list(globals()):
159
+ if '_items' in g or '_ord' in g or '_tips' in g:
160
+ #pri.Info.blue(f'Adding {g} to {self.name_tab}')
161
+ setattr(self,g,eval(g))
162
+
163
+ if __name__ == "__main__":
164
+ self.app=app
165
+ setAppGuiPalette(self)
166
+
167
+ #------------------------------------- Graphical interface: miscellanea
168
+ self.pixmap_x = QPixmap(''+ icons_path +'redx.png')
169
+ self.pixmap_v = QPixmap(''+ icons_path +'greenv.png')
170
+ self.pixmap_wait = QPixmap(''+ icons_path +'sandglass.png')
171
+ self.pixmap_warn = QPixmap(u""+ icons_path +"warning.png")
172
+
173
+ #------------------------------------- Declaration of parameters
174
+ self.INPpar_base=INPpar()
175
+ self.INPpar:INPpar=self.TABpar
176
+ self.INPpar_old:INPpar=self.TABpar_old
177
+
178
+ pri.Time.yellow('Input: setupWid and par')
179
+
180
+ #------------------------------------- Callbacks
181
+ self.defineWidgets()
182
+ self.setupWid() #---------------- IMPORTANT
183
+
184
+ self.defineCallbacks()
185
+ self.connectCallbacks()
186
+ self.defineFurtherCallbacks()
187
+
188
+ self.defineSettings()
189
+ self.TABsettings.append(self.image_list_set)
190
+ #self.TABsettings.append(self.button_box_set)
191
+
192
+ self.adjustTABpar=self.adjustINPpar
193
+ self.setTABlayout=self.setINPlayout
194
+ self.checkTABpar=lambda ind: self.checkINPpar(ind,FlagRescan=True)
195
+ self.setTABwarn=self.setINPwarn
196
+ self.disableTab=self.disableInputTab
197
+
198
+ self.ImTreeInd=[]
199
+ self.ui.imTreeWidget.imTree.signals.stopWorker.connect(self.emptyImTreeInd)
200
+ self.ui.imTreeWidget.FlagInGui=True
201
+
202
+ self.FlagScanPath=False
203
+ pri.Time.yellow('Input: define callbacks')
204
+
205
+ #------------------------------------- Initializing
206
+ if flagInit:
207
+ self.initialize()
208
+ #else:
209
+ # self.setTABpar(FlagBridge=False)
210
+
211
+ def defineFurtherCallbacks(self):
212
+ self.ui.button_data.clicked.connect(lambda: downloadExampleData(self,'https://www.pairs.unina.it/web/PIV_data.zip'))
213
+
214
+ #self.button_box_callback=self.wrappedCallback('Open/close Image import tool box',self.button_box_action)
215
+ #self.ui.CollapBox_ImSet.toggle_button.clicked.connect(self.button_box_callback)
216
+ self.ui.spin_inp_cam.valueChanged.connect(self.spin_inp_cam_callback)
217
+ self.ui.spin_inp_cam.addfuncout={}
218
+ itemExpansion_callback=self.wrappedCallback('Item expanded/collapsed',self.itemExpandedCollapsed)
219
+ self.exImTree.itemExpanded.connect(itemExpansion_callback)
220
+ self.exImTree.itemCollapsed.connect(itemExpansion_callback)
221
+
222
+ self.image_list_callback=self.wrappedCallback('Image list change',self.image_list_action)
223
+ self.ui.imTreeWidget.imTrees[0].signals.updateLists.connect(self.image_list_callback)
224
+ #self.selection_callback=self.wrappedCallback('Image list change',self.selection_action)
225
+ self.selection_callback=self.selection_action
226
+ self.ui.imTreeWidget.spin_img.valueChanged.connect(self.selection_callback)
227
+ self.ui.imTreeWidget.spin_cam.valueChanged.connect(self.selection_callback)
228
+ self.ui.imTreeWidget.spin_frame.valueChanged.connect(self.selection_callback)
229
+ self.ui.imTreeWidget.signals.selection.connect(self.selection_callback)
230
+
231
+ def initialize(self):
232
+ pri.Info.yellow(f'{"*"*20} INPUT initialization {"*"*20}')
233
+ from .PaIRS_pypacks import basefold
234
+ #self.ui.imTreeWidget.nullList()
235
+ self.INPpar.Process=ProcessTypes.piv
236
+ self.INPpar.path=basefold_DEBUG if __name__ == "__main__" else basefold
237
+ self.INPpar.imSet.path=self.INPpar.path
238
+ #self.cleanPrevs(self.INPpar.ind,FlagAllPrev=True)
239
+ self.ui.line_edit_path.setText(self.INPpar.path)
240
+ self.line_edit_path_callback()
241
+
242
+ #*************************************************** Adjusting parameters
243
+ def adjustINPpar(self):
244
+ self.INPpar.FlagCam=self.INPpar.Process in ProcessTypes.threeCameras
245
+ if not self.INPpar.FlagCam:
246
+ self.INPpar.inp_ncam=self.INPpar.ncam=self.ncamMinimum()
247
+ else:
248
+ self.INPpar.inp_ncam=self.INPpar.ncam=max([self.INPpar.inp_ncam,self.ncamMinimum()])
249
+ self.INPpar.inp_cam=min([self.INPpar.inp_cam,self.INPpar.inp_ncam])
250
+ if self.INPpar.inp_ncam<self.INPpar_old.inp_ncam:
251
+ del self.INPpar.frame_1[self.INPpar.inp_ncam:]
252
+ del self.INPpar.frame_2[self.INPpar.inp_ncam:]
253
+ elif self.INPpar.inp_ncam>self.INPpar_old.inp_ncam:
254
+ frame_1,frame_2=self.automaticFrames()
255
+ self.INPpar.frame_1[self.INPpar_old.inp_ncam:self.INPpar.inp_ncam]=frame_1[self.INPpar_old.inp_ncam:self.INPpar.inp_ncam]
256
+ self.INPpar.frame_2[self.INPpar_old.inp_ncam:self.INPpar.inp_ncam]=frame_2[self.INPpar_old.inp_ncam:self.INPpar.inp_ncam]
257
+ if len(self.INPpar.frame_1)<self.INPpar.inp_ncam:
258
+ self.INPpar.frame_1+=[self.INPpar.frame_1[0]]*(self.INPpar.inp_ncam-len(self.INPpar.frame_1))
259
+ self.INPpar.frame_2+=[self.INPpar.frame_2[0]]*(self.INPpar.inp_ncam-len(self.INPpar.frame_2))
260
+ #if self.INPpar.isDifferentFrom(self.INPpar_old,fields=['path']):
261
+
262
+ self.INPpar.path=myStandardPath(self.INPpar.path)
263
+ self.INPpar.nimg=0
264
+ if len(self.INPpar.imList[0]):
265
+ if len(self.INPpar.imList[0][0]):
266
+ self.INPpar.nimg=len(self.INPpar.imList[0][0])
267
+ self.checkINPpar(FlagRescan=True)
268
+ if not self.INPpar.OptionValidPath or not self.INPpar.imSet.count: INPpar.FlagExample=False
269
+ self.adjustExampleImageList()
270
+ self.INPpar.FlagImport=self.INPpar.importPar.FlagImport and self.INPpar.importPar.isEqualTo(self.INPpar,exceptions=['name','surname','FlagImport','ind'])
271
+
272
+ #self.INPpar.importPar.printDifferences(self.INPpar,exceptions=['name','surname','FlagImport','ind'],FlagStrictDiff=True)
273
+ return
274
+
275
+ def checkINPpar(self,ind=None,FlagRescan=False): #FlagRescan=False):
276
+ if ind is None: INP:INPpar=self.INPpar
277
+ else: INP:INPpar=self.TABpar_at(ind)
278
+ self.setOptionValidPath(ind)
279
+ FlagWarn=INP.OptionValidPath==0
280
+ if not INP.FlagInit or FlagRescan:
281
+ self.scanImList(ind)
282
+ if not FlagWarn:
283
+ for imExc in INP.imEx:
284
+ for imExf in imExc:
285
+ for ex in imExf:
286
+ if not ex:
287
+ FlagWarn=True
288
+ break
289
+ INP.OptionDone=1 if (len(INP.imList[0][0])>0 and not FlagWarn) else 0 #-1 if len(INP.imList[0][0])>0 else 0
290
+
291
+ def scanImList(self,ind=None):
292
+ if ind: INP:INPpar=self.TABpar_at(ind)
293
+ else: INP:INPpar=self.INPpar
294
+ for c in range(len(INP.imList)): #INP.ncam
295
+ for f in range(2):
296
+ for k in range(len(INP.imList[0][0])): #INP.nimg
297
+ #ex=INP.imEx[c][f][k]
298
+ INP.imEx[c][f][k]=os.path.exists(INP.path+INP.imList[c][f][k]) if INP.imList[c][f][k] else False
299
+
300
+ #*************************************************** Layout
301
+ def setINPlayout(self):
302
+ self.ui.label_process.setVisible(__name__ == "__main__")
303
+ self.ui.combo_process.setVisible(__name__ == "__main__")
304
+ self.setPathLabel()
305
+ self.setPathCompleter()
306
+
307
+ self.ui.g_ImSet.setEnabled(self.INPpar.OptionValidPath and self.INPpar.imSet.count)
308
+ #if self.INPpar.imSet.isDifferentFrom(self.INPpar_old.imSet,fields=['pattern']):
309
+ self.ui.combo_frame_a.clear()
310
+ self.ui.combo_frame_a.addItems(self.INPpar.imSet.pattern)
311
+ self.ui.combo_frame_b.clear()
312
+ self.ui.combo_frame_b.addItems(['-']+self.INPpar.imSet.pattern)
313
+
314
+ self.ui.spin_inp_ncam.setEnabled(self.INPpar.FlagCam)
315
+ self.ui.spin_inp_ncam.setMinimum(self.ncamMinimum())
316
+ self.ui.imTreeWidget.spin_ncam.setEnabled(False)
317
+ self.ui.imTreeWidget.FlagCam=self.INPpar.FlagCam
318
+ self.ui.imTreeWidget.spin_ncam.setMinimum(self.ncamMinimum())
319
+ self.ui.imTreeWidget.spin_ncam.setValue(self.INPpar.importPar.inp_ncam)
320
+ self.ui.spin_inp_cam.setEnabled(self.INPpar.inp_ncam>1)
321
+ self.ui.spin_inp_cam.setMaximum(self.INPpar.inp_ncam)
322
+ self.setImageNumberSpinLimits()
323
+ self.exImTree.setVisible(INPpar.FlagExample)
324
+ self.layoutExampleImageList()
325
+ self.ui.button_import.setEnabled(not self.INPpar.FlagImport)
326
+
327
+ """
328
+ if self.INPpar.ind[-1]<len(self.TABpar_prev_at(self.INPpar.ind))-1:
329
+ self.ui.imTreeWidget.w_button.setVisible(False)
330
+ else:
331
+ self.ui.imTreeWidget.w_button.setVisible(True)
332
+ """
333
+
334
+ self.checkINPpar(FlagRescan=False)
335
+ self.setINPwarn()
336
+ self.setTABWarnLabel()
337
+ return
338
+
339
+ def setINPwarn(self,ind=None):
340
+ if ind is None: INP:INPpar=self.INPpar
341
+ else: INP:INPpar=self.TABpar_at(ind)
342
+ if INP.OptionDone==1:
343
+ INP.warningMessage='Input image files correctly identified!'
344
+ else:
345
+ FlagWarn=False
346
+ for imExc in INP.imEx:
347
+ for imExf in imExc:
348
+ for ex in imExf:
349
+ if not ex:
350
+ FlagWarn=True
351
+ break
352
+ if INP.OptionValidPath==0:
353
+ INP.warningMessage='Invalid input path!'
354
+ elif len(INP.imList[0][0])==0:
355
+ INP.warningMessage='Image set empty!'
356
+ elif FlagWarn:
357
+ INP.warningMessage='Some image files missing!'
358
+ else:
359
+ INP.warningMessage='Issues with identifying input image files!'
360
+
361
+ def ncamMinimum(self):
362
+ return 3 if self.INPpar.Process==ProcessTypes.tpiv else 2 if self.INPpar.Process==ProcessTypes.spiv else 1
363
+
364
+ def disableInputTab(self,flag):
365
+ self.setEnabled(not flag)
366
+
367
+ #*************************************************** Mode
368
+ #******************** Actions
369
+ def combo_process_action(self):
370
+ current_ind=self.ui.combo_process.currentIndex()
371
+ self.INPpar.Process=list(process)[current_ind]
372
+ if self.INPpar.Process in ProcessTypes.threeCameras:
373
+ self.INPpar.ncam=self.INPpar.inp_ncam=max([self.INPpar.ncam,self.ncamMinimum()])
374
+ else:
375
+ self.INPpar.ncam=self.INPpar.inp_ncam=self.ncamMinimum()
376
+
377
+ if INPpar.FlagAutoList:
378
+ self.button_scan_path_action()
379
+ else:
380
+ self.ui.imTreeWidget.spin_ncam.setMinimum(self.ncamMinimum())
381
+ self.ui.imTreeWidget.spin_ncam.setValue(self.INPpar.ncam)
382
+ self.INPpar.imList=self.ui.imTreeWidget.imTree.imList
383
+ self.INPpar.imEx=self.ui.imTreeWidget.imTree.imEx
384
+ self.ui.imTreeWidget.spin_ncam_action()
385
+ return
386
+
387
+ #******************** Set
388
+ def combo_process_set(self):
389
+ current_proc=process[self.INPpar.Process]
390
+ self.ui.combo_process.setCurrentIndex(process_items.index(current_proc))
391
+
392
+ #*************************************************** Path
393
+ #******************** Actions
394
+ def line_edit_path_changing(self):
395
+ self.ui.label_check_path.setPixmap(QPixmap())
396
+
397
+ def line_edit_path_preaction(self):
398
+ currpath=myStandardPath(self.ui.line_edit_path.text())
399
+ self.FlagScanPath=os.path.normpath(self.INPpar.path)!=currpath
400
+ directory_path = myStandardPath(os.getcwd())
401
+ if directory_path in currpath:
402
+ currpath=currpath.replace(directory_path,'./')
403
+ if os.path.exists(currpath):
404
+ if currpath in self.INPpar.pathCompleter: self.INPpar.pathCompleter.remove(currpath)
405
+ self.INPpar.pathCompleter.insert(0,currpath)
406
+ if len(self.INPpar.pathCompleter)>10: self.INPpar.pathCompleter=self.INPpar.pathCompleter[:10]
407
+ self.ui.line_edit_path.setText(currpath)
408
+
409
+ def line_edit_path_action_future(self):
410
+ if self.FlagScanPath:
411
+ self.button_scan_path_action()
412
+
413
+ def button_path_action(self):
414
+ directory = str(QFileDialog.getExistingDirectory(self,\
415
+ "Choose an input folder", dir=self.INPpar.path,options=optionNativeDialog))
416
+ currpath='{}'.format(directory)
417
+ if not currpath=='':
418
+ currpath=myStandardPath(currpath)
419
+ self.ui.line_edit_path.setText(currpath)
420
+ self.INPpar.path=self.ui.line_edit_path.text()
421
+ self.line_edit_path_preaction()
422
+ else:
423
+ currpath='./'
424
+
425
+ def button_path_action_future(self):
426
+ self.line_edit_path_action_future()
427
+
428
+ def button_scan_path_action(self):
429
+ self.INPpar.imSet.scanPath(self.INPpar.path)
430
+ if self.INPpar.imSet.count:
431
+ self.INPpar.frame_1[0]=0
432
+ self.INPpar.frame_1,self.INPpar.frame_2=self.automaticFrames()
433
+ else:
434
+ self.INPpar.frame_1=[-1]*self.INPpar.inp_ncam
435
+ self.INPpar.frame_2=[-1]*self.INPpar.inp_ncam
436
+ self.INPpar.ind_in, _, self.INPpar.npairs, _= self.getIndNpairs()
437
+ self.INPpar.step=1 if self.INPpar.npairs else 0
438
+ if INPpar.FlagAutoList:
439
+ self.button_import_action()
440
+ else:
441
+ self.ui.imTreeWidget.imTree.path=self.INPpar.path
442
+ self.ui.imTreeWidget.imTree.scanLists()
443
+ self.INPpar.imEx=self.ui.imTreeWidget.imTree.imEx
444
+
445
+ def automaticFrames(self):
446
+ cam=self.INPpar.inp_cam-1
447
+ if not self.INPpar.imSet.nimg:
448
+ return self.INPpar.frame_1,self.INPpar.frame_2
449
+ f1=self.INPpar.frame_1[cam]
450
+ link1=self.INPpar.imSet.link[f1]
451
+ nlink1=len(link1)
452
+ frame_1=[f1]*self.INPpar.inp_ncam
453
+ frame_2=[f1+1]*self.INPpar.inp_ncam
454
+ frame_2[0]=link1[0]+1 if link1[0]!=f1 else 0
455
+ for c in range(1,self.INPpar.inp_ncam):
456
+ flagValid=c<nlink1-1
457
+ frame_1[c]=f1c=link1[c] if flagValid else -1
458
+ frame_2[c]=self.INPpar.imSet.link[f1c][0]+1 if flagValid else -1
459
+ if cam:
460
+ frame_1=frame_1[-cam:]+frame_1[:-cam]
461
+ frame_2=frame_2[-cam:]+frame_2[:-cam]
462
+ return frame_1, frame_2
463
+
464
+ def button_automatic_list_action(self):
465
+ INPpar.FlagAutoList=self.ui.button_automatic_list.isChecked()
466
+ return True
467
+
468
+ #******************** Settings
469
+ def setOptionValidPath(self,ind=None):
470
+ if ind is None: INP:INPpar=self.INPpar
471
+ else: INP:INPpar=self.TABpar_at(ind)
472
+ INP.OptionValidPath=int(os.path.exists(INP.path))
473
+ return
474
+
475
+ def setPathCompleter(self):
476
+ self.edit_path_completer=QCompleter(self.INPpar.pathCompleter)
477
+ self.edit_path_completer.setCompletionMode(QCompleter.CompletionMode(1))
478
+ self.edit_path_completer.setModelSorting(QCompleter.ModelSorting(2))
479
+ self.edit_path_completer.setWidget(self.ui.line_edit_path)
480
+ if self.INPpar.path in self.INPpar.pathCompleter:
481
+ k=self.INPpar.pathCompleter.index(self.INPpar.path)
482
+ self.edit_path_completer.setCurrentRow(k)
483
+ self.ui.line_edit_path.setCompleter(self.edit_path_completer)
484
+ self.ui.line_edit_path.FlagCompleter=True
485
+
486
+ def button_automatic_list_set(self):
487
+ self.ui.button_automatic_list.setChecked(INPpar.FlagAutoList)
488
+
489
+ #******************** Layout
490
+ def setPathLabel(self):
491
+ #Clickable label: no need for setStatusTip
492
+ if self.INPpar.OptionValidPath==1:
493
+ self.ui.label_check_path.setPixmap(self.pixmap_v)
494
+ self.ui.label_check_path.setToolTip("The specified path of the input folder exists!")
495
+ elif self.INPpar.OptionValidPath==0:
496
+ self.ui.label_check_path.setPixmap(self.pixmap_x)
497
+ self.ui.label_check_path.setToolTip("The specified path of the input folder does not exist!")
498
+ elif self.INPpar.OptionValidPath==-10:
499
+ self.ui.label_check_path.setPixmap(self.pixmap_wait)
500
+ self.ui.label_check_path.setToolTip("The specified path of the input folder is currently under inspection!")
501
+
502
+ #*************************************************** Image import tool
503
+ #******************** Actions
504
+ """
505
+ def button_box_action(self):
506
+ self.INPpar.FlagCollapBox=self.ui.CollapBox_ImSet.toggle_button.isChecked()
507
+ return True
508
+ """
509
+
510
+ def button_automatic_frame_action(self):
511
+ INPpar.FlagAutoFrame=self.ui.button_automatic_frame.isChecked()
512
+ return True
513
+
514
+ def combo_frame_a_action(self):
515
+ self.INPpar.frame_1[self.INPpar.inp_cam-1]=self.ui.combo_frame_a.currentIndex()
516
+ if INPpar.FlagAutoFrame:
517
+ self.INPpar.frame_1,self.INPpar.frame_2=self.automaticFrames()
518
+ self.INPpar.ind_in, _, self.INPpar.npairs, _= self.getIndNpairs()
519
+
520
+ def combo_frame_b_action(self):
521
+ self.INPpar.frame_2[self.INPpar.inp_cam-1]=self.ui.combo_frame_b.currentIndex()
522
+
523
+ def button_example_list_action(self):
524
+ INPpar.FlagExample=self.ui.button_example_list.isChecked()
525
+ self.exImTree.setVisible(INPpar.FlagExample)
526
+ return True
527
+
528
+ def spin_inp_cam_action(self):
529
+ if INPpar.FlagExample:
530
+ items=[self.exImTree.topLevelItem(0)] if not self.exImTree.selectedItems() else self.exImTree.selectedItems()
531
+ self.exImTree.clearSelection()
532
+ for item in items:
533
+ if item.parent(): item=item.parent()
534
+ if self.INPpar.inp_cam-1:
535
+ if not item.isExpanded():
536
+ self.INPpar.exImTreeExp[self.exImTree.indexOfTopLevelItem(item)]=True
537
+ item=item.child(self.INPpar.inp_cam-2)
538
+ item.setSelected(True)
539
+
540
+ def button_import_action(self):
541
+ INPpar.FlagExample=False
542
+ self.INPpar.imList,self.INPpar.imEx=self.INPpar.imSet.genListsFromFrame(self.INPpar.frame_1,self.INPpar.frame_2,self.INPpar.ind_in,self.INPpar.npairs,self.INPpar.step,self.INPpar.FlagTR_Import)
543
+ self.INPpar.selection=[1,1,1]
544
+ self.InputAdjustSelection()
545
+ if self.INPpar.isDifferentFrom(self.INPpar_old,fields=['imList','imEx']):
546
+ self.INPpar.FlagImport=True
547
+ self.INPpar.importPar.copyfrom(self.INPpar,exceptions=['name','surname'])
548
+ self.ui.CollapBox_ImSet.toggle_button.click()
549
+ self.ui.imTreeWidget.setFocus()
550
+
551
+ #******************** Settings
552
+ """
553
+ def button_box_set(self):
554
+ if self.INPpar.FlagCollapBox:
555
+ self.ui.CollapBox_ImSet.openBox()
556
+ else:
557
+ self.ui.CollapBox_ImSet.closeBox()
558
+ """
559
+
560
+ def button_automatic_frame_set(self):
561
+ self.ui.button_automatic_frame.setChecked(INPpar.FlagAutoFrame)
562
+
563
+ def combo_frame_a_set(self):
564
+ i=self.INPpar.frame_1[self.INPpar.inp_cam-1]
565
+ self.ui.combo_frame_a.setCurrentIndex(i)
566
+
567
+ def combo_frame_b_set(self):
568
+ i=self.INPpar.frame_2[self.INPpar.inp_cam-1]
569
+ self.ui.combo_frame_b.setCurrentIndex(i)
570
+
571
+ def button_example_list_set(self):
572
+ self.ui.button_example_list.setChecked(INPpar.FlagExample)
573
+
574
+ #******************** Layout & Adjustments
575
+ def setImageNumberSpinLimits(self):
576
+ if self.INPpar.isDifferentFrom(self.INPpar_old,fields=['imSet','frame_1','frame_2','inp_ncam','FlagTR_Import']):
577
+ ind_in, ind_fin, npairs, npairs_max= self.getIndNpairs()
578
+ self.INPpar.ind_in=min([max([ind_in,self.INPpar.ind_in]),ind_fin])
579
+ self.INPpar.npairs=npairs if self.INPpar.isDifferentFrom(self.INPpar_old,fields=['FlagTR_Import']) else min([self.INPpar.npairs,npairs])
580
+ self.INPpar.step=min([self.INPpar.step,npairs])
581
+
582
+ self.ui.spin_ind_in.setMinimum(ind_in)
583
+ self.ui.spin_ind_in.setMaximum(ind_fin)
584
+ s_ind_in=formatNumber(self.ui.spin_ind_in,ind_in)
585
+ s_ind_fin=formatNumber(self.ui.spin_ind_in,ind_fin)
586
+ self.ui.spin_ind_in.setToolTip(f'Number of the first image in the sequence to process. Min.: {s_ind_in}, max: {s_ind_fin}')
587
+ self.ui.spin_ind_in.setStatusTip(self.ui.spin_ind_in.toolTip())
588
+
589
+ self.ui.spin_npairs.setMinimum(0)
590
+ self.ui.spin_npairs.setMaximum(npairs_max)
591
+ self.ui.spin_npairs.setToolTip(f'Number of image pairs to process. Max: {npairs_max}')
592
+ self.ui.spin_npairs.setStatusTip(self.ui.spin_npairs.toolTip())
593
+
594
+ self.ui.spin_step.setMinimum(1)
595
+ self.ui.spin_step.setMaximum(npairs_max)
596
+ #ind_in=self.INPpar.imSet.ind_in[self.INPpar.frame_a]
597
+ pass
598
+
599
+ def getIndNpairs(self):
600
+ if self.INPpar.imSet.count:
601
+ l=[self.INPpar.imSet.ind_in[f] for f in self.INPpar.frame_1 if f>-1]
602
+ ind_in_1=min(l) if l else None
603
+ l=[self.INPpar.imSet.ind_in[f-1] for f in self.INPpar.frame_2 if f>0]
604
+ ind_in_2=min(l) if l else ind_in_1 if ind_in_1 is not None else None
605
+ ind_in=min([ind_in_1,ind_in_2]) if ind_in_2 is not None else 0
606
+
607
+ l=[self.INPpar.imSet.ind_fin[f] for f in self.INPpar.frame_1 if f>-1]
608
+ ind_fin_1=max(l) if l else None
609
+ l=[self.INPpar.imSet.ind_fin[f-1] for f in self.INPpar.frame_2 if f>0]
610
+ ind_fin_2=max(l) if l else ind_fin_1 if ind_fin_1 is not None else None
611
+ ind_fin=min([ind_fin_1,ind_fin_2]) if ind_fin_2 is not None else -1
612
+ else:
613
+ ind_in=ind_in_2=0
614
+ ind_fin=-1
615
+ npairs=nimg=ind_fin-ind_in+1
616
+ if not all(self.INPpar.frame_2):
617
+ npairs=int(npairs/2)
618
+ if self.INPpar.FlagTR_Import:
619
+ npairs=2*npairs-1+nimg%2 #(1+int(any(self.INPpar.frame_2)))*npairs-1
620
+ if npairs==0: ind_in=ind_fin=0
621
+ npairs_max=npairs
622
+ return ind_in, ind_fin, npairs, npairs_max
623
+
624
+ def adjustExampleImageList(self):
625
+ exImListPar=['path','frame_1','frame_2','inp_ncam','ind_in','npairs','step','FlagTR_Import']
626
+ if self.INPpar.isDifferentFrom(self.INPpar_old,fields=exImListPar):
627
+ #self.INPpar_old.printDifferences(self.INPpar,fields=exImListPar)
628
+ self.INPpar.exImList,self.INPpar.exImEx=self.INPpar.imSet.genListsFromFrame(self.INPpar.frame_1,self.INPpar.frame_2,self.INPpar.ind_in,min([self.INPpar.npairs,self.INPpar.nExImTree]),self.INPpar.step,self.INPpar.FlagTR_Import)
629
+
630
+ def layoutExampleImageList(self):
631
+ if self.exImTree.imEx!=self.INPpar.exImEx or self.exImTree.imList!=self.INPpar.exImList:
632
+ self.exImTree.imList=self.INPpar.exImList
633
+ self.exImTree.imEx=self.INPpar.exImEx
634
+ self.exImTree.ncam=self.INPpar.ncam
635
+ self.exImTree.setImListEx()
636
+ self.exImTree.path=self.INPpar.path
637
+ self.exImTree.ncam=self.INPpar.inp_ncam
638
+ self.exImTree.setLists(FlagAsync=False)
639
+ self.exImTree.resizeColumnToContents(2)
640
+ if self.INPpar.inp_ncam==1: self.INPpar.exImTreeExp=[False]*3
641
+ height=self.exImTree.header().height()+5
642
+ #itemHeight=20
643
+ #height=itemHeight+5
644
+ for i in range(3):
645
+ item = self.exImTree.topLevelItem(i)
646
+ if not item: continue
647
+ item.setExpanded(self.INPpar.exImTreeExp[i])
648
+ height+=self.exImTree.visualItemRect(item).height()
649
+ for c in range(item.childCount()):
650
+ height+=self.exImTree.visualItemRect(item.child(c)).height()
651
+ #if self.INPpar.exImTreeExp[i]:
652
+ # height+=item.childCount()*itemHeight
653
+ #else: height+=itemHeight
654
+ self.exImTree.setMinimumHeight(height)
655
+ self.exImTree.setMaximumHeight(height)
656
+ self.exImTree.verticalScrollBar().setMinimumHeight(height)
657
+ self.exImTree.verticalScrollBar().setMaximumHeight(height)
658
+ self.ui.CollapBox_ImSet.heightArea=height+110 if INPpar.FlagExample else 110
659
+ self.ui.CollapBox_ImSet.heightOpened=self.ui.CollapBox_ImSet.heightArea+20
660
+ self.ui.CollapBox_ImSet.on_click()
661
+
662
+ def itemExpandedCollapsed(self):
663
+ for i in range(self.exImTree.topLevelItemCount()):
664
+ item = self.exImTree.topLevelItem(i)
665
+ self.INPpar.exImTreeExp[i]=item.isExpanded()
666
+ self.layoutExampleImageList()
667
+ return True
668
+
669
+ #*************************************************** Image import tool
670
+ #******************** Actions
671
+ def image_list_action(self):
672
+ self.INPpar.imList=self.ui.imTreeWidget.imTree.imList
673
+ self.INPpar.imEx=self.ui.imTreeWidget.imTree.imEx
674
+ FlagDifferent=self.INPpar.isDifferentFrom(self.INPpar_old,fields=['imList'])
675
+ self.INPpar.FlagImport=False
676
+ return not FlagDifferent
677
+
678
+ def selection_action(self):
679
+ if QApplication.keyboardModifiers(): return
680
+ w=self.ui.imTreeWidget
681
+ if w.imTree.FlagSetting: return
682
+ self.INPpar.selection=[w.spin_img.value(),w.spin_cam.value(),w.spin_frame.value()]
683
+ self.InputAdjustSelection()
684
+ if not TABpar.FlagSettingPar and not self.FlagSettingPar:
685
+ FlagAdjustPar=True
686
+ self.setTABpar_bridge(FlagAdjustPar,FlagCallback=True)
687
+ return True
688
+
689
+ def InputAdjustSelection(self,INP:INPpar=None):
690
+ if INP is None: INP=self.INPpar
691
+ if len(self.TABpar_prev_at(INP.ind)):
692
+ self.TABpar_at(INP.ind).selection=copy.deepcopy(INP.selection)
693
+
694
+ #******************** Settings
695
+ def image_list_set(self):
696
+ FlagNewLists=self.INPpar.isDifferentFrom(self.ui.imTreeWidget.imTree,fields=['imList','imEx'])
697
+ if FlagNewLists and (not self.ImTreeInd or self.ImTreeInd!=self.INPpar.ind) and (self.ui.imTreeWidget.imTree.itemWorker is None or self.INPpar.ind!=self.INPpar_old.ind):
698
+ self.ImTreeInd=copy.deepcopy(self.INPpar.ind)
699
+ self.ui.imTreeWidget.imTree.signals.updateLists.disconnect()
700
+ self.ui.imTreeWidget.imTree.signals.updateLists.connect(self.restoreSignal)
701
+ self.ui.imTreeWidget.setLists(self.INPpar.path,self.INPpar.imList,self.INPpar.imEx,selection=self.INPpar.selection,FlagOnlyPrepare=not FlagNewLists)
702
+ if not FlagNewLists: self.restoreSignal()
703
+ self.ui.imTreeWidget.imTree.spinSelection(self.INPpar.selection)
704
+
705
+ def emptyImTreeInd(self):
706
+ self.ImTreeInd=[]
707
+
708
+ @Slot()
709
+ def restoreSignal(self):
710
+ self.ui.imTreeWidget.imTree.signals.updateLists.disconnect()
711
+ self.ui.imTreeWidget.imTree.signals.updateLists.connect(self.image_list_callback)
712
+
713
+ if __name__ == "__main__":
714
+ import sys
715
+ app=QApplication.instance()
716
+ if not app:app = QApplication(sys.argv)
717
+ app.setStyle('Fusion')
718
+ object = Input_Tab(None)
719
+ object.show()
720
+ app.exec()
721
+ app.quit()
722
+ app=None