Alembic: prevent spaces in names of exported particle systems

Other types already had spaces, periods, and colons replaced by
underscores. The upcoming Alembic exporter (based on the
`AbstractHierarcyIterator` class) will be more consistent and apply the
same naming rules everywhere. This is in preparation for that change.
The `get_…_name()` functions in `abc_util.{cc,h}` will be removed then.
This commit is contained in:
Sybren A. Stüvel 2020-05-08 13:42:39 +02:00
parent 0d744cf673
commit f106369ce8
5 changed files with 22 additions and 15 deletions

View File

@ -49,12 +49,16 @@ std::string get_id_name(const Object *const ob)
std::string get_id_name(const ID *const id)
{
std::string name(id->name + 2);
std::replace(name.begin(), name.end(), ' ', '_');
std::replace(name.begin(), name.end(), '.', '_');
std::replace(name.begin(), name.end(), ':', '_');
return get_valid_abc_name(id->name + 2);
}
return name;
std::string get_valid_abc_name(const char *name)
{
std::string name_string(name);
std::replace(name_string.begin(), name_string.end(), ' ', '_');
std::replace(name_string.begin(), name_string.end(), '.', '_');
std::replace(name_string.begin(), name_string.end(), ':', '_');
return name_string;
}
/**

View File

@ -49,6 +49,7 @@ struct Object;
std::string get_id_name(const ID *const id);
std::string get_id_name(const Object *const ob);
std::string get_valid_abc_name(const char *name);
std::string get_object_dag_path_name(const Object *const ob, Object *dupli_parent);
/* Convert from float to Alembic matrix representations. Does NOT convert from Z-up to Y-up. */

View File

@ -53,7 +53,8 @@ AbcHairWriter::AbcHairWriter(Object *ob,
{
m_psys = psys;
OCurves curves(parent->alembicXform(), psys->name, m_time_sampling);
std::string psys_name = get_valid_abc_name(psys->name);
OCurves curves(parent->alembicXform(), psys_name, m_time_sampling);
m_schema = curves.getSchema();
}

View File

@ -51,7 +51,8 @@ AbcPointsWriter::AbcPointsWriter(Object *ob,
{
m_psys = psys;
OPoints points(parent->alembicXform(), psys->name, m_time_sampling);
std::string psys_name = get_valid_abc_name(psys->name);
OPoints points(parent->alembicXform(), psys_name, m_time_sampling);
m_schema = points.getSchema();
}

View File

@ -280,10 +280,10 @@ class HairParticlesExportTest(AbstractAlembicTest):
def test_with_both(self, tempdir: pathlib.Path):
abc = self._do_test(tempdir, True, True)
abcprop = self.abcprop(abc, '/Suzanne/Hair system/.geom')
abcprop = self.abcprop(abc, '/Suzanne/Hair_system/.geom')
self.assertIn('nVertices', abcprop)
abcprop = self.abcprop(abc, '/Suzanne/Non-hair particle system/.geom')
abcprop = self.abcprop(abc, '/Suzanne/Non-hair_particle_system/.geom')
self.assertIn('.velocities', abcprop)
abcprop = self.abcprop(abc, '/Suzanne/MonkeyMesh/.geom')
@ -293,11 +293,11 @@ class HairParticlesExportTest(AbstractAlembicTest):
def test_with_hair_only(self, tempdir: pathlib.Path):
abc = self._do_test(tempdir, True, False)
abcprop = self.abcprop(abc, '/Suzanne/Hair system/.geom')
abcprop = self.abcprop(abc, '/Suzanne/Hair_system/.geom')
self.assertIn('nVertices', abcprop)
self.assertRaises(AbcPropError, self.abcprop, abc,
'/Suzanne/Non-hair particle system/.geom')
'/Suzanne/Non-hair_particle_system/.geom')
abcprop = self.abcprop(abc, '/Suzanne/MonkeyMesh/.geom')
self.assertIn('.faceIndices', abcprop)
@ -306,9 +306,9 @@ class HairParticlesExportTest(AbstractAlembicTest):
def test_with_particles_only(self, tempdir: pathlib.Path):
abc = self._do_test(tempdir, False, True)
self.assertRaises(AbcPropError, self.abcprop, abc, '/Suzanne/Hair system/.geom')
self.assertRaises(AbcPropError, self.abcprop, abc, '/Suzanne/Hair_system/.geom')
abcprop = self.abcprop(abc, '/Suzanne/Non-hair particle system/.geom')
abcprop = self.abcprop(abc, '/Suzanne/Non-hair_particle_system/.geom')
self.assertIn('.velocities', abcprop)
abcprop = self.abcprop(abc, '/Suzanne/MonkeyMesh/.geom')
@ -318,9 +318,9 @@ class HairParticlesExportTest(AbstractAlembicTest):
def test_with_neither(self, tempdir: pathlib.Path):
abc = self._do_test(tempdir, False, False)
self.assertRaises(AbcPropError, self.abcprop, abc, '/Suzanne/Hair system/.geom')
self.assertRaises(AbcPropError, self.abcprop, abc, '/Suzanne/Hair_system/.geom')
self.assertRaises(AbcPropError, self.abcprop, abc,
'/Suzanne/Non-hair particle system/.geom')
'/Suzanne/Non-hair_particle_system/.geom')
abcprop = self.abcprop(abc, '/Suzanne/MonkeyMesh/.geom')
self.assertIn('.faceIndices', abcprop)