-// Copyright (C) 2014-2019 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2020 CEA/DEN, EDF R&D
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
#include <Geom_Plane.hxx>
#include <Geom_RectangularTrimmedSurface.hxx>
#include <Geom_TrimmedCurve.hxx>
+#include <GeomLib_IsPlanarSurface.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Iterator.hxx>
bool GeomAPI_Shape::isSame(const std::shared_ptr<GeomAPI_Shape> theShape) const
{
- if (!theShape.get())
- return false;
+ bool isNullShape = !theShape.get() || theShape->isNull();;
if (isNull())
- return theShape->isNull();
- if (theShape->isNull())
+ return isNullShape;
+ if (isNullShape)
return false;
return MY_SHAPE->IsSame(theShape->impl<TopoDS_Shape>()) == Standard_True;
// (if shapes are connected, vertices are connected for sure)
TopExp_Explorer anExp2(aNewIter.Value(), TopAbs_VERTEX);
for(; !aConnected && anExp2.More(); anExp2.Next()) {
- NCollection_List<TopoDS_Shape>::Iterator aNotIter(aNotVertices);
- for(; aNotIter.More(); aNotIter.Next()) {
- if (aNotIter.Value().IsSame(anExp2.Current())) {
+ NCollection_List<TopoDS_Shape>::Iterator aNotVIter(aNotVertices);
+ for(; aNotVIter.More(); aNotVIter.Next()) {
+ if (aNotVIter.Value().IsSame(anExp2.Current())) {
aConnected = true;
break;
}
if(aShapeType == TopAbs_VERTEX) {
return true;
} else if(aShapeType == TopAbs_FACE) {
- const Handle(Geom_Surface)& aSurface = BRep_Tool::Surface(TopoDS::Face(aShape));
- Handle(Standard_Type) aType = aSurface->DynamicType();
-
- if(aType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
+ Handle(Geom_Surface) aSurface = BRep_Tool::Surface(TopoDS::Face(aShape));
+ if(aSurface->DynamicType() == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
Handle(Geom_RectangularTrimmedSurface) aTrimSurface =
- Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurface);
- aType = aTrimSurface->BasisSurface()->DynamicType();
+ Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurface);
+ aSurface = aTrimSurface->BasisSurface();
}
- return (aType == STANDARD_TYPE(Geom_Plane)) == Standard_True;
+ return GeomLib_IsPlanarSurface(aSurface).IsPlanar();
} else {
BRepBuilderAPI_FindPlane aFindPlane(aShape);
bool isFound = aFindPlane.Found() == Standard_True;
GeomAPI_Shape::ShapeType GeomAPI_Shape::shapeTypeByStr(std::string theType)
{
- std::transform(theType.begin(), theType.end(), theType.begin(), ::toupper);
+ std::transform(theType.begin(), theType.end(), theType.begin(),
+ [](char c) { return static_cast<char>(::toupper(c)); });
if (theType == "COMPOUND" || theType == "COMPOUNDS")
return COMPOUND;
if (theType == "COMPSOLID" || theType == "COMPSOLIDS")
void GeomAPI_Shape::setOrientation(const GeomAPI_Shape::Orientation theOrientation)
{
- TopAbs_Orientation anOrientation = MY_SHAPE->Orientation();
-
switch(theOrientation) {
case FORWARD: MY_SHAPE->Orientation(TopAbs_FORWARD); break;
case REVERSED: MY_SHAPE->Orientation(TopAbs_REVERSED); break;
if (aShape.IsNull())
return false;
Bnd_Box aBndBox;
- BRepBndLib::Add(aShape, aBndBox, false);
+ // Workaround: compute optimal bounding box for the compounds of edges/vertices, because sometimes
+ // the bounding box of sketch is calculated if the transformation is applied twice (issue #20167).
+ bool isShape1D = false;
+ if (aShape.ShapeType() == TopAbs_COMPOUND) {
+ isShape1D = true;
+ for (TopoDS_Iterator anIt(aShape); anIt.More() && isShape1D; anIt.Next())
+ if (anIt.Value().ShapeType() < TopAbs_WIRE)
+ isShape1D = false;
+ }
+ if (isShape1D)
+ BRepBndLib::AddOptimal(aShape, aBndBox, false, true);
+ else
+ BRepBndLib::Add(aShape, aBndBox, false);
if (aBndBox.IsVoid())
return false;
aBndBox.Get(theXmin, theYmin, theZmin, theXmax, theYmax, theZmax);
if (!theWithTriangulation) { // make a copy of shape without triangulation
BRepBuilderAPI_Copy aCopy(aShape, Standard_False, Standard_False);
const TopoDS_Shape& aCopyShape = aCopy.Shape();
+ // make all faces unchecked to make the stream of shapes the same
+ TopExp_Explorer aFaceExp(aCopyShape, TopAbs_FACE);
+ for(; aFaceExp.More(); aFaceExp.Next()) {
+ aFaceExp.Current().TShape()->Checked(Standard_False);
+ }
BRepTools::Write(aCopyShape, aStream);
} else {
BRepTools::Write(aShape, aStream);