PaIRS-UniNa 0.2.9__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.
Files changed (333) hide show
  1. PaIRS_UniNa/Calibration_Tab.py +346 -0
  2. PaIRS_UniNa/Changes.txt +162 -0
  3. PaIRS_UniNa/Custom_Top.py +303 -0
  4. PaIRS_UniNa/Explorer.py +3168 -0
  5. PaIRS_UniNa/FolderLoop.py +562 -0
  6. PaIRS_UniNa/Input_Tab.py +831 -0
  7. PaIRS_UniNa/Input_Tab_CalVi.py +786 -0
  8. PaIRS_UniNa/Input_Tab_tools.py +3022 -0
  9. PaIRS_UniNa/Log_Tab.py +110 -0
  10. PaIRS_UniNa/Output_Tab.py +922 -0
  11. PaIRS_UniNa/PaIRS.py +18 -0
  12. PaIRS_UniNa/PaIRS_PIV.py +873 -0
  13. PaIRS_UniNa/PaIRS_pypacks.py +1421 -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/SPIVCalHelp.py +155 -0
  20. PaIRS_UniNa/Saving_tools.py +296 -0
  21. PaIRS_UniNa/TabTools.py +1254 -0
  22. PaIRS_UniNa/Vis_Tab.py +2169 -0
  23. PaIRS_UniNa/Vis_Tab_CalVi.py +983 -0
  24. PaIRS_UniNa/Whatsnew.py +130 -0
  25. PaIRS_UniNa/_PaIRS_PIV.so +0 -0
  26. PaIRS_UniNa/__init__.py +6 -0
  27. PaIRS_UniNa/__main__.py +45 -0
  28. PaIRS_UniNa/addwidgets_ps.py +1133 -0
  29. PaIRS_UniNa/calib.py +1488 -0
  30. PaIRS_UniNa/calibView.py +833 -0
  31. PaIRS_UniNa/gPaIRS.py +3914 -0
  32. PaIRS_UniNa/gPalette.py +189 -0
  33. PaIRS_UniNa/icons/abort.png +0 -0
  34. PaIRS_UniNa/icons/about.png +0 -0
  35. PaIRS_UniNa/icons/align_all.png +0 -0
  36. PaIRS_UniNa/icons/announcement.png +0 -0
  37. PaIRS_UniNa/icons/automatic_levels_off.png +0 -0
  38. PaIRS_UniNa/icons/automatic_levels_on.png +0 -0
  39. PaIRS_UniNa/icons/automatic_off.png +0 -0
  40. PaIRS_UniNa/icons/automatic_on.png +0 -0
  41. PaIRS_UniNa/icons/automatic_size_off.png +0 -0
  42. PaIRS_UniNa/icons/automatic_size_on.png +0 -0
  43. PaIRS_UniNa/icons/axes.png +0 -0
  44. PaIRS_UniNa/icons/background.png +0 -0
  45. PaIRS_UniNa/icons/background_vectors.png +0 -0
  46. PaIRS_UniNa/icons/bin_off.png +0 -0
  47. PaIRS_UniNa/icons/bin_on.png +0 -0
  48. PaIRS_UniNa/icons/browse_file_c.png +0 -0
  49. PaIRS_UniNa/icons/browse_folder_c.png +0 -0
  50. PaIRS_UniNa/icons/brush_cursor.png +0 -0
  51. PaIRS_UniNa/icons/bugfix.png +0 -0
  52. PaIRS_UniNa/icons/cal_proc.png +0 -0
  53. PaIRS_UniNa/icons/cal_proc_off.png +0 -0
  54. PaIRS_UniNa/icons/cal_step.png +0 -0
  55. PaIRS_UniNa/icons/cal_step_off.png +0 -0
  56. PaIRS_UniNa/icons/calibrate.png +0 -0
  57. PaIRS_UniNa/icons/calibration_logo.png +0 -0
  58. PaIRS_UniNa/icons/change_folder.png +0 -0
  59. PaIRS_UniNa/icons/change_folder_off.png +0 -0
  60. PaIRS_UniNa/icons/checklist.png +0 -0
  61. PaIRS_UniNa/icons/clean.png +0 -0
  62. PaIRS_UniNa/icons/clean_run.png +0 -0
  63. PaIRS_UniNa/icons/close.png +0 -0
  64. PaIRS_UniNa/icons/close_all.png +0 -0
  65. PaIRS_UniNa/icons/close_project.png +0 -0
  66. PaIRS_UniNa/icons/close_workspace.png +0 -0
  67. PaIRS_UniNa/icons/colormap.png +0 -0
  68. PaIRS_UniNa/icons/colormaps/Accent.png +0 -0
  69. PaIRS_UniNa/icons/colormaps/BrBG.png +0 -0
  70. PaIRS_UniNa/icons/colormaps/Dark2.png +0 -0
  71. PaIRS_UniNa/icons/colormaps/PRGn.png +0 -0
  72. PaIRS_UniNa/icons/colormaps/Paired.png +0 -0
  73. PaIRS_UniNa/icons/colormaps/Pastel1.png +0 -0
  74. PaIRS_UniNa/icons/colormaps/Pastel2.png +0 -0
  75. PaIRS_UniNa/icons/colormaps/PiYG.png +0 -0
  76. PaIRS_UniNa/icons/colormaps/PuOr.png +0 -0
  77. PaIRS_UniNa/icons/colormaps/RdBu.png +0 -0
  78. PaIRS_UniNa/icons/colormaps/RdGy.png +0 -0
  79. PaIRS_UniNa/icons/colormaps/RdYlBu.png +0 -0
  80. PaIRS_UniNa/icons/colormaps/RdYlGn.png +0 -0
  81. PaIRS_UniNa/icons/colormaps/Set1.png +0 -0
  82. PaIRS_UniNa/icons/colormaps/Set2.png +0 -0
  83. PaIRS_UniNa/icons/colormaps/Set3.png +0 -0
  84. PaIRS_UniNa/icons/colormaps/Spectral.png +0 -0
  85. PaIRS_UniNa/icons/colormaps/Wistia.png +0 -0
  86. PaIRS_UniNa/icons/colormaps/afmhot.png +0 -0
  87. PaIRS_UniNa/icons/colormaps/autumn.png +0 -0
  88. PaIRS_UniNa/icons/colormaps/binary.png +0 -0
  89. PaIRS_UniNa/icons/colormaps/blackVector.png +0 -0
  90. PaIRS_UniNa/icons/colormaps/blueVector.png +0 -0
  91. PaIRS_UniNa/icons/colormaps/bone.png +0 -0
  92. PaIRS_UniNa/icons/colormaps/brg.png +0 -0
  93. PaIRS_UniNa/icons/colormaps/bwr.png +0 -0
  94. PaIRS_UniNa/icons/colormaps/cividis.png +0 -0
  95. PaIRS_UniNa/icons/colormaps/cool.png +0 -0
  96. PaIRS_UniNa/icons/colormaps/coolwarm.png +0 -0
  97. PaIRS_UniNa/icons/colormaps/copper.png +0 -0
  98. PaIRS_UniNa/icons/colormaps/cubehelix.png +0 -0
  99. PaIRS_UniNa/icons/colormaps/cyanVector.png +0 -0
  100. PaIRS_UniNa/icons/colormaps/flag.png +0 -0
  101. PaIRS_UniNa/icons/colormaps/gist_heat.png +0 -0
  102. PaIRS_UniNa/icons/colormaps/gray.png +0 -0
  103. PaIRS_UniNa/icons/colormaps/greenVector.png +0 -0
  104. PaIRS_UniNa/icons/colormaps/hot.png +0 -0
  105. PaIRS_UniNa/icons/colormaps/hsv.png +0 -0
  106. PaIRS_UniNa/icons/colormaps/inferno.png +0 -0
  107. PaIRS_UniNa/icons/colormaps/jet.png +0 -0
  108. PaIRS_UniNa/icons/colormaps/magentaVector.png +0 -0
  109. PaIRS_UniNa/icons/colormaps/magma.png +0 -0
  110. PaIRS_UniNa/icons/colormaps/ocean.png +0 -0
  111. PaIRS_UniNa/icons/colormaps/pink.png +0 -0
  112. PaIRS_UniNa/icons/colormaps/plasma.png +0 -0
  113. PaIRS_UniNa/icons/colormaps/prism.png +0 -0
  114. PaIRS_UniNa/icons/colormaps/rainbow.png +0 -0
  115. PaIRS_UniNa/icons/colormaps/redVector.png +0 -0
  116. PaIRS_UniNa/icons/colormaps/seismic.png +0 -0
  117. PaIRS_UniNa/icons/colormaps/spring.png +0 -0
  118. PaIRS_UniNa/icons/colormaps/summer.png +0 -0
  119. PaIRS_UniNa/icons/colormaps/tab10.png +0 -0
  120. PaIRS_UniNa/icons/colormaps/tab20.png +0 -0
  121. PaIRS_UniNa/icons/colormaps/tab20b.png +0 -0
  122. PaIRS_UniNa/icons/colormaps/tab20c.png +0 -0
  123. PaIRS_UniNa/icons/colormaps/terrain.png +0 -0
  124. PaIRS_UniNa/icons/colormaps/twilight.png +0 -0
  125. PaIRS_UniNa/icons/colormaps/viridis.png +0 -0
  126. PaIRS_UniNa/icons/colormaps/whiteVector.png +0 -0
  127. PaIRS_UniNa/icons/colormaps/winter.png +0 -0
  128. PaIRS_UniNa/icons/colormaps/yellowVector.png +0 -0
  129. PaIRS_UniNa/icons/common_region.png +0 -0
  130. PaIRS_UniNa/icons/common_region_off.png +0 -0
  131. PaIRS_UniNa/icons/completed.png +0 -0
  132. PaIRS_UniNa/icons/contourf_off.png +0 -0
  133. PaIRS_UniNa/icons/contourf_on.png +0 -0
  134. PaIRS_UniNa/icons/copy.png +0 -0
  135. PaIRS_UniNa/icons/copy_process.png +0 -0
  136. PaIRS_UniNa/icons/copy_process_off.png +0 -0
  137. PaIRS_UniNa/icons/copygrid.png +0 -0
  138. PaIRS_UniNa/icons/cursor_lamp.png +0 -0
  139. PaIRS_UniNa/icons/cut.png +0 -0
  140. PaIRS_UniNa/icons/cut_warnings.png +0 -0
  141. PaIRS_UniNa/icons/darkmode.png +0 -0
  142. PaIRS_UniNa/icons/debug_run.png +0 -0
  143. PaIRS_UniNa/icons/delete.png +0 -0
  144. PaIRS_UniNa/icons/deleteErr.png +0 -0
  145. PaIRS_UniNa/icons/disp_step.png +0 -0
  146. PaIRS_UniNa/icons/disp_step_off.png +0 -0
  147. PaIRS_UniNa/icons/down.png +0 -0
  148. PaIRS_UniNa/icons/edit_list.png +0 -0
  149. PaIRS_UniNa/icons/editing.png +0 -0
  150. PaIRS_UniNa/icons/example_list.png +0 -0
  151. PaIRS_UniNa/icons/find_all_planes.png +0 -0
  152. PaIRS_UniNa/icons/find_plane.png +0 -0
  153. PaIRS_UniNa/icons/flaticon_PaIRS.png +0 -0
  154. PaIRS_UniNa/icons/flaticon_PaIRS_beta.png +0 -0
  155. PaIRS_UniNa/icons/flaticon_PaIRS_download.png +0 -0
  156. PaIRS_UniNa/icons/flaticon_PaIRS_download_warning.png +0 -0
  157. PaIRS_UniNa/icons/flip_y_off.png +0 -0
  158. PaIRS_UniNa/icons/flip_y_on.png +0 -0
  159. PaIRS_UniNa/icons/focusErrr.png +0 -0
  160. PaIRS_UniNa/icons/folder_loop_cleanup.png +0 -0
  161. PaIRS_UniNa/icons/folder_loop_cleanup_off.png +0 -0
  162. PaIRS_UniNa/icons/gear.gif +0 -0
  163. PaIRS_UniNa/icons/gear.png +0 -0
  164. PaIRS_UniNa/icons/ger.png +0 -0
  165. PaIRS_UniNa/icons/greenv.png +0 -0
  166. PaIRS_UniNa/icons/guide.png +0 -0
  167. PaIRS_UniNa/icons/icon_CalVi.png +0 -0
  168. PaIRS_UniNa/icons/icon_PaIRS.png +0 -0
  169. PaIRS_UniNa/icons/import.png +0 -0
  170. PaIRS_UniNa/icons/import_set.png +0 -0
  171. PaIRS_UniNa/icons/information.png +0 -0
  172. PaIRS_UniNa/icons/information2.png +0 -0
  173. PaIRS_UniNa/icons/input_logo.png +0 -0
  174. PaIRS_UniNa/icons/issue.png +0 -0
  175. PaIRS_UniNa/icons/laser_NTR.png +0 -0
  176. PaIRS_UniNa/icons/laser_TR_double.png +0 -0
  177. PaIRS_UniNa/icons/laser_TR_single.png +0 -0
  178. PaIRS_UniNa/icons/link.png +0 -0
  179. PaIRS_UniNa/icons/linked.png +0 -0
  180. PaIRS_UniNa/icons/loaded.png +0 -0
  181. PaIRS_UniNa/icons/loading_2.gif +0 -0
  182. PaIRS_UniNa/icons/log_logo.png +0 -0
  183. PaIRS_UniNa/icons/logo_CalVi.png +0 -0
  184. PaIRS_UniNa/icons/logo_CalVi_completo.png +0 -0
  185. PaIRS_UniNa/icons/logo_CalVi_party.png +0 -0
  186. PaIRS_UniNa/icons/logo_PaIRS.png +0 -0
  187. PaIRS_UniNa/icons/logo_PaIRS_completo.png +0 -0
  188. PaIRS_UniNa/icons/logo_PaIRS_download.png +0 -0
  189. PaIRS_UniNa/icons/logo_PaIRS_party_rect.png +0 -0
  190. PaIRS_UniNa/icons/logo_PaIRS_rect.png +0 -0
  191. PaIRS_UniNa/icons/logo_opaco.png +0 -0
  192. PaIRS_UniNa/icons/mask.png +0 -0
  193. PaIRS_UniNa/icons/measure.png +0 -0
  194. PaIRS_UniNa/icons/measure_off.png +0 -0
  195. PaIRS_UniNa/icons/min_proc.png +0 -0
  196. PaIRS_UniNa/icons/min_proc_off.png +0 -0
  197. PaIRS_UniNa/icons/min_step.png +0 -0
  198. PaIRS_UniNa/icons/min_step_off.png +0 -0
  199. PaIRS_UniNa/icons/minus.png +0 -0
  200. PaIRS_UniNa/icons/mirror_u.png +0 -0
  201. PaIRS_UniNa/icons/mirror_v.png +0 -0
  202. PaIRS_UniNa/icons/mirror_x.png +0 -0
  203. PaIRS_UniNa/icons/mirror_y.png +0 -0
  204. PaIRS_UniNa/icons/mtplt.png +0 -0
  205. PaIRS_UniNa/icons/new.png +0 -0
  206. PaIRS_UniNa/icons/new_workspace.png +0 -0
  207. PaIRS_UniNa/icons/news.png +0 -0
  208. PaIRS_UniNa/icons/normal_run.png +0 -0
  209. PaIRS_UniNa/icons/open.png +0 -0
  210. PaIRS_UniNa/icons/open_image.png +0 -0
  211. PaIRS_UniNa/icons/open_new_window.png +0 -0
  212. PaIRS_UniNa/icons/open_result.png +0 -0
  213. PaIRS_UniNa/icons/open_workspace.png +0 -0
  214. PaIRS_UniNa/icons/output_logo.png +0 -0
  215. PaIRS_UniNa/icons/paste_above.png +0 -0
  216. PaIRS_UniNa/icons/paste_below.png +0 -0
  217. PaIRS_UniNa/icons/pause.png +0 -0
  218. PaIRS_UniNa/icons/paused.png +0 -0
  219. PaIRS_UniNa/icons/pencil_bw.png +0 -0
  220. PaIRS_UniNa/icons/piv_proc.png +0 -0
  221. PaIRS_UniNa/icons/piv_proc_off.png +0 -0
  222. PaIRS_UniNa/icons/piv_step.png +0 -0
  223. PaIRS_UniNa/icons/piv_step_off.png +0 -0
  224. PaIRS_UniNa/icons/plane.png +0 -0
  225. PaIRS_UniNa/icons/play.png +0 -0
  226. PaIRS_UniNa/icons/plus.png +0 -0
  227. PaIRS_UniNa/icons/process_logo.png +0 -0
  228. PaIRS_UniNa/icons/process_loop.png +0 -0
  229. PaIRS_UniNa/icons/project.png +0 -0
  230. PaIRS_UniNa/icons/pylog.png +0 -0
  231. PaIRS_UniNa/icons/python_warning.png +0 -0
  232. PaIRS_UniNa/icons/queue.png +0 -0
  233. PaIRS_UniNa/icons/quit.png +0 -0
  234. PaIRS_UniNa/icons/read.png +0 -0
  235. PaIRS_UniNa/icons/read_list.png +0 -0
  236. PaIRS_UniNa/icons/redo.png +0 -0
  237. PaIRS_UniNa/icons/redx.png +0 -0
  238. PaIRS_UniNa/icons/reset.png +0 -0
  239. PaIRS_UniNa/icons/reset_levels.png +0 -0
  240. PaIRS_UniNa/icons/resize_icon.png +0 -0
  241. PaIRS_UniNa/icons/restore.png +0 -0
  242. PaIRS_UniNa/icons/restore_undo.png +0 -0
  243. PaIRS_UniNa/icons/rotate_clock.png +0 -0
  244. PaIRS_UniNa/icons/rotate_counter.png +0 -0
  245. PaIRS_UniNa/icons/rotate_v_clock.png +0 -0
  246. PaIRS_UniNa/icons/rotate_v_counter.png +0 -0
  247. PaIRS_UniNa/icons/running.gif +0 -0
  248. PaIRS_UniNa/icons/running.png +0 -0
  249. PaIRS_UniNa/icons/running_warn.png +0 -0
  250. PaIRS_UniNa/icons/sandglass.png +0 -0
  251. PaIRS_UniNa/icons/save.png +0 -0
  252. PaIRS_UniNa/icons/save_and_stop.png +0 -0
  253. PaIRS_UniNa/icons/save_cfg.png +0 -0
  254. PaIRS_UniNa/icons/saveas.png +0 -0
  255. PaIRS_UniNa/icons/saveas_workspace.png +0 -0
  256. PaIRS_UniNa/icons/scale_all.png +0 -0
  257. PaIRS_UniNa/icons/scale_down.png +0 -0
  258. PaIRS_UniNa/icons/scale_up.png +0 -0
  259. PaIRS_UniNa/icons/scan_list.png +0 -0
  260. PaIRS_UniNa/icons/scan_path.png +0 -0
  261. PaIRS_UniNa/icons/scan_path_loop.png +0 -0
  262. PaIRS_UniNa/icons/scan_path_loop_off.png +0 -0
  263. PaIRS_UniNa/icons/search.png +0 -0
  264. PaIRS_UniNa/icons/showIW_off.png +0 -0
  265. PaIRS_UniNa/icons/showIW_on.png +0 -0
  266. PaIRS_UniNa/icons/show_all.png +0 -0
  267. PaIRS_UniNa/icons/sort.png +0 -0
  268. PaIRS_UniNa/icons/sort_reversed.png +0 -0
  269. PaIRS_UniNa/icons/spiv_proc.png +0 -0
  270. PaIRS_UniNa/icons/spiv_proc_off.png +0 -0
  271. PaIRS_UniNa/icons/spiv_setup_no.png +0 -0
  272. PaIRS_UniNa/icons/spiv_setup_ok.png +0 -0
  273. PaIRS_UniNa/icons/star.png +0 -0
  274. PaIRS_UniNa/icons/step_inheritance.png +0 -0
  275. PaIRS_UniNa/icons/subMIN_off.png +0 -0
  276. PaIRS_UniNa/icons/subMIN_on.png +0 -0
  277. PaIRS_UniNa/icons/tom.png +0 -0
  278. PaIRS_UniNa/icons/trash.png +0 -0
  279. PaIRS_UniNa/icons/undo.png +0 -0
  280. PaIRS_UniNa/icons/unedited.png +0 -0
  281. PaIRS_UniNa/icons/unina_dii.png +0 -0
  282. PaIRS_UniNa/icons/uninitialized.png +0 -0
  283. PaIRS_UniNa/icons/unlink.png +0 -0
  284. PaIRS_UniNa/icons/unwrap_items.png +0 -0
  285. PaIRS_UniNa/icons/up.png +0 -0
  286. PaIRS_UniNa/icons/updating_import.gif +0 -0
  287. PaIRS_UniNa/icons/updating_pairs.gif +0 -0
  288. PaIRS_UniNa/icons/vectorColor.png +0 -0
  289. PaIRS_UniNa/icons/vettore.png +0 -0
  290. PaIRS_UniNa/icons/view.png +0 -0
  291. PaIRS_UniNa/icons/view_off.png +0 -0
  292. PaIRS_UniNa/icons/vis_logo.png +0 -0
  293. PaIRS_UniNa/icons/waiting_circle.png +0 -0
  294. PaIRS_UniNa/icons/warning.png +0 -0
  295. PaIRS_UniNa/icons/warning_circle.png +0 -0
  296. PaIRS_UniNa/icons/window.png +0 -0
  297. PaIRS_UniNa/icons/workspace.png +0 -0
  298. PaIRS_UniNa/icons/wrap_items.png +0 -0
  299. PaIRS_UniNa/icons/write_list.png +0 -0
  300. PaIRS_UniNa/listLib.py +303 -0
  301. PaIRS_UniNa/mtfPIV.py +256 -0
  302. PaIRS_UniNa/parForMulti.py +435 -0
  303. PaIRS_UniNa/parForWorkers.py +593 -0
  304. PaIRS_UniNa/pivParFor.py +235 -0
  305. PaIRS_UniNa/plt_util.py +141 -0
  306. PaIRS_UniNa/preProcParFor.py +155 -0
  307. PaIRS_UniNa/procTools.py +1439 -0
  308. PaIRS_UniNa/readcfg.py +52 -0
  309. PaIRS_UniNa/rqrdpckgs.txt +9 -0
  310. PaIRS_UniNa/stereoPivParFor.py +227 -0
  311. PaIRS_UniNa/tAVarie.py +215 -0
  312. PaIRS_UniNa/tabSplitter.py +612 -0
  313. PaIRS_UniNa/ui_Calibration_Tab.py +578 -0
  314. PaIRS_UniNa/ui_Custom_Top.py +296 -0
  315. PaIRS_UniNa/ui_Input_Tab.py +1101 -0
  316. PaIRS_UniNa/ui_Input_Tab_CalVi.py +1283 -0
  317. PaIRS_UniNa/ui_Log_Tab.py +263 -0
  318. PaIRS_UniNa/ui_Output_Tab.py +2362 -0
  319. PaIRS_UniNa/ui_Process_Tab.py +3810 -0
  320. PaIRS_UniNa/ui_Process_Tab_CalVi.py +1549 -0
  321. PaIRS_UniNa/ui_Process_Tab_Disp.py +1141 -0
  322. PaIRS_UniNa/ui_Process_Tab_Min.py +437 -0
  323. PaIRS_UniNa/ui_ResizePopup.py +204 -0
  324. PaIRS_UniNa/ui_Vis_Tab.py +1628 -0
  325. PaIRS_UniNa/ui_Vis_Tab_CalVi.py +1251 -0
  326. PaIRS_UniNa/ui_Whatsnew.py +132 -0
  327. PaIRS_UniNa/ui_gPairs.py +877 -0
  328. PaIRS_UniNa/ui_infoPaIRS.py +551 -0
  329. PaIRS_UniNa/whatsnew.txt +6 -0
  330. pairs_unina-0.2.9.dist-info/METADATA +166 -0
  331. pairs_unina-0.2.9.dist-info/RECORD +333 -0
  332. pairs_unina-0.2.9.dist-info/WHEEL +5 -0
  333. pairs_unina-0.2.9.dist-info/top_level.txt +2 -0
