gratinglab 0.2.2__tar.gz → 0.2.3__tar.gz

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 (192) hide show
  1. {gratinglab-0.2.2/src/gratinglab.egg-info → gratinglab-0.2.3}/PKG-INFO +1 -1
  2. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/__init__.py +1 -1
  3. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/theme.py +22 -0
  4. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/qt/boundary_view.py +11 -20
  5. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/qt/canvas.py +18 -13
  6. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/qt/efficiency_dialog.py +3 -2
  7. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/qt/import_view.py +11 -21
  8. gratinglab-0.2.3/src/gratinglab/metrology/gui/qt/layout.py +46 -0
  9. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/qt/main_window.py +3 -16
  10. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/qt/swath_dialog.py +3 -2
  11. {gratinglab-0.2.2 → gratinglab-0.2.3/src/gratinglab.egg-info}/PKG-INFO +1 -1
  12. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab.egg-info/SOURCES.txt +1 -0
  13. {gratinglab-0.2.2 → gratinglab-0.2.3}/LICENSE +0 -0
  14. {gratinglab-0.2.2 → gratinglab-0.2.3}/README.md +0 -0
  15. {gratinglab-0.2.2 → gratinglab-0.2.3}/pyproject.toml +0 -0
  16. {gratinglab-0.2.2 → gratinglab-0.2.3}/setup.cfg +0 -0
  17. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/checks.py +0 -0
  18. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/compare.py +0 -0
  19. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/convergence.py +0 -0
  20. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/geometry.py +0 -0
  21. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/__init__.py +0 -0
  22. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/app.py +0 -0
  23. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/cmethod_options.py +0 -0
  24. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/diagram.py +0 -0
  25. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/diagram3d.py +0 -0
  26. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/docs.py +0 -0
  27. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/efficiency_plot.py +0 -0
  28. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/icon.py +0 -0
  29. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/integral_options.py +0 -0
  30. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/launcher.py +0 -0
  31. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/mathtext.py +0 -0
  32. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/orders.py +0 -0
  33. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/provenance.py +0 -0
  34. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/__init__.py +0 -0
  35. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/cmethod_tab.py +0 -0
  36. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/geometry_panel.py +0 -0
  37. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/geometry_tab.py +0 -0
  38. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/integral_tab.py +0 -0
  39. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/launcher.py +0 -0
  40. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/main_window.py +0 -0
  41. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/profile_plot_panel.py +0 -0
  42. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/rcwa_tab.py +0 -0
  43. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/scalar_tab.py +0 -0
  44. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/scene3d_panel.py +0 -0
  45. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/setup_tab.py +0 -0
  46. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/sizing.py +0 -0
  47. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/theming.py +0 -0
  48. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/theory_viewer.py +0 -0
  49. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/qt/worker.py +0 -0
  50. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/rcwa_options.py +0 -0
  51. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/richtext.py +0 -0
  52. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/scalar_options.py +0 -0
  53. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/gui/state.py +0 -0
  54. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/illumination.py +0 -0
  55. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/io/__init__.py +0 -0
  56. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/io/boundary.py +0 -0
  57. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/io/efficiency_table.py +0 -0
  58. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/io/ggp.py +0 -0
  59. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/materials/__init__.py +0 -0
  60. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/materials/data/SOURCES.md +0 -0
  61. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/materials/fresnel.py +0 -0
  62. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/materials/optical.py +0 -0
  63. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/materials/refractiveindex.py +0 -0
  64. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/measured.py +0 -0
  65. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/__init__.py +0 -0
  66. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/analyzer.py +0 -0
  67. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/boundary/__init__.py +0 -0
  68. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/boundary/average.py +0 -0
  69. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/boundary/pipeline.py +0 -0
  70. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/boundary/swaths.py +0 -0
  71. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/cli.py +0 -0
  72. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/config.py +0 -0
  73. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/core/__init__.py +0 -0
  74. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/core/analysis.py +0 -0
  75. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/core/image_flatten.py +0 -0
  76. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/core/orientation.py +0 -0
  77. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/core/processing.py +0 -0
  78. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/core/region_mask.py +0 -0
  79. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/core/scars.py +0 -0
  80. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/core/tip.py +0 -0
  81. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/data/__init__.py +0 -0
  82. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/data/aggregation.py +0 -0
  83. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/__init__.py +0 -0
  84. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/icon.py +0 -0
  85. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/qt/__init__.py +0 -0
  86. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/qt/app.py +0 -0
  87. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/qt/wiki_view.py +0 -0
  88. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/qt/worker.py +0 -0
  89. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/gui/state.py +0 -0
  90. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/io/__init__.py +0 -0
  91. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/io/file_io.py +0 -0
  92. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/io/ibw.py +0 -0
  93. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/io/metrics.py +0 -0
  94. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/io/spm.py +0 -0
  95. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/settings.py +0 -0
  96. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/stats/__init__.py +0 -0
  97. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/stats/analysis.py +0 -0
  98. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/stats/icc.py +0 -0
  99. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/visualization/__init__.py +0 -0
  100. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/visualization/diagnostics.py +0 -0
  101. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/visualization/profiles.py +0 -0
  102. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/visualization/statistics.py +0 -0
  103. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/wiki/__init__.py +0 -0
  104. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/wiki/facet-fitting.md +0 -0
  105. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/wiki/file-formats.md +0 -0
  106. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/wiki/flattening.md +0 -0
  107. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/wiki/groove-orientation.md +0 -0
  108. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/wiki/icc-correction.md +0 -0
  109. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/wiki/overview.md +0 -0
  110. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/wiki/reading-outputs.md +0 -0
  111. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/wiki/row-groups.md +0 -0
  112. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/wiki/scars-and-masking.md +0 -0
  113. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/wiki/swath-statistics.md +0 -0
  114. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/wiki/tip-correction.md +0 -0
  115. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/metrology/workflows.py +0 -0
  116. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/problem.py +0 -0
  117. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/profiles.py +0 -0
  118. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/resolution.py +0 -0
  119. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/result.py +0 -0
  120. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/__init__.py +0 -0
  121. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/_conditioning.py +0 -0
  122. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/_execution.py +0 -0
  123. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/base.py +0 -0
  124. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/cmethod/__init__.py +0 -0
  125. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/cmethod/_core.py +0 -0
  126. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/cmethod/_series.py +0 -0
  127. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/integral/__init__.py +0 -0
  128. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/integral/_boundary.py +0 -0
  129. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/integral/_core.py +0 -0
  130. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/integral/_finite.py +0 -0
  131. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/integral/_greens.py +0 -0
  132. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/integral/_kernels.py +0 -0
  133. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/integral/_nystrom.py +0 -0
  134. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/rcwa/__init__.py +0 -0
  135. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/rcwa/_core.py +0 -0
  136. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/rcwa/_stack.py +0 -0
  137. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab/solvers/scalar.py +0 -0
  138. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab.egg-info/dependency_links.txt +0 -0
  139. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab.egg-info/entry_points.txt +0 -0
  140. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab.egg-info/requires.txt +0 -0
  141. {gratinglab-0.2.2 → gratinglab-0.2.3}/src/gratinglab.egg-info/top_level.txt +0 -0
  142. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_changelog.py +0 -0
  143. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_checks.py +0 -0
  144. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_cmethod.py +0 -0
  145. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_compare.py +0 -0
  146. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_conditioning.py +0 -0
  147. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_convergence.py +0 -0
  148. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_cross_method.py +0 -0
  149. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_efficiency_table.py +0 -0
  150. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_fresnel.py +0 -0
  151. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_geometry.py +0 -0
  152. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_ggp.py +0 -0
  153. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_cmethod_options.py +0 -0
  154. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_cmethod_tab.py +0 -0
  155. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_diagram.py +0 -0
  156. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_diagram3d.py +0 -0
  157. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_docs.py +0 -0
  158. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_integral_options.py +0 -0
  159. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_launcher.py +0 -0
  160. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_mathtext.py +0 -0
  161. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_orders.py +0 -0
  162. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_provenance.py +0 -0
  163. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_qt.py +0 -0
  164. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_rcwa_options.py +0 -0
  165. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_richtext.py +0 -0
  166. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_scalar_options.py +0 -0
  167. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_state.py +0 -0
  168. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_gui_theme.py +0 -0
  169. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_illumination.py +0 -0
  170. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_integral_core.py +0 -0
  171. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_integral_corpus.py +0 -0
  172. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_integral_finite.py +0 -0
  173. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_integral_graded.py +0 -0
  174. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_integral_greens.py +0 -0
  175. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_integral_kernels.py +0 -0
  176. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_integral_operators.py +0 -0
  177. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_integral_solver.py +0 -0
  178. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_io_boundary.py +0 -0
  179. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_materials.py +0 -0
  180. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_measured.py +0 -0
  181. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_perturbation.py +0 -0
  182. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_profiles.py +0 -0
  183. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_rayleigh_anomaly.py +0 -0
  184. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_rcwa.py +0 -0
  185. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_rcwa_benchmarks.py +0 -0
  186. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_refractiveindex.py +0 -0
  187. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_resolution.py +0 -0
  188. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_result.py +0 -0
  189. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_scalar.py +0 -0
  190. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_solver_conformance.py +0 -0
  191. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_solver_execution.py +0 -0
  192. {gratinglab-0.2.2 → gratinglab-0.2.3}/tests/test_solver_progress.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gratinglab
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Open platform for diffraction grating groove metrology and efficiency analysis
5
5
  Author: Jake McCoy, Aditi Gangadharan
