DG Kernel Documentation


Skip Navigation Links.
Skip Navigation LinksHome Page > API Reference > Model > Operations and Agorithms > ITransform Search Documentation


ITransform Interface

TranslateLoc
ScaleLoc
RotateLoc
Apply
RotateLoc2

The interface allows changing size of objects or translating surface relative to the local frame. Unlike object movement interfaces (I3DObject, IFrame, IFrame2) which move the object along with its local frame as a whole, ITransform modifies parameters of surface of the object because relative position/orientation of the local frame and surface of the object is modified.

ITransform can be queried from the relevant ISection interface.

See also Transform SampleInterface List


HRESULT TranslateLoc(double vx, double vy, double vz, VARIANT_BOOL includeChildren)

Parameters

vx,vy,vz - [in] Coordinates of the translation vector in local frame of the object.

includeChildren - [in] if true the operation is applied to all children of the object too.

Remarks:

The methods modifies geometry of the object so that it appears translated relative to the local system of coordinates. When includeChildren is true all children of the object are translated by vx,vy,vz along with its local frame. UpdateSurface must be called after this method for the object to be rendered correctly 

Note: sequence of calls IFrame2.Translate(vx, vy, vz) ITransform.TranslateLoc(-vx, -vy, -vz) is equivalent to translation of local frame relative to the object, or in other words repositioning of the local frame. 

For curved patches of 3DS objects scaling may change slightly curvature of patches as exact transformation is not always geometrically possible. 

Translation of  SOR objects translates the surface along the axis in positive or negative direction of z-axis when vx and vy are 0. When vx or vy are not 0 but equal the generatrix  is translated in x and z plane along two-dimensional vector (vx,vz).  


HRESULT ScaleLoc(double scalex, double scaley, double scalez, VARIANT_BOOL includeChildren)

Parameters

scalex, scaley, scalez - [in] multipliers for scaling up or down respective dimension of the object in the local axes. All multipliers must be strictly greater than 0. Dimension of the object will be increased or decreased depending whether the respective multiplier is greater or less than 1. Supplying 1 for a multiplier will leave the dimension unchanged.

includeChildren - [in] if true the operation is applied to all children of the object too.

Return Values

DISP_E_PARAMNOTOPTIONAL if some of the multipliers are near zero (less than 1e-3) or negative.
 
Remarks:

The method modifies geometry of the object so that its size will be multiplied as expressed relative to the local system of coordinates. When, for example, all scalex, scaley, scalez are equal to 2.0 the object will be twice as large, When multipliers are not the same the object will appear stretched or contracted. 

For SOR objects when vx and vy are not equal the object is converted to Mesh Entity type prior the scaling operation. 

UpdateSurface must be called after this method for the object to be rendered correctly.

To scale against a point other that origin of the local frame use TranslateLoc method to translate the object prior the operation. Most often it is needed to call TranslateLoc afterwards with the opposite vector to translate the object back.

When includeChildren is true the operation is applied to all children of the object with scales transformed appropriately to the local frame of the child.


HRESULT RotateLoc(double degrees, DIVect* axis, VARIANT_BOOL frameOrObject)

Parameters

degrees - [in] Angle of rotation in degrees

axis - [in] Axis of rotation in local frame of the object. For 3DS and entity types this parameter is ignored and axis is assumed to be (1, 0, 0) vector.

frameOrObject- [in] if true the local frame is rotated. Otherwise surface of the object is rotated, while the local frame remains unchanged

Return Values

ERROR_INVALID_STATE if the rotation can not be performed for the type of the object.
 
Remarks:

The method modifies relative orientation of local frame of the object and surface of the object. This operation is considered as a geometry change, which means that coordinates and parameters of elements of the surface, like vertex coordinates, will be different.

Some object types, like SOR, can not be rotated. Call to this method in this case returns the error code or throws an exception in high level environments.


HRESULT Apply(IFrame* target, VARIANT_BOOL frameOrObject)

Parameters

target - [in] IFrame, which defines the transformation. See remarks.

frameOrObject- [in] if true the local frame is made identical to target. Otherwise surface of the object is transformed as described in the remarks, while the local frame remains unchanged

Remarks:

If frameOrObject is true the surface of the object remains unchanged relative to the global frame, but local frame becomes identical to target.

If frameOrObject is false the method performs general isometric linear transformation of surface of the object. The surface under transformation is changed as if the object, which implements this ITransform, was moved in space so that its local frame coincides with target. The local frame remains the same in this case relatively to the global axes. In other words a 3D point with global coordinates x, y , z is mapped under the transformation to point with same coordinates in frame target.

Besides using IFrame of an existent object, target can be created standalone as described in IFrame topic. Use IFrame.SetAxes and IFrame.SetOrigin to manipulate the target.


HRESULT RotateLoc2(double degrees, DIPoint* originAxis, DIVect* directionAxis, VARIANT_BOOL frameOrObject, VARIANT_BOOL includeChildren)

Remarks:

This method behaves similarily to RotateLoc() above, except when includeChildren is true children of the object (or their local frames) are rotated around the same axis. Both originAxis and directionAxis must have coordinates relative to the local frame of the object this interface was queried from. originAxis and directionAxis are converted internally to a global vector on the start of the operation