//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <windows.h>
#include <stdio.h>

#include <ldefin2d.h>
#include <ksConstants.h>

#ifdef __LIGHT_VERSION__
#include <Kl_TLB.h>
#else
#include <Ks_TLB.h>
#endif
//---------------------------------------------------------------------------
//   Important note about DLL memory management when your DLL uses the
//   static version of the RunTime Library:
//
//   If your DLL exports any functions that pass String objects (or structs/
//   classes containing nested Strings) as parameter or function results,
//   you will need to add the library MEMMGR.LIB to both the DLL project and
//   any other projects that use the DLL.  You will also need to use MEMMGR.LIB
//   if any other projects which use the DLL will be performing new or delete
//   operations on any non-TObject-derived classes which are exported from the
//   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
//   EXE's to use the BORLNDMM.DLL as their memory manager.  In these cases,
//   the file BORLNDMM.DLL should be deployed along with your DLL.
//
//   To avoid using BORLNDMM.DLL, pass string information using "char *" or
//   ShortString parameters.
//
//   If your DLL uses the dynamic version of the RTL, you do not need to
//   explicitly add MEMMGR.LIB as this will be done implicitly for you
//---------------------------------------------------------------------------

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}

//------------------------------------------------------------------------------
//
// ---
extern "C" IDispatch* far __export WINAPI CreateKompasObject();


extern "C" unsigned int far __export __pascal LibraryId(){
	return 100;
}

KompasObject* kompas = NULL;

reference pKeep;

void DrawLayer();
void DrawView();
void DrawGroup();
void DrawLineSeg();
void DrawArc();
void DrawLine();
void DrawPoint();
void DrawCircle();
void DrawBezier();
void DrawHatch();
void DrawText();
void WorkDocument();
void WorkNameGroup();

extern "C" void far __export __pascal  LibraryEntry( UINT Comm ){
  kompas = (KompasObject*)::CreateKompasObject();
  if ( kompas ) {
    switch ( Comm ) {
    case 1: //  
    	WorkDocument();
    	break;
    case 2: // 
    	DrawView();
    	break;
    case 3: // 
    	DrawLayer();
    	break;
    case 4: // 
    	DrawGroup();
    	break;
    case 5: //  
    	WorkNameGroup();
    	break;
    case 6: // 
      DrawLineSeg();
      break;
    case 7: // 
      DrawArc();
      break;
    case 8: // 
      DrawLine();
      break;
    case 9: // 
      DrawCircle();
      break;
    case 10: // 
      DrawPoint();
      break;
    case 11: // Bezier-
      DrawBezier();
      break;
    case 12: // 
      DrawHatch();
      break;
    case 13: // 
      DrawText();
      break;
    }
    kompas->Release();
  }
}


//------------------------------------------------------------------------------
//  
// ---
void DrawLayer() {
  ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
  if ( doc ) {
    long n;
    char buf [128];
    if ( !kompas->ksReadInt(StringToOleStr("  "), 1, 0, 255, &n) )
      return;


    //  ,   
    reference lay = doc->ksLayer( n );
    doc->ksMtr( 20, 15, 0, 1, 1 );
    doc->ksLineSeg( -10, 0, 10, 0, 1 );
    doc->ksLineSeg( 10, 0, 10, 20, 1 );
    doc->ksLineSeg( 10, 20,  -10, 20, 1 );
    doc->ksLineSeg( -10, 20,  -10, 0, 1 );
    doc->ksDeleteMtr();

    //  
    doc->ksLightObj( lay, 1 );

    //         
    int n1 = doc->ksGetLayerNumber( lay );
    reference l = doc->ksGetLayerReference ( n1 );
    ::sprintf( buf, "n = %d n1 = %d layer = %ld l = %ld", n, n1, lay, l );
    kompas->ksMessage( StringToOleStr(buf) );

    //      
    ksLayerParam* par  = (ksLayerParam*)kompas->GetParamStruct( ko_LayerParam );
    ksLayerParam* par1 = (ksLayerParam*)kompas->GetParamStruct( ko_LayerParam );
    if ( par && par1 ) {
      par->color = RGB( 0, 255, 0 );
      par->state = stACTIVE;
      par->name  = StringToOleStr( "" );
      doc->ksLayer( 0 );

      if ( !doc->ksSetObjParam( l, par, ALLPARAM) )
        kompas->ksMessageBoxResult();
      else {
        doc->ksGetObjParam( l, par1, ALLPARAM );
        sprintf( buf, " col = %ld col1 = %ld name = %s name1 = %s", par->color,
                 par1->color, WideCharToString(par->name), WideCharToString(par1->name) );
        kompas->ksMessage( StringToOleStr(buf) );

      }

      doc->ksLightObj( lay, 0 );

      //   
      ksLtVariant* st  = (ksLtVariant*)kompas->GetParamStruct( ko_LtVariant );
      if ( st ) {
        st->intVal = stACTIVE;
        doc->ksSetObjParam( l, st, VIEW_LAYER_STATE );
      }
    }
  }
}

