From 1a08685a2ff038db9bf6259e94743c59c5b3eb12 Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Fri, 17 May 2019 15:39:03 +0200 Subject: [PATCH] Add build_items and components to work with real case data --- Polyhedron/demo/Polyhedron/MainWindow.cpp | 4 +- .../Polyhedron/Plugins/IO/3mf_io_plugin.cpp | 48 +++- Stream_support/include/CGAL/IO/read_3mf.h | 268 +++++++++++++++--- Stream_support/include/CGAL/IO/write_3mf.h | 5 + 4 files changed, 274 insertions(+), 51 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index a949b58ded9..c9061238a3f 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -1206,8 +1206,7 @@ QList MainWindow::loadItem(QFileInfo fileinfo, } CGAL::Three::Three::CursorScopeGuard guard(QCursor(Qt::WaitCursor)); QList result = loader->load(fileinfo, ok, add_to_scene); - selectSceneItem(scene->item_id(result.back())); - if(!ok) + if(result.empty() || !ok) { QApplication::restoreOverrideCursor(); QMessageBox::warning(this, tr("Error"), @@ -1215,6 +1214,7 @@ QList MainWindow::loadItem(QFileInfo fileinfo, .arg(fileinfo.absoluteFilePath()).arg(loader->name())); return QList(); } + selectSceneItem(scene->item_id(result.back())); for(Scene_item* item : result) { CGAL::Three::Scene_group_item* group = diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/3mf_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/3mf_io_plugin.cpp index 6acf62d8768..484724d2a40 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/3mf_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/3mf_io_plugin.cpp @@ -80,22 +80,26 @@ class Io_3mf_plugin: int nb_polylines = CGAL::read_polylines_from_3mf(fileinfo.filePath().toUtf8().toStdString(), all_points, all_colors, names); - if(nb_polylines > 0 ) + if(nb_polylines < 0 ) { - for(int i=0; i< nb_polylines; ++i) - { - Scene_polylines_item* pol_item = new Scene_polylines_item(); - PolylineRange& polylines = pol_item->polylines; - polylines.push_back(all_points[i]); - pol_item->setName(names[i].data()); - pol_item->invalidateOpenGLBuffers(); - CGAL::Color c = all_colors[i].front(); - pol_item->setColor(QColor(c.red(), c.green(), c.blue())); - pol_item->setProperty("already_colord", true); - result << pol_item; - if(add_to_scene) - CGAL::Three::Three::scene()->addItem(pol_item); - } + ok = false; + std::cerr << "Error in reading of meshes."<polylines; + polylines.push_back(all_points[i]); + pol_item->setName(names[i].data()); + pol_item->invalidateOpenGLBuffers(); + CGAL::Color c = all_colors[i].front(); + pol_item->setColor(QColor(c.red(), c.green(), c.blue())); + pol_item->setProperty("already_colord", true); + result << pol_item; + if(add_to_scene) + CGAL::Three::Three::scene()->addItem(pol_item); } all_points.clear(); all_colors.clear(); @@ -103,6 +107,12 @@ class Io_3mf_plugin: int nb_point_sets = CGAL::read_point_clouds_from_3mf(fileinfo.filePath().toUtf8().toStdString(), all_points, all_colors, names); + if(nb_point_sets < 0 ) + { + ok = false; + std::cerr << "Error in reading of meshes."<setColor(QColor(first.red(), first.green(), first.blue())); sm_item->setProperty("already_colored", true); sm_item->setName(names[i].data()); diff --git a/Stream_support/include/CGAL/IO/read_3mf.h b/Stream_support/include/CGAL/IO/read_3mf.h index 062ea68d6a0..3448ca8b7a0 100644 --- a/Stream_support/include/CGAL/IO/read_3mf.h +++ b/Stream_support/include/CGAL/IO/read_3mf.h @@ -26,24 +26,42 @@ #include #include #include +#include #include namespace CGAL{ +namespace transform_nmr_internal{ +NMR::MODELTRANSFORM initMatrix() +{ + NMR::MODELTRANSFORM mMatrix; + int i, j; + for (i = 0; i < 4; i++) { + for (j = 0; j < 3; j++) { + mMatrix.m_fFields[j][i] = (i == j) ? 1.0f : 0.0f; + } + } + + return mMatrix; +} +}//end internal + template bool extract_soups (NMR::PLib3MFModelMeshObject *pMeshObject, - PointRange& points, - PolygonRange& triangles, - ColorRange& colors, - std::string& name) { + const NMR::MODELTRANSFORM& transform, + PointRange& points, + PolygonRange& triangles, + ColorRange& colors, + std::string& name) { typedef typename PointRange::value_type Point_3; typedef typename PolygonRange::value_type Polygon; typedef typename ColorRange::value_type _Color; - + typedef typename Kernel_traits::Kernel Kernel; HRESULT hResult; DWORD nNeededChars; std::vector pBuffer; + // Retrieve Mesh Name Length hResult = NMR::lib3mf_object_getnameutf8(pMeshObject, NULL, 0, &nNeededChars); if (hResult != LIB3MF_OK) @@ -68,6 +86,12 @@ bool extract_soups (NMR::PLib3MFModelMeshObject *pMeshObject, else name = std::string("Unknown Mesh"); + typename Kernel::Aff_transformation_3 t( + transform.m_fFields[0][0], transform.m_fFields[0][1], transform.m_fFields[0][2], transform.m_fFields[0][3], + transform.m_fFields[1][0], transform.m_fFields[1][1], transform.m_fFields[1][2], transform.m_fFields[1][3], + transform.m_fFields[2][0], transform.m_fFields[2][1], transform.m_fFields[2][2], transform.m_fFields[2][3] + ); + NMR::PLib3MFPropertyHandler * pPropertyHandler; hResult = NMR::lib3mf_meshobject_createpropertyhandler(pMeshObject, &pPropertyHandler); if (hResult != LIB3MF_OK) { @@ -84,10 +108,10 @@ bool extract_soups (NMR::PLib3MFModelMeshObject *pMeshObject, { NMR::MODELMESHVERTEX pVertex; NMR::lib3mf_meshobject_getvertex(pMeshObject, vid, &pVertex); - points[vid] = - Point_3(pVertex.m_fPosition[0], + Point_3 p(pVertex.m_fPosition[0], pVertex.m_fPosition[1], pVertex.m_fPosition[2]); + points[vid] = t.transform(p); } for(DWORD pid = 0; pid < triangles.size(); ++pid) { @@ -110,10 +134,11 @@ template bool extract_polylines (NMR::PLib3MFModelMeshObject *pMeshObject, - PointRange& points, - PolygonRange&, - ColorRange& colors, - std::string& name) { + const NMR::MODELTRANSFORM& transform, + PointRange& points, + PolygonRange&, + ColorRange& colors, + std::string& name) { typedef typename PointRange::value_type Point_3; typedef typename PolygonRange::value_type Polygon; @@ -175,7 +200,7 @@ bool extract_polylines (NMR::PLib3MFModelMeshObject *pMeshObject, NMR::lib3mf_propertyhandler_getcolor(pPropertyHandler, 0, &pColor);//get color of the dummy triangle NMR::MODELMESHCOLOR_SRGB mColor = pColor.m_Colors[0]; colors[0]=CGAL::Color(mColor.m_Red, mColor.m_Green, - mColor.m_Blue, mColor.m_Alpha); + mColor.m_Blue, mColor.m_Alpha); return true; } @@ -183,10 +208,11 @@ template bool extract_point_clouds (NMR::PLib3MFModelMeshObject *pMeshObject, - PointRange& points, - PolygonRange&, - ColorRange& colors, - std::string& name) { + const NMR::MODELTRANSFORM& transform, + PointRange& points, + PolygonRange&, + ColorRange& colors, + std::string& name) { typedef typename PointRange::value_type Point_3; HRESULT hResult; @@ -246,16 +272,18 @@ bool extract_point_clouds (NMR::PLib3MFModelMeshObject *pMeshObject, NMR::lib3mf_propertyhandler_getcolor(pPropertyHandler, 0, &pColor);//get color of the dummy triangle NMR::MODELMESHCOLOR_SRGB mColor = pColor.m_Colors[0]; colors[0]=CGAL::Color(mColor.m_Red, mColor.m_Green, - mColor.m_Blue, mColor.m_Alpha); + mColor.m_Blue, mColor.m_Alpha); return true; } + template int read_from_3mf(const std::string& file_name, PointRanges& all_points, - PolygonRanges& all_polygons, ColorRanges& all_colors, + PolygonRanges& all_polygons, ColorRanges& all_colors, std::vector& names, std::function int read_soups_from_3mf(const std::string& file_name, PointRanges& all_points, PolygonRanges& all_polygons, ColorRanges& all_colors, std::vector& names - ) + ) { typedef typename PointRanges::value_type PointRange; typedef typename PolygonRanges::value_type PolygonRange; @@ -425,7 +625,7 @@ int read_polylines_from_3mf(const std::string& file_name, PointRanges& all_points, ColorRanges& all_colors, std::vector& names - ) + ) { typedef typename PointRanges::value_type PointRange; typedef std::vector Polygon; @@ -444,7 +644,7 @@ int read_point_clouds_from_3mf(const std::string& file_name, PointRanges& all_points, ColorRanges& all_colors, std::vector& names - ) + ) { typedef typename PointRanges::value_type PointRange; typedef std::vector Polygon; diff --git a/Stream_support/include/CGAL/IO/write_3mf.h b/Stream_support/include/CGAL/IO/write_3mf.h index ac4500a17b2..32a6d23a3f2 100644 --- a/Stream_support/include/CGAL/IO/write_3mf.h +++ b/Stream_support/include/CGAL/IO/write_3mf.h @@ -218,6 +218,9 @@ bool write_mesh_to_model( const PointRange& points, NMR::lib3mf_release(pModel); return -1; } + + //add a builditem to finish + add_build_item(pModel, *pMeshObject); } //remember that it adds 3 demmy vertices in the beginning, and a dummy triangle to be ignored. @@ -314,6 +317,7 @@ bool write_points(const PointRange& points, NMR::lib3mf_release(pModel); return -1; } + add_build_item(pModel, *pMeshObject); } template @@ -390,6 +394,7 @@ bool write_soups_to_3mf(const std::string& file_name, else name = std::string(""); write_mesh_to_model(all_points[id], all_polygons[id], name, &pMeshObject, pModel); + add_build_item(pModel, pMeshObject); //write_mesh_object_to_model(pModel, pMeshObject); } return export_model_to_file(file_name, pModel);