unit Step55;
//*****************************************************************************/
//*                   (c)                             */
//*                    -, 1991, 1996                            */
//*                     -   5.x                             */
//*****************************************************************************/
//*                                                               */
//*                                                      */
//* 1.             - DrawTransform               */
//* 2.                        - DrawCopy                    */
//* 3.                          - DrawSymmetry                */
//* 4.                - EditTolerance               */
//* 5.                     - EditTable                   */
//* 6.        - EditStamp                   */
//* 7.                           - GetTextTT                   */
//* 8.     - ChangeTechnicalDemand       */
//* 9.                          - ShowInsertFragment          */
//* 10.             - EditFragmentLibrary         */
//* 11.                 - ShowInsertFragment1         */
//* 12.                     - EditTable1                  */
//* 13.               - EditTolerance1              */
//*                                                                           */
//*****************************************************************************/
interface

uses  Windows, Sysutils, LtDefine, LibTool, LDefin2D;

procedure LIBRARYENTRY( comm: WORD  ); Pascal;
function  LIBRARYID : Cardinal; Pascal;

//------------------------------------------------------------------------------
//   
// ---
procedure  DrawTransform;
procedure  DrawCopy;
procedure  DrawSymmetry;
procedure  EditTolerance;
procedure  EditTable;
procedure  EditStamp;
procedure  GetTextTT;
procedure  ShowInsertFragment;
procedure  EditFragmentLibrary;
procedure  ShowInsertFragment1;
procedure  ChangeTechnicalDemand;
procedure  EditTable1;
procedure  EditTolerance1;

implementation

//------------------------------------------------------------------------------
//  
//---
function LIBRARYID: Cardinal; pascal;
begin
  Result := 100;
end;

//------------------------------------------------------------------------------
//   
//---
procedure LIBRARYENTRY( comm : Word ); pascal;
begin

  case comm of
     1: DrawTransform();          //    
     2: DrawCopy();               //  
     3: DrawSymmetry();           //  
     4: EditTolerance();          //   
     5: EditTable();              //  
     6: EditStamp();              //      
     7: GetTextTT();              //   
     8: ShowInsertFragment();     //  
     9: EditFragmentLibrary();    //    
    10: ShowInsertFragment1 ();   //   
    11: ChangeTechnicalDemand (); //   
    12: EditTable1();             //  
    13: EditTolerance1();         //   
  end; {case}

end;

//------------------------------------------------------------------------------
//  
//---
procedure DrawTransform();
var
  ref : Reference; //  
begin

  //   
  Mtr( -30, -30, 0, 1 );
    //  
    ref := NewGroup(0);            // 0 -  
      LineSeg( 30, 30, 60, 30, 1);
      LineSeg( 60, 30, 60, 60, 1);
      LineSeg( 60, 60, 30, 60, 1);
      LineSeg( 30, 60, 30, 30, 1);
      // 
      Hatch( 0, 45, 2, 0, 0, 0 );
        LineSeg( 30, 30, 60, 30, 1);
        LineSeg( 60, 30, 60, 60, 1);
        LineSeg( 60, 60, 30, 60, 1);
        LineSeg( 30, 60, 30, 30, 1);
      EndObj();

    EndGroup();
  DeleteMtr();

  //    
  // ref =  ArcBy3Points( 20, 60, 40, 70, 20, 80, 1 );

  //   1   
  // ref := GetViewReference( 1 );
  // if( ref = 0 ) then
  // begin
  //   MessageBoxResult();
  //   exit;
  // end;

  //   1   
  // ref := GetLayerReference( 1 );
  // if(ref = 0) then
  // begin
  //   MessageBoxResult();
  //   exit;
  // end;

  //   
  // ref := 0;

  ksMessage('C  20, 20, 45, 2');

  Mtr( 20, 20, 45, 2 );        //  
                               // c x = 20, y = 20
                               //   = 45
                               //  = 2
    TransformObj( ref );       // 
  DeleteMtr();                 //  

  MessageBoxResult();          // 
  ksMessage(' ');

  Mtr(-20, -20, 0, 1 );        // C x = -20, y = -20
    TransformObj( ref );
  DeleteMtr();

  Mtr(0, 0, 0, 0.5 );          //  = 0.5
    TransformObj( ref );
  DeleteMtr();

  Mtr(0, 0, -45, 1 );          //   = 45
    TransformObj( ref );
  DeleteMtr();

  MessageBoxResult();          // 

