Output PCurves of a cylindrical face in order

Two cylinders are fused together with BRepAlgoAPI_Fuse. The code is as follows.

// first Shape = Cylinder
gp_Pnt middlePoint = gp_Pnt(1000, 0, 1000);//1000,0,1000
gp_Dir direction = gp_Dir(0, 1, 0);
gp_Ax2 Ax2 = gp_Ax2(middlePoint, direction);
aCylinderShape1 = BRepPrimAPI_MakeCylinder(Ax2, 500,2000);
// second Shape = Cone
middlePoint = gp_Pnt(1000, 1000, 1000);
direction = gp_Dir(0, 1, 0);
Ax2 = gp_Ax2(middlePoint, direction);
//Shape2 = BRepPrimAPI_MakeCone(Ax2, 0.0635114, 0, 0.309304);
aCylinderShape2 = BRepPrimAPI_MakeCylinder(Ax2, 500,2000);

TopoDS_Shape aFuseShape = BRepAlgoAPI_Fuse(aCylinderShape1, aCylinderShape2);

After that the cylindrical wire of the first section is dumped out as follows.

Shape : 6, FORWARD

Dump of 6 TShapes

-----------------

Flags : Free, Modified, Checked, Orientable, Closed, Infinite, Convex

TShape # 1 : WIRE 0101000 04A8B6F8
-5 +3 +2 -3

TShape # 2 : EDGE 0101100 04A83684
+4 -4
Tolerance : 1e-007
same parametrisation of curves
same range on curves
- Curve 3D : 3, range : 0 6.28319
- PCurve : 6 on surface 3, range : 0 6.28319
UV Points : 0, 0 6.28319, 0
- PCurve : 7 on surface 4, range : 0 6.28319
UV Points : 500, -1.22465e-013 500, -1.22465e-013

TShape # 3 : EDGE 0101000 04A877C4
+4 -6
Tolerance : 1e-007
same parametrisation of curves
same range on curves
- Curve 3D : 2, range : 0 1000
- PCurve : 4, 5 (CN) on surface 3, range : 0 1000
UV Points : 6.28319, 0 6.28319, 1000
UV Points : 0, 0 0, 1000

TShape # 4 : VERTEX 0101101 04A83594

Tolerance : 1e-007
- Point 3D : 1000, 0, 1500

TShape # 5 : EDGE 0101100 04A84260
+6 -6
Tolerance : 1e-007
same parametrisation of curves
same range on curves
- Curve 3D : 1, range : 0 6.28319
- PCurve : 1 on surface 1, range : 0 6.28319
UV Points : 0, 0 6.28319, 0
- PCurve : 2 on surface 2, range : 0 6.28319
UV Points : 500, 0 500, 0
- PCurve : 3 on surface 3, range : 0 6.28319
UV Points : 0, 1000 6.28319, 1000

TShape # 6 : VERTEX 0101101 04A84170

Tolerance : 1e-007
- Point 3D : 1000, 1000, 1500

-------
Dump of 7 Curve2ds
-------

1 : Line
Origin :0, 0
Axis :1, 0

2 : Circle
Center :0, 0
XAxis :1, 0
YAxis :-0, 1
Radius :500

3 : Line
Origin :0, 1000
Axis :1, 0

4 : Line
Origin :6.28319, -0
Axis :0, 1

5 : Line
Origin :0, -0
Axis :0, 1

6 : Line
Origin :0, 0
Axis :1, 0

7 : Circle
Center :0, 0
XAxis :1, 0
YAxis :-0, 1
Radius :500

-------
Dump of 3 Curves
-------

1 : Circle
Center :1000, 1000, 1000
Axis :0, 1, 0
XAxis :0, -0, 1
YAxis :1, 0, -0
Radius :500

2 : Line
Origin :1000, 0, 1500
Axis :0, 1, 0

3 : Circle
Center :1000, 0, 1000
Axis :0, 1, 0
XAxis :0, -0, 1
YAxis :1, 0, -0
Radius :500

-------
Dump of 0 Polygon3Ds
-------
-------
Dump of 0 PolygonOnTriangulations
-------

-------
Dump of 4 surfaces
-------

