diff --git a/src/Mod/Mesh/App/AppMeshPy.cpp b/src/Mod/Mesh/App/AppMeshPy.cpp index 526419ef56..1570867aeb 100644 --- a/src/Mod/Mesh/App/AppMeshPy.cpp +++ b/src/Mod/Mesh/App/AppMeshPy.cpp @@ -209,6 +209,20 @@ private: pcDoc->addObject(pcFeature, file.fileNamePure().c_str()); } + else if (mat.binding == MeshCore::MeshIO::PER_FACE && + mat.diffuseColor.size() == mesh.countFacets()) { + FeatureCustom *pcFeature = new FeatureCustom(); + pcFeature->Label.setValue(file.fileNamePure().c_str()); + pcFeature->Mesh.swapMesh(mesh); + App::PropertyColorList* prop = static_cast + (pcFeature->addDynamicProperty("App::PropertyColorList", "FaceColors")); + if (prop) { + prop->setValues(mat.diffuseColor); + } + pcFeature->purgeTouched(); + + pcDoc->addObject(pcFeature, file.fileNamePure().c_str()); + } else { Mesh::Feature *pcFeature = static_cast (pcDoc->addObject("Mesh::Feature", file.fileNamePure().c_str())); @@ -274,6 +288,20 @@ private: pcDoc->addObject(pcFeature, file.fileNamePure().c_str()); } + else if (mat.binding == MeshCore::MeshIO::PER_FACE && + mat.diffuseColor.size() == mesh.countFacets()) { + FeatureCustom *pcFeature = new FeatureCustom(); + pcFeature->Label.setValue(file.fileNamePure().c_str()); + pcFeature->Mesh.swapMesh(mesh); + App::PropertyColorList* prop = static_cast + (pcFeature->addDynamicProperty("App::PropertyColorList", "FaceColors")); + if (prop) { + prop->setValues(mat.diffuseColor); + } + pcFeature->purgeTouched(); + + pcDoc->addObject(pcFeature, file.fileNamePure().c_str()); + } else { Mesh::Feature *pcFeature = static_cast (pcDoc->addObject("Mesh::Feature", file.fileNamePure().c_str())); diff --git a/src/Mod/Mesh/Gui/ViewProvider.cpp b/src/Mod/Mesh/Gui/ViewProvider.cpp index addc0c42bc..0535929462 100644 --- a/src/Mod/Mesh/Gui/ViewProvider.cpp +++ b/src/Mod/Mesh/Gui/ViewProvider.cpp @@ -368,7 +368,7 @@ void ViewProviderMesh::onChanged(const App::Property* prop) pLineColor->diffuseColor.setValue(c.r,c.g,c.b); } else if (prop == &Coloring) { - tryColorPerVertex(Coloring.getValue()); + tryColorPerVertexOrFace(Coloring.getValue()); } else { // Set the inverse color for open edges @@ -538,7 +538,7 @@ App::PropertyColorList* ViewProviderMesh::getColorProperty() const return 0; // no such property found } -void ViewProviderMesh::tryColorPerVertex(bool on) +void ViewProviderMesh::tryColorPerVertexOrFace(bool on) { if (on) { App::PropertyColorList* colors = getColorProperty(); @@ -546,10 +546,14 @@ void ViewProviderMesh::tryColorPerVertex(bool on) const Mesh::PropertyMeshKernel& meshProp = static_cast(pcObject)->Mesh; const Mesh::MeshObject& mesh = meshProp.getValue(); int numPoints = static_cast(mesh.countPoints()); + int numFacets = static_cast(mesh.countFacets()); if (colors->getSize() == numPoints) { setColorPerVertex(colors); } + else if (colors->getSize() == numFacets) { + setColorPerFace(colors); + } } } else { @@ -575,6 +579,22 @@ void ViewProviderMesh::setColorPerVertex(const App::PropertyColorList* prop) pcShapeMaterial->diffuseColor.finishEditing(); } +void ViewProviderMesh::setColorPerFace(const App::PropertyColorList* prop) +{ + pcMatBinding->value = SoMaterialBinding::PER_FACE; + const std::vector& val = prop->getValues(); + + pcShapeMaterial->diffuseColor.setNum(val.size()); + SbColor* col = pcShapeMaterial->diffuseColor.startEditing(); + + std::size_t i=0; + for (std::vector::const_iterator it = val.begin(); it != val.end(); ++it) { + col[i++].setValue(it->r, it->g, it->b); + } + + pcShapeMaterial->diffuseColor.finishEditing(); +} + void ViewProviderMesh::setDisplayMode(const char* ModeName) { if (strcmp("Shaded",ModeName)==0) { @@ -1787,6 +1807,23 @@ void ViewProviderMesh::removeFacets(const std::vector& facets) prop->setValues(valid_colors); } } + else if (prop && prop->getSize() == static_cast(kernel->countPoints())) { + // switch off coloring mode + Coloring.setValue(false); + + std::vector validFacets(kernel->countFacets(), true); + for (auto it : facets) + validFacets[it] = false; + + const std::vector& colors = prop->getValues(); + std::vector valid_colors; + valid_colors.reserve(colors.size()); + std::size_t numColors = colors.size(); + for (std::size_t index = 0; index < numColors; index++) { + if (validFacets[index]) + valid_colors.push_back(colors[index]); + } + } //Remove the facets from the mesh and open a transaction object for the undo/redo stuff kernel->deleteFacets(facets); diff --git a/src/Mod/Mesh/Gui/ViewProvider.h b/src/Mod/Mesh/Gui/ViewProvider.h index bdba32142f..2026d0dc67 100644 --- a/src/Mod/Mesh/Gui/ViewProvider.h +++ b/src/Mod/Mesh/Gui/ViewProvider.h @@ -190,8 +190,9 @@ protected: void highlightSegments(); void setHighlightedSegments(bool); App::PropertyColorList* getColorProperty() const; - void tryColorPerVertex(bool); + void tryColorPerVertexOrFace(bool); void setColorPerVertex(const App::PropertyColorList*); + void setColorPerFace(const App::PropertyColorList*); virtual SoShape* getShapeNode() const; virtual SoNode* getCoordNode() const;