end;

//------------------------------------------------------------------------------
//     
//---
procedure DrawCopy;
var
  par    : ViewParam; //  
  v      : Reference; // 
  number : Integer;   //  
begin

  number    := 5;                   //  

  par.x     := 20;                  // 
  par.y     := 60;
  par.scale := 1;                   // 
  par.ang   := 0;                   // 
  par.color := RGB( 10, 20, 10 );   // 
  par.state := stACTIVE;            //  - 
  StrCopy( par.name, 'user view' ); //  

  // C 
  v := CreateSheetView( Addr(par), number );
  // C 
  Layer( 5 );

  //   
  LineSeg( 20, 10, 20, 30, 1 );
  LineSeg( 20, 30, 40, 30, 1 );
  LineSeg( 40, 30, 40, 10, 1 );
  LineSeg( 40, 10, 20, 10, 1 );

  //   (        )
  CopyObj( v, 20, 60, 40, 80, 1, 0 );

end;

//------------------------------------------------------------------------------
//     
//---
procedure DrawSymmetry;
var
  grp : Reference; //  

begin
  //     .     
  //    ,       
  // .       8 
  grp := NewGroup( 0 );
    LineSeg( 20, 10, 20, 30, 1 );
    LineSeg( 20, 30, 40, 30, 1 );
    LineSeg( 40, 30, 40, 10, 1 );
    LineSeg( 40, 10, 20, 10, 1 );
    SymmetryObj( grp, 40, 10, 40, 20, 1 ); //  
  EndGroup();

  //  
  LightObj( grp, 1 );
    MessageBoxResult();
  LightObj( grp, 0 );

end;

//------------------------------------------------------------------------------
//    
//---
procedure   EditTolerance;
var
  par      : ToleranceParam; //   
  par1     : TextLineParam;  //   
  par3     : TextItemParam;  //   
  info     : RequestInfo;    //  
  pObj     : Reference;      //  
  x, y     : Double;         // 
  j, _type : Integer;
  numb     : Cardinal;
  count    : Integer;
  buf      : String;
begin

  //  
  FillChar( info, sizeof(info), 0 );

  info.prompt := '  ';         // 
  j := ksCursor( Addr(info), x ,y, nil );        //   
  if ( j <> 0 ) then
  begin
    pObj := FindObj( x, y, ksGetCursorLimit() );
    if ( ExistObj(pObj) > 0  ) then              //   
    begin

      _type := GetObjParam( pObj, nil, 0, 0 );   //   
      if ( _type = TOLERANCE_OBJ ) then          //     
      begin
        //     
        ksOpenTolerance( pObj );

          //    
          GetObjParam(  pObj,                   //    
                      Addr(par),                //    
                      SizeOf( ToleranceParam ), //   
                      ALLPARAM );               //   

          buf := Format( ' =%d =%d -%d x=%5.1f y=%5.1f',
                         [ par.tBase, par.style, par._type, par.x, par.y ] );
          ksMessage(PChar(buf));

          //       
          while ( ksGetToleranceColumnText( numb, Addr(par1) ) <> 0 ) do
          begin
            buf := Format( 'numb =%d', [numb] );        //  
            ksMessage( PChar(buf) );

            buf := Format( 'style=%d ', [par1.style] ); // 
            ksMessage( PChar(buf) );

            count := GetArrayCount( par1.pTextItem );   //    

            for  j := 0 to count-1 do
            begin
              //   
              GetArrayItem( par1.pTextItem, j, Addr(par3), SizeOf(TextItemParam) );
              if ( par3.tip = 0 ) then // 
                buf := Format( '=%d h=%5.1f s=%s fontName=%s  =%d',
                              [ j, par3.font.height, par3.s, par3.font.fontName, par3.font.bitVector] )
              else
                buf := Format( '=%d  = %d  =%d',
                              [ j, par3.tip, par3.iSNumb] );
              ksMessage( PChar(buf) );
            end;
            DeleteArray( par1.pTextItem );  //   
          end;

          //  
          par.x := par.x + 10;
          par.y := par.y + 10;
          SetObjParam(  pObj,                      //    
                        Addr(par),                 //    
                        SizeOf( ToleranceParam  ), //   
                        ALLPARAM );                //   

          //    
          ColumnNumber( 2 );
          TextLine( NEW_LINE, 0, nil, ' ' );

          ksDivideTableItem( 3, 1, 2 );        //   3   

          //   4
          ColumnNumber( 4 );
          TextLine(NEW_LINE, 0, nil, '4' );

          // ksSetTableBorderStyle( 1, 2, 1 ); //      1  
          // ksClearTableColumnText( 0 );      //    
        EndObj();                              //   " "

      end else
        Error( '   ');
    end else
      Error( ' ');
  end;
