switch(aBaseShapeType) {
case GeomAPI_Shape::VERTEX: {
aShapeTypeToExplode = GeomAPI_Shape::VERTEX;
- aGenName += "Edge";
break;
}
case GeomAPI_Shape::EDGE:
case GeomAPI_Shape::FACE:
case GeomAPI_Shape::SHELL: {
aShapeTypeToExplode = GeomAPI_Shape::EDGE;
- aGenName += "Face";
break;
}
case GeomAPI_Shape::COMPOUND: {
aStr << theName << "_" << theShapeIndex++;
theResultBody->generated(aSubShape, aStr.str(), theTag++);
}
-}
\ No newline at end of file
+}
#include <map>
#include <sstream>
-//=================================================================================================
+static void storeSubShape(ResultBodyPtr theResultBody,
+ const GeomShapePtr theShape,
+ const GeomAPI_Shape::ShapeType theType,
+ const std::shared_ptr<GeomAPI_DataMapOfShapeShape> theMapOfSubShapes,
+ const std::string theName,
+ int& theShapeIndex,
+ int& theTag);
+
+//==================================================================================================
FeaturesPlugin_Pipe::FeaturesPlugin_Pipe()
{
}
-//=================================================================================================
+//==================================================================================================
void FeaturesPlugin_Pipe::initAttributes()
{
data()->addAttribute(CREATION_METHOD(), ModelAPI_AttributeString::typeId());
ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), LOCATIONS_ID());
}
-//=================================================================================================
+//==================================================================================================
void FeaturesPlugin_Pipe::execute()
{
// Getting creation method.
removeResults(aResultIndex);
}
-//=================================================================================================
+//==================================================================================================
void FeaturesPlugin_Pipe::storeResult(const std::shared_ptr<GeomAPI_Shape> theBaseShape,
GeomAlgoAPI_Pipe& thePipeAlgo,
const int theResultIndex)
switch(aBaseShapeType) {
case GeomAPI_Shape::VERTEX: {
aShapeTypeToExplode = GeomAPI_Shape::VERTEX;
- aGenName += "Edge";
break;
}
case GeomAPI_Shape::EDGE:
case GeomAPI_Shape::FACE:
case GeomAPI_Shape::SHELL: {
aShapeTypeToExplode = GeomAPI_Shape::EDGE;
- aGenName += "Face";
break;
}
+ case GeomAPI_Shape::COMPOUND: {
+ aShapeTypeToExplode = GeomAPI_Shape::COMPOUND;
+ }
+ }
+
+ if(aShapeTypeToExplode == GeomAPI_Shape::VERTEX || aShapeTypeToExplode == GeomAPI_Shape::COMPOUND) {
+ aResultBody->loadAndOrientGeneratedShapes(&thePipeAlgo, theBaseShape, GeomAPI_Shape::VERTEX,
+ aGenTag++, aGenName + "Edge", *aMapOfSubShapes.get());
+ }
+ if(aShapeTypeToExplode == GeomAPI_Shape::EDGE || aShapeTypeToExplode == GeomAPI_Shape::COMPOUND) {
+ aResultBody->loadAndOrientGeneratedShapes(&thePipeAlgo, theBaseShape, GeomAPI_Shape::EDGE,
+ aGenTag++, aGenName + "Face", *aMapOfSubShapes.get());
}
+
aResultBody->loadAndOrientGeneratedShapes(&thePipeAlgo, theBaseShape, aShapeTypeToExplode, aGenTag++, aGenName, *aMapOfSubShapes.get());
// Store from shapes.
setResult(aResultBody, theResultIndex);
}
-//=================================================================================================
+//==================================================================================================
void FeaturesPlugin_Pipe::storeResult(const ListOfShape& theBaseShapes,
GeomAlgoAPI_Pipe& thePipeAlgo,
const int theResultIndex)
setResult(aResultBody, theResultIndex);
}
-//=================================================================================================
+//==================================================================================================
void FeaturesPlugin_Pipe::storeShapes(ResultBodyPtr theResultBody,
const GeomAPI_Shape::ShapeType theBaseShapeType,
const std::shared_ptr<GeomAPI_DataMapOfShapeShape> theMapOfSubShapes,
aShapeTypeStr = "Face";
break;
}
+ case GeomAPI_Shape::COMPOUND: {
+ aShapeTypeToExplore = GeomAPI_Shape::COMPOUND;
+ break;
+ }
}
// Store shapes.
int aShapeIndex = 1;
- std::string aName = theName + aShapeTypeStr;
+ int aFaceIndex = 1;
for(ListOfShape::const_iterator anIt = theShapes.cbegin(); anIt != theShapes.cend(); ++anIt) {
- std::shared_ptr<GeomAPI_Shape> aShape = *anIt;
- for(GeomAPI_ShapeExplorer anExp(aShape, aShapeTypeToExplore); anExp.more(); anExp.next()) {
- std::shared_ptr<GeomAPI_Shape> aSubShape = anExp.current();
- if(theMapOfSubShapes->isBound(aSubShape)) {
- aSubShape = theMapOfSubShapes->find(aSubShape);
- }
- std::ostringstream aStr;
- aStr << aName << "_" << aShapeIndex++;
- theResultBody->generated(aSubShape, aStr.str(), theTag++);
+ GeomShapePtr aShape = *anIt;
+
+ if(aShapeTypeToExplore == GeomAPI_Shape::COMPOUND) {
+ std::string aName = theName + (aShape->shapeType() == GeomAPI_Shape::EDGE ? "Edge" : "Face");
+ storeSubShape(theResultBody,
+ aShape,
+ aShape->shapeType(),
+ theMapOfSubShapes,
+ aName,
+ aShape->shapeType() == GeomAPI_Shape::EDGE ? aShapeIndex : aFaceIndex,
+ theTag);
+ } else {
+ std::string aName = theName + aShapeTypeStr;
+ storeSubShape(theResultBody, aShape, aShapeTypeToExplore,
+ theMapOfSubShapes, aName, aShapeIndex, theTag);
+ }
+ }
+}
+
+//==================================================================================================
+void storeSubShape(ResultBodyPtr theResultBody,
+ const GeomShapePtr theShape,
+ const GeomAPI_Shape::ShapeType theType,
+ const std::shared_ptr<GeomAPI_DataMapOfShapeShape> theMapOfSubShapes,
+ const std::string theName,
+ int& theShapeIndex,
+ int& theTag)
+{
+ for(GeomAPI_ShapeExplorer anExp(theShape, theType); anExp.more(); anExp.next()) {
+ GeomShapePtr aSubShape = anExp.current();
+ if(theMapOfSubShapes->isBound(aSubShape)) {
+ aSubShape = theMapOfSubShapes->find(aSubShape);
}
+ std::ostringstream aStr;
+ aStr << theName << "_" << theShapeIndex++;
+ theResultBody->generated(aSubShape, aStr.str(), theTag++);
}
}
static bool getPath(TopoDS_Wire& thePathOut,
const GeomShapePtr thePathShape);
static bool buildPipe(BRepOffsetAPI_MakePipeShell* thePipeBuilder);
+static ListOfShape getListFromShape(const TopoDS_Shape& theShape);
-//=================================================================================================
+//==================================================================================================
GeomAlgoAPI_Pipe::GeomAlgoAPI_Pipe(const GeomShapePtr theBaseShape,
const GeomShapePtr thePathShape)
{
build(theBaseShape, thePathShape);
}
-//=================================================================================================
+//==================================================================================================
GeomAlgoAPI_Pipe::GeomAlgoAPI_Pipe(const GeomShapePtr theBaseShape,
const GeomShapePtr thePathShape,
const GeomShapePtr theBiNormal)
build(theBaseShape, thePathShape, theBiNormal);
}
-//=================================================================================================
+//==================================================================================================
GeomAlgoAPI_Pipe::GeomAlgoAPI_Pipe(const ListOfShape& theBaseShapes,
const ListOfShape& theLocations,
const GeomShapePtr thePathShape)
build(theBaseShapes, theLocations, thePathShape);
}
-//=================================================================================================
+//==================================================================================================
void GeomAlgoAPI_Pipe::build(const GeomShapePtr theBaseShape,
const GeomShapePtr thePathShape)
{
TopAbs_ShapeEnum aBaseShapeType = aBaseShape.ShapeType();
if(aBaseShapeType != TopAbs_VERTEX && aBaseShapeType != TopAbs_EDGE &&
aBaseShapeType != TopAbs_WIRE && aBaseShapeType != TopAbs_FACE &&
- aBaseShapeType != TopAbs_SHELL) {
+ aBaseShapeType != TopAbs_SHELL && aBaseShapeType != TopAbs_COMPOUND) {
return;
}
this->initialize(aPipeBuilder);
// Setting naming.
- GeomShapePtr aFromShape(new GeomAPI_Shape), aToShape(new GeomAPI_Shape);
- aFromShape->setImpl(new TopoDS_Shape(aPipeBuilder->FirstShape()));
- aToShape->setImpl(new TopoDS_Shape(aPipeBuilder->LastShape()));
- this->addFromShape(aFromShape);
- this->addToShape(aToShape);
+ this->setToShapes(getListFromShape(aPipeBuilder->LastShape()));
+ this->setFromShapes(getListFromShape(aPipeBuilder->FirstShape()));
// Setting result.
TopoDS_Shape aResult = aPipeBuilder->Shape();
this->setDone(true);
}
-//=================================================================================================
+//==================================================================================================
void GeomAlgoAPI_Pipe::build(const GeomShapePtr theBaseShape,
const GeomShapePtr thePathShape,
const GeomShapePtr theBiNormal)
}
}
TopoDS_Shape aResult = aPipeBuilder->Shape();
+ if(aResult.IsNull()) {
+ return;
+ }
// Setting naming.
- GeomShapePtr aFromShape(new GeomAPI_Shape), aToShape(new GeomAPI_Shape);
- aFromShape->setImpl(new TopoDS_Shape(aPipeBuilder->FirstShape()));
- aToShape->setImpl(new TopoDS_Shape(aPipeBuilder->LastShape()));
- this->addFromShape(aFromShape);
- this->addToShape(aToShape);
+ this->setToShapes(getListFromShape(aPipeBuilder->LastShape()));
+ this->setFromShapes(getListFromShape(aPipeBuilder->FirstShape()));
// Setting result.
- if(aResult.IsNull()) {
- return;
- }
aResult = GeomAlgoAPI_DFLoader::refineResult(aResult);
GeomShapePtr aGeomSh(new GeomAPI_Shape());
aGeomSh->setImpl(new TopoDS_Shape(aResult));
this->setDone(true);
}
-//=================================================================================================
+//==================================================================================================
void GeomAlgoAPI_Pipe::build(const ListOfShape& theBaseShapes,
const ListOfShape& theLocations,
const GeomShapePtr thePathShape)
this->setDone(true);
}
-//=================================================================================================
+//==================================================================================================
void GeomAlgoAPI_Pipe::generated(const GeomShapePtr theShape,
ListOfShape& theHistory)
{
}
// Auxilary functions:
-//=================================================================================================
+//==================================================================================================
bool getBase(TopoDS_Shape& theBaseOut,
TopAbs_ShapeEnum& theBaseTypeOut,
const GeomShapePtr theBaseShape)
return true;
}
-//=================================================================================================
+//==================================================================================================
bool getPath(TopoDS_Wire& thePathOut,
const GeomShapePtr thePathShape)
{
return true;
}
-//=================================================================================================
+//==================================================================================================
bool buildPipe(BRepOffsetAPI_MakePipeShell* thePipeBuilder)
{
thePipeBuilder->Build();
return isDone == Standard_True;
}
+
+//==================================================================================================
+ListOfShape getListFromShape(const TopoDS_Shape& theShape)
+{
+ ListOfShape aList;
+
+ TopAbs_ShapeEnum aType = theShape.ShapeType();
+ if(aType == TopAbs_WIRE || aType == TopAbs_SHELL || aType == TopAbs_COMPOUND) {
+ for(TopoDS_Iterator anIt(theShape); anIt.More(); anIt.Next()) {
+ GeomShapePtr aGeomShape(new GeomAPI_Shape());
+ aGeomShape->setImpl(new TopoDS_Shape(anIt.Value()));
+ aList.push_back(aGeomShape);
+ }
+ } else {
+ GeomShapePtr aGeomShape(new GeomAPI_Shape());
+ aGeomShape->setImpl(new TopoDS_Shape(theShape));
+ aList.push_back(aGeomShape);
+ }
+
+ return aList;
+}