//------------------------------------------------------------------------------
//  
// ---
void DrawView() {
  ksViewParam* par = (ksViewParam*)kompas->GetParamStruct( ko_ViewParam );
  if ( par ) {
    par->Init();
    par->x = 10;
    par->y = 20;
    par->scale_ = 0.5;
    par->angle = 45;
    par->color = RGB( 10, 20, 10 );
    par->state = stACTIVE;
    par->name = StringToOleStr( "user view" );

    ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
    if ( doc ) {
      reference gr = doc->ksNewGroup( 0 );
        doc->ksLineSeg( 20, 10, 20, 30, 1 );
        doc->ksLineSeg( 20, 30, 40, 30, 1 );
        doc->ksLineSeg( 40, 30, 40, 10, 1 );
        doc->ksLineSeg( 40, 10, 20, 10, 1 );
      doc->ksEndGroup();

      long number = 5;
      //  
      reference v = doc->ksCreateSheetView( par, &number );
      number = doc->ksGetViewNumber(  v );
      char buf[128];
      sprintf( buf, "  ref = %ld, number = %d", v, number );
      kompas->ksMessage( StringToOleStr(buf) );

      doc->ksAddObjGroup( gr, v );
      kompas->ksMessage( StringToOleStr("   ") );
      kompas->ksMessageBoxResult();

      doc->ksRotateObj( gr, 0, 0, -45 );
      //   
      doc->ksGetObjParam( v, par, ALLPARAM );
      sprintf( buf,"x = %4.1f y = %4.1f, angl = %4.1f name = %s st = %d", par->x,
               par->y, par->angle, WideCharToString(par->name), par->state );

      kompas->ksMessage( StringToOleStr(buf) );
      //    (  0 )
      doc->ksOpenView( 0 );


      //   
      ksLtVariant* st  = (ksLtVariant*)kompas->GetParamStruct( ko_LtVariant );
      if ( st ) {
        st->intVal = stREADONLY; //     :  
        doc->ksSetObjParam( v, st, VIEW_LAYER_STATE );
      }
    }
  }
}

//------------------------------------------------------------------------------
//   
// ---
void DrawGroup() {
  ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
  if ( doc ) {
    reference p1 = doc->ksLineSeg( 10, 10, 20, 10, 0 );
    reference p2 = doc->ksLineSeg( 10, 10, 10, 20, 0 );

    //      1
    reference gr1 = doc->ksNewGroup( 0 );
    doc->ksEndGroup();

    //      2
    reference gr2 = doc->ksNewGroup( 0 );
    doc->ksEndGroup();

    doc->ksAddObjGroup( gr1, p1 );
    doc->ksAddObjGroup( gr1, p2 );

    doc->ksAddObjGroup( gr2, p1 );
    doc->ksAddObjGroup( gr2, p2 );

    kompas->ksMessage( StringToOleStr(" ") );

    doc->ksMoveObj( gr1, 10, 0 );
    kompas->ksMessage( StringToOleStr("   10 ") );

    doc->ksRotateObj( gr2, 20, 10, 45 );
    kompas->ksMessage( StringToOleStr("   45 ") );

    doc->ksRotateObj( gr2, 20, 10, -45 );
    kompas->ksMessage( StringToOleStr("   -45 ") );

    doc->ksMoveObj( gr1, -10, 0 );
    kompas->ksMessage( StringToOleStr("   -10 ") );

    //   2 (     )
    doc->ksClearGroup( gr2, true );
    //    2
    doc->ksDeleteObj( gr2 );


    kompas->ksMessage( StringToOleStr(" gr") );
    doc->ksLightObj( gr1, 1 );

    kompas->ksMessage( StringToOleStr(" gr") );
    doc->ksLightObj( gr1, 0 );

    kompas->ksMessage( StringToOleStr(" el") );
    doc->ksLightObj(  p1, 1 );
    kompas->ksMessage( StringToOleStr(" el") );
    doc->ksLightObj(  p1, 0 );

    //   1(    )
    doc->ksDeleteObj( gr1 );
    kompas->ksMessageBoxResult();
  }
}