@@ -0,0 +1,983 @@
1
+ from .ui_Vis_Tab_CalVi import*
2
+ from .TabTools import*
3
+ from .calib import Calib, CalibTasks, calibTasksText, CalibFunctions, calibFunctionsText
4
+ from .calibView import CalibView
5
+ from .Input_Tab_CalVi import INPpar_CalVi
6
+ from .Process_Tab_CalVi import PROpar_CalVi
7
+
8
+
9
+ bufferSizeLimit=2000*1e6 #bytes
10
+ if __name__ == "__main__":
11
+ cfgName='../../img/calib/NewCam0.cfg'
12
+ cfgName='../../img/calib/NewCam0_Mod.cfg'
13
+ FlagRunning=True
14
+ else:
15
+ cfgName=''
16
+ FlagRunning=False
17
+
18
+ spin_tips={
19
+ 'plane' : 'Plane number',
20
+ 'cam' : 'Camera number',
21
+ 'LMin' : 'Minimum intensity level',
22
+ 'LMax' : 'Maximum intensity level',
23
+ 'yOriOff' : 'Origin y shift',
24
+ 'xOriOff' : 'Origin x shift',
25
+ 'yp' : 'Maximum y limit',
26
+ 'ym' : 'Minimum y limit',
27
+ 'xp' : 'Maximum x limit',
28
+ 'xm' : 'Minimum x limit',
29
+ }
30
+ check_tips={}
31
+ radio_tips={
32
+ 'ShowMask' : 'Show mask',
33
+ }
34
+ line_edit_tips={}
35
+ button_tips={
36
+ 'findAll' : 'Find points in all planes',
37
+ 'find' : 'Find points in current plane',
38
+ 'copyGrid' : 'Copy grid limits to all planes',
39
+ 'saveCoord' : 'Save point coordinates',
40
+ 'calibrate' : 'Calibration',
41
+ 'focusErr' : 'Focus on max. error point',
42
+ 'deleteErr' : 'Deletion of max. error point',
43
+ 'zoom_minus': 'Zoom out',
44
+ 'zoom_equal': 'Reset zoom',
45
+ 'zoom_plus' : 'Zoom in',
46
+ 'restore' : 'Restore intensity levels',
47
+ 'PlotMask' : 'Plot mask',
48
+ }
49
+ combo_tips={}
50
+
51
+ class VISpar_CalVi(TABpar):
52
+ FlagVis=True
53
+
54
+ def __init__(self,Process=ProcessTypes.null,Step=StepTypes.null):
55
+ self.setup(Process,Step)
56
+ super().__init__('VISpar_CalVi','Vis_CalVi')
57
+ self.unchecked_fields+=[]
58
+
59
+ def setup(self,Process,Step):
60
+ self.Process = Process
61
+ self.Step = Step
62
+
63
+ self.cfgName = cfgName
64
+ self.FlagRunning = FlagRunning
65
+
66
+ self.nPlane = 0
67
+ self.plane = 1
68
+ self.nCam = 0
69
+ self.cam = 1
70
+ self.defaultScaleFactor = 1.0
71
+ self.scaleFactor = 1.0
72
+ self.scrollBarValues = [0,0]
73
+ self.LLim = 0
74
+ self.LMin = 0
75
+ self.LMax = 1
76
+
77
+ self.MaskType = 0
78
+ self.DotDiam = 0
79
+ self.FlagShowMask = True
80
+ self.FlagPlotMask = False
81
+
82
+ #self.xOriOff = 0
83
+ #self.yOriOff = 0
84
+ #self.xm = 0
85
+ #self.xp = 0
86
+ #self.ym = 0
87
+ #self.yp = 0
88
+
89
+ self.orPosAndShift = []
90
+ self.angAndMask = []
91
+ self.spotDistAndRemoval = []
92
+
93
+ self.imList = []
94
+ self.imEx = []
95
+ self.splitterSizes = [ ]
96
+
97
+ self.FlagResetLevels = True
98
+ self.FlagResetZoom = True
99
+
100
+ self.errorMessage=''
101
+
102
+ class Vis_Tab_CalVi(gPaIRS_Tab):
103
+ class VIS_Tab_Signals(gPaIRS_Tab.Tab_Signals):
104
+ run=Signal(bool)
105
+ pass
106
+
107
+ def showEvent(self, event: QShowEvent) -> None:
108
+ super().showEvent(event)
109
+ if not self.FlagInitVIS:
110
+ self.FlagInitVIS=True
111
+ S=self.scrollArea.size()
112
+ s=self.calibView.pixmap().size()
113
+ self.VISpar.scaleFactor = self.calibView.scaleFactor =min([S.width()/s.width() if s.width() else S.width(), S.height()/s.height() if s.height() else S.height()])
114
+ self.calibView.resize(self.VISpar.scaleFactor * self.calibView.pixmap().size())
115
+ return
116
+
117
+ def closeEvent(self,event):
118
+ ''' called when closing
119
+ I had to add this to be sure that calib was destroyed'''
120
+
121
+ #self.calibView.imageViewerThreadpool.clear()
122
+ pri.Info.white("Vis_Tab_CalVi closeEvent")
123
+ del self.calibView
124
+
125
+ def resizeEvent(self,event):
126
+ super().resizeEvent(event)
127
+ self.setZoom()
128
+
129
+ def __init__(self,parent: QWidget =None, flagInit= __name__ == "__main__"):
130
+ super().__init__(parent,Ui_VisTab_CalVi,VISpar_CalVi)
131
+ self.signals=self.VIS_Tab_Signals(self)
132
+
133
+ #------------------------------------- Graphical interface: widgets
134
+ self.TABname='Vis_CalVi'
135
+ self.ui: Ui_VisTab_CalVi
136
+
137
+ #necessary to change the name and the order of the items
138
+ for g in list(globals()):
139
+ if '_items' in g or '_ord' in g or '_tips' in g:
140
+ #pri.Info.blue(f'Adding {g} to {self.name_tab}')
141
+ setattr(self,g,eval(g))
142
+
143
+
144
+ #introducing CalibView
145
+ self.scrollArea = QtWidgets.QScrollArea(self)
146
+ self.scrollArea.setObjectName('scroll_area_Vis_CalVi')
147
+ self.scrollArea.setBackgroundRole(QtGui.QPalette.Dark)
148
+ self.calibView=CalibView(self.scrollArea,self.outFromCalibView,self.outToStatusBarFromCalibView,self.textFromCalib,self.workerCompleted)
149
+ self.scrollArea.setWidget(self.calibView)
150
+ self.ui.Vis_CalVi_splitter.insertWidget(0,self.scrollArea)
151
+ if __name__ == "__main__":
152
+ self.app=app
153
+ setAppGuiPalette(self)
154
+
155
+ #------------------------------------- Graphical interface: miscellanea
156
+ self.ui.status_L.setText('')
157
+ self.ui.status_R.setText('')
158
+ self.FlagFirstShow=False
159
+ self.setLogFont(fontPixelSize-dfontLog)
160
+
161
+ #------------------------------------- Declaration of parameters
162
+ self.VISpar_base=VISpar_CalVi()
163
+ self.VISpar:VISpar_CalVi=self.TABpar
164
+ self.VISpar_old:VISpar_CalVi=self.TABpar_old
165
+
166
+ #------------------------------------- Callbacks
167
+ self.FlagInitVIS=False
168
+ self.defineWidgets()
169
+ self.setupWid() #---------------- IMPORTANT
170
+
171
+ self.defineCallbacks()
172
+ self.spins_valueChanged=[self.ui.spin_plane,self.ui.spin_cam,
173
+ self.ui.spin_xOriOff,self.ui.spin_yOriOff,
174
+ self.ui.spin_ym,self.ui.spin_yp,
175
+ self.ui.spin_xm,self.ui.spin_xp]
176
+ self.connectCallbacks()
177
+ self.defineFurtherCallbacks()
178
+
179
+ self.defineSettings()
180
+
181
+ self.adjustTABpar=self.adjustVISpar
182
+ self.setTABlayout=self.setVISlayout
183
+
184
+ self.FlagAddPrev=False
185
+
186
+ self.calibView.flagCurrentTask=CalibTasks.stop #todo GP per me si deve cancellare è stato già fatto nell'init di CalibView
187
+
188
+ self.bufferImg={}
189
+ self.bufferSize=[]
190
+ self.setRunButtonText=lambda: None
191
+
192
+ self.FlagResume=0
193
+ self.FlagInitData=False
194
+
195
+ #------------------------------------- Initializing
196
+ if flagInit:
197
+ self.initialize()
198
+
199
+ def initialize(self):
200
+ pri.Info.yellow(f'{"*"*20} VIS initialization {"*"*20}')
201
+
202
+ if self.VISpar.cfgName:
203
+ self.calibView.calib.cfgName=self.VISpar.cfgName
204
+ flagOp=self.calibView.calib.readCfg()
205
+ self.calibView.calib.readImgs() #todo verificare eventuali errori e dimensioni delle immagini in questo momento non da errore e l'img viene tagliata
206
+
207
+ self.nullCallback('CalVi process')
208
+ #self.adjustTABparInd()
209
+ self.runCalVi('_Mod' in self.VISpar.cfgName)
210
+
211
+ @Slot(bool)
212
+ def runCalVi(self,flagMod=False):
213
+ self.FlagBridge=False
214
+ self.calibView.flagFirstTask=CalibTasks.findPlanesFromOrigin if flagMod else CalibTasks.findAllPlanes
215
+ self.VISpar.plane=self.VISpar.cam=1
216
+ self.VISpar.FlagPlotMask=False
217
+ if flagMod: self.ui.log.setText('')
218
+ self.setTABlayout()
219
+ if self.calibView.executeCalibTask(self.calibView.flagFirstTask):
220
+ self.setTaskButtonsText()
221
+ #self.resetScaleFactor()
222
+
223
+ def stopCalVi(self):
224
+ self.calibView.executeCalibTask(CalibTasks.stop)
225
+ self.setTaskButtonsText()
226
+ self.gui.ui.button_Run_CalVi.setVisible(True)
227
+ self.setTABlayout()
228
+ self.FlagBridge=True
229
+ self.adjustTABparInd()
230
+
231
+ def show(self):
232
+ super().show()
233
+ if not self.FlagFirstShow:
234
+ self.FlagFirstShow=True
235
+ self.resetScaleFactor()
236
+ self.setVISlayout()
237
+
238
+ def defineFurtherCallbacks(self):
239
+ self.ui.Vis_CalVi_splitter.addfuncout['setScrollAreaWidth']=self.wrappedCallback('Splitter sizes',self.splitterMoved)
240
+
241
+ self.taskButtons=[self.ui.button_findAll,
242
+ self.ui.button_find,
243
+ self.ui.button_calibrate,
244
+ self.ui.button_saveCoord,
245
+ ]
246
+ self.taskButtons_actions=[]
247
+ def create_taskButton_action(ind,k):
248
+ def taskButton_action(ind,k):
249
+ FlagSettingPar=TABpar.FlagSettingPar
250
+ TABpar.FlagSettingPar=True
251
+ self.taskButtonPressed(CalibTasks(ind),k!=3)
252
+ TABpar.FlagSettingPar=FlagSettingPar
253
+ return self.wrappedCallback('CalVi task',lambda: taskButton_action(ind,k))
254
+ for k,ind in enumerate([f.value for f in CalibTasks if f.value>0]):
255
+ self.taskButtons_actions.append(create_taskButton_action(ind,k))
256
+ self.taskButtons[k].clicked.connect(self.taskButtons_actions[k])
257
+
258
+ self.buttonsToDisableNotCalibrated=[] #used to gray buttons if not calibrated
259
+ self.functionButtons=[
260
+ self.ui.button_deleteErr,
261
+ self.ui.button_focusErr,
262
+ self.ui.button_copyGrid,
263
+ ]
264
+ self.functionButtons_actions=[]
265
+ def create_functionButton_action(ind):
266
+ def functionButton_action(ind):
267
+ FlagSettingPar=TABpar.FlagSettingPar
268
+ TABpar.FlagSettingPar=True
269
+ self.functionButtonPressed(CalibFunctions(ind),True)
270
+ TABpar.FlagSettingPar=FlagSettingPar
271
+ return self.wrappedCallback('CalVi function',lambda: functionButton_action(ind))
272
+ for k,ind in enumerate([f.value for f in CalibFunctions if f.value>0]):
273
+ self.functionButtons_actions.append(create_functionButton_action(ind))
274
+ self.functionButtons[k].clicked.connect(self.functionButtons_actions[k])
275
+ self.buttonsToDisableNotCalibrated.append(self.functionButtons[k])
276
+
277
+ functionButtons_insert=[0,0,0]
278
+ for k,ind in enumerate([f.value for f in CalibFunctions]):
279
+ action=QAction(self.functionButtons[k].icn,calibFunctionsText[abs(ind)],self)
280
+ self.calibView.contextMenuActions.insert(functionButtons_insert[k],action)
281
+ action.triggered.connect(create_functionButton_action(ind))
282
+ if ind>0:
283
+ self.buttonsToDisableNotCalibrated.append(action)
284
+
285
+ self.originOffbox=self.ui.g_OriOff
286
+ self.remPoinsBox=self.ui.g_GriLim
287
+ self.buttonsToDisable=[
288
+ self.ui.spin_plane,
289
+ self.originOffbox,
290
+ self.remPoinsBox,
291
+ ] #used to gray buttons when calibrating
292
+
293
+ def setLogFont(self,fPixSize):
294
+ logfont=self.ui.log.font()
295
+ logfont.setFamily('Courier New')
296
+ logfont.setPixelSize(fPixSize)
297
+ self.ui.log.setFont(logfont)
298
+
299
+ #********************************************* Adjusting parameters
300
+ def adjustVISpar(self):
301
+ self.calibView.hide()
302
+
303
+ FlagNewRun=self.VISpar.isDifferentFrom(self.VISpar_old,fields=['FlagRunning'])
304
+ if FlagNewRun:
305
+ self.defaultSplitterSize()
306
+
307
+ FlagNewSet=False
308
+ INP_CalVi:INPpar_CalVi = self.gui.w_Input_CalVi.TABpar
309
+ PRO_CalVi:PROpar_CalVi = self.gui.w_Process_CalVi.TABpar
310
+ if PRO_CalVi.isDifferentFrom(self.gui.w_Process_CalVi.PROpar_old,exceptions=['ind']) or INP_CalVi.isDifferentFrom(self.gui.w_Input_CalVi.INPpar_old,exceptions=['ind']) or not self.FlagInitData:
311
+ FlagNewSet=True
312
+ self.gui.initDataAndSetImgFromGui(INP_CalVi,PRO_CalVi)
313
+
314
+ #***Data
315
+ c=self.calibView.calib
316
+ self.VISpar.nPlane=c.nPlanesPerCam
317
+ self.VISpar.nCam=c.nCams
318
+ if self.VISpar.plane and not self.VISpar.nPlane: self.VISpar.plane=0
319
+ elif not self.VISpar.plane and self.VISpar.nPlane: self.VISpar.plane=self.VISpar.nPlane
320
+ if self.VISpar.cam and not self.VISpar.nCam: self.VISpar.cam=0
321
+ elif not self.VISpar.cam and self.VISpar.nCam: self.VISpar.cam=self.VISpar.nCam
322
+
323
+ self.VISpar.MaskType=abs(self.calibView.calib.cal.data.FlagPos)
324
+ if self.VISpar.MaskType in (2,3):
325
+ #self.VISpar.FlagShowMask=False
326
+ self.VISpar.FlagPlotMask=False
327
+ #if not self.VISpar.FlagShowMask: self.VISpar.FlagPlotMask=False
328
+ self.VISpar.DotDiam=abs(self.calibView.calib.cal.data.raggioInizialeRicerca)
329
+ self.calibView.calib.flagShowMask=self.VISpar.FlagShowMask
330
+ self.calibView.calib.flagPlotMask=self.VISpar.FlagPlotMask
331
+
332
+ #***Levels
333
+ FlagPlot=False
334
+ FlagPlotMask=self.VISpar.isDifferentFrom(self.VISpar_old,fields=['FlagPlotMask'])
335
+ if FlagPlotMask:
336
+ FlagPlot=True
337
+ self.plotPlane()
338
+ if self.VISpar.FlagResetLevels or FlagNewRun or FlagNewSet: #or FlagPlotMask:
339
+ if not FlagPlot:
340
+ FlagPlot=True
341
+ self.plotPlane()
342
+ self.restoreLevels()
343
+ #self.VISpar.FlagResetLevels=False
344
+ self.VISpar.LLim=c.LLim
345
+ if self.VISpar.FlagResetLevels:
346
+ self.VISpar.LMin=c.LMin
347
+ self.VISpar.LMax=c.LMax
348
+ else:
349
+ self.VISpar.LMax=c.LMax if self.VISpar.LMax>c.LLim else self.VISpar.LMax
350
+ self.VISpar.LMin=self.VISpar.LMax-1 if self.VISpar.LMin >self.VISpar.LMax-1 else self.VISpar.LMin
351
+ self.calibView.calib.LMin=self.VISpar.LMin
352
+ self.calibView.calib.LMax=self.VISpar.LMax
353
+ self.VISpar.FlagResetLevels=False
354
+
355
+ #***Zoom
356
+ if self.VISpar.FlagResetZoom or FlagNewRun or FlagPlotMask or FlagNewSet:
357
+ if not FlagPlot:
358
+ FlagPlot=True
359
+ self.plotPlane()
360
+ self.resetScaleFactor()
361
+ self.calibView.scaleFactor=self.VISpar.scaleFactor
362
+ self.VISpar.FlagResetZoom=False
363
+
364
+ def defaultSplitterSize(self):
365
+ self.VISpar.splitterSizes=[self.width()-self.ui.w_Commands.minimumWidth(),self.ui.w_Commands.minimumWidth()]
366
+
367
+ #********************************************* Layout
368
+ def setVISlayout(self):
369
+ self.calibView.hide()
370
+
371
+ FlagImg=len(self.calibView.calib.imgs)>0
372
+ self.ui.g_Image.setEnabled(FlagImg)
373
+ self.ui.spin_plane.setEnabled(FlagImg and self.VISpar.nPlane>1)
374
+ self.ui.spin_cam.setEnabled(FlagImg and self.VISpar.nCam>1)
375
+
376
+ FlagMask=self.VISpar.MaskType not in (2,3) and len(self.calibView.calib.ccMask)>0
377
+ self.ui.g_Mask.setVisible(FlagMask)
378
+
379
+ FlagZoomLevels=FlagImg or FlagMask
380
+ self.ui.g_Zoom.setEnabled(FlagZoomLevels)
381
+ self.ui.g_Levels.setEnabled(FlagZoomLevels)
382
+
383
+ self.ui.button_PlotMask.setEnabled(self.VISpar.MaskType not in (2,3))
384
+
385
+ self.ui.w_Commands.setVisible(self.VISpar.FlagRunning)
386
+ if self.VISpar.FlagRunning:
387
+ self.calibView.contextMenu = QtWidgets.QMenu(self)
388
+ for a in self.calibView.contextMenuActions:
389
+ self.calibView.contextMenu.addAction(a)
390
+ self.calibView.contextMenu.insertSeparator(self.calibView.contextMenuActions[1])
391
+ else:
392
+ self.calibView.contextMenu =None
393
+
394
+ self.setSpinMaxMin()
395
+ self.ui.Vis_CalVi_splitter.setSizes(self.VISpar.splitterSizes)
396
+
397
+ self.calibView.scaleFactor=self.VISpar.scaleFactor
398
+ self.calibView.calib.LMin=self.VISpar.LMin
399
+ self.calibView.calib.LMax=self.VISpar.LMax
400
+ self.calibView.calib.flagShowMask=self.VISpar.FlagShowMask
401
+ self.calibView.calib.flagPlotMask=self.VISpar.FlagPlotMask
402
+
403
+ FlagNoImage=True
404
+ if self.VISpar.cam>0 and self.VISpar.plane>0:
405
+ if self.VISpar.nCam==len(self.VISpar.imEx):
406
+ TargetType=self.gui.w_Process_CalVi.PROpar.TargetType
407
+ nPlane=self.VISpar.nPlane/(1+TargetType)
408
+ if nPlane==len(self.VISpar.imEx[0]):
409
+ plane=int( (self.VISpar.plane+TargetType)/(1+TargetType) )
410
+ if self.VISpar.imEx[self.VISpar.cam-1][plane-1]:
411
+ FlagNoImage=False
412
+ if FlagNoImage:
413
+ self.ui.status_R.setText('')
414
+ self.ui.status_L.setText('')
415
+ self.calibView.hide()
416
+ else:
417
+ if self.VISpar_old.FlagRunning!=self.VISpar.FlagRunning or (self.VISpar.nPlane>0 and self.VISpar_old.nPlane==0):
418
+ self.plotPlane()
419
+ self.button_zoom_equal_action()
420
+ self.setZoom()
421
+ self.plotPlane()
422
+ self.calibView.show()
423
+ if not self.VISpar.FlagInit:
424
+ self.button_zoom_equal_action()
425
+ self.setRunButtonText()
426
+ return
427
+
428
+ def setSpinMaxMin(self):
429
+ self.ui.spin_plane.setMinimum(1*bool(self.VISpar.nPlane))
430
+ self.ui.spin_plane.setMaximum(self.VISpar.nPlane)
431
+ self.ui.spin_cam.setMinimum(1*bool(self.VISpar.nCam))
432
+ self.ui.spin_cam.setMaximum(self.VISpar.nCam)
433
+
434
+ self.ui.spin_LMin.setMinimum(-self.VISpar.LLim)
435
+ self.ui.spin_LMin.setMaximum(self.VISpar.LMax-1)
436
+ self.ui.spin_LMax.setMinimum(self.VISpar.LMin+1)
437
+ self.ui.spin_LMax.setMaximum(self.VISpar.LLim)
438
+
439
+ #********************************************* Zoom
440
+ #******************** Actions
441
+ def button_zoom_minus_action(self):
442
+ self.zoom(0.8)
443
+ return
444
+
445
+ def button_zoom_equal_action(self):
446
+ self.resetScaleFactor()
447
+ self.zoom(1.0)
448
+ return
449
+
450
+ def button_zoom_plus_action(self):
451
+ self.zoom(1.25)
452
+ return
453
+
454
+ def zoom(self,zoom):
455
+ ''' zooms f a factor zoom if negative reset to no zoom '''
456
+ if zoom<=0:
457
+ zoom = self.calibView.scaleFactor = 1.0
458
+ self.zoomImage(zoom)
459
+
460
+ def zoomImage(self, zoom):
461
+ ''' zooms the image of self.CalibView.scaleFactor times a factor zoom
462
+ adjust also the scrollBars'''
463
+ self.calibView.scaleFactor *= zoom
464
+ self.VISpar.scaleFactor=self.calibView.scaleFactor
465
+ self.VISpar.scrollBarValues[0]=self.adjustedScrollBarValue(self.scrollArea.horizontalScrollBar(), zoom)
466
+ self.VISpar.scrollBarValues[1]=self.adjustedScrollBarValue(self.scrollArea.verticalScrollBar(), zoom)
467
+
468
+ def adjustedScrollBarValue(self, scrollBar:QScrollBar, factor):
469
+ ''' adjust the position when zooming in or out '''
470
+ return int(factor * scrollBar.value() + ((factor - 1) * scrollBar.pageStep()/2))
471
+
472
+ def splitterMoved(self):
473
+ self.calibView.resetScaleFactor(self.scrollArea.size())
474
+ self.VISpar.defaultScaleFactor=self.calibView.scaleFactor
475
+ self.VISpar.splitterSizes=self.ui.Vis_CalVi_splitter.sizes()
476
+
477
+ #******************** Settings
478
+ def setZoom(self):
479
+ #self.calibView.show()
480
+ self.calibView.resize(self.VISpar.scaleFactor * self.calibView.pixmap().size())
481
+ self.scrollArea.horizontalScrollBar().setValue(self.VISpar.scrollBarValues[0])
482
+ self.scrollArea.verticalScrollBar().setValue(self.VISpar.scrollBarValues[1])
483
+
484
+ #******************** Adjusting
485
+ def resetScaleFactor(self):
486
+ ''' reset the scale factor so that the image perfectly feet the window'''
487
+ self.calibView.resetScaleFactor(self.scrollArea.size())
488
+ self.VISpar.defaultScaleFactor=self.VISpar.scaleFactor=self.calibView.scaleFactor
489
+ self.VISpar.scrollBarValues=[0,0]
490
+
491
+ #********************************************* Levels
492
+ #******************** Actions
493
+ def button_restore_action(self):
494
+ self.VISpar.FlagResetLevels=True
495
+
496
+ #******************** Adjusting
497
+ def restoreLevels(self):
498
+ pc=self.VISpar.plane-1
499
+ c=self.VISpar.cam-1
500
+ p=pc+c*self.calibView.calib.nPlanesPerCam
501
+ c=self.calibView.calib
502
+ c.setLMinMax(p)
503
+
504
+ #********************************************* Mask
505
+ #******************** Actions
506
+ def button_PlotMask_action(self):
507
+ self.VISpar.FlagPlotMask=self.ui.button_PlotMask.isChecked()
508
+
509
+ #******************** Settings
510
+ def button_PlotMask_set(self):
511
+ self.ui.button_PlotMask.setChecked(self.VISpar.FlagPlotMask)
512
+
513
+ #********************************************* Plot
514
+ #******************** Layout
515
+ def plotPlane(self):
516
+ pc=self.VISpar.plane-1
517
+ c=self.VISpar.cam-1
518
+ p=pc+c*self.calibView.calib.nPlanesPerCam
519
+ self.calibView.plotPlane(p)
520
+
521
+ #********************************************* Parameters
522
+ #******************** Actions
523
+ def spin_OriOff_action(self,spin:QSpinBox,flagX):
524
+ self.focusOnTarget()
525
+ Off=spin.value()
526
+ if spin.hasFocus():
527
+ self.calibView.spinOriginChanged(Off,spin,flagX,flagPlot=False)
528
+
529
+ def spin_xOriOff_action(self):
530
+ self.spin_OriOff_action(self.ui.spin_xOriOff,True)
531
+
532
+ def spin_yOriOff_action(self):
533
+ self.spin_OriOff_action(self.ui.spin_yOriOff,False)
534
+
535
+ def spin_remPoi_action(self,spin:QSpinBox,flagX,flagPos):
536
+ self.focusOnTarget()
537
+ Off=spin.value()
538
+ if spin.hasFocus():
539
+ self.calibView.spinRemPoints(Off,spin,flagX,flagPos)
540
+
541
+ def spin_ym_action(self):
542
+ self.spin_remPoi_action(self.ui.spin_ym,flagX=False,flagPos=False)
543
+
544
+ def spin_yp_action(self):
545
+ self.spin_remPoi_action(self.ui.spin_yp,flagX=False,flagPos=True)
546
+
547
+ def spin_xm_action(self):
548
+ self.spin_remPoi_action(self.ui.spin_xm,flagX=True,flagPos=False)
549
+
550
+ def spin_xp_action(self):
551
+ self.spin_remPoi_action(self.ui.spin_xp,flagX=True,flagPos=True)
552
+
553
+ def button_copyGrid_action(self):
554
+ self.focusOnTarget()
555
+ self.calibView.copyRemPoints()
556
+
557
+ def focusOnTarget(self):
558
+ self.VISpar.FlagPlotMask=False
559
+
560
+ #********************************************* CalibView function
561
+ def outFromCalibView(self,out:str):
562
+ ''' output From CalibView called from plotImg'''
563
+ calib=self.calibView.calib
564
+ da=calib.cal.vect
565
+ p=calib.plane
566
+ c=int(p/calib.nPlanesPerCam)
567
+ pc=p-c*calib.nPlanesPerCam
568
+
569
+ FlagSettingPar=TABpar.FlagSettingPar
570
+ TABpar.FlagSettingPar=True
571
+ self.VISpar.plane=pc+1
572
+ self.VISpar.cam=c+1
573
+ self.ui.spin_cam.setValue(c+1)
574
+ self.ui.spin_plane.setValue(pc+1)
575
+
576
+ self.ui.spin_xOriOff.setValue(da.xOrShift[p])
577
+ self.ui.spin_yOriOff.setValue(da.yOrShift[p])
578
+
579
+ self.ui.spin_xm.setValue(da.remPointsLe[p])
580
+ self.ui.spin_xp.setValue(da.remPointsRi[p])
581
+ self.ui.spin_ym.setValue(da.remPointsDo[p])
582
+ self.ui.spin_yp.setValue(da.remPointsUp[p])
583
+ TABpar.FlagSettingPar=FlagSettingPar
584
+
585
+ if self.VISpar.FlagPlotMask:
586
+ out2=' [CC mask]'
587
+ else:
588
+ out2=' [target image]'
589
+ self.ui.status_R.setText(out+out2)
590
+ self.calibView.setStatusTip(out+out2)
591
+
592
+ def outToStatusBarFromCalibView(self,out:str):
593
+ ''' output to status bar From CalibView '''
594
+ self.ui.status_L.setText(out)
595
+ #self.calibView.setToolTip(out)
596
+
597
+ Slot(str)
598
+ def textFromCalib(self,out:str):
599
+ ''' set single line text from calib'''
600
+
601
+ #print(f'textFromCalib {out}')
602
+ self.ui.log.setText(out)
603
+
604
+ def workerCompleted(self,flagError):
605
+ ''' called when worker has completed '''
606
+ if flagError:
607
+ warningDialog(self,'An error occurred during calibration!\n\nPlease, restart the procedure manually.')
608
+ if not self.calibView.flagCurrentTask is CalibTasks.stop:# pylint: disable=unneeded-not
609
+ if self.calibView.executeCalibTask(CalibTasks.stop):
610
+ self.setTaskButtonsText()
611
+
612
+ def setTaskButtonsText(self):
613
+ ''' set all the button texts and enable/disable them '''
614
+ flagEnab=True if (self.calibView.flagCurrentTask==CalibTasks.stop) else False
615
+ for f in [f for f in CalibTasks if f.value>0]:
616
+ if flagEnab: # stop the process -> enable all buttons and restore text
617
+ self.taskButtons [f.value-1].setText(calibTasksText[f.value])
618
+ self.taskButtons [f.value-1].setEnabled(True)
619
+ else:
620
+ if self.calibView.flagCurrentTask is f:
621
+ self.taskButtons [f.value-1].setText(calibTasksText[0])
622
+ else:
623
+ self.taskButtons [f.value-1].setEnabled(False)
624
+ for b in self.buttonsToDisable:
625
+ b.setEnabled(flagEnab)
626
+ for b in self.buttonsToDisableNotCalibrated:
627
+ b.setEnabled(self.calibView.calib.cal.flagCalibrated)
628
+ self.setRunCalViButtonLayout()
629
+ #for b in self.functionButtons: b.setEnabled(flagEnab)
630
+ #pri.Callback.green('-----abcde----- TaskButtonsText -----abcde-----')
631
+
632
+ def taskButtonPressed(self,flag:CalibTasks,flagFocus):
633
+ ''' one of the button has been pressed '''
634
+ if flagFocus: self.focusOnTarget()
635
+ if self.calibView.executeCalibTask(flag):
636
+ self.setTaskButtonsText()
637
+ #pri.Callback.green('-----xxxxx----- taskButtonPressed -----xxxxx-----')
638
+
639
+ def functionButtonPressed(self,flag:CalibTasks,flagFocus):
640
+ ''' one of the button has been pressed '''
641
+ if flagFocus: self.focusOnTarget()
642
+ self.calibView.executeCalibFunction(flag)
643
+ #pri.Callback.green('-----|||||----- functionButtonPressed -----|||||-----')
644
+
645
+ #********************************************* Spin callbacks
646
+ def setImgFromGui(self):
647
+ inddel=[]
648
+ calib=self.calibView.calib
649
+ calib.imgs=[]
650
+ calib.ccMask=[]
651
+ flagFirstImage=True
652
+ npType=np.uint16
653
+
654
+ data=calib.cal.data
655
+ Him=data.ImgH
656
+ Wim=data.ImgW
657
+ if self.VISpar.imList: #only used to read the first image and fix the img dimensions
658
+ for imListc,imExc in zip(self.VISpar.imList,self.VISpar.imEx):
659
+ for k,f in enumerate(imListc):
660
+ ex=imExc[k]=os.path.exists(f)
661
+ if ex:
662
+ if f not in self.bufferImg:
663
+ try:
664
+ im=Image.open(f)
665
+ da=np.array(im,dtype=npType)
666
+ if len(da.shape)!=2:
667
+ self.bufferImg[f]=da=None
668
+ raise(f'Error: the image file: {f} seems not to be grayscale!')
669
+ else:
670
+ self.bufferImg[f]=da
671
+ except:
672
+ pri.Error.red(f'Error while opening the image file: {f}.\n{traceback.format_exc()}\n')
673
+ self.bufferImg[f]=da=None
674
+ else:
675
+ da=self.bufferImg[f]
676
+ if flagFirstImage and da is not None:
677
+ Him,Wim=da.shape
678
+ flagFirstImage=False
679
+ break
680
+ if not flagFirstImage: break
681
+ if self.VISpar.imList: #reading the images
682
+ for imListc,imExc in zip(self.VISpar.imList,self.VISpar.imEx):
683
+ k=-1
684
+ for f,ex in zip(imListc,imExc):
685
+ k+=1
686
+ if f not in self.bufferImg:
687
+ if ex:
688
+ try:
689
+ im=Image.open(f)
690
+ da=np.array(im,dtype=npType)
691
+ if len(da.shape)!=2:
692
+ da=None
693
+ raise(f'Error: the image file: {f} seems not to be grayscale!')
694
+ except:
695
+ pri.Error.red(f'Error while opening the image file: {f}.\n{traceback.format_exc()}\n')
696
+ da=None
697
+ else:
698
+ da=np.zeros((Him,Wim),dtype=npType)
699
+ self.bufferImg[f]=da
700
+ else:
701
+ da=self.bufferImg[f]
702
+ if da is None:
703
+ inddel.append(k)
704
+ continue
705
+ h,w=da.shape
706
+ if (Wim,Him)!=(w,h):
707
+ inddel.append(k)
708
+ calib.imgs.append(np.ascontiguousarray(da[data.RigaPart:data.RigaPart+data.ImgH,data.ColPart:data.ColPart+data.ImgW],dtype=npType))
709
+ if data.TipoTarget:
710
+ calib.imgs.append(np.ascontiguousarray(da[data.RigaPart:data.RigaPart+data.ImgH,data.ColPart:data.ColPart+data.ImgW],dtype=npType))
711
+
712
+
713
+ self.bufferSize=0
714
+ for f in self.bufferImg:#deleting buffer if to big
715
+ a:np.ndarray=self.bufferImg[f]
716
+ if a is not None:
717
+ self.bufferSize+=a.size*a.itemsize
718
+ if self.bufferSize>bufferSizeLimit:
719
+ imgList=list(self.bufferImg)
720
+ k=0
721
+ while self.bufferSize>bufferSizeLimit and len(imgList) and imgList[k] not in self.VISpar.imList:
722
+ f=imgList[k]
723
+ a=self.bufferImg[f]
724
+ self.bufferSize-=a.size*a.itemsize
725
+ self.bufferImg.pop(f)
726
+ imgList.pop(k)
727
+
728
+ if calib.imgs:
729
+ calib.cal.setImgs(calib.imgs)
730
+ calib.ccMask=calib.cal.getMask()
731
+ pass
732
+ return inddel
733
+
734
+ def initDataFromGui(self,INP:INPpar_CalVi,PRO:PROpar_CalVi):
735
+ #FlagNewImages=self.VISpar.imList!=INP.imList or self.VISpar.imEx!=INP.imEx
736
+ #if not FlagNewImages: return FlagNewImages
737
+ self.VISpar.imList=copy.deepcopy(INP.imList)
738
+ self.VISpar.imEx=copy.deepcopy(INP.imEx)
739
+ calib=self.calibView.calib
740
+ calib.cal.DefaultValues()
741
+ calib.FlagCalibration=False
742
+
743
+ self.FlagResume=0
744
+ #-------------------------------------- %
745
+ # Not in cfg %
746
+ # --------------------------------------%
747
+
748
+ data=calib.cal.data
749
+ calVect=calib.cal.vect
750
+ data.PercErrMax = 0.1 # 0.10 Percentuale massima per errore in posizioneTom da modificare
751
+ # InitParOptCalVi(&dati->POC); #todo
752
+
753
+ #-------------------------------------- %
754
+ # Input and Output parameters %
755
+ # --------------------------------------%
756
+ data.percorso = INP.path #percorso file di input
757
+ data.EstensioneIn = INP.ext #estensione in (b16 o tif)
758
+ data.FlagCam=0 if INP.FlagCam else 1
759
+ data.percorsoOut = INP.path_out # percorso file di output
760
+ data.NomeFileOut = INP.root_out # nome file di output
761
+
762
+ camString=''
763
+ cams=INP.cams
764
+ if INP.FlagCam:
765
+ if len(cams)==1: camString=f'_cam{cams[0]}'
766
+ else:
767
+ cams=[-1]
768
+ calib.cfgName=f'{data.percorsoOut}{data.NomeFileOut}{camString}.cfg'
769
+ data.NCam = len(cams) if INP.FlagCam else 1 # Numero di elementi nel vettore cam (numero di camere da calibrare)
770
+
771
+ if self.VISpar.FlagRunning:
772
+ varName=f'{data.percorsoOut}{data.NomeFileOut}{camString}{outExt.calvi}'
773
+ if os.path.exists(varName):
774
+ try:
775
+ with open(varName, 'rb') as file:
776
+ try:
777
+ var=pickle.load(file)
778
+ except:
779
+ self.FlagResume=-1
780
+ else:
781
+ self.FlagResume=1 if INP.isEqualTo(var[0],exceptions=TABpar().fields,fields=['cams','filenames','x','y','w','h','W','H']) else -1
782
+ INP.printDifferences(var[0])
783
+ #PRO.printDifferences(var[1])
784
+ if self.FlagResume>0:
785
+ self.VISpar.copyfrom(var[2],TABpar().fields+['FlagRunning'])
786
+ except:
787
+ self.FlagResume=-1
788
+ pri.Error.red(f'Error while restoring the previous calibration process file: {varName}.\n{traceback.format_exc()}\n')
789
+
790
+ #-------------------------------------- %
791
+ # Distance between spots %
792
+ # --------------------------------------%
793
+ data.pasX = PRO.DotDx # passo della griglia lungo X
794
+ data.pasY = PRO.DotDy # passo della griglia lungo Y
795
+
796
+ #-------------------------------------- %
797
+ # Calibration parameters %
798
+ # --------------------------------------%
799
+ data.Threshold = PRO.DotThresh # valore percentuale della soglia
800
+ data.FlagPos = (2*bool(PRO.DotColor)-1)*([0,3,4,5,1,2][PRO.DotTypeSearch]+1) # Tipo ricerca pallino 1 CC 2 Interp 3 geom Positivi pallini bianchi negativi pallini neri 4 e 5 TopHat piu gaussiana 6 gaussiana
801
+ #Cal = (TipoCal >> CalFlags.SHIFT) & CalFlags.MASK;
802
+ #Cyl = (TipoCal >> CalFlags.SHIFT_CYL) & CalFlags.MASK;
803
+ data.raggioInizialeRicerca=int(PRO.DotDiam*2.5)
804
+ calType=PRO.CalibProcType
805
+ F_Ph=int(PRO.FlagPinhole)
806
+ F_Pl=int(PRO.FlagPlane)
807
+ F_Sa=int(PRO.FlagSaveLOS)
808
+ P_Cyl=PRO.CorrMod_Cyl
809
+ P_Ph=0
810
+ data.TipoCal=calib.toTipoCal(calType,F_Ph,F_Pl,F_Sa,P_Cyl,P_Ph) # Calibration type [Type F_Ph F_Pl F_Sa P_Cyl P_Ph]
811
+
812
+ #-------------------------------------- %
813
+ # Image Parameters %
814
+ # --------------------------------------%
815
+ data.ImgW=INP.w
816
+ data.ImgH=INP.h
817
+ data.ColPart=INP.x
818
+ data.RigaPart=INP.y
819
+
820
+ #-------------------------------------- %
821
+ # Target parameters %
822
+ # --------------------------------------%
823
+ data.TipoTarget = PRO.TargetType # Tipo di target 0 normale singolo piano 1 doppio piano con dx dy sfalsato al 50%)
824
+ data.dx = PRO.OriginXShift # TipoTarget==1 sfasamento fra i piani target altirmenti non utlizzato
825
+ data.dy = PRO.OriginYShift # TipoTarget==1 sfasamento fra i piani target altirmenti non utlizzato
826
+ data.dz = PRO.OriginZShift # TipoTarget==1 distanza fra i piani target altirmenti non utlizzato
827
+ if data.TipoTarget==0: data.dx = data.dy = data.dz = 0
828
+ data.Numpiani_PerCam=len(INP.filenames)*(data.TipoTarget+1) # numero di piani da calibrare per camera in caso di target doppio piano inserire 2 * numero di spostamenti target
829
+ data.Numpiani = data.NCam * data.Numpiani_PerCam
830
+
831
+ if len(INP.filenames) <1 : #when initializing the filenames are not known
832
+ calib.nCams=0
833
+ calib.cams=[]
834
+ calib.nPlanes=0
835
+ calib.nPlanesPerCam=0
836
+ self.VISpar.nPlane=calib.nPlanesPerCam
837
+ self.VISpar.nCam=calib.nCams
838
+ return
839
+
840
+ CamModType=[1,2,3,10,30][PRO.CamMod]
841
+ if CamModType in (1,2,3):
842
+ modPar=[PRO.XDeg,PRO.YDeg,PRO.ZDeg]
843
+ elif CamModType==10:
844
+ CamModType+=[0,2,4][PRO.CorrMod]
845
+ modPar=[PRO.PixAR,PRO.PixPitch]
846
+ elif CamModType==30:
847
+ CamModType+=[0,2,4,5,6,7,8][PRO.CorrMod]
848
+ modPar=[PRO.PixAR,PRO.PixPitch,PRO.CylRad,PRO.CylThick,PRO.CylNRatio]
849
+ additionalPar=[CamModType]+modPar # Calibration type and parameters (12)
850
+
851
+ calib.cal.allocAndinit(additionalPar,0)
852
+ for i,c in enumerate (cams):
853
+ calVect.cam[i]=c
854
+
855
+ # -------------------------------------- %
856
+ # Plane img name and coordinates %
857
+ # -------------------------------------- %
858
+ imgRoot=[]
859
+ for f in INP.filenames:
860
+ if data.FlagCam==0:
861
+ imgRoot.append(os.path.splitext(f)[0].replace('_cam*',''))
862
+ else:
863
+ imgRoot.append(os.path.splitext(f)[0])
864
+
865
+
866
+ if calType:
867
+ z=[0.0]*len(INP.plapar)
868
+ costPlanes=INP.plapar
869
+ else:
870
+ z=[p[-1] for p in INP.plapar]
871
+ costPlanes=[[0.0]*5+[zk] for zk in z]
872
+ if data.TipoTarget==1:
873
+ for k in range(len(INP.filenames)):
874
+ k2=k*2+1
875
+ imgRootk=imgRoot[2*k]
876
+ imgRoot.insert(k2,imgRootk)
877
+ zk=z[2*k]
878
+ z.insert(k2,zk+data.dz)
879
+ cP=costPlanes[2*k]
880
+ cP2=[c for c in cP]
881
+ cP2[-1]+=data.dz
882
+ costPlanes.insert(k2,cP2)
883
+ pass
884
+
885
+
886
+ for p1 in range(data.Numpiani_PerCam):
887
+ for c in range(data.NCam):
888
+ p=p1+c*data.Numpiani_PerCam
889
+ calib.cal.setImgRoot(p,imgRoot[p1])
890
+ calVect.z[p] = z[p1]
891
+
892
+ if self.FlagResume<=0:
893
+ calVect.XOr[p] = calVect.YOr[p] = calVect.angCol[p] = calVect.angRow[p] = calVect.xOrShift[p] = calVect.yOrShift[p] = 0
894
+ calib.cal.setPuTrovaCC([0,0,0,0],p)
895
+ calVect.dColPix[p] =calVect.dRigPix[p] = 10000 #not really important but has to be big
896
+ calVect.remPointsUp[p] = calVect.remPointsDo[p] = calVect.remPointsLe[p] = calVect.remPointsRi[p] = 0
897
+ else:
898
+ calVect.XOr[p] = self.VISpar.orPosAndShift[p][0] + data.ColPart
899
+ calVect.YOr[p] = self.VISpar.orPosAndShift[p][1] + data.RigaPart
900
+ calVect.angCol[p] = self.VISpar.angAndMask[p][0]
901
+ calVect.angRow[p] = self.VISpar.angAndMask[p][1]
902
+
903
+ calVect.xOrShift[p] = round(self.VISpar.orPosAndShift[p][2])
904
+ calVect.yOrShift[p] = round(self.VISpar.orPosAndShift[p][3])
905
+
906
+ self.calibView.calib.cal.setPuTrovaCC(self.VISpar.angAndMask[p][2:],p)
907
+ #calVect.flagPlane[p]|= PaIRS_lib.CalFlags.PLANE_NOT_INIT_TROVA_PUNTO|PaIRS_lib.CalFlags.PLANE_NOT_FOUND
908
+ #self.cal.getPuTrovaCC(p)
909
+ calVect.dColPix[p] = round(self.VISpar.spotDistAndRemoval[p][0])
910
+ calVect.dRigPix[p] = round(self.VISpar.spotDistAndRemoval[p][1])
911
+ #self.cal.calcBounds(p)
912
+ calVect.remPointsUp[p] = round(self.VISpar.spotDistAndRemoval[p][2])
913
+ calVect.remPointsDo[p] = round(self.VISpar.spotDistAndRemoval[p][3])
914
+ calVect.remPointsLe[p] = round(self.VISpar.spotDistAndRemoval[p][4])
915
+ calVect.remPointsRi[p] = round(self.VISpar.spotDistAndRemoval[p][5])
916
+
917
+
918
+ if calType!=0: #no standard calibration planes involved
919
+ calVect.costPlanes[p1]=costPlanes[p1]
920
+ calib.cal.allocAndinit(additionalPar,1)
921
+ errorFiles=[[],[]]
922
+ if calType >= 2:# Calibrazione piano per controllo Legge le costanti di calibrazione
923
+ # si devono leggere o passare le costanti di calibrazione
924
+ for cam in range(data.NCam):
925
+ buffer=f'{data.percorso}{data.NomeFileOut}{abs(calVect.cam[cam])}.cal'
926
+ if os.path.exists(buffer):
927
+ try:
928
+ calib.readCalFile(buffer,calVect.cost[cam],data.NumCostCalib,CamModType)
929
+ except Exception as inst:
930
+ errorFiles[1].append(f'{os.path.basename(buffer)} ({inst})')
931
+ else:
932
+ errorFiles[0].append(f'{os.path.basename(buffer)}')
933
+ errorMessage=''
934
+ if len(errorFiles[0]) or len(errorFiles[1]):
935
+ errorMessage='Error while initialising the calibration process.\n\n'
936
+ if len(errorFiles[0]):
937
+ errList=f";\n ".join(errorFiles[0])
938
+ errorMessage+=f'The following files do not exist in the specified path ({data.percorso}):\n {errList}.\n\n'
939
+ if len(errorFiles[1]):
940
+ errList=f";\n ".join(errorFiles[1])
941
+ errorMessage+=f'There were errors with opening the following files in the specified path ({data.percorso}):\n {errList}.'
942
+ #pri.Error.blue(errorMessage)
943
+ self.VISpar.errorMessage=errorMessage
944
+
945
+ calib.cal.allocAndinit(additionalPar,2)
946
+
947
+ pri.Process.yellow(f'TipoCal = [{calType} {F_Ph} {F_Pl} {F_Sa} {P_Cyl} {P_Ph}]')
948
+ pri.Process.yellow(f'initDataFromGui: additionalPar={additionalPar}')
949
+ pri.Process.yellow(f'initDataFromGui: plapar={INP.plapar}, z={z}')
950
+ pri.Process.yellow(f'initDataFromGui: calVect.z={calVect.z}')
951
+
952
+
953
+ calib.nCams=calib.cal.data.NCam
954
+ calib.cams=calib.cal.getCams()
955
+ calib.nPlanes=calib.cal.data.Numpiani
956
+
957
+ calib.nPlanesPerCam=calib.cal.data.Numpiani_PerCam
958
+ self.VISpar.nPlane=calib.nPlanesPerCam
959
+ self.VISpar.nCam=calib.nCams
960
+ self.FlagInitData=True
961
+ return
962
+
963
+ def setRunCalViButtonLayout(self):
964
+ if self.gui:
965
+ FlagVisible=True
966
+ calib=self.calibView.calib
967
+ calVect=calib.cal.vect
968
+ FlagVisible=all([not bool(p) for p in calVect.flagPlane[:-1]])
969
+ self.gui.ui.button_Run_CalVi.setVisible(FlagVisible)
970
+
971
+
972
+
973
+
974
+ if __name__ == "__main__":
975
+ import sys
976
+ app=QApplication.instance()
977
+ if not app:app = QApplication(sys.argv)
978
+ app.setStyle('Fusion')
979
+ object = Vis_Tab_CalVi(None)
980
+ object.show()
981
+ app.exec()
982
+ app.quit()
983
+ app=None