//

#include "stdafx.h"
#include "step3D1.h"
#include <ldefin2d.h>
#include <ldefin3d.h>

#ifdef __LIGHT_VERSION__
#include <klAPI5.h>
#else
#include <kAPI5.h>
#endif

#include <ksConstants.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

ksPart part(0);
//
//	Note!
//
//		If this DLL is dynamically linked against the MFC
//		DLLs, any functions exported from this DLL which
//		call into MFC must have the AFX_MANAGE_STATE macro
//		added at the very beginning of the function.
//
//		For example:
//
//		extern "C" BOOL PASCAL EXPORT ExportedFunction()
//		{
//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
//			// normal function body here
//		}
//
//		It is very important that this macro appear in each
//		function, prior to any calls into MFC.  This means that
//		it must appear as the first statement within the 
//		function, even before any object variable declarations
//		as their constructors may generate calls into the MFC
//		DLL.
//
//		Please see MFC Technical Notes 33 and 58 for additional
//		details.
//

/////////////////////////////////////////////////////////////////////////////
// CStep3D1App

BEGIN_MESSAGE_MAP(CStep3D1App, CWinApp)
	//{{AFX_MSG_MAP(CStep3D1App)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CStep3D1App construction

CStep3D1App::CStep3D1App()
{
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CStep3D1App object

CStep3D1App theApp;


//-------------------------------------------------------------------------------
//
// ---
unsigned int WINAPI LIBRARYID() {
	return IDS_LIBID;
}


//-------------------------------------------------------------------------------
//
// ---
KompasObject kompas( NULL );


void CreateExtrusion( ksDocument3D& doc );
void OperationRotated( ksDocument3D& doc );
void OperationLoft( ksDocument3D& doc );
void CreateFilletAndChamfer( ksDocument3D& doc );
void CreateNextOper( ksDocument3D& doc );

//-------------------------------------------------------------------------------
//
// ---
void GetKompas() {
	if ( !kompas.m_lpDispatch ) {
		CString filename;
		if( ::GetModuleFileName(NULL, filename.GetBuffer(255), 255) ) {
			filename.ReleaseBuffer( 255 );
			CString libname;

      #ifdef __LIGHT_VERSION__
        libname.LoadString( IDS_STRING5 );  //klAPI5.dll
      #else
        libname.LoadString( IDS_STRING4 );  //kAPI5.dll
      #endif
      
			filename.Replace( filename.Right(filename.GetLength() - (filename.ReverseFind('\\') + 1)), 
												libname );

			HINSTANCE hAppAuto = LoadLibrary( filename ); //  kAPI5.dll
			if(  hAppAuto ) {
				typedef LPDISPATCH ( WINAPI *FCreateKompasObject )(); 
				FCreateKompasObject pCreateKompasObject = 
					(FCreateKompasObject)GetProcAddress( hAppAuto, "CreateKompasObject" );	
				if ( pCreateKompasObject ) 
					kompas = pCreateKompasObject();
				FreeLibrary( hAppAuto );
			}
		}
	}
}

//-------------------------------------------------------------------------------
//
// ---
void WINAPI LIBRARYENTRY( unsigned int comm ) {
	//      .exe ,     
	//   dll   define
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	GetKompas();
	if ( kompas.m_lpDispatch ) {
		ksDocument3D doc( kompas.ActiveDocument3D() );
    if ( !doc.m_lpDispatch ) {
               //    3D ,   
      doc = ksDocument3D( kompas.Document3D() );
      if ( doc.Create(false, true) ) {
        doc.SetAuthor("");
        doc.SetComment("3D");
        doc.UpdateDocumentParam() ;
      }
    }
    if ( doc.m_lpDispatch ) {
	    switch ( comm ) {
        case 1  : ::CreateExtrusion( doc );					break; //   
			  case 2  : ::OperationRotated( doc );				break; //  
				case 3  : ::OperationLoft( doc );						break; //   
        case 4  : ::CreateFilletAndChamfer( doc );	break; //    
        case 5  : ::CreateNextOper( doc );	        break; //  : , ,  ,  
      }
			kompas.ksMessageBoxResult();
		}
		else
      kompas.ksError( "3D   " );
	}
}



//-------------------------------------------------------------------------------
//      
// ---
void ClearCurrentSketch( ksDocument2D& sketchEdit ) {
  //                   
  ksIterator iter( kompas.GetIterator() );
	if ( iter.m_lpDispatch ) {
		if ( iter.ksCreateIterator(ALL_OBJ, 0) ) {
			reference ref;
			if ( ref = iter.ksMoveIterator("F") ) { //       
				//              
        do {
          if ( sketchEdit.ksExistObj(ref) )
						sketchEdit.ksDeleteObj( ref );      //      
        } while ( ref = iter.ksMoveIterator("N") ); 
			}

			iter.ksDeleteIterator(); //  
		}
	}
}



//-------------------------------------------------------------------------------
//  ,   
// ---
void CreateExtrusion( ksDocument3D& doc ) {
	part = doc.GetPart( pTop_Part ); //  
	if ( part.m_lpDispatch ) {
    ksEntity entitySketch( part.NewEntity(o3d_sketch) );
		if ( entitySketch.m_lpDispatch ) {
			//   
			ksSketchDefinition sketchDef( entitySketch.GetDefinition() );
			if ( sketchDef.m_lpDispatch ) {
				//     XOY
				ksEntity basePlane( part.GetDefaultEntity(o3d_planeXOY) );
				sketchDef.SetPlane( basePlane ); //   XOY   
  			sketchDef.SetAngle( 45 );        //   
				entitySketch.Create();           //  

				//   
				ksDocument2D sketchEdit( sketchDef.BeginEdit() );
          //    - 
					sketchEdit.ksLineSeg(  50,  50, -50,  50, 1 );
					sketchEdit.ksLineSeg(  50, -50, -50, -50, 1 );

					sketchEdit.ksLineSeg(  50, -50,  50,  50, 1 );
					sketchEdit.ksLineSeg( -50, -50, -50,  50, 1 );
				sketchDef.EndEdit();                   //   

				ksEntity entityExtr( part.NewEntity(o3d_baseExtrusion) );
				if ( entityExtr.m_lpDispatch ) {
					//     
					ksBaseExtrusionDefinition extrusionDef( entityExtr.GetDefinition() ); //    
					if ( extrusionDef.m_lpDispatch ) {
						extrusionDef.SetDirectionType( dtNormal );         //  
						extrusionDef.SetSideParam( true,    //  
				                               etBlind, //   
																			 200, 0, false );
						extrusionDef.SetThinParam( true, dtBoth, 10, 10 ); //     
						extrusionDef.SetSketch( entitySketch ); //   
						entityExtr.Create();                    //  

					  kompas.ksMessage( "   " );

						extrusionDef.SetSideParam( false,   //  
				                               etBlind, //   
																			 150, 0, false );
					  extrusionDef.SetDirectionType( dtBoth ); //   dtBoth -   
						entityExtr.Update(); //  

						kompas.ksMessage( " " );

						//   
						sketchEdit.AttachDispatch( sketchDef.BeginEdit() );

							//         
							ClearCurrentSketch( sketchEdit );
							//    
       				sketchEdit.ksCircle( 0, 0, 100, 1 );

						sketchDef.EndEdit();   //   
						entitySketch.Update(); //   
						entityExtr.Update();   //    

						kompas.ksMessage( " " );

						//   
						ksEntity entitySketch2( part.NewEntity(o3d_sketch) );
						if ( entitySketch2.m_lpDispatch ) {
							//   
							ksSketchDefinition sketchDef2( entitySketch2.GetDefinition() );
							if ( sketchDef2.m_lpDispatch ) {
								sketchDef2.SetPlane( basePlane ); //  
								sketchDef2.SetAngle( 45 );        //    45 .
								entitySketch2.Create();           //  

								//   
								ksDocument2D sketchEdit2( sketchDef2.BeginEdit() );
									sketchEdit2.ksCircle( 0, 0, 150, 1 );
								sketchDef2.EndEdit(); //   

								//  
								ksEntity entityBossExtr( part.NewEntity(o3d_bossExtrusion) );
								if ( entityBossExtr.m_lpDispatch ) {
									ksBossExtrusionDefinition bossExtrDef( entityBossExtr.GetDefinition() );
									if ( bossExtrDef.m_lpDispatch ) {
										ksExtrusionParam extrProp( bossExtrDef.ExtrusionParam() ); //    
										ksThinParam      thinProp( bossExtrDef.ThinParam() );      //     
										if ( extrProp.m_lpDispatch && thinProp.m_lpDispatch ) {
											bossExtrDef.SetSketch( entitySketch2 ); //   

											extrProp.SetDirection( dtNormal );      //   ()
											extrProp.SetTypeNormal( etBlind );      //   (    )
											extrProp.SetDepthNormal( 100 );         //  

											thinProp.SetThin( false );              //   

											entityBossExtr.Create();                //  
										}
									}
								}

								//   
								ksEntity entitySketch3( part.NewEntity(o3d_sketch) );
								if ( entitySketch3.m_lpDispatch ) {
									//   
									ksSketchDefinition sketchDef3( entitySketch3.GetDefinition() );
									if ( sketchDef3.m_lpDispatch ) {
										sketchDef3.SetPlane( basePlane ); //  
										sketchDef3.SetAngle( 45 );        //    45 .
										entitySketch3.Create();           //  

										//   
										ksDocument2D sketchEdit3( sketchDef3.BeginEdit() );
											//    - 
											sketchEdit3.ksLineSeg(  50,  50, -50,  50, 1 );
  										sketchEdit3.ksLineSeg(  50, -50, -50, -50, 1 );
											sketchEdit3.ksLineSeg(  50, -50,  50,  50, 1 );
											sketchEdit3.ksLineSeg( -50, -50, -50,  50, 1 );
										sketchDef3.EndEdit(); //   

										//  
										ksEntity entityCutExtr( part.NewEntity(o3d_cutExtrusion) );
										if ( entityCutExtr.m_lpDispatch ) {
											ksCutExtrusionDefinition cutExtrDef( entityCutExtr.GetDefinition() );
											if ( cutExtrDef.m_lpDispatch ) {
												cutExtrDef.SetSketch( entitySketch3 ); //   
												cutExtrDef.SetDirectionType( dtReverse ); // 
  											cutExtrDef.SetSideParam( false,                etBlind, 50, 0, false );
												cutExtrDef.SetThinParam( false, 0, 0, 0 );
											}

											entityCutExtr.Create(); //    
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
}


//-------------------------------------------------------------------------------
//    
// ---
void CreateFilletAndChamfer( ksDocument3D& doc ) {
	ksPart part( doc.GetPart(pTop_Part) ); //  
	if ( part.m_lpDispatch ) {
    ksEntity entitySketch( part.NewEntity(o3d_sketch) );
		if ( entitySketch.m_lpDispatch ) {
			//   
			ksSketchDefinition sketchDef( entitySketch.GetDefinition() );
			if ( sketchDef.m_lpDispatch ) {
				//     XOY
				ksEntity basePlane( part.GetDefaultEntity(o3d_planeXOY) );
				sketchDef.SetPlane( basePlane ); //   XOY   
  			sketchDef.SetAngle( 45 );        //   
				entitySketch.Create();           //  

				//   
				ksDocument2D sketchEdit( sketchDef.BeginEdit() );
          //    - 
					sketchEdit.ksLineSeg(  50,  50, -50,  50, 1 );
					sketchEdit.ksLineSeg(  50, -50, -50, -50, 1 );

					sketchEdit.ksLineSeg(  50, -50,  50,  50, 1 );
					sketchEdit.ksLineSeg( -50, -50, -50,  50, 1 );
				sketchDef.EndEdit();             //   

				ksEntity entityExtr( part.NewEntity(o3d_baseExtrusion) );
				if ( entityExtr.m_lpDispatch ) {
					//     
					ksBaseExtrusionDefinition extrusionDef( entityExtr.GetDefinition() ); //    
					if ( extrusionDef.m_lpDispatch ) {
						extrusionDef.SetDirectionType( dtNormal );   //  
						extrusionDef.SetSideParam( true/* */, etBlind/*  */, 100, 0, false );
						extrusionDef.SetThinParam( false, 0, 0, 0 ); //   
						extrusionDef.SetSketch( entitySketch );      //   
						entityExtr.Create();                         //  

            ksEntityCollection collect( part.EntityCollection(o3d_face) );
						if ( collect.m_lpDispatch && collect.SelectByPoint(0, 0, 0) && collect.GetCount() ) {

							kompas.ksMessage( " " );

							ksEntity entityFillet( part.NewEntity(o3d_fillet) );
					 		if ( entityFillet.m_lpDispatch ) {
								ksFilletDefinition filletDef( entityFillet.GetDefinition() );
								if ( filletDef.m_lpDispatch ) {
									filletDef.SetRadius( 10 );      //  
									filletDef.SetTangent( false );  //   
									ksEntityCollection arr( filletDef.array() ); //   
									if ( arr.m_lpDispatch ) {
										for ( int i = 0, count = collect.GetCount(); i < count; i++ )
											arr.Add( collect.GetByIndex(i) );

										entityFillet.Create();
									}
								}
							}
						}

            ksEntityCollection collect2( part.EntityCollection(o3d_face) );
						if ( collect2.m_lpDispatch && collect2.SelectByPoint(0, 0, 100) && collect2.GetCount() ) {

							kompas.ksMessage( " " );
							ksEntity entityChamfer( part.NewEntity(o3d_chamfer) );
					 		if ( entityChamfer.m_lpDispatch ) {
								ksChamferDefinition ChamferDef( entityChamfer.GetDefinition() );
								if ( ChamferDef.m_lpDispatch ) {
									ChamferDef.SetTangent( false );
									ChamferDef.SetChamferParam( true, 10, 10 );
									ksEntityCollection arr( ChamferDef.array() ); //   
									if ( arr.m_lpDispatch ) {
										for ( int i = 0, count = collect2.GetCount(); i < count; i++ )
											arr.Add( collect2.GetByIndex(i) );

										entityChamfer.Create();
									}
								}
							}
						}
					}
				}
			}
		}
	}
}



//-------------------------------------------------------------------------------
//  
// ---
void OperationRotated( ksDocument3D& doc ) {
	ksPart part( doc.GetPart(pTop_Part) ); //  
	if ( part.m_lpDispatch ) {
    ksEntity entitySketch( part.NewEntity(o3d_sketch) );
		if ( entitySketch.m_lpDispatch ) {
			//   
			ksSketchDefinition sketchDef( entitySketch.GetDefinition() );
			if ( sketchDef.m_lpDispatch ) {
				//     XOY
				ksEntity basePlane( part.GetDefaultEntity(o3d_planeXOY) );
				if ( basePlane.m_lpDispatch ) {
					sketchDef.SetPlane( basePlane ); //   XOY   
					entitySketch.Create();           //  

					//   
					ksDocument2D sketchEdit( sketchDef.BeginEdit() );
					if ( sketchEdit.m_lpDispatch ) {
						sketchEdit.ksArcByAngle( 0, 0, 20, -90, 90, 1, 1 );
						sketchEdit.ksLineSeg( 0, -20, 0, 20, 3 );
					  sketchDef.EndEdit();                   //   
					}

					ksEntity entityRotate( part.NewEntity(o3d_baseRotated) );
					if ( entityRotate.m_lpDispatch ) {
						ksBaseRotatedDefinition rotateDef( entityRotate.GetDefinition() ); //    
						if ( rotateDef.m_lpDispatch ) {
     					ksRotatedParam rotproperty( rotateDef.RotatedParam() );
							if ( rotproperty.m_lpDispatch ) {
								rotproperty.SetDirection( dtBoth );
								rotproperty.SetToroidShape(false);
							}

//						rotateDef.SetTorShapeType(false);
//		   			rotateDef.SetDirectionType( dtNormal );       //  
							rotateDef.SetThinParam( true, dtBoth, 1, 1 ); //     
							rotateDef.SetSideParam( true, 180 );
							rotateDef.SetSideParam( false, 180 );
							rotateDef.SetSketch( entitySketch );          //   
							entityRotate.Create();                        //  
						}
					}
				}
			}
		}
		kompas.ksMessage( "  " );

    ksEntity entitySketch2( part.NewEntity(o3d_sketch) );
		if ( entitySketch2.m_lpDispatch ) {
			ksSketchDefinition sketchDef2( entitySketch2.GetDefinition() );
			if ( sketchDef2.m_lpDispatch ) {
				ksEntity basePlane( part.GetDefaultEntity(o3d_planeXOY) );
				if ( basePlane.m_lpDispatch ) {
					sketchDef2.SetPlane( basePlane ); //   XOY   
					entitySketch2.Create();           //  
					//   
					ksDocument2D sketchEdit2( sketchDef2.BeginEdit() );
					if ( sketchEdit2.m_lpDispatch ) {
						sketchEdit2.ksArcByAngle( 15, 0, 10, -90, 90, 1, 1 );
						sketchEdit2.ksLineSeg( 15, -10, 15, 10, 3 );
						sketchDef2.EndEdit();                   //   
					}

					ksEntity entityBossRotate( part.NewEntity(o3d_bossRotated) );
					if ( entityBossRotate.m_lpDispatch ) {
						ksBossRotatedDefinition bossRotateDef( entityBossRotate.GetDefinition() );
						if ( bossRotateDef.m_lpDispatch ) {
							bossRotateDef.SetDirectionType( dtNormal );
							bossRotateDef.SetSideParam( true, 360 );
							bossRotateDef.SetSketch( entitySketch2 );          //   
							entityBossRotate.Create();                        //  
						}
					}
				}
			}
		}
		kompas.ksMessage( "  " );

    ksEntity entitySketch3( part.NewEntity(o3d_sketch) );
		if ( entitySketch3.m_lpDispatch ) {
			ksSketchDefinition sketchDef( entitySketch3.GetDefinition() );
			if ( sketchDef.m_lpDispatch ) {
				ksEntity basePlane( part.GetDefaultEntity(o3d_planeXOY) );
				if ( basePlane.m_lpDispatch ) {
					sketchDef.SetPlane( basePlane ); //   XOY   
					entitySketch3.Create();           //  
					//   
					ksDocument2D sketchEdit3( sketchDef.BeginEdit() );
					if ( sketchEdit3.m_lpDispatch ) {
						sketchEdit3.ksArcByAngle( 20, 0, 20, 90, 270, 1, 1 );
						sketchEdit3.ksLineSeg( 20, -20, 20, 20, 3 );
					  sketchDef.EndEdit();                   //   
					}

					ksEntity entityCutRotate( part.NewEntity(o3d_cutRotated) );
					if ( entityCutRotate.m_lpDispatch ) {
						ksCutRotatedDefinition cutRotateDef( entityCutRotate.GetDefinition() );
						if ( cutRotateDef.m_lpDispatch ) {
							cutRotateDef.SetDirectionType( dtNormal );
							cutRotateDef.SetSideParam( true, 90 );
							cutRotateDef.SetThinParam( true, dtBoth, 5, 7 );   //     
							cutRotateDef.SetSketch( entitySketch3 );        //   
							entityCutRotate.Create();                       //  
						}
					}
				}
			}
		}
		kompas.ksMessage( "  " );
	}
}


//-------------------------------------------------------------------------------
//   
// ---
void OperationLoft( ksDocument3D& doc ) {
	ksPart part( doc.GetPart(pTop_Part) ); //  
	if ( part.m_lpDispatch ) {

		//  
    ksEntity entitySketch( part.NewEntity(o3d_sketch) );
		if ( entitySketch.m_lpDispatch ) {
			ksSketchDefinition sketchDef( entitySketch.GetDefinition() );
			if ( sketchDef.m_lpDispatch ) {
				ksEntity basePlane( part.GetDefaultEntity(o3d_planeXOY) ); //     XOY
				sketchDef.SetPlane( basePlane ); //   XOY   
//				sketchDef.SetPoint( 20, 0 );
				entitySketch.Create();           //  
				entitySketch.SetHidden(false);

				//   
				ksDocument2D sketchEdit( sketchDef.BeginEdit() );
				  if ( sketchEdit.m_lpDispatch )
				    sketchEdit.ksCircle( 0, 0, 4.5, 1 );
/*					ksEllipseParam ellipsPar( kompas.GetParamStruct(ko_EllipseParam) );
					if ( ellipsPar.m_lpDispatch ) {
  					ellipsPar.Init();
						ellipsPar.SetA(20);
						ellipsPar.SetB(10);
						ellipsPar.SetXc(0);
						ellipsPar.SetYc(0);
						ellipsPar.SetStyle(1);
					}
          sketchEdit.ksEllipse(ellipsPar);*/
				sketchDef.EndEdit();                   //   
			}
		}

		//   ,    
		ksEntity entityOffsetPlane( part.NewEntity(o3d_planeOffset) );
		ksEntity entitySketch2( part.NewEntity(o3d_sketch) );
		if ( entityOffsetPlane.m_lpDispatch ) {
			//    
			ksPlaneOffsetDefinition offsetDef( entityOffsetPlane.GetDefinition() );
			if ( offsetDef.m_lpDispatch ) {
				offsetDef.SetOffset( 30 ); //    
				ksEntity basePlane( part.GetDefaultEntity(o3d_planeXOY) );
				basePlane.SetName( " " ); //   

				offsetDef.SetPlane( basePlane ); //  
				entityOffsetPlane.SetName( " " ); //    
				entityOffsetPlane.SetHidden(true);
				entityOffsetPlane.Create();                 //   

				if ( entitySketch2.m_lpDispatch ) {
					ksSketchDefinition sketchDef( entitySketch2.GetDefinition() );
					if ( sketchDef.m_lpDispatch ) {
						sketchDef.SetPlane( entityOffsetPlane ); //   XOY   
//    				sketchDef2.SetPoint( 0, 20 );
						entitySketch2.Create();           //  

						//   
						ksDocument2D sketchEdit( sketchDef.BeginEdit() );
						  sketchEdit.ksCircle( 0, 0, 8, 1 );
						sketchDef.EndEdit();                   //   
					}
				}
			}
		}

		//   ,    
		ksEntity entityOffsetPlane2( part.NewEntity(o3d_planeOffset) );
		ksEntity entitySketch3( part.NewEntity(o3d_sketch) );
		if ( entityOffsetPlane2.m_lpDispatch && entitySketch3.m_lpDispatch ) {
			//    
			ksPlaneOffsetDefinition offsetDef( entityOffsetPlane2.GetDefinition() );
			if ( offsetDef.m_lpDispatch ) {
				offsetDef.SetOffset( 60 ); //    
				ksEntity basePlane( part.GetDefaultEntity(o3d_planeXOY) );
				basePlane.SetName( " " ); //   
        
				offsetDef.SetPlane( basePlane ); //  
				entityOffsetPlane2.SetName( " 2" ); //    
				entityOffsetPlane2.SetHidden(true);
				entityOffsetPlane2.Create();                 //    

				ksSketchDefinition sketchDef( entitySketch3.GetDefinition() );
				if ( sketchDef.m_lpDispatch ) {
					sketchDef.SetPlane( entityOffsetPlane2 ); //   XOY   
//    				sketchDef2.SetPoint( -20, 0 );
					entitySketch3.Create();           //  

					//   
					ksDocument2D sketchEdit( sketchDef.BeginEdit() ); 
						sketchEdit.ksCircle( 0, 0, 1.5, 1 );
					sketchDef.EndEdit();                   //                   
				}
			}
		}

		//     
		ksEntity entityBaseLoft( part.NewEntity(o3d_baseLoft) ); 
		if ( entityBaseLoft.m_lpDispatch ) {
			ksBaseLoftDefinition baseLoft( entityBaseLoft.GetDefinition() );
			if ( baseLoft.m_lpDispatch ) {
				ksEntityCollection entCol( baseLoft.Sketchs() );
				if ( entCol.m_lpDispatch ) {
          entCol.Add(entitySketch);
          entCol.Add(entitySketch2);
          entCol.Add(entitySketch3);
				}
				entityBaseLoft.SetName("");
				entityBaseLoft.SetAdvancedColor( 12345678, .8, .8, .8, .8, 1, .8 );
//				baseLoft.SetThinParam( true, dtBoth, 1, 1 ); //     

				entityBaseLoft.Create();                        //  
			}
		}
		kompas.ksMessage( "   " );

		//   ,    
		ksEntity entitySketch7( part.NewEntity(o3d_sketch) );
		if ( entitySketch7.m_lpDispatch ) {
			//    
			ksSketchDefinition sketchDef( entitySketch7.GetDefinition() );
			if ( sketchDef.m_lpDispatch ) {
				sketchDef.SetPlane( entityOffsetPlane2 ); //   XOY   
				entitySketch7.Create();           //  

				//   
				ksDocument2D sketchEdit( sketchDef.BeginEdit() ); 
					sketchEdit.ksCircle( 0, 0, 1.5, 1 );
				sketchDef.EndEdit();                   //                   
			}
		}

		//   ,    
		ksEntity entityOffsetPlane3( part.NewEntity(o3d_planeOffset) );
		ksEntity entitySketch4( part.NewEntity(o3d_sketch) );
		if ( entityOffsetPlane3.m_lpDispatch && entitySketch4.m_lpDispatch ) {
			//    
			ksPlaneOffsetDefinition offsetDef( entityOffsetPlane3.GetDefinition() );
			if ( offsetDef.m_lpDispatch ) {
				offsetDef.SetOffset( 120 ); //    
				ksEntity basePlane( part.GetDefaultEntity(o3d_planeXOY) );
				basePlane.SetName( " " ); //   
        
				offsetDef.SetPlane( basePlane ); //  
				entityOffsetPlane3.SetName( " " ); //    
				entityOffsetPlane3.SetHidden(true);
				entityOffsetPlane3.Create();                 //    

				ksSketchDefinition sketchDef( entitySketch4.GetDefinition() );
				if ( sketchDef.m_lpDispatch ) {
					sketchDef.SetPlane( entityOffsetPlane3 ); //   XOY   
//    				sketchDef.SetPoint( -20, 0 );
					entitySketch4.Create();           //  

					//   
					ksDocument2D sketchEdit( sketchDef.BeginEdit() ); 
						sketchEdit.ksCircle( 0, 0, 1.8, 1 );
					sketchDef.EndEdit();                   //                   
				}
			}
		}


		//     
		ksEntity entityBossLoft( part.NewEntity(o3d_bossLoft) ); 
		if ( entityBossLoft.m_lpDispatch ) {
			ksBossLoftDefinition bossLoft( entityBossLoft.GetDefinition() );
			if ( bossLoft.m_lpDispatch ) {
				ksEntityCollection entCol( bossLoft.Sketchs() );
				if ( entCol.m_lpDispatch ) {
          entCol.Add(entitySketch7);
          entCol.Add(entitySketch4);
				}
				entityBossLoft.SetName("");
				entityBossLoft.SetAdvancedColor( 1234567890, .8, .8, .8, .8, 1, .8 );

				entityBossLoft.Create();                        //  
			}
		}
		kompas.ksMessage( "   " );

		//       
		ksEntity entitySketch5( part.NewEntity(o3d_sketch) );
		if ( entitySketch5.m_lpDispatch ) {
			ksSketchDefinition sketchDef( entitySketch5.GetDefinition() );
			if ( sketchDef.m_lpDispatch ) {
				sketchDef.SetPlane( entityOffsetPlane3 ); //   XOY   
				entitySketch5.Create();           //  

				//   
				ksDocument2D sketchEdit( sketchDef.BeginEdit() ); 
					ksRectangleParam recPar( kompas.GetParamStruct(ko_RectangleParam) );
					recPar.Init();
					if ( recPar.m_lpDispatch ) {
						recPar.SetX(-1.8);
						recPar.SetY(-.4);
						recPar.SetHeight(.8);
						recPar.SetWidth(3.6);
						recPar.SetStyle(1);
					}
          sketchEdit.ksRectangle( recPar, 0 ); 
				sketchDef.EndEdit();                   //                   
			}
		}

		//   ,    
		ksEntity entityOffsetPlane4( part.NewEntity(o3d_planeOffset) );
		ksEntity entitySketch6( part.NewEntity(o3d_sketch) );
		if ( entityOffsetPlane4.m_lpDispatch && entitySketch6.m_lpDispatch ) {
			//    
			ksPlaneOffsetDefinition offsetDef( entityOffsetPlane4.GetDefinition() );
			if ( offsetDef.m_lpDispatch ) {
				offsetDef.SetOffset( 110 ); //    
				ksEntity basePlane( part.GetDefaultEntity(o3d_planeXOY) );
				basePlane.SetName( " " ); //   
        
				offsetDef.SetPlane( basePlane ); //  
				entityOffsetPlane4.SetName( " " ); //    
				entityOffsetPlane4.SetHidden(true);
				entityOffsetPlane4.Create();                 //    

				ksSketchDefinition sketchDef( entitySketch6.GetDefinition() );
				if ( sketchDef.m_lpDispatch ) {
					sketchDef.SetPlane( entityOffsetPlane4 ); //   XOY   
//    				sketchDef.SetPoint( -20, 0 );
					entitySketch6.Create();           //  

					//   
					ksDocument2D sketchEdit( sketchDef.BeginEdit() ); 
						ksRectangleParam recPar( kompas.GetParamStruct(ko_RectangleParam) );
						recPar.Init();
						if ( recPar.m_lpDispatch ) {
							recPar.SetX(-1.8);
							recPar.SetY(-1.8);
							recPar.SetHeight(3.6);
							recPar.SetWidth(3.6);
							recPar.SetStyle(1);
						}
						sketchEdit.ksRectangle( recPar, 0 ); 
					sketchDef.EndEdit();                   //                   
				}
			}
		}


		//     
		ksEntity entityCutLoft( part.NewEntity(o3d_cutLoft) ); 
		if ( entityCutLoft.m_lpDispatch ) {
			ksCutLoftDefinition cutLoft( entityCutLoft.GetDefinition() );
			if ( cutLoft.m_lpDispatch ) {
				ksEntityCollection entCol( cutLoft.Sketchs() );
				if ( entCol.m_lpDispatch ) {
          entCol.Add(entitySketch5);
          entCol.Add(entitySketch6);
				}

				cutLoft.SetThinParam( true, dtNormal, 3, 0 );
				entityCutLoft.SetName(" ");
				entityCutLoft.SetAdvancedColor( 1234, .8, .8, .8, .8, 1, .8 );

				entityCutLoft.Create();                        //  
			}
		}

		kompas.ksMessage( "   " );		
	}
}


//-----------------------------------------------------------------------------------
//  : , ,  ,  
//---
void CreateNextOper( ksDocument3D& doc )
{
  //   
  ksPart part( doc.GetPart(pTop_Part) );                       
  if ( part.m_lpDispatch ) {
		//     
    ksEntity entitySketch( part.NewEntity(o3d_sketch) );
		if ( entitySketch.m_lpDispatch ) {
			//    
			ksSketchDefinition sketchDef( entitySketch.GetDefinition() );
			if ( sketchDef.m_lpDispatch ) {
				//     XOY
				ksEntity basePlane( part.GetDefaultEntity(o3d_planeXOY) );
				sketchDef.SetPlane( basePlane );    //   XOY   
  			sketchDef.SetAngle( 0 );            //   
				entitySketch.Create();              //  

				//   
				ksDocument2D sketchEdit( sketchDef.BeginEdit() ); 
					//    - 
					sketchEdit.ksLineSeg(  50,  50, -50,  50, 1 );
					sketchEdit.ksLineSeg(  50, -50, -50, -50, 1 ); 
					sketchEdit.ksLineSeg(  50, -50,  50,  50, 1 );
					sketchEdit.ksLineSeg( -50, -50, -50,  50, 1 );
				sketchDef.EndEdit();                   //                   

				kompas.ksMessage( "  " );
				//   
				ksEntity entityExtr( part.NewEntity(o3d_baseExtrusion) );
				if ( entityExtr.m_lpDispatch ) {
					//     
					ksBaseExtrusionDefinition extrusionDef( entityExtr.GetDefinition() ); 
					if ( extrusionDef.m_lpDispatch ) {
						extrusionDef.SetDirectionType( dtNormal );         //  
						extrusionDef.SetSideParam( true/* */, etBlind/*  */, 200, 0, false ); 
						extrusionDef.SetThinParam( true, dtBoth, 10, 10 ); //     
						extrusionDef.SetSketch( entitySketch );            //   
						entityExtr.Create();                               //  
					}

          bool update = false;                                 //  update = true,     
          if ( MessageBox( ::GetActiveWindow(), "  ?", 
               " ", MB_ICONQUESTION | MB_YESNO ) == IDYES ) {
            //   
					  ksEntity entShell( part.NewEntity(o3d_shellOperation) );
					  if ( entShell.m_lpDispatch ) {
						  //     
						  ksShellDefinition incDef( entShell.GetDefinition() );
						  if ( incDef.m_lpDispatch ) {
                ksEntityCollection entCol( incDef.FaceArray() );               //      
                ksEntityCollection collect( part.EntityCollection(o3d_face) ); //   
                if ( entCol.m_lpDispatch && collect.m_lpDispatch ) {
                  incDef.SetThickness( 8 );                      //  
                  incDef.SetThinType( true );                    //   
                  collect.SelectByPoint( 50, 0, 0 );             //         ,    
                  entCol.Add( collect.GetByIndex(0) );           //          = 0 
                  collect.refresh();                             //  
                  entShell.Create();                    				 //  

                  if ( MessageBox( ::GetActiveWindow(), "   ?", 
                    " ", MB_ICONQUESTION | MB_YESNO ) == IDYES ) {

                    incDef.SetThickness( 25 );                   //  
                    incDef.SetThinType( false );                 //   
                    collect.SelectByPoint( 60, 0, 10 );          //         ,    
                    entCol.Add( collect.GetByIndex(0) );         //          = 0 
                    collect.refresh();                           //  
                    entShell.Update();                           //  
                    update = true;
                  }
                }
              }
            }
          }

          if ( MessageBox( ::GetActiveWindow(), "  ?", 
               " ", MB_ICONQUESTION | MB_YESNO ) == IDYES ) {
            //   
            ksEntity entInc( part.NewEntity(o3d_incline) );
      			if ( entInc.m_lpDispatch ) {
							//     
							ksInclineDefinition incDef( entInc.GetDefinition() );
              ksEntityCollection collect( part.EntityCollection(o3d_face) ); //   
							if ( incDef.m_lpDispatch && collect.m_lpDispatch ) {
							  incDef.SetDirection( true );                         //   -   
                incDef.SetAngle( 3 );                                //    
								incDef.SetPlane( basePlane );                        //    
                ksEntityCollection entColInc( incDef.FaceArray() );  //      
                if ( entColInc.m_lpDispatch ) {
                  collect.SelectByPoint( 0, update ? 85 : 60, 10 );  //         ,    
                  entColInc.Add( collect.GetByIndex(0) );            //          = 0 
                  collect.refresh();                                 //  
                  entInc.Create();                    				       //  

                  if ( MessageBox( ::GetActiveWindow(), "   ?", 
                    " ", MB_ICONQUESTION | MB_YESNO ) == IDYES ) {
    								incDef.SetDirection( false );                        //   - 
		    						incDef.SetAngle( 25 );                               //    
                    collect.SelectByPoint( 0, update ? -85 : -60, 10 );  //         ,    
                    entColInc.Add( collect.GetByIndex(0) );              //          = 0 
                    collect.refresh();                                   //  
                    entInc.Update();
                  }
                }
              }
            }
          }

          if ( MessageBox( ::GetActiveWindow(), "   ?", 
               " ", MB_ICONQUESTION | MB_YESNO ) == IDYES ) {
            //    
            ksEntity entityOpr( part.NewEntity(o3d_cutByPlane) );
            if ( entityOpr.m_lpDispatch ) {
              //     
              ksCutByPlaneDefinition incOpr( entityOpr.GetDefinition() ); //  
              if ( incOpr.m_lpDispatch ) {
       		      //     XOZ,     
  	    			  ksEntity basePlaneXOZ( part.GetDefaultEntity(o3d_planeXOZ) );
                incOpr.SetPlane( basePlaneXOZ );               //   
                incOpr.SetDirection( false );                  //   - 
                entityOpr.Create();                    				 //  

                if ( MessageBox( ::GetActiveWindow(), "    ?", 
                  " ", MB_ICONQUESTION | MB_YESNO ) == IDYES ) {
                  incOpr.SetDirection( true );                 //   - 
                  entityOpr.Update();                  				 //  
                }
              }
            }
          }

          if ( MessageBox( ::GetActiveWindow(), "   ?", 
               " ", MB_ICONQUESTION | MB_YESNO ) == IDYES ) {
            //      
            ksEntity entitySketch2( part.NewEntity(o3d_sketch) );  
            if ( entitySketch2.m_lpDispatch ) {
              //   
      		    ksSketchDefinition sketchDef2( entitySketch2.GetDefinition() );
              if ( sketchDef2.m_lpDispatch ) {
       		      //     YOZ
  	    			  ksEntity basePlaneYOZ( part.GetDefaultEntity(o3d_planeYOZ) );
                sketchDef2.SetPlane( basePlaneYOZ ); //   yoz   
                sketchDef2.SetAngle( 45 );     			 //   
                entitySketch2.Create();    	  			 //  

                //   
      		      ksDocument2D sketchEdit2( sketchDef2.BeginEdit() ); 
                //   
                sketchEdit2.ksArcBy3Points( -200, 45, -150, 10, -50, 10, 1 );
                sketchEdit2.ksLineSeg     ( -200, 45, -300, 20, 1 );
                sketchEdit2.ksLineSeg     (  -50, 10,   60, 10, 1 );
                sketchDef2.EndEdit();                   //   
              
                //    
                ksEntity entityOpr( part.NewEntity(o3d_cutBySketch) );
                if ( entityOpr.m_lpDispatch ) {
                  //    
                  ksCutBySketchDefinition incOpr( entityOpr.GetDefinition() ); 
                  if ( incOpr.m_lpDispatch ) {
                    incOpr.SetSketch( entitySketch2 );             //  
                    incOpr.SetDirection( true );                   //   
                    entityOpr.Create();                    				 //  
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
