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) bar._sql_save(execute, data=data)
#+end_src #+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 [fn:sqlite] The SQLite web site: https://www.sqlite.org/index.html
(last access 2023-09-20) (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) st_file = self.export_reach_to_st(reach, tmp)
m_file = st_file.rsplit(".ST", 1)[0] + ".M" m_file = st_file.rsplit(".ST", 1)[0] + ".M"
os.sync()
proc = QProcess() proc = QProcess()
proc.setWorkingDirectory(tmp) proc.setWorkingDirectory(tmp)

View File

@ -47,7 +47,7 @@ class PointXYZ(Point, SQLSubModel):
z INTEGER NOT NULL, z INTEGER NOT NULL,
profile INTEGER NOT NULL, profile INTEGER NOT NULL,
sl INTEGER, sl INTEGER,
FOREIGN KEY(profile) REFERENCES profileXYZ(id), FOREIGN KEY(profile) REFERENCES geometry_profileXYZ(id),
FOREIGN KEY(sl) REFERENCES sedimentary_layer(id) FOREIGN KEY(sl) REFERENCES sedimentary_layer(id)
) )
""") """)
@ -220,3 +220,11 @@ class PointXYZ(Point, SQLSubModel):
Euclidean 3D distance between the two points Euclidean 3D distance between the two points
""" """
return dist((p1.x, p1.y, p1.z), (p2.x, p2.y, p2.z)) 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() self._status.modified()
@timer
def reverse(self):
self._points.reverse()
self._status.modified()
# Sediment Layers # Sediment Layers
def get_sl(self): def get_sl(self):

View File

@ -578,3 +578,32 @@ class ProfileXYZ(Profile, SQLSubModel):
break break
return last_point 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" repertory, "pamhyr-study-description.txt"
) )
with open(path, "w+") as f: with open(path, "w+", encoding='utf-8') as f:
txt = study.description txt = study.description\
.encode()\
.decode('utf-8', 'replace')
f.write(txt) f.write(txt)
####### #######

View File

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

View File

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

View File

@ -167,7 +167,9 @@ class PlotKPZ(PamhyrPlot):
self.line_kp_zgl.append( self.line_kp_zgl.append(
self.canvas.axes.plot( 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 ind += 1

View File

@ -130,7 +130,8 @@ class PlotXY(PamhyrPlot):
self.line_gl = [] self.line_gl = []
for x, y in zip(x_complete, y_complete): for x, y in zip(x_complete, y_complete):
line = self.canvas.axes.plot( 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) self.line_gl.append(line)
ind += 1 ind += 1

View File

@ -250,6 +250,26 @@ class GeometryProfileTableModel(PamhyrTableModel):
self.endMoveRows() self.endMoveRows()
self.layoutChanged.emit() 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): def paste(self, row, header, data):
if row > self._data.number_points: if row > self._data.number_points:
return return

View File

@ -169,6 +169,34 @@ class MoveCommand(QUndoCommand):
self._profile.move_down_point(self._i) 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): class PasteCommand(QUndoCommand):
def __init__(self, profile, row, points): def __init__(self, profile, row, points):
QUndoCommand.__init__(self) QUndoCommand.__init__(self)

View File

@ -125,6 +125,8 @@ class ProfileWindow(PamhyrWindow):
"action_down": self.move_down, "action_down": self.move_down,
"action_add": self.add, "action_add": self.add,
"action_delete": self.delete, "action_delete": self.delete,
"action_purge": self.purge,
"action_reverse": self.reverse,
} }
for action in actions: for action in actions:
@ -146,6 +148,12 @@ class ProfileWindow(PamhyrWindow):
self.update_plot() self.update_plot()
self._propagate_update(key=Modules.GEOMETRY) 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): def update_plot(self):
self._tablemodel.blockSignals(True) self._tablemodel.blockSignals(True)
@ -153,6 +161,14 @@ class ProfileWindow(PamhyrWindow):
self._tablemodel.blockSignals(False) 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): def index_selected_row(self):
table = self.find(QTableView, "tableView") table = self.find(QTableView, "tableView")
rows = table.selectionModel()\ rows = table.selectionModel()\
@ -238,6 +254,14 @@ class ProfileWindow(PamhyrWindow):
self.update() self.update()
def purge(self):
self._tablemodel.purge()
self.update()
def reverse(self):
self._tablemodel.reverse()
self.update()
def _copy(self): def _copy(self):
table = self.find(QTableView, "tableView") table = self.find(QTableView, "tableView")
rows = table.selectionModel().selectedRows() rows = table.selectionModel().selectedRows()

View File

