snappy 3.0.3__cp38-cp38-macosx_11_0_arm64.whl → 3.2__cp38-cp38-macosx_11_0_arm64.whl
Sign up to get free protection for your applications and to get access to all the features.
- snappy/CyOpenGL.cpython-38-darwin.so +0 -0
- snappy/SnapPy.cpython-38-darwin.so +0 -0
- snappy/SnapPyHP.cpython-38-darwin.so +0 -0
- snappy/__init__.py +373 -426
- snappy/app.py +240 -75
- snappy/app_menus.py +93 -78
- snappy/browser.py +87 -63
- snappy/cache.py +5 -8
- snappy/canonical.py +249 -0
- snappy/{verify/cusp_shapes.py → cusps/__init__.py} +11 -19
- snappy/cusps/cusp_area_matrix.py +101 -0
- snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +39 -54
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/test.py +21 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +40 -31
- snappy/db_utilities.py +13 -14
- snappy/decorated_isosig.py +377 -133
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +42 -9
- snappy/dev/extended_ptolemy/extended.py +32 -25
- snappy/dev/extended_ptolemy/giac_rur.py +23 -8
- snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
- snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +2 -1
- snappy/dev/vericlosed/gimbalLoopFinder.py +5 -5
- snappy/dev/vericlosed/hyperbolicStructure.py +3 -3
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +2 -2
- snappy/dev/vericlosed/truncatedComplex.py +3 -2
- snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +4 -3
- snappy/doc/_images/geodesics.jpg +0 -0
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
- snappy/doc/_sources/additional_classes.rst.txt +1 -0
- snappy/doc/_sources/credits.rst.txt +6 -1
- snappy/doc/_sources/development.rst.txt +69 -50
- snappy/doc/_sources/index.rst.txt +101 -66
- snappy/doc/_sources/installing.rst.txt +148 -165
- snappy/doc/_sources/news.rst.txt +136 -32
- snappy/doc/_sources/ptolemy.rst.txt +1 -1
- snappy/doc/_sources/ptolemy_examples1.rst.txt +9 -8
- snappy/doc/_sources/ptolemy_examples2.rst.txt +3 -3
- snappy/doc/_sources/ptolemy_examples3.rst.txt +14 -14
- snappy/doc/_sources/ptolemy_prelim.rst.txt +1 -1
- snappy/doc/_sources/snap.rst.txt +2 -2
- snappy/doc/_sources/snappy.rst.txt +1 -1
- snappy/doc/_sources/triangulation.rst.txt +3 -2
- snappy/doc/_sources/verify.rst.txt +89 -29
- snappy/doc/_sources/verify_internals.rst.txt +5 -16
- snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
- snappy/doc/_static/SnapPy.ico +0 -0
- snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
- snappy/doc/_static/basic.css +47 -27
- snappy/doc/_static/css/badge_only.css +1 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
- snappy/doc/_static/css/theme.css +4 -0
- snappy/doc/_static/doctools.js +107 -274
- snappy/doc/_static/documentation_options.js +6 -5
- snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
- snappy/doc/_static/jquery.js +2 -2
- snappy/doc/_static/js/badge_only.js +1 -0
- snappy/doc/_static/js/theme.js +1 -0
- snappy/doc/_static/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +3 -101
- snappy/doc/_static/pygments.css +1 -0
- snappy/doc/_static/searchtools.js +489 -398
- snappy/doc/_static/snappy_furo.css +33 -0
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
- snappy/doc/_static/sphinx_highlight.js +154 -0
- snappy/doc/additional_classes.html +688 -263
- snappy/doc/bugs.html +107 -94
- snappy/doc/censuses.html +155 -127
- snappy/doc/credits.html +115 -104
- snappy/doc/development.html +184 -146
- snappy/doc/genindex.html +287 -204
- snappy/doc/index.html +189 -150
- snappy/doc/installing.html +259 -266
- snappy/doc/manifold.html +1626 -592
- snappy/doc/manifoldhp.html +119 -105
- snappy/doc/news.html +198 -104
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +117 -105
- snappy/doc/platonic_census.html +161 -114
- snappy/doc/plink.html +113 -105
- snappy/doc/ptolemy.html +131 -108
- snappy/doc/ptolemy_classes.html +242 -223
- snappy/doc/ptolemy_examples1.html +144 -130
- snappy/doc/ptolemy_examples2.html +141 -129
- snappy/doc/ptolemy_examples3.html +148 -132
- snappy/doc/ptolemy_examples4.html +131 -111
- snappy/doc/ptolemy_prelim.html +162 -138
- snappy/doc/py-modindex.html +104 -69
- snappy/doc/screenshots.html +117 -108
- snappy/doc/search.html +115 -84
- snappy/doc/searchindex.js +1 -1
- snappy/doc/snap.html +109 -96
- snappy/doc/snappy.html +134 -97
- snappy/doc/spherogram.html +259 -187
- snappy/doc/todo.html +107 -94
- snappy/doc/triangulation.html +1380 -111
- snappy/doc/tutorial.html +107 -94
- snappy/doc/verify.html +194 -125
- snappy/doc/verify_internals.html +248 -686
- snappy/drilling/__init__.py +456 -0
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +5 -0
- snappy/drilling/crush.py +270 -0
- snappy/drilling/cusps.py +125 -0
- snappy/drilling/debug.py +242 -0
- snappy/drilling/epsilons.py +6 -0
- snappy/drilling/exceptions.py +55 -0
- snappy/drilling/moves.py +620 -0
- snappy/drilling/peripheral_curves.py +210 -0
- snappy/drilling/perturb.py +188 -0
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +274 -0
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +126 -0
- snappy/drilling/tracing.py +351 -0
- snappy/exceptions.py +23 -3
- snappy/export_stl.py +20 -14
- snappy/exterior_to_link/__init__.py +2 -0
- snappy/exterior_to_link/barycentric_geometry.py +463 -0
- snappy/exterior_to_link/exceptions.py +6 -0
- snappy/exterior_to_link/geodesic_map.json +14408 -0
- snappy/exterior_to_link/hyp_utils.py +112 -0
- snappy/exterior_to_link/link_projection.py +323 -0
- snappy/exterior_to_link/main.py +197 -0
- snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
- snappy/exterior_to_link/mcomplex_with_link.py +687 -0
- snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
- snappy/exterior_to_link/pl_utils.py +491 -0
- snappy/exterior_to_link/put_in_S3.py +156 -0
- snappy/exterior_to_link/rational_linear_algebra.py +123 -0
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
- snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
- snappy/exterior_to_link/stored_moves.py +475 -0
- snappy/exterior_to_link/test.py +31 -0
- snappy/geometric_structure/__init__.py +212 -0
- snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
- snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
- snappy/geometric_structure/geodesic/__init__.py +0 -0
- snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
- snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
- snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
- snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
- snappy/geometric_structure/geodesic/constants.py +6 -0
- snappy/geometric_structure/geodesic/exceptions.py +22 -0
- snappy/geometric_structure/geodesic/fixed_points.py +93 -0
- snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
- snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
- snappy/geometric_structure/geodesic/line.py +30 -0
- snappy/geometric_structure/geodesic/multiplicity.py +127 -0
- snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +36 -36
- snappy/horoviewer.py +50 -48
- snappy/hyperboloid/__init__.py +212 -0
- snappy/hyperboloid/distances.py +245 -0
- snappy/hyperboloid/horoball.py +19 -0
- snappy/hyperboloid/line.py +35 -0
- snappy/hyperboloid/point.py +9 -0
- snappy/hyperboloid/triangle.py +29 -0
- snappy/{infodialog.py → infowindow.py} +32 -33
- snappy/isometry_signature.py +382 -0
- snappy/len_spec/__init__.py +596 -0
- snappy/len_spec/geodesic_info.py +110 -0
- snappy/len_spec/geodesic_key_info_dict.py +117 -0
- snappy/len_spec/geodesic_piece.py +143 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +80 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
- snappy/len_spec/spine.py +206 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +275 -0
- snappy/len_spec/word.py +86 -0
- snappy/manifolds/__init__.py +1 -1
- snappy/math_basics.py +176 -0
- snappy/matrix.py +525 -0
- snappy/number.py +97 -21
- snappy/numeric_output_checker.py +37 -27
- snappy/pari.py +30 -69
- snappy/phone_home.py +25 -20
- snappy/polyviewer.py +39 -37
- snappy/ptolemy/__init__.py +4 -6
- snappy/ptolemy/component.py +14 -12
- snappy/ptolemy/coordinates.py +312 -295
- snappy/ptolemy/fieldExtensions.py +14 -12
- snappy/ptolemy/findLoops.py +43 -31
- snappy/ptolemy/geometricRep.py +24 -26
- snappy/ptolemy/homology.py +12 -7
- snappy/ptolemy/manifoldMethods.py +69 -70
- snappy/ptolemy/matrix.py +65 -26
- snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +18 -14
- snappy/ptolemy/polynomial.py +125 -119
- snappy/ptolemy/processComponents.py +36 -30
- snappy/ptolemy/processFileBase.py +79 -18
- snappy/ptolemy/processFileDispatch.py +13 -14
- snappy/ptolemy/processMagmaFile.py +44 -39
- snappy/ptolemy/processRurFile.py +18 -11
- snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +20 -17
- snappy/ptolemy/ptolemyObstructionClass.py +13 -17
- snappy/ptolemy/ptolemyVariety.py +190 -121
- snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +20 -19
- snappy/ptolemy/reginaWrapper.py +25 -29
- snappy/ptolemy/rur.py +6 -14
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +27 -22
- snappy/ptolemy/test.py +247 -188
- snappy/ptolemy/utilities.py +41 -43
- snappy/raytracing/__init__.py +64 -0
- snappy/raytracing/additional_horospheres.py +64 -0
- snappy/raytracing/additional_len_spec_choices.py +63 -0
- snappy/raytracing/cohomology_fractal.py +10 -6
- snappy/raytracing/eyeball.py +123 -0
- snappy/raytracing/finite_raytracing_data.py +48 -38
- snappy/raytracing/finite_viewer.py +218 -210
- snappy/raytracing/geodesic_tube_info.py +174 -0
- snappy/raytracing/geodesics.py +246 -0
- snappy/raytracing/geodesics_window.py +258 -0
- snappy/raytracing/gui_utilities.py +152 -40
- snappy/raytracing/hyperboloid_navigation.py +102 -52
- snappy/raytracing/hyperboloid_utilities.py +114 -261
- snappy/raytracing/ideal_raytracing_data.py +256 -179
- snappy/raytracing/inside_viewer.py +522 -253
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +46 -34
- snappy/raytracing/raytracing_view.py +190 -109
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +60 -4
- snappy/raytracing/shaders/fragment.glsl +575 -148
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +98 -0
- snappy/raytracing/view_scale_controller.py +98 -0
- snappy/raytracing/zoom_slider/__init__.py +32 -29
- snappy/raytracing/zoom_slider/test.py +2 -0
- snappy/sage_helper.py +69 -123
- snappy/{preferences.py → settings.py} +167 -145
- snappy/shell.py +4 -0
- snappy/snap/__init__.py +12 -8
- snappy/snap/character_varieties.py +24 -18
- snappy/snap/find_field.py +35 -34
- snappy/snap/fundamental_polyhedron.py +99 -85
- snappy/snap/generators.py +6 -8
- snappy/snap/interval_reps.py +18 -6
- snappy/snap/kernel_structures.py +8 -3
- snappy/snap/mcomplex_base.py +1 -2
- snappy/snap/nsagetools.py +107 -53
- snappy/snap/peripheral/__init__.py +1 -1
- snappy/snap/peripheral/dual_cellulation.py +15 -7
- snappy/snap/peripheral/link.py +20 -16
- snappy/snap/peripheral/peripheral.py +22 -14
- snappy/snap/peripheral/surface.py +47 -50
- snappy/snap/peripheral/test.py +8 -8
- snappy/snap/polished_reps.py +65 -40
- snappy/snap/shapes.py +41 -22
- snappy/snap/slice_obs_HKL.py +64 -25
- snappy/snap/t3mlite/arrow.py +88 -51
- snappy/snap/t3mlite/corner.py +5 -6
- snappy/snap/t3mlite/edge.py +32 -21
- snappy/snap/t3mlite/face.py +7 -9
- snappy/snap/t3mlite/files.py +31 -23
- snappy/snap/t3mlite/homology.py +14 -10
- snappy/snap/t3mlite/linalg.py +158 -56
- snappy/snap/t3mlite/mcomplex.py +739 -291
- snappy/snap/t3mlite/perm4.py +236 -84
- snappy/snap/t3mlite/setup.py +9 -10
- snappy/snap/t3mlite/simplex.py +65 -48
- snappy/snap/t3mlite/spun.py +42 -30
- snappy/snap/t3mlite/surface.py +45 -45
- snappy/snap/t3mlite/test.py +3 -0
- snappy/snap/t3mlite/test_vs_regina.py +17 -13
- snappy/snap/t3mlite/tetrahedron.py +25 -24
- snappy/snap/t3mlite/vertex.py +8 -13
- snappy/snap/test.py +45 -52
- snappy/snap/utilities.py +66 -65
- snappy/test.py +155 -158
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -0
- snappy/tiling/canonical_key_dict.py +59 -0
- snappy/tiling/dict_based_set.py +79 -0
- snappy/tiling/floor.py +49 -0
- snappy/tiling/hyperboloid_dict.py +54 -0
- snappy/tiling/iter_utils.py +78 -0
- snappy/tiling/lifted_tetrahedron.py +22 -0
- snappy/tiling/lifted_tetrahedron_set.py +54 -0
- snappy/tiling/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +215 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +313 -203
- snappy/twister/main.py +1 -8
- snappy/twister/twister_core.cpython-38-darwin.so +0 -0
- snappy/upper_halfspace/__init__.py +146 -0
- snappy/upper_halfspace/ideal_point.py +26 -0
- snappy/verify/__init__.py +4 -8
- snappy/verify/{verifyCanonical.py → canonical.py} +114 -97
- snappy/verify/complex_volume/__init__.py +3 -2
- snappy/verify/complex_volume/adjust_torsion.py +13 -11
- snappy/verify/complex_volume/closed.py +29 -24
- snappy/verify/complex_volume/compute_ptolemys.py +8 -6
- snappy/verify/complex_volume/cusped.py +10 -9
- snappy/verify/complex_volume/extended_bloch.py +14 -12
- snappy/verify/{cuspTranslations.py → cusp_translations.py} +15 -14
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +23 -56
- snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +19 -15
- snappy/verify/interval_newton_shapes_engine.py +51 -211
- snappy/verify/interval_tree.py +27 -25
- snappy/verify/krawczyk_shapes_engine.py +47 -50
- snappy/verify/maximal_cusp_area_matrix/__init__.py +17 -86
- snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +58 -48
- snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +53 -57
- snappy/verify/{realAlgebra.py → real_algebra.py} +26 -20
- snappy/verify/shapes.py +10 -7
- snappy/verify/short_slopes.py +41 -42
- snappy/verify/{squareExtensions.py → square_extensions.py} +96 -92
- snappy/verify/test.py +59 -57
- snappy/verify/upper_halfspace/extended_matrix.py +5 -5
- snappy/verify/upper_halfspace/finite_point.py +44 -31
- snappy/verify/upper_halfspace/ideal_point.py +69 -57
- snappy/verify/volume.py +15 -12
- snappy/version.py +2 -3
- {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/METADATA +14 -12
- snappy-3.2.dist-info/RECORD +503 -0
- {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
- {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -1
- {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/top_level.txt +10 -1
- snappy/doc/_sources/verify_canon.rst.txt +0 -90
- snappy/doc/_static/classic.css +0 -266
- snappy/doc/_static/jquery-3.5.1.js +0 -10872
- snappy/doc/_static/sidebar.js +0 -159
- snappy/doc/_static/underscore-1.13.1.js +0 -2042
- snappy/doc/_static/underscore.js +0 -6
- snappy/doc/verify_canon.html +0 -283
- snappy/ppm_to_png.py +0 -243
- snappy/togl/__init__.py +0 -3
- snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
- snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
- snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
- snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
- snappy/verify/cuspCrossSection.py +0 -1413
- snappy/verify/mathHelpers.py +0 -64
- snappy-3.0.3.dist-info/RECORD +0 -360
snappy/browser.py
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
|
4
|
-
import sys, os
|
2
|
+
import sys
|
3
|
+
import os
|
5
4
|
from .gui import *
|
6
5
|
from .polyviewer import PolyhedronViewer
|
7
6
|
from .horoviewer import HoroballViewer
|
@@ -14,10 +13,14 @@ from .exceptions import SnapPeaFatalError
|
|
14
13
|
from plink import LinkViewer, LinkEditor
|
15
14
|
from plink.ipython_tools import IPythonTkRoot
|
16
15
|
from spherogram.links.orthogonal import OrthogonalLinkDiagram
|
16
|
+
try:
|
17
|
+
from tkinter.simpledialog import _place_window
|
18
|
+
except:
|
19
|
+
pass
|
17
20
|
|
18
21
|
|
19
22
|
main_window = None
|
20
|
-
#TODO: Find these dimensions by introspection.
|
23
|
+
# TODO: Find these dimensions by introspection.
|
21
24
|
cusp_box_height = 105
|
22
25
|
if sys.platform == 'darwin':
|
23
26
|
cusp_box_width = 180
|
@@ -34,9 +37,9 @@ class SelectableText(ttk.Frame):
|
|
34
37
|
background color matches the background of a depth 2 LabelFrame
|
35
38
|
by default.
|
36
39
|
"""
|
37
|
-
def __init__(self,
|
38
|
-
ttk.Frame.__init__(self,
|
39
|
-
self.var = Tk_.StringVar(
|
40
|
+
def __init__(self, container, labeltext='', width=18, depth=2):
|
41
|
+
ttk.Frame.__init__(self, container)
|
42
|
+
self.var = Tk_.StringVar(container)
|
40
43
|
style = SnapPyStyle()
|
41
44
|
bg_color = style.groupBG if depth == 1 else style.subgroupBG
|
42
45
|
self.label = label = ttk.Label(self, text=labeltext)
|
@@ -56,6 +59,7 @@ class SelectableText(ttk.Frame):
|
|
56
59
|
def get(self):
|
57
60
|
return self.var.get()
|
58
61
|
|
62
|
+
|
59
63
|
class AutoScrollbar(Tk_.Scrollbar):
|
60
64
|
# Frederick Lundh's scrollbar that hides itself if it's not needed.
|
61
65
|
def set(self, lo, hi):
|
@@ -65,15 +69,16 @@ class AutoScrollbar(Tk_.Scrollbar):
|
|
65
69
|
self.grid()
|
66
70
|
Tk_.Scrollbar.set(self, lo, hi)
|
67
71
|
|
72
|
+
|
68
73
|
class SelectableMessage(ttk.Frame):
|
69
74
|
"""
|
70
75
|
A disabled Text widget which allows selection of text. On the mac
|
71
76
|
the selection does not highlight correctly unless the Text widget has
|
72
77
|
focus and does not clear correctly unless the state is NORMAL.
|
73
78
|
"""
|
74
|
-
def __init__(self,
|
75
|
-
self.
|
76
|
-
ttk.Frame.__init__(self,
|
79
|
+
def __init__(self, container):
|
80
|
+
self.container = container
|
81
|
+
ttk.Frame.__init__(self, container)
|
77
82
|
self.scrollbar = AutoScrollbar(self, orient=Tk_.VERTICAL)
|
78
83
|
self.text = text = Tk_.Text(self, width=60, height=12,
|
79
84
|
highlightthickness=0, relief=Tk_.FLAT,
|
@@ -105,33 +110,37 @@ class SelectableMessage(ttk.Frame):
|
|
105
110
|
def copy(self, event):
|
106
111
|
self.text.selection_get(selection='CLIPBOARD')
|
107
112
|
|
113
|
+
|
108
114
|
class DirichletTab(PolyhedronViewer):
|
109
|
-
def __init__(self,
|
115
|
+
def __init__(self, container, facedicts=[], title='Polyhedron Tab', parent=None):
|
110
116
|
self.main_window = main_window
|
111
117
|
self.style = style = SnapPyStyle()
|
112
|
-
PolyhedronViewer.__init__(self,
|
118
|
+
PolyhedronViewer.__init__(self, container, facedicts=facedicts,
|
113
119
|
title=title, bgcolor=style.groupBG)
|
120
|
+
|
114
121
|
def update_menus(self, menubar):
|
115
122
|
menubar.children['help'].activate(
|
116
123
|
[ app_menus.help_polyhedron_viewer_label,
|
117
124
|
app_menus.help_report_bugs_label ])
|
118
125
|
|
126
|
+
|
119
127
|
class CuspNeighborhoodTab(HoroballViewer):
|
120
128
|
def __init__(self, nbhd, title='Polyhedron Tab'):
|
121
129
|
self.main_window = main_window
|
122
130
|
style = SnapPyStyle()
|
123
131
|
if main_window:
|
124
132
|
HoroballViewer.__init__(self, nbhd, title=title,
|
125
|
-
|
133
|
+
bgcolor=style.groupBG, settings=main_window.settings)
|
126
134
|
else:
|
127
135
|
HoroballViewer.__init__(self, nbhd, title=title,
|
128
|
-
|
136
|
+
bgcolor=style.groupBG)
|
129
137
|
|
130
138
|
def update_menus(self, menubar):
|
131
139
|
menubar.children['help'].activate(
|
132
140
|
[ app_menus.help_horoball_viewer_label,
|
133
141
|
app_menus.help_report_bugs_label])
|
134
142
|
|
143
|
+
|
135
144
|
class LinkTab(LinkViewer):
|
136
145
|
def __init__(self, data, window):
|
137
146
|
self.style = style = SnapPyStyle()
|
@@ -143,13 +152,13 @@ class LinkTab(LinkViewer):
|
|
143
152
|
def close(self, event=None):
|
144
153
|
pass
|
145
154
|
|
155
|
+
|
146
156
|
class Browser(Tk_.Toplevel):
|
147
157
|
"""
|
148
158
|
Toplevel window displaying a Dehn filling control panel and
|
149
159
|
a notebook with tabs that show numerical or graphical information
|
150
160
|
about the manifold.
|
151
161
|
"""
|
152
|
-
|
153
162
|
def __init__(self, manifold, root=None, main_window=None):
|
154
163
|
if root is None:
|
155
164
|
if Tk_._default_root:
|
@@ -181,16 +190,14 @@ class Browser(Tk_.Toplevel):
|
|
181
190
|
self.protocol("WM_DELETE_WINDOW", self.close)
|
182
191
|
if sys.platform == 'darwin':
|
183
192
|
self.bind_all('<Command-Key-w>', self.close)
|
184
|
-
elif sys.platform == '
|
193
|
+
elif sys.platform == 'linux':
|
185
194
|
self.bind_all('<Alt-Key-F4>', self.close)
|
186
|
-
|
187
195
|
self.side_panel = side_panel = self.build_side_panel()
|
188
196
|
|
189
197
|
self.notebook = notebook = ttk.Notebook(self)
|
190
198
|
self.invariants_tab = invariants_tab = self.build_invariants()
|
191
199
|
self.dirichlet_viewer = DirichletTab(self)
|
192
200
|
self.horoball_viewer = CuspNeighborhoodTab(self)
|
193
|
-
|
194
201
|
self.fillings_changed_callback = None
|
195
202
|
|
196
203
|
self.bottombar = bottombar = ttk.Frame(self, height=20)
|
@@ -216,7 +223,7 @@ class Browser(Tk_.Toplevel):
|
|
216
223
|
notebook.add(invariants_tab, text='Invariants', padding=[0])
|
217
224
|
notebook.add(self.dirichlet_viewer, text='Dirichlet')
|
218
225
|
notebook.add(self.horoball_viewer, text='Cusp Nbhds')
|
219
|
-
notebook.add(self.build_inside_view(), text
|
226
|
+
notebook.add(self.build_inside_view(), text='Inside View')
|
220
227
|
notebook.add(symmetry_tab, text='Symmetry', padding=[0])
|
221
228
|
if link_tab:
|
222
229
|
notebook.add(link_tab.canvas, text='Link')
|
@@ -232,9 +239,12 @@ class Browser(Tk_.Toplevel):
|
|
232
239
|
self.modeline.pack(fill=Tk_.BOTH, expand=True, padx=30)
|
233
240
|
self.update_modeline()
|
234
241
|
self.update_idletasks()
|
242
|
+
self.wm_geometry(self.wm_geometry())
|
243
|
+
# Make sure the invariants get computed, even on Windows.
|
244
|
+
self.after_idle(self.update_current_tab)
|
235
245
|
|
236
246
|
def __repr__(self):
|
237
|
-
return 'Browser window for %s\n'%self.manifold
|
247
|
+
return 'Browser window for %s\n' % self.manifold
|
238
248
|
|
239
249
|
build_menus = browser_menus
|
240
250
|
|
@@ -263,15 +273,15 @@ class Browser(Tk_.Toplevel):
|
|
263
273
|
canvas.configure(background=self.style.groupBG)
|
264
274
|
canvas.grid(row=0, column=0, sticky=Tk_.NSEW)
|
265
275
|
filling_scrollbar.config(command=canvas.yview)
|
266
|
-
self.filling_vars=[]
|
276
|
+
self.filling_vars = []
|
267
277
|
|
268
278
|
# Embedded windows in a canvas are clipped to their parent, not to
|
269
279
|
# the canvas.
|
270
280
|
cusp_parent = self.filling_canvas if self.filling_canvas else filling
|
271
281
|
for n in range(num_cusps):
|
272
282
|
R, G, B, A = GetColor(n)
|
273
|
-
color = '#%.3x%.3x%.3x'%(int(R*4095), int(G*4095), int(B*4095))
|
274
|
-
cusp = ttk.Labelframe(cusp_parent, text='Cusp %d'%n)
|
283
|
+
color = '#%.3x%.3x%.3x' % (int(R*4095), int(G*4095), int(B*4095))
|
284
|
+
cusp = ttk.Labelframe(cusp_parent, text='Cusp %d' % n)
|
275
285
|
mer_var = Tk_.StringVar(self, value='0')
|
276
286
|
long_var = Tk_.StringVar(self, value='0')
|
277
287
|
self.filling_vars.append((mer_var, long_var))
|
@@ -283,14 +293,14 @@ class Browser(Tk_.Toplevel):
|
|
283
293
|
row=1, column=1, sticky=Tk_.E)
|
284
294
|
meridian = Spinbox(cusp, width=4, textvariable=mer_var,
|
285
295
|
from_=-1000, to=1000, increment=1,
|
286
|
-
name=':%s:0'%n, validate='focusout',
|
296
|
+
name=':%s:0' % n, validate='focusout',
|
287
297
|
validatecommand=(self.register(self.validate_coeff),'%P','%W')
|
288
298
|
)
|
289
299
|
meridian.bind('<Return>', self.do_filling)
|
290
300
|
meridian.grid(row=0, column=2, sticky=Tk_.W, padx=0, pady=3)
|
291
301
|
longitude = Spinbox(cusp, width=4, textvariable=long_var,
|
292
302
|
from_=-1000, to=1000, increment=1,
|
293
|
-
name=':%s:1'%n, validate='focusout',
|
303
|
+
name=':%s:1' % n, validate='focusout',
|
294
304
|
validatecommand=(self.register(self.validate_coeff),'%P','%W')
|
295
305
|
)
|
296
306
|
longitude.bind('<Return>', self.do_filling)
|
@@ -337,7 +347,7 @@ class Browser(Tk_.Toplevel):
|
|
337
347
|
self.aka_viewer = aka_viewer = ttk.Treeview(
|
338
348
|
self.aka,
|
339
349
|
selectmode='none',
|
340
|
-
height=4,
|
350
|
+
height=2 if sys.platform == 'linux' else 4,
|
341
351
|
columns=['manifold', 'as_link'],
|
342
352
|
show='headings')
|
343
353
|
aka_viewer.heading('manifold', text='Manifold')
|
@@ -381,7 +391,7 @@ class Browser(Tk_.Toplevel):
|
|
381
391
|
ttk.Label(self.length_spectrum_frame, text='Cutoff:').grid(
|
382
392
|
row=0, column=0, sticky=Tk_.E, pady=5)
|
383
393
|
self.length_cutoff = 1.0
|
384
|
-
self.cutoff_var=Tk_.StringVar(self, self.length_cutoff)
|
394
|
+
self.cutoff_var = Tk_.StringVar(self, self.length_cutoff)
|
385
395
|
self.cutoff_entry = cutoff_entry = ttk.Entry(
|
386
396
|
self.length_spectrum_frame,
|
387
397
|
takefocus=False,
|
@@ -396,7 +406,7 @@ class Browser(Tk_.Toplevel):
|
|
396
406
|
height=6, show='headings', selectmode='none',
|
397
407
|
columns=['mult', 'length', 'topology', 'parity'],
|
398
408
|
)
|
399
|
-
#TODO: compute column widths by measuring text.
|
409
|
+
# TODO: compute column widths by measuring text.
|
400
410
|
geodesics.heading('mult', text='Mult.')
|
401
411
|
geodesics.column('mult', stretch=False, width=60)
|
402
412
|
geodesics.heading('length', text='Complex Length')
|
@@ -421,7 +431,7 @@ class Browser(Tk_.Toplevel):
|
|
421
431
|
message1 = ttk.Label(frame,
|
422
432
|
text='Future releases of SnapPy will show more information here.')
|
423
433
|
message2 = ttk.Label(frame,
|
424
|
-
text
|
434
|
+
text='Type SymmetryGroup.<tab> in the command shell to see '
|
425
435
|
'what is available.')
|
426
436
|
message1.grid(row=1, column=0, pady=(40, 10))
|
427
437
|
message2.grid(row=2, column=0)
|
@@ -442,7 +452,7 @@ class Browser(Tk_.Toplevel):
|
|
442
452
|
if not self.manifold.is_orientable():
|
443
453
|
text = ("Inside view for non-orientable manifolds such as %s "
|
444
454
|
"is not supported yet.") % self.manifold.name()
|
445
|
-
return ttk.Label(self, text
|
455
|
+
return ttk.Label(self, text=text)
|
446
456
|
|
447
457
|
try:
|
448
458
|
# delayed import to avoid cycle
|
@@ -455,7 +465,7 @@ class Browser(Tk_.Toplevel):
|
|
455
465
|
import traceback
|
456
466
|
text = ("Could not instantiate inside view. "
|
457
467
|
"Error was:\n\n%s" % traceback.format_exc())
|
458
|
-
return ttk.Label(self, text
|
468
|
+
return ttk.Label(self, text=text)
|
459
469
|
|
460
470
|
def update_menus(self, menubar):
|
461
471
|
"""Default menus used by the Invariants, Symmetry and Link tabs."""
|
@@ -467,12 +477,12 @@ class Browser(Tk_.Toplevel):
|
|
467
477
|
modeline.delete(1.0, Tk_.END)
|
468
478
|
if not self.manifold.is_orientable():
|
469
479
|
modeline.insert(Tk_.END, 'Non-orientable; ')
|
470
|
-
modeline.insert(Tk_.END, '%s tetrahedra; %s'%(
|
480
|
+
modeline.insert(Tk_.END, '%s tetrahedra; %s' % (
|
471
481
|
self.manifold.num_tetrahedra(), self.manifold.solution_type()))
|
472
482
|
if len(self.dirichlet) == 0:
|
473
|
-
|
474
|
-
|
475
|
-
|
483
|
+
modeline.insert(Tk_.END,
|
484
|
+
' * failed to compute Dirichlet domain!',
|
485
|
+
'alert')
|
476
486
|
modeline.config(state=Tk_.DISABLED)
|
477
487
|
|
478
488
|
def update_modeline_and_side_panel(self):
|
@@ -497,6 +507,8 @@ class Browser(Tk_.Toplevel):
|
|
497
507
|
elif tab_name == 'Link':
|
498
508
|
self.update_menus(self.menubar)
|
499
509
|
self.link_tab.draw()
|
510
|
+
elif tab_name == 'Inside View':
|
511
|
+
self.inside_view.widget.focus_set()
|
500
512
|
elif tab_name == 'Symmetry':
|
501
513
|
self.update_menus(self.menubar)
|
502
514
|
self.update_symmetry()
|
@@ -508,7 +520,7 @@ class Browser(Tk_.Toplevel):
|
|
508
520
|
current_fillings = [c.filling for c in self.manifold.cusp_info()]
|
509
521
|
for n, coeffs in enumerate(current_fillings):
|
510
522
|
for m in (0,1):
|
511
|
-
value = '%g'%coeffs[m]
|
523
|
+
value = '%g' % coeffs[m]
|
512
524
|
value = '0' if value == '-0' else value
|
513
525
|
self.filling_vars[n][m].set(value)
|
514
526
|
|
@@ -530,8 +542,8 @@ class Browser(Tk_.Toplevel):
|
|
530
542
|
except ValueError:
|
531
543
|
self.homology.set('')
|
532
544
|
self.compute_pi_one()
|
533
|
-
self.update_length_spectrum()
|
534
545
|
self.update_dirichlet()
|
546
|
+
self.update_length_spectrum()
|
535
547
|
self.update_aka()
|
536
548
|
self.recompute_invariants = False
|
537
549
|
|
@@ -568,9 +580,10 @@ class Browser(Tk_.Toplevel):
|
|
568
580
|
|
569
581
|
def update_aka(self):
|
570
582
|
self._write_aka_info()
|
571
|
-
#self.identifier.identify(self.manifold)
|
572
|
-
#self.aka_after_id = self.after(100, self._aka_callback)
|
583
|
+
# self.identifier.identify(self.manifold)
|
584
|
+
# self.aka_after_id = self.after(100, self._aka_callback)
|
573
585
|
M = self.manifold.copy()
|
586
|
+
|
574
587
|
def format_name(N):
|
575
588
|
if all(N.cusp_info('is_complete')):
|
576
589
|
return N.name()
|
@@ -619,6 +632,9 @@ class Browser(Tk_.Toplevel):
|
|
619
632
|
self.dirichlet = []
|
620
633
|
self.update_modeline()
|
621
634
|
self.dirichlet_viewer.new_polyhedron(self.dirichlet)
|
635
|
+
if self.inside_view:
|
636
|
+
self.inside_view.show_failed_dirichlet(
|
637
|
+
show=len(self.dirichlet) == 0)
|
622
638
|
|
623
639
|
def update_cusps(self):
|
624
640
|
try:
|
@@ -647,7 +663,7 @@ class Browser(Tk_.Toplevel):
|
|
647
663
|
if P == '':
|
648
664
|
var.set('0')
|
649
665
|
else:
|
650
|
-
value = '%g'%self.manifold.cusp_info()[cusp].filling[curve]
|
666
|
+
value = '%g' % self.manifold.cusp_info()[cusp].filling[curve]
|
651
667
|
value = '0' if value == '-0' else value
|
652
668
|
var.set(value)
|
653
669
|
return False
|
@@ -674,8 +690,8 @@ class Browser(Tk_.Toplevel):
|
|
674
690
|
self.manifold.dehn_fill(filling_spec)
|
675
691
|
current_fillings = [c.filling for c in self.manifold.cusp_info()]
|
676
692
|
for n, coeffs in enumerate(current_fillings):
|
677
|
-
for m in (0,1):
|
678
|
-
value = '%g'%coeffs[m]
|
693
|
+
for m in (0, 1):
|
694
|
+
value = '%g' % coeffs[m]
|
679
695
|
value = '0' if value == '-0' else value
|
680
696
|
self.filling_vars[n][m].set(value)
|
681
697
|
self.update_cusps()
|
@@ -719,11 +735,11 @@ class Browser(Tk_.Toplevel):
|
|
719
735
|
tab_name = self.notebook.tab(self.notebook.select(), 'text')
|
720
736
|
if tab_name in ('Invariants', 'Link', 'Symmetry'):
|
721
737
|
try:
|
722
|
-
selected =
|
738
|
+
selected = self.selection_get()
|
723
739
|
except:
|
724
740
|
selected = False
|
725
741
|
if selected:
|
726
|
-
return {'Copy'
|
742
|
+
return {'Copy': self.edit_copy}
|
727
743
|
return {}
|
728
744
|
|
729
745
|
def edit_copy(self):
|
@@ -734,12 +750,19 @@ class Browser(Tk_.Toplevel):
|
|
734
750
|
except:
|
735
751
|
pass
|
736
752
|
|
737
|
-
def
|
753
|
+
def dirichlet_help(self):
|
754
|
+
self.dirichlet_viewer.widget.help()
|
755
|
+
|
756
|
+
def horoball_help(self):
|
757
|
+
self.horoball_viewer.widget.help()
|
758
|
+
|
759
|
+
def test(self, use_modernopengl=True):
|
738
760
|
self.update_idletasks()
|
739
761
|
print('Testing browser')
|
740
762
|
self.after(1000, self.notebook.select, self.dirichlet_viewer)
|
741
763
|
self.after(2500, self.notebook.select, self.horoball_viewer)
|
742
|
-
|
764
|
+
if use_modernopengl:
|
765
|
+
self.after(4000, self.notebook.select, self.inside_view)
|
743
766
|
if self.link_tab:
|
744
767
|
self.after(5500, self.notebook.select, self.link_tab.canvas)
|
745
768
|
self.after(7000, self.close)
|
@@ -747,15 +770,15 @@ class Browser(Tk_.Toplevel):
|
|
747
770
|
self.after(5500, self.close)
|
748
771
|
self.wait_window(self)
|
749
772
|
|
773
|
+
|
750
774
|
class Driller(SimpleDialog):
|
751
|
-
def __init__(self,
|
775
|
+
def __init__(self, parent, manifold):
|
752
776
|
self.manifold = manifold
|
753
777
|
self.num = 0 # make the superclass happy
|
754
778
|
self.max_segments = 6
|
755
779
|
self.result = []
|
756
780
|
style = SnapPyStyle()
|
757
|
-
self.root = root = Tk_.Toplevel(
|
758
|
-
bg=style.windowBG)
|
781
|
+
self.root = root = Tk_.Toplevel(parent, class_='SnapPy', bg=style.windowBG)
|
759
782
|
title = 'Drill'
|
760
783
|
root.title(title)
|
761
784
|
root.iconname(title)
|
@@ -763,7 +786,7 @@ class Driller(SimpleDialog):
|
|
763
786
|
top_frame = ttk.Frame(self.root)
|
764
787
|
top_frame.grid_columnconfigure(0, weight=1)
|
765
788
|
top_frame.grid_rowconfigure(2, weight=1)
|
766
|
-
msg_font =
|
789
|
+
msg_font = dict(family=style.font_info['family'],
|
767
790
|
weight='bold',
|
768
791
|
size=int(style.font_info['size']*1.2))
|
769
792
|
msg = ttk.Label(top_frame, font=msg_font,
|
@@ -807,7 +830,7 @@ class Driller(SimpleDialog):
|
|
807
830
|
button.pack(side=Tk_.LEFT, padx=6)
|
808
831
|
button_frame.pack(pady=6)
|
809
832
|
self.root.protocol('WM_DELETE_WINDOW', self.wm_delete_window)
|
810
|
-
self.
|
833
|
+
_place_window(self.root, parent)
|
811
834
|
|
812
835
|
def show_curves(self):
|
813
836
|
self.curves.delete(*self.curves.get_children())
|
@@ -843,13 +866,14 @@ class Driller(SimpleDialog):
|
|
843
866
|
return False
|
844
867
|
return True
|
845
868
|
|
869
|
+
|
846
870
|
class Coverer(SimpleDialog):
|
847
|
-
def __init__(self,
|
871
|
+
def __init__(self, parent, manifold):
|
848
872
|
self.manifold = manifold.copy()
|
849
873
|
self.num = 0 # make the superclass happy
|
850
874
|
self.result = []
|
851
875
|
style = SnapPyStyle()
|
852
|
-
self.root = root = Tk_.Toplevel(
|
876
|
+
self.root = root = Tk_.Toplevel(parent, class_='SnapPy', bg=style.windowBG)
|
853
877
|
title = 'Cover'
|
854
878
|
root.title(title)
|
855
879
|
root.iconname(title)
|
@@ -858,16 +882,15 @@ class Coverer(SimpleDialog):
|
|
858
882
|
top_frame.grid_rowconfigure(2, weight=1)
|
859
883
|
top_frame.grid_columnconfigure(0, weight=1)
|
860
884
|
top_frame.grid_columnconfigure(1, weight=1)
|
861
|
-
msg_font =
|
885
|
+
msg_font = dict(family=style.font_info['family'],
|
862
886
|
weight='bold',
|
863
887
|
size=int(style.font_info['size']*1.2))
|
864
888
|
msg = ttk.Label(top_frame, font=msg_font,
|
865
889
|
text='Choose covering spaces to browse:')
|
866
890
|
msg.grid(row=0, column=0, columnspan=3, pady=10)
|
867
891
|
degree_frame = ttk.Frame(top_frame)
|
868
|
-
degree_frame.grid_columnconfigure(
|
892
|
+
degree_frame.grid_columnconfigure(2, weight=1)
|
869
893
|
self.degree_var = degree_var = Tk_.StringVar()
|
870
|
-
degree_var.trace('w', self.show_covers)
|
871
894
|
ttk.Label(degree_frame, text='Degree: ').grid(
|
872
895
|
row=0, column=0, sticky=Tk_.E)
|
873
896
|
self.degree_option = degree_option = ttk.OptionMenu(
|
@@ -878,15 +901,11 @@ class Coverer(SimpleDialog):
|
|
878
901
|
)
|
879
902
|
degree_option.grid(row=0, column=1)
|
880
903
|
self.cyclic_var = cyclic_var = Tk_.BooleanVar()
|
881
|
-
cyclic_var.trace('w', self.show_covers)
|
882
904
|
cyclic_or_not = ttk.Checkbutton(degree_frame,
|
883
905
|
variable=cyclic_var,
|
884
906
|
text='cyclic covers only',
|
885
907
|
)
|
886
908
|
cyclic_or_not.grid(row=0, column=2, padx=6, sticky=Tk_.W)
|
887
|
-
self.action = action = ttk.Button(degree_frame, text='Recompute',
|
888
|
-
command=self.show_covers)
|
889
|
-
action.grid(row=0, column=3, padx=8, sticky=Tk_.W)
|
890
909
|
degree_frame.grid(row=1, column=0, pady=2, padx=6, sticky=Tk_.EW)
|
891
910
|
self.covers = covers = ttk.Treeview(
|
892
911
|
top_frame,
|
@@ -915,21 +934,25 @@ class Coverer(SimpleDialog):
|
|
915
934
|
button.grid(row=0, column=1, sticky=Tk_.W, padx=6)
|
916
935
|
button_frame.pack(pady=6, fill=Tk_.BOTH, expand=1)
|
917
936
|
self.root.protocol('WM_DELETE_WINDOW', self.cancel)
|
918
|
-
|
937
|
+
try:
|
938
|
+
_place_window(self.root, parent)
|
939
|
+
except AttributeError:
|
940
|
+
self._set_transient(container)
|
919
941
|
degree_var.set('2')
|
920
942
|
cyclic_var.set(True)
|
921
943
|
self.show_covers()
|
944
|
+
degree_var.trace_add('write', self.show_covers)
|
945
|
+
cyclic_var.trace_add('write', self.show_covers)
|
946
|
+
|
922
947
|
|
923
948
|
def clear_list(self, *args):
|
924
949
|
self.covers.delete(*self.covers.get_children())
|
925
950
|
self.browse.config(default='normal')
|
926
|
-
self.action.config(default='active')
|
927
951
|
self.state = 'not ready'
|
928
952
|
|
929
953
|
def show_covers(self, *args):
|
930
954
|
self.state = 'ready'
|
931
955
|
self.browse.config(default='active')
|
932
|
-
self.action.config(default='normal')
|
933
956
|
self.covers.delete(*self.covers.get_children())
|
934
957
|
degree = int(self.degree_var.get())
|
935
958
|
if self.cyclic_var.get():
|
@@ -964,6 +987,7 @@ class Coverer(SimpleDialog):
|
|
964
987
|
self.root.grab_set()
|
965
988
|
self.root.wait_window()
|
966
989
|
|
990
|
+
|
967
991
|
if __name__ == '__main__':
|
968
992
|
from snappy import Manifold
|
969
993
|
root = Tk_.Tk()
|
snappy/cache.py
CHANGED
@@ -1,28 +1,25 @@
|
|
1
|
-
from __future__ import print_function
|
2
|
-
|
3
1
|
class SnapPyCache(dict):
|
4
2
|
"""
|
5
3
|
Implementation of a simple cache used by the Manifold and Triangulation
|
6
4
|
to save the results of methods which require a significant amount of
|
7
5
|
computation.
|
8
|
-
|
6
|
+
|
9
7
|
This cache uses the tuple (method.__name, args, kwargs) as its key.
|
10
8
|
"""
|
11
9
|
debug = False
|
12
10
|
_clear = dict.clear
|
13
|
-
|
11
|
+
|
14
12
|
def save(self, answer, method_name, *args, **kwargs):
|
15
13
|
self[(method_name, args, tuple(kwargs.items()))] = answer
|
16
14
|
return answer
|
17
|
-
|
15
|
+
|
18
16
|
def lookup(self, method_name, *args, **kwargs):
|
19
17
|
return self[(method_name, args, tuple(kwargs.items()))]
|
20
18
|
|
21
19
|
def clear(self, key=None, message=''):
|
22
20
|
if self.debug:
|
23
|
-
print('_clear_cache: %s'%message)
|
24
|
-
if key is None:
|
21
|
+
print('_clear_cache: %s' % message)
|
22
|
+
if key is None:
|
25
23
|
self._clear()
|
26
24
|
else:
|
27
25
|
self.pop(key)
|
28
|
-
|