////////////////////////////////////////////////////////////////////////////////
//
// step3D1.cpp - 
//
// 1.    - CreateExtrusion
// 2.               - OperationRotated
// 3.             - OperationLoft
// 4.       - CreateFilletAndChamfer
//
////////////////////////////////////////////////////////////////////////////////
#ifndef VCL_H
#include <vcl.h>
#endif

#ifndef __WINDOWS_
#include <windows.h>
#endif

#ifndef __STDIO_H
#include <stdio.h>
#endif

#ifndef  __MATH_H
#include <math.h>
#endif

#pragma hdrstop

#include <objbase.h>
#include <initguid.h>

#ifndef __STEP3D1_RH
#include "step3D1.rh"
#endif

#ifndef __STEP3D1_H
#include "step3D1.h"
#endif

#include "ksConstants.h"

#if !defined(_IFUNC)
# define _IFUNC STDMETHODCALLTYPE
#endif

HINSTANCE _hinst;


//------------------------------------------------------------------------------
//    
// ---
LPTSTR _LoadStr( int id )
{ 
  static char buf[512]; 
  //       
  ksConvertLangStrEx( _hinst, id, buf, 512 );
  return buf;
}


//-------------------------------------------------------------------------------
//   
// ---
extern "C" unsigned int far __export __pascal LibraryId()
{
	return IDR_LIBID;
}


//-------------------------------------------------------------------------------
//   
// ---
void CreateExtrusion( IUEnv <IPart> & part );
void OperationRotated( IUEnv <IPart> & part );
void OperationLoft( IUEnv <IPart> & part );
void CreateFilletAndChamfer( IUEnv <IPart> & part );


//-------------------------------------------------------------------------------
//   
// ---
extern "C" void far __export __pascal LibraryEntry( unsigned int comm )
{
  LPDOCUMENT3D pDocument3d = ksGetActive3dDocument(); //       
  if ( pDocument3d )
  {
    //           ( pNew_Part -  ,
    // pEdit_Part -  , pTop_Part -   )    
    IUEnv <IPart> part( pDocument3d->GetPart( pTop_Part ) );
    if ( part )
    {
      switch ( comm )
      {
        case 1 : CreateExtrusion( part );        break; //   
        case 2 : OperationRotated( part );       break; //  
        case 3 : OperationLoft( part );          break; //   
        case 4 : CreateFilletAndChamfer( part ); break; //    
      }
    }
    pDocument3d->Release(); //  , AddRef   
  }
  else
  {
    Error( _LoadStr( STR_3DDOCERROR ) ); //       3D-
  }
  if ( ReturnResult() == etError10 ) // !  
    ResultNULL(); //  
}


//-------------------------------------------------------------------------------
//      
// ---
void ClearCurrentSketch()
{
  //         
  reference rIterator = CreateIterator( ALL_OBJ, 0 );
  if ( rIterator )
  {
    reference rObject = MoveIterator( rIterator, 'F' ); //       
    //              
    while ( rObject )
    {
      //     
      if ( ExistObj( rObject ) )
        DeleteObj( rObject );
      //    
      rObject = MoveIterator( rIterator, 'N' );
    }
    DeleteIterator( rIterator ); //  
  }
}