6
6
  License: BSD-3-Clause
@@ -22,7 +22,7 @@ from .measured import MeasuredEfficiency, MeasurementProvenance
22
22
  from .resolution import ResolvingPower, resolving_power
23
23
  from .result import EfficiencyScan, OrderEfficiency, Provenance
24
24
 
25
- __version__ = "0.2.2"
25
+ __version__ = "0.2.3"
26
26
 
27
27
  __all__ = [
28
28
  "Illumination",
@@ -37,6 +37,7 @@ __all__ = [
37
37
  "order_colors",
38
38
  "provenance_colors",
39
39
  "rc_params",
40
+ "set_titles",
40
41
  "style_axes",
41
42
  "style_figure",
42
43
  ]
@@ -308,6 +309,27 @@ def style_axes(axes, theme: Theme) -> None:
308
309
  axis.line.set_color(theme.ink)
309
310
 
310
311
 
312
+ #: Plot titles: what the panel is, at this size and weight, left-aligned.
313
+ TITLE_SIZE = 11
314
+ TITLE_WEIGHT = "semibold"
315
+ #: The figures a panel reports beside its title, smaller and in ``muted``.
316
+ DETAIL_SIZE = 9
317
+
318
+
319
+ def set_titles(axes, title: str, detail: str | None = None, theme: Theme | None = None) -> None:
320
+ """Title a panel: its name on the left, the numbers it reports on the right.
321
+
322
+ One style for every plot, so a title says what the panel is and never has
323
+ to carry a measurement, a setting or an explanation on a second line. The
324
+ detail is where those go, quieter than the title. Pass ``theme`` from a
325
+ caller that has one; otherwise the plain ``LIGHT`` colours are used.
326
+ """
327
+ theme = theme or LIGHT
328
+ axes.set_title(title, loc="left", fontsize=TITLE_SIZE, fontweight=TITLE_WEIGHT,
329
+ color=theme.ink)
330
+ axes.set_title(detail or "", loc="right", fontsize=DETAIL_SIZE, color=theme.muted)
331
+
332
+
311
333
  def style_figure(figure, theme: Theme) -> None:
312
334
  """Restyle an existing figure and every axes on it."""
313
335
  figure.set_facecolor(theme.figure)
@@ -21,14 +21,16 @@ import os
21
21
  from . import * # noqa: F401,F403 - sets QT_API before matplotlib's shim loads
22
22
 
23
23
  from PySide6.QtWidgets import (
24
- QCheckBox, QFileDialog, QFrame, QGroupBox, QHBoxLayout, QLabel,
25
- QMessageBox, QPushButton, QScrollArea, QSpinBox, QVBoxLayout, QWidget,
24
+ QCheckBox, QFileDialog, QGroupBox, QHBoxLayout, QLabel,
25
+ QMessageBox, QPushButton, QSpinBox, QVBoxLayout, QWidget,
26
26
  )
27
27
  from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
28
28
  from matplotlib.figure import Figure
29
29
 
30
30
  from gratinglab.gui.qt import theming
31
- from gratinglab.gui.theme import style_figure
31
+ from gratinglab.gui.theme import set_titles, style_figure
32
+
33
+ from .layout import controls_beside
32
34
 
33
35
  from ...boundary import build_boundary_profile
34
36
  from ...core.tip import format_angles
@@ -65,7 +67,6 @@ class BoundaryView(QWidget):
65
67
  root.setSpacing(8)
66
68
 
67
69
  left = QWidget()
68
- left.setFixedWidth(272)
69
70
  column = QVBoxLayout(left)
70
71
  column.setContentsMargins(0, 0, 0, 0)
71
72
  column.setSpacing(8)
@@ -73,23 +74,12 @@ class BoundaryView(QWidget):
73
74
  column.addWidget(self._build_metrics_group())
74
75
  column.addStretch()
75
76
 
76
- scroll = QScrollArea()
77
- scroll.setWidget(left)
78
- scroll.setWidgetResizable(True)
79
- scroll.setFixedWidth(292)
80
- scroll.setFrameShape(QFrame.NoFrame)
81
-
82
77
  self.figure = Figure(figsize=(8, 6), tight_layout=True)
83
78
  self.canvas = FigureCanvas(self.figure)
84
79
  self._show_placeholder()
85
80
  theming.subscribe(self._on_theme)
86
81
 
87
- root.addWidget(scroll)
88
- divider = QFrame()
89
- divider.setFrameShape(QFrame.VLine)
90
- divider.setFrameShadow(QFrame.Sunken)
91
- root.addWidget(divider)
92
- root.addWidget(self.canvas, stretch=1)
82
+ root.addWidget(controls_beside(left, self.canvas), stretch=1)
93
83
 
94
84
  def _build_export_group(self):
95
85
  group = QGroupBox("Boundary profile")
@@ -327,7 +317,8 @@ class BoundaryView(QWidget):
327
317
  alpha=0.8 if dark else 0.6)
