Skip to content

Commit 4c49a88

Browse files
authored
Merge pull request #62 from nschloe/remesh-surface
Remesh surface
2 parents 5f0291b + 847575f commit 4c49a88

19 files changed

Lines changed: 607 additions & 254 deletions

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
*.inr filter=lfs diff=lfs merge=lfs -text
2+
*.off filter=lfs diff=lfs merge=lfs -text
23
*.vtu filter=lfs diff=lfs merge=lfs -text

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
*.off
21
*.mesh
32
.cache/
43
build/

MANIFEST.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,6 @@ include src/polygon2d.hpp
88
include src/primitives.hpp
99
include src/sizing_field.hpp
1010
include src/version.hpp
11+
12+
include test/helpers.py
13+
recursive-include test/meshes *

README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,30 @@ mesh = pygalmesh.generate_from_inr(
341341
)
342342
```
343343

344+
#### Surface remeshing
345+
<img src="https://nschloe.github.io/pygalmesh/lion-head.png" width="30%">
346+
347+
pygalmesh can help remeshing an existing surface mesh, e.g.,
348+
[`lion-head.off`](https://github.com/nschloe/pygalmesh/raw/gh-pages/lion-head.off). On
349+
the command line, use
350+
351+
```
352+
pygalmesh-remesh-surface lion-head.off out.vtu -e 0.025 -a 25 -s 0.1 -d 0.001
353+
```
354+
(see `pygalmesh-remesh-surface -h` for all options) or from Python
355+
```python
356+
import pygalmesh
357+
358+
mesh = pygalmesh.remesh_surface(
359+
"lion-head.off",
360+
edge_size=0.025,
361+
facet_angle=25,
362+
facet_size=0.1,
363+
facet_distance=0.001,
364+
verbose=False,
365+
)
366+
```
367+
344368
### Installation
345369

346370
For installation, pygalmesh needs [CGAL](https://www.cgal.org/) and

pygalmesh/__about__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
__author_email__ = "nico.schloemer@gmail.com"
33
__copyright__ = "Copyright (C) 2016-2020 {} <{}>".format(__author__, __author_email__)
44
__license__ = "License :: OSI Approved :: MIT License"
5-
__version__ = "0.5.1"
5+
__version__ = "0.5.2"
66
__maintainer__ = "Nico Schlömer"
77
__status__ = "Development Status :: 4 - Beta"
88
__url__ = "https://github.com/nschloe/pygalmesh"

pygalmesh/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
generate_surface_mesh,
3939
generate_volume_mesh_from_surface_mesh,
4040
generate_with_sizing_field,
41+
remesh_surface,
4142
)
4243

4344
__all__ = [
@@ -76,4 +77,5 @@
7677
"generate_surface_mesh",
7778
"generate_volume_mesh_from_surface_mesh",
7879
"generate_from_inr",
80+
"remesh_surface",
7981
]

pygalmesh/_cli/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from ._inr import inr
2+
from ._remesh_surface import remesh_surface
3+
from ._volume_from_surface import volume_from_surface
4+
5+
__all__ = ["inr", "volume_from_surface", "remesh_surface"]

pygalmesh/_cli/_inr.py

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import argparse
2+
3+
import meshio
4+
5+
from ..main import generate_from_inr
6+
from .helpers import _get_version_text
7+
8+
9+
def inr(argv=None):
10+
parser = _get_inr_parser()
11+
args = parser.parse_args(argv)
12+
13+
mesh = generate_from_inr(
14+
args.infile,
15+
lloyd=args.lloyd,
16+
odt=args.odt,
17+
perturb=args.perturb,
18+
exude=args.exude,
19+
edge_size=args.edge_size,
20+
facet_angle=args.facet_angle,
21+
facet_size=args.facet_size,
22+
facet_distance=args.facet_distance,
23+
cell_radius_edge_ratio=args.cell_radius_edge_ratio,
24+
cell_size=args.cell_size,
25+
verbose=not args.quiet,
26+
)
27+
meshio.write(args.outfile, mesh)
28+
29+
30+
def _get_inr_parser():
31+
parser = argparse.ArgumentParser(
32+
description="Generate volume mesh from INR voxel file.",
33+
formatter_class=argparse.RawTextHelpFormatter,
34+
)
35+
36+
parser.add_argument("infile", type=str, help="input INR file")
37+
38+
parser.add_argument("outfile", type=str, help="output mesh file")
39+
40+
parser.add_argument(
41+
"--lloyd",
42+
"-l",
43+
type=bool,
44+
default=False,
45+
help="Lloyd smoothing (default: false)",
46+
)
47+
48+
parser.add_argument(
49+
"--odt",
50+
"-o",
51+
action="store_true",
52+
default=False,
53+
help="ODT smoothing (default: false)",
54+
)
55+
56+
parser.add_argument(
57+
"--perturb",
58+
"-p",
59+
action="store_true",
60+
default=False,
61+
help="perturb (default: false)",
62+
)
63+
64+
parser.add_argument(
65+
"--exude",
66+
"-x",
67+
action="store_true",
68+
default=False,
69+
help="exude (default: false)",
70+
)
71+
72+
parser.add_argument(
73+
"--edge-size", "-e", type=float, default=0.0, help="edge size (default: 0.0)"
74+
)
75+
76+
parser.add_argument(
77+
"--facet-angle",
78+
"-a",
79+
type=float,
80+
default=0.0,
81+
help="facet angle (default: 0.0)",
82+
)
83+
84+
parser.add_argument(
85+
"--facet-size", "-s", type=float, default=0.0, help="facet size (default: 0.0)"
86+
)
87+
88+
parser.add_argument(
89+
"--facet-distance",
90+
"-d",
91+
type=float,
92+
default=0.0,
93+
help="facet distance (default: 0.0)",
94+
)
95+
96+
parser.add_argument(
97+
"--cell-radius-edge-ratio",
98+
"-r",
99+
type=float,
100+
default=0.0,
101+
help="cell radius/edge ratio (default: 0.0)",
102+
)
103+
104+
parser.add_argument(
105+
"--cell-size", "-c", type=float, default=0.0, help="cell size (default: 0.0)"
106+
)
107+
108+
parser.add_argument(
109+
"--quiet",
110+
"-q",
111+
action="store_true",
112+
default=False,
113+
help="quiet mode (default: False)",
114+
)
115+
116+
parser.add_argument(
117+
"--version", "-v", action="version", version=_get_version_text()
118+
)
119+
return parser

pygalmesh/_cli/_remesh_surface.py

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
import argparse
2+
3+
import meshio
4+
5+
from ..main import remesh_surface as rms
6+
from .helpers import _get_version_text
7+
8+
9+
def remesh_surface(argv=None):
10+
parser = _get_parser()
11+
args = parser.parse_args(argv)
12+
13+
mesh = rms(
14+
args.infile,
15+
# lloyd=args.lloyd,
16+
# odt=args.odt,
17+
# perturb=args.perturb,
18+
# exude=args.exude,
19+
edge_size=args.edge_size,
20+
facet_angle=args.facet_angle,
21+
facet_size=args.facet_size,
22+
facet_distance=args.facet_distance,
23+
# cell_radius_edge_ratio=args.cell_radius_edge_ratio,
24+
# cell_size=args.cell_size,
25+
verbose=not args.quiet,
26+
)
27+
meshio.write(args.outfile, mesh)
28+
29+
30+
def _get_parser():
31+
parser = argparse.ArgumentParser(
32+
description="Remesh surface mesh.",
33+
formatter_class=argparse.RawTextHelpFormatter,
34+
)
35+
36+
parser.add_argument("infile", type=str, help="input mesh file")
37+
parser.add_argument("outfile", type=str, help="output mesh file")
38+
39+
# parser.add_argument(
40+
# "--lloyd",
41+
# "-l",
42+
# type=bool,
43+
# default=False,
44+
# help="Lloyd smoothing (default: false)",
45+
# )
46+
47+
# parser.add_argument(
48+
# "--odt",
49+
# "-o",
50+
# action="store_true",
51+
# default=False,
52+
# help="ODT smoothing (default: false)",
53+
# )
54+
55+
# parser.add_argument(
56+
# "--perturb",
57+
# "-p",
58+
# action="store_true",
59+
# default=False,
60+
# help="perturb (default: false)",
61+
# )
62+
63+
# parser.add_argument(
64+
# "--exude",
65+
# "-x",
66+
# action="store_true",
67+
# default=False,
68+
# help="exude (default: false)",
69+
# )
70+
71+
parser.add_argument(
72+
"--edge-size", "-e", type=float, default=0.0, help="edge size (default: 0.0)"
73+
)
74+
75+
parser.add_argument(
76+
"--facet-angle",
77+
"-a",
78+
type=float,
79+
default=0.0,
80+
help="facet angle (default: 0.0)",
81+
)
82+
83+
parser.add_argument(
84+
"--facet-size", "-s", type=float, default=0.0, help="facet size (default: 0.0)"
85+
)
86+
87+
parser.add_argument(
88+
"--facet-distance",
89+
"-d",
90+
type=float,
91+
default=0.0,
92+
help="facet distance (default: 0.0)",
93+
)
94+
95+
# parser.add_argument(
96+
# "--cell-radius-edge-ratio",
97+
# "-r",
98+
# type=float,
99+
# default=0.0,
100+
# help="cell radius/edge ratio (default: 0.0)",
101+
# )
102+
103+
# parser.add_argument(
104+
# "--cell-size", "-c", type=float, default=0.0, help="cell size (default: 0.0)"
105+
# )
106+
107+
parser.add_argument(
108+
"--quiet",
109+
"-q",
110+
action="store_true",
111+
default=False,
112+
help="quiet mode (default: False)",
113+
)
114+
115+
parser.add_argument(
116+
"--version", "-v", action="version", version=_get_version_text()
117+
)
118+
return parser

0 commit comments

Comments
 (0)