For all issues regarding the Forums use, please, refer to the Forum Rules.

Our Solutions

Need professional assistance?
Consider our:

Support Offerings

 

Need to speed up your development?
Have a look at our:

Samples & Tools

 

Need some functionality extending standard OCCT capabilities?
Check out our:

Adv. Components

Related pages

How to receive list of roots and their position in space?

Roman's picture
Forums: 

Hello. At first, sorry for my English.

I need to import *.iges or *.step files (It is I did). Then I need to receive list of roots/surfaces/edges and so on.
For example, to receive list of roots and then their position (x, y, z). Please tell me where to find information about it?

In general, I had to transform *.iges or *.step into Finete Element Mesh. Maybe you have some information about it?

Thank you. Sincerely, Roman.

Forum supervisor's picture

Hello Roman,

You might consult the source code of various Draw commands (such as "igesbrep" in XSDRAWIGES.cxx and "stepread" in XSDRAWSTEP.cxx) that deal with IGES and STEP files.
It is not clear what you mean by a "root's position (x, y, z)", though - probably, you could contact us to explain your need in more detail.

As for FEA meshing, such solutions exist and are used, for example, in our SALOME software - have a look at http://www.salome-platform.org/user-section/about/mesh.

Do not hesitate to contact us via http://www.opencascade.com/contact with your further information and questions.
Best regards,
Forum Supervisor

Roman's picture

Thank you very much for help.
I saw the sample CSharp, I found the function ImportIges() (in OCCTProxy.cpp).

bool ImportIges(char* theFileName)
{
Standard_CString aFileName = (Standard_CString) theFileName;
IGESControl_Reader aReader;
int aStatus = aReader.ReadFile( aFileName );

if ( aStatus == IFSelect_RetDone )
{
aReader.TransferRoots();
TopoDS_Shape aShape = aReader.OneShape();
myAISContext()->Display(new AIS_Shape(aShape));
}
else
{
return false;
}

myAISContext()->UpdateCurrentViewer();
return true;
}

But I cannot receive the arrays of points, lines, BSpline Curves, BSpline Surfaces and so on (all entities). How can I do this?

Thank you. Sincerely, Roman.

Daniel Neander's picture

Hello Roman,

You can use TopExp_Explorer to loop through the faces, edges, vertex's ect.

Standard_CString aFileName = "D:/OpenCASCADE6.9.0/opencascade-6.9.0/data/iges/128-009.igs";
IGESControl_Reader aReader;
int aStatus = aReader.ReadFile( aFileName );
TopoDS_Shape aShape;
if ( aStatus == IFSelect_RetDone )
{
aReader.TransferRoots();
aShape = aReader.OneShape();
}

// Find all BSplineCurve and lines
TopTools_MapOfShape aProcessedEdges;
double fp,lp;
TopExp_Explorer edgeExp (aShape, TopAbs_EDGE);
while (edgeExp.More()) {
TopoDS_Edge aEdge = TopoDS::Edge(edgeExp.Current());
if (!aProcessedEdges.Contains(aEdge) && !BRep_Tool::Degenerated(aEdge)) {
aProcessedEdges.Add(aEdge);

Handle(Geom_Curve) C1 = BRep_Tool::Curve(aEdge,fp,lp);
if (C1.IsNull()) {
qDebug() return;
}

GeomAdaptor_Curve aGAC(C1);
switch (aGAC.GetType()) {
case GeomAbs_BSplineCurve: {
Handle(Geom_BSplineCurve) aBSp = aGAC.BSpline();
}
break;
case GeomAbs_Line:
gp_Lin aLin = aGAC.Line();
break;
}
}
edgeExp.Next();
}

// Find all BSplineSurface
TopExp_Explorer faceExp (aShape, TopAbs_FACE);
while (faceExp.More()) {
TopoDS_Face aEdge = TopoDS::Face(faceExp.Current());

Handle(Geom_Surface) C1 = BRep_Tool::Surface(aEdge);
if (C1.IsNull()) {
qDebug() return;
}

GeomAdaptor_Surface aGAC(C1);
switch (aGAC.GetType()) {{
case GeomAbs_BSplineSurface:
Handle(Geom_BSplineSurface) aBSp = aGAC.BSpline();
}
break;
}

faceExp.Next();
}

// Find all vertex's
TopTools_MapOfShape aProcessedVertex;
TopExp_Explorer vertexExp (aShape, TopAbs_VERTEX);
while (vertexExp.More()) {
TopoDS_Vertex aVetex = TopoDS::Vertex(vertexExp.Current());
if (!aProcessedVertex.Contains(aVetex)) {
aProcessedVertex.Add(aVetex);
gp_Pnt point = BRep_Tool::Pnt(aVetex);
qDebug() }

vertexExp.Next();
}

Good luck

Roman's picture

Daniel Neander, thank you. It works.
You really saved me =)

Roman's picture

Thank you for help.

But I have one more question.

How to receive CARTESIAN_POINT (knot vector)?

As I understood, class Geom_BSplineCurve is contained necessary methods, but how to access to them?

Handle(Geom_BSplineCurve) aBSp = aGAC.BSpline();
aBSp have not these methods.

Thank you. Sincerely, Roman.

Attachments: 
Daniel Neander's picture

Hello Roman,

A "Handle" is basically a c++ pointer.
Try the following
Handle(Geom_BSplineCurve) aBSp = aGAC.BSpline();
aBSp->NbKnots();

Roman's picture

Hello, Daniel Neander

It does not work.

aBSp has not functions of Geom_BSplineCurve class.

Standard_Integer knots = aGAC.NbKnots(); returns number of elements of knot vector, but I need array of these elements; I need knot vector, degree, control points.

#17 = B_SPLINE_CURVE_WITH_KNOTS('',3,(#18,#19,#20,#21,#22,#23,#24),
.UNSPECIFIED.,.F.,.F.,(4,1,1,1,4),(0.E+000,5.099019513593,
9.571155468592,13.69426109421,17.299812369674),.UNSPECIFIED.);
#18 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000));
#19 = CARTESIAN_POINT('',(0.315574441982,5.35236316417,0.E+000));
#20 = CARTESIAN_POINT('',(0.802251469225,6.833111097242,0.E+000));
#21 = CARTESIAN_POINT('',(2.334769918812,-0.778160723897,0.E+000));
#22 = CARTESIAN_POINT('',(6.983440015292,2.781493261489,0.E+000));
#23 = CARTESIAN_POINT('',(9.293474399511,1.759916728762,0.E+000));
#24 = CARTESIAN_POINT('',(10.,6.12323399574E-016,0.E+000));

There are more ideas? How to receive all information about B-Spline?

Thank you. Sincerely, Roman.

Daniel Neander's picture

Have you read the documentation for Geom_BSplineCurve? Everything if there.
For Knots:
for (int i = 1; i NbKnots() + 1; i++) {
qDebug() Knot(i));
}

Control point is same but called pole.
I am sure you can work out degree :P

CONNECT WITH US

Attention: DO NOT use this form for all kind of request for the removal of your personal data. Please follow this link for such cases.