328
318
  avg_ax.set_xlabel("Position (nm)", fontsize=10)
329
319
  avg_ax.set_ylabel("Height (nm)", fontsize=10)
330
- avg_ax.set_title("Averaged groove", fontsize=10)
320
+ set_titles(avg_ax, "Averaged groove", f"{p.n_used} grooves",
321
+ theming.current())
331
322
  avg_ax.legend(fontsize=8)
332
323
  avg_ax.grid(True, alpha=0.3)
333
324
 
@@ -336,9 +327,9 @@ class BoundaryView(QWidget):
336
327
  norm_ax.axhline(0, color=theming.current().ink, linestyle='--', linewidth=0.5)
337
328
  norm_ax.set_xlabel("Normalised position (0 to 1 = one period)", fontsize=10)
338
329
  norm_ax.set_ylabel("Height (fraction of period)", fontsize=10)
339
- norm_ax.set_title(
340
- f"Exported profile: {len(p.x_norm)} points, "
341
- f"depth {p.metrics['groove_depth']:.4f} of period", fontsize=10)
330
+ set_titles(norm_ax, "Exported profile",
331
+ f"{len(p.x_norm)} points, depth {p.metrics['groove_depth']:.4f} "
332
+ "of period", theming.current())
342
333
  norm_ax.grid(True, alpha=0.3)