end;

//------------------------------------------------------------------------------
//   
//---
procedure EditTable;
var
  par          : TextParam;     //  
  par2         : TextLineParam; //  
  par3         : TextItemParam; //   
  pObj, p      : Reference;     //      
  info         : RequestInfo;   //  
  x, y         : Double;        //  
  numb         : Cardinal;      //  
  j, _type, i  : Integer;
  count, count1: Integer;
  buf          : String;

begin

  //  
  FillChar( info, sizeof(info), 0 );
  info.prompt := ' ';              // 

  //    
  j := ksCursor( Addr(info), x, y, nil );        //   
  if ( j <> 0 ) then
  begin
    pObj := FindObj( x, y, ksGetCursorLimit() ); //  
    if( ExistObj(pObj) > 0 ) then                //   
    begin

      _type := GetObjParam( pObj, nil, 0, 0 );   //   
      //    - 
      if ( _type = TABLE_OBJ ) then
      begin

        //    
        ksOpenTable( pObj );

          //       
          while  ksGetTableColumnText( numb, Addr(par) ) <> 0  do
          begin

            buf := Format( 'numb =%d', [numb] );
            ksMessage( PChar(buf) );

            p     := par.pTextLine;                //   
            count := GetArrayCount(p);             //  

            for i:=0 to count-1 do
            begin
              //   
              GetArrayItem( p , i, Addr(par2), SizeOf(TextLineParam) );
              buf := Format( 'i =%d style=%d', [i, par2.style] );
              ksMessage(PChar(buf));

              count1 := GetArrayCount( par2.pTextItem ); //    
              for j:=0 to count1-1 do
              begin
                //    
                GetArrayItem( par2.pTextItem, j, Addr(par3), SizeOf(TextItemParam) );
                if ( par3.tip = 0 ) then
                  buf := Format( '=%d h=%5.1f s=%s fontName=%s  =%d',
                                [ j, par3.font.height, par3.s, par3.font.fontName, par3.font.bitVector ] )
                else
                  buf := Format( '=%d  = %d  =%d',
                                [ j, par3.tip, par3.iSNumb ] );
                ksMessage( PChar(buf) );
              end;
              DeleteArray( par2.pTextItem ); //   
              par2.pTextItem := 0;
            end;
            //    
            DeleteArray( p );
            par.pTextLine := 0;
          end;

          //   2
          ColumnNumber( 2 );
          ksText( 0, 0, 0, 5, 1 , 0, ' ' );

          ksDivideTableItem( 3, 1, 2 );        //   3   

          //   4
          ColumnNumber( 4 );
          ksText( 0, 0, 0, 5, 1 , 0, '4' );

          // ksSetTableBorderStyle( 1, 2, 1 ); //      1  
          // ksClearTableColumnText( 0 );      //    

        EndObj; //   ""
      end else
        Error( '  ');
    end else
      Error( ' ');
  end;
