void ImpExpDxfRead::AddGraphics() const { if (optionGroupLayers) { for(std::map<std::string,std::vector<Part::TopoShape*> > ::const_iterator i = layers.begin(); i != layers.end(); ++i) { BRep_Builder builder; TopoDS_Compound comp; builder.MakeCompound(comp); std::string k = i->first; if (k == "0") // FreeCAD doesn't like an object name being '0'... k = "LAYER_0"; std::vector<Part::TopoShape*> v = i->second; if(k.substr(0, 6) != "BLOCKS") { for(std::vector<Part::TopoShape*>::const_iterator j = v.begin(); j != v.end(); ++j) { const TopoDS_Shape& sh = (*j)->getShape(); if (!sh.IsNull()) builder.Add(comp, sh); } if (!comp.IsNull()) { Part::Feature *pcFeature = (Part::Feature *)document->addObject("Part::Feature", k.c_str()); pcFeature->Shape.setValue(comp); } } } } }
TopoDS_Compound* OCCBody::make_Compound(DLIList<Lump*>& my_lumps, DLIList<OCCShell*>& shells, DLIList<OCCSurface*>& surfaces) { BRep_Builder B; TopoDS_Compound Co; B.MakeCompound(Co); for(int i = 0; i < my_lumps.size(); i ++) { OCCLump* lump = CAST_TO(my_lumps.get_and_step(), OCCLump); if(!lump) { PRINT_ERROR("Cannot create an OCC BodySM from the given lumps.\n" "Possible incompatible geometry engines.\n"); return (TopoDS_Compound *)NULL; } TopoDS_Solid * solid = CAST_TO(lump, OCCLump)->get_TopoDS_Solid(); B.Add(Co, *solid); } for(int i = 0; i < shells.size(); i ++) { TopoDS_Shell * shell = shells.get_and_step()->get_TopoDS_Shell(); B.Add(Co, *shell); } for(int i = 0; i < surfaces.size(); i ++) { TopoDS_Face * face = surfaces.get_and_step()->get_TopoDS_Face(); B.Add(Co, *face); } TopoDS_Compound* new_top = new TopoDS_Compound(Co); return new_top; }
//======================================================================= //function : FillContainers //purpose : //======================================================================= void GEOMAlgo_Gluer2::FillContainers(const TopAbs_ShapeEnum aType) { Standard_Boolean bHasImage, bToReverse; Standard_Integer i, aNbW; TopoDS_Shape aWnew, aEnew; TopoDS_Iterator aItS; BRep_Builder aBB; TopTools_IndexedMapOfShape aMW; TopTools_MapOfShape aMFence; // myErrorStatus=0; myWarningStatus=0; // TopExp::MapShapes(myArgument, aType, aMW); // aNbW=aMW.Extent(); for (i=1; i<=aNbW; ++i) { const TopoDS_Shape& aW=aMW(i); // if (!aMFence.Add(aW)) { continue; } // bHasImage=HasImage(aW); if (!bHasImage) { continue; } // GEOMAlgo_Tools3D::MakeContainer(aType, aWnew); aWnew.Orientation(aW.Orientation()); // aItS.Initialize(aW); for (; aItS.More(); aItS.Next()) { const TopoDS_Shape& aE=aItS.Value(); if (myOrigins.IsBound(aE)) { aEnew=myOrigins.Find(aE); // bToReverse=GEOMAlgo_Tools3D::IsSplitToReverse(aEnew, aE, myContext); if (bToReverse) { aEnew.Reverse(); } // aBB.Add(aWnew, aEnew); } else { aBB.Add(aWnew, aE); } } // //myImages / myOrigins TopTools_ListOfShape aLSD; // aLSD.Append(aW); myImages.Bind(aWnew, aLSD); myOrigins.Bind(aW, aWnew); // }//for (i=1; i<=aNbE; ++i) { }
//======================================================================= //function : BuildResult //purpose : //======================================================================= void GEOMAlgo_Gluer2::BuildResult() { Standard_Boolean bHasImage; TopoDS_Shape aCnew, aCXnew; TopoDS_Iterator aItC; BRep_Builder aBB; // myErrorStatus=0; myWarningStatus=0; // aItC.Initialize(myArgument); for (; aItC.More(); aItC.Next()) { const TopoDS_Shape& aCx=aItC.Value(); bHasImage=HasImage(aCx); if (bHasImage) { break; } } // if (!bHasImage) { myShape=myArgument; return; } // GEOMAlgo_Tools3D::MakeContainer(TopAbs_COMPOUND, aCnew); // aItC.Initialize(myArgument); for (; aItC.More(); aItC.Next()) { const TopoDS_Shape& aCX=aItC.Value(); if (myOrigins.IsBound(aCX)) { aCXnew=myOrigins.Find(aCX); aCXnew.Orientation(aCX.Orientation()); aBB.Add(aCnew, aCXnew); } else { aBB.Add(aCnew, aCX); } } // if (!myKeepNonSolids) { Standard_Integer i, aNb; TopoDS_Shape aCnew1; TopTools_IndexedMapOfShape aM; // GEOMAlgo_Tools3D::MakeContainer(TopAbs_COMPOUND, aCnew1); // TopExp::MapShapes(aCnew, TopAbs_SOLID, aM); aNb=aM.Extent(); for (i=1; i<=aNb; ++i) { const TopoDS_Shape& aS=aM(i); aBB.Add(aCnew1, aS); } aCnew=aCnew1; } // myShape=aCnew; }
void OCCRegion::replaceFacesInternal(std::list<GFace*> &new_faces) { // we simply replace old faces by new faces in the structure TopExp_Explorer aExpS, aExpF; BRep_Builder aBB; TopoDS_Compound aCmp; aBB.MakeCompound(aCmp); TopoDS_Solid _s_replacement; aBB.MakeSolid(_s_replacement); _s_replacement.Orientation(s.Orientation()); aExpS.Init(s, TopAbs_SHELL); for (; aExpS.More(); aExpS.Next()) { const TopoDS_Shell& _shell=TopoDS::Shell(aExpS.Current()); TopoDS_Shell _shell_replacement; aBB.MakeShell(_shell_replacement); _shell_replacement.Orientation(_shell.Orientation()); aExpF.Init(_shell, TopAbs_FACE); for (; aExpF.More(); aExpF.Next()) { const TopoDS_Face& _face=TopoDS::Face(aExpF.Current()); TopoDS_Face _face_replacement; std::list<GFace*>::iterator it = l_faces.begin(); std::list<GFace*>::iterator it2 = new_faces.begin(); for ( ; it != l_faces.end() ; ++it,++it2){ OCCFace *occF = dynamic_cast<OCCFace*>(*it); if (occF){ TopoDS_Face oldf = occF->getTopoDS_Face(); if (oldf.IsSame(_face)){ _face_replacement = *((TopoDS_Face*)(*it2)->getNativePtr()); } else { oldf = occF->getTopoDS_FaceOld(); if (oldf.IsSame(_face)){ _face_replacement = *((TopoDS_Face*)(*it2)->getNativePtr()); } } } } if (_face_replacement.IsNull()){ Msg::Error("cannot find an face for gluing a region"); } if (_face_replacement.IsSame(_face)) { aBB.Add(_shell_replacement, _face); } else { if(FaceHaveDifferentOrientations(_face, _face_replacement)) _face_replacement.Reverse(); aBB.Add(_shell_replacement, _face_replacement); } } aBB.Add(_s_replacement, _shell_replacement); } s = _s_replacement; setup(); }
//======================================================================= //function : FillImagesCompound //purpose : //======================================================================= void FillImagesCompound(const TopoDS_Shape& theS, BRepAlgo_Image& theImages, TopTools_MapOfShape& theMFP) { Standard_Boolean bInterferred; TopAbs_ShapeEnum aTypeX; TopAbs_Orientation aOrX; TopoDS_Iterator aIt; BRep_Builder aBB; TopTools_ListIteratorOfListOfShape aItIm; // if (!theMFP.Add(theS)) { return; } // bInterferred=Standard_False; aIt.Initialize(theS); for (; aIt.More(); aIt.Next()) { const TopoDS_Shape& aSX=aIt.Value(); aTypeX=aSX.ShapeType(); if (aTypeX==TopAbs_COMPOUND) { FillImagesCompound(aSX, theImages, theMFP); } if (theImages.HasImage(aSX)) { bInterferred=Standard_True; } } if (!bInterferred) { return; } // TopoDS_Shape aCIm; GEOMAlgo_Tools3D::MakeContainer(TopAbs_COMPOUND, aCIm); // aIt.Initialize(theS); for (; aIt.More(); aIt.Next()) { const TopoDS_Shape& aSX=aIt.Value(); aOrX=aSX.Orientation(); if (theImages.HasImage(aSX)) { const TopTools_ListOfShape& aLFIm=theImages.Image(aSX); aItIm.Initialize(aLFIm); for (; aItIm.More(); aItIm.Next()) { TopoDS_Shape aSXIm=aItIm.Value(); aSXIm.Orientation(aOrX); aBB.Add(aCIm, aSXIm); } } else { aBB.Add(aCIm, aSX); } } theImages.Bind(theS, aCIm); }
Standard_Boolean ShHealOper_RemoveFace::removeFaces(const TopoDS_Solid& theShape, TopoDS_Shape& theNewShape) { Standard_Boolean isDone = Standard_False; TopoDS_Solid aSol; BRep_Builder aB; aB.MakeSolid(aSol); TopoDS_Compound aComp; aB.MakeCompound(aComp); Standard_Boolean isAddSol = Standard_False, isAddComp = Standard_False; //firslty faces will be deleted from each shell. TopoDS_Iterator aItSol(theShape,Standard_False); for( ; aItSol.More(); aItSol.Next()) { TopoDS_Shape aSh = aItSol.Value(); TopoDS_Shape aNewShape; if(removeFaces(aSh,aNewShape)) isDone = Standard_True; if(aNewShape.IsNull()) continue; else if(aNewShape.ShapeType() == TopAbs_SHELL ) { aB.Add(aSol,aNewShape); isAddSol = Standard_True; } else { aB.Add(aComp,aNewShape); isAddComp = Standard_True; } } if(isDone) { //for getting correct solids class ShapeFix_Solid will be used. if(isAddSol) { Handle(ShapeFix_Solid) aSfSol = new ShapeFix_Solid(aSol); aSfSol->FixShellMode()= Standard_False; aSfSol->Perform(); TopoDS_Shape aresSol = aSfSol->Shape(); if(!isAddComp) theNewShape = aresSol; else aB.Add(aComp,aresSol); } else if(isAddComp) theNewShape = aComp; else theNewShape.Nullify(); } else theNewShape = theShape; return isDone; }
//======================================================================= //function : SupressFaces //purpose : //======================================================================= void SuppressFacesRec (const TopTools_SequenceOfShape& theShapesFaces, const TopoDS_Shape& theOriginalShape, TopoDS_Shape& theOutShape) { if ((theOriginalShape.ShapeType() != TopAbs_COMPOUND && theOriginalShape.ShapeType() != TopAbs_COMPSOLID)) { ShHealOper_RemoveFace aHealer (theOriginalShape); Standard_Boolean aResult = aHealer.Perform(theShapesFaces); if (aResult) theOutShape = aHealer.GetResultShape(); else raiseNotDoneExeption(aHealer.GetErrorStatus()); } else { BRep_Builder BB; TopoDS_Compound CC; BB.MakeCompound(CC); TopTools_MapOfShape mapShape; TopoDS_Iterator It (theOriginalShape, Standard_True, Standard_True); for (; It.More(); It.Next()) { TopoDS_Shape aShape_i = It.Value(); if (mapShape.Add(aShape_i)) { // check, if current shape contains at least one of faces to be removed bool isFound = false; TopTools_IndexedMapOfShape aShapes_i; TopExp::MapShapes(aShape_i, aShapes_i); for (int i = 1; i <= theShapesFaces.Length() && !isFound; i++) { const TopoDS_Shape& aFace_i = theShapesFaces.Value(i); if (aShapes_i.Contains(aFace_i)) isFound = true; } if (isFound) { TopoDS_Shape anOutSh_i; SuppressFacesRec(theShapesFaces, aShape_i, anOutSh_i); if ( !anOutSh_i.IsNull() ) BB.Add(CC, anOutSh_i); } else { // nothing to do BB.Add(CC, aShape_i); } } } theOutShape = CC; } }
//======================================================================= //function : MakeInternalWires //purpose : //======================================================================= void MakeInternalWires(const TopTools_MapOfShape& theME, TopTools_ListOfShape& theWires) { TopTools_MapIteratorOfMapOfShape aItM; TopTools_MapOfShape aAddedMap; TopTools_ListIteratorOfListOfShape aItE; TopTools_IndexedDataMapOfShapeListOfShape aMVE; BRep_Builder aBB; // aItM.Initialize(theME); for (; aItM.More(); aItM.Next()) { const TopoDS_Shape& aE=aItM.Key(); TopExp::MapShapesAndAncestors(aE, TopAbs_VERTEX, TopAbs_EDGE, aMVE); } // aItM.Initialize(theME); for (; aItM.More(); aItM.Next()) { TopoDS_Shape aEE=aItM.Key(); if (!aAddedMap.Add(aEE)) { continue; } // // make a new shell TopoDS_Wire aW; aBB.MakeWire(aW); aEE.Orientation(TopAbs_INTERNAL); aBB.Add(aW, aEE); // TopoDS_Iterator aItAdded (aW); for (; aItAdded.More(); aItAdded.Next()) { const TopoDS_Shape& aE =aItAdded.Value(); // TopExp_Explorer aExp(aE, TopAbs_VERTEX); for (; aExp.More(); aExp.Next()) { const TopoDS_Shape& aV =aExp.Current(); const TopTools_ListOfShape& aLE=aMVE.FindFromKey(aV); aItE.Initialize(aLE); for (; aItE.More(); aItE.Next()) { TopoDS_Shape aEL=aItE.Value(); if (aAddedMap.Add(aEL)){ aEL.Orientation(TopAbs_INTERNAL); aBB.Add(aW, aEL); } } } } theWires.Append(aW); } }
//#include <BRepBuilder.hxx> TopoDS_Shape Edgesort::GetDesiredCutShape(int desiredIndex) { m_edges.clear(); m_EdgeBBoxMap.clear(); m_vertices.clear(); Perform(); if (m_EdgeBBoxMap.size()>1) { if (desiredIndex == 1) //Return the smallest to return it { m_edges = m_EdgeBBoxMap.begin()->second; } else { m_edges = m_EdgeBBoxMap.rbegin()->second; } BRep_Builder aBuilder; TopoDS_Compound aCompound; aBuilder.MakeCompound(aCompound); for (m_edgeIter = m_edges.begin();m_edgeIter!=m_edges.end();++m_edgeIter) { aBuilder.Add(aCompound,*m_edgeIter); } return aCompound; } else { return m_shape; } //Go through the edges of the result you do not like and remove this result from the original shape }
PyObject* TopoShapeCompSolidPy::add(PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args, "O!", &(Part::TopoShapeSolidPy::Type), &obj)) return NULL; BRep_Builder builder; TopoDS_Shape& comp = getTopoShapePtr()->_Shape; try { const TopoDS_Shape& sh = static_cast<TopoShapePy*>(obj)-> getTopoShapePtr()->_Shape; if (!sh.IsNull()) builder.Add(comp, sh); else Standard_Failure::Raise("Cannot empty shape to compound solid"); } catch (Standard_Failure) { Handle_Standard_Failure e = Standard_Failure::Caught(); PyErr_SetString(PyExc_Exception, e->GetMessageString()); return 0; } Py_Return; }
int OCCTools::writeVRML(const char *filename, std::vector<OCCBase *> shapes) { try { BRep_Builder B; TopoDS_Compound shape; B.MakeCompound(shape); for (unsigned i = 0; i < shapes.size(); i++) { B.Add(shape, shapes[i]->getShape()); } VrmlAPI_Writer writer; writer.Write(shape, filename); } catch(Standard_Failure &err) { Handle_Standard_Failure e = Standard_Failure::Caught(); const Standard_CString msg = e->GetMessageString(); //printf("ERROR: %s\n", e->GetMessageString()); if (msg != NULL && strlen(msg) > 1) { setErrorMessage(msg); } else { setErrorMessage("Failed to write VRML file"); } return 0; } return 1; }
bool IfcGeom::Kernel::convert(const IfcSchema::IfcCompositeProfileDef* l, TopoDS_Shape& face) { // BRepBuilderAPI_MakeFace mf; TopoDS_Compound compound; BRep_Builder builder; builder.MakeCompound(compound); IfcSchema::IfcProfileDef::list::ptr profiles = l->Profiles(); //bool first = true; for (IfcSchema::IfcProfileDef::list::it it = profiles->begin(); it != profiles->end(); ++it) { TopoDS_Face f; if (convert_face(*it, f)) { builder.Add(compound, f); /* TopExp_Explorer exp(f, TopAbs_WIRE); for (; exp.More(); exp.Next()) { const TopoDS_Wire& wire = TopoDS::Wire(exp.Current()); if (first) { mf.Init(BRepBuilderAPI_MakeFace(wire)); } else { mf.Add(wire); } first = false; } */ } } face = compound; return !face.IsNull(); }
bool CTiglExportBrep::Write(const std::string& filename) const { if (filename.empty()) { LOG(ERROR) << "Error: Empty filename in CTiglExportBrep::Write."; return false; } if (_shapes.size() > 1) { TopoDS_Compound c; BRep_Builder b; b.MakeCompound(c); for (ListPNamedShape::const_iterator it = _shapes.begin(); it != _shapes.end(); ++it) { PNamedShape shape = *it; if (shape) { b.Add(c, shape->Shape()); } } // write the file return BRepTools::Write(c, filename.c_str()); } else if ( _shapes.size() == 1) { PNamedShape shape = _shapes[0]; return BRepTools::Write(shape->Shape(), filename.c_str()); } else { LOG(WARNING) << "No shapes defined in BRep export. Abort!"; return false; } }
void Subassembly::compound ( TopoDS_Shape& assembly ) { BRep_Builder builder; if ( dynamic_cast<Part*>( subassembly_ ) != 0 ) { TopoDS_Shape placed_solid = dynamic_cast<Part*>( subassembly_ )->shape().Located( location_ ); builder.Add( assembly, placed_solid ); } else if ( dynamic_cast<Assembly*>( subassembly_ ) != 0 ) { TopoDS_Shape placed_solid = dynamic_cast<Assembly*>( subassembly_ )->compound().Located( location_ ); builder.Add( assembly, placed_solid ); } }
CGroupShapes::CGroupShapes(const ListPNamedShape& list) { if (list.size() == 1) { _result = list[0]; return; } BRep_Builder b; TopoDS_Compound c; b.MakeCompound(c); for (ListPNamedShape::const_iterator it=list.begin(); it != list.end(); ++it) { PNamedShape shape = *it; if (!shape) { continue; } b.Add(c, shape->Shape()); } _result = PNamedShape(new CNamedShape(c, "ShapeGroup")); // apply face names from the shapes for (ListPNamedShape::const_iterator it=list.begin(); it != list.end(); ++it) { PNamedShape shape = *it; if (!shape) { continue; } CBooleanOperTools::AppendNamesToShape(shape, _result); } }
Part::TopoShape ShapeBinder::buildShapeFromReferences( Part::Feature* obj, std::vector< std::string > subs) { if (!obj) return TopoDS_Shape(); if (subs.empty()) return obj->Shape.getShape(); std::vector<TopoDS_Shape> shapes; for (std::string sub : subs) { shapes.push_back(obj->Shape.getShape().getSubShape(sub.c_str())); } if (shapes.size() == 1){ //single subshape. Return directly. return shapes[0]; } else { //multiple subshapes. Make a compound. BRep_Builder builder; TopoDS_Compound cmp; builder.MakeCompound(cmp); for(const TopoDS_Shape& sh : shapes){ builder.Add(cmp, sh); } return cmp; } }
void DraftDxfRead::OnReadInsert(const double* point, const double* scale, const char* name, double rotation) { std::cout << "Inserting block " << name << " rotation " << rotation << " pos " << point[0] << "," << point[1] << "," << point[2] << std::endl; for(std::map<std::string,std::vector<Part::TopoShape*> > ::const_iterator i = layers.begin(); i != layers.end(); ++i) { std::string k = i->first; std::string prefix = "BLOCKS "; prefix += name; prefix += " "; if(k.substr(0, prefix.size()) == prefix) { BRep_Builder builder; TopoDS_Compound comp; builder.MakeCompound(comp); std::vector<Part::TopoShape*> v = i->second; for(std::vector<Part::TopoShape*>::const_iterator j = v.begin(); j != v.end(); ++j) { const TopoDS_Shape& sh = (*j)->_Shape; if (!sh.IsNull()) builder.Add(comp, sh); } if (!comp.IsNull()) { Part::TopoShape* pcomp = new Part::TopoShape(comp); Base::Matrix4D mat; mat.scale(scale[0],scale[1],scale[2]); mat.rotZ(rotation); mat.move(point[0],point[1],point[2]); pcomp->transformShape(mat,true); AddObject(pcomp); } } } }
PyObject* TopoShapeCompoundPy::connectEdgesToWires(PyObject *args) { PyObject *shared=Py_True; double tol = Precision::Confusion(); if (!PyArg_ParseTuple(args, "|O!d",&PyBool_Type,&shared,&tol)) return 0; try { const TopoDS_Shape& s = getTopoShapePtr()->_Shape; Handle(TopTools_HSequenceOfShape) hEdges = new TopTools_HSequenceOfShape(); Handle(TopTools_HSequenceOfShape) hWires = new TopTools_HSequenceOfShape(); for (TopExp_Explorer xp(s, TopAbs_EDGE); xp.More(); xp.Next()) hEdges->Append(xp.Current()); ShapeAnalysis_FreeBounds::ConnectEdgesToWires(hEdges, tol, PyObject_IsTrue(shared), hWires); TopoDS_Compound comp; BRep_Builder builder; builder.MakeCompound(comp); int len = hWires->Length(); for(int i=1;i<=len;i++) { builder.Add(comp, hWires->Value(i)); } getTopoShapePtr()->_Shape = comp; return new TopoShapeCompoundPy(new TopoShape(comp)); } catch (Standard_Failure) { Handle_Standard_Failure e = Standard_Failure::Caught(); PyErr_SetString(PyExc_Exception, e->GetMessageString()); return 0; } }
// constructor method int TopoShapeCompoundPy::PyInit(PyObject* args, PyObject* /*kwd*/) { PyObject *pcObj; if (!PyArg_ParseTuple(args, "O!", &(PyList_Type), &pcObj)) return -1; BRep_Builder builder; TopoDS_Compound Comp; builder.MakeCompound(Comp); try { Py::List list(pcObj); for (Py::List::iterator it = list.begin(); it != list.end(); ++it) { if (PyObject_TypeCheck((*it).ptr(), &(Part::TopoShapePy::Type))) { const TopoDS_Shape& sh = static_cast<TopoShapePy*>((*it).ptr())-> getTopoShapePtr()->_Shape; if (!sh.IsNull()) builder.Add(Comp, sh); } } } catch (Standard_Failure) { Handle_Standard_Failure e = Standard_Failure::Caught(); PyErr_SetString(PyExc_Exception, e->GetMessageString()); return -1; } getTopoShapePtr()->_Shape = Comp; return 0; }
PyObject* TopoShapeCompoundPy::add(PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args, "O!", &(Part::TopoShapePy::Type), &obj)) return NULL; BRep_Builder builder; TopoDS_Shape comp = getTopoShapePtr()->getShape(); try { const TopoDS_Shape& sh = static_cast<TopoShapePy*>(obj)-> getTopoShapePtr()->getShape(); if (!sh.IsNull()) builder.Add(comp, sh); } catch (Standard_Failure) { Handle_Standard_Failure e = Standard_Failure::Caught(); PyErr_SetString(PartExceptionOCCError, e->GetMessageString()); return 0; } getTopoShapePtr()->setShape(comp); Py_Return; }
//! tries to find the intersection of the section plane with the shape giving a collection of planar faces TopoDS_Compound DrawViewSection::findSectionPlaneIntersections(const TopoDS_Shape& shape) { TopoDS_Compound result; if(shape.IsNull()){ Base::Console().Log("DrawViewSection::getSectionSurface - Sectional View shape is Empty\n"); return result; } gp_Pln plnSection = getSectionPlane(); BRep_Builder builder; builder.MakeCompound(result); TopExp_Explorer expFaces(shape, TopAbs_FACE); int i; int dbAdded = 0; for (i = 1 ; expFaces.More(); expFaces.Next(), i++) { const TopoDS_Face& face = TopoDS::Face(expFaces.Current()); BRepAdaptor_Surface adapt(face); if (adapt.GetType() == GeomAbs_Plane){ gp_Pln plnFace = adapt.Plane(); if(plnSection.Contains(plnFace.Location(), Precision::Confusion()) && plnFace.Axis().IsParallel(plnSection.Axis(), Precision::Angular())) { dbAdded++; builder.Add(result, face); } } } return result; }
PyObject* TopoShapeShellPy::add(PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args, "O!", &(Part::TopoShapeFacePy::Type), &obj)) return NULL; BRep_Builder builder; TopoDS_Shape& shell = getTopoShapePtr()->_Shape; try { const TopoDS_Shape& sh = static_cast<TopoShapeFacePy*>(obj)-> getTopoShapePtr()->_Shape; if (!sh.IsNull()) { builder.Add(shell, sh); BRepCheck_Analyzer check(shell); if (!check.IsValid()) { ShapeUpgrade_ShellSewing sewShell; getTopoShapePtr()->_Shape = sewShell.ApplySewing(shell); } } else { Standard_Failure::Raise("cannot add empty shape"); } } catch (Standard_Failure) { Handle_Standard_Failure e = Standard_Failure::Caught(); PyErr_SetString(PartExceptionOCCError, e->GetMessageString()); return 0; } Py_Return; }
IfcGeom::Representation::Serialization::Serialization(const BRep& brep) : Representation(brep.settings()) , _id(brep.getId()) { TopoDS_Compound compound; BRep_Builder builder; builder.MakeCompound(compound); for (IfcGeom::IfcRepresentationShapeItems::const_iterator it = brep.begin(); it != brep.end(); ++ it) { const TopoDS_Shape& s = it->Shape(); gp_GTrsf trsf = it->Placement(); if (settings().convert_back_units()) { gp_Trsf scale; scale.SetScaleFactor(1.0 / settings().unit_magnitude()); trsf.PreMultiply(scale); } bool trsf_valid = false; gp_Trsf _trsf; try { _trsf = trsf.Trsf(); trsf_valid = true; } catch (...) {} const TopoDS_Shape moved_shape = trsf_valid ? s.Moved(_trsf) : BRepBuilderAPI_GTransform(s,trsf,true).Shape(); builder.Add(compound,moved_shape); } std::stringstream sstream; BRepTools::Write(compound,sstream); _brep_data = sstream.str(); }
const TopoDS_Shape& BRepOffsetAPI_MakeOffsetFix::Shape() { if (myResult.IsNull()) { TopoDS_Shape result = mkOffset.Shape(); if (result.ShapeType() == TopAbs_WIRE) { MakeWire(result); } else if (result.ShapeType() == TopAbs_COMPOUND) { BRep_Builder builder; TopoDS_Compound comp; builder.MakeCompound(comp); TopExp_Explorer xp(result, TopAbs_WIRE); while (xp.More()) { TopoDS_Wire wire = TopoDS::Wire(xp.Current()); MakeWire(wire); builder.Add(comp, wire); xp.Next(); } result = comp; } myResult = result; } return myResult; }
App::DocumentObjectExecReturn *FeatureProjection::execute(void) { App::DocumentObject* link = Source.getValue(); if (!link) return new App::DocumentObjectExecReturn("No object linked"); if (!link->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) return new App::DocumentObjectExecReturn("Linked object is not a Part object"); const TopoDS_Shape& shape = static_cast<Part::Feature*>(link)->Shape.getShape()._Shape; if (shape.IsNull()) return new App::DocumentObjectExecReturn("Linked shape object is empty"); try { const Base::Vector3f& dir = Direction.getValue(); Drawing::ProjectionAlgos alg(shape, dir); TopoDS_Compound comp; BRep_Builder builder; builder.MakeCompound(comp); if (!alg.V.IsNull() && VCompound.getValue()) builder.Add(comp, alg.V); if (!alg.V1.IsNull() && Rg1LineVCompound.getValue()) builder.Add(comp, alg.V1); if (!alg.VN.IsNull() && RgNLineVCompound.getValue()) builder.Add(comp, alg.VN); if (!alg.VO.IsNull() && OutLineVCompound.getValue()) builder.Add(comp, alg.VO); if (!alg.VI.IsNull() && IsoLineVCompound.getValue()) builder.Add(comp, alg.VI); if (!alg.H.IsNull() && HCompound.getValue()) builder.Add(comp, alg.H); if (!alg.H1.IsNull() && Rg1LineHCompound.getValue()) builder.Add(comp, alg.H1); if (!alg.HN.IsNull() && RgNLineHCompound.getValue()) builder.Add(comp, alg.HN); if (!alg.HO.IsNull() && OutLineHCompound.getValue()) builder.Add(comp, alg.HO); if (!alg.HI.IsNull() && IsoLineHCompound.getValue()) builder.Add(comp, alg.HI); Shape.setValue(comp); return App::DocumentObject::StdReturn; } catch (Standard_Failure) { Handle_Standard_Failure e = Standard_Failure::Caught(); return new App::DocumentObjectExecReturn(e->GetMessageString()); } }
void Transformed::divideTools(const std::vector<TopoDS_Shape> &toolsIn, std::vector<TopoDS_Shape> &individualsOut, TopoDS_Compound &compoundOut) const { typedef std::pair<TopoDS_Shape, Bnd_Box> ShapeBoundPair; typedef std::list<ShapeBoundPair> PairList; typedef std::vector<ShapeBoundPair> PairVector; PairList pairList; std::vector<TopoDS_Shape>::const_iterator it; for (it = toolsIn.begin(); it != toolsIn.end(); ++it) { Bnd_Box bound; BRepBndLib::Add(*it, bound); bound.SetGap(0.0); ShapeBoundPair temp = std::make_pair(*it, bound); pairList.push_back(temp); } BRep_Builder builder; builder.MakeCompound(compoundOut); while(!pairList.empty()) { PairVector currentGroup; currentGroup.push_back(pairList.front()); pairList.pop_front(); PairList::iterator it = pairList.begin(); while(it != pairList.end()) { PairVector::const_iterator groupIt; bool found(false); for (groupIt = currentGroup.begin(); groupIt != currentGroup.end(); ++groupIt) { if (!(*it).second.IsOut((*groupIt).second))//touching means is out. { found = true; break; } } if (found) { currentGroup.push_back(*it); pairList.erase(it); it=pairList.begin(); continue; } it++; } if (currentGroup.size() == 1) builder.Add(compoundOut, currentGroup.front().first); else { PairVector::const_iterator groupIt; for (groupIt = currentGroup.begin(); groupIt != currentGroup.end(); ++groupIt) individualsOut.push_back((*groupIt).first); } } }
Standard_Boolean ShHealOper_Sewing::getWires(const TopoDS_Shape& theSewShape) const { if(theSewShape.ShapeType() != TopAbs_COMPOUND) return Standard_False; Handle(TopTools_HSequenceOfShape) aSeqEdges = new TopTools_HSequenceOfShape; TopExp_Explorer aexpEdges(theSewShape,TopAbs_EDGE,TopAbs_WIRE); for ( ; aexpEdges.More(); aexpEdges.Next()) { aSeqEdges->Append(aexpEdges.Current()); } if(aSeqEdges->Length() <2) return Standard_False; //get manifold wires from sewed edges. Standard_Real aTol = 0.; Standard_Boolean aShared = Standard_True; Handle(TopTools_HSequenceOfShape) aTmpWires = new TopTools_HSequenceOfShape; ShapeAnalysis_FreeBounds::ConnectEdgesToWires(aSeqEdges, aTol, aShared, aTmpWires); TopTools_MapOfShape aMapEdges; Standard_Integer i =1; for( ; i <= aSeqEdges->Length(); i++) aMapEdges.Add(aSeqEdges->Value(i)); //remove free edges from result shape. TopoDS_Compound aNewComp; deleteFreeEdges(theSewShape,aMapEdges,aNewComp); //add new wires in the result shape. BRep_Builder aB; for( i =1; i <= aTmpWires->Length(); i++) { TopoDS_Iterator aite(aTmpWires->Value(i)); Standard_Integer nbe =0; TopoDS_Shape aE; for( ; aite.More() && nbe < 3; aite.Next(),nbe++) aE = aite.Value(); if(!nbe) continue; else if(nbe ==1) aB.Add(aNewComp,aE); else aB.Add(aNewComp,aTmpWires->Value(i)); } myContext->Replace(theSewShape,aNewComp); return Standard_True; }
//======================================================================= //function : Execute //purpose : //======================================================================= Standard_Integer GEOM_SubShapeDriver::Execute(TFunction_Logbook& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); GEOM_ISubShape aCI (aFunction); TDF_Label aLabel = aCI.GetMainShape()->GetOwnerEntry(); if (aLabel.IsRoot()) return 0; Handle(GEOM_Object) anObj = GEOM_Object::GetObject(aLabel); if (anObj.IsNull()) return 0; TopoDS_Shape aMainShape = anObj->GetValue(); if (aMainShape.IsNull()) return 0; Handle(TColStd_HArray1OfInteger) anIndices = aCI.GetIndices(); if (anIndices.IsNull() || anIndices->Length() <= 0) return 0; BRep_Builder B; TopoDS_Compound aCompound; TopoDS_Shape aShape; if (anIndices->Length() == 1 && anIndices->Value(1) == -1) { //The empty sub-shape B.MakeCompound(aCompound); aShape = aCompound; } else { TopTools_IndexedMapOfShape aMapOfShapes; TopExp::MapShapes(aMainShape, aMapOfShapes); if (anIndices->Length() > 1) { B.MakeCompound(aCompound); for (int i = anIndices->Lower(); i <= anIndices->Upper(); i++) { if (aMapOfShapes.Extent() < anIndices->Value(i)) Standard_NullObject::Raise("GEOM_SubShapeDriver::Execute: Index is out of range"); TopoDS_Shape aSubShape = aMapOfShapes.FindKey(anIndices->Value(i)); if (aSubShape.IsNull()) continue; B.Add(aCompound,aSubShape); } aShape = aCompound; } else { int i = anIndices->Lower(); if (aMapOfShapes.Extent() < anIndices->Value(i)) Standard_NullObject::Raise("GEOM_SubShapeDriver::Execute: Index is out of range"); aShape = aMapOfShapes.FindKey(anIndices->Value(i)); } } if (aShape.IsNull()) return 0; aFunction->SetValue(aShape); log.SetTouched(Label()); return 1; }
Standard_Boolean ShHealOper_ChangeOrientation::Perform() { BRep_Builder B; if (myInitShape.ShapeType() == TopAbs_SHELL) { myResultShape = myInitShape.EmptyCopied(); TopoDS_Iterator itr (myInitShape); while (itr.More()) { B.Add(myResultShape,itr.Value().Reversed()); itr.Next(); } } else if (myInitShape.ShapeType() == TopAbs_FACE) { myResultShape = myInitShape.EmptyCopied(); TopoDS_Iterator itr (myInitShape); while (itr.More()) { B.Add(myResultShape,itr.Value()); itr.Next(); } myResultShape.Reverse(); } else if ( myInitShape.ShapeType() == TopAbs_WIRE || myInitShape.ShapeType() == TopAbs_EDGE) { myResultShape = myInitShape.EmptyCopied(); TopoDS_Iterator itr (myInitShape); while (itr.More()) { B.Add(myResultShape,itr.Value()); itr.Next(); } myResultShape.Reverse(); } else { BRepBuilderAPI_Copy Copy (myInitShape); if (!Copy.IsDone()) return false; myResultShape = Copy.Shape(); if (myResultShape.IsNull()) return false; if (myResultShape.Orientation() == TopAbs_FORWARD) myResultShape.Orientation(TopAbs_REVERSED); else myResultShape.Orientation(TopAbs_FORWARD); } return true; }