343
334
 
344
335
  self.canvas.draw()
@@ -17,7 +17,7 @@ from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
17
17
  from matplotlib.figure import Figure
18
18
 
19
19
  from gratinglab.gui.qt import theming
20
- from gratinglab.gui.theme import style_figure
20
+ from gratinglab.gui.theme import set_titles, style_figure
21
21
 
22
22
  __all__ = ["PlotCanvas"]
23
23
 
@@ -71,7 +71,8 @@ class PlotCanvas(FigureCanvas):
71
71
  ax.plot(disp_um, profile_nm, color='steelblue', linewidth=1.0)
72
72
  ax.set_xlabel("Position (µm)", fontsize=11)
73
73
  ax.set_ylabel("Height (nm)", fontsize=11)
74
- ax.set_title(f"Raw profile, scan width {scan_size_um:.3f} µm", fontsize=11)
74
+ set_titles(ax, "Raw profile", f"scan width {scan_size_um:.3f} µm",
75
+ theming.current())
75
76
  ax.grid(True, alpha=0.3)
76
77
  self.draw()
77
78
 
@@ -84,7 +85,8 @@ class PlotCanvas(FigureCanvas):
84
85
  self.fig.colorbar(im, ax=ax, label='Height (nm)')
85
86
  ax.set_xlabel("X (µm)", fontsize=11)
