ezdxf 1.3.1__zip → 1.3.1b0__zip
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.
- {ezdxf-1.3.1/src/ezdxf.egg-info → ezdxf-1.3.1b0}/PKG-INFO +1 -1
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/frontend.py +2 -5
- ezdxf-1.3.1b0/src/ezdxf/edgeminer.py +665 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/edgesmith.py +23 -104
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/clipping.py +28 -8
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/rtree.py +5 -6
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/clipping_portal.py +0 -6
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/version.py +2 -2
- {ezdxf-1.3.1 → ezdxf-1.3.1b0/src/ezdxf.egg-info}/PKG-INFO +1 -1
- ezdxf-1.3.1b0/tests/test_05_tools/test_546_edgeminer.py +395 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_619_greiner_hormann.py +5 -97
- ezdxf-1.3.1/src/ezdxf/edgeminer.py +0 -1166
- ezdxf-1.3.1/tests/test_05_tools/test_546_edgeminer.py +0 -749
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/LICENSE +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/MANIFEST.in +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/README.md +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/check_disable_c_ext_by_config_file.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/check_disable_c_ext_by_env_var.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/conftest.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/AC1003_LINE_Example.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/ASCII_R12.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/Leica_Disto_S910.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/MODEL.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/PLOTFILE.plt +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/POLI-ALL210_12.DXF +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/R12_with_trash_beyond_EOF.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/XRECORD_0.bin +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/XRECORD_1.bin +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/XRECORD_2.bin +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/acad_table_with_blk_ref.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/bin_dxf_r12.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/bin_dxf_r13.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/bin_dxf_r14.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/bin_dxf_r2000.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/cc_dxflib.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/custom_blocks.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/duplicate_handles.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/dxf_unicode.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/dynblks.zip +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/empty_handles.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/groups.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/layout_broken_links.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/layout_broken_links_2.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/layout_missing_block_definition.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/layout_missing_block_record.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/mtext_columns_R2007.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/mtext_columns_R2018.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/mtext_framed_columns.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/mtext_text_frame.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/no_layouts.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/recover01.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/recover02.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/small_r13.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/data/small_r14.dxf +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_acad_table.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_acis_entites.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_all_dimline_styles.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_all_ellipse_transformations.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_anonymous_blocks.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_appsettings.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_audit_critical_dxf_files.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_audit_layouts.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_complex_line_type_2.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_create_basic_graphics.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_document_guid.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_document_page_setup.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_dxf_info_scanning.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_dynblkhelper.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_entities_iterator.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_fix_dulicate_handles.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_geo.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_groups.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_hpgl2_addon.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_ignore_junk_beyond_EOF.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_launcher.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_leica_disto_r12.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_load_dxf_unicode_notation.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_mapbox_earcut.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_mtext_columns.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_mtext_explode_addon.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_mtext_text_frame.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_new_table_entries.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_none_ascii_read_write.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_odafc.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_open_R13_R14.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_open_binary_DXF_files.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_open_coord_order_issue.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_open_exotic_dxf_files.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_polyline_entity.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_preserve_binary_data_in_xrecords.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_r12export.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_r12strict.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_r12writer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_read_file_without_handles.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_read_write_modern_entites.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_recover.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_redraw_order.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_rotated_block_attributes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_surface_entities.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_write_fixed_meta_data.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_write_without_handles.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_xref_detach.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/integration_tests/test_xref_load_acis.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/pyproject.toml +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/requirements.txt +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/setup.cfg +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/setup.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/__main__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/_options.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/bezier3p.pyx +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/bezier4p.pyx +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/bspline.pyx +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/constants.h +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/construct.pyx +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/linetypes.pyx +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/mapbox_earcut.pyx +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/matrix44.pxd +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/matrix44.pyx +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/np_support.pyx +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/vector.pxd +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acc/vector.pyx +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/abstract.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/api.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/cache.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/const.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/dbg.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/dxf.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/entities.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/hdr.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/mesh.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/sab.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/sat.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/acis/type_hints.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/acadctb.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/acisbrowser/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/acisbrowser/browser.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/acisbrowser/data.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/binpacking.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/browser/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/browser/bookmarks.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/browser/browser.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/browser/data.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/browser/find_dialog.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/browser/loader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/browser/model.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/browser/reflinks.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/browser/tags.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/browser/views.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/dimlines.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/backend.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/config.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/debug_backend.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/debug_utils.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/dxf.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/file_output.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/gfxproxy.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/hpgl2.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/json.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/layout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/matplotlib.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/mtext_complex.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/pipeline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/properties.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/pymupdf.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/pyqt.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/qtviewer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/recorder.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/svg.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/text.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/text_renderer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/type_hints.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/drawing/unified_text_renderer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/dwg/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/dwg/classes_section.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/dwg/const.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/dwg/crc.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/dwg/fileheader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/dwg/header_section.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/dwg/loader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/dxf2code.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/genetic_algorithm.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/geo.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/gerber_D6673.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/hpgl2/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/hpgl2/api.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/hpgl2/backend.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/hpgl2/deps.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/hpgl2/interpreter.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/hpgl2/page.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/hpgl2/plotter.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/hpgl2/polygon_buffer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/hpgl2/properties.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/hpgl2/tokenizer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/hpgl2/viewer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/importer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/iterdxf.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/menger_sponge.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/meshex.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/mixins.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/mtextsurrogate.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/mtxpl.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/odafc.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/openscad.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/pycsg.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/r12export.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/r12writer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/sierpinski_pyramid.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/tablepainter.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/text2path.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/xplayer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/addons/xqt.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/appsettings.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/audit.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/bbox.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/blkrefs.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/colors.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/commands.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/comments.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/disassemble.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/document.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/dwginfo.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/dynblkhelper.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/acad_proxy_entity.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/acad_table.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/acad_xrec_roundtrip.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/acis.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/appdata.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/appid.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/arc.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/attrib.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/block.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/blockrecord.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/boundary_paths.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/circle.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/copy.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/dictionary.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/dimension.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/dimstyle.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/dimstyleoverride.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/dxfclass.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/dxfentity.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/dxfgfx.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/dxfgroups.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/dxfns.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/dxfobj.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/ellipse.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/factory.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/geodata.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/gradient.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/hatch.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/helix.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/idbuffer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/image.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/insert.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/layer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/layout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/leader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/light.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/line.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/ltype.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/lwpolyline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/material.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/mesh.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/mleader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/mline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/mpolygon.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/mtext.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/mtext_columns.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/objectcollection.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/oleframe.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/pattern.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/point.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/polygon.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/polyline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/shape.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/solid.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/spatial_filter.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/spline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/subentity.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/sun.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/table.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/temporary_transform.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/text.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/textstyle.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/tolerance.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/ucs.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/underlay.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/view.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/viewport.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/visualstyle.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/vport.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/xdata.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/xdict.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entities/xline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/entitydb.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/enums.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/explode.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/eztypes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/filemanagement.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/fonts/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/fonts/font_face.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/fonts/font_manager.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/fonts/font_measurements.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/fonts/font_synonyms.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/fonts/fonts.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/fonts/glyphs.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/fonts/lff.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/fonts/shapefile.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/fonts/ttfonts.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/gfxattribs.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/graphicsfactory.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/groupby.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/layouts/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/layouts/base.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/layouts/blocklayout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/layouts/layout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/layouts/layouts.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/attributes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/const.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/encoding.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/extendedtags.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/fileindex.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/hdrvars.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/loader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/packedtags.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/repair.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/tagger.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/tags.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/tagwriter.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/types.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/lldxf/validator.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/_bezier3p.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/_bezier4p.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/_bspline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/_construct.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/_ctypes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/_mapbox_earcut.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/_matrix44.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/_vector.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/arc.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/bbox.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/bezier.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/bezier_interpolation.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/box.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/bspline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/bulge.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/circle.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/clustering.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/construct2d.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/construct3d.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/cspline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/curvetools.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/ellipse.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/eulerspiral.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/legacy.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/linalg.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/line.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/offset2d.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/parametrize.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/perlin.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/polyline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/shape.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/transformtools.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/triangulation.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/math/ucs.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/messenger.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/msgtypes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/npshapes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/path/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/path/commands.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/path/converter.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/path/nesting.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/path/path.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/path/shapes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/path/tools.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/protocols.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/proxygraphic.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/py.typed +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/query.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/queryparser.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/r12strict.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/recover.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/_linetypes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/abstract_mtext_renderer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/arrows.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/curves.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/dim_base.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/dim_curved.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/dim_diameter.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/dim_linear.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/dim_ordinate.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/dim_radius.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/dimension.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/forms.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/hatching.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/leader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/linetypes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/mesh.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/mleader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/mline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/point.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/polyline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/r12spline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/render/trace.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/reorder.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/16x16.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/24x24.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/256x256.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/32x32.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/48x48.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/64x64.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/icon-copy-64px.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/icon-find-64px.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/icon-goto-bookmark-64px.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/icon-goto-handle-64px.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/icon-goto-line-64px.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/icon-left-arrow-64px.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/icon-next-entity-64px.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/icon-prev-entity-64px.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/icon-right-arrow-64px.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/icon-show-in-tree-64px.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/resources/icon-store-bookmark-64px.png +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/revcloud.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/sections/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/sections/acdsdata.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/sections/blocks.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/sections/classes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/sections/entities.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/sections/header.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/sections/headervars.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/sections/objects.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/sections/table.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/sections/tables.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/select.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/__init__.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/_iso_pattern.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/analyze.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/binarydata.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/codepage.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/complex_ltype.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/crypt.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/debug.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/difftags.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/handle.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/indexing.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/juliandate.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/pattern.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/rawloader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/standards.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/strip.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/test.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/text.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/text_layout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/text_size.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/tools/zipmanager.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/transform.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/units.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/upright.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/urecord.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/xclip.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/xref.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf/zoom.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf.egg-info/SOURCES.txt +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf.egg-info/dependency_links.txt +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf.egg-info/entry_points.txt +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf.egg-info/not-zip-safe +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf.egg-info/requires.txt +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/src/ezdxf.egg-info/top_level.txt +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/conftest.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_001_dxf_types.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_002_dxf_vertex.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_003_dxf_binary_tag.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_004_dxf_value.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_005_packed_tags.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_010_binary_data.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_011_codepage.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_012_crypt.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_013_juliandate.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_014_multi_tags_text.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_015_entity_structure_validator.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_016_encoding.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_018_handle.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_019_complex_line_type.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_020_validators_and_fixer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_021_fix_line_coordinates.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_022_set_flag_state.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_023_fix_invalid_located_group_codes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_024_render_tag.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_040_tags.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_041_group_tags.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_042_tags_loader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_043_filter_invalid_point_codes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_050_extended_tags.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_051_load_dxf_structure.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_052_tag_writer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_053_embedded_object_tags.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_054_dxfattr.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_055_recover_loader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_056_special_string_decoding.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_057_group_code_mapping.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_00_dxf_low_level_structs/test_058_json_tags.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_101_dxfnamespace.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_102_appdata.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_103_reactors.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_104_extension_dict.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_105_xdata.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_110_dxfentity.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_111_unknown_dxf_entity.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_112a_dxfgfx.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_112b_dxfobj.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_113_dxfclass.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_114_factory.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_115_new_empty_drawing.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_116_dictionary.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_117_layer_table_entry.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_118_appid_table_entry.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_119_ucs_table_entry.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_120_style_table_entry.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_121_ltype_table_entry.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_122_vport_table_entry.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_123_view_table_entry.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_124_dimstyle_table_entry.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_125_image_def.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_126_image_def_reactor.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_127_raster_variables.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_128_pdf_definition.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_129_xrecord.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_130_id_buffer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_131_field_list.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_132_layer_filter.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_133_sun.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_134_material.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_135_geo_data.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_136_vba_project.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_137_sortentstable.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_138_setup_visual_styles.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_139_user_record.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_140_block_record.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_141_layer_vp_override.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_142_copy_strategy.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_143_spatial_filter.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_01_dxf_entities/test_144_roundtrip_xrecord.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/conftest.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_200_line.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_201_point.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_202_circle.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_203_arc.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_204_shape.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_205_solid.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_206_text.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_207_attdef.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_208_attrib.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_209_vertex.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_210_polyline_1.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_210_polyline_2.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_210_polyline_explode.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_210_polyline_vertex_attributes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_211_viewport.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_212_insert.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_213_minsert.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_214_block.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_215_dimension.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_216_dimlines_R12.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_217_dimlines_R2000.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_218_poly_line_mesh_face.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_219_dxf_r2000_generics.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_220_lwpolyline_1.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_220_lwpolyline_2.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_220_lwpolyline_3.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_220_lwpolyline_explode.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_221_ellipse.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_222_xline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_223_ray.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_224_group.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_225_mtext.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_226_spline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_226_spline_with_linear_segments.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_227_mesh_packed_data.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_228_mesh.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_229a_hatch_dxf_interface.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_229b_hatch_extended.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_229c_hatch_transformations.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_230a_image_as_virtual_entity.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_230b_image_in_layout_context.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_231_underlay.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_231_underlay_2.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_232a_add_acis.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_232b_acis_export.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_232c_acis_surface.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_232d_acis_copy.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_232e_acis_transform.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_233_helix.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_234_light.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_235_leader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_236_multileader.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_237_mline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_238_tolerance.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_239_proxy_graphic.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_240_arc_dimension.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_241_hyperlink.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_242_random_transform.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_243_replace_entity.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_244_large_radial_dimension.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_245_wipeout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_246_spline_audit.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_247_mtext_columns_R2018.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_248_mpolygon.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_248_mtext_linked_columns_R2000_to_R2013.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_249_boundary_paths.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_250_virtual_boundary_path_entities.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_251_upright.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_252_acad_proxy_entity.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_253_ole2frame.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_02_dxf_graphics/test_254_get_font_name.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_300_layout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_301_add_gfx_to_layout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_302_block_references.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_303_auto_block_references.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_304_new_entity_space.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_305_copy_and_move_entity_to_layout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_306_copy_linked_entities.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_307_groupby.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_308_query.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_309_query_parser.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_311_add_foreign_entity.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_312_virtual_layout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_03_dxf_layouts/test_313_redraw_order.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_401_headersection.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_402_classessection.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_403_entity_database.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_404a_tables.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_404b_object_collections.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_405_classes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_406_blocks_section.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_407_entity_section.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_408_objects_section.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_409_create_objects.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_410_table.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_411_acds_data.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_412_rename_layer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_413_dxfgroups.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_414_block_reference_content.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_415_layout_management.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_416a_disassemble.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_416b_recursive_decompose.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_417_bbox.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_418_copy_entities.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_420_load_dxf_file.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_421_new_drawings.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_422_drawing_object.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_423_read_proe_r2004.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_424_audit.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_425_limits_and_extents.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_426_ezdxf_metadata.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_427_appsettings.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_428_r12_name_translator.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_04_dxf_high_level_structs/test_429_xclip.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/conftest.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_500_units.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_501_truecolor.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_502_raw_color.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_503_indexing.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_504_suppress_zeros.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_506_version.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_508_read_zip.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_509_comments.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_510_byte_stream.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_511_bit_stream.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_512_pattern.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_513_reorder_entities.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_514_text.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_515a_fonts_truetype.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_515b_fonts_shapefiles.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_515c_fonts_lff.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_516_zoom.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_517_text_layout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_518_header_guid.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_519_mtext_editor.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_520_mtext_context.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_521_mtext_parser.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_522_text_scanner.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_523_text_size.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_524_block_reference_manager.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_525_transparency.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_526_explode.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_527_gfxattribs.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_528_difftags.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_529_acis_sat.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_530_acis_sab.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_531_acis_entities.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_532_acis_mesh.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_533_shapefiles.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_534_dwg_info.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_535_xref_basic.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_536_xref_conflict.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_537_transform.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_538_scale_mtext_inline_commands.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_539_npshapes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_540_lff_parser.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_541_clipping_portal.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_542_itertools.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_543_select.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_544_revcloud.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_545_acis_cache.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_05_tools/test_547_edgesmith.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/conftest.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_600_base.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_601_bulge.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_602_vec3.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_603_vec2.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_604_banded_matrix.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_604_linalg.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_605_matrix44.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_606_convexhull.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_607_perlin_noise.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_608_intersection_line_line_2d.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_609_point_on_line.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_610_ocs.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_611_ucs.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_612_ucs_pass_trough.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_613_is_point_in_polygon_2d.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_614_construct_3d.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_615_rytz_axis.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_616_plane.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_617_clockwise_orientation.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_618_clipping.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_620_knot.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_621_bspline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_622_bsplineu.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_623_rbspline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_624_global_bspline_interpolation.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_626_local_bspline_interpolation.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_627_bspline_basis.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_629_bezier.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_630a_bezier4p_base.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_630b_bezier4p_functions.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_631_euler_spiral.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_632_bezier3p.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_640_bbox.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_641_construction_ray.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_642_construction_line.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_643_construction_box.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_644_construction_circle.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_645_construction_arc.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_646_offset_vertices_2d.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_647_transform_tools.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_648_construction_ellipse.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_650_elliptic_arc_span.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_651_construction_polyline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_652_approx_param_t.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_653_polyline_intersection.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_654_rtree.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_655_dbscan.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_656_k_means.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_657_mapbox_earcut.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_658_bevel_tools.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_659_intersection_line_polygon_3d.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_660_intersection_ray_polygon_3d.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_661_is_face_normal_pointing_outwards.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_662_is_convex_polygon_2d.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_663_is_axes_aligned_rectange.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_664_concave_clipping_polygon.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_665_inverted_clipping_polygon.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_06_math/test_666_wgs84_transform.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_701_arrows.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_702_render_forms.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_703_mesh_builder.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_704_render_linear_dimension.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_705_shape.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_706_random_path.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_707_trace.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_708a_path.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_708b_path_tools.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_708c_matplotlib_path_tools.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_708d_qpainter_path_tools.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_708e_path_shapes.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_708f_path_nesting.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_709_linetype_renderer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_711_points.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_712_render_curved_dimension.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_713_mleader_builder.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_714_mleader_render_engine.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_715_hatching.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_07_render/test_715_issue_747_explode_3d_dim.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_800_mtext_surrogate.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_801_r12spline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_802_table_painter.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_803_entities_to_code.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_804_importer.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_805_pycsg.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_806_acadctb.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_807_dwg_loader_basics.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_810_drawing_properties.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_811a_drawing_frontend.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_811b_drawing_recorder.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_811c_viewport_processing.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_812_drawing_graphic_proxy.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_813_geo_interface.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_814_text2path.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_815_dxf_browser.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_816_bin_packing.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_817_genetic_algorithm.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_818_meshex.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_819_menger_sponge.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_820_openscad.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_821_hpgl2.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_821_hpgl2_polygon_encoded.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_823_drawing_layout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_824_svg_drawing_backend.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_825_hpgl2_drawing_backend.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_826_custom_json_backend.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_08_addons/test_827_geojson_backend.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_09_cython_acceleration/test_901_acc_vec2.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_09_cython_acceleration/test_902_acc_vec3.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_09_cython_acceleration/test_903_acc_matrix44.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_09_cython_acceleration/test_904_acc_bezier4p.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_09_cython_acceleration/test_905_acc_bezier3p.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_09_cython_acceleration/test_906_acc_bspline.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_10_issues/test_issue_1078_bbox_calculation.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_10_issues/test_issue_414_bbox_calculation.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_10_issues/test_issue_557_reload_dimension_text_style.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_10_issues/test_issue_574_flattening_error.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_10_issues/test_issue_589_incorrect_virtual_face3d.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_10_issues/test_issue_749_text_layout.py +0 -0
- {ezdxf-1.3.1 → ezdxf-1.3.1b0}/tests/test_10_issues/test_issue_873_circle_inverted_normal.py +0 -0
|
@@ -851,8 +851,6 @@ class UniversalFrontend:
|
|
|
851
851
|
entity, segments=self.config.circle_approximation_count // 2
|
|
852
852
|
)
|
|
853
853
|
for polygon in trace.polygons(): # polygon is a sequence of Vec2()
|
|
854
|
-
if len(polygon) < 3:
|
|
855
|
-
continue
|
|
856
854
|
if transform:
|
|
857
855
|
points = ocs.points_to_wcs(
|
|
858
856
|
Vec3(v.x, v.y, elevation) for v in polygon
|
|
@@ -863,9 +861,8 @@ class UniversalFrontend:
|
|
|
863
861
|
properties.filling = Filling()
|
|
864
862
|
self.pipeline.draw_filled_polygon(points, properties)
|
|
865
863
|
return
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
self.pipeline.draw_path(polyline_path, properties)
|
|
864
|
+
|
|
865
|
+
self.pipeline.draw_path(make_path(entity), properties)
|
|
869
866
|
|
|
870
867
|
def draw_composite_entity(self, entity: DXFGraphic, properties: Properties) -> None:
|
|
871
868
|
def draw_insert(insert: Insert):
|
|
@@ -0,0 +1,665 @@
|
|
|
1
|
+
# Copyright (c) 2024, Manfred Moitzi
|
|
2
|
+
# License: MIT License
|
|
3
|
+
"""
|
|
4
|
+
EdgeMiner
|
|
5
|
+
=========
|
|
6
|
+
|
|
7
|
+
A module for detecting linked edges.
|
|
8
|
+
|
|
9
|
+
The complementary module ezdxf.edgesmith can create entities from the output of this
|
|
10
|
+
module.
|
|
11
|
+
|
|
12
|
+
.. versionadded:: 1.4
|
|
13
|
+
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
from typing import Any, Sequence, Iterator, Iterable, Dict, Tuple
|
|
17
|
+
from typing_extensions import Self, TypeAlias
|
|
18
|
+
from collections import defaultdict
|
|
19
|
+
import time
|
|
20
|
+
|
|
21
|
+
from ezdxf.math import UVec, Vec3, distance_point_line_3d
|
|
22
|
+
from ezdxf.math import rtree
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
__all__ = [
|
|
26
|
+
"Edge",
|
|
27
|
+
"EdgeDeposit",
|
|
28
|
+
"find_all_loops_in_deposit",
|
|
29
|
+
"find_all_loops",
|
|
30
|
+
"find_all_sequential",
|
|
31
|
+
"find_first_loop_in_deposit",
|
|
32
|
+
"find_first_loop",
|
|
33
|
+
"find_sequential",
|
|
34
|
+
"is_backwards_connected",
|
|
35
|
+
"is_chain",
|
|
36
|
+
"is_forward_connected",
|
|
37
|
+
"is_loop",
|
|
38
|
+
"length",
|
|
39
|
+
"longest_chain",
|
|
40
|
+
"Network",
|
|
41
|
+
"shortest_chain",
|
|
42
|
+
"TimeoutError",
|
|
43
|
+
]
|
|
44
|
+
ABS_TOL = 1e-12
|
|
45
|
+
GAP_TOL = 1e-12
|
|
46
|
+
TIMEOUT = 60.0 # in seconds
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class EdgeMinerException(Exception):
|
|
50
|
+
pass
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class TimeoutError(EdgeMinerException):
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class Edge:
|
|
58
|
+
"""Represents an edge.
|
|
59
|
+
|
|
60
|
+
The edge can represent any linear curve (line, arc, spline,...).
|
|
61
|
+
Therefore, the length of the edge must be specified if the length calculation for
|
|
62
|
+
a sequence of edges is to be possible.
|
|
63
|
+
|
|
64
|
+
This class is immutable by design!
|
|
65
|
+
|
|
66
|
+
Attributes:
|
|
67
|
+
id: unique id as int
|
|
68
|
+
start: start vertex as Vec3
|
|
69
|
+
end: end vertex as Vec3
|
|
70
|
+
reverse: flag to indicate that the edge is reversed compared to its initial state
|
|
71
|
+
length: length of the edge, default is the distance between start- and end vertex
|
|
72
|
+
payload: arbitrary data associated to the edge
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
__slots__ = ("id", "start", "end", "reverse", "length", "payload")
|
|
76
|
+
_next_id = 1
|
|
77
|
+
|
|
78
|
+
def __init__(
|
|
79
|
+
self, start: UVec, end: UVec, length: float = -1.0, payload: Any = None
|
|
80
|
+
) -> None:
|
|
81
|
+
self.id = Edge._next_id # unique id but reversed copies have the same id
|
|
82
|
+
Edge._next_id += 1
|
|
83
|
+
self.start = Vec3(start)
|
|
84
|
+
self.end = Vec3(end)
|
|
85
|
+
self.reverse: bool = False
|
|
86
|
+
if length < 0.0:
|
|
87
|
+
length = self.start.distance(self.end)
|
|
88
|
+
self.length = length
|
|
89
|
+
self.payload = payload
|
|
90
|
+
|
|
91
|
+
def __eq__(self, other) -> bool:
|
|
92
|
+
"""Return ``True`` if the ids of the edges are equal."""
|
|
93
|
+
if isinstance(other, Edge):
|
|
94
|
+
return self.id == other.id
|
|
95
|
+
return False
|
|
96
|
+
|
|
97
|
+
def __repr__(self) -> str:
|
|
98
|
+
if self.payload is None:
|
|
99
|
+
content = str(self.id)
|
|
100
|
+
else:
|
|
101
|
+
content = str(self.payload)
|
|
102
|
+
return f"Edge({content})"
|
|
103
|
+
|
|
104
|
+
def __hash__(self) -> int:
|
|
105
|
+
# edges can be used in sets and set-operations
|
|
106
|
+
return self.id
|
|
107
|
+
|
|
108
|
+
def reversed(self) -> Self:
|
|
109
|
+
"""Returns a reversed copy."""
|
|
110
|
+
edge = self.__class__(self.end, self.start, self.length, self.payload)
|
|
111
|
+
edge.reverse = not self.reverse
|
|
112
|
+
edge.id = self.id # reversed copies represent the same edge
|
|
113
|
+
return edge
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def isclose(a: Vec3, b: Vec3, gap_tol=GAP_TOL) -> bool:
|
|
117
|
+
"""This function should be used to test whether two vertices are close to each other
|
|
118
|
+
to get consistent results.
|
|
119
|
+
"""
|
|
120
|
+
return a.distance(b) <= gap_tol
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def is_forward_connected(a: Edge, b: Edge, gap_tol=GAP_TOL) -> bool:
|
|
124
|
+
"""Returns ``True`` if the edges have a forward connection.
|
|
125
|
+
|
|
126
|
+
Forward connection: distance from a.end to b.start <= gap_tol
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
a: first edge
|
|
130
|
+
b: second edge
|
|
131
|
+
gap_tol: maximum vertex distance to consider two edges as connected
|
|
132
|
+
"""
|
|
133
|
+
return isclose(a.end, b.start, gap_tol)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def is_backwards_connected(a: Edge, b: Edge, gap_tol=GAP_TOL) -> bool:
|
|
137
|
+
"""Returns ``True`` if the edges have a backwards connection.
|
|
138
|
+
|
|
139
|
+
Backwards connection: distance from b.end to a.start <= gap_tol
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
a: first edge
|
|
143
|
+
b: second edge
|
|
144
|
+
gap_tol: maximum vertex distance to consider two edges as connected
|
|
145
|
+
"""
|
|
146
|
+
return isclose(a.start, b.end, gap_tol)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def is_chain(edges: Sequence[Edge], gap_tol=GAP_TOL) -> bool:
|
|
150
|
+
"""Returns ``True`` if all edges have a forward connection.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
edges: sequence of edges
|
|
154
|
+
gap_tol: maximum vertex distance to consider two edges as connected
|
|
155
|
+
"""
|
|
156
|
+
return all(is_forward_connected(a, b, gap_tol) for a, b in zip(edges, edges[1:]))
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def is_loop(edges: Sequence[Edge], gap_tol=GAP_TOL, full=True) -> bool:
|
|
160
|
+
"""Return ``True`` if the sequence of edges is a closed loop.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
edges: sequence of edges
|
|
164
|
+
gap_tol: maximum vertex distance to consider two edges as connected
|
|
165
|
+
full: does a full check if all edges have a forward connection if ``True``,
|
|
166
|
+
otherwise checks only if the last edge is connected to the first edge.
|
|
167
|
+
"""
|
|
168
|
+
if full and not is_chain(edges, gap_tol):
|
|
169
|
+
return False
|
|
170
|
+
return is_forward_connected(edges[-1], edges[0])
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def length(edges: Sequence[Edge]) -> float:
|
|
174
|
+
"""Returns the length of a sequence of edges."""
|
|
175
|
+
return sum(e.length for e in edges)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def shortest_chain(chains: Iterable[Sequence[Edge]]) -> Sequence[Edge]:
|
|
179
|
+
"""Returns the shortest chain of connected edges.
|
|
180
|
+
|
|
181
|
+
.. note::
|
|
182
|
+
|
|
183
|
+
This function does not verify if the input sequences are connected edges!
|
|
184
|
+
|
|
185
|
+
"""
|
|
186
|
+
sorted_chains = sorted(chains, key=length)
|
|
187
|
+
if sorted_chains:
|
|
188
|
+
return sorted_chains[0]
|
|
189
|
+
return tuple()
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def longest_chain(chains: Iterable[Sequence[Edge]]) -> Sequence[Edge]:
|
|
193
|
+
"""Returns the longest chain of connected edges.
|
|
194
|
+
|
|
195
|
+
.. Note::
|
|
196
|
+
|
|
197
|
+
This function does not verify if the input sequences are connected edges!
|
|
198
|
+
|
|
199
|
+
"""
|
|
200
|
+
sorted_chains = sorted(chains, key=length)
|
|
201
|
+
if sorted_chains:
|
|
202
|
+
return sorted_chains[-1]
|
|
203
|
+
return tuple()
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def find_sequential(edges: Sequence[Edge], gap_tol=GAP_TOL) -> Sequence[Edge]:
|
|
207
|
+
"""Returns all consecutive connected edges starting from the first edge.
|
|
208
|
+
|
|
209
|
+
The search stops at the first edge without a froward connection from the previous
|
|
210
|
+
edge.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
edges: edges to be examined
|
|
214
|
+
gap_tol: maximum vertex distance to consider two edges as connected
|
|
215
|
+
|
|
216
|
+
Raises:
|
|
217
|
+
TypeError: invalid data in sequence `edges`
|
|
218
|
+
"""
|
|
219
|
+
edges = type_check(edges)
|
|
220
|
+
if len(edges) < 2:
|
|
221
|
+
return edges
|
|
222
|
+
chain = [edges[0]]
|
|
223
|
+
for edge in edges[1:]:
|
|
224
|
+
last = chain[-1]
|
|
225
|
+
if is_forward_connected(last, edge, gap_tol):
|
|
226
|
+
chain.append(edge)
|
|
227
|
+
continue
|
|
228
|
+
reversed_edge = edge.reversed()
|
|
229
|
+
if is_forward_connected(last, reversed_edge, gap_tol):
|
|
230
|
+
chain.append(reversed_edge)
|
|
231
|
+
continue
|
|
232
|
+
break
|
|
233
|
+
return chain
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def find_all_sequential(
|
|
237
|
+
edges: Sequence[Edge], gap_tol=GAP_TOL
|
|
238
|
+
) -> Iterator[Sequence[Edge]]:
|
|
239
|
+
"""Yields all edge chains with consecutive connected edges starting from the first
|
|
240
|
+
edge. This search starts a new sequence at every edge without a forward connection
|
|
241
|
+
from the previous sequence. Each sequence has always one or more edges.
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
edges: sequence of edges
|
|
245
|
+
gap_tol: maximum vertex distance to consider two edges as connected
|
|
246
|
+
|
|
247
|
+
Raises:
|
|
248
|
+
TypeError: invalid data in sequence `edges`
|
|
249
|
+
"""
|
|
250
|
+
while edges:
|
|
251
|
+
chain = find_sequential(edges, gap_tol)
|
|
252
|
+
edges = edges[len(chain) :]
|
|
253
|
+
yield chain
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
class Watchdog:
|
|
257
|
+
def __init__(self, timeout=TIMEOUT) -> None:
|
|
258
|
+
self.timeout: float = timeout
|
|
259
|
+
self.start_time: float = time.perf_counter()
|
|
260
|
+
|
|
261
|
+
def start(self, timeout: float):
|
|
262
|
+
self.timeout = timeout
|
|
263
|
+
self.start_time = time.perf_counter()
|
|
264
|
+
|
|
265
|
+
@property
|
|
266
|
+
def has_timed_out(self) -> bool:
|
|
267
|
+
return time.perf_counter() - self.start_time > self.timeout
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def find_first_loop(
|
|
271
|
+
edges: Sequence[Edge], gap_tol=GAP_TOL, timeout=TIMEOUT
|
|
272
|
+
) -> Sequence[Edge]:
|
|
273
|
+
"""Returns the first closed loop found in `edges`.
|
|
274
|
+
|
|
275
|
+
.. note::
|
|
276
|
+
|
|
277
|
+
Recursive backtracking algorithm with time complexity of O(n!).
|
|
278
|
+
|
|
279
|
+
Args:
|
|
280
|
+
edges: sequence of edges
|
|
281
|
+
gap_tol: maximum vertex distance to consider two edges as connected
|
|
282
|
+
timeout: timeout in seconds
|
|
283
|
+
|
|
284
|
+
Raises:
|
|
285
|
+
TimeoutError: search process has timed out
|
|
286
|
+
TypeError: invalid data in sequence `edges`
|
|
287
|
+
"""
|
|
288
|
+
deposit = EdgeDeposit(edges, gap_tol=gap_tol)
|
|
289
|
+
if len(deposit.edges) < 2:
|
|
290
|
+
return tuple()
|
|
291
|
+
return find_first_loop_in_deposit(deposit, timeout=timeout)
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def find_first_loop_in_deposit(deposit: EdgeDeposit, timeout=TIMEOUT) -> Sequence[Edge]:
|
|
295
|
+
"""Returns the first closed loop found in edge `deposit`.
|
|
296
|
+
|
|
297
|
+
.. note::
|
|
298
|
+
|
|
299
|
+
Recursive backtracking algorithm with time complexity of O(n!).
|
|
300
|
+
|
|
301
|
+
Args:
|
|
302
|
+
deposit: edge deposit
|
|
303
|
+
timeout: timeout in seconds
|
|
304
|
+
|
|
305
|
+
Raises:
|
|
306
|
+
TimeoutError: search process has timed out
|
|
307
|
+
"""
|
|
308
|
+
|
|
309
|
+
if len(deposit.edges) < 2:
|
|
310
|
+
return tuple()
|
|
311
|
+
networks = list(deposit.build_all_networks(timeout=timeout))
|
|
312
|
+
for network in networks:
|
|
313
|
+
finder = LoopFinder(network, timeout=timeout)
|
|
314
|
+
loop = finder.find_any_loop()
|
|
315
|
+
if loop:
|
|
316
|
+
return loop
|
|
317
|
+
return tuple()
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
def find_all_loops(
|
|
321
|
+
edges: Sequence[Edge], gap_tol=GAP_TOL, timeout=TIMEOUT
|
|
322
|
+
) -> Sequence[Sequence[Edge]]:
|
|
323
|
+
"""Returns all unique closed loops and doesn't include reversed solutions.
|
|
324
|
+
|
|
325
|
+
.. note::
|
|
326
|
+
|
|
327
|
+
Recursive backtracking algorithm with time complexity of O(n!).
|
|
328
|
+
|
|
329
|
+
Args:
|
|
330
|
+
edges: sequence of edges
|
|
331
|
+
gap_tol: maximum vertex distance to consider two edges as connected
|
|
332
|
+
timeout: timeout in seconds
|
|
333
|
+
|
|
334
|
+
Raises:
|
|
335
|
+
TimeoutError: search process has timed out
|
|
336
|
+
TypeError: invalid data in sequence `edges`
|
|
337
|
+
"""
|
|
338
|
+
deposit = EdgeDeposit(edges, gap_tol=gap_tol)
|
|
339
|
+
if len(deposit.edges) < 2:
|
|
340
|
+
return tuple()
|
|
341
|
+
return find_all_loops_in_deposit(deposit, timeout=timeout)
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
def find_all_loops_in_deposit(
|
|
345
|
+
deposit: EdgeDeposit, timeout=TIMEOUT
|
|
346
|
+
) -> Sequence[Sequence[Edge]]:
|
|
347
|
+
"""Returns all unique closed loops in found in the edge `deposit` and doesn't
|
|
348
|
+
include reversed solutions.
|
|
349
|
+
|
|
350
|
+
.. note::
|
|
351
|
+
|
|
352
|
+
Recursive backtracking algorithm with time complexity of O(n!).
|
|
353
|
+
|
|
354
|
+
Args:
|
|
355
|
+
deposit: edge deposit
|
|
356
|
+
timeout: timeout in seconds
|
|
357
|
+
|
|
358
|
+
Raises:
|
|
359
|
+
TimeoutError: search process has timed out
|
|
360
|
+
"""
|
|
361
|
+
gap_tol = deposit.gap_tol
|
|
362
|
+
solutions: list[Sequence[Edge]] = []
|
|
363
|
+
for network in deposit.build_all_networks(timeout=timeout):
|
|
364
|
+
finder = LoopFinder(network, gap_tol=gap_tol, timeout=timeout)
|
|
365
|
+
for edge in network:
|
|
366
|
+
finder.search(edge)
|
|
367
|
+
solutions.extend(finder)
|
|
368
|
+
return solutions
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def type_check(edges: Sequence[Edge]) -> Sequence[Edge]:
|
|
372
|
+
for edge in edges:
|
|
373
|
+
if not isinstance(edge, Edge):
|
|
374
|
+
raise TypeError(f"expected type <Edge>, got {str(type(edge))}")
|
|
375
|
+
return edges
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
class EdgeVertexIndex:
|
|
379
|
+
"""Index of edges referenced by the id of their start- and end vertices.
|
|
380
|
+
|
|
381
|
+
.. important::
|
|
382
|
+
|
|
383
|
+
The id of the vertices is indexed not the location!
|
|
384
|
+
|
|
385
|
+
(internal class)
|
|
386
|
+
"""
|
|
387
|
+
|
|
388
|
+
def __init__(self, edges: Sequence[Edge]) -> None:
|
|
389
|
+
index: dict[int, Edge] = {}
|
|
390
|
+
for edge in edges:
|
|
391
|
+
index[id(edge.start)] = edge
|
|
392
|
+
index[id(edge.end)] = edge
|
|
393
|
+
self._index = index
|
|
394
|
+
|
|
395
|
+
def find_edges(self, vertices: Iterable[Vec3]) -> Sequence[Edge]:
|
|
396
|
+
"""Returns all edges referenced by the id of given vertices."""
|
|
397
|
+
index = self._index
|
|
398
|
+
edges: list[Edge] = []
|
|
399
|
+
for vertex in vertices:
|
|
400
|
+
edge = index.get(id(vertex))
|
|
401
|
+
if edge:
|
|
402
|
+
edges.append(edge)
|
|
403
|
+
return edges
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
class SpatialSearchIndex:
|
|
407
|
+
"""Spatial search index of all edge vertices.
|
|
408
|
+
|
|
409
|
+
(internal class)
|
|
410
|
+
"""
|
|
411
|
+
|
|
412
|
+
def __init__(self, edges: Sequence[Edge]) -> None:
|
|
413
|
+
vertices: list[Vec3] = []
|
|
414
|
+
for edge in edges:
|
|
415
|
+
vertices.append(edge.start)
|
|
416
|
+
vertices.append(edge.end)
|
|
417
|
+
self._search_tree = rtree.RTree(vertices)
|
|
418
|
+
|
|
419
|
+
def vertices_in_sphere(self, center: Vec3, radius: float) -> Sequence[Vec3]:
|
|
420
|
+
"""Returns all vertices located around `center` with a max. distance of `radius`."""
|
|
421
|
+
return tuple(self._search_tree.points_in_sphere(center, radius)) # type: ignore
|
|
422
|
+
|
|
423
|
+
def nearest_vertex(self, location: Vec3) -> Vec3:
|
|
424
|
+
"""Returns the nearest vertex to the given location."""
|
|
425
|
+
vertex, _ = self._search_tree.nearest_neighbor(location)
|
|
426
|
+
return vertex # type: ignore
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
def discard_edges(edges: Iterable[Edge], discard: Iterable[Edge]) -> Sequence[Edge]:
|
|
430
|
+
return discard_ids(edges, ids=set(e.id for e in discard))
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
def discard_ids(edges: Iterable[Edge], ids: set[int]) -> Sequence[Edge]:
|
|
434
|
+
return tuple(e for e in edges if e.id not in ids)
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
class EdgeDeposit:
|
|
438
|
+
"""The edge deposit stores all available edges for further searches."""
|
|
439
|
+
|
|
440
|
+
def __init__(self, edges: Sequence[Edge], gap_tol=GAP_TOL) -> None:
|
|
441
|
+
self.gap_tol = gap_tol
|
|
442
|
+
self.edges = type_check(tuple(edges))
|
|
443
|
+
self.edge_index = EdgeVertexIndex(self.edges)
|
|
444
|
+
self.search_index = SpatialSearchIndex(self.edges)
|
|
445
|
+
|
|
446
|
+
def edges_linked_to(self, vertex: UVec, radius: float = -1) -> Sequence[Edge]:
|
|
447
|
+
"""Returns all edges linked to `vertex` in range of `radius`.
|
|
448
|
+
|
|
449
|
+
Default radius is :attr:`self.gap_tol`.
|
|
450
|
+
"""
|
|
451
|
+
if radius < 0:
|
|
452
|
+
radius = self.gap_tol
|
|
453
|
+
vertices = self.search_index.vertices_in_sphere(Vec3(vertex), radius)
|
|
454
|
+
if not vertices:
|
|
455
|
+
return tuple()
|
|
456
|
+
return self.edge_index.find_edges(vertices)
|
|
457
|
+
|
|
458
|
+
def find_nearest_edge(self, vertex: UVec) -> Edge | None:
|
|
459
|
+
"""Return the nearest edge to the given vertex.
|
|
460
|
+
|
|
461
|
+
The distance is measured to the connection line from start to end of the edge.
|
|
462
|
+
This is not correct for edges that represent arcs or splines.
|
|
463
|
+
"""
|
|
464
|
+
|
|
465
|
+
def distance(edge: Edge) -> float:
|
|
466
|
+
return distance_point_line_3d(vertex, edge.start, edge.end)
|
|
467
|
+
|
|
468
|
+
vertex = Vec3(vertex)
|
|
469
|
+
si = self.search_index
|
|
470
|
+
nearest_vertex = si.nearest_vertex(vertex)
|
|
471
|
+
edges = self.edges_linked_to(nearest_vertex)
|
|
472
|
+
if edges:
|
|
473
|
+
return min(edges, key=distance)
|
|
474
|
+
return None
|
|
475
|
+
|
|
476
|
+
def build_network(self, edge: Edge, timeout=TIMEOUT) -> Network:
|
|
477
|
+
"""Returns the network of all edges that are directly and indirectly linked to
|
|
478
|
+
`edge`.
|
|
479
|
+
|
|
480
|
+
Raises:
|
|
481
|
+
TimeoutError: build process has timed out
|
|
482
|
+
"""
|
|
483
|
+
|
|
484
|
+
def process(vertex: Vec3) -> None:
|
|
485
|
+
linked_edges = self.edges_linked_to(vertex)
|
|
486
|
+
linked_edges = discard_ids(linked_edges, ids=done)
|
|
487
|
+
if linked_edges:
|
|
488
|
+
network.add_connections(edge, linked_edges)
|
|
489
|
+
todo.extend(linked_edges)
|
|
490
|
+
|
|
491
|
+
network = Network()
|
|
492
|
+
done: set[int] = set()
|
|
493
|
+
todo: list[Edge] = [edge]
|
|
494
|
+
watchdog = Watchdog(timeout)
|
|
495
|
+
|
|
496
|
+
while todo:
|
|
497
|
+
if watchdog.has_timed_out:
|
|
498
|
+
raise TimeoutError("build process has timed out")
|
|
499
|
+
edge = todo.pop()
|
|
500
|
+
done.add(edge.id)
|
|
501
|
+
process(edge.start)
|
|
502
|
+
process(edge.end)
|
|
503
|
+
|
|
504
|
+
return network
|
|
505
|
+
|
|
506
|
+
def build_all_networks(self, timeout=TIMEOUT) -> Sequence[Network]:
|
|
507
|
+
"""Returns all separated networks in this deposit in ascending order of edge
|
|
508
|
+
count.
|
|
509
|
+
|
|
510
|
+
Raises:
|
|
511
|
+
TimeoutError: build process has timed out
|
|
512
|
+
"""
|
|
513
|
+
watchdog = Watchdog(timeout)
|
|
514
|
+
edges = set(self.edges)
|
|
515
|
+
networks: list[Network] = []
|
|
516
|
+
while edges:
|
|
517
|
+
if watchdog.has_timed_out:
|
|
518
|
+
raise TimeoutError("search process has timed out")
|
|
519
|
+
edge = edges.pop()
|
|
520
|
+
network = self.build_network(edge, timeout=timeout)
|
|
521
|
+
if len(network):
|
|
522
|
+
networks.append(network)
|
|
523
|
+
edges -= set(network)
|
|
524
|
+
else: # solitary edge
|
|
525
|
+
edges.discard(edge)
|
|
526
|
+
|
|
527
|
+
networks.sort(key=lambda n: len(n))
|
|
528
|
+
return networks
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
class Network:
|
|
532
|
+
"""The all edges in a network are reachable from every other edge."""
|
|
533
|
+
|
|
534
|
+
def __init__(self) -> None:
|
|
535
|
+
self._edges: dict[int, Edge] = {}
|
|
536
|
+
self._connections: dict[int, set[int]] = defaultdict(set)
|
|
537
|
+
|
|
538
|
+
def __repr__(self) -> str:
|
|
539
|
+
content = ",".join(str(e) for e in self)
|
|
540
|
+
return f"Network([{content}])"
|
|
541
|
+
|
|
542
|
+
def __len__(self) -> int:
|
|
543
|
+
return len(self._edges)
|
|
544
|
+
|
|
545
|
+
def __iter__(self) -> Iterator[Edge]:
|
|
546
|
+
return iter(self._edges.values())
|
|
547
|
+
|
|
548
|
+
def __contains__(self, edge: Edge) -> bool:
|
|
549
|
+
return edge.id in self._edges
|
|
550
|
+
|
|
551
|
+
def add_connection(self, base: Edge, target: Edge) -> None:
|
|
552
|
+
if base.id == target.id:
|
|
553
|
+
return
|
|
554
|
+
self._edges[base.id] = base
|
|
555
|
+
self._edges[target.id] = target
|
|
556
|
+
self._connections[base.id].add(target.id)
|
|
557
|
+
self._connections[target.id].add(base.id)
|
|
558
|
+
|
|
559
|
+
def add_connections(self, base: Edge, targets: Iterable[Edge]) -> None:
|
|
560
|
+
for target in targets:
|
|
561
|
+
self.add_connection(base, target)
|
|
562
|
+
|
|
563
|
+
def edges_linked_to(self, edge: Edge) -> Sequence[Edge]:
|
|
564
|
+
return tuple(self._edges[eid] for eid in self._connections[edge.id])
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
SearchSolutions: TypeAlias = Dict[Tuple[int, ...], Sequence[Edge]]
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
class LoopFinder:
|
|
571
|
+
"""Find closed loops in a network by a recursive backtracking algorithm.
|
|
572
|
+
|
|
573
|
+
(internal class)
|
|
574
|
+
"""
|
|
575
|
+
|
|
576
|
+
def __init__(
|
|
577
|
+
self, network: Network, discard_reverse=True, gap_tol=GAP_TOL, timeout=TIMEOUT
|
|
578
|
+
) -> None:
|
|
579
|
+
if len(network) < 2:
|
|
580
|
+
raise ValueError("two or more network nodes required")
|
|
581
|
+
self._network = network
|
|
582
|
+
self._discard_reverse_solutions = discard_reverse
|
|
583
|
+
self._gap_tol = gap_tol
|
|
584
|
+
self._timeout = timeout
|
|
585
|
+
self._solutions: SearchSolutions = {}
|
|
586
|
+
|
|
587
|
+
def __iter__(self) -> Iterator[Sequence[Edge]]:
|
|
588
|
+
return iter(self._solutions.values())
|
|
589
|
+
|
|
590
|
+
def __len__(self) -> int:
|
|
591
|
+
return len(self._solutions)
|
|
592
|
+
|
|
593
|
+
def find_any_loop(self, start: Edge | None = None) -> Sequence[Edge]:
|
|
594
|
+
"""Returns the first loop found beginning with the given start edge or an
|
|
595
|
+
arbitrary edge if `start` is None.
|
|
596
|
+
"""
|
|
597
|
+
if start is None:
|
|
598
|
+
start = next(iter(self._network))
|
|
599
|
+
|
|
600
|
+
self.search(start, stop_at_first_loop=True)
|
|
601
|
+
try:
|
|
602
|
+
return next(iter(self._solutions.values()))
|
|
603
|
+
except StopIteration:
|
|
604
|
+
return tuple()
|
|
605
|
+
|
|
606
|
+
def search(self, start: Edge, stop_at_first_loop: bool = False) -> None:
|
|
607
|
+
"""Searches for all loops that begin at the given start edge.
|
|
608
|
+
|
|
609
|
+
These are not all possible loops in a network!
|
|
610
|
+
"""
|
|
611
|
+
if start not in self._network:
|
|
612
|
+
raise ValueError("start edge not in network")
|
|
613
|
+
network = self._network
|
|
614
|
+
gap_tol = self._gap_tol
|
|
615
|
+
|
|
616
|
+
watchdog = Watchdog(self._timeout)
|
|
617
|
+
todo: list[tuple[Edge, ...]] = [(start,)] # "unlimited" recursion stack
|
|
618
|
+
while todo:
|
|
619
|
+
if watchdog.has_timed_out:
|
|
620
|
+
raise TimeoutError("search process has timed out")
|
|
621
|
+
chain = todo.pop()
|
|
622
|
+
last_edge = chain[-1]
|
|
623
|
+
end_point = last_edge.end
|
|
624
|
+
candidates = network.edges_linked_to(last_edge)
|
|
625
|
+
# edges must be unique in a loop
|
|
626
|
+
for edge in set(candidates) - set(chain):
|
|
627
|
+
if isclose(end_point, edge.start, gap_tol):
|
|
628
|
+
extended_chain = chain + (edge,)
|
|
629
|
+
elif isclose(end_point, edge.end, gap_tol):
|
|
630
|
+
extended_chain = chain + (edge.reversed(),)
|
|
631
|
+
else:
|
|
632
|
+
continue
|
|
633
|
+
if is_forward_connected(extended_chain[-1], start, gap_tol):
|
|
634
|
+
self.add_solution(extended_chain)
|
|
635
|
+
if stop_at_first_loop:
|
|
636
|
+
return
|
|
637
|
+
else:
|
|
638
|
+
todo.append(extended_chain)
|
|
639
|
+
|
|
640
|
+
def add_solution(self, loop: Sequence[Edge]) -> None:
|
|
641
|
+
solutions = self._solutions
|
|
642
|
+
key = loop_key(loop)
|
|
643
|
+
if key in solutions:
|
|
644
|
+
return
|
|
645
|
+
if (
|
|
646
|
+
self._discard_reverse_solutions
|
|
647
|
+
and loop_key(loop, reverse=True) in solutions
|
|
648
|
+
):
|
|
649
|
+
return
|
|
650
|
+
solutions[key] = loop
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
def loop_key(edges: Sequence[Edge], reverse=False) -> tuple[int, ...]:
|
|
654
|
+
"""Returns a normalized key.
|
|
655
|
+
|
|
656
|
+
The key is rotated to begin with the smallest edge id.
|
|
657
|
+
"""
|
|
658
|
+
if reverse:
|
|
659
|
+
ids = tuple(edge.id for edge in reversed(edges))
|
|
660
|
+
else:
|
|
661
|
+
ids = tuple(edge.id for edge in edges)
|
|
662
|
+
index = ids.index(min(ids))
|
|
663
|
+
if index:
|
|
664
|
+
ids = ids[index:] + ids[:index]
|
|
665
|
+
return ids
|