setup.py
Theophile Terraz 2024-05-13 16:02:36 +02:00
commit 9d0168a9ee
28 changed files with 456 additions and 139 deletions

View File

@ -456,6 +456,15 @@ of Bar (Listing [[sql-bar]] and [[sql-foo]]).
bar._sql_save(execute, data=data)
#+end_src
Let see the results database scheme for Pamhyr2 at version v0.0.7 in
Figure [[sql_schema]].
#+NAME: sql_schema
#+ATTR_LATEX: :width 16cm
#+CAPTION: SQLite database scheme at Pamhyr2 version v0.0.7 (generate with [[https://gitlab.com/Screwtapello/sqlite-schema-diagram]])
[[./images/schema_v0.0.7.png]]
[fn:sqlite] The SQLite web site: https://www.sqlite.org/index.html
(last access 2023-09-20)

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

View File

@ -306,8 +306,6 @@ class MeshingWithMageMailleurTT(AMeshingTool):
st_file = self.export_reach_to_st(reach, tmp)
m_file = st_file.rsplit(".ST", 1)[0] + ".M"
os.sync()
proc = QProcess()
proc.setWorkingDirectory(tmp)

View File

@ -47,7 +47,7 @@ class PointXYZ(Point, SQLSubModel):
z INTEGER NOT NULL,
profile INTEGER NOT NULL,
sl INTEGER,
FOREIGN KEY(profile) REFERENCES profileXYZ(id),
FOREIGN KEY(profile) REFERENCES geometry_profileXYZ(id),
FOREIGN KEY(sl) REFERENCES sedimentary_layer(id)
)
""")
@ -220,3 +220,11 @@ class PointXYZ(Point, SQLSubModel):
Euclidean 3D distance between the two points
"""
return dist((p1.x, p1.y, p1.z), (p2.x, p2.y, p2.z))
@staticmethod
def areatriangle3d(p1, p2, p3):
a = PointXYZ.distance(p1, p2)
b = PointXYZ.distance(p2, p3)
c = PointXYZ.distance(p3, p1)
s = (a + b + c) / 2
return (s*(s-a) * (s-b)*(s-c)) ** 0.5

View File

@ -296,6 +296,11 @@ class Profile(object):
)
self._status.modified()
@timer
def reverse(self):
self._points.reverse()
self._status.modified()
# Sediment Layers
def get_sl(self):

View File

@ -578,3 +578,32 @@ class ProfileXYZ(Profile, SQLSubModel):
break
return last_point
def purge(self, np_purge):
"""
Remove points to keep at most np_purge points.
"""
if (self.nb_points <= np_purge): return
nb_named = 2 # we consider the first and last point as named
area = [0.0]
for i in range(1, self.nb_points-1):
if self.point(i).point_is_named():
area.append(9999999.999)
nb_named += 1
else:
area.append(PointXYZ.areatriangle3d(self.point(i-1),self.point(i),self.point(i+1)))
area.append(0.0)
while (self.nb_points > max(np_purge, nb_named)):
to_rm = np.argmin(area[1:self.nb_points-1])+1
self.delete_i([to_rm])
area.pop(to_rm)
for i in [to_rm-1, to_rm]:
if (i == 0): continue
if (i == self.nb_points - 1): continue
if self.point(i).point_is_named():
area[i] = 9999999.999
else:
area[i] = PointXYZ.areatriangle3d(self.point(i-1),self.point(i),self.point(i+1))

View File

@ -167,8 +167,10 @@ class CommandLineSolver(AbstractSolver):
repertory, "pamhyr-study-description.txt"
)
with open(path, "w+") as f:
txt = study.description
with open(path, "w+", encoding='utf-8') as f:
txt = study.description\
.encode()\
.decode('utf-8', 'replace')
f.write(txt)
#######

View File

