#include <Model_ResultBody.h>
#include <Model_Data.h>
#include <Model_Document.h>
+#include <ModelAPI_AttributeIntArray.h>
#include <TNaming_Builder.hxx>
#include <TNaming_NamedShape.hxx>
#include <TDataStd_Name.hxx>
#include <TopTools_DataMapOfShapeShape.hxx>
#include <TopExp.hxx>
#include <BRepTools.hxx>
+#include <BRep_Tool.hxx>
#include <GeomAPI_Shape.h>
#include <GeomAlgoAPI_MakeShape.h>
+#include <Config_PropManager.h>
// DEB
//#include <TCollection_AsciiString.hxx>
//#include <TDF_Tool.hxx>
+//#define DEB_IMPORT 1
+
Model_ResultBody::Model_ResultBody()
{
setIsConcealed(false);
}
+void Model_ResultBody::initAttributes()
+{
+ // append the color attribute. It is empty, the attribute will be filled by a request
+ DataPtr aData = data();
+ aData->addAttribute(COLOR_ID(), ModelAPI_AttributeIntArray::type());
+}
+
+void Model_ResultBody::colorConfigInfo(std::string& theSection, std::string& theName,
+ std::string& theDefault)
+{
+ theSection = "Visualization";
+ theName = "result_body_color";
+ theDefault = DEFAULT_COLOR();
+}
+
void Model_ResultBody::store(const std::shared_ptr<GeomAPI_Shape>& theShape)
{
std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(data());
{
const TopTools_ListOfShape& aLL = anEdgeAndNeighbourFaces.FindFromIndex(i);
if (aLL.Extent() < 2) {
+ if (BRep_Tool::Degenerated(TopoDS::Edge(anEdgeAndNeighbourFaces.FindKey(i))))
+ continue;
builder(theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i));
TCollection_AsciiString aStr(theTag);
aName = theName + aStr.ToCString();
}
}
}
+
+//=======================================================================
+int findAmbiguities(const TopoDS_Shape& theShapeIn,
+ TopTools_ListOfShape& theList)
+{
+ int aNumEdges(0);
+ theList.Clear();
+ TopTools_IndexedDataMapOfShapeListOfShape subShapeAndAncestors;
+ TopAbs_ShapeEnum aTS(TopAbs_EDGE);
+ TopAbs_ShapeEnum aTA(TopAbs_FACE);
+ TopTools_MapOfShape aMap1, aMap2; // map1 - for edge ancestors; map2 - for keys => edges
+ TopTools_ListOfShape aKeyList;
+ TopExp::MapShapesAndAncestors(theShapeIn, aTS, aTA, subShapeAndAncestors);
+ for (Standard_Integer i = 1; i <= subShapeAndAncestors.Extent(); i++) {
+ const TopoDS_Shape& aKeyEdge1 = subShapeAndAncestors.FindKey(i);
+ const TopTools_ListOfShape& ancestors1 = subShapeAndAncestors.FindFromIndex(i);
+ aMap1.Clear();
+ TopTools_ListIteratorOfListOfShape it(ancestors1);
+ for(;it.More();it.Next()) aMap1.Add(it.Value()); // fill map with key ancestors => aKey1
+ for (Standard_Integer j = 1; j <= subShapeAndAncestors.Extent(); j++) {
+ if (i == j) continue;
+ const TopoDS_Shape& aKeyEdge2 = subShapeAndAncestors.FindKey(j);
+ const TopTools_ListOfShape& ancestors2 = subShapeAndAncestors.FindFromIndex(j);
+ if(ancestors1.Extent() == ancestors2.Extent() && ancestors1.Extent() > 1) {
+ int aNum (ancestors2.Extent());
+ TopTools_ListIteratorOfListOfShape it(ancestors2);
+ for(;it.More();it.Next())
+ if(aMap1.Contains(it.Value())) aNum--;
+ if(aNum == 0) {
+ if(aMap2.Add(aKeyEdge1))
+ aKeyList.Append(aKeyEdge1);
+ if(aMap2.Add(aKeyEdge2))
+ aKeyList.Append(aKeyEdge2);
+ }
+ }
+ } // at the end ==> List of edges to be named in addition
+ }
+ aNumEdges = aKeyList.Extent();
+ if(aNumEdges)
+ theList.Assign(aKeyList);
+ return aNumEdges;
+}
+
//=======================================================================
void Model_ResultBody::loadFirstLevel(
std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int& theTag)
itrShape->setImpl(new TopoDS_Shape(aShape));
loadNextLevels(itrShape, theName, theTag);
}
+ TopTools_ListOfShape aList;
+ if(findAmbiguities(aShape, aList)) {
+ TopTools_ListIteratorOfListOfShape it(aList);
+ for (; it.More(); it.Next(),theTag++) {
+ builder(theTag)->Generated(it.Value());
+ TCollection_AsciiString aStr(theTag);
+ aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
+ }
+ }
}
//=======================================================================
edgeNaborFaces.ChangeFind(anEdge).Append(aFace);
}
}
-
+
+/* TopTools_IndexedDataMapOfShapeListOfShape aDM;
+ TopExp::MapShapesAndAncestors(aShape, TopAbs_EDGE, TopAbs_FACE, aDM);
+ for(int i=1; i <= aDM.Extent(); i++) {
+ if(aDM.FindFromIndex(i).Extent() > 1) continue;
+ if (BRep_Tool::Degenerated(TopoDS::Edge(aDM.FindKey(i))))
+ continue;
+ builder(theTag)->Generated(aDM.FindKey(i));
+ TCollection_AsciiString aStr(theTag);
+ std::string aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
+#ifdef DEB_IMPORT
+ aName += + ".brep";
+ BRepTools::Write(aDM.FindKey(i), aName.c_str());
+#endif
+ theTag++;
+ }
+*/
TopTools_MapOfShape anEdgesToDelete;
TopExp_Explorer anEx(aShape,TopAbs_EDGE);
std::string aName;
buildName(theTag, aName);
theTag++;
}
- }
+ }
}
void Model_ResultBody::loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int& theTag)
{
if(theShape->isNull()) return;
TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
- TopTools_DataMapOfShapeListOfShape vertexNaborFaces;
+ TopTools_DataMapOfShapeListOfShape vertexNaborEdges;
TopTools_ListOfShape empty;
- TopExp_Explorer explF(aShape, TopAbs_FACE);
+ TopExp_Explorer explF(aShape, TopAbs_EDGE);
for (; explF.More(); explF.Next()) {
- const TopoDS_Shape& aFace = explF.Current();
- TopExp_Explorer explV(aFace, TopAbs_VERTEX);
+ const TopoDS_Shape& anEdge = explF.Current();
+ TopExp_Explorer explV(anEdge, TopAbs_VERTEX);
for (; explV.More(); explV.Next()) {
const TopoDS_Shape& aVertex = explV.Current();
- if (!vertexNaborFaces.IsBound(aVertex)) vertexNaborFaces.Bind(aVertex, empty);
+ if (!vertexNaborEdges.IsBound(aVertex)) vertexNaborEdges.Bind(aVertex, empty);
Standard_Boolean faceIsNew = Standard_True;
- TopTools_ListIteratorOfListOfShape itrF(vertexNaborFaces.Find(aVertex));
+ TopTools_ListIteratorOfListOfShape itrF(vertexNaborEdges.Find(aVertex));
for (; itrF.More(); itrF.Next()) {
- if (itrF.Value().IsSame(aFace)) {
+ if (itrF.Value().IsSame(anEdge)) {
faceIsNew = Standard_False;
break;
}
}
if (faceIsNew) {
- vertexNaborFaces.ChangeFind(aVertex).Append(aFace);
+ vertexNaborEdges.ChangeFind(aVertex).Append(anEdge);
}
}
}
std::string aName;
- TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itr(vertexNaborFaces);
+ TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itr(vertexNaborEdges);
for (; itr.More(); itr.Next()) {
- const TopTools_ListOfShape& naborFaces = itr.Value();
- if (naborFaces.Extent() < 1) {
+ const TopTools_ListOfShape& naborEdges = itr.Value();
+ if (naborEdges.Extent() < 2) {
builder(theTag)->Generated(itr.Key());
TCollection_AsciiString aStr(theTag);
aName = theName + aStr.ToCString();
theTag++;
}
}
-}
\ No newline at end of file
+}