diff --git a/src/Meshing/Mage.py b/src/Meshing/Mage.py index 9ce8f357e72c4e3124816ee8462e9d20ac8d5850..90f44d569886709fe59faf9f60afa25f4eff3e71 100644 --- a/src/Meshing/Mage.py +++ b/src/Meshing/Mage.py @@ -297,7 +297,8 @@ class MeshingWithMageMailleurTT(AMeshingTool): directrices=['un', 'np'], lplan: bool = False, lm: int = 3, - linear: bool = False): + linear: bool = False, + origin_value = 0.0): if reach is None or len(reach.profiles) == 0: return reach @@ -320,11 +321,12 @@ class MeshingWithMageMailleurTT(AMeshingTool): logger.info( f"! {self._exe_path()} " + f"{st_file} {m_file} " + + f"mesh " + f"{str(step)} " + f"{limites[0]} {limites[1]} " + f"{directrices[0]} {directrices[1]} " + f"{lplan} {lm} {linear} " + - f"mesh {origin}" + f"{origin} " ) proc.start( self._exe_path(), @@ -332,11 +334,86 @@ class MeshingWithMageMailleurTT(AMeshingTool): map( str, [ - st_file, m_file, step, + st_file, m_file, + "mesh", step, limites[0], limites[1], directrices[0], directrices[1], - lplan, lm, linear, - "mesh", origin + lplan, lm, linear, origin, origin_value + ] + ) + ) + ) + proc.waitForFinished() + + if proc.exitCode() != 0: + logger.error( + f"{logger_color_red()}" + + f"MailleurTT error: {proc.exitCode()}" + + f"{logger_color_reset()}" + ) + outputs = proc.readAllStandardOutput() + logger.debug(outputs) + + errors = proc.readAllStandardError() + logger.error( + f"{logger_color_red()}{errors}{logger_color_reset()}" + ) + return reach + + self.import_m_file(reach, m_file) + return reach + + def update_kp(self, reach, + step: float = 50, + limites=[-1, -1], + origin=0, + directrices=['un', 'np'], + lplan: bool = False, + lm: int = 3, + linear: bool = False, + origin_value = 0.0): + if reach is None or len(reach.profiles) == 0: + return reach + + with tempfile.TemporaryDirectory() as tmp: + logger.debug(f"temp file: {tmp}") + 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) + + # Mage section indices start at 1 + origin += 1 + limites[0] += 1 + limites[1] += 1 + + lplan = 1 if lplan else 0 + linear = 1 if linear else 0 + + logger.info( + f"! {self._exe_path()} " + + f"{st_file} {m_file} " + + f"update_kp " + + f"{str(step)} " + + f"{limites[0]} {limites[1]} " + + f"{directrices[0]} {directrices[1]} " + + f"{lplan} {lm} {linear} " + + f"{origin} " + ) + proc.start( + self._exe_path(), + list( + map( + str, + [ + st_file, m_file, + "update_kp", step, + limites[0], limites[1], + directrices[0], directrices[1], + lplan, lm, linear, origin, origin_value ] ) ) diff --git a/src/View/Geometry/MeshingDialog.py b/src/View/Geometry/MeshingDialog.py index 7c7b385d0534a461f54a6aefcb60fd2b14580f64..974aa187a5f944863034479c34f5e8aa03a13bd7 100644 --- a/src/View/Geometry/MeshingDialog.py +++ b/src/View/Geometry/MeshingDialog.py @@ -68,17 +68,6 @@ class MeshingDialog(PamhyrDialog): self._space_step ) - lm_dict = self._trad.get_dict("lm_dict") - self.combobox_add_items( - "comboBox_lm", list( - map( - lambda x: lm_dict[x], - ["1", "2", "3"] - ) - ) - ) - self.set_combobox_text("comboBox_lm", lm_dict[self._lm]) - if self._linear: self.set_radio_button("radioButton_linear", True) else: @@ -89,7 +78,6 @@ class MeshingDialog(PamhyrDialog): self.combobox_add_items("comboBox_begin_kp", profiles) self.combobox_add_items("comboBox_end_kp", profiles) - self.combobox_add_items("comboBox_origin", profiles) self.set_combobox_text("comboBox_begin_kp", profiles[0]) self.set_combobox_text("comboBox_end_kp", profiles[-1]) @@ -120,8 +108,8 @@ class MeshingDialog(PamhyrDialog): gl, _ = self._reach.compute_guidelines() gl = list(gl) - bgl = ['un'] + gl - egl = gl + ['np'] + bgl = ['un'] + gl + ['np'] + egl = ['un'] + gl + ['np'] self.combobox_add_items("comboBox_begin_gl", bgl) self.combobox_add_items("comboBox_end_gl", egl) diff --git a/src/View/Geometry/Table.py b/src/View/Geometry/Table.py index 26baa7fb23d84d33a5b7971e7169f1c19f007ed9..3c5db448a5afee1c037e44df399cbc9fb956032d 100644 --- a/src/View/Geometry/Table.py +++ b/src/View/Geometry/Table.py @@ -240,7 +240,19 @@ class GeometryReachTableModel(PamhyrTableModel): self._undo.push( MeshingCommand( - self._data, mesher, data + self._data, mesher, data, "mesh" + ) + ) + + self.layoutAboutToBeChanged.emit() + self.layoutChanged.emit() + + def update_kp(self, mesher, data): + self.layoutAboutToBeChanged.emit() + + self._undo.push( + MeshingCommand( + self._data, mesher, data, "update_kp" ) ) diff --git a/src/View/Geometry/UndoCommand.py b/src/View/Geometry/UndoCommand.py index e5d488851a0e62f6b010090707dee1e3a669fd49..f50299fc93c633a6048d936d17443618b3346c7b 100644 --- a/src/View/Geometry/UndoCommand.py +++ b/src/View/Geometry/UndoCommand.py @@ -222,12 +222,13 @@ class ImportCommand(QUndoCommand): class MeshingCommand(QUndoCommand): - def __init__(self, reach, mesher, data): + def __init__(self, reach, mesher, data, command): QUndoCommand.__init__(self) self._reach = reach self._data = data self._mesher = mesher + self._command = command self._profiles = reach.profiles.copy() self._profiles.reverse() @@ -242,10 +243,16 @@ class MeshingCommand(QUndoCommand): def redo(self): if self._new_profiles is None: - self._mesher.meshing( - self._reach, - **self._data - ) + if self._command == "update_kp": + self._mesher.update_kp( + self._reach, + **self._data + ) + else: + self._mesher.meshing( + self._reach, + **self._data + ) self._new_profiles = self._reach.profiles.copy() self._new_profiles.reverse() diff --git a/src/View/Geometry/Window.py b/src/View/Geometry/Window.py index 302237a3fbdde83bf5b01fd045d9a9fd2ed5c9e2..5e13a1dc96e593ca9991ed30909b44e9ef442fc7 100644 --- a/src/View/Geometry/Window.py +++ b/src/View/Geometry/Window.py @@ -56,6 +56,7 @@ from View.Geometry.PlotXY import PlotXY from View.Geometry.PlotAC import PlotAC from View.Geometry.PlotKPZ import PlotKPZ from View.Geometry.MeshingDialog import MeshingDialog +from View.Geometry.UpdateKPDialog import UpdateKPDialog from View.Geometry.Translate import GeometryTranslate from View.Geometry.Profile.Window import ProfileWindow @@ -321,10 +322,36 @@ class GeometryWindow(PamhyrWindow): src_except=e ) - pyqtSlot(bool) + def update_kp(self): + try: + dlg = UpdateKPDialog( + reach=self._reach, + trad=self._trad, + parent=self + ) + if dlg.exec(): + data = { + "origin": dlg.origin, + "directrices": [dlg.begin_dir, dlg.end_dir], + "origin_value": dlg.origin_value, + } + self._update_kp(data) + except Exception as e: + logger_exception(e) + return - def changed_profile_slot(self, status): - self.update_view1 = status + def _update_kp(self, data): + try: + mesher = MeshingWithMageMailleurTT() + self._table.update_kp(mesher, data) + except Exception as e: + logger_exception(e) + raise ExternFileMissingError( + module="mage", + filename="MailleurTT", + path=MeshingWithMageMailleurTT._path(), + src_except=e + ) def plot_xy(self): self.tableView.model().blockSignals(True) @@ -509,9 +536,6 @@ 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() diff --git a/src/View/ui/MeshingOptions.ui b/src/View/ui/MeshingOptions.ui index 01bd7a5393ae130fd86e00b088b1bd42119a837b..6ff87a52465ff2c9a79e8f65a77af32c6c816033 100644 --- a/src/View/ui/MeshingOptions.ui +++ b/src/View/ui/MeshingOptions.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>608</width> - <height>342</height> + <width>520</width> + <height>341</height> </rect> </property> <property name="windowTitle"> @@ -108,127 +108,96 @@ </layout> </widget> </item> - <item row="0" column="0"> - <widget class="QGroupBox" name="groupBox"> - <property name="title"> - <string>Limits</string> - </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QLabel" name="label"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="text"> - <string>First cross section</string> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="comboBox_begin_kp"> - <property name="enabled"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QLabel" name="label_2"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="text"> - <string>Last cross section</string> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="comboBox_end_kp"> - <property name="enabled"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </item> - </layout> - </widget> - </item> <item row="1" column="0"> <widget class="QGroupBox" name="groupBox_3"> <property name="title"> <string>Distance computation</string> </property> <layout class="QGridLayout" name="gridLayout_3"> - <item row="0" column="0"> - <widget class="QLabel" name="label_8"> - <property name="text"> - <string>Original section</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QComboBox" name="comboBox_origin"/> - </item> <item row="1" column="0"> - <widget class="QLabel" name="label_5"> + <widget class="QLabel" name="label_6"> <property name="enabled"> <bool>true</bool> </property> <property name="text"> - <string>First guide-line</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QComboBox" name="comboBox_begin_gl"> - <property name="enabled"> - <bool>true</bool> + <string>Second guide-line</string> </property> </widget> </item> - <item row="1" column="2"> - <widget class="QLabel" name="label_6"> + <item row="0" column="0"> + <widget class="QLabel" name="label_5"> <property name="enabled"> <bool>true</bool> </property> <property name="text"> - <string>Second guide-line</string> + <string>First guide-line</string> </property> </widget> </item> - <item row="1" column="3"> + <item row="1" column="1"> <widget class="QComboBox" name="comboBox_end_gl"> <property name="enabled"> <bool>true</bool> </property> </widget> </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_4"> + <item row="0" column="1"> + <widget class="QComboBox" name="comboBox_begin_gl"> <property name="enabled"> <bool>true</bool> </property> - <property name="text"> - <string>Takes</string> - </property> </widget> </item> - <item row="2" column="1"> - <widget class="QComboBox" name="comboBox_lm"> - <property name="enabled"> - <bool>true</bool> - </property> - </widget> + </layout> + </widget> + </item> + <item row="0" column="0"> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Limits</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>First cross section</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="comboBox_begin_kp"> + <property name="enabled"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item row="1" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="label_2"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Last cross section</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="comboBox_end_kp"> + <property name="enabled"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> </item> </layout> </widget>