86
87
  ax.set_ylabel("Scan line", fontsize=11)
87
- ax.set_title("Topography", fontsize=11)
88
+ set_titles(ax, "Topography", f"{data.shape[0]} scan lines",
89
+ theming.current())
88
90
  self.draw()
89
91
 
90
92
  @_remembered
@@ -102,9 +104,9 @@ class PlotCanvas(FigureCanvas):
102
104
  linewidth=1.8, label=f'Mean (n={n_groups})', zorder=5)
103
105
  ax.set_xlabel("Position (µm)", fontsize=11)
104
106
  ax.set_ylabel("Height (nm)", fontsize=11)
105
- ax.set_title("Row-group profiles\n"
106
- f"{n_groups} groups × {group_info['rows_per_group']} rows each | "
107
- f"Scan width: {scan_size_um:.3f} µm", fontsize=10)
107
+ set_titles(ax, "Row-group profiles",
108
+ f"{n_groups} groups of {group_info['rows_per_group']} rows, "
109
+ f"scan width {scan_size_um:.3f} µm", theming.current())
108
110
  ax.legend(fontsize=10)
109
111
  ax.grid(True, alpha=0.3)
110
112
 
@@ -140,7 +142,8 @@ class PlotCanvas(FigureCanvas):
140
142
 
141
143
  ax.set_xlabel("Position (µm)", fontsize=11)
142
144
  ax.set_ylabel("Height (nm)", fontsize=11)
143
- ax.set_title("Groove detection", fontsize=11)
145
+ set_titles(ax, "Groove detection", f"{len(centers)} grooves",
146
+ theming.current())
144
147
  ax.legend(fontsize=9)
145
148
  ax.grid(True, alpha=0.3)
146
149
  self.draw()
@@ -160,8 +163,8 @@ class PlotCanvas(FigureCanvas):
160
163
  label=f'Mean {mean:.2f}°')
161
164
  ax1.set_xlabel("Blaze angle (°)", fontsize=10)
162
165
  ax1.set_ylabel("Count", fontsize=10)
163
- ax1.set_title(f"Distribution (N={len(angles)})\nσ={result['std_angle']:.2f}°",
164
- fontsize=10)
166
+ set_titles(ax1, "Distribution",
167
+ f"N = {len(angles)}, σ = {result['std_angle']:.2f}°", theming.current())
165
168
  ax1.legend(fontsize=9)
166
169
  ax1.grid(True, alpha=0.3)
167
170
 
@@ -169,16 +172,18 @@ class PlotCanvas(FigureCanvas):
169
172
  ax2.hist(r2, bins=20, edgecolor=theming.current().ink, alpha=0.75, color='seagreen')
170
173
  ax2.set_xlabel("Fit R²", fontsize=10)
171
174
  ax2.set_ylabel("Count", fontsize=10)
172
- ax2.set_title(f"Fit quality\nworst R² = {np.nanmin(r2):.4f}", fontsize=10)
175
+ set_titles(ax2, "Fit quality", f"worst R² {np.nanmin(r2):.4f}",
176
+ theming.current())
173
177
  ax2.grid(True, alpha=0.3)
174
178
 
175
179
  widths = np.array([q.get('blaze_width_nm', np.nan) for q in quality])
176
180
  ax3.plot(widths, angles, 'o', markersize=4, alpha=0.45, color='darkorange')
177
181
  ax3.set_xlabel("Blaze facet width (nm)", fontsize=10)
178
182
  ax3.set_ylabel("Blaze angle (°)", fontsize=10)
179
- ax3.set_title("Angle vs facet width\n(narrow facets = unreliable fits)",
180
- fontsize=10)
183
+ set_titles(ax3, "Angle against facet width", "narrow facets fit poorly",
184
+ theming.current())
181
185
  ax3.grid(True, alpha=0.3)
182
186
 
183
- self.fig.suptitle(f"Blaze angle {mean:.2f}° ± {sem:.3f}° (SEM)", fontsize=11)
187
+ self.fig.suptitle(f"Blaze angle {mean:.2f}° ± {sem:.3f}° (SEM)",
188
+ x=0.01, ha="left", fontsize=12, fontweight="semibold")
184
189
  self.draw()