end;

//------------------------------------------------------------------------------
//       
//---
procedure EditStamp;
var
  par1  : TextLineParam; //  
  par2  : TextItemParam; //   
  numb  : Cardinal;      //   
  p     : Reference;     //    
  count : Integer;
  count1, i, j : Integer;
  buf   : String;
begin
  //    
  if ( OpenStamp > 0 ) then
  begin
    //       
    p := GetStampColumnText( numb );       //   
    while ( p <> 0 ) do
    begin

      buf := Format( 'numb =%d', [numb] ); //  
      ksMessage( PChar(buf) );

      count := GetArrayCount(p);           //  
      for i := 0  to count - 1 do
      begin
        //    
        GetArrayItem( p, i, Addr(par1), SizeOf(TextLineParam) );
        buf := Format( 'i =%d style=%d', [i, par1.style] );
        ksMessage( PChar(buf) );

        count1 := GetArrayCount( par1.pTextItem ); //   
        for j := 0 to count1 - 1 do
        begin
          //   
          GetArrayItem( par1.pTextItem, j, Addr(par2), SizeOf(TextItemParam) );
          buf := Format( '=%d h=%5.1f s=%s fontName=%s',
                       [ j, par2.font.height, par2.s, par2.font.fontName ]);
          ksMessage( PChar(buf) );
        end;
        DeleteArray( par1.pTextItem );  //   
        par1.pTextItem := 0;
      end;
      //    
      DeleteArray( p );
      p := GetStampColumnText( numb );   //   
    end;
    //   2
    ColumnNumber( 2 );
    TextLine( NEW_LINE, 0, nil, ' 2' );
    // ClearStamp( 0 );  //  
    CloseStamp();        //  
  end else
    Error ( '  ' );
end;

//------------------------------------------------------------------------------
//    
//---
procedure GetTextTT;
var
  par       : TechnicalDemandParam;
  par2      : TextLineParam;
  par3      : TextItemParam;
  pTT       : Reference;
  pTextLine : reference;
  count, count1, count2 : integer;
  i, i1, j  : integer;
  buf       : string;
begin
  //    
  pTT := GetReferenceDocumentPart( 1 );
  if ( pTT > 0) then
  begin

    //   
    GetObjParam( pTT, Addr(par), SizeOf(par), TECHNICAL_DEMAND_PAR );
    count := GetArrayCount( par.pGab );
    buf := Format(' =%d    TT =%d',[par.style,count]);
    ksMessage(PChar(buf));
    //    
    pTextLine := CreateArray( TEXT_LINE_ARR, nil ) ;
    //      
    for  i := 0 to count-1 do
    begin
      GetObjParam( pTT, Addr(pTextLine), sizeof(reference), i );
      count1 := GetArrayCount(pTextLine);
      for i1:=0 to count1-1 do
      begin
        GetArrayItem( pTextLine, i1, Addr(par2), SizeOf(TextLineParam) );
        buf := Format( ' =%d style=%d', [i1, par2.style] );
        ksMessage(PChar(buf));
        count2 := GetArrayCount( par2.pTextItem );
        for j:=0 to count2-1 do
        begin
          GetArrayItem( par2.pTextItem, j, Addr(par3), SizeOf(TextItemParam));
          buf := Format( '=%d h=%5.1f s=%s fontName=%s',[j,par3.font.height,par3.s,
                    par3.font.fontName]);
          ksMessage(PChar(buf));
        end;
        DeleteArray( par2.pTextItem );  //  
        par2.pTextItem := 0;
      end;
      //   
    end;
    DeleteArray( pTextLine );
    pTextLine := 0;
  end;
end;

