floodmodeller-api 0.4.3__tar.gz → 0.4.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {floodmodeller_api-0.4.3/floodmodeller_api.egg-info → floodmodeller_api-0.4.4}/PKG-INFO +4 -1
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/_base.py +22 -37
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/dat.py +165 -185
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/ied.py +82 -87
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/ief.py +92 -186
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/inp.py +64 -70
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/logs/__init__.py +1 -1
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/logs/lf.py +61 -17
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/conftest.py +7 -0
- floodmodeller_api-0.4.4/floodmodeller_api/test/test_conveyance.py +107 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_dat.py +5 -4
- floodmodeller_api-0.4.4/floodmodeller_api/test/test_data/conveyance_test.dat +165 -0
- floodmodeller_api-0.4.4/floodmodeller_api/test/test_data/conveyance_test.feb +116 -0
- floodmodeller_api-0.4.4/floodmodeller_api/test/test_data/conveyance_test.gxy +85 -0
- floodmodeller_api-0.4.4/floodmodeller_api/test/test_data/expected_conveyance.csv +60 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_ief.py +26 -15
- floodmodeller_api-0.4.4/floodmodeller_api/test/test_logs_lf.py +102 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/to_from_json.py +24 -12
- floodmodeller_api-0.4.4/floodmodeller_api/units/conveyance.py +301 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/sections.py +21 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/util.py +42 -0
- floodmodeller_api-0.4.4/floodmodeller_api/version.py +1 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/xml2d.py +80 -136
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/zzn.py +166 -139
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4/floodmodeller_api.egg-info}/PKG-INFO +4 -1
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api.egg-info/SOURCES.txt +6 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api.egg-info/requires.txt +3 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/requirements.txt +7 -2
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/setup.py +3 -0
- floodmodeller_api-0.4.3/floodmodeller_api/test/test_logs_lf.py +0 -48
- floodmodeller_api-0.4.3/floodmodeller_api/version.py +0 -1
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/LICENSE.txt +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/MANIFEST.in +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/README.md +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/__init__.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/backup.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/diff.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/ief_flags.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libifcoremd.dll +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libifcoremt.so.5 +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libifport.so.5 +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libimf.so +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libintlc.so.5 +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libmmd.dll +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libsvml.so +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libzzn_read.so +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/zzn_read.dll +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/logs/lf_helpers.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/logs/lf_params.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/mapping.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/__init__.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_backup.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/All Units 4_6.DAT +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/All Units 4_6.feb +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/BRIDGE.DAT +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.dat +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.feb +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DamBreakADI.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DamBreakFAST.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DamBreakFAST_dy.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DamBreakTVD.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DefenceBreach.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DefenceBreachFAST.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DefenceBreachFAST_dy.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1+2_QH.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1_H.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1_Q.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1_Q_FAST.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1_Q_FAST_dy.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1_Q_xml_expected.json +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1_W.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX1.DAT +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX1.ext +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX1.feb +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX1.gxy +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX17.DAT +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX17.ext +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX17.feb +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX18.DAT +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX18_DAT_expected.json +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX2.DAT +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX3.DAT +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX3_DAT_expected.json +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX3_IEF_expected.json +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX6.DAT +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX6.ext +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX6.feb +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX6_DAT_expected.json +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Event Data Example.DAT +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Event Data Example.ext +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Event Data Example.feb +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Linked1D2D.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Linked1D2DFAST.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Linked1D2DFAST_dy.xml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Linked1D2D_xml_expected.json +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/blockage.dat +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/blockage.ext +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/blockage.feb +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/blockage.gxy +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/defaultUnits.dat +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/defaultUnits.ext +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/defaultUnits.feb +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/defaultUnits.fmpx +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/defaultUnits.gxy +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/ex3.ief +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/ex3.lf1 +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/ex4.DAT +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/ex4_changed.DAT +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/example1.inp +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/example2.inp +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/example3.inp +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/example4.inp +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/example5.inp +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/example6.inp +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/jump.dat +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.dat +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.ext +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.exy +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.feb +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.ied +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.ief +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.inp +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.mmm +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.pxy +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.uic +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.zzd +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.zzl +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.zzn +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.zzu +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.zzx +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network_dat_expected.json +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network_from_tabularCSV.csv +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network_ied_expected.json +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir.dat +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir.ext +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir.feb +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir.gxy +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir_default.dat +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir_default.ext +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir_default.feb +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir_default.fmpx +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir_default.gxy +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/unit checks.dat +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_ied.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_inp.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_json.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_tool.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_toolbox_structure_log.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_xml2d.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_zzn.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/tool.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/__init__.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/example_tool.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/gui/bg.PNG +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/gui/logo.PNG +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_build/__init__.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_build/add_siltation_definition.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_build/structure_log/__init__.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_build/structure_log/structure_log.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_build/structure_log_definition.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_conversion/__init__.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_review/__init__.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/results_analysis/__init__.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/__init__.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/_base.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/boundaries.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/comment.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/conduits.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/helpers.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/iic.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/losses.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/structures.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/units.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/unsupported.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/variables.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/__init__.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/_base.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/conduits.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/general_parameters.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/junctions.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/losses.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/outfalls.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/raingauges.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/subsections.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/xsections.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/validation/__init__.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/validation/parameters.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/validation/urban_parameters.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/validation/validation.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/xml2d_template.py +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api.egg-info/dependency_links.txt +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api.egg-info/entry_points.txt +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api.egg-info/top_level.txt +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/pyproject.toml +0 -0
- {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: floodmodeller_api
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.4
|
|
4
4
|
Summary: Extends the functionality of Flood Modeller to python users
|
|
5
5
|
Author: Jacobs
|
|
6
6
|
Author-email: joe.pierce@jacobs.com
|
|
@@ -15,6 +15,9 @@ Requires-Dist: lxml==5.*
|
|
|
15
15
|
Requires-Dist: tqdm==4.*
|
|
16
16
|
Requires-Dist: pytest<8,>4
|
|
17
17
|
Requires-Dist: pytest-mock==3.*
|
|
18
|
+
Requires-Dist: shapely==2.*
|
|
19
|
+
Requires-Dist: scipy==1.*
|
|
20
|
+
Requires-Dist: freezegun==1.*
|
|
18
21
|
|
|
19
22
|

|
|
20
23
|
|
|
@@ -27,7 +27,7 @@ from .to_from_json import Jsonable
|
|
|
27
27
|
from .units._base import Unit
|
|
28
28
|
from .units.iic import IIC
|
|
29
29
|
from .urban1d._base import UrbanSubsection, UrbanUnit
|
|
30
|
-
from .
|
|
30
|
+
from .util import FloodModellerAPIError, handle_exception
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
class FMFile(Jsonable):
|
|
@@ -39,8 +39,7 @@ class FMFile(Jsonable):
|
|
|
39
39
|
|
|
40
40
|
def __init__(self, filepath: str | Path | None = None, **kwargs):
|
|
41
41
|
if filepath is not None:
|
|
42
|
-
self._filepath = Path(filepath)
|
|
43
|
-
# Check if filepath valid
|
|
42
|
+
self._filepath = Path(filepath)
|
|
44
43
|
# * Add check or fix for path lengths greater than DOS standard length of 260 characters
|
|
45
44
|
|
|
46
45
|
if not self._filepath.suffix.lower() == self._suffix:
|
|
@@ -62,7 +61,8 @@ class FMFile(Jsonable):
|
|
|
62
61
|
self.file = file
|
|
63
62
|
|
|
64
63
|
def __repr__(self):
|
|
65
|
-
|
|
64
|
+
filepath = "<in_memory>" if not hasattr(self, "_filepath") else self._filepath
|
|
65
|
+
return f"<floodmodeller_api Class: {self._filetype}(filepath={filepath})>"
|
|
66
66
|
|
|
67
67
|
def _write(self):
|
|
68
68
|
raise NotImplementedError
|
|
@@ -99,46 +99,31 @@ class FMFile(Jsonable):
|
|
|
99
99
|
|
|
100
100
|
print(f"{self._filetype} File Saved to: {filepath}")
|
|
101
101
|
|
|
102
|
+
@handle_exception(when="compare")
|
|
102
103
|
def _diff(self, other, force_print=False):
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
104
|
+
if self._filetype != other._filetype:
|
|
105
|
+
raise TypeError("Cannot compare objects of different filetypes")
|
|
106
|
+
diff = self._get_diff(other)
|
|
107
|
+
if diff[0]:
|
|
108
|
+
print("No difference, files are equivalent")
|
|
109
|
+
else:
|
|
110
|
+
print(f"Files not equivalent, {len(diff[1])} difference(s) found:")
|
|
111
|
+
if len(diff[1]) > self.MAX_DIFF and not force_print:
|
|
112
|
+
print(f"[Showing first {self.MAX_DIFF} differences...] ")
|
|
113
|
+
print(
|
|
114
|
+
"\n".join(
|
|
115
|
+
[f" {name}: {reason}" for name, reason in diff[1][: self.MAX_DIFF]],
|
|
116
|
+
),
|
|
117
|
+
)
|
|
118
|
+
print("\n...To see full list of all differences add force_print=True")
|
|
109
119
|
else:
|
|
110
|
-
print(f"
|
|
111
|
-
if len(diff[1]) > self.MAX_DIFF and not force_print:
|
|
112
|
-
print(f"[Showing first {self.MAX_DIFF} differences...] ")
|
|
113
|
-
print(
|
|
114
|
-
"\n".join(
|
|
115
|
-
[f" {name}: {reason}" for name, reason in diff[1][: self.MAX_DIFF]],
|
|
116
|
-
),
|
|
117
|
-
)
|
|
118
|
-
print("\n...To see full list of all differences add force_print=True")
|
|
119
|
-
else:
|
|
120
|
-
print("\n".join([f" {name}: {reason}" for name, reason in diff[1]]))
|
|
121
|
-
except Exception as e:
|
|
122
|
-
self._handle_exception(e, when="compare")
|
|
120
|
+
print("\n".join([f" {name}: {reason}" for name, reason in diff[1]]))
|
|
123
121
|
|
|
124
122
|
def _get_diff(self, other):
|
|
125
123
|
return self.__eq__(other, return_diff=True) # pylint: disable=unnecessary-dunder-call
|
|
126
124
|
|
|
127
125
|
def _handle_exception(self, err, when) -> NoReturn:
|
|
128
|
-
|
|
129
|
-
while tb.tb_next is not None:
|
|
130
|
-
tb = tb.tb_next
|
|
131
|
-
line_no = tb.tb_lineno
|
|
132
|
-
tb_path = Path(tb.tb_frame.f_code.co_filename)
|
|
133
|
-
fname = "/".join(tb_path.parts[-2:])
|
|
134
|
-
|
|
135
|
-
raise Exception(
|
|
136
|
-
"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
|
|
137
|
-
f"\nAPI Error: Problem encountered when trying to {when} {self._filetype} file {self._filepath}."
|
|
138
|
-
f"\n\nDetails: {__version__}-{fname}-{line_no}"
|
|
139
|
-
f"\nMsg: {err}"
|
|
140
|
-
"\n\nFor additional support, go to: https://github.com/People-Places-Solutions/floodmodeller-api",
|
|
141
|
-
)
|
|
126
|
+
raise FloodModellerAPIError(err, when, self._filetype, self._filepath) from err
|
|
142
127
|
|
|
143
128
|
def __eq__(self, other, return_diff=False):
|
|
144
129
|
result = True
|
|
@@ -23,6 +23,7 @@ from . import units
|
|
|
23
23
|
from ._base import FMFile
|
|
24
24
|
from .units._base import Unit
|
|
25
25
|
from .units.helpers import _to_float, _to_int
|
|
26
|
+
from .util import handle_exception
|
|
26
27
|
from .validation.validation import _validate_unit
|
|
27
28
|
|
|
28
29
|
|
|
@@ -43,26 +44,24 @@ class DAT(FMFile):
|
|
|
43
44
|
_filetype: str = "DAT"
|
|
44
45
|
_suffix: str = ".dat"
|
|
45
46
|
|
|
47
|
+
@handle_exception(when="read")
|
|
46
48
|
def __init__(
|
|
47
49
|
self,
|
|
48
50
|
dat_filepath: str | Path | None = None,
|
|
49
51
|
with_gxy: bool = False,
|
|
50
52
|
from_json: bool = False,
|
|
51
53
|
) -> None:
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
self._read()
|
|
54
|
+
if from_json:
|
|
55
|
+
return
|
|
56
|
+
if dat_filepath is not None:
|
|
57
|
+
FMFile.__init__(self, dat_filepath)
|
|
58
|
+
self._read()
|
|
58
59
|
|
|
59
|
-
|
|
60
|
-
|
|
60
|
+
else:
|
|
61
|
+
self._create_from_blank(with_gxy)
|
|
61
62
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
except Exception as e:
|
|
65
|
-
self._handle_exception(e, when="read")
|
|
63
|
+
self._get_general_parameters()
|
|
64
|
+
self._get_unit_definitions()
|
|
66
65
|
|
|
67
66
|
def update(self) -> None:
|
|
68
67
|
"""Updates the existing DAT based on any altered attributes"""
|
|
@@ -113,6 +112,7 @@ class DAT(FMFile):
|
|
|
113
112
|
|
|
114
113
|
# def _get_unit_from_connectivity(self, method) #use this as method prev and next
|
|
115
114
|
|
|
115
|
+
@handle_exception(when="calculate next unit in")
|
|
116
116
|
def next(self, unit: Unit) -> Unit | list[Unit] | None:
|
|
117
117
|
"""Finds next unit in the reach.
|
|
118
118
|
|
|
@@ -128,30 +128,27 @@ class DAT(FMFile):
|
|
|
128
128
|
Union[Unit, list[Unit], None]: Flood modeller unit either on its own or in a list if more than one follows in reach.
|
|
129
129
|
"""
|
|
130
130
|
# Needs to handle same name match outside dist to next (e.g. inflow)
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
return self._next_in_dat_struct(unit)
|
|
136
|
-
|
|
137
|
-
# Case 1b - distance to next = 0
|
|
138
|
-
return self._name_label_match(unit)
|
|
131
|
+
if hasattr(unit, "dist_to_next"):
|
|
132
|
+
# Case 1a - positive distance to next
|
|
133
|
+
if unit.dist_to_next != 0:
|
|
134
|
+
return self._next_in_dat_struct(unit)
|
|
139
135
|
|
|
140
|
-
# Case
|
|
141
|
-
|
|
142
|
-
return self._name_label_match(unit, name_override=unit.ds_label)
|
|
136
|
+
# Case 1b - distance to next = 0
|
|
137
|
+
return self._name_label_match(unit)
|
|
143
138
|
|
|
144
|
-
|
|
145
|
-
|
|
139
|
+
# Case 2: next unit is in ds_label
|
|
140
|
+
if hasattr(unit, "ds_label"):
|
|
141
|
+
return self._name_label_match(unit, name_override=unit.ds_label)
|
|
146
142
|
|
|
147
|
-
|
|
148
|
-
|
|
143
|
+
if unit._unit == "JUNCTION":
|
|
144
|
+
return [self._name_label_match(unit, name_override=lbl) for lbl in unit.labels] # type: ignore[misc, attr-defined]
|
|
149
145
|
|
|
150
|
-
|
|
146
|
+
if unit._unit in ("QHBDY", "NCDBDY", "TIDBDY"):
|
|
147
|
+
return None
|
|
151
148
|
|
|
152
|
-
|
|
153
|
-
self._handle_exception(e, when="calculating next unit")
|
|
149
|
+
return self._name_label_match(unit)
|
|
154
150
|
|
|
151
|
+
@handle_exception(when="calculate previous unit in")
|
|
155
152
|
def prev(self, unit: Unit) -> Unit | list[Unit] | None:
|
|
156
153
|
"""Finds previous unit in the reach.
|
|
157
154
|
|
|
@@ -166,61 +163,56 @@ class DAT(FMFile):
|
|
|
166
163
|
Returns:
|
|
167
164
|
Union[Unit, list[Unit], None]: Flood modeller unit either on its own or in a list if more than one follows in reach.
|
|
168
165
|
"""
|
|
166
|
+
# Case 1: Unit is input boundary condition
|
|
167
|
+
if unit._unit in (
|
|
168
|
+
"QTBDY",
|
|
169
|
+
"HTBDY",
|
|
170
|
+
"REFHBDY",
|
|
171
|
+
"FEHBDY",
|
|
172
|
+
"FRQSIM",
|
|
173
|
+
"FSRBDY",
|
|
174
|
+
"FSSR16BDY",
|
|
175
|
+
"GERRBDY",
|
|
176
|
+
"REBDY",
|
|
177
|
+
"REFH2BDY",
|
|
178
|
+
"SCSBDY",
|
|
179
|
+
):
|
|
180
|
+
return None
|
|
181
|
+
|
|
182
|
+
if unit._unit == "JUNCTION":
|
|
183
|
+
return [self._name_label_match(unit, name_override=lbl) for lbl in unit.labels] # type: ignore[misc, attr-defined]
|
|
184
|
+
|
|
185
|
+
prev_units = []
|
|
186
|
+
_prev_in_dat = self._prev_in_dat_struct(unit)
|
|
187
|
+
_name_match = self._name_label_match(unit)
|
|
188
|
+
_ds_label_match = self._ds_label_match(unit)
|
|
189
|
+
_junction_match = [
|
|
190
|
+
junction
|
|
191
|
+
for junction in self._all_units
|
|
192
|
+
if junction._unit == "JUNCTION" and unit.name in junction.labels
|
|
193
|
+
]
|
|
169
194
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
_prev_in_dat = self._prev_in_dat_struct(unit)
|
|
192
|
-
_name_match = self._name_label_match(unit)
|
|
193
|
-
_ds_label_match = self._ds_label_match(unit)
|
|
194
|
-
_junction_match = [
|
|
195
|
-
junction
|
|
196
|
-
for junction in self._all_units
|
|
197
|
-
if junction._unit == "JUNCTION" and unit.name in junction.labels
|
|
198
|
-
]
|
|
199
|
-
|
|
200
|
-
# Case 2: Previous unit has positive distance to next
|
|
201
|
-
if (
|
|
202
|
-
_prev_in_dat
|
|
203
|
-
and hasattr(_prev_in_dat, "dist_to_next")
|
|
204
|
-
and _prev_in_dat.dist_to_next != 0
|
|
205
|
-
):
|
|
206
|
-
prev_units.append(_prev_in_dat)
|
|
207
|
-
_name_match = None # Name match does apply if upstream section exists
|
|
208
|
-
|
|
209
|
-
# All other matches added (matching name, matching name to ds_label and junciton)
|
|
210
|
-
for match in [_name_match, _ds_label_match, _junction_match]:
|
|
211
|
-
if isinstance(match, list):
|
|
212
|
-
prev_units.extend(match)
|
|
213
|
-
elif match:
|
|
214
|
-
prev_units.append(match)
|
|
215
|
-
|
|
216
|
-
if len(prev_units) == 0:
|
|
217
|
-
return None
|
|
218
|
-
if len(prev_units) == 1:
|
|
219
|
-
return prev_units[0]
|
|
220
|
-
return prev_units
|
|
221
|
-
|
|
222
|
-
except Exception as e:
|
|
223
|
-
self._handle_exception(e, when="calculating next unit")
|
|
195
|
+
# Case 2: Previous unit has positive distance to next
|
|
196
|
+
if (
|
|
197
|
+
_prev_in_dat
|
|
198
|
+
and hasattr(_prev_in_dat, "dist_to_next")
|
|
199
|
+
and _prev_in_dat.dist_to_next != 0
|
|
200
|
+
):
|
|
201
|
+
prev_units.append(_prev_in_dat)
|
|
202
|
+
_name_match = None # Name match does apply if upstream section exists
|
|
203
|
+
|
|
204
|
+
# All other matches added (matching name, matching name to ds_label and junciton)
|
|
205
|
+
for match in [_name_match, _ds_label_match, _junction_match]:
|
|
206
|
+
if isinstance(match, list):
|
|
207
|
+
prev_units.extend(match)
|
|
208
|
+
elif match:
|
|
209
|
+
prev_units.append(match)
|
|
210
|
+
|
|
211
|
+
if len(prev_units) == 0:
|
|
212
|
+
return None
|
|
213
|
+
if len(prev_units) == 1:
|
|
214
|
+
return prev_units[0]
|
|
215
|
+
return prev_units
|
|
224
216
|
|
|
225
217
|
def _next_in_dat_struct(self, current_unit: Unit) -> Unit | None:
|
|
226
218
|
"""Finds next unit in the dat file using the index position.
|
|
@@ -318,22 +310,19 @@ class DAT(FMFile):
|
|
|
318
310
|
self._gxy_filepath = None
|
|
319
311
|
self._gxy_data = None
|
|
320
312
|
|
|
313
|
+
@handle_exception(when="write")
|
|
321
314
|
def _write(self) -> str:
|
|
322
315
|
"""Returns string representation of the current DAT data
|
|
323
316
|
|
|
324
317
|
Returns:
|
|
325
318
|
str: Full string representation of DAT in its most recent state (including changes not yet saved to disk)
|
|
326
319
|
"""
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
self._update_unit_names()
|
|
332
|
-
|
|
333
|
-
return "\n".join(self._raw_data) + "\n"
|
|
320
|
+
self._update_raw_data()
|
|
321
|
+
self._update_general_parameters()
|
|
322
|
+
self._update_dat_struct()
|
|
323
|
+
self._update_unit_names()
|
|
334
324
|
|
|
335
|
-
|
|
336
|
-
self._handle_exception(e, when="write")
|
|
325
|
+
return "\n".join(self._raw_data) + "\n"
|
|
337
326
|
|
|
338
327
|
def _create_from_blank(self, with_gxy: bool = False) -> None:
|
|
339
328
|
# No filepath specified, create new 'blank' DAT in memory
|
|
@@ -698,6 +687,7 @@ class DAT(FMFile):
|
|
|
698
687
|
|
|
699
688
|
return unit_block, in_block
|
|
700
689
|
|
|
690
|
+
@handle_exception(when="remove unit from")
|
|
701
691
|
def remove_unit(self, unit: Unit) -> None:
|
|
702
692
|
"""Remove a unit from the dat file.
|
|
703
693
|
|
|
@@ -707,35 +697,31 @@ class DAT(FMFile):
|
|
|
707
697
|
Raises:
|
|
708
698
|
TypeError: Raised if given unit isn't an instance of FloodModeller Unit.
|
|
709
699
|
"""
|
|
700
|
+
# catch if not valid unit
|
|
701
|
+
if not isinstance(unit, Unit):
|
|
702
|
+
raise TypeError("unit isn't a unit")
|
|
703
|
+
|
|
704
|
+
# remove from all units
|
|
705
|
+
index = self._all_units.index(unit)
|
|
706
|
+
del self._all_units[index]
|
|
707
|
+
# remove from dat_struct
|
|
708
|
+
dat_struct_unit = self._dat_struct[index + 1]
|
|
709
|
+
del self._dat_struct[index + 1]
|
|
710
|
+
# remove from raw data
|
|
711
|
+
del self._raw_data[dat_struct_unit["start"] : dat_struct_unit["end"] + 1]
|
|
712
|
+
# remove from unit group
|
|
713
|
+
unit_group_name = units.SUPPORTED_UNIT_TYPES[unit._unit]["group"]
|
|
714
|
+
unit_group = getattr(self, unit_group_name)
|
|
715
|
+
del unit_group[unit.name]
|
|
716
|
+
# remove from ICs
|
|
717
|
+
self.initial_conditions.data = self.initial_conditions.data.loc[
|
|
718
|
+
self.initial_conditions.data["label"] != unit.name
|
|
719
|
+
]
|
|
710
720
|
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
if not isinstance(unit, Unit):
|
|
714
|
-
raise TypeError("unit isn't a unit")
|
|
715
|
-
|
|
716
|
-
# remove from all units
|
|
717
|
-
index = self._all_units.index(unit)
|
|
718
|
-
del self._all_units[index]
|
|
719
|
-
# remove from dat_struct
|
|
720
|
-
dat_struct_unit = self._dat_struct[index + 1]
|
|
721
|
-
del self._dat_struct[index + 1]
|
|
722
|
-
# remove from raw data
|
|
723
|
-
del self._raw_data[dat_struct_unit["start"] : dat_struct_unit["end"] + 1]
|
|
724
|
-
# remove from unit group
|
|
725
|
-
unit_group_name = units.SUPPORTED_UNIT_TYPES[unit._unit]["group"]
|
|
726
|
-
unit_group = getattr(self, unit_group_name)
|
|
727
|
-
del unit_group[unit.name]
|
|
728
|
-
# remove from ICs
|
|
729
|
-
self.initial_conditions.data = self.initial_conditions.data.loc[
|
|
730
|
-
self.initial_conditions.data["label"] != unit.name
|
|
731
|
-
]
|
|
732
|
-
|
|
733
|
-
self._update_dat_struct()
|
|
734
|
-
self.general_parameters["Node Count"] -= 1
|
|
735
|
-
|
|
736
|
-
except Exception as e:
|
|
737
|
-
self._handle_exception(e, when="remove unit")
|
|
721
|
+
self._update_dat_struct()
|
|
722
|
+
self.general_parameters["Node Count"] -= 1
|
|
738
723
|
|
|
724
|
+
@handle_exception(when="insert unit into")
|
|
739
725
|
def insert_unit( # noqa: C901, PLR0912, PLR0913
|
|
740
726
|
self,
|
|
741
727
|
unit: Unit,
|
|
@@ -758,77 +744,71 @@ class DAT(FMFile):
|
|
|
758
744
|
TypeError: Raised if given unit isn't an instance of FloodModeller Unit.
|
|
759
745
|
NameError: Raised if unit name already appears in unit group.
|
|
760
746
|
"""
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
747
|
+
# catch errors
|
|
748
|
+
provided_params = sum(arg is not None for arg in (add_before, add_after, add_at))
|
|
749
|
+
if provided_params == 0:
|
|
750
|
+
raise SyntaxError(
|
|
751
|
+
"No positional argument given. Please provide either add_before, add_at or add_after",
|
|
752
|
+
)
|
|
753
|
+
if provided_params > 1:
|
|
754
|
+
raise SyntaxError("Only one of add_at, add_before, or add_after required")
|
|
755
|
+
if not isinstance(unit, Unit):
|
|
756
|
+
raise TypeError("unit isn't a unit")
|
|
757
|
+
if add_at is None and not (isinstance(add_before, Unit) or isinstance(add_after, Unit)):
|
|
758
|
+
raise TypeError(
|
|
759
|
+
"add_before or add_after argument must be a Flood Modeller Unit type",
|
|
760
|
+
)
|
|
761
|
+
|
|
762
|
+
unit_class = unit._unit
|
|
763
|
+
if unit_class != "COMMENT":
|
|
764
|
+
_validate_unit(unit)
|
|
765
|
+
unit_group_name = units.SUPPORTED_UNIT_TYPES[unit._unit]["group"]
|
|
766
|
+
unit_group = getattr(self, unit_group_name)
|
|
767
|
+
if unit.name in unit_group:
|
|
768
|
+
raise NameError(
|
|
769
|
+
"Name already appears in unit group. Cannot have two units with same name in same group",
|
|
775
770
|
)
|
|
776
771
|
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
if unit.name in unit_group:
|
|
783
|
-
raise NameError(
|
|
784
|
-
"Name already appears in unit group. Cannot have two units with same name in same group",
|
|
785
|
-
)
|
|
786
|
-
|
|
787
|
-
# positional argument
|
|
788
|
-
if add_at is not None:
|
|
789
|
-
insert_index = add_at
|
|
772
|
+
# positional argument
|
|
773
|
+
if add_at is not None:
|
|
774
|
+
insert_index = add_at
|
|
775
|
+
if insert_index < 0:
|
|
776
|
+
insert_index += len(self._all_units) + 1
|
|
790
777
|
if insert_index < 0:
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
778
|
+
raise Exception(f"invalid add_at index: {add_at}")
|
|
779
|
+
else:
|
|
780
|
+
check_unit = add_before or add_after
|
|
781
|
+
for index, thing in enumerate(self._all_units):
|
|
782
|
+
if thing == check_unit:
|
|
783
|
+
insert_index = index
|
|
784
|
+
insert_index += 1 if add_after else 0
|
|
785
|
+
break
|
|
794
786
|
else:
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
if thing == check_unit:
|
|
798
|
-
insert_index = index
|
|
799
|
-
insert_index += 1 if add_after else 0
|
|
800
|
-
break
|
|
801
|
-
else:
|
|
802
|
-
raise Exception(
|
|
803
|
-
f"{check_unit} not found in dat network, so cannot be used to add before/after",
|
|
804
|
-
)
|
|
805
|
-
|
|
806
|
-
unit_data = unit._write()
|
|
807
|
-
self._all_units.insert(insert_index, unit)
|
|
808
|
-
if unit._unit != "COMMENT":
|
|
809
|
-
unit_group[unit.name] = unit
|
|
810
|
-
self._dat_struct.insert(
|
|
811
|
-
insert_index + 1,
|
|
812
|
-
{"Type": unit_class, "new_insert": unit_data},
|
|
813
|
-
) # add to dat struct without unit.name
|
|
814
|
-
|
|
815
|
-
if unit._unit != "COMMENT":
|
|
816
|
-
# update the iic's tables
|
|
817
|
-
iic_data = [unit.name, "y", 00.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
|
|
818
|
-
self.initial_conditions.data.loc[len(self.initial_conditions.data)] = (
|
|
819
|
-
iic_data # flaged
|
|
787
|
+
raise Exception(
|
|
788
|
+
f"{check_unit} not found in dat network, so cannot be used to add before/after",
|
|
820
789
|
)
|
|
821
790
|
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
791
|
+
unit_data = unit._write()
|
|
792
|
+
self._all_units.insert(insert_index, unit)
|
|
793
|
+
if unit._unit != "COMMENT":
|
|
794
|
+
unit_group[unit.name] = unit
|
|
795
|
+
self._dat_struct.insert(
|
|
796
|
+
insert_index + 1,
|
|
797
|
+
{"Type": unit_class, "new_insert": unit_data},
|
|
798
|
+
) # add to dat struct without unit.name
|
|
799
|
+
|
|
800
|
+
if unit._unit != "COMMENT":
|
|
801
|
+
# update the iic's tables
|
|
802
|
+
iic_data = [unit.name, "y", 00.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
|
|
803
|
+
self.initial_conditions.data.loc[len(self.initial_conditions.data)] = iic_data # flaged
|
|
804
|
+
|
|
805
|
+
# update all
|
|
806
|
+
if unit._unit != "COMMENT":
|
|
807
|
+
self.general_parameters["Node Count"] += 1 # flag no update for comments
|
|
808
|
+
|
|
809
|
+
if not defer_update:
|
|
810
|
+
self._update_raw_data()
|
|
811
|
+
self._update_dat_struct()
|
|
832
812
|
|
|
833
813
|
def insert_units(
|
|
834
814
|
self,
|