本文整理汇总了C++中BRepBuilderAPI_MakeWire::Shape方法的典型用法代码示例。如果您正苦于以下问题:C++ BRepBuilderAPI_MakeWire::Shape方法的具体用法?C++ BRepBuilderAPI_MakeWire::Shape怎么用?C++ BRepBuilderAPI_MakeWire::Shape使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类BRepBuilderAPI_MakeWire
的用法示例。
在下文中一共展示了BRepBuilderAPI_MakeWire::Shape方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: chamfer
int OCCWire::chamfer(std::vector<OCCVertex *> vertices, std::vector<double> distances) {
int vertices_size = vertices.size();
int distances_size = distances.size();
BRepFilletAPI_MakeFillet2d MF;
try {
if (this->getShape().IsNull()) {
StdFail_NotDone::Raise("Shapes is Null");
}
MF.Init(BRepBuilderAPI_MakeFace(this->getWire()));
// creat map of vertices
TopTools_IndexedMapOfShape vertMap;
for (unsigned i=0; i<vertices.size(); i++)
vertMap.Add(vertices[i]->getShape());
bool first = true;
TopoDS_Edge firstEdge, nextEdge;
TopoDS_Vertex vertex;
BRepTools_WireExplorer Ex1;
for (Ex1.Init(this->getWire()); Ex1.More(); ) {
if(first == true) {
firstEdge = Ex1.Current();
first = false;
}
Ex1.Next();
//if the number of edges is odd don't proceed
if(Ex1.More() == Standard_False)
break;
nextEdge = Ex1.Current();
//get the common vertex of the two edges
if (!TopExp::CommonVertex(firstEdge, nextEdge, vertex)) {
// disconnected wire
first = true;
continue;
}
if (vertMap.Contains(vertex)) {
int i = vertMap.FindIndex(vertex) - 1;
if (distances_size == 1) {
// single distance
MF.AddChamfer(firstEdge, nextEdge, distances[0], distances[0]);
} else if (distances_size == vertices_size) {
// distance given for each vertex
MF.AddChamfer(firstEdge, nextEdge, distances[i], distances[i]);
} else {
StdFail_NotDone::Raise("distances argument has wrong size");
}
}
firstEdge = nextEdge;
}
// special case for closed wire
if (isClosed()) {
// find seam vertex
TopoDS_Vertex aV1;
TopExp::Vertices(this->getWire(), vertex, aV1);
// check if seam vertex has chamfer value
if (vertMap.Contains(vertex)) {
int i = vertMap.FindIndex(vertex) - 1;
// map vertices to edges to find edge pair
TopTools_IndexedDataMapOfShapeListOfShape mapVertexEdge;
TopExp::MapShapesAndAncestors(this->getWire(), TopAbs_VERTEX, TopAbs_EDGE, mapVertexEdge);
const TopTools_ListOfShape& edges = mapVertexEdge.FindFromKey(vertex);
firstEdge = TopoDS::Edge(edges.First());
nextEdge = TopoDS::Edge(edges.Last());
if (distances_size == 1) {
// single distance
MF.AddChamfer(firstEdge, nextEdge, distances[0], distances[0]);
} else if (distances_size == vertices_size) {
// distance given for each vertex
MF.AddChamfer(firstEdge, nextEdge, distances[i], distances[i]);
} else {
StdFail_NotDone::Raise("distances argument has wrong size");
}
}
}
if(MF.Status() != ChFi2d_IsDone)
StdFail_NotDone::Raise("chamfer operation failed");
TopTools_IndexedMapOfShape aMap;
TopExp::MapShapes(MF.Shape(), TopAbs_WIRE, aMap);
if(aMap.Extent() != 1)
StdFail_NotDone::Raise("chamfer result did not result in single wire");;
//add edges to the wire
//.........这里部分代码省略.........
示例2: split
PyObject* TopoShapeEdgePy::split(PyObject *args)
{
PyObject* float_or_list;
if (!PyArg_ParseTuple(args, "O", &float_or_list))
return 0;
try {
BRepAdaptor_Curve adapt(TopoDS::Edge(getTopoShapePtr()->_Shape));
Standard_Real f = adapt.FirstParameter();
Standard_Real l = adapt.LastParameter();
std::vector<Standard_Real> par;
par.push_back(f);
if (PyFloat_Check(float_or_list)) {
double val = PyFloat_AsDouble(float_or_list);
if (val == f || val == l) {
PyErr_SetString(PyExc_ValueError, "Cannot split edge at start or end point");
return 0;
}
else if (val < f || val > l) {
PyErr_SetString(PyExc_ValueError, "Value out of parameter range");
return 0;
}
par.push_back(val);
}
else if (PyList_Check(float_or_list)) {
Py::List list(float_or_list);
for (Py::List::iterator it = list.begin(); it != list.end(); ++it) {
double val = (double)Py::Float(*it);
if (val == f || val == l) {
PyErr_SetString(PyExc_ValueError, "Cannot split edge at start or end point");
return 0;
}
else if (val < f || val > l) {
PyErr_SetString(PyExc_ValueError, "Value out of parameter range");
return 0;
}
par.push_back(val);
}
}
else {
PyErr_SetString(PyExc_TypeError, "Either float or list of floats expected");
return 0;
}
par.push_back(l);
std::sort(par.begin(), par.end());
BRepBuilderAPI_MakeWire mkWire;
Handle_Geom_Curve c = adapt.Curve().Curve();
std::vector<Standard_Real>::iterator end = par.end() - 1;
for (std::vector<Standard_Real>::iterator it = par.begin(); it != end; ++it) {
BRepBuilderAPI_MakeEdge mkBuilder(c, it[0], it[1]);
mkWire.Add(mkBuilder.Edge());
}
return new TopoShapeWirePy(new TopoShape(mkWire.Shape()));
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
PyErr_SetString(PyExc_Exception, e->GetMessageString());
return 0;
}
PyErr_SetString(PyExc_Exception, "Geometry is not a curve");
return 0;
}
示例3: Execute
//=======================================================================
//function : Execute
//purpose :
//=======================================================================
Standard_Integer GEOMImpl_ChamferDriver::Execute(TFunction_Logbook& log) const
{
if (Label().IsNull()) return 0;
Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label());
GEOMImpl_IChamfer aCI (aFunction);
Standard_Integer aType = aFunction->GetType();
TopoDS_Shape aShape;
Handle(GEOM_Function) aRefShape = aCI.GetShape();
TopoDS_Shape aShapeBase = aRefShape->GetValue();
if (aType == CHAMFER_SHAPE_EDGES_2D)
{
BRepFilletAPI_MakeFillet2d fill;
TopoDS_Face aFace;
Standard_Boolean aWireFlag = Standard_False;
if (aShapeBase.ShapeType() == TopAbs_FACE)
aFace = TopoDS::Face(aShapeBase);
else if (aShapeBase.ShapeType() == TopAbs_WIRE)
{
TopoDS_Wire aWire = TopoDS::Wire(aShapeBase);
BRepBuilderAPI_MakeFace aMF(aWire);
aMF.Build();
if (!aMF.IsDone()) {
StdFail_NotDone::Raise("Cannot build initial face from given wire");
}
aFace = aMF.Face();
aWireFlag = Standard_True;
}
else
StdFail_NotDone::Raise("Base shape is neither a face or a wire !");
fill.Init(aFace);
double aD1_2D = aCI.GetD1();
double aD2_2D = aCI.GetD2();
TopoDS_Shape aShapeFace1, aShapeFace2;
if (GEOMImpl_ILocalOperations::GetSubShape(aShapeBase, aCI.Get2DEdge1(), aShapeFace1) &&
GEOMImpl_ILocalOperations::GetSubShape(aShapeBase, aCI.Get2DEdge2(), aShapeFace2))
{
fill.AddChamfer(TopoDS::Edge(aShapeFace1), TopoDS::Edge(aShapeFace2), aD1_2D, aD2_2D);
}
else
StdFail_NotDone::Raise("Cannot get 2d egde from sub-shape index!");
fill.Build();
if (!fill.IsDone()) {
StdFail_NotDone::Raise("Chamfer can not be computed on the given shape with the given parameters");
}
if (aWireFlag)
{
BRepBuilderAPI_MakeWire MW;
TopExp_Explorer exp (fill.Shape(), TopAbs_EDGE);
for (; exp.More(); exp.Next())
MW.Add(TopoDS::Edge(exp.Current()));
MW.Build();
if (!MW.IsDone())
StdFail_NotDone::Raise("Resulting wire cannot be built");
aShape = MW.Shape();
}
else
aShape = fill.Shape();
}
else
{
// Check the shape type. It have to be shell
// or solid, or compsolid, or compound of these shapes.
if (!isGoodForChamfer(aShapeBase)) {
StdFail_NotDone::Raise
("Wrong shape. Must be shell or solid, or compsolid or compound of these shapes");
}
BRepFilletAPI_MakeChamfer fill (aShapeBase);
if (aType == CHAMFER_SHAPE_ALL) {
// symmetric chamfer on all edges
double aD = aCI.GetD();
TopTools_IndexedDataMapOfShapeListOfShape M;
GEOMImpl_Block6Explorer::MapShapesAndAncestors(aShapeBase, TopAbs_EDGE, TopAbs_FACE, M);
for (int i = 1; i <= M.Extent(); i++) {
TopoDS_Edge E = TopoDS::Edge(M.FindKey(i));
TopoDS_Face F = TopoDS::Face(M.FindFromIndex(i).First());
if (!BRepTools::IsReallyClosed(E, F) &&
!BRep_Tool::Degenerated(E) &&
M.FindFromIndex(i).Extent() == 2)
fill.Add(aD, E, F);
}
//.........这里部分代码省略.........