@ -246,3 +246,12 @@ class GeometryReachTableModel(PamhyrTableModel):
self.layoutAboutToBeChanged.emit() self.layoutAboutToBeChanged.emit()
self.layoutChanged.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: for profile in self._new_profiles:
self._reach.insert_profile(0, profile) 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_delete": self.delete,
"action_edit": self.edit_profile, "action_edit": self.edit_profile,
"action_meshing": self.edit_meshing, "action_meshing": self.edit_meshing,
"action_update_kp": self.update_kp,
"action_purge": self.purge,
} }
for action in actions: for action in actions:
@ -227,7 +229,7 @@ class GeometryWindow(PamhyrWindow):
self._propagate_update(key=Modules.GEOMETRY) self._propagate_update(key=Modules.GEOMETRY)
def _propagated_update(self, key=Modules(0)): 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 return
self._update(propagate=False) self._update(propagate=False)
@ -507,6 +509,13 @@ class GeometryWindow(PamhyrWindow):
self._table.move_down(row) self._table.move_down(row)
self.select_current_profile() self.select_current_profile()
def update_kp(self):
pass
def purge(self):
self._table.purge()
self.update_redraw()
def duplicate(self): def duplicate(self):
rows = [ rows = [
row.row() for row in row.row() for row in

View File

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

View File

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

View File

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

View File

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

View File

@ -119,11 +119,14 @@ class PlotKPC(PamhyrPlot):
self.line_kp_sl.append(None) self.line_kp_sl.append(None)
self.line_kp_sl[i], = self.canvas.axes.plot( self.line_kp_sl[i], = self.canvas.axes.plot(
kp, z, 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., lw=1.,
color=( color=(
self.color_plot_river_bottom if i == len(final_z_sl) - 1 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 = MplCanvas(width=5, height=4, dpi=100)
self.canvas.setObjectName("canvas") self.canvas.setObjectName("canvas")
self.toolbar = PamhyrPlotToolbar( 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 = self.find(QVBoxLayout, "verticalLayout")
self.plot_layout.addWidget(self.toolbar) 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 = MplCanvas(width=5, height=4, dpi=100)
self.canvas_2.setObjectName("canvas_2") self.canvas_2.setObjectName("canvas_2")
self.toolbar_2 = PamhyrPlotToolbar( 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 = self.find(QVBoxLayout, "verticalLayout_2")
self.plot_layout_2.addWidget(self.toolbar_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 = MplCanvas(width=5, height=4, dpi=100)
self.canvas_3.setObjectName("canvas_3") self.canvas_3.setObjectName("canvas_3")
self.toolbar_3 = PamhyrPlotToolbar( 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 = self.find(QVBoxLayout, "verticalLayout_3")
self.plot_layout_3.addWidget(self.toolbar_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 = MplCanvas(width=5, height=4, dpi=100)
self.canvas_4.setObjectName("canvas_4") self.canvas_4.setObjectName("canvas_4")
self.toolbar_4 = PamhyrPlotToolbar( 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( self.plot_layout_4 = self.find(
QVBoxLayout, "verticalLayout_hydrograph") QVBoxLayout, "verticalLayout_hydrograph")

View File

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

View File

@ -58,6 +58,8 @@
<addaction name="action_sort_des"/> <addaction name="action_sort_des"/>
<addaction name="action_up"/> <addaction name="action_up"/>
<addaction name="action_down"/> <addaction name="action_down"/>
<addaction name="action_purge"/>
<addaction name="action_reverse"/>
</widget> </widget>
<action name="action_add"> <action name="action_add">
<property name="icon"> <property name="icon">
@ -131,6 +133,22 @@
<string>Sort reversed points by nearest neighbor</string> <string>Sort reversed points by nearest neighbor</string>
</property> </property>
</action> </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> </widget>
<resources/> <resources/>
<connections/> <connections/>

View File

@ -127,6 +127,8 @@
<addaction name="action_down"/> <addaction name="action_down"/>
<addaction name="action_export"/> <addaction name="action_export"/>
<addaction name="action_meshing"/> <addaction name="action_meshing"/>
<addaction name="action_update_kp"/>
<addaction name="action_purge"/>
</widget> </widget>
<action name="action_import"> <action name="action_import">
<property name="text"> <property name="text">
@ -233,6 +235,22 @@
<string>Meshing</string> <string>Meshing</string>
</property> </property>
</action> </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> </widget>
<resources/> <resources/>
<connections/> <connections/>

View File

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

View File

@ -109,3 +109,59 @@
(mapcar 'pamhyr--insert-license (mapcar 'pamhyr--insert-license
(mapcar (lambda (file) (concat root "/" file)) (mapcar (lambda (file) (concat root "/" file))
files-without-copyright)))) 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)))