Skip to content

Commit e70e37d

Browse files
authored
[MISC] Faster Genesis import. (#1549)
1 parent e2f4566 commit e70e37d

File tree

5 files changed

+43
-32
lines changed

5 files changed

+43
-32
lines changed

genesis/engine/mesh.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
import fast_simplification
55
import numpy as np
66
import numpy.typing as npt
7-
import pyvista as pv
8-
import tetgen
97
import trimesh
10-
import pymeshlab
118

129
import genesis as gs
1310
from genesis.options.surfaces import Surface
@@ -125,6 +122,9 @@ def remesh(self, edge_len_abs=None, edge_len_ratio=0.01, fix=True):
125122
gs.logger.info("Ignoring corrupted cache.")
126123

127124
if not is_cached_loaded:
125+
# Importing pymeshlab is very slow and not used very often. Let's delay import.
126+
import pymeshlab
127+
128128
gs.logger.info("Remeshing for tetrahedralization...")
129129
ms = pymeshlab.MeshSet()
130130
ms.add_mesh(pymeshlab.Mesh(vertex_matrix=self.verts, face_matrix=self.faces))
@@ -151,6 +151,10 @@ def tetrahedralize(self, tet_cfg):
151151
"""
152152
Tetrahedralize the mesh.
153153
"""
154+
# Importing pyvista and tetgen are very slow and not used very often. Let's delay import.
155+
import pyvista as pv
156+
import tetgen
157+
154158
pv_obj = pv.PolyData(
155159
self.verts, np.concatenate([np.full((self.faces.shape[0], 1), self.faces.shape[1]), self.faces], axis=1)
156160
)

genesis/ext/pyrender/renderer.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import pyglet
1111
import numpy as np
1212
from OpenGL.GL import *
13-
import matplotlib.pyplot as plt
1413

1514
from .constants import (
1615
DEFAULT_Z_FAR,

genesis/ext/pyrender/viewer.py

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,18 @@
1616
import genesis as gs
1717
from genesis.vis.rasterizer_context import RasterizerContext
1818

19+
# Importing Tkinter and creating a first context before importing pyglet is necessary to avoid later segfault on MacOS.
20+
# Note that destroying the window will cause segfault at exit.
1921
if sys.platform.startswith("darwin"):
20-
# Mac OS
2122
from tkinter import Tk
22-
from tkinter import filedialog
23-
else:
24-
try:
25-
from Tkinter import Tk
26-
from Tkinter import tkFileDialog as filedialog
27-
except Exception:
28-
try:
29-
from tkinter import Tk
30-
from tkinter import filedialog as filedialog
31-
except Exception:
32-
pass
23+
from tkinter import filedialog as filedialog
3324

34-
35-
try:
3625
root = Tk()
3726
root.withdraw()
38-
except:
39-
pass
27+
else:
28+
root = None
4029

4130
import pyglet
42-
from moviepy.video.io.ffmpeg_writer import FFMPEG_VideoWriter
4331
from pyglet import clock
4432

4533
from .camera import IntrinsicsCamera, OrthographicCamera, PerspectiveCamera
@@ -917,6 +905,9 @@ def on_key_press(self, symbol: int, modifiers: int) -> EVENT_HANDLE_STATE:
917905
self.save_video()
918906
self.set_caption(self.viewer_flags["window_title"])
919907
else:
908+
# Importing moviepy is very slow and not used very often. Let's delay import.
909+
from moviepy.video.io.ffmpeg_writer import FFMPEG_VideoWriter
910+
920911
self.video_recorder = FFMPEG_VideoWriter(
921912
filename=os.path.join(gs.utils.misc.get_cache_dir(), "tmp_video.mp4"),
922913
fps=self.viewer_flags["refresh_rate"],
@@ -1037,6 +1028,8 @@ def _reset_view(self):
10371028
self._trackball = Trackball(self._default_camera_pose, self.viewport_size, scale, centroid)
10381029

10391030
def _get_save_filename(self, file_exts):
1031+
global root
1032+
10401033
file_types = {
10411034
"mp4": ("video files", "*.mp4"),
10421035
"png": ("png files", "*.png"),
@@ -1048,17 +1041,23 @@ def _get_save_filename(self, file_exts):
10481041
save_dir = self.viewer_flags["save_directory"]
10491042
if save_dir is None:
10501043
save_dir = os.getcwd()
1044+
1045+
# Importing tkinter is very slow and not used very often. Let's delay import.
1046+
try:
1047+
from tkinter import Tk
1048+
from tkinter import filedialog as filedialog
1049+
except ImportError:
1050+
from Tkinter import Tk
1051+
from Tkinter import tkFileDialog as filedialog
1052+
10511053
try:
1052-
master = None
1053-
if self._run_in_thread:
1054-
master = Tk()
1055-
master.withdraw()
1054+
if root is None:
1055+
root = Tk()
1056+
root.withdraw()
10561057
dialog = filedialog.SaveAs(
1057-
master=master, initialdir=save_dir, title="Select file save location", filetypes=filetypes
1058+
root, initialdir=save_dir, title="Select file save location", filetypes=filetypes
10581059
)
10591060
filename = dialog.show()
1060-
if self._run_in_thread:
1061-
master.destroy()
10621061
except Exception:
10631062
gs.logger.warning("Failed to open file save location dialog.")
10641063
return None

genesis/utils/hybrid.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44
import time
55
from itertools import combinations
66

7-
import matplotlib.pyplot as plt
87
import networkx as nx
98
import numpy as np
109
from matplotlib.patches import FancyArrowPatch
11-
from mpl_toolkits.mplot3d import proj3d
1210

1311
try:
1412
from pygel3d import graph, hmesh
@@ -220,6 +218,9 @@ def __init__(self, xs, ys, zs, *args, **kwargs):
220218
self._verts3d = xs, ys, zs
221219

222220
def do_3d_projection(self, renderer=None):
221+
# Importing mpl_toolkits is very slow and not used very often. Let's delay import.
222+
from mpl_toolkits.mplot3d import proj3d
223+
223224
xs3d, ys3d, zs3d = self._verts3d
224225
xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, self.axes.M)
225226
self.set_positions((xs[0], ys[0]), (xs[1], ys[1]))
@@ -238,6 +239,9 @@ def plot_nxgraph(
238239
node_size=100,
239240
plot_node_num=True,
240241
):
242+
# Importing matplotlib is very slow and not used very often. Let's delay import.
243+
import matplotlib.pyplot as plt
244+
241245
if pos is None:
242246
pos = nx.spring_layout(G, dim=3, seed=779)
243247

genesis/utils/mesh.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414

1515
import coacd
1616
import igl
17-
import pyvista as pv
18-
import tetgen
1917

2018
import genesis as gs
2119

@@ -974,6 +972,10 @@ def make_tetgen_switches(cfg):
974972

975973

976974
def tetrahedralize_mesh(mesh, tet_cfg):
975+
# Importing pyvista and tetgen are very slow and not used very often. Let's delay import.
976+
import pyvista as pv
977+
import tetgen
978+
977979
pv_obj = pv.PolyData(
978980
mesh.vertices, np.concatenate([np.full((mesh.faces.shape[0], 1), mesh.faces.shape[1]), mesh.faces], axis=1)
979981
)
@@ -1007,6 +1009,9 @@ def visualize_tet(tet, pv_data, show_surface=True, plot_cell_qual=False):
10071009
scalars=cell_qual, stitle="Quality", cmap="bwr", clim=[0, 1], flip_scalars=True, show_edges=True
10081010
)
10091011
else:
1012+
# Importing pyvista is very slow and not used very often. Let's delay import.
1013+
import pyvista as pv
1014+
10101015
plotter = pv.Plotter()
10111016
plotter.add_mesh(subgrid, "lightgrey", lighting=True, show_edges=True)
10121017
plotter.add_mesh(pv_data, "r", "wireframe")

0 commit comments

Comments
 (0)