//------------------------------------------------------------------------------
//  
// ---
void DrawLineSeg() {
  ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
  if ( doc ) {
    //    
    doc->ksMtr( 30, 20, 45, 1, 1 );
    reference p = doc->ksLineSeg( 30, 20, 60, 20, 1 );

    //   
    ksLineSegParam* par = (ksLineSegParam*)kompas->GetParamStruct( ko_LineSegParam );
    if ( par ) {
      int t = doc->ksGetObjParam( p, par, ALLPARAM );
      char buf[128];
      sprintf( buf, "t = %d, x1 = %4.1f y1 = %4.1f x2 = %4.1f y2 = %4.1f tl = %d", t,
               par->x1, par->y1, par->x2, par->y2, par->style );

      kompas->ksMessage( StringToOleStr(buf) );
      //   
      par->x2    = 30;
      par->y2    = 60;
      par->style = 2;

      if ( doc->ksSetObjParam(p, par, ALLPARAM) )
        kompas->ksMessage( StringToOleStr(" ") );
      else
        kompas->ksMessageBoxResult();

      //    
      doc->ksDeleteMtr();
    }
  }
}

//------------------------------------------------------------------------------
//  
// ---
void DrawArc() {
  ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
  if ( doc ) {
    //    
    doc->ksMtr( 30, 20, 45, 1, 1 );
    reference p = doc->ksArcByAngle( 30, 20, 20, 45, 135, 1, 1 );
    //      
    ksArcByAngleParam* par = (ksArcByAngleParam*)kompas->GetParamStruct( ko_ArcByAngleParam );
    if ( par ) {
      par->Init();
      int t = doc->ksGetObjParam( p, par, ALLPARAM );
      char buf[128];
      sprintf( buf, "t = %d, xc = %4.1f yc = %4.1f rad = %4.1f \n\n a1 = %4.1f a2 = %4.1f napr = %d tl = %d",
               t, par->xc, par->yc, par->rad, par->ang1, par->ang2, par->dir, par->style );
      kompas->ksMessage( StringToOleStr(buf) );

      //    
      ksArcByPointParam* par1 = (ksArcByPointParam*)kompas->GetParamStruct( ko_ArcByPointParam );
      if ( par1 ) {
        par1->Init();
        par1->xc    = 40;
        par1->yc    = 30;
        par1->rad   = 10;
        par1->dir   = 1;
        par1->style = 2;
        par1->x1    = 50;
        par1->y1    = 30;
        par1->x2    = 40;
        par1->y2    = 20;

        if( doc->ksSetObjParam(p, par1, 1) )
          kompas->ksMessage( StringToOleStr(" ") );
        else
          kompas->ksMessageBoxResult();
      }
    }

    doc->ksDeleteMtr();
  }
}

//------------------------------------------------------------------------------
//   
// ---
void DrawLine() {
  ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
  if ( doc ) {
    //    
    doc->ksMtr( 0, 0, 45, 1, 1 );
    //   
    reference p = doc->ksLine( 30, 20, 0 );

    //    
    ksLineParam* par = (ksLineParam*)kompas->GetParamStruct( ko_LineParam );
    if ( par ) {
      int t = doc->ksGetObjParam( p, par, ALLPARAM );
      char buf[128];
      sprintf( buf, "t = %d, x = %4.1f y = %4.1f alf = %4.1f ", t,
               par->x, par->y, par->angle );
      kompas->ksMessage( StringToOleStr(buf) );

      //    
      par->angle = 90;

      if( doc->ksSetObjParam( p, par, ALLPARAM ) )
        kompas->ksMessage( StringToOleStr(" ") );
      else
        kompas->ksMessageBoxResult();
    }

    doc->ksDeleteMtr();
  }
}