//-------------------------------------------------------------------------------
//  ,   
// ---
void CreateExtrusion( IUEnv <IPart> & part )
{
  //   
  IUEnv <IEntity> entitySketch( part->NewEntity( o3d_sketch ) );
  if ( entitySketch )
  {
    //        
    LPUNKNOWN pDefinitionSketch = entitySketch->GetDefinition();
    if ( pDefinitionSketch )
    {
      //   
      IUPTR( SketchDefinition ) sketchDefinition( pDefinitionSketch );
      if ( sketchDefinition )
      {
        //     XOY
        IUEnv <IEntity> basePlane( part->GetDefaultEntity( o3d_planeXOY ) );
 
        //   
        sketchDefinition->SetPlane( basePlane.GetI() ); //   XOY   
        sketchDefinition->SetAngle( 45 );               //   
 
        //  
        entitySketch->Create();

        //     
        if ( sketchDefinition->BeginEdit() )
        {
          //    - 
          LineSeg(  50,  50, -50,  50, 1 );
          LineSeg(  50, -50, -50, -50, 1 );
          LineSeg(  50, -50,  50,  50, 1 );
          LineSeg( -50, -50, -50,  50, 1 );
          //     
          sketchDefinition->EndEdit();
        }

        //  
        IUEnv <IEntity> entityExtrusion( part->NewEntity( o3d_baseExtrusion ) );
        if ( entityExtrusion )
        {
          //        
          LPUNKNOWN pDefinitionExtrusion = entityExtrusion->GetDefinition();
          if ( pDefinitionExtrusion )
          {
            //    
            IUPTR( BaseExtrusionDefinition ) extrusionDefinition( pDefinitionExtrusion );
            if ( extrusionDefinition )
            {
              //    
              extrusionDefinition->SetDirectionType( dtNormal );    //   ( dtNormal	- 
                                                                    // ,    - ,
                                                                    // dtReverse	-  ,    - 
                                                                    // dtBoth -   , dtMiddlePlane    )
              //      
              extrusionDefinition->SetSideParam( true,              //   ( TRUE -  ,
                                                                    // FALSE -   )
                                                 etBlind,           //   ( etBlind -   ,
                                                                    // etThroughAll -   , etUpToVertexTo -    ,
                                                                    // etUpToVertexFrom -    , etUpToSurfaceTo - 
                                                                    //   , etUpToSurfaceFrom -    ,
                                                                    // etUpToNearSurface	-    )
                                                 200,               //  
                                                 0,                 //  
                                                 false );           //   ( TRUE -  , FALSE -   )
              //    
              extrusionDefinition->SetThinParam( true,              //   
                                                 dtBoth,            //    
                                                 10,                //     
                                                 10 );              //     
              extrusionDefinition->SetSketch( entitySketch.GetI() ); //   
 
              //   
              entityExtrusion->Create();  
              Message( " " );

              //                  
              extrusionDefinition->SetDirectionType( dtBoth ); //   ( dtNormal	- 
                                                               // ,    - ,
                                                               // dtReverse	-  ,    - 
                                                               // dtBoth -   , dtMiddlePlane    )
              //      
              extrusionDefinition->SetSideParam( false,        //   ( TRUE -  ,
                                                               // FALSE -   )
                                                 etBlind,      //   ( etBlind -   ,
                                                               // etThroughAll -   , etUpToVertexTo -    ,
                                                               // etUpToVertexFrom -    , etUpToSurfaceTo - 
                                                               //   , etUpToSurfaceFrom -    ,
                                                               // etUpToNearSurface	-    )
                                                 150,          //  
                                                 0,            //  
                                                 false );      //   ( TRUE -  , FALSE -   )
              
              //  
              entityExtrusion->Update(); 
              Message( "   " );

              //     
              if ( sketchDefinition->BeginEdit())
              {
                //      
                ClearCurrentSketch();                
                //    
                Circle( 0, 0, 100, 1 );
                //     
                sketchDefinition->EndEdit(); 
              }
              
              //   
              entitySketch->Update();               
              //    
              entityExtrusion->Update();   
              Message( " " );

              //   
              IUEnv <IEntity> entitySketch2( part->NewEntity( o3d_sketch ) );
              if ( entitySketch2 ) 
              {
                //        
                LPUNKNOWN pDefinitionSketch2 = entitySketch2->GetDefinition(); 
                if ( pDefinitionSketch2 ) 
                {
                  //   
                  IUPTR( SketchDefinition ) sketchDefinition2( pDefinitionSketch2 );
                  if ( sketchDefinition2 ) 
                  {
                    //   
                    sketchDefinition2->SetPlane( basePlane.GetI() ); //   XOY   
                    sketchDefinition2->SetAngle( 45 );               //    45 .
                    
                    //  
                    entitySketch2->Create(); 

                    //     
                    if ( sketchDefinition2->BeginEdit() )
                    {
                      //    - 
                      Circle( 0, 0, 150, 1 );
                      //     
                      sketchDefinition2->EndEdit();
                    }

                    //  
                    IUEnv <IEntity> entityBossExtrusion( part->NewEntity( o3d_bossExtrusion ) );
                    if ( entityBossExtrusion ) 
                    {
                      //        
                      LPUNKNOWN pDefinitionBossExtrusion = entityBossExtrusion->GetDefinition(); 
                      if ( pDefinitionBossExtrusion ) 
                      {
                        //     
                        IUPTR( BossExtrusionDefinition ) bossExtrusionDefinition( pDefinitionBossExtrusion );
                        if ( bossExtrusionDefinition ) 
                        {
                          IUPTR( ExtrusionParam ) extrusionParam( bossExtrusionDefinition->ExtrusionParam() ); //    
                          IUPTR( ThinParam )      thinParam( bossExtrusionDefinition->ThinParam() );           //     
                          if ( extrusionParam && thinParam ) 
                          {
                            //    
                            bossExtrusionDefinition->SetSketch( entitySketch2.GetI() ); //   

                            extrusionParam->SetDirection( dtNormal ); //   ( dtNormal	- 
                                                                      // ,    - ,
                                                                      // dtReverse	-  ,    - 
                                                                      // dtBoth -   , dtMiddlePlane    )
                            extrusionParam->SetTypeNormal( etBlind ); //   ( etBlind -   ,
                                                                      // etThroughAll -   , etUpToVertexTo -    ,
                                                                      // etUpToVertexFrom -    , etUpToSurfaceTo -  
                                                                      //  , etUpToSurfaceFrom -    ,
                                                                      // etUpToNearSurface -    )
                            extrusionParam->SetDepthNormal( 100 );    //  
                            thinParam->SetThin( false );              //      ( TRUE	-  , 
                                                                      // , FALSE -     )
                            entityBossExtrusion->Create(); //  
                            Message( " " );            
                          }
                        }
                        pDefinitionBossExtrusion->Release(); //  , AddRef   
                      }
                    }

                    //   
                    IUEnv <IEntity> entitySketch3( part->NewEntity( o3d_sketch ) );
                    if ( entitySketch3 )
                    {
                      //        
                      LPUNKNOWN pDefinitionSketch3 = entitySketch3->GetDefinition();
                      if ( pDefinitionSketch3 )
                      {
                        //   
                        IUPTR( SketchDefinition ) sketchDefinition3( pDefinitionSketch3 );
                        if ( sketchDefinition3 )
                        {
                          //   
                          sketchDefinition3->SetPlane( basePlane.GetI() ); //   XOY   
                          sketchDefinition3->SetAngle( 45 );               //    45 .
                          
                          //                
                          entitySketch3->Create(); 

                          //     
                          if ( sketchDefinition3->BeginEdit() )
                          {
                            //    - 
                            LineSeg(  50,  50, -50,  50, 1 );
                            LineSeg(  50, -50, -50, -50, 1 );
                            LineSeg(  50, -50,  50,  50, 1 );
                            LineSeg( -50, -50, -50,  50, 1 );
                            //     
                            sketchDefinition3->EndEdit();
                          }
                          
                          //  
                          IUEnv <IEntity> entityCutExtrusion( part->NewEntity( o3d_cutExtrusion ) );
                          if ( entityCutExtrusion ) 
                          {
                            //        
                            LPUNKNOWN pDefinitionCutExtrusion = entityCutExtrusion->GetDefinition();     // 
                            if ( pDefinitionCutExtrusion ) 
                            {
                              //     
                              IUPTR( CutExtrusionDefinition ) cutExtrusionDefinition( pDefinitionCutExtrusion );
                              if ( cutExtrusionDefinition ) 
                              {
                                //    
                                cutExtrusionDefinition->SetDirectionType( dtReverse );     //   ( dtNormal	- 
                                                                                           // ,    - ,
                                                                                           // dtReverse	-  ,    - 
                                                                                           // dtBoth -   , dtMiddlePlane    )
                                //      
                                cutExtrusionDefinition->SetSideParam( false,               //   ( TRUE -  ,
                                                                                           // FALSE -   )
                                                                      etBlind,             //   ( etBlind -   ,
                                                                                           // etThroughAll -   , etUpToVertexTo -    ,                  
                                                                                           // etUpToVertexFrom -    , etUpToSurfaceTo - 
                                                                                           //   , etUpToSurfaceFrom -    ,
                                                                                           // etUpToNearSurface	-    )
                                                                      50,                  //  
                                                                      0,                   //  
                                                                      false );             //   ( TRUE -  , FALSE -   )
                                //    
                                cutExtrusionDefinition->SetThinParam( false,               //   
                                                                      0,                   //    
                                                                      0,                   //     
                                                                      0 );                 //     
                                cutExtrusionDefinition->SetSketch( entitySketch3.GetI() ); //   
 
                                //  
                                entityCutExtrusion->Create();
                                Message( " " );
                              }
                              pDefinitionCutExtrusion->Release(); //  , AddRef   
                            }
                          }
                        }
                        pDefinitionSketch3->Release(); //  , AddRef   
                      }
                    }
                  }
                  pDefinitionSketch2->Release(); //  , AddRef   
                }
              }
            }
            pDefinitionExtrusion->Release(); //  , AddRef   
          }
        }
      }
      pDefinitionSketch->Release(); //  , AddRef   
    }
  }
}