//--------------------------------------------------------------------------------
//           
// 
//---
procedure ShowInsertFragment;
var
  par          : PlacementParam;         //  
  libName, buf : array [0..250] of char; //      
  insertName   : PChar;                  //  
  x, y         : Double;                 //  
  rub          : Phantom;                // 
  pDefFrg      : Reference;              //     
  p            : Reference;              //   
  j1, j        : Integer;
begin
  //   
  if( ksChoiceFile( '*.lfr',' (*.lfr)|*.lfr|  (*.*)|*.*|', libName, 250, 0 ) > 0 ) then
  begin
    repeat
      //     
      j1 := ksChoiceFragmentFromLib( libName, buf, 250 );
      if ( j1 <> 0 ) then
      begin
        //   
        insertName := StrPos( buf, '|' );
        if ( insertName <> nil ) then
        begin
          //      Placement
          rub.type1.xBase := 0;
          rub.type1.yBase := 0;
          rub.type1.scale := 1;
          rub.phType      := 1;


          //    
          pDefFrg := FragmentDefinition( buf,            //   
                                         insertName + 1, //  
                                         1 );            //   -   
                                                         // 0-   , 1- 

          if( pDefFrg > 0) then
          begin
            //      ,    
            rub.type1.gr    := NewGroup( 1 );       //  

              par.xBase := 0;
              par.yBase := 0;
              par.ang   := 0;
              par.scale := 1 ;
              //   " "
              p := InsertFragment( pDefFrg,         //    
                                   0,               //     0 -    1-   
                                   Addr(par) );     //  

            EndGroup();

            repeat
              rub.type1.ang  := 0;
              //      
              j := Placement( nil, x, y, rub.type1.ang, Addr(rub) );
              if ( j <> 0 ) then
              begin
                CopyObj( p,                   //    
                         0, 0,                //   
                         x, y,                //   
                         1, rub.type1.ang  ); //      
              end;
            until( j = 0 );

            DeleteObj( rub.type1.gr );        //  

          end else
            Error( '    ' );
        end else
          Error( '   ' );
      end;
    until( j1 = 0 );
  end;
end;

//------------------------------------------------------------------------------
//     
//---
procedure  EditFragmentLibrary;
var
  info    : RequestInfo;            //  
  libName : array [0..250] of char; //  
  nameFrg : String;                 //  
  typeEdit: Integer;                //  
  j       : Integer;
  buf     : array [0..250] of char;
begin
  //   
  if ( ksChoiceFile( '*.lfr', ' (*.lfr)|*.lfr|  (*.*)|*.*|', libName, 255, 0 ) > 0 ) then
  begin
    typeEdit := 0;
    FillChar( info, sizeof(info), 0 );
    info.commands := '!_ !_ !_'; // 
    repeat
      j := CommandWindow( Addr(info) );                         //   

      case j of

        1 : begin  // !_
              if ( ReadString( '   ',  // C 
                               buf,                             //  
                               250 ) > 0 ) then                 //   
              begin
                nameFrg   := libName;
                if ( buf[0] <> '|' ) then
                  nameFrg := nameFrg + '|';
                nameFrg   := nameFrg + buf;
                typeEdit  := 2;                                  //   
              end
              else
                typeEdit  := 0;
            end;

        2 : begin // _
            if  ksChoiceFragmentFromLib( libName, buf, 250 ) <> 0  then
            begin
              nameFrg  := buf;
              typeEdit := j;   // 2-   , 3-;
            end
            else
              typeEdit := 0;
           end;

        3 : begin //_
              //    
              if  ksChoiceFragmentFromLib( libName, buf, 250 ) <> 0  then
              begin
                nameFrg  := buf;
                typeEdit := j;   // 2-   , 3-;
              end
              else
                typeEdit := 0;
            end;

      end;

      if ( j > 0) And (typeEdit > 0) then
      begin
        if ( ksFragmentLibrary( PChar(nameFrg), typeEdit ) > 0 ) then
        begin
          if ( typeEdit = 2 ) then
          begin
            ksFragmentLibrary( PChar(nameFrg), 4 {    } );
            //    
            ksText( 0, 100, //   
                    0,      //   
                    5,      //  
                    1,      //  
                    0,	    //  ,   .-.
                    '   ' );   //  

            LineSeg( 0, 100, 110, 100, 1 );
            //     
            //     ""  "  ",
            //   
            SystemControlStart( '  ' );
            ksFragmentLibrary( PChar(nameFrg), 0 {  c  } );
          end;
        end else
          MessageBoxResult;          //  
      end;
    until( j = -1 );
  end;