@@ -36,7 +36,7 @@ from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
36
36
  from matplotlib.figure import Figure
37
37
 
38
38
  from gratinglab.gui.qt import theming
39
- from gratinglab.gui.theme import style_figure
39
+ from gratinglab.gui.theme import set_titles, style_figure
40
40
 
41
41
  from gratinglab import materials
42
42
  from gratinglab.illumination import Illumination
@@ -286,7 +286,8 @@ class EfficiencyDialog(QDialog):
286
286
 
287
287
  axes.set_xlabel("Wavelength (nm)")
288
288
  axes.set_ylabel("Absolute efficiency")
289
- axes.set_title(f"Measured groove, period {self._profile.period_nm:.2f} nm")
289
+ set_titles(axes, "Measured groove",
290
+ f"period {self._profile.period_nm:.2f} nm", theming.current())
290
291
  axes.grid(True, alpha=0.3)
291
292
  axes.set_ylim(bottom=0)
292
293
  if carried:
@@ -22,14 +22,16 @@ from . import * # noqa: F401,F403 - sets QT_API before matplotlib's shim loads
22
22
  import numpy as np
23
23
  from PySide6.QtCore import Signal
24
24
  from PySide6.QtWidgets import (
25
- QApplication, QComboBox, QDoubleSpinBox, QFileDialog, QFrame, QGroupBox,
26
- QHBoxLayout, QLabel, QPushButton, QScrollArea, QSpinBox, QVBoxLayout, QWidget,
25
+ QApplication, QComboBox, QDoubleSpinBox, QFileDialog, QGroupBox,
26
+ QHBoxLayout, QLabel, QPushButton, QSpinBox, QVBoxLayout, QWidget,
27
27
  )
28
28
  from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
29
29
  from matplotlib.figure import Figure
30
30
 
31
31
  from gratinglab.gui.qt import theming
32
- from gratinglab.gui.theme import style_figure
32
+ from gratinglab.gui.theme import set_titles, style_figure
33
+
34
+ from .layout import controls_beside
33
35
  from matplotlib.patches import Rectangle
34
36
  from matplotlib.widgets import RectangleSelector
35
37
 
@@ -96,7 +98,6 @@ class ImportView(QWidget):
96
98
  root.setSpacing(8)
97
99
 
98
100
  left = QWidget()
99
- left.setFixedWidth(272)
100
101
  column = QVBoxLayout(left)
101
102
  column.setContentsMargins(0, 0, 0, 0)
102
103
  column.setSpacing(8)
@@ -106,23 +107,12 @@ class ImportView(QWidget):
106
107
  column.addWidget(self._build_profile_group())
107
108
  column.addStretch()
108
109
 
109
- scroll = QScrollArea()
110
- scroll.setWidget(left)
111
- scroll.setWidgetResizable(True)
112
- scroll.setFixedWidth(292)
113
- scroll.setFrameShape(QFrame.NoFrame)
114
-
115
110
  self.figure = Figure(figsize=(8, 6), tight_layout=True)
116
111
  self.canvas = FigureCanvas(self.figure)
117
112
  self._show_placeholder()
118
113
  theming.subscribe(self._on_theme)
119
114
 
120
- root.addWidget(scroll)
121
- divider = QFrame()
122
- divider.setFrameShape(QFrame.VLine)
123
- divider.setFrameShadow(QFrame.Sunken)
124
- root.addWidget(divider)
125
- root.addWidget(self.canvas, stretch=1)
115
+ root.addWidget(controls_beside(left, self.canvas), stretch=1)
126
116
 
127
117
  def _build_file_group(self):
128
118
  group = QGroupBox("File")
@@ -574,8 +564,8 @@ class ImportView(QWidget):
574
564
  minspanx=0, minspany=0, spancoords='data', interactive=False,
575
565
  props=dict(facecolor='crimson', edgecolor='crimson', alpha=0.25,
576
566
  fill=True))
577
- image_ax.set_title(
578
- f"Image flattening: {self.image_method_combo.currentText()}", fontsize=10)
567
+ set_titles(image_ax, "Image flattening",
568
+ self.image_method_combo.currentText(), theming.current())
579
569
 