//-------------------------------------------------------------------------------
// C   
// ---
void CreateFilletAndChamfer( IUEnv <IPart> & part ) 
{
  //   
  IUEnv <IEntity> entitySketch( part->NewEntity( o3d_sketch ) );
  if ( entitySketch )
  {
    //        
    LPUNKNOWN pDefinitionSketch = entitySketch->GetDefinition();
    if ( pDefinitionSketch )
    {
      //   
      IUPTR( SketchDefinition ) sketchDefinition( pDefinitionSketch );
      if ( sketchDefinition )
      {
        //     XOY
        IUEnv <IEntity> basePlane( part->GetDefaultEntity( o3d_planeXOY ) );
 
        //   
        sketchDefinition->SetPlane( basePlane.GetI() ); //   XOY   
        sketchDefinition->SetAngle( 45 );               //   
 
        //  
        entitySketch->Create();

        //     
        if ( sketchDefinition->BeginEdit() )
        {
          //    - 
          LineSeg(  50,  50, -50,  50, 1 );
          LineSeg(  50, -50, -50, -50, 1 );
          LineSeg(  50, -50,  50,  50, 1 );
          LineSeg( -50, -50, -50,  50, 1 );
          //     
          sketchDefinition->EndEdit();
        }
        
        //  
        IUEnv <IEntity> entityExtrusion( part->NewEntity( o3d_baseExtrusion ) );
        if ( entityExtrusion )
        {
          //        
          LPUNKNOWN pDefinitionExtrusion = entityExtrusion->GetDefinition();
          if ( pDefinitionExtrusion )
          {
            //    
            IUPTR( BaseExtrusionDefinition ) extrusionDefinition( pDefinitionExtrusion );
            if ( extrusionDefinition )
            {
              //    
              extrusionDefinition->SetDirectionType( dtNormal );     //   ( dtNormal	- 
                                                                     // ,    - ,
                                                                     // dtReverse	-  ,    - 
                                                                     // dtBoth -   , dtMiddlePlane    )
              //      
              extrusionDefinition->SetSideParam( true,               //   ( TRUE -  ,
                                                                     // FALSE -   )
                                                 etBlind,            //   ( etBlind -   ,
                                                                     // etThroughAll -   , etUpToVertexTo -    ,
                                                                     // etUpToVertexFrom -    , etUpToSurfaceTo - 
                                                                     //   , etUpToSurfaceFrom -    ,
                                                                     // etUpToNearSurface	-    )
                                                 100,                //  
                                                 0,                  //  
                                                 false );            //   ( TRUE -  , FALSE -   )
              //    
              extrusionDefinition->SetThinParam( false,              //   
                                                 0,                  //    
                                                 0,                  //     
                                                 0 );                //     
              extrusionDefinition->SetSketch( entitySketch.GetI() ); //   
 
              //   
              entityExtrusion->Create();  
              
              //          -          
              IUPTR( EntityCollection ) entityCollection( part->EntityCollection( o3d_face ) );
              if ( entityCollection && 
                   entityCollection->SelectByPoint( 0, 0, 0 ) && //   
                   entityCollection->GetCount() )                //     
              {
                //  
                IUEnv <IEntity> entityFillet( part->NewEntity( o3d_fillet ) );
                if ( entityFillet ) 
                {
                  //        
                  LPUNKNOWN pDefinitionFillet = entityFillet->GetDefinition(); 
                  if ( pDefinitionFillet ) 
                  {
                    IUPTR( FilletDefinition ) filletDefinition( pDefinitionFillet );
                    if ( filletDefinition ) 
                    {
                      //   
                      filletDefinition->SetRadius( 10 );      //  
                      filletDefinition->SetTangent( false );  //   
                      IUPTR( EntityCollection ) arrayFilletDefinition( filletDefinition->Array() ); //     
                      if ( arrayFilletDefinition ) 
                      {
                        //     
                        for ( int i = 0, count = entityCollection->GetCount(); i < count; i++ )
                          arrayFilletDefinition->Add( entityCollection->GetByIndex( i ) );
                        //   
                        entityFillet->Create();
                        Message( "" );
                      }
                    }
                    pDefinitionFillet->Release(); //  , AddRef   
                  }
                }
              }

              //          -           
              IUPTR( EntityCollection ) entityCollection2( part->EntityCollection( o3d_face ) );
              if ( entityCollection2 && 
                   entityCollection2->SelectByPoint( 0, 0, 100 ) && //   
                   entityCollection2->GetCount() )                  //     
              {
                //  
                IUEnv <IEntity> entityChamfer( part->NewEntity( o3d_chamfer ) );
                if ( entityChamfer ) 
                {
                  //        
                  LPUNKNOWN pDefinitionChamfer = entityChamfer->GetDefinition();    
                  if ( pDefinitionChamfer ) 
                  {
                    IUPTR( ChamferDefinition ) chamferDefinition( pDefinitionChamfer );
                    if ( chamferDefinition ) 
                    {
                      //   
                      chamferDefinition->SetTangent( false );   //   
                      chamferDefinition->SetChamferParam( true, //   
                                                          10,   //     
                                                          10 ); //    
                      IUPTR( EntityCollection ) arrayChamferDefinition( chamferDefinition->Array() ); //     
                      if ( arrayChamferDefinition ) 
                      {
                        //     
                        for ( int i = 0, count = entityCollection2->GetCount(); i < count; i++ )
                          arrayChamferDefinition->Add( entityCollection2->GetByIndex( i ) );
                        //  
                        entityChamfer->Create();
                        Message( "" );
                      }
                    }
                    pDefinitionChamfer->Release(); //  , AddRef   
                  }
                }
              }
            }
            pDefinitionExtrusion->Release(); //  , AddRef   
          }
        }
      }
      pDefinitionSketch->Release(); //  , AddRef   
    }
  }
}


