
Mon, 11/07/2022 - 20:18
Hi Bros, I'm JianBaoxia.
I get a .step file, it consist of several TopoDS_Edge.
I try to build the edges into a wire, and then try to express the wire as a BSpline curve.
First I try to sort the edges through the "ShapeAnalysis_WireOrder", however, the status is -1, means "some edges are reversed, but no gaps remain", it there a way to solve it.
There is my demo:
TopoDS_Shape ReadStepFile(const std::string& filepath)
{
STEPControl_Reader reader;
reader.ReadFile(filepath.c_str());
reader.TransferRoots();
TopoDS_Shape shape = reader.OneShape();
return shape;
}
TopoDS_Wire SortEdgesForWire(const std::vector<TopoDS_Edge>& edgesListOfWire)
{
ShapeAnalysis_WireOrder sawo(Standard_True, Precision::Confusion());
for (int i = 0; i < edgesListOfWire.size(); i++)
{
TopoDS_Vertex firstVer = TopExp::FirstVertex(edgesListOfWire[i]);
TopoDS_Vertex lastVer = TopExp::LastVertex(edgesListOfWire[i]);
gp_Pnt startPoint = BRep_Tool::Pnt(firstVer);
gp_Pnt endPoint = BRep_Tool::Pnt(lastVer);
sawo.Add(startPoint.XYZ(), endPoint.XYZ());
}
sawo.Perform(); //
std::map<int, std::string> sawo_statusMap;
sawo_statusMap[0] = "all edges are direct and in sequence";
sawo_statusMap[1] = "all edges are direct but some are not in sequence";
sawo_statusMap[3] = "edges in sequence are just shifted in forward or reverse manner";
sawo_statusMap[-1] = "some edges are reversed, but no gaps remain";
sawo_statusMap[2] = "unresolved gaps remain";
sawo_statusMap[-2] = "some edges are reversed and some gaps remain";
sawo_statusMap[-10] = "failure on reorder";
if (!sawo.IsDone())
std::cout << "sawo was not done" << std::endl;
std::cout << "sawo.status()= " << sawo.Status() << " : " << sawo_statusMap[sawo.Status()] << std::endl;
std::cout << "NbChains():" << sawo.NbChains() << std::endl;
std::cout << "NbCouples():" << sawo.NbCouples() << std::endl;
std::cout << "NbEdges():" << sawo.NbEdges() << std::endl;
TopoDS_Edge* edgeList = new TopoDS_Edge[edgesListOfWire.size()];
for (int i = 0; i < edgesListOfWire.size(); i++)
{
Standard_Integer order = sawo.Ordered(i + 1);
edgeList[abs(order) - 1] = edgesListOfWire[i];
}
BRepBuilderAPI_MakeWire mkWire;
for (int i = 0; i < edgesListOfWire.size(); i++)
mkWire.Add(edgeList[i]);
TopoDS_Wire aWire = mkWire.Wire();
delete[]edgeList;
return aWire;
}
int main()
{
std::string filePath = "C:/Users/14656/Desktop/Program/Open Cascade/Demo/";
TopoDS_Shape shape = ReadStepFile(filePath + "theWire.step");
std::vector<TopoDS_Edge> edgeList;
for (TopExp_Explorer exp(shape, TopAbs_EDGE); exp.More(); exp.Next())
edgeList.push_back(TopoDS::Edge(exp.Current()));
TopoDS_Wire aWire = SortEdgesForWire(edgeList);
return 0;
}