580
570
  try:
581
571
  x_um, profile_nm = raw_data(self._flat, self._scan_size)
@@ -606,9 +596,9 @@ class ImportView(QWidget):
606
596
  linewidth=1.0, label='After flattening')
607
597
  profile_ax.set_xlabel("Position (µm)", fontsize=10)
608
598
  profile_ax.set_ylabel("Height (nm)", fontsize=10)
609
- profile_ax.set_title(
610
- f"Profile flattening: {self.profile_method_combo.currentText()}"
611
- f" (removes {np.ptp(background):.1f} nm of background)", fontsize=10)
599
+ set_titles(profile_ax, "Profile flattening",
600
+ f"{self.profile_method_combo.currentText()}, removes "
601
+ f"{np.ptp(background):.1f} nm of background", theming.current())
612
602
  profile_ax.legend(fontsize=8)
613
603
  profile_ax.grid(True, alpha=0.3)
614
604
 
@@ -0,0 +1,46 @@
1
+ """
2
+ The controls-and-plot layout every AFM tab shares.
3
+
4
+ Each tab was a fixed 272 px column of controls in a 292 px scroll area beside
5
+ its plot, so long labels were crammed and nothing could be widened. A splitter
6
+ replaces that: the column starts wide enough for its contents, cannot be
7
+ dragged narrower than its widest control needs, and gives the plot every pixel
8
+ the window gains.
9
+ """
10
+ from __future__ import annotations
11
+
12
+ from . import * # noqa: F401,F403 - sets QT_API before matplotlib's shim loads
13
+
14
+ from PySide6.QtCore import Qt
15
+ from PySide6.QtWidgets import QFrame, QScrollArea, QSplitter, QWidget
16
+
17
+ __all__ = ["controls_beside", "MIN_CONTROLS_WIDTH", "START_CONTROLS_WIDTH"]
18
+
19
+ #: Narrower than this and the group boxes' labels start to wrap mid-word.
20
+ MIN_CONTROLS_WIDTH = 260
21
+ #: Where the column starts, unless its contents ask for more.
22
+ START_CONTROLS_WIDTH = 320
23
+
24
+
25
+ def controls_beside(controls: QWidget, plot: QWidget) -> QSplitter:
26
+ """A splitter holding the scrolling ``controls`` column and the ``plot``."""
27
+ scroll = QScrollArea()
28
+ scroll.setWidget(controls)
29
+ scroll.setWidgetResizable(True)
30
+ scroll.setFrameShape(QFrame.NoFrame)
31
+ # Width is the splitter's to decide; only the height should ever scroll.
32
+ scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
33
+
34
+ gutter = scroll.verticalScrollBar().sizeHint().width()
35
+ floor = max(MIN_CONTROLS_WIDTH, controls.minimumSizeHint().width() + gutter)
36
+ scroll.setMinimumWidth(floor)
37
+
38
+ splitter = QSplitter(Qt.Horizontal)
39
+ splitter.setChildrenCollapsible(False)
40
+ splitter.addWidget(scroll)
41
+ splitter.addWidget(plot)
42
+ splitter.setStretchFactor(0, 0)
43
+ splitter.setStretchFactor(1, 1)
44
+ start = max(START_CONTROLS_WIDTH, floor)
45
+ splitter.setSizes([start, max(1, 4 * start)])
46
+ return splitter
@@ -18,9 +18,7 @@ from endstation.qt.tokens import StaleGuard
18
18
  from PySide6.QtCore import Qt, QThread, Signal
19
19
  from PySide6.QtGui import QFont
20
20
  from PySide6.QtWidgets import (
21
- QCheckBox, QComboBox, QDoubleSpinBox, QFrame,
22
- QGroupBox, QHBoxLayout, QLabel, QMainWindow, QPushButton, QScrollArea,
23
- QSpinBox, QStatusBar, QTabWidget, QVBoxLayout, QWidget,
21
+ QCheckBox, QComboBox, QDoubleSpinBox, QGroupBox, QHBoxLayout, QLabel, QMainWindow, QPushButton, QSpinBox, QStatusBar, QTabWidget, QVBoxLayout, QWidget,
24
22
  )
25
23
  from matplotlib.backends.backend_qtagg import NavigationToolbar2QT as NavigationToolbar