//-------------------------------------------------------------------------------
//  
// ---
void OperationRotated( IUEnv <IPart> & part ) 
{
  //   
  IUEnv <IEntity> entitySketch( part->NewEntity( o3d_sketch ) );
  if ( entitySketch )
  {
    //        
    LPUNKNOWN pDefinitionSketch = entitySketch->GetDefinition();
    if ( pDefinitionSketch )
    {
      //   
      IUPTR( SketchDefinition ) sketchDefinition( pDefinitionSketch );
      if ( sketchDefinition )
      {
        //     XOY
        IUEnv <IEntity> basePlane( part->GetDefaultEntity( o3d_planeXOY ) );
 
        //   
        sketchDefinition->SetPlane( basePlane.GetI() ); //   XOY   
 
        //  
        entitySketch->Create();

        //     
        if ( sketchDefinition->BeginEdit() )
        {
          //   
          ArcByAngle( 0, 0, 20, -90, 90, 1, 1 );
          LineSeg( 0, -20, 0, 20, 3 );
          //     
          sketchDefinition->EndEdit();
        }
        //  
        IUEnv <IEntity> entityRotate( part->NewEntity( o3d_baseRotated ) );
        if ( entityRotate ) 
        {
          //        
          LPUNKNOWN pDefinitionRotate = entityRotate->GetDefinition();  
          if ( pDefinitionRotate ) 
          {
            //    
            IUPTR( BaseRotatedDefinition ) baseRotatedDefinition( pDefinitionRotate ); 
            if ( baseRotatedDefinition ) 
            {
              baseRotatedDefinition->SetToroidShapeType( false );      //   ( TRUE - , FALSE -  )
              baseRotatedDefinition->SetDirectionType( dtBoth );       //   ( dtNormal -  ,    - 
                                                                       // dtReverse -  ,    - , dtBoth -   ,
                                                                       // dtMiddlePlane -    )
              //    
              baseRotatedDefinition->SetThinParam( true,               //   
                                                   dtBoth,             //    
                                                   1,                  //     
                                                   1 );                //     
              //      
              baseRotatedDefinition->SetSideParam( true,               //   ( TRUE - , FALSE -  )
                                                   180 );              //  
              //      
              baseRotatedDefinition->SetSideParam( false,              //   ( TRUE - , FALSE -  )
                                                   180 );              //  
              baseRotatedDefinition->SetSketch( entitySketch.GetI() ); //                                                                    
              //                
              entityRotate->Create();    
              Message( "  " );                    
            }
            pDefinitionRotate->Release(); //  , AddRef   
          }
        }
      }
    }
    pDefinitionSketch->Release(); //  , AddRef   
  }  

  //   
  IUEnv <IEntity> entitySketch2( part->NewEntity( o3d_sketch ) );
  if ( entitySketch2 )
  {
    //        
    LPUNKNOWN pDefinitionSketch2 = entitySketch2->GetDefinition();
    if ( pDefinitionSketch2 )
    {
      //   
      IUPTR( SketchDefinition ) sketchDefinition2( pDefinitionSketch2 );
      if ( sketchDefinition2 )
      {
        //     XOY
        IUEnv <IEntity> basePlane( part->GetDefaultEntity( o3d_planeXOY ) );
 
        //   
        sketchDefinition2->SetPlane( basePlane.GetI() ); //   XOY   
 
        //  
        entitySketch2->Create();

        //     
        if ( sketchDefinition2->BeginEdit() )
        {
          //   
          ArcByAngle( 15, 0, 10, -90, 90, 1, 1 );
          LineSeg( 15, -10, 15, 10, 3 );
          //     
          sketchDefinition2->EndEdit();
        }
        
        //   
        IUEnv <IEntity> entityBossRotate( part->NewEntity( o3d_bossRotated ) );
        if ( entityBossRotate ) 
        {
          //        
          LPUNKNOWN pDefinitionBossRotate = entityBossRotate->GetDefinition();  
          if ( pDefinitionBossRotate ) 
          {
            //    
            IUPTR( BossRotatedDefinition ) bossRotatedDefinition( pDefinitionBossRotate ); 
            if ( bossRotatedDefinition ) 
            {
              bossRotatedDefinition->SetToroidShapeType( false );       //   ( TRUE - , FALSE -  )
              bossRotatedDefinition->SetDirectionType( dtNormal );      //   ( dtNormal -  ,    -  
                                                                        // dtReverse -  ,    - , dtBoth -   ,
                                                                        // dtMiddlePlane -    )
              //      
              bossRotatedDefinition->SetSideParam( true,                //   ( TRUE - , FALSE -  )
                                                   360 );               //  
              //    
              bossRotatedDefinition->SetThinParam( true,                //   
                                                   dtBoth,              //    
                                                   1,                   //     
                                                   1 );                 //     
              bossRotatedDefinition->SetSketch( entitySketch2.GetI() ); //                                                                    
              //               
              entityBossRotate->Create();  
              Message( "  " );                      
            }
            pDefinitionBossRotate->Release(); //  , AddRef   
          }
        }
      }
    }
    pDefinitionSketch2->Release(); //  , AddRef   
  }

  //   
  IUEnv <IEntity> entitySketch3( part->NewEntity( o3d_sketch ) );
  if ( entitySketch2 )
  {
    //        
    LPUNKNOWN pDefinitionSketch3 = entitySketch3->GetDefinition();
    if ( pDefinitionSketch3 )
    {
      //   
      IUPTR( SketchDefinition ) sketchDefinition3( pDefinitionSketch3 );
      if ( sketchDefinition3 )
      {
        //     XOY
        IUEnv <IEntity> basePlane( part->GetDefaultEntity( o3d_planeXOY ) );
 
        //   
        sketchDefinition3->SetPlane( basePlane.GetI() ); //   XOY   
 
        //  
        entitySketch3->Create();

        //     
        if ( sketchDefinition3->BeginEdit() )
        {
          //   
          ArcByAngle( 20, 0, 20, 90, 270, 1, 1 );
          LineSeg( 20, -20, 20, 20, 3 );
          //     
          sketchDefinition3->EndEdit();
        }
        
        //   
        IUEnv <IEntity> entityCutRotate( part->NewEntity( o3d_cutRotated ) );
        if ( entityCutRotate ) 
        {
          //        
          LPUNKNOWN pDefinitionCutRotate = entityCutRotate->GetDefinition();  
          if ( pDefinitionCutRotate ) 
          {
            //    
            IUPTR( CutRotatedDefinition ) cutRotatedDefinition( pDefinitionCutRotate ); 
            if ( cutRotatedDefinition ) 
            {
              cutRotatedDefinition->SetToroidShapeType( false );       //   ( TRUE - , FALSE -  )
              cutRotatedDefinition->SetDirectionType( dtNormal );      //   ( dtNormal -  ,    - 
                                                                       // dtReverse -  ,    - , dtBoth -   ,
                                                                       // dtMiddlePlane -    )
              //      
              cutRotatedDefinition->SetSideParam( true,                //   ( TRUE - , FALSE -  )
                                                  90 );                //  
              //    
              cutRotatedDefinition->SetThinParam( true,                //   
                                                  dtBoth,              //    
                                                  5,                   //     
                                                  7 );                 //     
              cutRotatedDefinition->SetSketch( entitySketch3.GetI() ); //                                                                    
              //             
              entityCutRotate->Create();  
              Message( "  " );                      
            }
            pDefinitionCutRotate->Release(); //  , AddRef   
          }
        }
      }
    }
    pDefinitionSketch3->Release(); //  , AddRef   
  }
}


