Merge branch 'master' of gitlab-ssh.irstea.fr:theophile.terraz/pamhyr

mesh
Theophile Terraz 2023-12-20 09:47:33 +01:00
commit d81f341303
3 changed files with 294 additions and 5 deletions

View File

@ -65,7 +65,7 @@
31874.0000 14.5000 22.1900
31874.0000 17.6000 22.9900
999.9990 999.9990 999.9990
7 0 0 7 31875.0000 PontRD101m
7 0 0 9 31875.0000 PontRD101m
31875.0000 0.5400 23.0000
31875.0000 0.5400 21.8900
31875.0000 2.5000 19.6900 rg
@ -76,7 +76,7 @@
31875.0000 13.8900 21.8900
31875.0000 13.8900 23.0000
999.9990 999.9990 999.9990
8 0 0 7 31885.0000 PontRD101v
8 0 0 9 31885.0000 PontRD101v
31885.0000 0.5400 23.0000
31885.0000 0.5400 21.8900
31885.0000 2.5000 19.6900 rg
@ -307,7 +307,7 @@
34334.0000 14.0000 18.1000 rd
34334.0000 16.1000 21.1300
999.9990 999.9990 999.9990
26 0 0 7 34335.0000 PontmThivencelle
26 0 0 9 34335.0000 PontmThivencelle
34335.0000 2.9000 22.0000
34335.0000 2.9000 20.7400
34335.0000 2.9000 18.2900 rg
@ -318,7 +318,7 @@
34335.0000 12.8000 20.7400
34335.0000 12.8000 22.0000
999.9990 999.9990 999.9990
27 0 0 7 34343.0000 PontvThivencelle
27 0 0 9 34343.0000 PontvThivencelle
34343.0000 2.9000 22.0000
34343.0000 2.9000 20.7400
34343.0000 2.9000 18.2900 rg

289
src/Scripts/MageMesh.py Normal file
View File