1 : CylindricalSurface
Origin :1000, 1000, 1000
Axis :0, 1, 0
XAxis :0, -0, 1
YAxis :1, 0, -0
Radius :500

2 : Plane
Origin :1000, 1000, 1000
Axis :0, 1, 0
XAxis :0, -0, 1
YAxis :1, 0, -0

3 : CylindricalSurface
Origin :1000, 0, 1000
Axis :0, 1, 0
XAxis :0, -0, 1
YAxis :1, 0, -0
Radius :500

4 : Plane
Origin :1000, 0, 1000
Axis :0, 1, 0
XAxis :0, -0, 1
YAxis :1, 0, -0

-------
Dump of 0 Triangulations
-------

-------
Dump of 0 Locations
-------

I want to know how to output the pcurves of the wire in order. Here is the codes I am using and the output is wrong.

for(Ex.Init(W,aFace); Ex.More(); Ex.Next())
{
aEdge1 = Ex.Current();

aEdgeList.AddTail(aEdge1);

Standard_Boolean Eisreversed = (aEdge1.Orientation() == TopAbs_REVERSED);
BRep_ListIteratorOfListOfCurveRepresentation itrc((*((Handle(BRep_TEdge)*)&aEdge1.TShape()))->ChangeCurves());

while(itrc.More())
{
const Handle(BRep_CurveRepresentation)& cr = itrc.Value();
const Handle(BRep_GCurve)& GC = *((Handle(BRep_GCurve)*)&cr);
GC->Range(First,Last);

if (cr->IsCurveOnSurface(tSurface, loc))
{
Handle(Geom_Surface) S = GC->Surface();
L = aEdge1.Location() * GC->Location();

if (GC->IsCurveOnClosedSurface() && Eisreversed)
{
theCurve2d_2 = GC->PCurve2();
//output theCurve2d_2
break;
}
else
{
theCurve2d_1 = GC->PCurve();
//output theCurve2d_1
break;
}
}

itrc.Next();
}
}

George Feng's picture

WIRE: -5 +3 +2 -3
Here, '-5' represents edge 5 with reversed direction. But next edge '+3' is a seam edge, and I don't know which pcurve should be used, since there are two pcurves, as shown in the following.

- PCurve : 4, 5 (CN) on surface 3, range : 0 1000
UV Points : 6.28319, 0 6.28319, 1000
UV Points : 0, 0 0, 1000

I don't know which pcurve should be selected to be as the next one.

Forum supervisor's picture

Dear George,
You can use DRAW command to get pcurves of the face.
Also you can inspect the command implementation.
I do hope it will help you.
Regards

George Feng's picture

Does anybody know whether WIRE: -5 +3 +2 -3 is equal to WIRE:-3 +2 +3 -5?
After inspect carefully I think, WIRE:-3 +2 +3 -5 should be a normal representaion with edge numbers from right to left, while WIRE: -5 +3 +2 -3 is an abnormal representation with edge numbers from left to right.
Am I right? Need help.

George Feng's picture

After almost two weeks thought, I think I can resolve this problem now.
DRAW command get a wrong result after I resort the result brep file into the draw system, which should be a bug in DRAW.
As shown in the figure, PCurve2 is u=0, and PCurve1 is u=6.28. And walking along edges of the wire counterclockwisely, we can get 5, 3, 2, 3. And according to the direction of each curve, we can get -5 +3 +2 -3, where -5 means the direction of the pcurve of edge 5 is reverse with the direction of walking, +3 means the direction of the pucrve of edge 3 is accordant with the direction of wlking.
In most cases, PCurve2 is u=6.28, and PCurve1 is u=0, and DRAW command can work perfectly, but here PCurve2 is u=0, and PCurve1 is u=6.28.
Hope this will help others who have encountered the same problem.

George Feng's picture

Sorry, ‘And walking along edges of the wire counterclockwisely, we can get 5, 3, 2, 3.’ is wrong, where counterclockwisely should be clockwisely.
If the above law is right, then the wire can also be described by another way to be +5 +3 -2 -3. And W: -5 +3 +2 -3 and W: +5 +3 -2 -3 should be the same wire with different representations, one representation is obtained by walking along the wire clockwisely and another counterclockwisely.

George Feng's picture

I have made a mistake, still need help. I changed the position of edge 5 and edge 2 in the above picture. I post my brep file here.