//------------------------------------------------------------------------------
//  
// 0 -,1-,2--,3-,4-,5-,6-,7- 
// ---
void DrawPoint() {
  ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
  if ( doc ) {
    //    
    doc->ksMtr( 10, 10, 0, 1, 1 );
    //  
    reference p = doc->ksPoint( 30, 40, 0 );
    doc->ksPoint( 40, 40, 1 );
    doc->ksPoint( 50, 40, 2 );
    doc->ksPoint( 60, 40, 3 );
    doc->ksPoint( 70, 40, 4 );
    doc->ksPoint( 80, 40, 5 );
    doc->ksPoint( 90, 40, 6 );
    doc->ksPoint( 100, 40, 7 );
    //   
    ksPointParam* par = (ksPointParam*)kompas->GetParamStruct( ko_PointParam );
    if ( par ) {
      int t = doc->ksGetObjParam( p, par, ALLPARAM );
      char buf[128];
      ::sprintf( buf, "t = %d, x = %4.1f y = %4.1f style = %d ", t,
                 par->x, par->y, par->style );
      kompas->ksMessage( StringToOleStr(buf) );

      //   
      par->x = 20;
      par->y = 30;
      par->style = 7;

      if( doc->ksSetObjParam(p, par, ALLPARAM) )
        kompas->ksMessage( StringToOleStr(" ") );
      else
        kompas->ksMessageBoxResult();
    }

    doc->ksDeleteMtr();
  }
}

//------------------------------------------------------------------------------
//  
// ---
void DrawCircle() {
  ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
  if ( doc ) {
    //    
    doc->ksMtr( 0, 0, 0, 2, 2 );
    char buf [128];
    //  
    reference p = doc->ksCircle( 30, 20, 10, 1 );

    //   
    ksCircleParam* par = (ksCircleParam*)kompas->GetParamStruct( ko_CircleParam );
    if ( par ) {
      int t = doc->ksGetObjParam( p, par, ALLPARAM );
      sprintf( buf, " t = %d, xc = %4.1f yc = %4.1f rad = %4.1f tl = %d ",t,
               par->xc, par->yc, par->rad, par->style );
      kompas->ksMessage( StringToOleStr(buf) );

      //   
      par->rad = 20;
      par->style = 2;
      if( doc->ksSetObjParam(p, par, ALLPARAM) )
        kompas->ksMessage( StringToOleStr(" ") );
      else
        kompas->ksMessageBoxResult();
    }

    doc->ksDeleteMtr();
  }
}

//------------------------------------------------------------------------------
//  Bezier 
// ---
void DrawBezier() {
  ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
  if ( doc ) {
    double x[] = { 0, 20, 50, 70, 100, 50 };
    double y[] = { 0, 20, 10, 20, 0,  -50 };

    //  Bezier 
    doc->ksBezier( 0, 1 );
    for ( int i = 0; i < 5; i++ )
      doc->ksPoint( x[i], y[i], 0 );

    reference p = doc->ksEndObj();
    //   Bezier 

    ksMathPointParam* pPar = (ksMathPointParam*)kompas->GetParamStruct( ko_MathPointParam );
    ksBezierParam*    par  = (ksBezierParam*)kompas->GetParamStruct( ko_BezierParam );
    ksDynamicArray*   arr  = (ksDynamicArray*)kompas->GetDynamicArray( POINT_ARR );
    if ( pPar && par && arr ) {
      par->SetMathPointArr( arr );
      int t = doc->ksGetObjParam( p, par, ALLPARAM );
      int count = arr->ksGetArrayCount();
      char buf[128];
      ::sprintf( buf, " t = %d, count = %d close = %d tl = %d ", t, count, par->closed, par->style );
      kompas->ksMessage( StringToOleStr(buf) );
      for ( int i = 0; i < count; i++ ) {
        arr->ksGetArrayItem( i,/*  */ pPar/* */ );
        ::sprintf( buf, "x[%d] = %4.1f y[%d] = %4.1f", i, pPar->x, i, pPar->y );
        kompas->ksMessage( StringToOleStr(buf) );
      }

      //   Bezier 
      arr->ksClearArray();
      //   
      for ( int i = 0; i < 6; i++ ) {
        pPar->x = x[i];
        pPar->y = y[i];
        arr->ksAddArrayItem( -1,/*   -  */ pPar/*   */ );
      }

      par->style = 2;
      par->closed = 1;

      if ( doc->ksSetObjParam(p, par, ALLPARAM) )
        kompas->ksMessage( StringToOleStr(" ") );
      else
	kompas->ksMessageBoxResult();

      arr->ksDeleteArray();
    }
  }
}