@ -282,6 +282,9 @@ class Mage(CommandLineSolver):
if bound.node is None:
continue
if not study.river.is_enable_node(bound.node):
continue
if bound.bctype == "ZD":
AVA.append(bound)
elif bound.bctype == "TD" or bound.bctype == "PC":
@ -357,13 +360,7 @@ class Mage(CommandLineSolver):
with mage_file_open(os.path.join(repertory, f"{name}.RUG"), "w+") as f:
files.append(f"{name}.RUG")
edges = study.river.edges()
edges = list(
filter(
lambda e: e.is_enable(),
edges
)
)
edges = study.river.enable_edges()
id = 1
for edge in edges:
@ -495,6 +492,9 @@ class Mage(CommandLineSolver):
if not hs.input_reach.is_enable():
continue
if not hs.enabled:
continue
if hs.input_kp is None:
continue
@ -510,25 +510,26 @@ class Mage(CommandLineSolver):
def _export_SIN_bhs(self, study, sin_dict, hs, f):
for bhs in hs.basic_structures:
reach_id = study.river.get_edge_id(hs.input_reach) + 1
param_str = ' '.join(
[
f'{p:>10.3f}'
for p in self._export_SIN_parameters(bhs)
]
)
if bhs.enabled:
reach_id = study.river.get_edge_id(hs.input_reach) + 1
param_str = ' '.join(
[
f'{p:>10.3f}'
for p in self._export_SIN_parameters(bhs)
]
)
name = bhs.name
if name == "":
name = f"HS_{bhs.id:>3}".replace(" ", "0")
else:
name = name.replace(" ", "_")
name = bhs.name
if name == "":
name = f"HS_{bhs.id:>3}".replace(" ", "0")
else:
name = name.replace(" ", "_")
f.write(
f"{sin_dict[bhs._type]} " +
f"{reach_id} {float(hs.input_kp):>12.3f} " +
f"{param_str} {name}\n"
)
f.write(
f"{sin_dict[bhs._type]} " +
f"{reach_id} {float(hs.input_kp):>12.3f} " +
f"{param_str} {name}\n"
)
def _export_SIN_parameters(self, bhs):
res = [9999.999] * 5
@ -802,7 +803,7 @@ class Mage8(Mage):
value = "O" if value.lower() == "y" else "N"
if name == "init_internal":
value = ("p" if value.lower() in ["y", "yes", "true"]
value = ("p" if value.lower() in ["y", "yes", "true", "o"]
else "")
logger.debug(

View File

@ -129,7 +129,7 @@ class PlotAC(PamhyrPlot):
if txt.strip() in self.complete_gl:
color = self.color_complete_gl[
lcomplete.index(txt)
lcomplete.index(txt) % len(self.color_complete_gl)
]
else:
color = self.color_incomplete_gl[

View File

@ -167,7 +167,9 @@ class PlotKPZ(PamhyrPlot):
self.line_kp_zgl.append(
self.canvas.axes.plot(
kp, z, lw=1., color=self.colors[ind]
kp, z, lw=1.,
color=self.colors[ind % len(self.colors)],
linestyle=self.linestyle[ind // len(self.colors)]
)
)
ind += 1

View File

@ -130,7 +130,8 @@ class PlotXY(PamhyrPlot):
self.line_gl = []
for x, y in zip(x_complete, y_complete):
line = self.canvas.axes.plot(
x, y, color=self.colors[ind]
x, y, color=self.colors[ind % len(self.colors)],
linestyle=self.linestyle[ind // len(self.colors)]
)
self.line_gl.append(line)
ind += 1

View File

@ -250,6 +250,26 @@ class GeometryProfileTableModel(PamhyrTableModel):
self.endMoveRows()
self.layoutChanged.emit()
def purge(self):
self._undo.push(
PurgeCommand(
self._data, 24
)
)
self.layoutChanged.emit()
def reverse(self):
self._undo.push(
ReverseCommand(
self._data
)
)
self.layoutChanged.emit()
def paste(self, row, header, data):
if row > self._data.number_points:
return

View File

@ -169,6 +169,34 @@ class MoveCommand(QUndoCommand):
self._profile.move_down_point(self._i)
class ReverseCommand(QUndoCommand):
def __init__(self, profile):
QUndoCommand.__init__(self)
self._profile = profile
def undo(self):
self._profile.reverse()
def redo(self):
self._profile.reverse()
class PurgeCommand(QUndoCommand):
def __init__(self, profile, np_purge):
QUndoCommand.__init__(self)
self._profile = profile
self._old = self._profile.points.copy()
self._np_purge = np_purge
def undo(self):
self._profile._points = self._old.copy()
def redo(self):
self._profile.purge(self._np_purge)
class PasteCommand(QUndoCommand):
def __init__(self, profile, row, points):
QUndoCommand.__init__(self)

View File

@ -125,6 +125,8 @@ class ProfileWindow(PamhyrWindow):
"action_down": self.move_down,
"action_add": self.add,
"action_delete": self.delete,
"action_purge": self.purge,
"action_reverse": self.reverse,
}
for action in actions:
@ -146,6 +148,12 @@ class ProfileWindow(PamhyrWindow):
self.update_plot()
self._propagate_update(key=Modules.GEOMETRY)
def _update(self, redraw=False, propagate=True):
if redraw:
self.update_plot()
if propagate:
self._propagate_update(key=Modules.GEOMETRY)
def update_plot(self):
self._tablemodel.blockSignals(True)
@ -153,6 +161,14 @@ class ProfileWindow(PamhyrWindow):
self._tablemodel.blockSignals(False)
def _propagated_update(self, key=Modules(0)):
if Modules.GEOMETRY not in key:
return
print("=====TOTO=====")
self._tablemodel.layoutChanged.emit()
self._update(redraw=True, propagate=False)
def index_selected_row(self):
table = self.find(QTableView, "tableView")
rows = table.selectionModel()\
@ -238,6 +254,14 @@ class ProfileWindow(PamhyrWindow):
self.update()
def purge(self):
self._tablemodel.purge()
self.update()
def reverse(self):
self._tablemodel.reverse()
self.update()
def _copy(self):
table = self.find(QTableView, "tableView")
rows = table.selectionModel().selectedRows()

View File

@ -246,3 +246,12 @@ class GeometryReachTableModel(PamhyrTableModel):
self.layoutAboutToBeChanged.emit()
self.layoutChanged.emit()
def purge(self):
self._undo.push(
PurgeCommand(
self._data, 24
)
)
self.layoutChanged.emit()

View File

@ -254,3 +254,23 @@ class MeshingCommand(QUndoCommand):
for profile in self._new_profiles:
self._reach.insert_profile(0, profile)
class PurgeCommand(QUndoCommand):
def __init__(self, reach, np_purge):
QUndoCommand.__init__(self)
self._reach = reach
self._np_purge = np_purge
self._old = []
for profile in self._reach.profiles:
self._old.append(profile.points.copy())
def undo(self):
for i in range(self._reach.number_profiles):
self._reach.profiles[i]._points = self._old[i].copy()
def redo(self):
for profile in self._reach._profiles:
profile.purge(self._np_purge)

View File

@ -188,6 +188,8 @@ class GeometryWindow(PamhyrWindow):
"action_delete": self.delete,
"action_edit": self.edit_profile,
"action_meshing": self.edit_meshing,
"action_update_kp": self.update_kp,
"action_purge": self.purge,
}
for action in actions:
@ -227,7 +229,7 @@ class GeometryWindow(PamhyrWindow):
self._propagate_update(key=Modules.GEOMETRY)
def _propagated_update(self, key=Modules(0)):
if Modules.NETWORK not in key:
if Modules.NETWORK not in key and Modules.GEOMETRY not in key:
return
self._update(propagate=False)
@ -507,6 +509,13 @@ class GeometryWindow(PamhyrWindow):
self._table.move_down(row)
self.select_current_profile()
def update_kp(self):
pass
def purge(self):
self._table.purge()
self.update_redraw()
def duplicate(self):
rows = [
row.row() for row in

View File

@ -252,13 +252,14 @@ class BasicHydraulicStructuresWindow(PamhyrWindow):
self._checkbox.setChecked(self._hs.basic_structure(row).enabled)
def _set_basic_structure_state(self):
row = self.index_selected_row()
if row is not None:
self._table.enabled(
row,
self._checkbox.isChecked()
)
rows = self.index_selected_rows()
if len(rows) != 0:
for row in rows:
if row is not None:
self._table.enabled(
row,
self._checkbox.isChecked()
)
def update(self):
self._set_checkbox_state()

View File

@ -262,12 +262,14 @@ class HydraulicStructuresWindow(PamhyrWindow):
self._checkbox.setChecked(self._hs_lst.get(row).enabled)
def _set_structure_state(self):
row = self.index_selected_row()
if row is not None:
self._table.enabled(
row,
self._checkbox.isChecked()
)
rows = self.index_selected_rows()
if len(rows) != 0:
for row in rows:
if row is not None:
self._table.enabled(
row,
self._checkbox.isChecked()
)
def update(self):
self._set_checkbox_state()

View File

@ -445,9 +445,15 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
logger.debug(f"Propagation of {keys}")
for _, window in self.sub_win_list:
window._propagated_update(key=keys)
self._do_propagate_update_rec(window, keys)
self._tab_widget_checker.update(modules=keys)
def _do_propagate_update_rec(self, window, keys):
for _, win in window.sub_win_list:
win._propagated_update(key=keys)
self._do_propagate_update_rec(win, keys)
def update(self):
self.set_title()

View File

@ -77,9 +77,9 @@ class CustomPlot(PamhyrPlot):
kp = reach.geometry.get_kp()
z_min = reach.geometry.get_z_min()
self.canvas.axes.set_xlim(
left=min(kp), right=max(kp)
)
# self.canvas.axes.set_xlim(
# left=min(kp), right=max(kp)
# )
meter_axes = self.canvas.axes
m3S_axes = self.canvas.axes
@ -88,10 +88,10 @@ class CustomPlot(PamhyrPlot):
lines = {}
if "elevation" in self._y:
meter_axes.set_ylim(
bottom=min(0, min(z_min)),
top=max(z_min) + 1
)
# meter_axes.set_ylim(
# bottom=min(0, min(z_min)),
# top=max(z_min) + 1
# )
line = meter_axes.plot(
kp, z_min,
@ -108,10 +108,10 @@ class CustomPlot(PamhyrPlot):
)
)
meter_axes.set_ylim(
bottom=min(0, min(z_min)),
top=max(water_z) + 1
)
# meter_axes.set_ylim(
# bottom=min(0, min(z_min)),
# top=max(water_z) + 1
# )
line = meter_axes.plot(
kp, water_z, lw=1.,
@ -133,10 +133,10 @@ class CustomPlot(PamhyrPlot):
)
)
m3s_axes.set_ylim(
bottom=min(0, min(q)),
top=max(q) + 1
)
# m3s_axes.set_ylim(
# bottom=min(0, min(q)),
# top=max(q) + 1
# )
line = m3s_axes.plot(
kp, q, lw=1.,
@ -206,9 +206,9 @@ class CustomPlot(PamhyrPlot):
ts = list(results.get("timestamps"))
ts.sort()
self.canvas.axes.set_xlim(
left=min(ts), right=max(ts)
)
# self.canvas.axes.set_xlim(
# left=min(ts), right=max(ts)
# )
x = ts
lines = {}
@ -232,10 +232,10 @@ class CustomPlot(PamhyrPlot):
# Water elevation
z = profile.get_key("Z")
meter_axes.set_ylim(
bottom=min(0, min(z)),
top=max(z) + 1
)
# meter_axes.set_ylim(
# bottom=min(0, min(z)),
# top=max(z) + 1
# )
line = meter_axes.plot(
ts, z, lw=1.,
@ -260,10 +260,10 @@ class CustomPlot(PamhyrPlot):
if "discharge" in self._y:
q = profile.get_key("Q")
m3s_axes.set_ylim(
bottom=min(0, min(q)),
top=max(q) + 1
)
# m3s_axes.set_ylim(
# bottom=min(0, min(q)),
# top=max(q) + 1
# )
line = m3s_axes.plot(
ts, q, lw=1.,

View File

@ -119,11 +119,14 @@ class PlotKPC(PamhyrPlot):
self.line_kp_sl.append(None)
self.line_kp_sl[i], = self.canvas.axes.plot(
kp, z,
linestyle="solid" if i == len(final_z_sl) - 1 else "--",
linestyle=(
"solid" if i == len(final_z_sl) - 1
else self.linestyle[1:][i // len(self.colors)]
),
lw=1.,
color=(
self.color_plot_river_bottom if i == len(final_z_sl) - 1
else self.colors[i]
else self.colors[i % len(self.colors)]
)
)

View File

@ -160,7 +160,10 @@ class ResultsWindow(PamhyrWindow):
self.canvas = MplCanvas(width=5, height=4, dpi=100)
self.canvas.setObjectName("canvas")
self.toolbar = PamhyrPlotToolbar(
self.canvas, self
self.canvas, self, items=[
"home", "move", "zoom", "save",
"iso", "back/forward"
]
)
self.plot_layout = self.find(QVBoxLayout, "verticalLayout")
self.plot_layout.addWidget(self.toolbar)
@ -180,7 +183,10 @@ class ResultsWindow(PamhyrWindow):
self.canvas_2 = MplCanvas(width=5, height=4, dpi=100)
self.canvas_2.setObjectName("canvas_2")
self.toolbar_2 = PamhyrPlotToolbar(
self.canvas_2, self
self.canvas_2, self, items=[
"home", "move", "zoom", "save",
"iso", "back/forward"
]
)
self.plot_layout_2 = self.find(QVBoxLayout, "verticalLayout_2")
self.plot_layout_2.addWidget(self.toolbar_2)
@ -199,7 +205,10 @@ class ResultsWindow(PamhyrWindow):
self.canvas_3 = MplCanvas(width=5, height=4, dpi=100)
self.canvas_3.setObjectName("canvas_3")
self.toolbar_3 = PamhyrPlotToolbar(
self.canvas_3, self
self.canvas_3, self, items=[
"home", "move", "zoom", "save",
"iso", "back/forward"
]
)
self.plot_layout_3 = self.find(QVBoxLayout, "verticalLayout_3")
self.plot_layout_3.addWidget(self.toolbar_3)
@ -218,7 +227,10 @@ class ResultsWindow(PamhyrWindow):
self.canvas_4 = MplCanvas(width=5, height=4, dpi=100)
self.canvas_4.setObjectName("canvas_4")
self.toolbar_4 = PamhyrPlotToolbar(
self.canvas_4, self
self.canvas_4, self, items=[
"home", "move", "zoom", "save",
"iso", "back/forward"
]
)
self.plot_layout_4 = self.find(
QVBoxLayout, "verticalLayout_hydrograph")

View File

@ -40,6 +40,7 @@ class PamhyrPlot(APlot):
color_plot_river_water_zone = "skyblue"
colors = list(mplcolors.TABLEAU_COLORS)
linestyle = ['solid', 'dashed', 'dashdot', 'dotted']
plot_default_kargs = {
"lw": 1.,

View File

@ -58,6 +58,8 @@
<addaction name="action_sort_des"/>
<addaction name="action_up"/>
<addaction name="action_down"/>
<addaction name="action_purge"/>
<addaction name="action_reverse"/>
</widget>
<action name="action_add">
<property name="icon">
@ -131,6 +133,22 @@
<string>Sort reversed points by nearest neighbor</string>
</property>
</action>
<action name="action_purge">
<property name="text">
<string>Purge</string>
</property>
<property name="toolTip">
<string>Purge the cross-section to keep a given number of points</string>
</property>
</action>
<action name="action_reverse">
<property name="text">
<string>Reverse</string>
</property>
<property name="toolTip">
<string>Reverse the points order</string>
</property>
</action>
</widget>
<resources/>
<connections/>

View File

@ -127,6 +127,8 @@
<addaction name="action_down"/>
<addaction name="action_export"/>
<addaction name="action_meshing"/>
<addaction name="action_update_kp"/>
<addaction name="action_purge"/>
</widget>
<action name="action_import">
<property name="text">
@ -233,6 +235,22 @@
<string>Meshing</string>
</property>
</action>
<action name="action_update_kp">
<property name="text">
<string>Update KP</string>
</property>
<property name="toolTip">
<string>Recompute KP</string>
</property>
</action>
<action name="action_purge">
<property name="text">
<string>Purge</string>
</property>
<property name="toolTip">
<string>Purge cross-sections to keep a given number of points</string>
</property>
</action>
</widget>
<resources/>
<connections/>

View File

@ -31,7 +31,7 @@
<message>
<location filename="../View/HydraulicStructures/BasicHydraulicStructures/Translate.py" line="30"/>
<source>Basic Hydraulic Structures</source>
<translation>Structure hydraulique élémentaire</translation>
<translation>Ouvrage hydraulique élémentaire</translation>
</message>
<message>
<location filename="../View/HydraulicStructures/BasicHydraulicStructures/Translate.py" line="34"/>
@ -51,7 +51,7 @@
<message>
<location filename="../View/HydraulicStructures/BasicHydraulicStructures/Translate.py" line="54"/>
<source>Upper elevation (m)</source>
<translation>Côte de mise en charge (m)</translation>
<translation>Cote de mise en charge (m)</translation>
</message>
<message>
<location filename="../View/HydraulicStructures/BasicHydraulicStructures/Translate.py" line="57"/>
@ -61,7 +61,7 @@
<message>
<location filename="../View/HydraulicStructures/BasicHydraulicStructures/Translate.py" line="60"/>
<source>Maximal loading elevation</source>
<translation>Côte de mise en charge maximale</translation>
<translation>Cote de mise en charge maximale</translation>
</message>
<message>
<location filename="../View/HydraulicStructures/BasicHydraulicStructures/Translate.py" line="63"/>
@ -420,7 +420,7 @@
<message>
<location filename="../View/Results/CustomPlot/Translate.py" line="46"/>
<source>Bed load elevation (m)</source>
<translation>Côte du fond (m)</translation>
<translation>Cote du fond (m)</translation>
</message>
</context>
<context>
@ -434,7 +434,7 @@
<context>
<name>Dialog</name>
<message>
<location filename="../View/ui/MeshingOptions.ui" line="14"/>
<location filename="../View/ui/SelectSolver.ui" line="14"/>
<source>Dialog</source>
<translation>Dialog</translation>
</message>
@ -449,7 +449,7 @@
<translation>Type</translation>
</message>
<message>
<location filename="../View/ui/NewStudy.ui" line="92"/>
<location filename="../View/ui/ConfigureAddSolverDialog.ui" line="48"/>
<source>Description</source>
<translation>Description</translation>
</message>
@ -829,7 +829,7 @@
<context>
<name>Form</name>
<message>
<location filename="../View/ui/Widgets/MainWindowTabCheckers.ui" line="14"/>
<location filename="../View/ui/dummy.ui" line="14"/>
<source>Form</source>
<translation>Formulaire</translation>
</message>
@ -1055,17 +1055,17 @@
<context>
<name>Geometry</name>
<message>
<location filename="../View/Geometry/Translate.py" line="56"/>
<location filename="../View/LateralContribution/translate.py" line="52"/>
<source>X (m)</source>
<translation>X (m)</translation>
</message>
<message>
<location filename="../View/Geometry/Translate.py" line="57"/>
<location filename="../View/LateralContribution/translate.py" line="53"/>
<source>Y (m)</source>
<translation>Y (m)</translation>
</message>
<message>
<location filename="../View/Geometry/Translate.py" line="58"/>
<location filename="../View/LateralContribution/translate.py" line="54"/>
<source>Z (m)</source>
<translation>Z (m)</translation>
</message>
@ -1175,7 +1175,7 @@
<message>
<location filename="../View/HydraulicStructures/Translate.py" line="30"/>
<source>Hydraulic Structures</source>
<translation>Structures hydraulique</translation>
<translation>Structures hydrauliques</translation>
</message>
<message>
<location filename="../View/HydraulicStructures/Translate.py" line="34"/>
@ -1262,17 +1262,17 @@
<translation>Activer cette fenêtre</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="14"/>
<location filename="../View/ui/Stricklers.ui" line="14"/>
<source>MainWindow</source>
<translation>Fenêtre principale</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="112"/>
<location filename="../View/ui/Stricklers.ui" line="52"/>
<source>toolBar</source>
<translation>Barre d&apos;outils</translation>
</message>
<message>
<location filename="../View/ui/EditLateralContribution.ui" line="79"/>
<location filename="../View/ui/Stricklers.ui" line="70"/>
<source>Add</source>
<translation>Ajouter</translation>
</message>
@ -1282,7 +1282,7 @@
<translation>Ajouter un casier</translation>
</message>
<message>
<location filename="../View/ui/EditLateralContribution.ui" line="94"/>
<location filename="../View/ui/Stricklers.ui" line="82"/>
<source>Delete</source>
<translation>Supprimer</translation>
</message>
@ -1292,7 +1292,7 @@
<translation>Supprimer casier(s)</translation>
</message>
<message>
<location filename="../View/ui/AdditionalFileList.ui" line="67"/>
<location filename="../View/ui/ReservoirList.ui" line="105"/>
<source>Edit</source>
<translation>Éditer</translation>
</message>
@ -1327,7 +1327,7 @@
<translation>Éditer la couche sedimentaire</translation>
</message>
<message>
<location filename="../View/ui/REPLineList.ui" line="79"/>
<location filename="../View/ui/Results.ui" line="270"/>
<source>Ctrl+E</source>
<translation>Ctrl+E</translation>
</message>
@ -1397,7 +1397,7 @@
<translation>Nouvelle étude</translation>
</message>
<message>
<location filename="../View/ui/EditLateralContribution.ui" line="85"/>
<location filename="../View/ui/BoundaryConditions.ui" line="120"/>
<source>Ctrl+N</source>
<translation>Ctrl+N</translation>
</message>
@ -1482,12 +1482,12 @@
<translation>Éditer la géométrie</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="136"/>
<location filename="../View/ui/GeometryReach.ui" line="138"/>
<source>Import geometry</source>
<translation>Importer une géométrie</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="144"/>
<location filename="../View/ui/GeometryReach.ui" line="146"/>
<source>Export geometry</source>
<translation>Exporter la géométrie</translation>
</message>
@ -1682,7 +1682,7 @@
<translation>Éditer les casiers</translation>
</message>
<message>
<location filename="../View/ui/HydraulicStructures.ui" line="14"/>
<location filename="../View/ui/MainWindow.ui" line="625"/>
<source>Hydraulic structures</source>
<translation>Structures hydraulique</translation>
</message>
@ -1727,7 +1727,7 @@
<translation>Supprimer la(les) couche(s) sédimentaire(s) sélectionnée(s)</translation>
</message>
<message>
<location filename="../View/ui/EditLateralContribution.ui" line="100"/>
<location filename="../View/ui/BoundaryConditions.ui" line="135"/>
<source>Ctrl+D</source>
<translation>Ctrl+D</translation>
</message>
@ -1762,7 +1762,7 @@
<translation>Ajouter une condition aux limites ou un apport ponctuel</translation>
</message>
<message>
<location filename="../View/ui/EditLateralContribution.ui" line="97"/>
<location filename="../View/ui/BoundaryConditions.ui" line="132"/>
<source>Delete current selected rows</source>
<translation>Supprimer les lignes selectionnées</translation>
</message>
@ -1772,7 +1772,7 @@
<translation>Éditer une condition aux limites ou un apport ponctuel</translation>
</message>
<message>
<location filename="../View/ui/EditLateralContribution.ui" line="109"/>
<location filename="../View/ui/Stricklers.ui" line="94"/>
<source>Sort</source>
<translation>Trier</translation>
</message>
@ -1824,7 +1824,7 @@
<message>
<location filename="../View/ui/Results.ui" line="169"/>
<source>Water elevation</source>
<translation>Côte de l&apos;eau</translation>
<translation>Cote de l&apos;eau</translation>
</message>
<message>
<location filename="../View/ui/Results.ui" line="201"/>
@ -1842,7 +1842,7 @@
<translation>Recharger</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="141"/>
<location filename="../View/ui/Results.ui" line="264"/>
<source>Export</source>
<translation>Exporter</translation>
</message>
@ -1852,7 +1852,7 @@
<translation>Exporter les données brutes</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="165"/>
<location filename="../View/ui/GeometryCrossSection.ui" line="82"/>
<source>delete</source>
<translation>supprimer</translation>
</message>
@ -1917,87 +1917,87 @@
<translation>Supprimer points</translation>
</message>
<message>
<location filename="../View/ui/HydraulicStructures.ui" line="133"/>
<location filename="../View/ui/BasicHydraulicStructures.ui" line="136"/>
<source>Edit selected hydraulic structure</source>
<translation>Éditer l&apos;ouvrage hydraulique sélectionné</translation>
</message>
<message>
<location filename="../View/ui/SolverLog.ui" line="77"/>
<location filename="../View/ui/SolverLog.ui" line="78"/>
<source>Stop</source>
<translation>Stoper</translation>
</message>
<message>
<location filename="../View/ui/SolverLog.ui" line="86"/>
<location filename="../View/ui/SolverLog.ui" line="87"/>
<source>Start</source>
<translation>Démarrer</translation>
</message>
<message>
<location filename="../View/ui/SolverLog.ui" line="95"/>
<location filename="../View/ui/SolverLog.ui" line="96"/>
<source>Pause</source>
<translation>Pause</translation>
</message>
<message>
<location filename="../View/ui/SolverLog.ui" line="104"/>
<location filename="../View/ui/SolverLog.ui" line="105"/>
<source>LogFile</source>
<translation>Fichier de log</translation>
</message>
<message>
<location filename="../View/ui/SolverLog.ui" line="109"/>
<location filename="../View/ui/SolverLog.ui" line="110"/>
<source>results</source>
<translation>resultats</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="153"/>
<location filename="../View/ui/GeometryCrossSection.ui" line="70"/>
<source>add</source>
<translation>Ajouter</translation>
</message>
<message>
<location filename="../View/ui/GeometryCrossSection.ui" line="71"/>
<location filename="../View/ui/GeometryCrossSection.ui" line="73"/>
<source>Add a point on cross-section</source>
<translation>Ajouter un point à la section en travers</translation>
</message>
<message>
<location filename="../View/ui/GeometryCrossSection.ui" line="83"/>
<location filename="../View/ui/GeometryCrossSection.ui" line="85"/>
<source>Delete selected point(s)</source>
<translation>Supprimer le(s) point(s) sélectionné(s)</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="213"/>
<location filename="../View/ui/GeometryCrossSection.ui" line="94"/>
<source>up</source>
<translation>Monter</translation>
</message>
<message>
<location filename="../View/ui/GeometryCrossSection.ui" line="95"/>
<location filename="../View/ui/GeometryCrossSection.ui" line="97"/>
<source>Move up selected point(s)</source>
<translation>Déplacer le point sélectionné vers le haut</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="225"/>
<location filename="../View/ui/GeometryCrossSection.ui" line="106"/>
<source>down</source>
<translation>Descendre</translation>
</message>
<message>
<location filename="../View/ui/GeometryCrossSection.ui" line="107"/>
<location filename="../View/ui/GeometryCrossSection.ui" line="109"/>
<source>Mode down selected point(s)</source>
<translation>Déplacer le point sélectionné vers le bas</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="189"/>
<location filename="../View/ui/GeometryCrossSection.ui" line="118"/>
<source>sort_asc</source>
<translation>sort_asc</translation>
</message>
<message>
<location filename="../View/ui/GeometryCrossSection.ui" line="119"/>
<location filename="../View/ui/GeometryCrossSection.ui" line="121"/>
<source>Sort points by nearest neighbor</source>
<translation>Trier les points par leurs plus proches voisins</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="201"/>
<location filename="../View/ui/GeometryCrossSection.ui" line="130"/>
<source>sort_des</source>
<translation>sort_des</translation>
</message>
<message>
<location filename="../View/ui/GeometryCrossSection.ui" line="131"/>
<location filename="../View/ui/GeometryCrossSection.ui" line="133"/>
<source>Sort reversed points by nearest neighbor</source>
<translation>Trie inverser les points par leurs plus proche voisins</translation>
</message>
@ -2014,10 +2014,10 @@
<message>
<location filename="../View/ui/Reservoir.ui" line="114"/>
<source>Sort points by elevation</source>
<translation>Trier les points par leur côte</translation>
<translation>Trier les points par leur cote</translation>
</message>
<message>
<location filename="../View/ui/ProfileSedimentLayers.ui" line="75"/>
<location filename="../View/ui/ReachSedimentLayers.ui" line="31"/>
<source>Edit sediment layers list</source>
<translation>Éditer la liste des couches sédimentaires</translation>
</message>
@ -2112,52 +2112,52 @@
<translation>Éditer les couches sédimentaires</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="133"/>
<location filename="../View/ui/GeometryReach.ui" line="135"/>
<source>Import</source>
<translation>Importer</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="156"/>
<location filename="../View/ui/GeometryReach.ui" line="158"/>
<source>Add a cross-section</source>
<translation>Ajouter une section en travers</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="168"/>
<location filename="../View/ui/GeometryReach.ui" line="170"/>
<source>Delete selected cross-section(s)</source>
<translation>Supprimer la(es) section(s) en travers sélectionnée(s)</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="177"/>
<location filename="../View/ui/GeometryReach.ui" line="179"/>
<source>edit</source>
<translation>éditer</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="180"/>
<location filename="../View/ui/GeometryReach.ui" line="182"/>
<source>Edit selected cross section(s)</source>
<translation>Éditer la(es) section(s) en travers sélectionnée(s)</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="192"/>
<location filename="../View/ui/GeometryReach.ui" line="194"/>
<source>Sort cross-sections by ascending KP</source>
<translation>Trier les sections en travers par PK croissant</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="204"/>
<location filename="../View/ui/GeometryReach.ui" line="206"/>
<source>Sort cross-sections by descending KP</source>
<translation>Trier les sections en travers par PK décroissant</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="216"/>
<location filename="../View/ui/GeometryReach.ui" line="218"/>
<source>Move up selected cross-section(s)</source>
<translation>Déplacer la(s) section(s) en travers vers le haut</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="228"/>
<location filename="../View/ui/GeometryReach.ui" line="230"/>
<source>Move down selected cross-section(s)</source>
<translation>Déplacer la(es) section(s) en travers vers le bas</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="233"/>
<location filename="../View/ui/GeometryReach.ui" line="235"/>
<source>Meshing</source>
<translation>Maillage</translation>
</message>
@ -2261,6 +2261,41 @@
<source>Edit the study information</source>
<translation>Éditer les information de l&apos;étude</translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="240"/>
<source>Update KP</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="243"/>
<source>Recompute KP</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../View/ui/GeometryCrossSection.ui" line="138"/>
<source>Purge</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../View/ui/GeometryReach.ui" line="251"/>
<source>Purge cross-sections to keep a given number of points</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../View/ui/GeometryCrossSection.ui" line="141"/>
<source>Purge the cross-section to keep a given number of points</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../View/ui/GeometryCrossSection.ui" line="146"/>
<source>Reverse</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../View/ui/GeometryCrossSection.ui" line="149"/>
<source>Reverse the points order</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowProfile</name>
@ -2472,12 +2507,12 @@
<message>
<location filename="../View/Results/translate.py" line="41"/>
<source>Water elevation</source>
<translation>Côte de l&apos;eau</translation>
<translation>Cote de l&apos;eau</translation>
</message>
<message>
<location filename="../View/Results/translate.py" line="42"/>
<source>Max water elevation</source>
<translation>Côte maximum de l&apos;eau</translation>
<translation>Cote maximum de l&apos;eau</translation>
</message>
<message>
<location filename="../View/Results/translate.py" line="48"/>
@ -2913,12 +2948,12 @@
<message>
<location filename="../View/Translate.py" line="60"/>
<source>Elevation (m)</source>
<translation>Côte (m)</translation>
<translation>Cote (m)</translation>
</message>
<message>
<location filename="../View/Translate.py" line="61"/>
<source>Water elevation (m)</source>
<translation>Côte de l&apos;eau (m)</translation>
<translation>Cote de l&apos;eau (m)</translation>
</message>
<message>
<location filename="../View/Translate.py" line="65"/>

View File

@ -109,3 +109,59 @@
(mapcar 'pamhyr--insert-license
(mapcar (lambda (file) (concat root "/" file))
files-without-copyright))))
(defvar pamhyr-mail-template "Bonjour,
La version @version de Pamhyr2 est disponible.
<NEWS>
---Change-logs-------------------@version---
@description
------------------------------------------
---Liens-utiles---------------------------
Télécharger cette version :
https://gitlab.irstea.fr/theophile.terraz/pamhyr/-/releases/@version
La documentation (en anglais) :
https://gitlab.irstea.fr/theophile.terraz/pamhyr/-/wikis/home
Rapporter un problème :
https://gitlab.irstea.fr/theophile.terraz/pamhyr/-/issues
ou directement par mail à :
<pierre-antoine.rouby@inrae.fr>
------------------------------------------
<FUTURE_WORK>
---/!\--Attention-------------------------
Pour les utilisateurs Windows : Certains antivirus peuvent détecter Pamhyr2 comme un virus, c'est un faux positif, le problème est connu et vient de l'exécutable généré par PyInstaller.
Nous n'avons pas encore de solution pour régler ce problème.
Si c'est votre cas, il faudra ajouter une exception dans votre antivirus si vous voulez utiliser Pamhyr2.
Sinon, il est aussi possible de passer par WSL et utiliser la version Linux sous Windows.
Rapport d'antivirus : <LINK_VIRUSTOTAL>
------------------------------------------
Bon weekend,
")
(require 'web)
(require 'json)
(defun pamhyr-release-mail (release)
(interactive "sRelease name: ")
(web-http-get
(lambda (httpc header my-data)
(let* ((data (json-read-from-string my-data))
(release (cdr (assoc 'tag_name data)))
(description (cdr (assoc 'description data))))
(let ((buffer (generate-new-buffer (format "* mail-%s *" release))))
(with-current-buffer buffer
(insert
(string-replace "@description" description
(string-replace "@version" release
pamhyr-mail-template)))
(set-buffer buffer)))))
:url (concat "https://gitlab.irstea.fr/api/v4/projects/2779/releases/" release)))