26
24
 
@@ -28,6 +26,7 @@ from ...core.processing import raw_data, raw_data_multi_group
28
26
  from ...core.tip import TIP_PRESETS, VALID_TIP_CORRECTIONS, format_angles
29
27
  from ...settings import (AnalysisSettings, MAX_FACET_TRIM, VALID_BLAZE_SIDES)
30
28
  from ..state import FormState, build, summarize_result
29
+ from .layout import controls_beside
31
30
  from .canvas import PlotCanvas
32
31
  from .boundary_view import BoundaryView
33
32
  from .import_view import ImportView
@@ -107,7 +106,6 @@ class MainWindow(QMainWindow):
107
106
  root.setSpacing(8)
108
107
 
109
108
  left = QWidget()
110
- left.setFixedWidth(272)
111
109
  left_layout = QVBoxLayout(left)
112
110
  left_layout.setContentsMargins(0, 0, 0, 0)
113
111
  left_layout.setSpacing(8)
@@ -115,12 +113,6 @@ class MainWindow(QMainWindow):
115
113
  left_layout.addWidget(self._build_view_group())
116
114
  left_layout.addStretch()
117
115
 
118
- scroll = QScrollArea()
119
- scroll.setWidget(left)
120
- scroll.setWidgetResizable(True)
121
- scroll.setFixedWidth(292)
122
- scroll.setFrameShape(QFrame.NoFrame)
123
-
124
116
  right = QWidget()
125
117
  right_layout = QVBoxLayout(right)
126
118
  right_layout.setContentsMargins(0, 0, 0, 0)
@@ -129,12 +121,7 @@ class MainWindow(QMainWindow):
129
121
  right_layout.addWidget(self.canvas, stretch=1)
130
122
  right_layout.addWidget(self._build_results_panel())
131
123
 
132
- root.addWidget(scroll)
133
- divider = QFrame()
134
- divider.setFrameShape(QFrame.VLine)
135
- divider.setFrameShadow(QFrame.Sunken)
136
- root.addWidget(divider)
137
- root.addWidget(right, stretch=1)
124
+ root.addWidget(controls_beside(left, right), stretch=1)
138
125
 
139
126
  self.tabs.addTab(central, "Analysis")
140
127
 
@@ -23,7 +23,7 @@ from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
23
23
  from matplotlib.figure import Figure
24
24
 
25
25
  from gratinglab.gui.qt import theming
26
- from gratinglab.gui.theme import style_figure
26
+ from gratinglab.gui.theme import set_titles, style_figure
27
27
 
28
28
  from ...boundary import swath_statistics
29
29
  from ...config import RESULTS_DIR
@@ -144,7 +144,8 @@ class SwathDialog(QDialog):
144
144
  shapes.plot(s.t, s.whole.y_norm, color=theming.current().ink, lw=1.4, ls="--", label="whole scan")
145
145
  shapes.set_xlabel("position (fraction of period)")
146
146
  shapes.set_ylabel("height (fraction of period)")
147
- shapes.set_title(f"{s.n_swaths} swaths, coloured top to bottom of the scan")
147
+ set_titles(shapes, "Groove shape by swath",
148
+ f"{s.n_swaths} swaths, coloured top to bottom", theming.current())
148
149
  shapes.legend(loc="best", fontsize=8)
149
150
 
150
151
  centre = [(a + b - 1) / 2 for a, b in s.row_ranges]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gratinglab
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Open platform for diffraction grating groove metrology and efficiency analysis
5
5
  Author: Jake McCoy, Aditi Gangadharan
6
6
  License: BSD-3-Clause
@@ -90,6 +90,7 @@ src/gratinglab/metrology/gui/qt/boundary_view.py
90
90
  src/gratinglab/metrology/gui/qt/canvas.py
91
91
  src/gratinglab/metrology/gui/qt/efficiency_dialog.py
92
92
  src/gratinglab/metrology/gui/qt/import_view.py
93
+ src/gratinglab/metrology/gui/qt/layout.py
93
94
  src/gratinglab/metrology/gui/qt/main_window.py
94
95
  src/gratinglab/metrology/gui/qt/swath_dialog.py
95
96
  src/gratinglab/metrology/gui/qt/wiki_view.py
File without changes
File without changes
File without changes
File without changes
File without changes