Mon, 02/11/2008 - 17:04

Forums:

Hi,

I have a TopoDS_Shape and need to get the point on the surface of the shape with the lowest x-value. Is there a OpenCascade function to determine such points or need I to iterate over the whole surface to get the point with the lowest x-value?

Thanks!

Markus

Mon, 02/11/2008 - 17:09

You can use BRepExtrema_DistShapeShape, taking a plane X=-1e100 for the second shape.

Mon, 02/11/2008 - 19:01

My fault - I dont need the distance, I need the exact point where the distance is lowest.

Mon, 02/11/2008 - 19:11

That class provides all necessary information, including points on both shapes for each solution, and parameters of points on supporting geometries, see the methods PointOnShape1, SupportTypeShape1, SupportOnShape1, ParOnEdgeS1, ParOnFaceS1.

Tue, 02/12/2008 - 09:41

Thank you! Thats the functions I need!

Tue, 02/12/2008 - 09:20

Hi,

The solution suggested above will give you the distance. However you can compare the shape with the YOZ Plane and get the X coordinate from the distance along X axis. I hope it will work.

Regards

N. Sharjith

Mon, 02/18/2008 - 15:43

Hi..

I need to get the dimension of all entities(edges,circles) from the given model..

Mon, 02/18/2008 - 15:47

hi

I need to get the dimensions of entities(edges,circles,etc) from a given model and export the same to database....which package i have to use for getting dimensions..Is there any API s available to get the dimensions of selected edges...

Please help me...

Thanks and Regards,

S.Vijayaragavan

Mon, 02/18/2008 - 15:54

Check out:

http://www.opencascade.org/org/forum/thread_11187/

Tue, 02/19/2008 - 11:36

Hi Rob,

Thanks for your reply..I got the dimensional data for box and circle..I need to take dimensional data for all basic 2D models(line,triangle,square,ellipse etc)...How can i do that..I am new to Opencascade....If Possible please send me some sample code for doing the same....One part of my project is Taking Dimensional Data from given 2D model..It will be helpful if u send some sample code for extracting dimensional data.....

Regards,

Vijayaragavan.S

vjyragavan@yahoo.co.in

Thu, 02/21/2008 - 14:56

Vijayaragavan,

Here is some sample code I use for getting lines and circles from an IGES file. You can expand this to handle any of the OCC primitive curve types. However, compound shapes like triangles and squares are another story. You would need to write code to look at a set of lines and identify the compound shapes. For example:

- find edges that form a closed loop (you might be able to look at wires in the OCC shape)

- if there are four edges

- if opposite edges have the same length

- if at least one angle is 90 degrees

- this must be a rectangle

- get the lengths of the edges for the dimensions

Other complex shapes can be more or less complicated. We have done some of this work, but it is too complicated to post and is proprietary to my company, so I can't share it. Sorry.

Good luck, here's the code,

Rob

// build a compound of edges to be converted

Bnd_Box bound;

Standard_Real minX, minY, minZ, maxX, maxY, maxZ;

BRep_Builder builder;

TopoDS_Compound compound;

builder.MakeCompound(compound);

TopExp_Explorer ex;

for (ex.Init(shape, TopAbs_EDGE); ex.More(); ex.Next()) {

// get the bounding box for this edge

bound.SetVoid();

BRepBndLib::Add(ex.Current(), bound);

bound.SetGap(0.0);

// if the edge is parallel to the Z axis, skip it

if (bound.IsVoid() ||

(bound.IsXThin(Precision::Confusion()) &&

bound.IsYThin(Precision::Confusion()))) continue;

// add the edge to the compound

builder.Add(compound, ex.Current());

}

// get the bounding box of the shape

bound.SetVoid();

BRepBndLib::Add(compound, bound);

bound.SetGap(0.0);

bound.Get(minX, minY, minZ, maxX, maxY, maxZ);

// get the maximum z plane minus a tolerance

Standard_Real zTop = maxZ-((maxZ-minZ)*BOX_TOL);

// make a map to avoid duplicate edges

TopTools_MapOfShape mapEdges;

// loop through the edges in the shape

for (ex.Init(compound, TopAbs_EDGE); ex.More(); ex.Next()) {

TopoDS_Edge edge = TopoDS::Edge(ex.Current());

// skip this edge if it was already processed

if (mapEdges.Contains(edge)) continue;

// get the bounding box for this edge

bound.SetVoid();

BRepBndLib::Add(edge, bound);

bound.SetGap(0.0);

bound.Get(minX, minY, minZ, maxX, maxY, maxZ);

// skip this edge if it is not in the top plane

if (minZ < zTop) continue;

// add the edge to the map

mapEdges.Add(edge);

// get the curve from the edge

Standard_Real fFirst, fLast;

Handle(Geom_Curve) curve = BRep_Tool::Curve(edge, fFirst, fLast);

// if the edge is 0 length, throw it away

if (IsEqual(fFirst, fLast)) continue;

// swap the parameters if the edge is reversed

if (edge.Orientation() == TopAbs_REVERSED) {

Standard_Real fTemp = fFirst;

fFirst = fLast;

fLast = fTemp;

}

// process the curve based on its type

Handle(Standard_Type) type = curve->DynamicType();

if (type == STANDARD_TYPE(Geom_Line)) {

Handle(Geom_Line) line = Handle(Geom_Line)::DownCast(curve);

// get its start and end points

gp_Pnt gPtStart = line->Value(fFirst);

gp_Pnt gPtEnd = line->Value(fLast);

// create a line primitive

.....

}

else if (type == STANDARD_TYPE(Geom_Circle)) {

Handle(Geom_Circle) circle = Handle(Geom_Circle)::DownCast(curve);

// make a 360 degree arc a circle

if ((fabs(fmod(fFirst, Standard_PI*2.0)) < ZERO_TOL) &&

(fabs(fmod(fLast, Standard_PI*2.0)) < ZERO_TOL)) {

// get the center and radius

gp_Circ gCirc = circle->Circ();

gp_Pnt gPtCenter = gCirc.Location();

float fRadius = (float) gCirc.Radius();

// create the circle primitive

......

}

else {

// get the start point, end point, and mid point

gp_Pnt gPtStart = circle->Value(fFirst);

gp_Pnt gPtEnd = circle->Value(fLast);

gp_Pnt gPtMid = circle->Value((fFirst+fLast)/2.0);

// create the arc primitive

......

}

}

else {

qDebug("Unrecognized curve: %s - %g, %g", type->Name(), fFirst, fLast);

}

}