Skip to content
Snippets Groups Projects
Commit 17fbf061 authored by Maryshca's avatar Maryshca
Browse files

v0

parent 1840b9a4
No related branches found
No related tags found
No related merge requests found
File deleted
File deleted
No preview for this file type
......@@ -43,9 +43,7 @@ time
grid
{
type = "uniform"; # grid type = "uniform" ||
# "stretched" || "stretched-up" ||
# "z-coord-ascii"
type = "uniform"; # type = "uniform" || "stretched" || "stretched-up" || "z-coord-ascii"
filename = "z-coord.txt"; # argument for type = "z-coord-ascii"
......
......@@ -2,21 +2,32 @@ import re
import subprocess
class ConfigManager:
def __init__(self, file_path, func):
self.file_path = file_path
def __init__(self, func):
self.file_path = ""
self.get_value_func = func
self.lines = []
self.config_data = {}
def is_initialized(self):
return self.file_path != ""
def init(self, file_path):
self.lines = []
self.config_data = {}
self.parse_config()
self.file_path = file_path
def parse_config(self):
output = subprocess.run(["config-parser/parser-cli", self.file_path], capture_output=True, text=True)
for line in output.stdout.split("\n"):
match = re.match(r" > (\w+) '(.*)' = *(.*)", line)
if match:
value_type, path, value = match.groups()
self.lines.append(match.groups())
def construct_dict(self):
if self.config_data:
return
for value_type, path, value in self.lines:
nss = path.split(".")
cur_ns = self.config_data
......@@ -40,6 +51,13 @@ class ConfigManager:
return '0.0'
elif value_type == 'BOOLEAN':
return 'false'
else:
if value_type == 'STRING':
return f'"{value}"'
elif value_type == 'BOOLEAN':
return str(value).lower()
elif value_type == 'DOUBLE':
return "{:.7f}".format(value)
return str(value)
def write_namespace(self, file, ns, ns_name, indent):
......@@ -54,9 +72,11 @@ class ConfigManager:
file.write(" " * indent + "}\n")
file.write("\n")
def save_config(self, file_path=None):
if not file_path:
file_path = self.file_path
def save(self):
self.save_as(self.file_path)
def save_as(self, file_path):
self.construct_dict()
indent = 0
with open(file_path, "w", encoding="utf-8") as file:
......@@ -66,8 +86,6 @@ class ConfigManager:
else:
file.write(f"{key} = {self.get_value_str(*self.config_data[key])};\n")
file_path = "config.txt"
cfg_manager = ConfigManager(file_path, lambda p, t: t[0])
cfg_manager.save_config("config_my.txt")
\ No newline at end of file
# file_path = "config.txt"
# cfg_manager = ConfigManager(file_path, lambda p, t: t[0])
# cfg_manager.save_config("config_my.txt")
\ No newline at end of file
MAIN_DIR = S;
domain
{
x = D;
y = D;
z = D;
length = D;
width = D;
height = D;
}
time
{
begin = D;
end = D;
dt = D;
calendar
{
mode = S;
year = I;
month = I;
day = I;
hour = I;
min = I;
sec = D;
UTC_offset = I;
}
}
grid
{
type = S;
filename = S;
cx = I;
cy = I;
cz = I;
ksi_z = D;
adaptive
{
beta = D;
dz_min = D;
dz_max = D;
TKE_threshold_coeff = D;
hbl_max_coeff = D;
C_smooth_coeff = D;
nskip = I;
}
}
mpi_setup
{
dimx = I;
dimy = I;
dimz = I;
}
phys
{
f = D;
nu = D;
xi = D;
rho_ref = D;
g = D;
Theta_ref = D;
beta = D;
}
topography
{
mode = S;
npatch = I;
patch_1
{
type = S;
xmin = D;
xmax = D;
ymin = D;
ymax = D;
height = D;
xperiod = D;
yperiod = D;
}
}
geo_wind
{
U = D;
V = D;
}
external_pressure_grad
{
dPdx = D;
}
surface
{
Theta
{
mode = S;
value = D;
}
Qhum
{
mode = S;
}
z0_m = D;
z0_h = D;
kappa = D;
Pr_t_0 = D;
Cm = D;
Ch = D;
alpha_m = D;
alpha_h = D;
lhflux_alpha = D;
lhflux_beta = D;
}
initial_conditions
{
Theta
{
mode = S;
surface_value = D;
height = D;
grad_z = D;
}
Qhum
{
mode = S;
surface_value = D;
height = D;
grad_z = D;
}
}
damping
{
is_enabled = B;
f = D;
z1 = D;
z2 = D;
}
les
{
is_dynamic_momentum = B;
is_dynamic_scalar = B;
is_ssm_mixed_momentum = B;
is_ssm_mixed_scalar = B;
is_amd_model = B;
C_ssm_momentum = D;
C_ssm_scalar = D;
C_smag = D;
Prandtl_sgs = D;
dynamic
{
C_smag_max = D;
Prandtl_sgs_min = D;
alpha = D;
avg_mode = S;
nskip = I;
use_transport = B;
C_T_lagrange_momentum = D;
C_T_lagrange_scalar = D;
}
base_filter_reset = B;
test_filter_reset = B;
clip_filter_reset = B;
}
passive_tracers
{
tracer_1
{
diffusivity = D;
surface
{
flux = D;
xmin = D;
xmax = D;
ymin = D;
ymax = D;
begin = D;
}
}
tracer_2
{
diffusivity = D;
surface
{
flux = D;
begin = D;
}
}
}
ptcl
{
is_passive_transport = B;
density = D;
diameter = D;
g = D;
nsources = I;
source_1
{
n = I;
begin = D;
end = D;
xmin = D;
xmax = D;
ymin = D;
ymax = D;
zmin = D;
zmax = D;
}
nsinks = I;
sink_1
{
mode = S;
xmin = D;
xmax = D;
ymin = D;
ymax = D;
zmin = D;
zmax = D;
}
}
ptcl_track
{
is_passive_transport = B;
density = D;
diameter = D;
g = D;
group_max_size = I;
max_memory = I;
nsources = I;
source_1
{
n = I;
begin = D;
xmin = D;
xmax = D;
ymin = D;
ymax = D;
zmin = D;
zmax = D;
}
nsinks = I;
}
canopy
{
Cd = D;
drag_type = S;
num = I;
patch_1
{
type = S;
xmin = D;
xmax = D;
ymin = D;
ymax = D;
zmin = D;
zmax = D;
LAI = D;
}
}
poisson
{
retol = D;
abstol = D;
miniters = I;
maxiters = I;
piters = I;
multigrid
{
ngrid = I;
down_iters = I;
up_iters = I;
direct_iters = I;
smooth_up_omega = D;
smooth_up_omega_fine = D;
}
}
output
{
DIR = S;
make_unique_DIR = B;
convert_dsq_to_tecplot = B;
num = I;
unit_1
{
SUBDIR = S;
begin = D;
dt = D;
xmin = D;
xmax = D;
ymin = D;
ymax = D;
zmin = D;
zmax = D;
cntrl_avgxy_plt = B;
cntrl_avgxy_netcdf = B;
cntrl_3d_plt = B;
cntrl_3d_bin = B;
cntrl_3d_netcdf = B;
cntrl_geometry_3d_plt = B;
cntrl_geometry_3d_netcdf = B;
cntrl_topography_plt = B;
cntrl_topography_netcdf = B;
cntrl_2d_plt = B;
cntrl_2d_netcdf = B;
cntrl_surface_plt = B;
cntrl_surface_netcdf = B;
cntrl_grid_plt = B;
cntrl_grid_netcdf = B;
cntrl_meteo_avgxy_plt = B;
cntrl_meteo_all_plt = B;
cntrl_filtered_3d_plt = B;
spectrum
{
x_cntrl = B;
y_cntrl = B;
xy_cntrl = B;
z_1 = D;
z_2 = D;
}
cntrl_ptcl_bin = B;
cntrl_ptcl_plt = B;
cntrl_ptcl_coords_plt = B;
cntrl_ptcl_traj_bin = B;
cntrl_ptcl_traj_plt = B;
x_profile_num = I;
y_profile_num = I;
z_profile_num = I;
x_profile_1
{
y = D;
z = D;
}
xy_slice_num = I;
xz_slice_num = I;
yz_slice_num = I;
xy_slice_1
{
z = D;
}
}
screen
{
begin = D;
dt = D;
}
}
checkup
{
begin = D;
nskip = I;
}
dump
{
DIR = S;
begin = D;
dt = D;
}
startup
{
DIR = S;
}
series
{
begin = D;
dt = D;
point_set
{
point_1
{
x = D;
y = D;
z = D;
}
point_2
{
x = D;
y = D;
z = D;
}
point_3
{
x = D;
y = D;
z = D;
}
}
energy_avgxy_set
{
z_1 = D;
z_2 = D;
}
flux_avgxy_set
{
z_1 = D;
z_2 = D;
}
}
spectrum_series
{
begin = D;
nskip = I;
unit_1
{
zp = D;
kxmax = I;
kymax = I;
}
unit_2
{
zp = D;
kxmax = I;
kymax = I;
}
unit_3
{
zp = D;
kxmax = I;
kymax = I;
}
}
time_scan
{
begin = D;
dt = D;
cntrl_grid = B;
cntrl_avgxy = B;
cntrl_z_profile = B;
z_profile_num = I;
z_profile_1
{
x = D;
y = D;
}
}
stats
{
num = I;
unit_1
{
begin = D;
end = D;
nskip = I;
axis = S;
type = S;
output
{
SUBDIR = S;
}
dump
{
SUBDIR = S;
}
}
unit_2
{
begin = D;
end = D;
nskip = I;
axis = S;
type = S;
output
{
SUBDIR = S;
}
dump
{
SUBDIR = S;
}
}
}
pdf
{
unit_1
{
begin = D;
end = D;
dt = D;
zp = D;
output
{
SUBDIR = S;
}
dump
{
SUBDIR = S;
}
cntrl_default = B;
nbins_default = I;
reset_time = D;
reset_safety = D;
}
}
joint_pdf
{
unit_1
{
begin = D;
end = D;
dt = D;
zp = D;
output
{
SUBDIR = S;
}
dump
{
SUBDIR = S;
}
cntrl_default = B;
nxbins_default = I;
nybins_default = I;
reset_time = D;
reset_safety = D;
}
}
runtime_filter
{
mark = D;
unit_1
{
mode = S;
is_remove_mean = B;
kxmin = I;
kxmax = I;
kymin = I;
kymax = I;
}
unit_2
{
mode = S;
is_remove_mean = B;
kxmin = I;
kxmax = I;
kymin = I;
kymax = I;
}
}
> STRING 'MAIN_DIR' =
> DOUBLE 'domain.x' = 0.000000
> DOUBLE 'domain.y' = 0.000000
> DOUBLE 'domain.z' = 0.000000
> DOUBLE 'domain.length' = 400.000000
> DOUBLE 'domain.width' = 200.000000
> DOUBLE 'domain.height' = 80.000000
> DOUBLE 'time.begin' = 0.000000
> DOUBLE 'time.end' = 180000.000000
> DOUBLE 'time.dt' = 0.200000
> STRING 'time.calendar.mode' = local
> INT 'time.calendar.year' = 2020
> INT 'time.calendar.month' = 9
> INT 'time.calendar.day' = 1
> INT 'time.calendar.hour' = 12
> INT 'time.calendar.min' = 0
> DOUBLE 'time.calendar.sec' = 0.000000
> INT 'time.calendar.UTC_offset' = 3
> STRING 'grid.type' = uniform
> STRING 'grid.filename' = z-coord.txt
> INT 'grid.cx' = 80
> INT 'grid.cy' = 40
> INT 'grid.cz' = 16
> DOUBLE 'grid.ksi_z' = 1.200000
> DOUBLE 'grid.adaptive.beta' = 0.300000
> DOUBLE 'grid.adaptive.dz_min' = 1.250000
> DOUBLE 'grid.adaptive.dz_max' = 20.000000
> DOUBLE 'grid.adaptive.TKE_threshold_coeff' = 0.100000
> DOUBLE 'grid.adaptive.hbl_max_coeff' = 1.100000
> DOUBLE 'grid.adaptive.C_smooth_coeff' = 5.000000
> INT 'grid.adaptive.nskip' = 1
> INT 'mpi_setup.dimx' = 2
> INT 'mpi_setup.dimy' = 2
> INT 'mpi_setup.dimz' = 1
> DOUBLE 'phys.f' = 0.000000
> DOUBLE 'phys.nu' = 0.000013
> DOUBLE 'phys.xi' = 0.000018
> DOUBLE 'phys.rho_ref' = 1.250000
> DOUBLE 'phys.g' = 9.810000
> DOUBLE 'phys.Theta_ref' = 288.150000
> DOUBLE 'phys.beta' = 0.000000
> STRING 'topography.mode' = hand
> INT 'topography.npatch' = 1
> STRING 'topography.patch_1.type' = box
> DOUBLE 'topography.patch_1.xmin' = 15.000000
> DOUBLE 'topography.patch_1.xmax' = 35.000000
> DOUBLE 'topography.patch_1.ymin' = 10.000000
> DOUBLE 'topography.patch_1.ymax' = 90.000000
> DOUBLE 'topography.patch_1.height' = 20.000000
> DOUBLE 'topography.patch_1.xperiod' = 50.000000
> DOUBLE 'topography.patch_1.yperiod' = 100.000000
> DOUBLE 'geo_wind.U' = 0.000000
> DOUBLE 'geo_wind.V' = 0.000000
> DOUBLE 'external_pressure_grad.dPdx' = -0.000400
> STRING 'surface.Theta.mode' = const
> DOUBLE 'surface.Theta.value' = 288.150000
> STRING 'surface.Qhum.mode' = lsm
> DOUBLE 'surface.z0_m' = 0.100000
> DOUBLE 'surface.z0_h' = 0.100000
> DOUBLE 'surface.kappa' = 0.400000
> DOUBLE 'surface.Pr_t_0' = 1.000000
> DOUBLE 'surface.Cm' = 4.800000
> DOUBLE 'surface.Ch' = 7.800000
> DOUBLE 'surface.alpha_m' = 16.000000
> DOUBLE 'surface.alpha_h' = 16.000000
> DOUBLE 'surface.lhflux_alpha' = 1.000000
> DOUBLE 'surface.lhflux_beta' = 0.025000
> STRING 'initial_conditions.Theta.mode' = const
> DOUBLE 'initial_conditions.Theta.surface_value' = 288.150000
> DOUBLE 'initial_conditions.Theta.height' = 0.000000
> DOUBLE 'initial_conditions.Theta.grad_z' = 0.000000
> STRING 'initial_conditions.Qhum.mode' = mixed-layer
> DOUBLE 'initial_conditions.Qhum.surface_value' = 0.002500
> DOUBLE 'initial_conditions.Qhum.height' = 0.000000
> DOUBLE 'initial_conditions.Qhum.grad_z' = 0.000000
> BOOLEAN 'damping.is_enabled' = false
> DOUBLE 'damping.f' = 0.200000
> DOUBLE 'damping.z1' = 60.000000
> DOUBLE 'damping.z2' = 80.000000
> BOOLEAN 'les.is_dynamic_momentum' = true
> BOOLEAN 'les.is_dynamic_scalar' = true
> BOOLEAN 'les.is_ssm_mixed_momentum' = false
> BOOLEAN 'les.is_ssm_mixed_scalar' = false
> BOOLEAN 'les.is_amd_model' = false
> DOUBLE 'les.C_ssm_momentum' = 1.000000
> DOUBLE 'les.C_ssm_scalar' = 1.000000
> DOUBLE 'les.C_smag' = 0.080000
> DOUBLE 'les.Prandtl_sgs' = 0.700000
> DOUBLE 'les.dynamic.C_smag_max' = 0.250000
> DOUBLE 'les.dynamic.Prandtl_sgs_min' = 0.400000
> DOUBLE 'les.dynamic.alpha' = 1.730000
> STRING 'les.dynamic.avg_mode' = lagrange
> INT 'les.dynamic.nskip' = 3
> BOOLEAN 'les.dynamic.use_transport' = false
> DOUBLE 'les.dynamic.C_T_lagrange_momentum' = 1.500000
> DOUBLE 'les.dynamic.C_T_lagrange_scalar' = 3.000000
> BOOLEAN 'les.base_filter_reset' = false
> BOOLEAN 'les.test_filter_reset' = false
> BOOLEAN 'les.clip_filter_reset' = false
> DOUBLE 'passive_tracers.tracer_1.diffusivity' = 0.000018
> DOUBLE 'passive_tracers.tracer_1.surface.flux' = -0.010000
> DOUBLE 'passive_tracers.tracer_1.surface.xmin' = 180.000000
> DOUBLE 'passive_tracers.tracer_1.surface.xmax' = 220.000000
> DOUBLE 'passive_tracers.tracer_1.surface.ymin' = 180.000000
> DOUBLE 'passive_tracers.tracer_1.surface.ymax' = 220.000000
> DOUBLE 'passive_tracers.tracer_1.surface.begin' = 25200.000000
> DOUBLE 'passive_tracers.tracer_2.diffusivity' = 0.000018
> DOUBLE 'passive_tracers.tracer_2.surface.flux' = -0.020000
> DOUBLE 'passive_tracers.tracer_2.surface.begin' = 25200.000000
> BOOLEAN 'ptcl.is_passive_transport' = false
> DOUBLE 'ptcl.density' = 1000.000000
> DOUBLE 'ptcl.diameter' = 0.000001
> DOUBLE 'ptcl.g' = -9.810000
> INT 'ptcl.nsources' = 1
> INT 'ptcl.source_1.n' = 4194304
> DOUBLE 'ptcl.source_1.begin' = 18000.000000
> DOUBLE 'ptcl.source_1.end' = 180000.000000
> DOUBLE 'ptcl.source_1.xmin' = 40.000000
> DOUBLE 'ptcl.source_1.xmax' = 60.000000
> DOUBLE 'ptcl.source_1.ymin' = 0.000000
> DOUBLE 'ptcl.source_1.ymax' = 200.000000
> DOUBLE 'ptcl.source_1.zmin' = 0.000000
> DOUBLE 'ptcl.source_1.zmax' = 5.000000
> INT 'ptcl.nsinks' = 1
> STRING 'ptcl.sink_1.mode' = outside
> DOUBLE 'ptcl.sink_1.xmin' = 0.000000
> DOUBLE 'ptcl.sink_1.xmax' = 400.000000
> DOUBLE 'ptcl.sink_1.ymin' = -100.000000
> DOUBLE 'ptcl.sink_1.ymax' = 300.000000
> DOUBLE 'ptcl.sink_1.zmin' = 0.010000
> DOUBLE 'ptcl.sink_1.zmax' = 80.000000
> BOOLEAN 'ptcl_track.is_passive_transport' = false
> DOUBLE 'ptcl_track.density' = 1000.000000
> DOUBLE 'ptcl_track.diameter' = 0.000001
> DOUBLE 'ptcl_track.g' = -9.810000
> INT 'ptcl_track.group_max_size' = 256
> INT 'ptcl_track.max_memory' = 10485760
> INT 'ptcl_track.nsources' = 1
> INT 'ptcl_track.source_1.n' = 128
> DOUBLE 'ptcl_track.source_1.begin' = 28800.000000
> DOUBLE 'ptcl_track.source_1.xmin' = 160.000000
> DOUBLE 'ptcl_track.source_1.xmax' = 240.000000
> DOUBLE 'ptcl_track.source_1.ymin' = 80.000000
> DOUBLE 'ptcl_track.source_1.ymax' = 120.000000
> DOUBLE 'ptcl_track.source_1.zmin' = 0.000000
> DOUBLE 'ptcl_track.source_1.zmax' = 8.000000
> INT 'ptcl_track.nsinks' = 0
> DOUBLE 'canopy.Cd' = 0.150000
> STRING 'canopy.drag_type' = non-linear
> INT 'canopy.num' = 0
> STRING 'canopy.patch_1.type' = sharp
> DOUBLE 'canopy.patch_1.xmin' = 0.000000
> DOUBLE 'canopy.patch_1.xmax' = 400.000000
> DOUBLE 'canopy.patch_1.ymin' = 0.000000
> DOUBLE 'canopy.patch_1.ymax' = 200.000000
> DOUBLE 'canopy.patch_1.zmin' = 0.000000
> DOUBLE 'canopy.patch_1.zmax' = 50.000000
> DOUBLE 'canopy.patch_1.LAI' = 1.000000
> DOUBLE 'poisson.retol' = 0.000100
> DOUBLE 'poisson.abstol' = 0.000010
> INT 'poisson.miniters' = 1
> INT 'poisson.maxiters' = 100
> INT 'poisson.piters' = 1
> INT 'poisson.multigrid.ngrid' = 5
> INT 'poisson.multigrid.down_iters' = 2
> INT 'poisson.multigrid.up_iters' = 3
> INT 'poisson.multigrid.direct_iters' = 5
> DOUBLE 'poisson.multigrid.smooth_up_omega' = 1.840000
> DOUBLE 'poisson.multigrid.smooth_up_omega_fine' = 1.640000
> STRING 'output.DIR' = output/
> BOOLEAN 'output.make_unique_DIR' = true
> BOOLEAN 'output.convert_dsq_to_tecplot' = true
> INT 'output.num' = 1
> STRING 'output.unit_1.SUBDIR' =
> DOUBLE 'output.unit_1.begin' = 3600.000000
> DOUBLE 'output.unit_1.dt' = 3600.000000
> DOUBLE 'output.unit_1.xmin' = 0.000000
> DOUBLE 'output.unit_1.xmax' = 400.000000
> DOUBLE 'output.unit_1.ymin' = 0.000000
> DOUBLE 'output.unit_1.ymax' = 200.000000
> DOUBLE 'output.unit_1.zmin' = 0.000000
> DOUBLE 'output.unit_1.zmax' = 80.000000
> BOOLEAN 'output.unit_1.cntrl_avgxy_plt' = true
> BOOLEAN 'output.unit_1.cntrl_avgxy_netcdf' = false
> BOOLEAN 'output.unit_1.cntrl_3d_plt' = true
> BOOLEAN 'output.unit_1.cntrl_3d_bin' = false
> BOOLEAN 'output.unit_1.cntrl_3d_netcdf' = false
> BOOLEAN 'output.unit_1.cntrl_geometry_3d_plt' = false
> BOOLEAN 'output.unit_1.cntrl_geometry_3d_netcdf' = false
> BOOLEAN 'output.unit_1.cntrl_topography_plt' = true
> BOOLEAN 'output.unit_1.cntrl_topography_netcdf' = false
> BOOLEAN 'output.unit_1.cntrl_2d_plt' = false
> BOOLEAN 'output.unit_1.cntrl_2d_netcdf' = false
> BOOLEAN 'output.unit_1.cntrl_surface_plt' = true
> BOOLEAN 'output.unit_1.cntrl_surface_netcdf' = false
> BOOLEAN 'output.unit_1.cntrl_grid_plt' = false
> BOOLEAN 'output.unit_1.cntrl_grid_netcdf' = false
> BOOLEAN 'output.unit_1.cntrl_meteo_avgxy_plt' = false
> BOOLEAN 'output.unit_1.cntrl_meteo_all_plt' = false
> BOOLEAN 'output.unit_1.cntrl_filtered_3d_plt' = false
> BOOLEAN 'output.unit_1.spectrum.x_cntrl' = true
> BOOLEAN 'output.unit_1.spectrum.y_cntrl' = true
> BOOLEAN 'output.unit_1.spectrum.xy_cntrl' = true
> DOUBLE 'output.unit_1.spectrum.z_1' = 50.000000
> DOUBLE 'output.unit_1.spectrum.z_2' = 100.000000
> BOOLEAN 'output.unit_1.cntrl_ptcl_bin' = false
> BOOLEAN 'output.unit_1.cntrl_ptcl_plt' = true
> BOOLEAN 'output.unit_1.cntrl_ptcl_coords_plt' = false
> BOOLEAN 'output.unit_1.cntrl_ptcl_traj_bin' = false
> BOOLEAN 'output.unit_1.cntrl_ptcl_traj_plt' = false
> INT 'output.unit_1.x_profile_num' = 0
> INT 'output.unit_1.y_profile_num' = 0
> INT 'output.unit_1.z_profile_num' = 0
> DOUBLE 'output.unit_1.x_profile_1.y' = 100.000000
> DOUBLE 'output.unit_1.x_profile_1.z' = 40.000000
> INT 'output.unit_1.xy_slice_num' = 0
> INT 'output.unit_1.xz_slice_num' = 0
> INT 'output.unit_1.yz_slice_num' = 0
> DOUBLE 'output.unit_1.xy_slice_1.z' = 40.000000
> DOUBLE 'output.screen.begin' = 0.000000
> DOUBLE 'output.screen.dt' = 180.000000
> DOUBLE 'checkup.begin' = 0.000000
> INT 'checkup.nskip' = 3600
> STRING 'dump.DIR' = dump/
> DOUBLE 'dump.begin' = 36000.000000
> DOUBLE 'dump.dt' = 36000.000000
> STRING 'startup.DIR' = init/
> DOUBLE 'series.begin' = 60.000000
> DOUBLE 'series.dt' = 1.000000
> DOUBLE 'series.point_set.point_1.x' = 200.000000
> DOUBLE 'series.point_set.point_1.y' = 100.000000
> DOUBLE 'series.point_set.point_1.z' = 25.000000
> DOUBLE 'series.point_set.point_2.x' = 200.000000
> DOUBLE 'series.point_set.point_2.y' = 100.000000
> DOUBLE 'series.point_set.point_2.z' = 50.000000
> DOUBLE 'series.point_set.point_3.x' = 200.000000
> DOUBLE 'series.point_set.point_3.y' = 100.000000
> DOUBLE 'series.point_set.point_3.z' = 100.000000
> DOUBLE 'series.energy_avgxy_set.z_1' = 50.000000
> DOUBLE 'series.energy_avgxy_set.z_2' = 100.000000
> DOUBLE 'series.flux_avgxy_set.z_1' = 50.000000
> DOUBLE 'series.flux_avgxy_set.z_2' = 100.000000
> DOUBLE 'spectrum_series.begin' = 0.000000
> INT 'spectrum_series.nskip' = 1
> DOUBLE 'spectrum_series.unit_1.zp' = 24.000000
> INT 'spectrum_series.unit_1.kxmax' = 3
> INT 'spectrum_series.unit_1.kymax' = 3
> DOUBLE 'spectrum_series.unit_2.zp' = 16.000000
> INT 'spectrum_series.unit_2.kxmax' = 3
> INT 'spectrum_series.unit_2.kymax' = 3
> DOUBLE 'spectrum_series.unit_3.zp' = 8.000000
> INT 'spectrum_series.unit_3.kxmax' = 3
> INT 'spectrum_series.unit_3.kymax' = 3
> DOUBLE 'time_scan.begin' = 60.000000
> DOUBLE 'time_scan.dt' = 60.000000
> BOOLEAN 'time_scan.cntrl_grid' = false
> BOOLEAN 'time_scan.cntrl_avgxy' = true
> BOOLEAN 'time_scan.cntrl_z_profile' = false
> INT 'time_scan.z_profile_num' = 0
> DOUBLE 'time_scan.z_profile_1.x' = 200.000000
> DOUBLE 'time_scan.z_profile_1.y' = 100.000000
> INT 'stats.num' = 2
> DOUBLE 'stats.unit_1.begin' = 165600.000000
> DOUBLE 'stats.unit_1.end' = 180000.000000
> INT 'stats.unit_1.nskip' = 10
> STRING 'stats.unit_1.axis' = XYZ
> STRING 'stats.unit_1.type' = energy-eq
> STRING 'stats.unit_1.output.SUBDIR' = stat_end/
> STRING 'stats.unit_1.dump.SUBDIR' = stat_end/
> DOUBLE 'stats.unit_2.begin' = 151200.000000
> DOUBLE 'stats.unit_2.end' = 165600.000000
> INT 'stats.unit_2.nskip' = 10
> STRING 'stats.unit_2.axis' = XYZ
> STRING 'stats.unit_2.type' = energy-eq
> STRING 'stats.unit_2.output.SUBDIR' = stat_end-1/
> STRING 'stats.unit_2.dump.SUBDIR' = stat_end-1
> DOUBLE 'pdf.unit_1.begin' = 27000.000000
> DOUBLE 'pdf.unit_1.end' = 32400.000000
> DOUBLE 'pdf.unit_1.dt' = 1.000000
> DOUBLE 'pdf.unit_1.zp' = 20.000000
> STRING 'pdf.unit_1.output.SUBDIR' = pdf/
> STRING 'pdf.unit_1.dump.SUBDIR' = pdf/
> BOOLEAN 'pdf.unit_1.cntrl_default' = true
> INT 'pdf.unit_1.nbins_default' = 256
> DOUBLE 'pdf.unit_1.reset_time' = 28800.000000
> DOUBLE 'pdf.unit_1.reset_safety' = 0.250000
> DOUBLE 'joint_pdf.unit_1.begin' = 27000.000000
> DOUBLE 'joint_pdf.unit_1.end' = 32400.000000
> DOUBLE 'joint_pdf.unit_1.dt' = 1.000000
> DOUBLE 'joint_pdf.unit_1.zp' = 20.000000
> STRING 'joint_pdf.unit_1.output.SUBDIR' = joint-pdf/
> STRING 'joint_pdf.unit_1.dump.SUBDIR' = joint-pdf/
> BOOLEAN 'joint_pdf.unit_1.cntrl_default' = true
> INT 'joint_pdf.unit_1.nxbins_default' = 256
> INT 'joint_pdf.unit_1.nybins_default' = 256
> DOUBLE 'joint_pdf.unit_1.reset_time' = 28800.000000
> DOUBLE 'joint_pdf.unit_1.reset_safety' = 0.250000
> DOUBLE 'runtime_filter.mark' = 600.000000
> STRING 'runtime_filter.unit_1.mode' = include
> BOOLEAN 'runtime_filter.unit_1.is_remove_mean' = false
> INT 'runtime_filter.unit_1.kxmin' = 0
> INT 'runtime_filter.unit_1.kxmax' = 0
> INT 'runtime_filter.unit_1.kymin' = 0
> INT 'runtime_filter.unit_1.kymax' = 5
> STRING 'runtime_filter.unit_2.mode' = exclude
> BOOLEAN 'runtime_filter.unit_2.is_remove_mean' = false
> INT 'runtime_filter.unit_2.kxmin' = 0
> INT 'runtime_filter.unit_2.kxmax' = 10
> INT 'runtime_filter.unit_2.kymin' = 0
> INT 'runtime_filter.unit_2.kymax' = 10
\ No newline at end of file
......@@ -4,7 +4,7 @@ FONT_PATH = "D:\\fonts\\Montserrat\\static\\Montserrat-Medium.ttf"
ACCENT_COLOR = (0, 119, 200, 100)
ROUNDING = 10
SPACE = 10
INDENT = 30
INDENT = 40
class GuiStyle:
def __init__(self):
......
......@@ -10,107 +10,115 @@ class ConfigEditor:
def __init__(self):
dpg.create_context()
self.construct_main_window()
self.styles = GuiStyle()
# self.cfg_manager = ConfigManager()
self.cfg_manager = ConfigManager(self.get_value)
self.construct_main_window()
dpg.bind_font(self.styles.montserrat_font)
dpg.bind_theme(self.styles.main_theme)
self.config_data = []
dpg.create_viewport(title='config file editor', width=800, height=600)
dpg.create_viewport(title='config file editor', width=800, height=600, small_icon='icon.ico')
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.set_primary_window("main", True)
def open_file(self, sender, app_data, user_data):
def manage_file(self, sender, app_data, user_data):
file_path = app_data['file_path_name']
if user_data == "open":
if self.cfg_manager.is_initialized():
dpg.delete_item(self.cfg_manager.file_path)
if dpg.does_alias_exist(self.cfg_manager.file_path):
dpg.remove_alias(self.cfg_manager.file_path)
for _, path, _ in self.cfg_manager.lines:
namespaces = path.split('.')
for i in range(len(namespaces)):
path = '.'.join(namespaces[:i+1])
if dpg.does_alias_exist(path):
dpg.remove_alias(path)
self.cfg_manager.init(file_path)
self.construct_config_window()
elif user_data == "save_as":
self.cfg_manager.save_as(file_path)
def set_file_path(self, sender, app_data, user_data):
file_path = app_data['file_path_name']
dpg.set_value(user_data, file_path)
def get_value(self, path, value_type):
return dpg.get_value(path)
if file_path:
for line in open(file_path, 'r', encoding='utf-8'):
match = re.match(r" > (\w+) '([\w.]+)' = (.*)", line)
if match:
self.config_data.append(match.groups())
self.construct_config_window(file_path)
def open_file_dialog(self, sender, app_data, user_data):
dpg.show_item("file_dialog")
dpg.set_item_user_data("file_dialog", user_data)
def check_tabview(self, root):
for uuid in dpg.get_item_children(root, 1):
if dpg.get_item_type(uuid) == "mvAppItemType::mvTabBar":
return True, uuid
return False, None
def open_folder_dialog(self, sender, app_data, user_data):
dpg.show_item("folder_dialog")
dpg.set_item_user_data("folder_dialog", user_data)
def construct_main_window(self):
with dpg.window(label="config file editor", width=800, height=600, tag="main"):
with dpg.window(label="config file editor", width=800, height=600, tag="main", menubar=True, no_resize=False, no_close=False, no_move=False, no_collapse=False):
with dpg.menu_bar():
with dpg.menu(label="file"):
dpg.add_menu_item(label="open config file", callback=lambda _: dpg.show_item("file_dialog"), tag="open_file_btn")
dpg.add_menu_item(label="open", callback=self.open_file_dialog, tag="open_btn", user_data="open")
dpg.add_menu_item(label="save", callback=self.cfg_manager.save, tag="save_btn")
dpg.add_menu_item(label="save as", callback=self.open_file_dialog, tag="save_as_btn", user_data="save_as")
with dpg.menu(label="view"):
dpg.add_menu_item(label="use default theme", check=True, callback=lambda _, v: dpg.bind_theme(None if v else self.styles.main_theme), default_value=False)
dpg.add_menu_item(label="use default font", check=True, callback=lambda _, v: dpg.bind_font(None if v else self.styles.montserrat_font), default_value=False)
dpg.add_menu_item(label="show theme editor", callback=dpg.show_style_editor)
with dpg.file_dialog(directory_selector=False, show=False, callback=self.open_file, tag="file_dialog", width=500, height=400):
with dpg.menu(label="settings"):
dpg.add_menu_item(label="auto save [not impl]", check=True, callback=lambda: print("TODO"), default_value=False)
with dpg.file_dialog(directory_selector=False, show=False, callback=self.manage_file, tag="file_dialog", width=500, height=400):
dpg.add_file_extension(".txt", color=(0, 255, 0, 255))
dpg.add_file_extension(".*", color=(255, 255, 255, 255))
def construct_config_window(self, filename):
for var_type, full_path, value in self.config_data:
namespaces = full_path.split('.')
root = "main"
for level in range(len(namespaces) - 1):
path = '.'.join(namespaces[:level+1])
if not dpg.does_item_exist(path):
dpg.add_collapsing_header(label=namespaces[level], parent=root, tag=path, indent=INDENT)
root = path
with dpg.file_dialog(directory_selector=True, show=False, callback=self.set_file_path, tag="folder_dialog", width=500, height=400):
dpg.add_file_extension(".*", color=(255, 255, 255, 255))
self.create_widget('.'.join(namespaces[:-1]), namespaces[-1], value, var_type)
def construct_config_window(self):
dpg.add_collapsing_header(label=self.cfg_manager.file_path, parent="main", tag=self.cfg_manager.file_path, indent=0, default_open=True)
def construct_config_window_tabs(self, filename):
for var_type, full_path, value in self.config_data:
for var_type, full_path, value in self.cfg_manager.lines:
namespaces = full_path.split('.')
root = "main"
parent = self.cfg_manager.file_path
for level in range(len(namespaces) - 1):
path = '.'.join(namespaces[:level+1])
tab_bar_exists, tab_bar_uuid = self.check_tabview(root)
if not tab_bar_exists:
tab_bar_uuid = dpg.add_tab_bar(parent=root, tag=f"{path}_tb")
if not dpg.does_item_exist(path):
dpg.add_tab(label=namespaces[level], parent=tab_bar_uuid, tag=f"{path}_tab")
dpg.add_child_window(parent=f"{path}_tab", tag=path, border=True, autosize_x=True, autosize_y=True)
dpg.add_collapsing_header(label=namespaces[level], parent=parent, tag=path, indent=INDENT)
root = path
parent = path
self.create_widget('.'.join(namespaces[:-1]), namespaces[-1], value, var_type)
def create_widget(self, path, key, value, value_type):
if path:
parent = path
tag = f"{path}.{key}"
else:
parent = self.cfg_manager.file_path
tag = key
with dpg.group(horizontal=True, parent=parent):
with dpg.group(horizontal=True, parent=parent, indent=INDENT):
dpg.add_text(key)
if value_type == 'BOOLEAN':
dpg.add_checkbox(default_value=(value.lower() == "true"))
dpg.add_checkbox(default_value=(value.lower() == "true"), tag=tag)
elif value_type == 'DOUBLE':
dpg.add_input_float(default_value=float(value))
dpg.add_input_double(default_value=float(value), tag=tag, format="%.10f")
elif value_type == 'INT':
dpg.add_input_int(default_value=int(value))
dpg.add_input_int(default_value=int(value), tag=tag)
elif "dir" in key.lower():
dpg.add_input_text(default_value=value, tag=f"{path}.{key}")
dpg.add_button(label="...", callback=lambda s, a, u: self.file_dialog(f"{path}.{key}"))
dpg.add_input_text(default_value=value, tag=tag)
dpg.add_button(label="...", callback=self.open_folder_dialog, user_data=tag)
else:
dpg.add_input_text(default_value=value)
def file_dialog(self, var_tag):
with dpg.file_dialog(directory_selector=True, show=True, callback=lambda s, a, u: dpg.set_value(var_tag, a['file_path_name'])):
dpg.add_file_extension(".*", color=(255, 255, 255, 255))
dpg.add_input_text(default_value=value, tag=tag)
def run(self):
dpg.start_dearpygui()
......
import dearpygui.dearpygui as dpg
import re
import ctypes
ctypes.windll.shcore.SetProcessDpiAwareness(1)
FONT_PATH = "D:\\fonts\\Montserrat\\static\\Montserrat-Medium.ttf"
class ConfigEditor:
def __init__(self):
self.config_data = {}
dpg.create_context()
with dpg.window(label="Config File Editor", width=800, height=600, tag="main"):
dpg.add_button(label="Open Config File", callback=self.open_file_dialog)
with dpg.file_dialog(directory_selector=False, show=False, callback=self.open_file, tag="file_dialog", width=700 ,height=400):
dpg.add_file_extension(".txt", color=(0, 255, 0, 255))
dpg.add_file_extension(".*", color=(255, 255, 255, 255))
with dpg.font_registry():
default_font = dpg.add_font(FONT_PATH, 30)
second_font = dpg.add_font(FONT_PATH, 15)
dpg.bind_font(default_font)
with dpg.theme() as global_theme:
with dpg.theme_component(dpg.mvAll):
dpg.add_theme_color(dpg.mvThemeCol_Separator, (255, 0, 0), category=dpg.mvThemeCat_Core)
dpg.add_theme_style(dpg.mvStyleVar_ChildRounding, 5, category=dpg.mvThemeCat_Core)
dpg.add_theme_style(dpg.mvStyleVar_ItemSpacing, 10, 10, category=dpg.mvThemeCat_Core)
dpg.add_theme_style(dpg.mvStyleVar_ItemInnerSpacing, 10, 10, category=dpg.mvThemeCat_Core)
dpg.add_theme_style(dpg.mvStyleVar_WindowPadding, 10, 10, category=dpg.mvThemeCat_Core)
dpg.add_theme_style(dpg.mvStyleVar_FramePadding, 10, 10, category=dpg.mvThemeCat_Core)
with dpg.theme() as self.tab_theme:
with dpg.theme_component(dpg.mvAll):
# dpg.add_theme_color(dpg.mvThemeCol_ChildBg, (255, 0, 255), category=dpg.mvThemeCat_Core)
dpg.add_theme_style(dpg.mvStyleVar_ChildBorderSize, 3, category=dpg.mvThemeCat_Core)
# with dpg.theme_component(dpg.mvInputInt):
# dpg.add_theme_color(dpg.mvThemeCol_FrameBg, (100, 150, 100), category=dpg.mvThemeCat_Core)
# dpg.add_theme_style(dpg.mvStyleVar_FrameRounding, 5, category=dpg.mvThemeCat_Core)
dpg.bind_theme(global_theme)
dpg.show_style_editor()
# dpg.set_global_font_scale(2.0)
dpg.create_viewport(title='Config File Editor', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.set_primary_window("main", True)
self.tabs = {}
self.rows = {}
def open_file_dialog(self):
dpg.show_item("file_dialog")
def open_file(self, sender, app_data, user_data):
file_path = app_data['file_path_name']
if file_path:
self.parse_config(file_path)
def check_tabview(self, root):
for uuid in dpg.get_item_children(root, 1):
if dpg.get_item_type(uuid) == "mvAppItemType::mvTabBar":
return True, uuid
return False, None
def parse_config(self, filename):
for widget in dpg.get_item_children("main", 1):
dpg.delete_item(widget)
with open(filename, 'r', encoding='utf-8') as file:
lines = file.readlines()
output = ''.join(lines)
lines = output.splitlines()
for line in lines:
match = re.match(r" > (\w+) '([\w.]+)' = (.*)", line)
if match:
var_type, full_path, value = match.groups()
namespaces = full_path.split('.')
root = "main"
for level in range(len(namespaces) - 1):
path = '.'.join(namespaces[:level+1])
# tab_bar_exists, tab_bar_uuid = self.check_tabview(root)
# if not tab_bar_exists:
# tab_bar_uuid = dpg.add_tab_bar(parent=root, tag=f"{path}_tb")
# dpg.add_separator(parent=root)
print(path)
if not dpg.does_item_exist(path):
print("here")
# dpg.add_tab(label=namespaces[level], parent=tab_bar_uuid, tag=f"{path}_tab")
dpg.add_child_window(parent=root, tag=path, height=300, border=True, menubar=True, autosize_x=True)
dpg.add_menu_bar(parent=path, tag=f"{path}_menu")
dpg.add_menu(label=namespaces[level], parent=f"{path}_menu")
dpg.bind_item_theme(path, self.tab_theme)
root = path
self.create_widget('.'.join(namespaces[:-1]), namespaces[-1], value, var_type)
def create_widget(self, path, key, value, value_type):
parent = path
with dpg.group(horizontal=True, parent=parent):
dpg.add_text(key)
if value_type == 'BOOLEAN':
dpg.add_checkbox(default_value=(value.lower() == "true"))
elif value.replace(".", "", 1).isdigit():
dpg.add_input_float(default_value=float(value))
elif "dir" in key.lower():
dpg.add_input_text(default_value=value, tag=f"{path}.{key}")
dpg.add_button(label="...", callback=lambda s, a, u: self.file_dialog(f"{path}.{key}"))
else:
dpg.add_input_text(default_value=value)
def file_dialog(self, var_tag):
with dpg.file_dialog(directory_selector=False, show=True, callback=lambda s, a, u: dpg.set_value(var_tag, a['file_path_name'])):
dpg.add_file_extension(".*", color=(255, 255, 255, 255))
def run(self):
dpg.start_dearpygui()
dpg.destroy_context()
if __name__ == "__main__":
app = ConfigEditor()
app.run()
icon.ico 0 → 100644
icon.ico

169 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment