mirror of https://gitlab.com/pamhyr/pamhyr2
Geometry: Add water level at shift click, end of onpickevent refactoring.
parent
f4561494f6
commit
317cbf904d
|
|
@ -519,10 +519,10 @@ class ProfileXYZ(Profile, SQLSubModel):
|
||||||
station = []
|
station = []
|
||||||
constant = 0.0
|
constant = 0.0
|
||||||
|
|
||||||
if (first_named_point is not None and
|
if (first_named_point is not None
|
||||||
last_named_point is not None):
|
and last_named_point is not None):
|
||||||
if (first_named_point != last_named_point and
|
if (first_named_point != last_named_point
|
||||||
first_named_point.x != last_named_point.x):
|
and first_named_point.x != last_named_point.x):
|
||||||
vector = Vector1d(first_named_point, last_named_point)
|
vector = Vector1d(first_named_point, last_named_point)
|
||||||
norm_dir_vec = vector.normalized_direction_vector()
|
norm_dir_vec = vector.normalized_direction_vector()
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,6 @@ class RubarBE(CommandLineSolver):
|
||||||
name = self._study.name
|
name = self._study.name
|
||||||
return f"{name}.TRA"
|
return f"{name}.TRA"
|
||||||
|
|
||||||
|
|
||||||
def export(self, study, repertory, qlog=None):
|
def export(self, study, repertory, qlog=None):
|
||||||
self._study = study
|
self._study = study
|
||||||
name = study.name.replace(" ", "_")
|
name = study.name.replace(" ", "_")
|
||||||
|
|
@ -384,7 +383,9 @@ class RubarBE(CommandLineSolver):
|
||||||
last = profiles[-1]
|
last = profiles[-1]
|
||||||
|
|
||||||
if first.kp not in data or last.kp not in data:
|
if first.kp not in data or last.kp not in data:
|
||||||
logger.error("Study initial condition is not fully defined")
|
logger.error(
|
||||||
|
"Study initial condition is not fully defined"
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
f_h_s = self._export_tps_profile_height_speed(first, data)
|
f_h_s = self._export_tps_profile_height_speed(first, data)
|
||||||
|
|
@ -419,7 +420,6 @@ class RubarBE(CommandLineSolver):
|
||||||
# Last mail
|
# Last mail
|
||||||
f.write(f"{ind:>5} {f_h_s[0]} {f_h_s[1]}")
|
f.write(f"{ind:>5} {f_h_s[0]} {f_h_s[1]}")
|
||||||
|
|
||||||
|
|
||||||
def _export_tps_init_data(self, ics):
|
def _export_tps_init_data(self, ics):
|
||||||
data = {}
|
data = {}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,9 @@ class Plot(PamhyrPlot):
|
||||||
)
|
)
|
||||||
|
|
||||||
self._table = table
|
self._table = table
|
||||||
|
self._z_note = None
|
||||||
|
self._z_line = None
|
||||||
|
self._z_fill_between = None
|
||||||
|
|
||||||
self.line_xy = []
|
self.line_xy = []
|
||||||
self.line_gl = []
|
self.line_gl = []
|
||||||
|
|
@ -63,7 +66,8 @@ class Plot(PamhyrPlot):
|
||||||
self.hl_points = []
|
self.hl_points = []
|
||||||
self.highlight = (
|
self.highlight = (
|
||||||
[], # Points list to highlight
|
[], # Points list to highlight
|
||||||
None # Water level (z)
|
None # Hydrolic values (z, wet_area,
|
||||||
|
# wet_preimeter, water_width)
|
||||||
)
|
)
|
||||||
|
|
||||||
def onpick(self, event):
|
def onpick(self, event):
|
||||||
|
|
@ -74,11 +78,11 @@ class Plot(PamhyrPlot):
|
||||||
if modifiers != Qt.ControlModifier:
|
if modifiers != Qt.ControlModifier:
|
||||||
return
|
return
|
||||||
|
|
||||||
points, z = self.highlight
|
_, hyd = self.highlight
|
||||||
|
|
||||||
ind, point = self._closer_point(event)
|
ind, point = self._closer_point(event)
|
||||||
|
|
||||||
self.highlight = ([point], z)
|
self.highlight = ([point], hyd)
|
||||||
self._select_in_table(ind)
|
self._select_in_table(ind)
|
||||||
|
|
||||||
self.update()
|
self.update()
|
||||||
|
|
@ -92,18 +96,24 @@ class Plot(PamhyrPlot):
|
||||||
if modifiers != Qt.ShiftModifier:
|
if modifiers != Qt.ShiftModifier:
|
||||||
return
|
return
|
||||||
|
|
||||||
points, z = self.highlight
|
points, _ = self.highlight
|
||||||
|
|
||||||
# Compute largeur au miroir
|
z = self._get_z_from_click(event)
|
||||||
|
if z < self.data.z_min():
|
||||||
|
return
|
||||||
|
|
||||||
self.highlight = (points, z)
|
a, p, w = self._compute_hydrolics(z)
|
||||||
|
|
||||||
|
logger.debug(f"{z, a, p, w}")
|
||||||
|
|
||||||
|
self.highlight = (points, (z, a, p, w))
|
||||||
|
|
||||||
self.update()
|
self.update()
|
||||||
return
|
return
|
||||||
|
|
||||||
def select_points_from_indexes(self, indexes):
|
def select_points_from_indexes(self, indexes):
|
||||||
data = self.data
|
data = self.data
|
||||||
_, z = self.highlight
|
_, hyd = self.highlight
|
||||||
|
|
||||||
points = list(
|
points = list(
|
||||||
map(
|
map(
|
||||||
|
|
@ -117,7 +127,7 @@ class Plot(PamhyrPlot):
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
self.highlight = (points, z)
|
self.highlight = (points, hyd)
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
def _select_in_table(self, ind):
|
def _select_in_table(self, ind):
|
||||||
|
|
@ -157,11 +167,9 @@ class Plot(PamhyrPlot):
|
||||||
|
|
||||||
def dist_mouse(point):
|
def dist_mouse(point):
|
||||||
x, y = point[1]
|
x, y = point[1]
|
||||||
d = (
|
d = sqrt(
|
||||||
sqrt(
|
|
||||||
(((mx - x) / ratio) ** 2) +
|
(((mx - x) / ratio) ** 2) +
|
||||||
((my - y) ** 2)
|
((my - y) ** 2)
|
||||||
)
|
|
||||||
)
|
)
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
|
@ -171,6 +179,22 @@ class Plot(PamhyrPlot):
|
||||||
|
|
||||||
return closer
|
return closer
|
||||||
|
|
||||||
|
def _get_z_from_click(self, event):
|
||||||
|
return event.ydata
|
||||||
|
|
||||||
|
def _compute_hydrolics(self, z):
|
||||||
|
profile = self.data
|
||||||
|
|
||||||
|
points = profile.wet_points(z)
|
||||||
|
station = profile._get_station(points)
|
||||||
|
width = abs(station[0] - station[-1])
|
||||||
|
|
||||||
|
poly = profile.wet_polygon(z)
|
||||||
|
area = poly.area
|
||||||
|
perimeter = poly.length
|
||||||
|
|
||||||
|
return area, perimeter, width
|
||||||
|
|
||||||
@timer
|
@timer
|
||||||
def draw(self):
|
def draw(self):
|
||||||
self.init_axes()
|
self.init_axes()
|
||||||
|
|
@ -180,9 +204,7 @@ class Plot(PamhyrPlot):
|
||||||
x_carto = self.data.x()
|
x_carto = self.data.x()
|
||||||
y_carto = self.data.y()
|
y_carto = self.data.y()
|
||||||
|
|
||||||
if (len(x_carto) < 3
|
if (len(x_carto) < 3 or len(y_carto) < 3 or len(x) < 3):
|
||||||
or len(y_carto) < 3
|
|
||||||
or len(x) < 3):
|
|
||||||
# Noting to do in this case
|
# Noting to do in this case
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
@ -193,7 +215,7 @@ class Plot(PamhyrPlot):
|
||||||
)
|
)
|
||||||
|
|
||||||
self.draw_annotation(x, y)
|
self.draw_annotation(x, y)
|
||||||
self.draw_hightligth()
|
self.draw_highligth()
|
||||||
|
|
||||||
self.idle()
|
self.idle()
|
||||||
|
|
||||||
|
|
@ -235,8 +257,8 @@ class Plot(PamhyrPlot):
|
||||||
self.canvas.axes.set_facecolor('#F9F9F9')
|
self.canvas.axes.set_facecolor('#F9F9F9')
|
||||||
self.canvas.figure.patch.set_facecolor('white')
|
self.canvas.figure.patch.set_facecolor('white')
|
||||||
|
|
||||||
def draw_hightligth(self):
|
def draw_highligth(self):
|
||||||
points, z = self.highlight
|
points, hyd = self.highlight
|
||||||
for p in self.hl_points:
|
for p in self.hl_points:
|
||||||
p[0].set_data([], [])
|
p[0].set_data([], [])
|
||||||
|
|
||||||
|
|
@ -252,8 +274,63 @@ class Plot(PamhyrPlot):
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if hyd is not None:
|
||||||
|
self.draw_highligth_z_line(*hyd)
|
||||||
|
|
||||||
|
def draw_highligth_z_line(self, z, a, p, w):
|
||||||
|
text = (
|
||||||
|
f"Z = {z:.3f} m, " +
|
||||||
|
f"{self._trad['width']} = {w:.3f} m,\n" +
|
||||||
|
f"{self._trad['area']} = {a:.3f} m², " +
|
||||||
|
f"{self._trad['perimeter']} = {p:.3f} m"
|
||||||
|
)
|
||||||
|
|
||||||
|
x = self.data.get_station()
|
||||||
|
xlim = (x[0], x[-1])
|
||||||
|
pos = (
|
||||||
|
xlim[0] + (abs(xlim[0] - xlim[1]) * 0.05),
|
||||||
|
z + 0.8
|
||||||
|
)
|
||||||
|
y = self.data.z()
|
||||||
|
|
||||||
|
if self._z_note is None:
|
||||||
|
self.draw_highligth_z_line_fill(x, y, z)
|
||||||
|
|
||||||
|
self._z_line = self.canvas.axes.plot(
|
||||||
|
xlim, [z, z],
|
||||||
|
color=self.color_plot_river_water
|
||||||
|
)
|
||||||
|
|
||||||
|
self._z_note = self.canvas.axes.annotate(
|
||||||
|
text, pos,
|
||||||
|
horizontalalignment='left',
|
||||||
|
verticalalignment='top',
|
||||||
|
annotation_clip=True,
|
||||||
|
color=self.color_plot_river_water,
|
||||||
|
fontsize=9,
|
||||||
|
fontweight='bold',
|
||||||
|
alpha=0.7
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.draw_highligth_z_line_fill(x, y, z)
|
||||||
|
|
||||||
|
self._z_line[0].set_data(xlim, [z, z])
|
||||||
|
self._z_note.set_position(pos)
|
||||||
|
self._z_note.set_text(text)
|
||||||
|
|
||||||
|
def draw_highligth_z_line_fill(self, x, y, z):
|
||||||
|
if self._z_fill_between is not None:
|
||||||
|
self._z_fill_between.remove()
|
||||||
|
|
||||||
|
self._z_fill_between = self.canvas.axes.fill_between(
|
||||||
|
x, y, z,
|
||||||
|
where=y <= z,
|
||||||
|
facecolor=self.color_plot_river_water_zone,
|
||||||
|
interpolate=True, alpha=0.7
|
||||||
|
)
|
||||||
|
|
||||||
@timer
|
@timer
|
||||||
def update(self):
|
def update(self):
|
||||||
self.draw_hightligth()
|
self.draw_highligth()
|
||||||
|
|
||||||
self.update_idle()
|
self.update_idle()
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,10 @@ class GeometryProfileTranslate(GeometryTranslate):
|
||||||
"Geometry", "Geometry cross-section"
|
"Geometry", "Geometry cross-section"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self._dict["width"] = _translate("Geometry", "Width")
|
||||||
|
self._dict["area"] = _translate("Geometry", "Area")
|
||||||
|
self._dict["perimeter"] = _translate("Geometry", "Perimeter")
|
||||||
|
|
||||||
self._sub_dict["table_headers"] = {
|
self._sub_dict["table_headers"] = {
|
||||||
"x": self._dict["x"],
|
"x": self._dict["x"],
|
||||||
"y": self._dict["y"],
|
"y": self._dict["y"],
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue