 
  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;
}
 
        