end;

//------------------------------------------------------------------------------
//    
//---
procedure ShowInsertFragment1;
var
  par     : PlacementParam;          //  
  frwName : array [0..250] of char;  //  
  x, y    : Double;                  //  
  rub     : Phantom;                 // 
  j1, j   : Integer;

begin
  repeat
    //   
    j1 := ksChoiceFile( '*.frw','(*.frw)|*.frw|  (*.*)|*.*|', frwName, 250, 1);
    if( j1 <> 0 ) then
    begin

      //      Placement
      rub.type1.xBase := 0;
      rub.type1.yBase := 0;
      rub.type1.scale := 1;
      rub.phType      := 1;
      rub.type1.ang   := 0;
      //     ,    

      par.xBase := 0;
      par.yBase := 0;
      par.ang   := 0;
      par.scale := 1 ;
      repeat
        //     ,    ,
        //        ,  , ,
        //    .       
        // .
        rub.type1.gr := ksReadFragmentToGroup( frwName,     //  
                                               0,           //     0 -    1-   
                                               Addr(par) ); //  
        //   
        if rub.type1.gr > 0 then
        begin
          //       
          j := Placement( nil, x, y, rub.type1.ang, Addr(rub) );
          if ( j <> 0 ) then
          begin
            //  
            MoveObj( rub.type1.gr, x, y );
            // 
            if( Abs(rub.type1.ang) > 0.001 ) then
               RotateObj( rub.type1.gr, x, y, rub.type1.ang ); //  
            //    
            StoreTmpGroup( rub.type1.gr );
            ClearGroup( rub.type1.gr );                        //  
            DeleteObj( rub.type1.gr );                         //  
          end;
        end
        else begin
          if ( rub.type1.gr > 0 ) then
            DeleteObj( rub.type1.gr );                         //  
          j := 0;
        end;

      until( j = 0 );
    end;
  until( j1 = 0 );
end;

//----------------------------------------------------------------------------------------
//   
//---
procedure ChangeTechnicalDemand;
var
  par     : TechnicalDemandParam; //   
  parLine : TextLineParam;        //  
  parItem : TextItemParam;        //   
  pTT     : Reference;            //  -
  buf     : String;
  i, j, itemCount : Integer;
begin
  //   2D 
  if ( ksGetCurrentDocument( 1 ) > 0 ) then
  begin
    //     
    pTT := GetReferenceDocumentPart( 1 );
    if ( pTT > 0 ) then
    begin
      //    
      GetObjParam( pTT, Addr(par), SizeOf(par), TECHNICAL_DEMAND_PAR );
      buf := Format( '  TT =%d', [par.strCount] );
      ksMessage( PChar(buf) );
      //    
      //    ,   
      OpenTechnicalDemand( par.pGab,    //       0
                           par.style ); //       0 -  

      //      
      for i := 0 to par.strCount-1 do
      begin
        //   
        GetObjParam( pTT, Addr(parLine), SizeOf(TextLineParam), TT_FIRST_STR+i );
        itemCount := GetArrayCount( parLine.pTextItem );
        for j := 0 to itemCount-1 do
        begin
          //    
          GetArrayItem( parLine.pTextItem, j, Addr(parItem), SizeOf(TextItemParam) );
          StrCat( parItem.s, '!!!'); //  
          //   
          SetArrayItem( parLine.pTextItem, j, Addr(parItem), SizeOf(TextItemParam) );
          ksMessage( parItem.s );
        end;
        //    
        SetObjParam( pTT, Addr(parLine), sizeof(TextLineParam), TT_FIRST_STR+i );
      end;
      //  
      CloseTechnicalDemand();
    end else
      Error( ' ' );

  end else
    Error( '   ' );
