who can tell me how to rotate the object , like surface , solid .

please give me a sample .

thank .

Rob Bachrach Wed, 09/22/2004 - 15:25

A rotation, like any transformation, can be performed by
creating a transformation matrix and then applyling it to a
TopoDS_Shape (vertex, edge, wire, face, shell, solid).

So, to perform a rotation(r) about the global +Y axis:

Note: you can also look at gce_MakeRotation if you do not wish
to create an intermediate gp_Trsf object. BRepBuilderAPI_Transform
modifies the transformation matrix on the shape.
If you use BRepBuilderAPI_GTransform it will modify the actual points,
curves, and surfaces in the shape.

Based on the error, it looks like you are trying to pass a function
pointer rather than a gp_Ax1 object into the call to SetRotation.
It is possible I had a typo in the example I sent you (it was
untested). You might try putting parentheses in the axis creation:
SetRotation(gp::OY(), r);

When calling MakeBox, A is the local coordinate system for the
box. This local coordinate system will define one corner of the
box with the box defined in the +x,+y,+z octant.
So, if you want to center your box around the global origin, the
easiest way would be to use the MakeBox call that takes a point for
a corner of the box and call (again, not tested):

This coordinate system is aligned with the global cartesian
coordinate system. Likewise, although not necessary in this case,
you can specify its orientation by specifying either its main axis
(equivalent to +Z) and letting it compute the others or by specifying
the X and Z axes and letting it compute y.

Wed, 09/22/2004 - 15:25

A rotation, like any transformation, can be performed by

creating a transformation matrix and then applyling it to a

TopoDS_Shape (vertex, edge, wire, face, shell, solid).

So, to perform a rotation(r) about the global +Y axis:

gp_Trsf myTrsf;

myTrsf.SetRotation(gp::OY, r);

BRepBuilderAPI_Transform xform(myShape, myTrsf);

myShape = xform.Shape();

Note: you can also look at gce_MakeRotation if you do not wish

to create an intermediate gp_Trsf object. BRepBuilderAPI_Transform

modifies the transformation matrix on the shape.

If you use BRepBuilderAPI_GTransform it will modify the actual points,

curves, and surfaces in the shape.

Mon, 10/04/2004 - 08:38

thanks very much .

but i have a error like this :

error C2664: 'SetRotation' : cannot change

const class gp_Ax1' to

"const class gp_Ax1 &(__cdecl *)(void)"

Mon, 10/04/2004 - 13:49

Based on the error, it looks like you are trying to pass a function

pointer rather than a gp_Ax1 object into the call to SetRotation.

It is possible I had a typo in the example I sent you (it was

untested). You might try putting parentheses in the axis creation:

SetRotation(gp::OY(), r);

Sorry if this caused confusion.

Rob

Tue, 10/05/2004 - 03:27

thanks you very much .

I can do it . the code like this :

lsWall= BRepPrimAPI_MakeBox(3170,1400,100);

const Standard_Real r=45 ;

myTrsf.SetRotation(gp::OY(), r * PI /180 );

// or : myTrsf.SetRotation(gp_Ax1(gp_Pnt(0,0,0),gp_Dir(0,1,0)),10);

BRepBuilderAPI_Transform xform1(lsWall, myTrsf);

lsWall = xform1.Shape();

but the ratoted angle is not my expectation .

r=45 , picture in sceen like to 60 rotate;

r=90 , picture in screen like 130 .

and if I want use BRepPrimAPI_MakeBox(A,dx,dy,dz).

to make a rotated box around gp::OY(),

what to define A .

thanks.

Tue, 10/05/2004 - 14:10

When calling MakeBox, A is the local coordinate system for the

box. This local coordinate system will define one corner of the

box with the box defined in the +x,+y,+z octant.

So, if you want to center your box around the global origin, the

easiest way would be to use the MakeBox call that takes a point for

a corner of the box and call (again, not tested):

BRepPrimAPI_MakeBox(gp_Pnt(-dx/2, -dy/2, -dz/2),dx,dy,dz);

Likewise, if you really wanted to use the local coordinate system

method, you just need to set its origin:

gp_Ax2 myAx2;

myAx2.SetLocation(gp_Pnt(-dx/2, -dy/2, -dz/2));

BRepPrimAPI_MakeBox(myAx2, dx, dy, dz);

This coordinate system is aligned with the global cartesian

coordinate system. Likewise, although not necessary in this case,

you can specify its orientation by specifying either its main axis

(equivalent to +Z) and letting it compute the others or by specifying

the X and Z axes and letting it compute y.

gp_Ax2 myAx2(gp_Pnt(-dx/2, -dy/2, -dz/2), gp::DZ(), gp::DX());

BRepPrimAPI_MakeBox(myAx2, dx, dy, dz);

Tue, 10/05/2004 - 03:32

sorry .

the first question is my misstake.

the rotate angle r=angle ;

myTrsf.SetRotation(gp::OY(), r * PI /180 );

I can see right result .

sorry.