George Feng's picture

I post the right picture here. The above law I have posted should be wrong somewhere.

George Feng's picture

It should be this picture.

George Feng's picture

DRAW commands are listed as follows:
Draw[1]> pload ALL
Draw[5]> restore My_cylinder_box_fused_10_2.brep s
s
Draw[7]> explo s f
s_1 s_2 s_3 s_4 s_5

Draw[8]> pcurve s_2

rouge FORWARD
bleu REVERSED
rose EXTERNAL
orange INTERNAL

Draw[10]> av2d
Draw[11]> 2dfit

After that, I only get two lines drawn in the 2d window.

Forum supervisor's picture

Dear George,
For sure there are 4 curves.
Check it more carefully.
You may use Draw command for this
or just try to list possible 2d curves by command

==> s_2 s_2_1 s_2_2 s_2_3 s_2_4

Regards

Ear MongHeng's picture

Hi George Feng
After i saw your post, i want to know how can i get value of Shape like(point,origin,....).The same you:
Dump of 7 Curve2ds
-------

1 : Line
Origin :0, 0
Axis :1, 0

2 : Circle
Center :0, 0
XAxis :1, 0
YAxis :-0, 1
Radius :500

3 : Line
Origin :0, 1000
Axis :1, 0

4 : Line
Origin :6.28319, -0
Axis :0, 1

5 : Line
Origin :0, -0
Axis :0, 1

6 : Line
Origin :0, 0
Axis :1, 0

7 : Circle
Center :0, 0
XAxis :1, 0
YAxis :-0, 1
Radius :500

-------
Dump of 3 Curves
-------

1 : Circle
Center :1000, 1000, 1000
Axis :0, 1, 0
XAxis :0, -0, 1
YAxis :1, 0, -0
Radius :500

2 : Line
Origin :1000, 0, 1500
Axis :0, 1, 0

3 : Circle
Center :1000, 0, 1000
Axis :0, 1, 0
XAxis :0, -0, 1
YAxis :1, 0, -0
Radius :500

-------
Dump of 0 Polygon3Ds
-------
-------
Dump of 0 PolygonOnTriangulations
-------

-------
Dump of 4 surfaces
-------

1 : CylindricalSurface
Origin :1000, 1000, 1000
Axis :0, 1, 0
XAxis :0, -0, 1
YAxis :1, 0, -0
Radius :500

2 : Plane
Origin :1000, 1000, 1000
Axis :0, 1, 0
XAxis :0, -0, 1
YAxis :1, 0, -0

3 : CylindricalSurface
Origin :1000, 0, 1000
Axis :0, 1, 0
XAxis :0, -0, 1
YAxis :1, 0, -0
Radius :500

4 : Plane
Origin :1000, 0, 1000
Axis :0, 1, 0
XAxis :0, -0, 1
YAxis :1, 0, -0
///////////////////////////////////

i try to write the code like these and i don't know it right or wrong:

for(ExpFace.Init(shape,TopAbs_FACE); ExpFace.More(); ExpFace.Next()) {
TopoDS_Face face = TopoDS::Face(ExpFace.Current());
const TopoDS_Shape& shape1 = ExpFace.Current();
const Handle(TopoDS_TShape)& Tshape = shape1.TShape();
if (ShapeAnalysis::IsOuterBound(face)) {
Handle(Geom_Surface) surface = BRep_Tool::Surface(face,location);
if(surface->IsKind(STANDARD_TYPE(Geom_Plane))) {
for(ExpEdge.Init(face,TopAbs_EDGE); ExpEdge.More(); ExpEdge.Next()) {
TopoDS_Edge edge = TopoDS::Edge(ExpEdge.Current());
if (!edge.IsNull()) {
Handle(Geom_Curve) curve = BRep_Tool::Curve(edge,first,last);
if (curve->IsKind(STANDARD_TYPE(Geom_Circle))) {
print(point,origin,corrdinate...)
}
}
}
}
}

}

////////////////////////////////////////
my goal, i read a cylinder.step file and then express to xml file.

if possible,could you please explain or give me a code?

i look forward to hearing from you soon.

thank in advance
from cambodian student.(ear.mongheng@gmail.com)