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.
Files changed (195) hide show
  1. {floodmodeller_api-0.4.3/floodmodeller_api.egg-info → floodmodeller_api-0.4.4}/PKG-INFO +4 -1
  2. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/_base.py +22 -37
  3. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/dat.py +165 -185
  4. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/ied.py +82 -87
  5. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/ief.py +92 -186
  6. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/inp.py +64 -70
  7. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/logs/__init__.py +1 -1
  8. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/logs/lf.py +61 -17
  9. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/conftest.py +7 -0
  10. floodmodeller_api-0.4.4/floodmodeller_api/test/test_conveyance.py +107 -0
  11. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_dat.py +5 -4
  12. floodmodeller_api-0.4.4/floodmodeller_api/test/test_data/conveyance_test.dat +165 -0
  13. floodmodeller_api-0.4.4/floodmodeller_api/test/test_data/conveyance_test.feb +116 -0
  14. floodmodeller_api-0.4.4/floodmodeller_api/test/test_data/conveyance_test.gxy +85 -0
  15. floodmodeller_api-0.4.4/floodmodeller_api/test/test_data/expected_conveyance.csv +60 -0
  16. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_ief.py +26 -15
  17. floodmodeller_api-0.4.4/floodmodeller_api/test/test_logs_lf.py +102 -0
  18. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/to_from_json.py +24 -12
  19. floodmodeller_api-0.4.4/floodmodeller_api/units/conveyance.py +301 -0
  20. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/sections.py +21 -0
  21. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/util.py +42 -0
  22. floodmodeller_api-0.4.4/floodmodeller_api/version.py +1 -0
  23. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/xml2d.py +80 -136
  24. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/zzn.py +166 -139
  25. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4/floodmodeller_api.egg-info}/PKG-INFO +4 -1
  26. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api.egg-info/SOURCES.txt +6 -0
  27. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api.egg-info/requires.txt +3 -0
  28. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/requirements.txt +7 -2
  29. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/setup.py +3 -0
  30. floodmodeller_api-0.4.3/floodmodeller_api/test/test_logs_lf.py +0 -48
  31. floodmodeller_api-0.4.3/floodmodeller_api/version.py +0 -1
  32. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/LICENSE.txt +0 -0
  33. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/MANIFEST.in +0 -0
  34. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/README.md +0 -0
  35. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/__init__.py +0 -0
  36. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/backup.py +0 -0
  37. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/diff.py +0 -0
  38. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/ief_flags.py +0 -0
  39. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libifcoremd.dll +0 -0
  40. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libifcoremt.so.5 +0 -0
  41. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libifport.so.5 +0 -0
  42. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libimf.so +0 -0
  43. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libintlc.so.5 +0 -0
  44. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libmmd.dll +0 -0
  45. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libsvml.so +0 -0
  46. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/libzzn_read.so +0 -0
  47. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/libs/zzn_read.dll +0 -0
  48. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/logs/lf_helpers.py +0 -0
  49. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/logs/lf_params.py +0 -0
  50. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/mapping.py +0 -0
  51. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/__init__.py +0 -0
  52. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_backup.py +0 -0
  53. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/All Units 4_6.DAT +0 -0
  54. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/All Units 4_6.feb +0 -0
  55. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/BRIDGE.DAT +0 -0
  56. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.dat +0 -0
  57. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.feb +0 -0
  58. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DamBreakADI.xml +0 -0
  59. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DamBreakFAST.xml +0 -0
  60. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DamBreakFAST_dy.xml +0 -0
  61. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DamBreakTVD.xml +0 -0
  62. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DefenceBreach.xml +0 -0
  63. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DefenceBreachFAST.xml +0 -0
  64. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/DefenceBreachFAST_dy.xml +0 -0
  65. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1+2_QH.xml +0 -0
  66. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1_H.xml +0 -0
  67. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1_Q.xml +0 -0
  68. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1_Q_FAST.xml +0 -0
  69. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1_Q_FAST_dy.xml +0 -0
  70. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1_Q_xml_expected.json +0 -0
  71. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Domain1_W.xml +0 -0
  72. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX1.DAT +0 -0
  73. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX1.ext +0 -0
  74. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX1.feb +0 -0
  75. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX1.gxy +0 -0
  76. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX17.DAT +0 -0
  77. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX17.ext +0 -0
  78. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX17.feb +0 -0
  79. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX18.DAT +0 -0
  80. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX18_DAT_expected.json +0 -0
  81. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX2.DAT +0 -0
  82. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX3.DAT +0 -0
  83. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX3_DAT_expected.json +0 -0
  84. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX3_IEF_expected.json +0 -0
  85. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX6.DAT +0 -0
  86. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX6.ext +0 -0
  87. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX6.feb +0 -0
  88. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/EX6_DAT_expected.json +0 -0
  89. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Event Data Example.DAT +0 -0
  90. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Event Data Example.ext +0 -0
  91. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Event Data Example.feb +0 -0
  92. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Linked1D2D.xml +0 -0
  93. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Linked1D2DFAST.xml +0 -0
  94. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Linked1D2DFAST_dy.xml +0 -0
  95. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/Linked1D2D_xml_expected.json +0 -0
  96. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/blockage.dat +0 -0
  97. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/blockage.ext +0 -0
  98. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/blockage.feb +0 -0
  99. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/blockage.gxy +0 -0
  100. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/defaultUnits.dat +0 -0
  101. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/defaultUnits.ext +0 -0
  102. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/defaultUnits.feb +0 -0
  103. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/defaultUnits.fmpx +0 -0
  104. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/defaultUnits.gxy +0 -0
  105. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/ex3.ief +0 -0
  106. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/ex3.lf1 +0 -0
  107. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/ex4.DAT +0 -0
  108. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/ex4_changed.DAT +0 -0
  109. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/example1.inp +0 -0
  110. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/example2.inp +0 -0
  111. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/example3.inp +0 -0
  112. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/example4.inp +0 -0
  113. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/example5.inp +0 -0
  114. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/example6.inp +0 -0
  115. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/jump.dat +0 -0
  116. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.dat +0 -0
  117. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.ext +0 -0
  118. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.exy +0 -0
  119. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.feb +0 -0
  120. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.ied +0 -0
  121. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.ief +0 -0
  122. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.inp +0 -0
  123. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.mmm +0 -0
  124. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.pxy +0 -0
  125. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.uic +0 -0
  126. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.zzd +0 -0
  127. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.zzl +0 -0
  128. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.zzn +0 -0
  129. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.zzu +0 -0
  130. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network.zzx +0 -0
  131. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network_dat_expected.json +0 -0
  132. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network_from_tabularCSV.csv +0 -0
  133. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/network_ied_expected.json +0 -0
  134. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir.dat +0 -0
  135. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir.ext +0 -0
  136. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir.feb +0 -0
  137. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir.gxy +0 -0
  138. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir_default.dat +0 -0
  139. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir_default.ext +0 -0
  140. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir_default.feb +0 -0
  141. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir_default.fmpx +0 -0
  142. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/rnweir_default.gxy +0 -0
  143. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_data/unit checks.dat +0 -0
  144. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_ied.py +0 -0
  145. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_inp.py +0 -0
  146. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_json.py +0 -0
  147. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_tool.py +0 -0
  148. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_toolbox_structure_log.py +0 -0
  149. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_xml2d.py +0 -0
  150. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/test/test_zzn.py +0 -0
  151. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/tool.py +0 -0
  152. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/__init__.py +0 -0
  153. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/example_tool.py +0 -0
  154. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/gui/bg.PNG +0 -0
  155. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/gui/logo.PNG +0 -0
  156. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_build/__init__.py +0 -0
  157. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_build/add_siltation_definition.py +0 -0
  158. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_build/structure_log/__init__.py +0 -0
  159. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_build/structure_log/structure_log.py +0 -0
  160. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_build/structure_log_definition.py +0 -0
  161. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_conversion/__init__.py +0 -0
  162. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/model_review/__init__.py +0 -0
  163. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/toolbox/results_analysis/__init__.py +0 -0
  164. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/__init__.py +0 -0
  165. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/_base.py +0 -0
  166. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/boundaries.py +0 -0
  167. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/comment.py +0 -0
  168. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/conduits.py +0 -0
  169. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/helpers.py +0 -0
  170. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/iic.py +0 -0
  171. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/losses.py +0 -0
  172. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/structures.py +0 -0
  173. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/units.py +0 -0
  174. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/unsupported.py +0 -0
  175. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/units/variables.py +0 -0
  176. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/__init__.py +0 -0
  177. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/_base.py +0 -0
  178. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/conduits.py +0 -0
  179. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/general_parameters.py +0 -0
  180. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/junctions.py +0 -0
  181. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/losses.py +0 -0
  182. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/outfalls.py +0 -0
  183. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/raingauges.py +0 -0
  184. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/subsections.py +0 -0
  185. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/urban1d/xsections.py +0 -0
  186. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/validation/__init__.py +0 -0
  187. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/validation/parameters.py +0 -0
  188. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/validation/urban_parameters.py +0 -0
  189. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/validation/validation.py +0 -0
  190. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api/xml2d_template.py +0 -0
  191. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api.egg-info/dependency_links.txt +0 -0
  192. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api.egg-info/entry_points.txt +0 -0
  193. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/floodmodeller_api.egg-info/top_level.txt +0 -0
  194. {floodmodeller_api-0.4.3 → floodmodeller_api-0.4.4}/pyproject.toml +0 -0
  195. {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
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
  ![FM Logo](https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/_static/flood-modeller-logo-hero-image.png)
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 .version import __version__
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).resolve() # save filepath to class
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
- return f"<floodmodeller_api Class: {self._filetype}(filepath={self._filepath})>"
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
- try:
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")
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"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")
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
- tb = err.__traceback__
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
- try:
53
- if from_json:
54
- return
55
- if dat_filepath is not None:
56
- FMFile.__init__(self, dat_filepath)
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
- else:
60
- self._create_from_blank(with_gxy)
60
+ else:
61
+ self._create_from_blank(with_gxy)
61
62
 
