From abb1d9a0c78bd6a2db37ff2feb322090c5e68eb3 Mon Sep 17 00:00:00 2001 From: Huidae Cho Date: Thu, 14 Mar 2024 04:58:29 -0600 Subject: [PATCH 1/4] d.mon: Delegate rendering to wx monitors --- display/d.mon/render_cmd.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/display/d.mon/render_cmd.py b/display/d.mon/render_cmd.py index e9af69e673c..dc4f90988cf 100644 --- a/display/d.mon/render_cmd.py +++ b/display/d.mon/render_cmd.py @@ -2,6 +2,7 @@ import os import sys import tempfile +from pathlib import Path from grass.script import core as grass from grass.script import task as gtask @@ -56,7 +57,6 @@ def update_cmd_file(cmd_file, cmd, mapfile): "d.info", "d.mon", "d.out.file", - "d.redraw", "d.to.rast", "d.what.rast", "d.what.vect", @@ -157,13 +157,18 @@ def read_stdin(cmd): mapfile += ".png" else: mapfile += ".ppm" + # to force rendering by wx monitors + Path(mapfile).touch() else: mapfile = None adjust_region(width, height) read_stdin(cmd) - render(cmd, mapfile) + # wx monitors will render new layers internally + if not mon.startswith("wx"): + render(cmd, mapfile) + update_cmd_file(os.path.join(path, "cmd"), cmd, mapfile) if cmd[0] == "d.erase" and os.path.exists(legfile): os.remove(legfile) From 6157f9f5122d48f361de5be86fe7f434ce7fff43 Mon Sep 17 00:00:00 2001 From: Huidae Cho Date: Thu, 14 Mar 2024 13:41:14 -0600 Subject: [PATCH 2/4] Allow non-rendering modules to run --- display/d.mon/render_cmd.py | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/display/d.mon/render_cmd.py b/display/d.mon/render_cmd.py index dc4f90988cf..0a50d14e37d 100644 --- a/display/d.mon/render_cmd.py +++ b/display/d.mon/render_cmd.py @@ -8,6 +8,20 @@ from grass.script import task as gtask from grass.exceptions import CalledModuleError +non_rendering_modules = ( + "d.colorlist", + "d.font", + "d.fontlist", + "d.frame", + "d.info", + "d.mon", + "d.out.file", + "d.to.rast", + "d.what.rast", + "d.what.vect", + "d.where", +) + # read environment variables from file def read_env_file(env_file): @@ -49,19 +63,7 @@ def render(cmd, mapfile): # update cmd file def update_cmd_file(cmd_file, cmd, mapfile): - if cmd[0] in ( - "d.colorlist", - "d.font", - "d.fontlist", - "d.frame", - "d.info", - "d.mon", - "d.out.file", - "d.to.rast", - "d.what.rast", - "d.what.vect", - "d.where", - ): + if cmd[0] in non_rendering_modules: return mode = "w" if cmd[0] == "d.erase" else "a" @@ -165,8 +167,10 @@ def read_stdin(cmd): read_stdin(cmd) - # wx monitors will render new layers internally - if not mon.startswith("wx"): + # wx monitors will render new layers internally so don't render them here; + # also, some display modules print information to the terminal rather than + # rendering any contents on the monitor so allow them to run here + if not mon.startswith("wx") or cmd[0] in non_rendering_modules: render(cmd, mapfile) update_cmd_file(os.path.join(path, "cmd"), cmd, mapfile) From 043d399094039bca8d13129e79dbb3aab354f2c1 Mon Sep 17 00:00:00 2001 From: Huidae Cho Date: Fri, 15 Mar 2024 08:31:39 -0600 Subject: [PATCH 3/4] Do not touch a map file for non-rendering modules; also delete it if created by display driver; they are all blank --- display/d.mon/render_cmd.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/display/d.mon/render_cmd.py b/display/d.mon/render_cmd.py index 0a50d14e37d..f1ee6f7ecec 100644 --- a/display/d.mon/render_cmd.py +++ b/display/d.mon/render_cmd.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import os import sys +import glob import tempfile from pathlib import Path @@ -23,6 +24,19 @@ ) +# remove empty mapfile from non-rendering modules +def remove_mapfile(mapfile): + # adopted from Map.DeleteLayer() in gui/wxpython/core/render.py + base = os.path.split(mapfile)[0] + mapfile = os.path.split(mapfile)[1] + tempbase = mapfile.split(".")[0] + if base == "" or tempbase == "": + return + basefile = os.path.join(base, tempbase) + r".*" + for f in glob.glob(basefile): + os.remove(f) + + # read environment variables from file def read_env_file(env_file): width = height = legfile = None @@ -57,6 +71,11 @@ def render(cmd, mapfile): env["GRASS_RENDER_FILE"] = mapfile try: grass.run_command(cmd[0], env=env, **cmd[1]) + # display driver can generate a blank map file unnecessarily for + # non-rendering modules; delete it + if cmd[0] in non_rendering_modules and os.path.exists(mapfile): + remove_mapfile(mapfile) + except CalledModuleError as e: grass.debug("Unable to render: {0}".format(e), 1) @@ -159,8 +178,10 @@ def read_stdin(cmd): mapfile += ".png" else: mapfile += ".ppm" - # to force rendering by wx monitors - Path(mapfile).touch() + # to force rendering by wx monitors, but don't create a map file for + # non-rendering modules + if cmd[0] not in ("d.redraw",) + non_rendering_modules: + Path(mapfile).touch() else: mapfile = None adjust_region(width, height) From 3edba7b6d77e07e3e414e1209612e094d8c87374 Mon Sep 17 00:00:00 2001 From: Huidae Cho Date: Wed, 8 May 2024 20:17:54 -0600 Subject: [PATCH 4/4] Force render for d.redraw --- display/d.mon/render_cmd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/display/d.mon/render_cmd.py b/display/d.mon/render_cmd.py index f1ee6f7ecec..bdad7404e4d 100644 --- a/display/d.mon/render_cmd.py +++ b/display/d.mon/render_cmd.py @@ -180,7 +180,7 @@ def read_stdin(cmd): mapfile += ".ppm" # to force rendering by wx monitors, but don't create a map file for # non-rendering modules - if cmd[0] not in ("d.redraw",) + non_rendering_modules: + if cmd[0] not in non_rendering_modules: Path(mapfile).touch() else: mapfile = None