mirror of
https://github.com/facebookresearch/pytorch3d.git
synced 2025-08-02 20:02:49 +08:00
Handle header has no newline or space after OFF. (#665)
Summary: Allow a line like `OFF10 10 10` as the start of an OFF file. Such things apparently occur in ModelNet40. This resolves https://github.com/facebookresearch/pytorch3d/issues/663. Pull Request resolved: https://github.com/facebookresearch/pytorch3d/pull/665 Test Plan: New test Reviewed By: nikhilaravi Differential Revision: D28180006 Pulled By: bottler fbshipit-source-id: 7f474c6a262e32da012217e09f76e8672a7f0278
This commit is contained in:
parent
34163326b2
commit
5241b7dd4e
@ -6,6 +6,9 @@
|
|||||||
"""
|
"""
|
||||||
This module implements utility functions for loading and saving
|
This module implements utility functions for loading and saving
|
||||||
meshes as .off files.
|
meshes as .off files.
|
||||||
|
|
||||||
|
This format is introduced, for example, at
|
||||||
|
http://www.geomview.org/docs/html/OFF.html .
|
||||||
"""
|
"""
|
||||||
import warnings
|
import warnings
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@ -226,15 +229,17 @@ def _load_off_stream(file) -> dict:
|
|||||||
faces_colors: FloatTensor of shape (F, C), where C is 3 or 4.
|
faces_colors: FloatTensor of shape (F, C), where C is 3 or 4.
|
||||||
"""
|
"""
|
||||||
header = file.readline()
|
header = file.readline()
|
||||||
if header.lower() in (b"off\n", b"off\r\n", "off\n"):
|
|
||||||
header = file.readline()
|
|
||||||
|
|
||||||
while _is_line_empty(header):
|
while _is_line_empty(header):
|
||||||
header = file.readline()
|
header = file.readline()
|
||||||
|
|
||||||
items = header.split(b" ")
|
if header[:3].lower() == b"off":
|
||||||
if len(items) and items[0].lower() in ("off", b"off"):
|
header = header[3:]
|
||||||
items = items[1:]
|
|
||||||
|
while _is_line_empty(header):
|
||||||
|
header = file.readline()
|
||||||
|
|
||||||
|
items = header.split()
|
||||||
if len(items) < 3:
|
if len(items) < 3:
|
||||||
raise ValueError("Invalid counts line: %s" % header)
|
raise ValueError("Invalid counts line: %s" % header)
|
||||||
|
|
||||||
@ -247,7 +252,7 @@ def _load_off_stream(file) -> dict:
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
raise ValueError("Invalid counts line: %s" % header)
|
raise ValueError("Invalid counts line: %s" % header)
|
||||||
|
|
||||||
if (len(items) > 3 and not items[3].startswith("#")) or n_verts < 0 or n_faces < 0:
|
if (len(items) > 3 and not items[3].startswith(b"#")) or n_verts < 0 or n_faces < 0:
|
||||||
raise ValueError("Invalid counts line: %s" % header)
|
raise ValueError("Invalid counts line: %s" % header)
|
||||||
|
|
||||||
verts, verts_colors = _read_verts(file, n_verts)
|
verts, verts_colors = _read_verts(file, n_verts)
|
||||||
|
@ -254,6 +254,11 @@ class TestMeshOffIO(TestCaseMixin, unittest.TestCase):
|
|||||||
lines2[0] = "OFF " + lines[0]
|
lines2[0] = "OFF " + lines[0]
|
||||||
load(lines2)
|
load(lines2)
|
||||||
|
|
||||||
|
# OFF line can be merged in to the first line with no space
|
||||||
|
lines2 = lines.copy()
|
||||||
|
lines2[0] = "OFF" + lines[0]
|
||||||
|
load(lines2)
|
||||||
|
|
||||||
with self.assertRaisesRegex(ValueError, "Not enough face data."):
|
with self.assertRaisesRegex(ValueError, "Not enough face data."):
|
||||||
load(lines[:-1])
|
load(lines[:-1])
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user