62
- self._get_general_parameters()
63
- self._get_unit_definitions()
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
- try:
132
- if hasattr(unit, "dist_to_next"):
133
- # Case 1a - positive distance to next
134
- if unit.dist_to_next != 0:
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 2: next unit is in ds_label
141
- if hasattr(unit, "ds_label"):
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
- if unit._unit == "JUNCTION":
145
- return [self._name_label_match(unit, name_override=lbl) for lbl in unit.labels] # type: ignore[misc, attr-defined]
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
- if unit._unit in ("QHBDY", "NCDBDY", "TIDBDY"):
148
- return None
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
- return self._name_label_match(unit)
146
+ if unit._unit in ("QHBDY", "NCDBDY", "TIDBDY"):
147
+ return None
151
148
 
152
- except Exception as e:
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
- try:
171
- # Case 1: Unit is input boundary condition
172
- if unit._unit in (
173
- "QTBDY",
174
- "HTBDY",
175
- "REFHBDY",
176
- "FEHBDY",
177
- "FRQSIM",
178
- "FSRBDY",
179
- "FSSR16BDY",
180
- "GERRBDY",
181
- "REBDY",
182
- "REFH2BDY",
183
- "SCSBDY",
184
- ):
185
- return None
186
-
187
- if unit._unit == "JUNCTION":
188
- return [self._name_label_match(unit, name_override=lbl) for lbl in unit.labels] # type: ignore[misc, attr-defined]
189
-
190
- prev_units = []
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
- try:
328
- self._update_raw_data()
329
- self._update_general_parameters()
330
- self._update_dat_struct()
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
- except Exception as e:
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
- try:
712
- # catch if not valid unit
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
- try:
762
- # catch errors
763
- provided_params = sum(arg is not None for arg in (add_before, add_after, add_at))
764
- if provided_params == 0:
765
- raise SyntaxError(
766
- "No positional argument given. Please provide either add_before, add_at or add_after",
767
- )
768
- if provided_params > 1:
769
- raise SyntaxError("Only one of add_at, add_before, or add_after required")
770
- if not isinstance(unit, Unit):
771
- raise TypeError("unit isn't a unit")
772
- if add_at is None and not (isinstance(add_before, Unit) or isinstance(add_after, Unit)):
773
- raise TypeError(
774
- "add_before or add_after argument must be a Flood Modeller Unit type",
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
- unit_class = unit._unit
778
- if unit_class != "COMMENT":
779
- _validate_unit(unit)
780
- unit_group_name = units.SUPPORTED_UNIT_TYPES[unit._unit]["group"]
781
- unit_group = getattr(self, unit_group_name)
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
- insert_index += len(self._all_units) + 1
792
- if insert_index < 0:
793
- raise Exception(f"invalid add_at index: {add_at}")
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
- check_unit = add_before or add_after
796
- for index, thing in enumerate(self._all_units):
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
- # update all
823
- if unit._unit != "COMMENT":
824
- self.general_parameters["Node Count"] += 1 # flag no update for comments
825
-
826
- if not defer_update:
827
- self._update_raw_data()
828
- self._update_dat_struct()
829
-
830
- except Exception as e:
831
- self._handle_exception(e, when="insert unit")
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,