end;

//--------------------------------------------------------------------------------
//   
//---
procedure EditTable1;
var
  par       : TextParam;     //  
  linePar   : TextLineParam;
  itemPar   : TextItemParam;
  info      : RequestInfo;
  x, y      : Double;
  _type     : Integer;
  numb      : Cardinal;
  pObj      : Reference;
  p         : Reference;
  count,  i : Integer;
  count1, j : Integer;
  comm      : Integer;
begin
  //  
  FillChar( info, sizeof(info), 0 );
  info.prompt := ' ';
  //    
  comm := ksCursor( Addr(info), x ,y, nil );
  if ( comm <> 0 ) then
  begin
    pObj := FindObj( x, y, 100000 );
    if ( ExistObj(pObj) > 0 ) then
    begin
      //   
      _type := GetObjParam(  pObj, nil, 0, 0 ); //    
      //    - 
      if ( _type = TABLE_OBJ ) then
      begin
        //    
        ksOpenTable( pObj );
        //       
        while ksGetTableColumnText( numb, Addr(par) ) <> 0  do
        begin
          p := par.pTextLine;          //  
          count := GetArrayCount(p);   //  
          for i := 0 to count - 1 do
          begin
            GetArrayItem( p , i, Addr(linePar), sizeof(TextLineParam) );
            count1 := GetArrayCount( linePar.pTextItem );
            for j := 0 to count1 - 1 do
            begin

              GetArrayItem( linePar.pTextItem, j, Addr(itemPar), sizeof(TextItemParam) );
              if ( StrLen( itemPar.s ) > 0) then
              begin
                StrCat( itemPar.s, '!!!' );
                SetArrayItem( linePar.pTextItem, j, Addr(itemPar), SizeOf(TextItemParam) );
              end;
            end;
            SetArrayItem( p, i, Addr(linePar), SizeOf(TextLineParam) );
          end;
          //   
          ksSetTableColumnText( numb, Addr(par) );
        end; // while
        EndObj();//  ""
      end else
        Error( '  ' );
    end else
      Error( ' ' );
  end;
end;
//--------------------------------------------------------------------------------
//    
//---------------------------------------------------------------------------------
procedure   EditTolerance1;
var
  pObj   : reference;
  info   : RequestInfo  ;
  x, y   : double ;
  comm   : integer;
  _type  : integer;
  numb   : Cardinal;
  linePar: TextLineParam ;
  itemPar: TextItemParam ;
  count1,j: integer;
//--------------------------------------------------------------------------------

begin
   FillChar( info, sizeof(info), 0 );
  //   
  info.prompt := '  ';
  comm := ksCursor( Addr(info), x ,y, nil );
  if ( comm <> 0 ) then
  begin
    pObj := FindObj( x, y, 1000. );
    if( ExistObj(pObj)> 0 )then
    begin
      //  
      _type := GetObjParam(  pObj, nil, 0, 0);   //   
      if ( _type = TOLERANCE_OBJ ) then
      begin
        //    
        ksOpenTolerance( pObj );

        //      
        while ( ksGetToleranceColumnText( numb, Addr(linePar) )<>0) do
        begin
          count1 := GetArrayCount( linePar.pTextItem );
          for j:=0 to count1-1 do
          begin
            GetArrayItem( linePar.pTextItem, j, Addr(itemPar), SizeOf(TextItemParam));
            if ( Strlen( itemPar.s ) > 0) then
            begin
              StrCat( itemPar.s, '!!!' );
              SetArrayItem( linePar.pTextItem, j, Addr(itemPar), SizeOf(TextItemParam));
            end;
          end;
          ksSetToleranceColumnText( numb, Addr(linePar) );
        end;
        EndObj();//  " "
      end else
        Error( '   ' );
    end else
      Error( ' ' );
  end;
end;

end.