//------------------------------------------------------------------------------
//  
// ---
void DrawHatch() {
  ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
  if ( doc ) {
    doc->ksMtr( 30, 20, 0, 0.5, 0.5 );
    //   
    doc->ksLineSeg( 20, 30, 70, 30, 2 );
    doc->ksLineSeg( 70, 30, 70, 80, 2 );
    doc->ksLineSeg( 70, 80, 20, 80, 2 );
    doc->ksLineSeg( 20, 80, 20, 30, 2 );
    reference p;
    if ( doc->ksHatch(0, 45, 2, 0, 0, 0) ) {
      doc->ksLineSeg( 20, 30, 70, 30, 2 );
      doc->ksLineSeg( 70, 30, 70, 80, 2 );
      doc->ksLineSeg( 70, 80, 20, 80, 2 );
      doc->ksLineSeg( 20, 80, 20, 30, 2 );
      p = doc->ksEndObj();
    }

    //   
    ksHatchParam* par = (ksHatchParam*)kompas->GetParamStruct( ko_HatchParam );
    if ( par ) {
      int t = doc->ksGetObjParam( p, par, ALLPARAM );
      char buf[128];
      sprintf( buf, " t = %d, tip = %d angl = %4.1f shag = %4.1f \n\n width = %4.1f x0 = %4.1f y0 = %4.1f ",
               t, par->style, par->ang, par->step, par->width, par->x, par->y );
      kompas->ksMessage( StringToOleStr(buf) );
    }

    doc->ksDeleteMtr();
    doc->ksMtr( 0, 0, 0, 2, 2 );
    //   
    par->x = 0.8;

    if( doc->ksSetObjParam(p, par, ALLPARAM) )
      kompas->ksMessage( StringToOleStr(" ") );
    else
      kompas->ksMessageBoxResult();

    doc->ksDeleteMtr();
  }
}

//------------------------------------------------------------------------------
//
// ---
static void PrintPar1( ksTextLineParam* par ) {
  char buf[128];
  ::sprintf( buf, "style = %d", par->style );
  kompas->ksMessage( StringToOleStr(buf) );
  ksDynamicArray* arr = (ksDynamicArray*)par->GetTextItemArr();
  ksTextItemParam* itemPar = (ksTextItemParam*)kompas->GetParamStruct( ko_TextItemParam );;
  if ( arr && itemPar ) {
    for ( int j = 0; j < arr->ksGetArrayCount(); j++ ) {
      arr->ksGetArrayItem( j, itemPar );
      ksTextItemFont* font = (ksTextItemFont*)itemPar->GetItemFont();
      if ( font ) {
        sprintf( buf, "j = %d h = %5.1f  s = %s \n fontName = %s ", j, font->height, WideCharToString(itemPar->s),
                 WideCharToString(font->fontName) );
        kompas->ksMessage( StringToOleStr(buf) );
      }
    }
  }

  kompas->ksMessageBoxResult();
}

