- DXF: improve polyline (2D) reading.
git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@907 67173fc5-114c-0410-ac8e-9d2fd5bffc1fpull/1/head
parent
f7eca27c1b
commit
bee6884864
|
@ -267,7 +267,7 @@ void DXFImporter::ConvertMeshes(aiScene* pScene, DXF::FileData& output)
|
||||||
throw DeadlyImportError("DXF: this file contains no 3d data");
|
throw DeadlyImportError("DXF: this file contains no 3d data");
|
||||||
}
|
}
|
||||||
|
|
||||||
pScene->mMeshes = new aiMesh*[ pScene->mNumMeshes ];
|
pScene->mMeshes = new aiMesh*[ pScene->mNumMeshes ] ();
|
||||||
|
|
||||||
BOOST_FOREACH(const LayerMap::value_type& elem, layers){
|
BOOST_FOREACH(const LayerMap::value_type& elem, layers){
|
||||||
aiMesh* const mesh = pScene->mMeshes[elem.second] = new aiMesh();
|
aiMesh* const mesh = pScene->mMeshes[elem.second] = new aiMesh();
|
||||||
|
@ -590,10 +590,10 @@ void DXFImporter::ParseInsertion(DXF::LineReader& reader, DXF::FileData& output)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define DXF_POLYLINE_FLAG_CLOSED 0x1
|
||||||
#define DXF_POLYLINE_FLAG_3D_POLYLINE 0x8
|
#define DXF_POLYLINE_FLAG_3D_POLYLINE 0x8
|
||||||
#define DXF_POLYLINE_FLAG_3D_POLYMESH 0x10
|
#define DXF_POLYLINE_FLAG_3D_POLYMESH 0x10
|
||||||
#define DXF_POLYLINE_FLAG_POLYFACEMESH 0x40
|
#define DXF_POLYLINE_FLAG_POLYFACEMESH 0x40
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
void DXFImporter::ParsePolyLine(DXF::LineReader& reader, DXF::FileData& output)
|
void DXFImporter::ParsePolyLine(DXF::LineReader& reader, DXF::FileData& output)
|
||||||
|
@ -645,31 +645,54 @@ void DXFImporter::ParsePolyLine(DXF::LineReader& reader, DXF::FileData& output)
|
||||||
reader++;
|
reader++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(line.flags & DXF_POLYLINE_FLAG_POLYFACEMESH)) {
|
//if (!(line.flags & DXF_POLYLINE_FLAG_POLYFACEMESH)) {
|
||||||
DefaultLogger::get()->warn((Formatter::format("DXF: polyline not currently supported: "),line.flags));
|
// DefaultLogger::get()->warn((Formatter::format("DXF: polyline not currently supported: "),line.flags));
|
||||||
output.blocks.back().lines.pop_back();
|
// output.blocks.back().lines.pop_back();
|
||||||
return;
|
// return;
|
||||||
}
|
//}
|
||||||
|
|
||||||
if (line.positions.size() < 3 || line.indices.size() < 3) {
|
if (vguess && line.positions.size() != vguess) {
|
||||||
DefaultLogger::get()->warn("DXF: not enough vertices for polymesh; ignoring");
|
|
||||||
output.blocks.back().lines.pop_back();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if these numbers are wrong, parsing might have gone wild.
|
|
||||||
// however, the docs state that applications are not required
|
|
||||||
// to set the 71 and 72 fields, respectively, to valid values.
|
|
||||||
// So just fire a warning.
|
|
||||||
if (line.positions.size() != vguess) {
|
|
||||||
DefaultLogger::get()->warn((Formatter::format("DXF: unexpected vertex count in polymesh: "),
|
DefaultLogger::get()->warn((Formatter::format("DXF: unexpected vertex count in polymesh: "),
|
||||||
line.positions.size(),", expected ", vguess
|
line.positions.size(),", expected ", vguess
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
if (line.counts.size() != iguess) {
|
|
||||||
DefaultLogger::get()->warn((Formatter::format("DXF: unexpected face count in polymesh: "),
|
if (line.flags & DXF_POLYLINE_FLAG_POLYFACEMESH ) {
|
||||||
line.counts.size(),", expected ", iguess
|
if (line.positions.size() < 3 || line.indices.size() < 3) {
|
||||||
));
|
DefaultLogger::get()->warn("DXF: not enough vertices for polymesh; ignoring");
|
||||||
|
output.blocks.back().lines.pop_back();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if these numbers are wrong, parsing might have gone wild.
|
||||||
|
// however, the docs state that applications are not required
|
||||||
|
// to set the 71 and 72 fields, respectively, to valid values.
|
||||||
|
// So just fire a warning.
|
||||||
|
if (iguess && line.counts.size() != iguess) {
|
||||||
|
DefaultLogger::get()->warn((Formatter::format("DXF: unexpected face count in polymesh: "),
|
||||||
|
line.counts.size(),", expected ", iguess
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!line.indices.size() && !line.counts.size()) {
|
||||||
|
// a polyline - so there are no indices yet.
|
||||||
|
size_t guess = line.positions.size() + (line.flags & DXF_POLYLINE_FLAG_CLOSED ? 1 : 0);
|
||||||
|
line.indices.reserve(guess);
|
||||||
|
|
||||||
|
line.counts.reserve(guess/2);
|
||||||
|
for (unsigned int i = 0; i < line.positions.size()/2; ++i) {
|
||||||
|
line.indices.push_back(i*2);
|
||||||
|
line.indices.push_back(i*2+1);
|
||||||
|
line.counts.push_back(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// closed polyline?
|
||||||
|
if (line.flags & DXF_POLYLINE_FLAG_CLOSED) {
|
||||||
|
line.indices.push_back(line.positions.size()-1);
|
||||||
|
line.indices.push_back(0);
|
||||||
|
|
||||||
|
line.counts.push_back(2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -732,15 +755,11 @@ void DXFImporter::ParsePolyLineVertex(DXF::LineReader& reader, DXF::PolyLine& li
|
||||||
reader++;
|
reader++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(flags & DXF_VERTEX_FLAG_PART_OF_POLYFACE)) {
|
if (line.flags & DXF_POLYLINE_FLAG_POLYFACEMESH && !(flags & DXF_VERTEX_FLAG_PART_OF_POLYFACE)) {
|
||||||
DefaultLogger::get()->warn("DXF: expected vertex to be part of a polyface but the 0x128 flag isn't set");
|
DefaultLogger::get()->warn("DXF: expected vertex to be part of a polyface but the 0x128 flag isn't set");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & DXF_VERTEX_FLAG_HAS_POSITIONS) {
|
if (cnti) {
|
||||||
line.positions.push_back(out);
|
|
||||||
line.colors.push_back(clr);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
line.counts.push_back(cnti);
|
line.counts.push_back(cnti);
|
||||||
for (unsigned int i = 0; i < cnti; ++i) {
|
for (unsigned int i = 0; i < cnti; ++i) {
|
||||||
// IMPORTANT NOTE: POLYMESH indices are ONE-BASED
|
// IMPORTANT NOTE: POLYMESH indices are ONE-BASED
|
||||||
|
@ -752,6 +771,10 @@ void DXFImporter::ParsePolyLineVertex(DXF::LineReader& reader, DXF::PolyLine& li
|
||||||
line.indices.push_back(indices[i]-1);
|
line.indices.push_back(indices[i]-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
line.positions.push_back(out);
|
||||||
|
line.colors.push_back(clr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue