diff --git a/src/ifcconvert/ColladaSerializer.cpp b/src/ifcconvert/ColladaSerializer.cpp index 9c26211e84..f1f5a96fcd 100644 --- a/src/ifcconvert/ColladaSerializer.cpp +++ b/src/ifcconvert/ColladaSerializer.cpp @@ -300,12 +300,9 @@ void ColladaSerializer::ColladaExporter::startDocument(const std::string& unit_n asset.setUpAxisType(COLLADASW::Asset::Z_UP); asset.add(); } -// ******************************** -// NOTE : o->context.parent_id ????????????????? == -1 si pas de parent -// On a un type de product ifcBuildingStorey + void ColladaSerializer::ColladaExporter::write(const IfcGeom::TriangulationElement* o) -{ - +{ const IfcGeom::Representation::Triangulation& mesh = o->geometry(); const std::string name = serializer->settings().get(SerializerSettings::USE_ELEMENT_GUIDS) ? o->guid() : (serializer->settings().get(SerializerSettings::USE_ELEMENT_NAMES) ? o->name() : (o->type() + o->unique_id())); @@ -327,6 +324,28 @@ void ColladaSerializer::ColladaExporter::write(const IfcGeom::TriangulationEleme ); } +void ColladaSerializer::ColladaExporter::write(const IfcGeom::TriangulationElement* o, const IfcGeom::Element* parent) +{ + const IfcGeom::Representation::Triangulation& mesh = o->geometry(); + const std::string name = serializer->settings().get(SerializerSettings::USE_ELEMENT_GUIDS) ? + o->guid() : (serializer->settings().get(SerializerSettings::USE_ELEMENT_NAMES) ? o->name() : (o->type() + o->unique_id())); + const std::string representation_id = "representation-" + boost::lexical_cast(o->geometry().id()); + std::vector material_references; + foreach(const IfcGeom::Material& material, mesh.materials()) { + if (!materials.contains(material)) { + materials.add(material); + } + std::string material_name = (serializer->settings().get(SerializerSettings::USE_MATERIAL_NAMES) + ? material.original_name() : material.name()); + collada_id(material_name); + material_references.push_back(material_name); + } + + deferreds.push_back( + DeferredObject(name, representation_id, o->type(), o->transformation().matrix().data(), mesh.verts(), mesh.normals(), + mesh.faces(), mesh.edges(), mesh.material_ids(), mesh.materials(), material_references, mesh.uvs()) + ); +} void ColladaSerializer::ColladaExporter::endDocument() { // In fact due the XML based nature of Collada and its dependency on library nodes, @@ -363,6 +382,7 @@ void ColladaSerializer::write(const IfcGeom::TriangulationElement* o) { exporter.write(o); } + void ColladaSerializer::finalize() { exporter.endDocument(); } diff --git a/src/ifcconvert/ColladaSerializer.h b/src/ifcconvert/ColladaSerializer.h index faa092203f..58fa7d78b7 100644 --- a/src/ifcconvert/ColladaSerializer.h +++ b/src/ifcconvert/ColladaSerializer.h @@ -172,6 +172,7 @@ private: virtual ~ColladaExporter() {} void startDocument(const std::string& unit_name, float unit_magnitude); void write(const IfcGeom::TriangulationElement* o); + void write(const IfcGeom::TriangulationElement* o, const IfcGeom::Element* parent); void endDocument(); }; ColladaExporter exporter; @@ -190,6 +191,7 @@ public: bool ready(); void writeHeader(); void write(const IfcGeom::TriangulationElement* o); + void write(const IfcGeom::TriangulationElement* o, const IfcGeom::Element* parent); void write(const IfcGeom::BRepElement* /*o*/) {} void finalize(); bool isTesselated() const { return true; } diff --git a/src/ifcconvert/GeometrySerializer.h b/src/ifcconvert/GeometrySerializer.h index 7b7997d8ad..8a15b8bce3 100644 --- a/src/ifcconvert/GeometrySerializer.h +++ b/src/ifcconvert/GeometrySerializer.h @@ -70,6 +70,7 @@ public: virtual bool isTesselated() const = 0; virtual void write(const IfcGeom::TriangulationElement* o) = 0; + virtual void write(const IfcGeom::TriangulationElement* o, const IfcGeom::Element* element) = 0; virtual void write(const IfcGeom::BRepElement* o) = 0; virtual void setUnitNameAndMagnitude(const std::string& name, float magnitude) = 0; diff --git a/src/ifcconvert/IfcConvert.cpp b/src/ifcconvert/IfcConvert.cpp index 25df256629..3cc19786e5 100644 --- a/src/ifcconvert/IfcConvert.cpp +++ b/src/ifcconvert/IfcConvert.cpp @@ -605,16 +605,20 @@ int main(int argc, char** argv) //if (parent_object != NULL) std::cout << '\n' << "obj " << geom_object->unique_id() << " parent = " << parent_object->name() << " of type " << parent_object->type() << '\n'; //else std::cout << "No parent found : " << geom_object->unique_id() << " of type : " << geom_object->type(); + serializer->write(static_cast*>(geom_object), parent_object); } - - if (is_tesselated) + else { - serializer->write(static_cast*>(geom_object)); - } - else - { - serializer->write(static_cast*>(geom_object)); + if (is_tesselated) + { + serializer->write(static_cast*>(geom_object)); + } + else + { + serializer->write(static_cast*>(geom_object)); + } } + const int progress = context_iterator.progress() / 2; if (old_progress != progress) Logger::ProgressBar(progress); old_progress = progress; diff --git a/src/ifcconvert/OpenCascadeBasedSerializer.h b/src/ifcconvert/OpenCascadeBasedSerializer.h index 01c088594d..2dce8ef63f 100644 --- a/src/ifcconvert/OpenCascadeBasedSerializer.h +++ b/src/ifcconvert/OpenCascadeBasedSerializer.h @@ -40,6 +40,7 @@ public: bool ready(); virtual void writeShape(const TopoDS_Shape& shape) = 0; void write(const IfcGeom::TriangulationElement* /*o*/) {} + void write(const IfcGeom::TriangulationElement* o, const IfcGeom::Element* parent) {} void write(const IfcGeom::BRepElement* o); bool isTesselated() const { return false; } void setFile(IfcParse::IfcFile*) {} diff --git a/src/ifcconvert/SvgSerializer.h b/src/ifcconvert/SvgSerializer.h index 542541f9d0..fe12cfbeb6 100644 --- a/src/ifcconvert/SvgSerializer.h +++ b/src/ifcconvert/SvgSerializer.h @@ -60,6 +60,7 @@ public: void writeHeader(); bool ready(); void write(const IfcGeom::TriangulationElement* /*o*/) {} + void write(const IfcGeom::TriangulationElement* o, const IfcGeom::Element* parent) {} void write(const IfcGeom::BRepElement* o); void write(path_object& p, const TopoDS_Wire& wire); path_object& start_path(IfcSchema::IfcBuildingStorey* storey, const std::string& id); diff --git a/src/ifcconvert/WavefrontObjSerializer.h b/src/ifcconvert/WavefrontObjSerializer.h index 2aa9708bdc..5411d5f64f 100644 --- a/src/ifcconvert/WavefrontObjSerializer.h +++ b/src/ifcconvert/WavefrontObjSerializer.h @@ -51,6 +51,7 @@ public: void writeHeader(); void writeMaterial(const IfcGeom::Material& style); void write(const IfcGeom::TriangulationElement* o); + void write(const IfcGeom::TriangulationElement* o, const IfcGeom::Element* parent) {} void write(const IfcGeom::BRepElement* /*o*/) {} void finalize() {} bool isTesselated() const { return true; }