@ -0,0 +1,289 @@
# MageMesh.py -- Pamhyr
# Copyright (C) 2023 INRAE
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# -*- coding: utf-8 -*-
import os
import logging
from ctypes import (
cdll,
byref, Structure,
c_char_p, c_wchar_p,
create_string_buffer,
POINTER, c_void_p,
c_int, c_double, c_bool
)
from Scripts.AScript import AScript
logger = logging.getLogger()
bief_lib = None
c_init_bief_from_geo_file = None
c_get_nb_sections = None
c_get_nb_points_section = None
c_set_bief_name = None
c_st_to_m_compl = None
c_interpolate_profils_pas_transversal = None
c_update_pk = None
c_output_bief = None
##########################
# Binding initialisation #
##########################
def init_clib(lib_path):
global bief_lib
bief_lib = cdll.LoadLibrary(lib_path)
init_c_init_bief_from_geo_file(bief_lib)
init_c_get_nb_sections(bief_lib)
init_c_get_nb_points_section(bief_lib)
init_c_set_bief_name(bief_lib)
init_c_st_to_m_compl(bief_lib)
init_c_interpolate_profils_pas_transversal(bief_lib)
init_c_update_pk(bief_lib)
init_c_output_bief(bief_lib)
def init_c_init_bief_from_geo_file(bief_lib):
global c_init_bief_from_geo_file
c_init_bief_from_geo_file = getattr(
bief_lib, 'c_init_bief_from_geo_file'
)
c_init_bief_from_geo_file.argtypes = [
c_char_p, POINTER(c_int), POINTER(c_int)
]
c_init_bief_from_geo_file.restype = None
def init_c_get_nb_sections(bief_lib):
global c_get_nb_sections
c_get_nb_sections = getattr(bief_lib, 'c_get_nb_sections')
c_get_nb_sections.argtypes = [POINTER(c_int)]
c_get_nb_sections.restype = None
def init_c_get_nb_points_section(bief_lib):
global c_get_nb_points_section
c_get_nb_points_section = getattr(bief_lib, 'c_get_nb_points_section')
c_get_nb_points_section.argtypes = [POINTER(c_int), POINTER(c_int)]
c_get_nb_points_section.restype = None
def init_c_set_bief_name(bief_lib):
global c_set_bief_name
c_set_bief_name = getattr(bief_lib, 'c_set_bief_name')
c_set_bief_name.argtypes = [c_char_p]
c_set_bief_name.restype = None
def init_c_st_to_m_compl(bief_lib):
global c_st_to_m_compl
c_st_to_m_compl = getattr(bief_lib, 'c_st_to_m_compl')
c_st_to_m_compl.argtypes = [POINTER(c_int), c_char_p, c_char_p]
c_st_to_m_compl.restype = None
def init_c_interpolate_profils_pas_transversal(bief_lib):
global c_interpolate_profils_pas_transversal
c_interpolate_profils_pas_transversal = getattr(
bief_lib, 'c_interpolate_profils_pas_transversal'
)
c_interpolate_profils_pas_transversal.argtypes = [
POINTER(c_int), POINTER(c_int),
c_char_p, c_char_p,
POINTER(c_double), POINTER(c_bool),
POINTER(c_int), POINTER(c_bool)
]
c_interpolate_profils_pas_transversal.restype = None
def init_c_update_pk(bief_lib):
global c_update_pk
c_update_pk = getattr(bief_lib, 'c_update_pk')
c_update_pk.argtypes = [c_char_p]
c_update_pk.restype = None
def init_c_output_bief(bief_lib):
global c_output_bief
c_output_bief = getattr(bief_lib, 'c_output_bief')
c_output_bief.argtypes = [c_char_p]
c_output_bief.restype = None
def init_bief_from_geo_file(name, with_charriage, with_water):
logger.info("! call init_bief_from_geo_file:")
cname = create_string_buffer(name.encode())
c_init_bief_from_geo_file(
cname,
byref(c_int(with_charriage)),
byref(c_int(with_water))
)
#####################
# Binding functions #
#####################
def get_nb_sections():
nb_sections = c_int(0)
c_get_nb_sections(byref(nb_sections))
return nb_sections.value
def get_nb_points_section(section):
nb_points = c_int(0)
c_get_nb_points_section(byref(c_int(section)), byref(nb_points))
return nb_points.value
def set_bief_name(name):
logger.info(f"! call set_bief_name: {repr(name)}")
cname = create_string_buffer(name.encode())
c_set_bief_name(cname)
def st_to_m_compl(npoints, tag1=' ', tag2=' '):
logger.info(f"! call st_to_m_compl: {npoints}")
cnpoints = c_int(npoints)
ctag1 = create_string_buffer(tag1.encode())
ctag2 = create_string_buffer(tag2.encode())
c_st_to_m_compl(byref(cnpoints), ctag1, ctag2)
def interpolate_profils_pas_transversal(limite1, limite2,
directrice1, directrice2,
pas, lplan=False,
lm=3, lineaire=False):
logger.info("! call interpolate_profils_pas_transversal:")
climite1 = c_int(limite1)
climite2 = c_int(limite2)
cpas = c_double(pas)
clplan = c_bool(lplan)
clm = c_int(lm)
clineaire = c_bool(lineaire)
cdirectrice1 = create_string_buffer(directrice1.encode())
cdirectrice2 = create_string_buffer(directrice2.encode())
c_interpolate_profils_pas_transversal(
byref(climite1), byref(climite2),
cdirectrice1, cdirectrice2,
byref(cpas), byref(clplan),
byref(clm), byref(clineaire)
)
def update_pk(directrice):
logger.info("! call update_pk:")
cdirectrice = create_string_buffer(directrice.encode())
c_update_pk(cdirectrice)
def output_bief(name):
logger.info("! call output_bief:")
cname = create_string_buffer(name.encode())
c_output_bief(cname)
##########
# Script #
##########
class MageMesh(AScript):
name = "MageMesh"
description = "Mesh ST file to M"
def usage(self):
logger.info(
f"Usage : {self._args[0]} {self._args[1]} " +
"<SO_FILE> <ST_FILE> <STEP>"
)
def run(self):
if len(self._args) < 5:
return 1
try:
so = self._args[2]
st = self._args[3]
step = float(self._args[4])
except Exception as e:
logger.error(f"Argument format error: {e}")
return 2
try:
init_clib(so)
except Exception as e:
logger.error(f"Bindings failed: {e}")
return 3
self.meshing(st, step)
return 0
def meshing(self, st_file: str, step: float):
workdir = self.get_workdir(st_file)
file_name = st_file.rsplit(".", 1)[0]
reach_name = os.path.basename(file_name)
# Open
init_bief_from_geo_file(st_file, 0, 0)
set_bief_name(reach_name)
ns = get_nb_sections()
npts_max = max(
map(
lambda i: get_nb_points_section(i),
range(1, ns)
)
)
# Transform
st_to_m_compl(npts_max, 'rg', 'rd')
interpolate_profils_pas_transversal(
1, ns,
'un', 'np',
step
)
update_pk("un")
# Save
logger.info(f"Saved meshing geometry to {file_name}.M")
output_bief(f"{file_name}.M")
def get_workdir(self, file):
workdir = os.path.abspath(
os.path.dirname(file)
)
os.makedirs(workdir, exist_ok=True)
logger.info(f"Set working dir to {workdir}")
return workdir

View File

@ -435,7 +435,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
"", "Pamhyr(*.pamhyr)"
)
if file_name.rsplit(".", 1)[-1] == ".pamhyr":
if file_name.rsplit(".", 1)[-1] == ".pamhyr":
self._study.filename = file_name
else:
self._study.filename = file_name + ".pamhyr"