//-------------------------------------------------------------------------------
//   
// ---
void OperationLoft( IUEnv <IPart> & part ) 
{
  //   
  IUEnv <IEntity> entitySketch( part->NewEntity( o3d_sketch ) );  
  if (  entitySketch )
  {
    //        
    LPUNKNOWN pDefinitionSketch = entitySketch->GetDefinition();
    if ( pDefinitionSketch )
    {
      //   
      IUPTR( SketchDefinition ) sketchDefinition( pDefinitionSketch );
      if ( sketchDefinition )
      {
        //     XOY
        IUEnv <IEntity> basePlane( part->GetDefaultEntity( o3d_planeXOY ) );
            
        //   
        sketchDefinition->SetPlane( basePlane.GetI() ); //   XOY   
 
        //  
        entitySketch->Create();
        entitySketch->SetHidden(false);

        //     
        if ( sketchDefinition->BeginEdit() )
        {
          //    - 
           Circle( 0, 0, 4.5, 1 );
          //     
          sketchDefinition->EndEdit();
        }
      }
      pDefinitionSketch->Release(); //  , AddRef   
    }
  }

  //    (      )
  IUEnv <IEntity> entityPlaneOffset2( part->NewEntity( o3d_planeOffset ) );
  //   
  IUEnv <IEntity> entitySketch2( part->NewEntity( o3d_sketch ) );  
  if ( entityPlaneOffset2 && entitySketch2 )
  {
    //        
    LPUNKNOWN pDefinitionPlaneOffset2 = entityPlaneOffset2->GetDefinition();  
    if ( pDefinitionPlaneOffset2 )
    {
      //    
      IUPTR( PlaneOffsetDefinition ) planeOffsetDefinition2( pDefinitionPlaneOffset2 );
    
      if ( planeOffsetDefinition2 ) 
      {
        //    
        planeOffsetDefinition2->SetOffset( 30 ); //    
        
        //     XOY
        IUEnv <IEntity> basePlane( part->GetDefaultEntity( o3d_planeXOY ) );

        planeOffsetDefinition2->SetPlane( basePlane.GetI() ); //   XOY   
        
        //  
        BSTR name = SysAllocString( L"  2" );
        entityPlaneOffset2->SetName( name );                  //    
        //  
        SysFreeString( name );
        
        entityPlaneOffset2->SetHidden( true );                //   
        
        //   
        entityPlaneOffset2->Create();             
        
        //        
        LPUNKNOWN pDefinitionSketch2 = entitySketch2->GetDefinition();
        if ( pDefinitionSketch2 )
        {
          //   
          IUPTR( SketchDefinition ) sketchDefinition2( pDefinitionSketch2 );
          if ( sketchDefinition2 )
          {
            //   
            sketchDefinition2->SetPlane( entityPlaneOffset2.GetI() ); //      
 
            //  
            entitySketch2->Create();

            //     
            if ( sketchDefinition2->BeginEdit() )
            {
              //    - 
              Circle( 0, 0, 8, 1 );
              //     
              sketchDefinition2->EndEdit();
            }
          }
          pDefinitionSketch2->Release(); //  , AddRef   
        }
      }
      pDefinitionPlaneOffset2->Release(); //  , AddRef   
    }
  }
  
  //    (      )
  IUEnv <IEntity> entityPlaneOffset3( part->NewEntity( o3d_planeOffset ) );
  //   
  IUEnv <IEntity> entitySketch3( part->NewEntity( o3d_sketch ) );  
  if ( entityPlaneOffset3 && entitySketch3 )
  {
    //        
    LPUNKNOWN pDefinitionPlaneOffset3 = entityPlaneOffset3->GetDefinition();  
    if ( pDefinitionPlaneOffset3 )
    {
      //    
      IUPTR( PlaneOffsetDefinition ) planeOffsetDefinition3( pDefinitionPlaneOffset3 );
    
      if ( planeOffsetDefinition3 ) 
      {
        //    
        planeOffsetDefinition3->SetOffset( 60 ); //    
        
        //     XOY
        IUEnv <IEntity> basePlane( part->GetDefaultEntity( o3d_planeXOY ) );

        planeOffsetDefinition3->SetPlane( basePlane.GetI() ); //   XOY   
        
        //  
        BSTR name = SysAllocString( L"  3" );
        entityPlaneOffset3->SetName( name );                 //    
        //  
        SysFreeString( name );
        
        entityPlaneOffset3->SetHidden( true );               //   
        
        //   
        entityPlaneOffset3->Create();             
        
        //        
        LPUNKNOWN pDefinitionSketch3 = entitySketch3->GetDefinition();
        if ( pDefinitionSketch3 )
        {
          //   
          IUPTR( SketchDefinition ) sketchDefinition3( pDefinitionSketch3 );
          if ( sketchDefinition3 )
          {
            //   
            sketchDefinition3->SetPlane( entityPlaneOffset3.GetI() ); //      
 
            //  
            entitySketch3->Create();

            //     
            if ( sketchDefinition3->BeginEdit() )
            {
              //    - 
              Circle( 0, 0, 1.5, 1 );
              //     
              sketchDefinition3->EndEdit();
            }
          }
          pDefinitionSketch3->Release(); //  , AddRef   
        }
      }
      pDefinitionPlaneOffset3->Release(); //  , AddRef   
    }
  }  
 
  //     
  IUEnv <IEntity> entityBaseLoft( part->NewEntity( o3d_baseLoft ) );
  if ( entityBaseLoft ) 
  {
    LPUNKNOWN pDefinitionBaseLoft = entityBaseLoft->GetDefinition();   
    if ( pDefinitionBaseLoft ) 
    {
      IUPTR( BaseLoftDefinition ) baseLoftDefinition( pDefinitionBaseLoft );
      if ( baseLoftDefinition ) 
      {
        IUPTR( EntityCollection ) entityCollection( baseLoftDefinition->Sketchs() );
        if ( entityCollection ) 
        {
          entityCollection->Add( entitySketch.GetI() );
          entityCollection->Add( entitySketch2.GetI() );
          entityCollection->Add( entitySketch3.GetI() );
        }
        
        //  
        BSTR name = SysAllocString( L"" );
        entityBaseLoft->SetName( name ); //     
        //  
        SysFreeString( name ); 
        //       
        entityBaseLoft->SetAdvancedColor( 12345678, // 
                                          .8,       //  
                                          .8,       // 
                                          .8,       // 
                                          .8,       // 
                                           1,       // 
                                          .8 );     // 

        // C   
        entityBaseLoft->Create(); 
        Message( "   " );                       
      }
      pDefinitionBaseLoft->Release(); //  , AddRef   
    }
  }
  
  //       
  IUEnv <IEntity> entitySketch4( part->NewEntity( o3d_sketch ) );  
  if (  entitySketch4 )
  {
    //        
    LPUNKNOWN pDefinitionSketch4 = entitySketch4->GetDefinition();
    if ( pDefinitionSketch4 )
    {
      //   
      IUPTR( SketchDefinition ) sketchDefinition4( pDefinitionSketch4 );
      if ( sketchDefinition4 )
      {
        //   
        sketchDefinition4->SetPlane( entityPlaneOffset3.GetI() ); //      
        
        //  
        entitySketch4->Create();

        //     
        if ( sketchDefinition4->BeginEdit() )
        {
          //    - 
          Circle( 0, 0, 1.5, 1 );
          //     
          sketchDefinition4->EndEdit();
        }
      }
      pDefinitionSketch4->Release(); //  , AddRef   
    }
  }
    
  //    (      )
  IUEnv <IEntity> entityPlaneOffset5( part->NewEntity( o3d_planeOffset ) );
  //   
  IUEnv <IEntity> entitySketch5( part->NewEntity( o3d_sketch ) );  
  if ( entityPlaneOffset5 && entitySketch5 )
  {
    //        
    LPUNKNOWN pDefinitionPlaneOffset5 = entityPlaneOffset5->GetDefinition();  
    if ( pDefinitionPlaneOffset5 )
    {
      //    
      IUPTR( PlaneOffsetDefinition ) planeOffsetDefinition5( pDefinitionPlaneOffset5 );
    
      if ( planeOffsetDefinition5 ) 
      {
        //    
        planeOffsetDefinition5->SetOffset( 120 ); //    
        
        //     XOY
        IUEnv <IEntity> basePlane( part->GetDefaultEntity( o3d_planeXOY ) );

        planeOffsetDefinition5->SetPlane( basePlane.GetI() ); //   XOY   
        
        //  
        BSTR name = SysAllocString( L"  5" );
        entityPlaneOffset5->SetName( name );                 //    
        //  
        SysFreeString( name );
        
        entityPlaneOffset5->SetHidden( true );               //   
        
        //   
        entityPlaneOffset5->Create();             
        
        //        
        LPUNKNOWN pDefinitionSketch5 = entitySketch5->GetDefinition();
        if ( pDefinitionSketch5 )
        {
          //   
          IUPTR( SketchDefinition ) sketchDefinition5( pDefinitionSketch5 );
          if ( sketchDefinition5 )
          {
            //   
            sketchDefinition5->SetPlane( entityPlaneOffset5.GetI() ); //      
 
            //  
            entitySketch5->Create();

            //     
            if ( sketchDefinition5->BeginEdit() )
            {
              //    - 
              Circle( 0, 0, 1.8, 1 );
              //     
              sketchDefinition5->EndEdit();
            }
          }
          pDefinitionSketch5->Release(); //  , AddRef   
        }
      }
      pDefinitionPlaneOffset5->Release(); //  , AddRef   
    }
  }  

  //     
  IUEnv <IEntity> entityBossLoft( part->NewEntity( o3d_bossLoft ) );
  if ( entityBossLoft ) 
  {
    LPUNKNOWN pDefinitionBossLoft = entityBossLoft->GetDefinition();   
    if ( pDefinitionBossLoft ) 
    {
      IUPTR( BossLoftDefinition ) bossLoftDefinition( pDefinitionBossLoft );
      if ( bossLoftDefinition ) 
      {
        IUPTR( EntityCollection ) entityCollection( bossLoftDefinition->Sketchs() );
        if ( entityCollection ) 
        {
          entityCollection->Add( entitySketch4.GetI() );
          entityCollection->Add( entitySketch5.GetI() );
        }
        
        //  
        BSTR name = SysAllocString( L"" );
        entityBossLoft->SetName( name ); //     
        //  
        SysFreeString( name ); 
        //       
        entityBossLoft->SetAdvancedColor( 1234567890, // 
                                          .8,         //  
                                          .8,         // 
                                          .8,         // 
                                          .8,         // 
                                           1,         // 
                                          .8 );       // 

        // C    
        entityBossLoft->Create(); 
        Message( "   " );                       
      }
      pDefinitionBossLoft->Release(); //  , AddRef   
    }
  }

  //       
  IUEnv <IEntity> entitySketch6( part->NewEntity( o3d_sketch ) );  
  if (  entitySketch6 )
  {
    //        
    LPUNKNOWN pDefinitionSketch6 = entitySketch6->GetDefinition();
    if ( pDefinitionSketch6 )
    {
      //   
      IUPTR( SketchDefinition ) sketchDefinition6( pDefinitionSketch6 );
      if ( sketchDefinition6 )
      {
        //   
        sketchDefinition6->SetPlane( entityPlaneOffset5.GetI() ); //      
        
        //  
        entitySketch6->Create();

        //     
        if ( sketchDefinition6->BeginEdit() )
        {
          //    - 
          RectangleParam parRectangle; //   
          memset( &parRectangle, 0, sizeof( parRectangle ) );          
          parRectangle.x       = -1.8;                         //     -    
          parRectangle.y       = -.4;
          parRectangle.height  = .8;                           //  
          parRectangle.width   = 3.6;                          //  
          parRectangle.style   = 1;                            //  
          parRectangle.pCorner = CreateArray( CORNER_ARR, 0 ); //      ( ) 
          ksRectangle( &parRectangle, 0 ); //  
          //     
          sketchDefinition6->EndEdit();
        }
      }
      pDefinitionSketch6->Release(); //  , AddRef   
    }
  }

  //    (      )
  IUEnv <IEntity> entityPlaneOffset7( part->NewEntity( o3d_planeOffset ) );
  //   
  IUEnv <IEntity> entitySketch7( part->NewEntity( o3d_sketch ) );  
  if ( entityPlaneOffset7 && entitySketch7 )
  {
    //        
    LPUNKNOWN pDefinitionPlaneOffset7 = entityPlaneOffset7->GetDefinition();  
    if ( pDefinitionPlaneOffset7 )
    {
      //    
      IUPTR( PlaneOffsetDefinition ) planeOffsetDefinition7( pDefinitionPlaneOffset7 );
    
      if ( planeOffsetDefinition7 ) 
      {
        //    
        planeOffsetDefinition7->SetOffset( 110 ); //    
        
        //     XOY
        IUEnv <IEntity> basePlane( part->GetDefaultEntity( o3d_planeXOY ) );

        planeOffsetDefinition7->SetPlane( basePlane.GetI() ); //   XOY   
        
        //  
        BSTR name = SysAllocString( L"  7" );
        entityPlaneOffset7->SetName( name );                 //    
        //  
        SysFreeString( name );
        
        entityPlaneOffset7->SetHidden( true );               //   
        
        //   
        entityPlaneOffset7->Create();             
        
        //        
        LPUNKNOWN pDefinitionSketch7 = entitySketch7->GetDefinition();
        if ( pDefinitionSketch7 )
        {
          //   
          IUPTR( SketchDefinition ) sketchDefinition7( pDefinitionSketch7 );
          if ( sketchDefinition7 )
          {
            //   
            sketchDefinition7->SetPlane( entityPlaneOffset7.GetI() ); //      
 
            //  
            entitySketch7->Create();

            //     
            if ( sketchDefinition7->BeginEdit() )
            {
              //    - 
              RectangleParam parRectangle; //   
              memset( &parRectangle, 0, sizeof( parRectangle ) );          
              parRectangle.x       = -1.8;                         //     -    
              parRectangle.y       = -1.8;
              parRectangle.height  = 3.6;                          //  
              parRectangle.width   = 3.6;                          //  
              parRectangle.style   = 1;                            //  
              parRectangle.pCorner = CreateArray( CORNER_ARR, 0 ); //      ( ) 
              ksRectangle( &parRectangle, 0 ); //  
              //     
              sketchDefinition7->EndEdit();
            }
          }
          pDefinitionSketch7->Release(); //  , AddRef   
        }
      }
      pDefinitionPlaneOffset7->Release(); //  , AddRef   
    }
  } 

  //     
  IUEnv <IEntity> entityCutLoft( part->NewEntity( o3d_cutLoft ) );
  if ( entityCutLoft ) 
  {
    LPUNKNOWN pDefinitionCutLoft = entityCutLoft->GetDefinition();   
    if ( pDefinitionCutLoft ) 
    {
      IUPTR( CutLoftDefinition ) cutLoftDefinition( pDefinitionCutLoft );
      if ( cutLoftDefinition ) 
      {
        IUPTR( EntityCollection ) entityCollection( cutLoftDefinition->Sketchs() );
        if ( entityCollection ) 
        {
          entityCollection->Add( entitySketch6.GetI() );
          entityCollection->Add( entitySketch7.GetI() );
        }
        
        //    
        cutLoftDefinition->SetThinParam( true,     //   
                                         dtNormal, //    
                                         3,        //     
                                         0 );      //     
        //  
        BSTR name = SysAllocString( L" " );
        entityCutLoft->SetName( name ); //     
        //  
        SysFreeString( name ); 
        //       
        entityCutLoft->SetAdvancedColor( 1234, // 
                                         .8,   //  
                                         .8,   // 
                                         .8,   // 
                                         .8,   // 
                                          1,   // 
                                         .8 ); // 

        // C    
        entityCutLoft->Create(); 
        Message( "   " );                       
      }
      pDefinitionCutLoft->Release(); //  , AddRef   
    }
  }  
}