//------------------------------------------------------------------------------
//
// ---
void DrawText() {
  ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
  ksParagraphParam* par = (ksParagraphParam*)kompas->GetParamStruct( ko_ParagraphParam );
  if ( doc && par ) {

  ksTextStyleParam* textStPar = (ksTextStyleParam*)kompas->GetParamStruct(ko_TextStyleParam);
//  int CurrentStyle;
  if ( textStPar ) {
    //       
    doc->ksGetStyleParam(1, 0, textStPar);
    textStPar->name = StringToOleStr("Text" + (AnsiString)(100));
    textStPar->height = 20;
    textStPar->step = 15;
    textStPar->posKS = 0.;
//    textStPar->align = ksLEFT;
    //    
    // .2       
    /*CurrentStyle = */doc->ksAddStyle(TEXT_STYLE, textStPar, 0); //    */
  }


    par->Init();
    par->style   = 0;
    par->x       = 30;
    par->y       = 30;
    par->ang     = 0;
    par->hFormat = 0;
    par->vFormat = 0;
    par->height  = 25;
    par->width   = 20;

    doc->ksParagraph( par );

    ksTextItemParam* item = (ksTextItemParam*)kompas->GetParamStruct( ko_TextItemParam );
    if ( item ) {
      // 5    
      item->Init();
      item->s = StringToOleStr( "111" );
      ksTextItemFont* font = (ksTextItemFont*)item->GetItemFont();
      if ( font ) {
        font->SetBitVectorValue( NEW_LINE, true );
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( NUMERATOR, true );
        font->SetBitVectorValue( ITALIC_ON, true );
        item->type = FRACTION_TYPE;
        item->s = StringToOleStr( "222" );
        item->iSNumb = 2;
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( DENOMINATOR, true );
        font->SetBitVectorValue( BOLD_ON,     true );
        item->s = StringToOleStr( "333" );
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( END_FRACTION, true );
        font->SetBitVectorValue( BOLD_OFF,     true );
        font->SetBitVectorValue( ITALIC_OFF,   true );
        item->s = StringToOleStr( "444" );
        doc->ksTextLine( item );

/*
//4        

        item->Init();
        font->SetBitVectorValue( StringToOleStr("NEW_LINE"), true );
        item->s = StringToOleStr( "111" );
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( StringToOleStr("NUMERATOR"), true );
        font->SetBitVectorValue( StringToOleStr("ITALIC_ON"), true );
        item->s = StringToOleStr( "55" );
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( StringToOleStr("S_BASE"), true );
        item->s = StringToOleStr( "222" );
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( StringToOleStr("S_UPPER_INDEX"), true );
        item->s = StringToOleStr( "up" );
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( StringToOleStr("S_LOWER_INDEX"), true );
        item->s = StringToOleStr( "lo" );
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( StringToOleStr("S_END"), true );
        item->s = StringToOleStr( "66" );
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( StringToOleStr("DENOMINATOR"), true );
        item->s = StringToOleStr( "77" );
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( StringToOleStr("END_FRACTION"), true );
        font->SetBitVectorValue( StringToOleStr("BOLD_OFF"),     true );
        font->SetBitVectorValue( StringToOleStr("ITALIC_OFF"),   true );
        item->s = StringToOleStr( "4444" );
        doc->ksTextLine( item );
*/
/*
//3   
        item->Init();
        font->SetBitVectorValue( StringToOleStr("NEW_LINE"), true );
        item->s = StringToOleStr( "111" );
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( StringToOleStr("SPECIAL_SYMBOL"), true );
        item->type   = SPECIAL;
        item->iSNumb = 41;
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( StringToOleStr("SPECIAL_SYMBOL_END"), true );
        item->s = StringToOleStr( "222" );
        doc->ksTextLine( item );
*/
/*
//1
        item->Init();
        font->SetBitVectorValue( StringToOleStr("NEW_LINE"),  true );
        font->SetBitVectorValue( StringToOleStr("NUMERATOR"), true );
        item->s = StringToOleStr( "111" );
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( StringToOleStr("FONT_SYMBOL"),  true );
        item->type   = FONT_NAME;
        item->s = StringToOleStr( "Arial" );
        item->iSNumb = 64;
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( StringToOleStr("DENOMINATOR"),  true );
        item->s = StringToOleStr( "222" );
        doc->ksTextLine( item );

        item->Init();
        font->SetBitVectorValue( StringToOleStr("END_FRACTION"),  true );
        doc->ksTextLine( item );
*/
	reference p = doc->ksEndObj();

        ksTextParam* par1 = (ksTextParam*)kompas->GetParamStruct( ko_TextParam );
        if ( par1 ) {
          par1->Init();
          ksTextLineParam* linePar = (ksTextLineParam*)kompas->GetParamStruct( ko_TextLineParam );
          if ( linePar ) {
            //   1 -  (  0 )
            doc->ksGetObjParam( p, linePar, 0 );

            PrintPar1( linePar );
            if ( kompas->ksYesNo( StringToOleStr("   ?") ) ) {
              ksDynamicArray* arr = (ksDynamicArray*)linePar->GetTextItemArr();
              if ( arr ) {
                //     ITALIC  BOLD   
                arr->ksGetArrayItem( 0, item );
                font = (ksTextItemFont*)item->GetItemFont();
                font->SetBitVectorValue( ITALIC_OFF, false );
                font->SetBitVectorValue( BOLD_OFF,   false );
                font->color = RGB( 0, 255, 0 );

                arr->ksSetArrayItem( 0, item );
                //     
                doc->ksSetObjParam( p, linePar, 0 );
                //   1 -  (  0 )   
                doc->ksGetObjParam( p, linePar, 0 );
                PrintPar1( linePar );
              }
            }
          }
        }
      }
    }
  }
}

