|Once the first part of your wire is created you need to compute the complete profile.|
| simple way to do this is to:|
- compute a new wire by reflecting the existing one.
- add the reflected wire to the initial one.
To apply a transformation on shapes (including wires), you first need to define the properties of a 3D geometric transformation by using the gp_Trsf class. This affinity transformation can be a translation, a rotation, a scale, a reflection or a combination of these.
In our case, we need to define a reflection with respect to the X axis of the global coordinate system. An axis, defined with the gp_Ax1 class, is built out of a point and a direction (3D unitary vector). There are two ways to define this axis.
The first way is to define it from scratch, using its geometric definition:
- X axis is located at (0 , 0 , 0) - use the gp_Pnt class.
- X axis direction is (1 , 0 , 0) - use the gp_Dir class. A gp_Dir instance is created out of its X, Y and Z coordinates.
gp_Pnt aOrigin(0 , 0 , 0);
gp_Dir xDir(1 , 0 , 0);
gp_Ax1 xAxis(aOrigin , xDir);
The second and simplest way is to use the geometric constants defined in the gp package (origin, main directions and axis of the global coordinate system). To get the X axis, just call the gp::OX method:
gp_Ax1 xAxis = gp::OX();
As previously explained, the property of a 3D geometric transformation is defined with the gp_Trsf class. There are two different ways to use this class:
- by defining a transformation matrix from scratch
- by using the appropriate methods corresponding to the required transformation (SetTranslation for a translation, SetMirror for a reflection, etc.): the matrix is automatically computed.
As the simplest approach is always the best, you should use the SetMirror method with the axis as the center of symmetry.
You now have all necessary data to apply the transformation with the BRepBuilderAPI_Transform class by specifying:
- the shape on which the transformation must be applied.
- the geometric transformation
BRepBuilderAPI_Transform aBRepTrsf(aWire , aTrsf);
BRepBuilderAPI_Transform does not modify the nature of the shape: the result of the reflected wire remains a wire. But the function-like call or the BRepBuilderAPI_Transform::Shape method returns a TopoDS_Shape object:
TopoDS_Shape aMirroredShape = aBRepTrsf.Shape();
What you need is a method to consider the resulting reflected shape as a wire. The TopoDS global functions provides this kind of service by casting a shape into its real type. To cast the transformed wire, use the TopoDS::Wire method.
TopoDS_Wire aMirroredWire = TopoDS::Wire(aBRepTrsf.Shape());
The bottle's profile is almost finished. You have created two wires : aWire and aMirroredWire. You need to concatenate them to compute a single shape. To do this, you use the BRepBuilderAPI_MakeWire class as follows:
- create an instance of BRepBuilderAPI_MakeWire.
- add all edges of the two wires by using the Add method on this object.
TopoDS_Wire myWireProfile = mkWire.Wire();