Cloning a Vector Group

A group of vector objects can be cloned and added to a vector handle as a clone object. The steps used to accomplish this are as follows:

1.

Create and add a new group in the current vector handle.

2.

Create and add any new objects of the desired type into the group.

3.

Create an empty layer.

4.

Create a clone of the group.

5.

Add the clone object to the layer in the vector handle.

The following is an example that shows this process:

void CreateClone( pVECTORHANDLE pVector )
{
   L_INT nRet;
   VECTORPOINT Min, Max;
   VECTORGROUPDESC GroupDesc;
   VECTORGROUP Group;
   VECTORLINE Line;
   VECTORLAYERDESC LayerDesc;
   VECTORLAYER Layer;
   VECTORCLONE Clone;

   // setup the vector
   Min.x = 0.0;
   Min.y = 0.0;
   Min.z = 0.0;
   Max.x = 5.0;
   Max.y = 5.0;
   Max.z = 0.0;
   L_VecSetParallelogram( pVector, &Min, &Max );

   L_VecSetOrigin( pVector, NULL );
   L_VecSetCamera( pVector, NULL );

   ZeroMemory( &GroupDesc, sizeof( GroupDesc ) );
   GroupDesc.nSize = sizeof( GroupDesc );
   lstrcpy( GroupDesc.szName, TEXT("My Group"));
   GroupDesc.dwTag = 0L;

   nRet = L_VecAddGroup( pVector, &GroupDesc, &Group, 0L );
   if( nRet != SUCCESS )
   {
      MessageBox( NULL, TEXT("Can't Add Group!"), NULL, 0 );
      return;
   }

   // add a new object
   ZeroMemory( &Line, sizeof( Line ) );
   L_VecInitObject( &Line.Object );
   Line.Object.nSize = sizeof( Line );
   Line.Object.nType = VECTOR_LINE;
   Line.Point[ 0 ].x = 0.0;
   Line.Point[ 0 ].y = 0.0;
   Line.Point[ 0 ].z = 0.0;
   Line.Point[ 1 ].x = 1.0;
   Line.Point[ 1 ].y = 1.0;
   Line.Point[ 1 ].z = 0.0;

   Line.Pen.nSize = sizeof( Line.Pen );
   Line.Pen.bExtPen = FALSE;
   Line.Pen.NewPen.LogPen.lopnColor = RGB( 255, 0, 0 );
   Line.Pen.NewPen.LogPen.lopnWidth.x = 1;
   Line.Pen.NewPen.LogPen.lopnWidth.y = 0;
   Line.Pen.NewPen.LogPen.lopnStyle = PS_SOLID;

   nRet = L_VecAddObjectToGroup( pVector, &Group, VECTOR_LINE, &Line, NULL );
   if( nRet != SUCCESS )
   {
      MessageBox( NULL, TEXT("Can't Insert Object!"), NULL, 0 );
      return;
   }

   Line.Point[ 0 ].x = 1.0;
   Line.Point[ 0 ].y = 0.0;
   Line.Point[ 0 ].z = 0.0;
   Line.Point[ 1 ].x = 0.0;
   Line.Point[ 1 ].y = 1.0;
   Line.Point[ 1 ].z = 0.0;

   nRet = L_VecAddObjectToGroup( pVector, &Group, VECTOR_LINE, &Line, NULL );
   if( nRet != SUCCESS )
   {
      MessageBox( NULL, TEXT("Can't Insert Object!"), NULL, 0 );
      return;
   }

   // create an empty layer
   ZeroMemory( &LayerDesc, sizeof( LayerDesc ) );
   LayerDesc.nSize = sizeof( LayerDesc );
   lstrcpy( LayerDesc.szName, TEXT("My Layer"));
   LayerDesc.bVisible = TRUE;
   LayerDesc.bLocked = FALSE;
   LayerDesc.dwTag = 0L;

   nRet = L_VecAddLayer( pVector, &LayerDesc, &Layer, 0L );
   if( nRet != SUCCESS )
   {
      MessageBox( NULL, TEXT("Can't Add Layer!"), NULL, 0 );
      return;
   }

   // now, clone the group
   ZeroMemory( &Clone, sizeof( Clone ) );
   L_VecInitObject( &Clone.Object );
   Clone.Object.nSize = sizeof( Clone );
   Clone.Object.nType = VECTOR_CLONE;

   memcpy( &Clone.Group, &Group, sizeof( Group ) );

   Clone.Point.x = 2.0;
   Clone.Point.y = 2.0;
   Clone.Point.z = 0.0;

   Clone.Scale.x = 2.0;
   Clone.Scale.y = 2.0;
   Clone.Scale.z = 2.0;

   Clone.Rotation.x = 0.0;
   Clone.Rotation.y = 0.0;
   Clone.Rotation.z = 0.0;

   Clone.Pen.nSize = sizeof( Clone.Pen );
   Clone.Pen.bExtPen = FALSE;
   Clone.Pen.NewPen.LogPen.lopnColor = RGB( 255, 0, 0 );
   Clone.Pen.NewPen.LogPen.lopnWidth.x = 1;
   Clone.Pen.NewPen.LogPen.lopnWidth.y = 0;
   Clone.Pen.NewPen.LogPen.lopnStyle = PS_SOLID;

   Clone.Brush.nSize = sizeof( Clone.Brush );
   Clone.Brush.VectorBrushStyle = VECTORBRUSH_STANDARD;
   Clone.Brush.BrushType.StandardBrush.LogBrush.lbColor = RGB( 255, 0, 0 );
   Clone.Brush.BrushType.StandardBrush.LogBrush.lbStyle = BS_SOLID;
   Clone.Brush.BrushType.StandardBrush.LogBrush.lbHatch = 0;

   Clone.dwFlags = 0L;     // use original settings

   nRet = L_VecAddObject( pVector, &Layer, VECTOR_CLONE, &Clone, NULL );
   if( nRet != SUCCESS )
   {
      MessageBox( NULL, TEXT("Can't Insert Object!"), NULL, 0 );
      return;
   }

   // now, clone the group again
   Clone.Point.x = 4.0;
   Clone.Point.y = 1.0;
   Clone.Point.z = 0.0;

   Clone.Scale.x = 1.0;
   Clone.Scale.y = 1.0;
   Clone.Scale.z = 1.0;

   Clone.Rotation.x = 0.0;
   Clone.Rotation.y = 0.0;
   Clone.Rotation.z = 45.0;

   Clone.dwFlags = VECTOR_CLONE_USE_PEN;
   Clone.Pen.NewPen.LogPen.lopnColor = RGB( 0, 0, 255 );  // this clone will be blue

   nRet = L_VecAddObject( pVector, &Layer, VECTOR_CLONE, &Clone, NULL );
   if( nRet != SUCCESS )
   {
      MessageBox( NULL, TEXT("Can't Insert Object!"), NULL, 0 );
      return;
   }
}