//------------------------------------------------------------------------------
//   
// ---
void WorkDocument() {
  ksDocumentParam* docPar  = (ksDocumentParam*)kompas->GetParamStruct( ko_DocumentParam );
  ksDocumentParam* docPar2 = (ksDocumentParam*)kompas->GetParamStruct( ko_DocumentParam );
  if ( docPar && docPar2 ) {
    docPar->Init();
    docPar->fileName = StringToOleStr( "d:\\gr\\2.cdw" );
    docPar->comment  = StringToOleStr( "create document" );
    docPar->author   = StringToOleStr( "user" );
    docPar->regime   = 0;
    docPar->type     = lt_DocSheetStandart;

    ksSheetPar* sheet = (ksSheetPar*)docPar->GetLayoutParam();
    sheet->shtType        = 1;
    sheet->layoutName[0]  = '\0';

    ksStandartSheet* stSheet = (ksStandartSheet*)sheet->GetSheetParam();

    stSheet->format   = 3;
    stSheet->multiply = 1;
    stSheet->direct   = 0;
    //  : ,  3,  
    //     1
    ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
    if ( doc && (bool)doc->ksCreateDocument(docPar) ) {
      ksViewParam* par = (ksViewParam*)kompas->GetParamStruct( ko_ViewParam );
      if ( par ) {
        par->x = 10;
        par->y = 20;
        par->scale_ = 0.5;
        par->angle = 45;
        par->color = RGB(10,20,10);
        par->state = stACTIVE;
        par->name  = StringToOleStr( "user view" );
        long number = 2;
        //       2,  0.5,   45 
        doc->ksCreateSheetView( par, &number );
        //     5
        doc->ksLayer( 5 );

        doc->ksLineSeg( 20, 10, 40, 10, 1 );
        doc->ksLineSeg( 40, 10, 40, 30, 1 );
        doc->ksLineSeg( 40, 30, 20, 30, 1 );
        doc->ksLineSeg( 20, 30, 20, 10, 1 );

        kompas->ksMessage( StringToOleStr("") );

        //   
        doc->ksGetObjParam( doc->reference, docPar2, ALLPARAM );
        char buf[128];

        ksSheetPar* sheet2        = (ksSheetPar*)docPar2->GetLayoutParam();
        ksStandartSheet* stSheet2 = (ksStandartSheet*)sheet2->GetSheetParam();

        if ( sheet2 && stSheet2 ) {
          sprintf( buf, "type = %d f = %d m = %d d = %d", docPar->type, stSheet2->format,
                   stSheet2->multiply, stSheet2->direct ? 1 : 0 );

          kompas->ksMessage( StringToOleStr(buf) );
        }

        kompas->ksMessage( docPar2->fileName );
        kompas->ksMessage( docPar->comment );
        kompas->ksMessage( docPar->author );

        //  
        doc->ksSaveDocument( StringToOleStr("") );
        //  
        doc->ksCloseDocument();
      }
    }
  }
}

//------------------------------------------------------------------------------
//    
// ---
void WorkNameGroup() {
  ksDocument2D* doc = (ksDocument2D*)kompas->Document2D();
  if ( doc ) {
    //         
    reference gr = doc->ksNewGroup( 0 );
      doc->ksLineSeg( 20, 20, 40, 20, 1 );
      doc->ksLineSeg( 40, 20, 40, 40, 1 );
      doc->ksLineSeg( 40, 40, 20, 40, 1 );
      doc->ksLineSeg( 20, 40, 20, 20, 1 );
    doc->ksEndGroup();

    //     
    //      
    if( !doc->ksSaveGroup( gr, StringToOleStr("group1") ) )
      exit( EXIT_SUCCESS );

    reference gr1 = doc->ksGetGroup( StringToOleStr("group1") );
    if( !gr1 )
      exit(EXIT_SUCCESS);

    reference c = doc->ksCircle( 30, 30, 10, 1 );
    doc->ksAddObjGroup( gr1, c );

    doc->ksLightObj( gr1, 1 );
    kompas->ksMessage( StringToOleStr("    ") );
    doc->ksLightObj( gr1, 0 );
  }
}


