-#ifdef WNT
+// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifdef WIN32
#pragma warning( disable:4786 )
#endif
#include <GEOMImpl_BlockDriver.hxx>
#include <GEOMImpl_IBlocks.hxx>
#include <GEOMImpl_IBlockTrsf.hxx>
-#include <GEOMImpl_CopyDriver.hxx>
#include <GEOMImpl_Block6Explorer.hxx>
+#include <GEOMUtils.hxx>
+
#include <GEOM_Function.hxx>
#include <GEOM_PythonDump.hxx>
#include <GEOMAlgo_ListIteratorOfListOfCoupleOfShapes.hxx>
#include <BlockFix_CheckTool.hxx>
+#include <Basics_OCCTVersion.hxx>
+
#include "utilities.h"
#include <OpUtil.hxx>
#include <Utils_ExceptHandlers.hxx>
#include <Precision.hxx>
+#include <Standard_Failure.hxx>
#include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
//=============================================================================
//Compute the Face value
try {
+ OCC_CATCH_SIGNALS;
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Block driver failed to compute a face");
return NULL;
//Compute the Face value
try {
+ OCC_CATCH_SIGNALS;
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Block driver failed to compute a face");
return NULL;
//Compute the Face value
try {
+ OCC_CATCH_SIGNALS;
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Block driver failed to compute a face");
return NULL;
//Compute the Block value
try {
+ OCC_CATCH_SIGNALS;
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Block driver failed to compute a block");
return NULL;
//Compute the Block value
try {
+ OCC_CATCH_SIGNALS;
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Block driver failed to compute a block");
return NULL;
//Compute the Blocks Compound value
try {
+ OCC_CATCH_SIGNALS;
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Block driver failed to compute a blocks compound");
return NULL;
//The GetPoint() doesn't change object so no new function is required.
Handle(GEOM_Function) aFunction = theShape->GetLastFunction();
- TCollection_AsciiString anOldDescr = aFunction->GetDescription();
//Make a Python command
- GEOM::TPythonDump(aFunction) << anOldDescr.ToCString() << "\n\t"
+ GEOM::TPythonDump(aFunction, /*append=*/true)
<< aResult << " = geompy.GetPoint(" << theShape << ", "
- << theX << ", " << theY << ", " << theZ << ", " << theEpsilon << ")";
+ << theX << ", " << theY << ", " << theZ << ", " << theEpsilon << ")";
+
+ SetErrorCode(OK);
+ return aResult;
+}
+
+//=============================================================================
+/*!
+ * GetVertexNearPoint
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetVertexNearPoint
+ (Handle(GEOM_Object) theShape,
+ Handle(GEOM_Object) thePoint)
+{
+ SetErrorCode(KO);
+
+ // New Point object
+ Handle(GEOM_Object) aResult;
+
+ // Arguments
+ if (theShape.IsNull() || thePoint.IsNull()) return NULL;
+
+ TopoDS_Shape aBlockOrComp = theShape->GetValue();
+ TopoDS_Shape aPoint = thePoint->GetValue();
+ if (aBlockOrComp.IsNull() || aPoint.IsNull()) {
+ SetErrorCode("Given shape is null");
+ return NULL;
+ }
+
+ if (aPoint.ShapeType() != TopAbs_VERTEX) {
+ SetErrorCode("Element for vertex identification is not a vertex");
+ return NULL;
+ }
+
+ TopoDS_Vertex aVert = TopoDS::Vertex(aPoint);
+ gp_Pnt aP = BRep_Tool::Pnt(aVert);
+
+ // Compute the Vertex value
+ TopoDS_Shape V;
+ bool isFound = false;
+ Standard_Real aDist = RealLast();
+ TopTools_MapOfShape mapShape;
+
+ TopExp_Explorer exp (aBlockOrComp, TopAbs_VERTEX);
+ for (; exp.More(); exp.Next()) {
+ if (mapShape.Add(exp.Current())) {
+ TopoDS_Vertex aVi = TopoDS::Vertex(exp.Current());
+ gp_Pnt aPi = BRep_Tool::Pnt(aVi);
+ Standard_Real aDisti = aPi.Distance(aP);
+ if (aDisti < aDist) {
+ V = aVi;
+ aDist = aDisti;
+ isFound = true;
+ }
+ }
+ }
+
+ if (!isFound) {
+ SetErrorCode("Vertex has not been found");
+ return NULL;
+ }
+
+ TopTools_IndexedMapOfShape anIndices;
+ TopExp::MapShapes(aBlockOrComp, anIndices);
+ Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1);
+ anArray->SetValue(1, anIndices.FindIndex(V));
+ aResult = GetEngine()->AddSubShape(theShape, anArray);
+
+ Handle(GEOM_Function) aFunction = aResult->GetLastFunction();
+
+ // Make a Python command
+ GEOM::TPythonDump(aFunction) << aResult << " = geompy.GetVertexNearPoint("
+ << theShape << ", " << thePoint << ")";
SetErrorCode(OK);
return aResult;
//Compute the Edge value
try {
+ OCC_CATCH_SIGNALS;
TopTools_IndexedDataMapOfShapeListOfShape MVE;
GEOMImpl_Block6Explorer::MapShapesAndAncestors
(aBlockOrComp, TopAbs_VERTEX, TopAbs_EDGE, MVE);
//Compute the Edge value
try {
- TopoDS_Shape aShape;
-
+ OCC_CATCH_SIGNALS;
TopoDS_Vertex aVert = TopoDS::Vertex(anArg);
+ TopoDS_Shape aShape = GEOMUtils::GetEdgeNearPoint(aBlockOrComp, aVert);
- // 1. Explode blocks on edges
- TopTools_MapOfShape mapShape;
- Standard_Integer nbEdges = 0;
- TopExp_Explorer exp (aBlockOrComp, TopAbs_EDGE);
- for (; exp.More(); exp.Next()) {
- if (mapShape.Add(exp.Current())) {
- nbEdges++;
- }
- }
-
- if (nbEdges == 0) {
- SetErrorCode("Given shape contains no edges");
- return NULL;
- }
-
- mapShape.Clear();
- Standard_Integer ind = 1;
- TopTools_Array1OfShape anEdges (1, nbEdges);
- TColStd_Array1OfReal aDistances (1, nbEdges);
- for (exp.Init(aBlockOrComp, TopAbs_EDGE); exp.More(); exp.Next()) {
- if (mapShape.Add(exp.Current())) {
- TopoDS_Shape anEdge = exp.Current();
- anEdges(ind) = anEdge;
-
- // 2. Classify the point relatively each edge
- BRepExtrema_DistShapeShape aDistTool (aVert, anEdges(ind));
- if (!aDistTool.IsDone()) {
- SetErrorCode("Can not find a distance from the given point to one of edges");
- return NULL;
- }
- aDistances(ind) = aDistTool.Value();
- ind++;
- }
- }
-
- // 3. Define edge, having minimum distance to the point
- Standard_Real nearest = RealLast(), nbFound = 0;
- Standard_Real prec = Precision::Confusion();
- for (ind = 1; ind <= nbEdges; ind++) {
- if (Abs(aDistances(ind) - nearest) < prec) {
- nbFound++;
- } else if (aDistances(ind) < nearest) {
- nearest = aDistances(ind);
- aShape = anEdges(ind);
- nbFound = 1;
- } else {
- }
- }
- if (nbFound > 1) {
- SetErrorCode("Multiple edges near the given point are found");
- return NULL;
- } else if (nbFound == 0) {
- SetErrorCode("There are no edges near the given point");
- return NULL;
- } else {
- TopTools_IndexedMapOfShape anIndices;
- TopExp::MapShapes(aBlockOrComp, anIndices);
- Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1);
- anArray->SetValue(1, anIndices.FindIndex(aShape));
- aResult = GetEngine()->AddSubShape(theShape, anArray);
- }
+ TopTools_IndexedMapOfShape anIndices;
+ TopExp::MapShapes(aBlockOrComp, anIndices);
+ Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1);
+ anArray->SetValue(1, anIndices.FindIndex(aShape));
+ aResult = GetEngine()->AddSubShape(theShape, anArray);
}
catch (Standard_Failure) {
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
//Compute the Face value
try {
+ OCC_CATCH_SIGNALS;
TopoDS_Shape aShape;
TopTools_IndexedDataMapOfShapeListOfShape MVF;
SetErrorCode("Block or compound is null");
return NULL;
}
- if (aBlockOrComp.ShapeType() != TopAbs_SOLID &&
- aBlockOrComp.ShapeType() != TopAbs_COMPOUND &&
- aBlockOrComp.ShapeType() != TopAbs_COMPSOLID) {
- SetErrorCode("Shape is neither a block, nor a compound of blocks");
- return NULL;
- }
TopoDS_Shape anArg1 = theEdge1->GetValue();
TopoDS_Shape anArg2 = theEdge2->GetValue();
//Compute the Face value
try {
+ OCC_CATCH_SIGNALS;
TopoDS_Shape aShape;
TopTools_IndexedDataMapOfShapeListOfShape MEF;
//Compute the Face value
try {
+ OCC_CATCH_SIGNALS;
TopoDS_Shape aShape;
GEOMImpl_Block6Explorer aBlockTool;
SetErrorCode("Block or compound is null");
return NULL;
}
- if (aBlockOrComp.ShapeType() != TopAbs_SOLID &&
- aBlockOrComp.ShapeType() != TopAbs_COMPOUND &&
- aBlockOrComp.ShapeType() != TopAbs_COMPSOLID) {
- SetErrorCode("Shape is neither a block, nor a compound of blocks");
- return NULL;
- }
TopoDS_Shape anArg = thePoint->GetValue();
if (anArg.IsNull()) {
//Compute the Face value
try {
+ OCC_CATCH_SIGNALS;
TopoDS_Shape aShape;
TopoDS_Vertex aVert = TopoDS::Vertex(anArg);
SetErrorCode("Block or compound is null");
return NULL;
}
- if (aBlockOrComp.ShapeType() != TopAbs_SOLID &&
- aBlockOrComp.ShapeType() != TopAbs_COMPOUND &&
- aBlockOrComp.ShapeType() != TopAbs_COMPSOLID) {
- SetErrorCode("Shape is neither a block, nor a compound of blocks");
- return NULL;
- }
TopoDS_Shape anArg = theVector->GetValue();
if (anArg.IsNull()) {
//Compute the Face value
try {
+ OCC_CATCH_SIGNALS;
TopoDS_Shape aShape;
TopoDS_Edge anEdge = TopoDS::Edge(anArg);
return aResult;
}
+//=============================================================================
+/*!
+ * GetShapesNearPoint
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetShapesNearPoint
+ (Handle(GEOM_Object) theShape,
+ Handle(GEOM_Object) thePoint,
+ const Standard_Integer theShapeType,
+ const Standard_Real theConstTolerance)
+{
+ SetErrorCode(KO);
+
+ // New object
+ Handle(GEOM_Object) aResult;
+
+ // Arguments
+ if (theShape.IsNull() || thePoint.IsNull()) return NULL;
+
+ TopoDS_Shape aBlockOrComp = theShape->GetValue();
+ if (aBlockOrComp.IsNull()) {
+ SetErrorCode("Block or compound is null");
+ return NULL;
+ }
+
+ TopoDS_Shape anArg = thePoint->GetValue();
+ if (anArg.IsNull()) {
+ SetErrorCode("Null shape is given as argument");
+ return NULL;
+ }
+ if (anArg.ShapeType() != TopAbs_VERTEX) {
+ SetErrorCode("Element for face identification is not a vertex");
+ return NULL;
+ }
+
+ if (theShapeType < TopAbs_SOLID || TopAbs_VERTEX < theShapeType) {
+ SetErrorCode("Invalid type of result is requested");
+ return NULL;
+ }
+
+ Standard_Real theTolerance = theConstTolerance;
+ if (theTolerance < Precision::Confusion()) {
+ theTolerance = Precision::Confusion();
+ }
+
+ // Compute the result
+ try {
+ OCC_CATCH_SIGNALS;
+ TopoDS_Vertex aVert = TopoDS::Vertex(anArg);
+
+ TopTools_MapOfShape mapShape;
+ Standard_Integer nbEdges = 0;
+ TopExp_Explorer exp (aBlockOrComp, TopAbs_ShapeEnum(theShapeType));
+ for (; exp.More(); exp.Next()) {
+ if (mapShape.Add(exp.Current())) {
+ nbEdges++;
+ }
+ }
+
+ if (nbEdges == 0) {
+ SetErrorCode("Given shape contains no sub-shapes of requested type");
+ return NULL;
+ }
+
+ // Calculate distances and find min
+ mapShape.Clear();
+ Standard_Integer ind = 1;
+ Standard_Real aMinDist = RealLast();
+ TopTools_Array1OfShape anEdges (1, nbEdges);
+ TColStd_Array1OfReal aDistances (1, nbEdges);
+ for (exp.Init(aBlockOrComp, TopAbs_ShapeEnum(theShapeType)); exp.More(); exp.Next()) {
+ if (mapShape.Add(exp.Current())) {
+ TopoDS_Shape anEdge = exp.Current();
+ anEdges(ind) = anEdge;
+
+ BRepExtrema_DistShapeShape aDistTool (aVert, anEdges(ind));
+ if (!aDistTool.IsDone()) {
+ SetErrorCode("Can not find a distance from the given point to one of sub-shapes");
+ return NULL;
+ }
+ aDistances(ind) = aDistTool.Value();
+ if (aDistances(ind) < aMinDist) {
+ aMinDist = aDistances(ind);
+ }
+ ind++;
+ }
+ }
+
+ if (aMinDist < RealLast()) {
+ // Collect sub-shapes with distance < (aMinDist + theTolerance)
+ int nbSubShapes = 0;
+ TopTools_Array1OfShape aNearShapes (1, nbEdges);
+ for (ind = 1; ind <= nbEdges; ind++) {
+ if (aDistances(ind) < aMinDist + theTolerance) {
+ nbSubShapes++;
+ aNearShapes(nbSubShapes) = anEdges(ind);
+ }
+ }
+
+ // Add sub-shape
+ TopTools_IndexedMapOfShape anIndices;
+ TopExp::MapShapes(aBlockOrComp, anIndices);
+ Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger (1, nbSubShapes);
+ for (ind = 1; ind <= nbSubShapes; ind++) {
+ anArray->SetValue(ind, anIndices.FindIndex(aNearShapes(ind)));
+ }
+ aResult = GetEngine()->AddSubShape(theShape, anArray);
+ }
+ }
+ catch (Standard_Failure) {
+ Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+ SetErrorCode(aFail->GetMessageString());
+ return NULL;
+ }
+
+ if (aResult.IsNull())
+ return NULL;
+
+ Handle(GEOM_Function) aFunction = aResult->GetLastFunction();
+
+ //Make a Python command
+ GEOM::TPythonDump(aFunction)
+ << aResult << " = geompy.GetShapesNearPoint(" << theShape << ", " << thePoint
+ << ", " << TopAbs_ShapeEnum(theShapeType) << ", " << theTolerance << ")";
+
+ SetErrorCode(OK);
+ return aResult;
+}
+
//=============================================================================
/*!
* IsCompoundOfBlocks
//Check
isCompOfBlocks = Standard_True;
try {
+ OCC_CATCH_SIGNALS;
TopTools_MapOfShape mapShape;
TopExp_Explorer exp (aBlockOrComp, TopAbs_SOLID);
for (; exp.More(); exp.Next()) {
void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape,
TopTools_ListOfShape& BLO,
TopTools_ListOfShape& NOT,
- TopTools_ListOfShape& EXT)
+ TopTools_ListOfShape& EXT,
+ TopTools_ListOfShape& NOQ)
{
TopAbs_ShapeEnum aType = theShape.ShapeType();
switch (aType) {
{
TopoDS_Iterator It (theShape);
for (; It.More(); It.Next()) {
- AddBlocksFrom(It.Value(), BLO, NOT, EXT);
+ AddBlocksFrom(It.Value(), BLO, NOT, EXT, NOQ);
}
}
break;
for (; expF.More(); expF.Next()) {
if (mapFaces.Add(expF.Current())) {
nbFaces++;
- if (nbFaces > 6) break;
+ //0021483//if (nbFaces > 6) break;
// get wire
TopoDS_Shape aF = expF.Current();
if (!wires.More()) {
// no wire in the face
hasNonQuadr = Standard_True;
- break;
+ NOQ.Append(aF);//0021483
+ //0021483//break;
+ continue;
}
TopoDS_Shape aWire = wires.Current();
wires.Next();
if (wires.More()) {
// multiple wires in the face
hasNonQuadr = Standard_True;
- break;
+ NOQ.Append(aF);//0021483
+ //0021483//break;
+ continue;
}
// Check number of edges in the face
}
if (nbEdges != 4) {
hasNonQuadr = Standard_True;
+ NOQ.Append(aF);//0021483
}
}
}
}
}
break;
+ case TopAbs_SHELL: //0021483
+ case TopAbs_FACE: //0021483
+ {
+ // Count edges in each face
+ TopTools_MapOfShape mapFaces;
+ TopExp_Explorer expF (theShape, TopAbs_FACE);
+ for (; expF.More(); expF.Next()) {
+ if (mapFaces.Add(expF.Current())) {
+ // get wire
+ TopoDS_Shape aF = expF.Current();
+ TopExp_Explorer wires (aF, TopAbs_WIRE);
+ if (!wires.More()) {
+ // no wire in the face
+ NOQ.Append(aF);//0021483
+ continue;
+ }
+ TopoDS_Shape aWire = wires.Current();
+ wires.Next();
+ if (wires.More()) {
+ // multiple wires in the face
+ NOQ.Append(aF);//0021483
+ continue;
+ }
+
+ // Check number of edges in the face
+ Standard_Integer nbEdges = 0;
+ TopTools_MapOfShape mapEdges;
+ TopExp_Explorer expW (aWire, TopAbs_EDGE);
+ for (; expW.More(); expW.Next()) {
+ if (mapEdges.Add(expW.Current())) {
+ nbEdges++;
+ if (nbEdges > 4) break;
+ }
+ }
+ if (nbEdges != 4) {
+ NOQ.Append(aF);//0021483
+ }
+ }
+ }
+ }
+ break;
default:
NOT.Append(theShape);
}
//=============================================================================
Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocksOld
(Handle(GEOM_Object) theCompound,
- list<BCError>& theErrors)
+ std::list<BCError>& theErrors)
{
SetErrorCode(KO);
//=============================================================================
TCollection_AsciiString GEOMImpl_IBlocksOperations::PrintBCErrors
(Handle(GEOM_Object) theCompound,
- const list<BCError>& theErrors)
+ const std::list<BCError>& theErrors)
{
TCollection_AsciiString aDescr;
- list<BCError>::const_iterator errIt = theErrors.begin();
+ std::list<BCError>::const_iterator errIt = theErrors.begin();
int i = 0;
for (; errIt != theErrors.end(); i++, errIt++) {
BCError errStruct = *errIt;
break;
}
- list<int> sshList = errStruct.incriminated;
- list<int>::iterator sshIt = sshList.begin();
+ std::list<int> sshList = errStruct.incriminated;
+ std::list<int>::iterator sshIt = sshList.begin();
int jj = 0;
for (; sshIt != sshList.end(); jj++, sshIt++) {
if (jj > 0)
//=============================================================================
Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocks
(Handle(GEOM_Object) theCompound,
- list<BCError>& theErrors)
+ std::list<BCError>& theErrors)
{
SetErrorCode(KO);
TopTools_ListOfShape NOT; // Not blocks
TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges
TopTools_ListOfShape BLO; // All blocks from the given compound
- AddBlocksFrom(aBlockOrComp, BLO, NOT, EXT);
+ TopTools_ListOfShape NOQ; // All non-quadrangular faces
+ AddBlocksFrom(aBlockOrComp, BLO, NOT, EXT, NOQ);
// Report non-blocks
if (NOT.Extent() > 0) {
}
// 3. Find not glued blocks
- GEOMAlgo_GlueAnalyser aGD;
+ GEOMAlgo_GlueAnalyser aGD;
aGD.SetShape(aComp);
aGD.SetTolerance(Precision::Confusion());
return isCompOfBlocks;
}
+//=============================================================================
+/*!
+ * GetNonBlocks
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetNonBlocks
+ (Handle(GEOM_Object) theShape,
+ Handle(GEOM_Object)& theNonQuads)
+{
+ SetErrorCode(KO);
+
+ if (theShape.IsNull()) return NULL;
+ TopoDS_Shape aShape = theShape->GetValue();
+
+ // Separate blocks from non-blocks
+ TopTools_ListOfShape BLO; // All blocks from the given compound
+ TopTools_ListOfShape NOT; // Not blocks
+ TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges
+ TopTools_ListOfShape NOQ; // All non-quadrangular faces
+ AddBlocksFrom(aShape, BLO, NOT, EXT, NOQ);
+
+ if (NOT.IsEmpty() && EXT.IsEmpty() && NOQ.IsEmpty()) {
+ SetErrorCode("NOT_FOUND_ANY");
+ return NULL;
+ }
+
+ // Map sub-shapes and their indices
+ TopTools_IndexedMapOfShape anIndices;
+ TopExp::MapShapes(aShape, anIndices);
+
+ // Non-blocks
+ Handle(GEOM_Object) aNonBlocks;
+ if (NOT.Extent() > 0 || EXT.Extent() > 0) {
+ Handle(TColStd_HArray1OfInteger) anArray =
+ new TColStd_HArray1OfInteger (1, NOT.Extent() + EXT.Extent());
+ Standard_Integer ii = 1;
+ TopTools_ListIteratorOfListOfShape it1 (NOT);
+ for (; it1.More(); it1.Next(), ii++) {
+ anArray->SetValue(ii, anIndices.FindIndex(it1.Value()));
+ }
+ TopTools_ListIteratorOfListOfShape it2 (EXT);
+ for (; it2.More(); it2.Next(), ii++) {
+ anArray->SetValue(ii, anIndices.FindIndex(it2.Value()));
+ }
+
+ aNonBlocks = GetEngine()->AddSubShape(theShape, anArray);
+ if (aNonBlocks.IsNull()) {
+ SetErrorCode("Error in algorithm: result found, but cannot be returned.");
+ return NULL;
+ }
+ aNonBlocks->SetType(GEOM_GROUP);
+ TDF_Label aFreeLabel = aNonBlocks->GetFreeLabel();
+ TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)TopAbs_SOLID);
+ }
+
+ // Non-quadrangles
+ if (NOQ.Extent() > 0) {
+ Handle(TColStd_HArray1OfInteger) anArray =
+ new TColStd_HArray1OfInteger (1, NOQ.Extent());
+ Standard_Integer ii = 1;
+ TopTools_ListIteratorOfListOfShape it1 (NOQ);
+ for (; it1.More(); it1.Next(), ii++) {
+ anArray->SetValue(ii, anIndices.FindIndex(it1.Value()));
+ }
+
+ theNonQuads = GetEngine()->AddSubShape(theShape, anArray);
+ if (theNonQuads.IsNull()) {
+ SetErrorCode("Error in algorithm: result found, but cannot be returned.");
+ return NULL;
+ }
+ theNonQuads->SetType(GEOM_GROUP);
+ TDF_Label aFreeLabel = theNonQuads->GetFreeLabel();
+ TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)TopAbs_FACE);
+ }
+
+ //Make a Python command
+ Handle(GEOM_Function) aMainShape = theShape->GetLastFunction();
+ GEOM::TPythonDump pd (aMainShape, /*append=*/true);
+ pd << "(";
+ if (aNonBlocks.IsNull())
+ pd << "no_bad_solids";
+ else
+ pd << aNonBlocks;
+ pd << ", ";
+ if (theNonQuads.IsNull())
+ pd << "no_bad_faces";
+ else
+ pd << theNonQuads;
+ pd << ") = geompy.GetNonBlocks(" << theShape << ")";
+
+ SetErrorCode(OK);
+ return aNonBlocks;
+}
+
//=============================================================================
/*!
* RemoveExtraEdges
*/
//=============================================================================
Handle(GEOM_Object) GEOMImpl_IBlocksOperations::RemoveExtraEdges
- (Handle(GEOM_Object) theObject)
+ (Handle(GEOM_Object) theObject,
+ const Standard_Integer theOptimumNbFaces)
{
SetErrorCode(KO);
GEOMImpl_IBlockTrsf aTI (aFunction);
aTI.SetOriginal(aLastFunction);
+ aTI.SetOptimumNbFaces(theOptimumNbFaces);
//Compute the fixed shape
try {
+ OCC_CATCH_SIGNALS;
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Block driver failed to remove extra edges of the given shape");
return NULL;
}
//Make a Python command
- GEOM::TPythonDump(aFunction) << aCopy
- << " = geompy.RemoveExtraEdges(" << theObject << ")";
+ std::string doUnionFaces = (theOptimumNbFaces < 0) ? "False" : "True";
+ GEOM::TPythonDump(aFunction) << aCopy << " = geompy.RemoveExtraEdges("
+ << theObject << ", " << doUnionFaces.data() << ")";
+
+ SetErrorCode(OK);
+ return aCopy;
+}
+
+//=============================================================================
+/*!
+ * UnionFaces
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_IBlocksOperations::UnionFaces
+ (Handle(GEOM_Object) theObject)
+{
+ SetErrorCode(KO);
+
+ if (theObject.IsNull()) return NULL;
+
+ Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction();
+ if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be fixed
+
+ //Add a new Copy object
+ Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), GEOM_COPY);
+
+ //Add a function
+ Handle(GEOM_Function) aFunction =
+ aCopy->AddFunction(GEOMImpl_BlockDriver::GetID(), BLOCK_UNION_FACES);
+
+ //Check if the function is set correctly
+ if (aFunction->GetDriverGUID() != GEOMImpl_BlockDriver::GetID()) return NULL;
+
+ GEOMImpl_IBlockTrsf aTI (aFunction);
+ aTI.SetOriginal(aLastFunction);
+
+ //Compute the fixed shape
+ try {
+ OCC_CATCH_SIGNALS;
+ if (!GetSolver()->ComputeFunction(aFunction)) {
+ SetErrorCode("Block driver failed to remove extra edges of the given shape");
+ return NULL;
+ }
+ }
+ catch (Standard_Failure) {
+ Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+ SetErrorCode(aFail->GetMessageString());
+ return NULL;
+ }
+
+ //Make a Python command
+ GEOM::TPythonDump(aFunction) << aCopy << " = geompy.UnionFaces("
+ << theObject << ")";
SetErrorCode(OK);
return aCopy;
GEOMImpl_IBlockTrsf aTI (aFunction);
aTI.SetOriginal(aLastFunction);
+ // -1 means do not unite faces on common surface (?except case of seam edge between them?)
+ //aTI.SetOptimumNbFaces(-1);
+ aTI.SetOptimumNbFaces(6);
+
//Compute the fixed shape
try {
+ OCC_CATCH_SIGNALS;
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Block driver failed to improve the given blocks compound");
return NULL;
// Explode
try {
+ OCC_CATCH_SIGNALS;
TopExp_Explorer exp (aBlockOrComp, TopAbs_SOLID);
for (; exp.More(); exp.Next()) {
if (mapShape.Add(exp.Current())) {
//The explode doesn't change object so no new function is required.
aFunction = theCompound->GetLastFunction();
- TCollection_AsciiString anOldDescr = aFunction->GetDescription();
//Make a Python command
- GEOM::TPythonDump(aFunction) << anOldDescr.ToCString() << "\n\t["
- << anAsciiList.ToCString() << "] = geompy.MakeBlockExplode("
- << theCompound << ", " << theMinNbFaces << ", " << theMaxNbFaces << ")";
+ GEOM::TPythonDump(aFunction, /*append=*/true)
+ << "[" << anAsciiList.ToCString() << "] = geompy.MakeBlockExplode("
+ << theCompound << ", " << theMinNbFaces << ", " << theMaxNbFaces << ")";
SetErrorCode(OK);
return aBlocks;
//Compute the Block value
try {
+ OCC_CATCH_SIGNALS;
TopoDS_Shape aShape;
TopoDS_Vertex aVert = TopoDS::Vertex(anArg);
//Compute the Block value
try {
+ OCC_CATCH_SIGNALS;
// 1. Explode compound on solids
TopTools_MapOfShape mapShape;
Standard_Integer nbSolids = 0;
//Get the Blocks
try {
+ OCC_CATCH_SIGNALS;
TopTools_MapOfShape mapShape;
Standard_Integer nbSolids = 0;
TopExp_Explorer exp (aBlockOrComp, TopAbs_SOLID);
//Compute the transformation
try {
+ OCC_CATCH_SIGNALS;
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Block driver failed to make multi-transformation");
return NULL;
//Compute the transformation
try {
+ OCC_CATCH_SIGNALS;
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Block driver failed to make multi-transformation");
return NULL;
TopTools_MapOfShape mapAcceptedEdges;
TCollection_AsciiString aListRes, anEntry;
+ // Sort shapes in current chain (Mantis issue 21053)
+ TopTools_DataMapOfShapeListOfShape aMapChains;
+ TopTools_ListOfShape aFirstInChains;
+
for (ie = 1; ie <= nbEdges; ie++) {
TopoDS_Shape curE = MEW.FindKey(ie);
listPrevEdges = listCurEdges;
} // while (listPrevEdges.Extent() > 0)
+ // Sort shapes in current chain (Mantis issue 21053)
+ GEOMUtils::SortShapes(currentChain, Standard_False);
+ aFirstInChains.Append(currentChain.First());
+ aMapChains.Bind(currentChain.First(), currentChain);
+ }
+
+ // Sort chains (Mantis issue 21053)
+ GEOMUtils::SortShapes(aFirstInChains, Standard_False);
+
+ // Store sorted chains in the document
+ TopTools_ListIteratorOfListOfShape aChainsIt (aFirstInChains);
+ for (; aChainsIt.More(); aChainsIt.Next()) {
+ TopoDS_Shape aFirstInChain = aChainsIt.Value();
+ const TopTools_ListOfShape& currentChain = aMapChains.Find(aFirstInChain);
+
// Store the chain in the document
Handle(TColStd_HArray1OfInteger) anArray =
new TColStd_HArray1OfInteger (1, currentChain.Extent());
// Set a GROUP type
aChain->SetType(GEOM_GROUP);
- // Set a sub shape type
+ // Set a sub-shape type
TDF_Label aFreeLabel = aChain->GetFreeLabel();
TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)TopAbs_EDGE);
// The Propagation doesn't change object so no new function is required.
Handle(GEOM_Function) aFunction = theShape->GetLastFunction();
- TCollection_AsciiString anOldDescr = aFunction->GetDescription();
// Make a Python command
- GEOM::TPythonDump(aFunction) << anOldDescr.ToCString() << "\n\t["
- << aListRes.ToCString() << "] = geompy.Propagate(" << theShape << ")";
+ GEOM::TPythonDump(aFunction, /*append=*/true)
+ << "[" << aListRes.ToCString() << "] = geompy.Propagate(" << theShape << ")";
SetErrorCode(OK);
return aSeq;