unit step3d31;

interface
  procedure  LIBRARYENTRY( command: WORD  ); Pascal;
  function   LIBRARYID   : Cardinal;      Pascal;

implementation
uses
  Windows,
  SysUtils,
  LDefin2D,
  LDefin3D,
  ksConstTLB,
  ksAuto,
{$IFDEF __LIGHT_VERSION__}
  klTLB;
{$ELSE}
  ksTLB;
{$ENDIF}

var
  iKompasObject: KompasObject;
  iDocument3D: ksDocument3D;

//------------------------------------------------------------------------
//   
// ---
procedure ConstrAxisOperations;
var
  part                : ksPart;
  entitySketch        : ksEntity;
  sketchDef           : ksSketchDefinition;
  basePlane           : ksEntity;
  sketchEdit          : ksDocument2D;
  entityRotate        : ksEntity;
  rotateDef           : ksBaseRotatedDefinition;
  rotproperty         : ksRotatedParam;
  entityAxisOperation : ksEntity;
  axisOperation       : ksAxisOperationsDefinition;
begin
	part := ksPart( iDocument3D.GetPart(pNew_Part) ); //  
	if ( part <> nil ) then begin
    entitySketch := ksEntity( part.NewEntity(o3d_sketch) );
		if ( entitySketch <> nil ) then begin
			//   
			sketchDef := ksSketchDefinition( entitySketch.GetDefinition );
			if ( sketchDef <> nil ) then begin
				//     XOY
				basePlane := ksEntity( part.GetDefaultEntity(o3d_planeXOY) );
				sketchDef.SetPlane( basePlane ); //   XOY   
				entitySketch.Create;             //  

				//   
				sketchEdit := ksDocument2D( sketchDef.BeginEdit );
          sketchEdit.ksCircle( 20, 0, 10, 1 );
					sketchEdit.ksLineSeg( 0, 0, 0, 5, 3 );
				sketchDef.EndEdit;                   //   

				entityRotate := ksEntity( part.NewEntity(o3d_baseRotated) );
				if ( entityRotate <> nil ) then begin
					rotateDef := ksBaseRotatedDefinition( entityRotate.GetDefinition ); //    
					if ( rotateDef <> nil ) then begin
     				rotproperty := ksRotatedParam( rotateDef.RotatedParam );
						if ( rotproperty <> nil ) then begin
							rotproperty.Direction := dtBoth;
              rotproperty.ToroidShape  := false;
						end;

						rotateDef.SetThinParam( true, dtBoth, 1, 1 ); //     
						rotateDef.SetSideParam( true, 180 );
						rotateDef.SetSketch( entitySketch );          //   
						entityRotate.Create;                          //  
					end;
				end;
				//     
				entityAxisOperation := ksEntity( part.NewEntity(o3d_axisOperation) );
				if ( entityAxisOperation <> nil ) then begin
					axisOperation := ksAxisOperationsDefinition( entityAxisOperation.GetDefinition );
					if ( axisOperation <> nil ) then begin
						axisOperation.SetOperation( entityRotate );
						entityAxisOperation.Create;                        //  
					end;
				end;
				iKompasObject.ksMessage( ' ' );
			end;
		end;
	end;
end;

//-------------------------------------------------------------------------------
//     
// ---
procedure ConstrAxis2Point;
var
  part             : ksPart;
  entitySketch     : ksEntity;
  sketchDef        : ksSketchDefinition;
  basePlane        : ksEntity;
  sketchEdit       : ksDocument2D;
  entityExtr       : ksEntity;
  extrusionDef     : ksBaseExtrusionDefinition;
  entityCollection : ksEntityCollection;
  entityAxis2Point : ksEntity;
  axis2Point       : ksAxis2PointsDefinition;
begin
	part := ksPart( iDocument3D.GetPart(pTop_Part) ); //  
	if ( part <> nil ) then begin
		entitySketch := ksEntity( part.NewEntity(o3d_sketch) );
		if ( entitySketch <> nil ) then begin
			//   
			sketchDef := ksSketchDefinition( entitySketch.GetDefinition );
			if ( sketchDef <> nil ) then begin
				//     XOY
				basePlane := ksEntity( part.GetDefaultEntity(o3d_planeXOY) );
				sketchDef.SetPlane( basePlane ); //   XOY   
				entitySketch.Create;             //  

				//   
				sketchEdit := ksDocument2D( 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;                   //   

				entityExtr := ksEntity( part.NewEntity(o3d_baseExtrusion) );
				if ( entityExtr <> nil ) then begin
					//     
					extrusionDef := ksBaseExtrusionDefinition( entityExtr.GetDefinition ); //    
					if ( extrusionDef <> nil ) then begin
						extrusionDef.DirectionType := dtNormal;         //  
						extrusionDef.SetSideParam( true{ }, etBlind{  }, 20, 0, false );
						extrusionDef.SetThinParam( true, dtBoth, 20, 20 ); //     
						extrusionDef.SetSketch( entitySketch ); //   
						entityExtr.Create;                      //  
					end;
				end;
			end;
		end;

		entityCollection := ksEntityCollection( part.EntityCollection(o3d_vertex) );

		if ( (entityCollection <> nil) And (entityCollection.GetCount > 0) ) then begin
			//     
			entityAxis2Point := ksEntity( part.NewEntity(o3d_axis2Points) );
			if ( entityAxis2Point <> nil ) then begin
				axis2Point := ksAxis2PointsDefinition( entityAxis2Point.GetDefinition );
				if ( axis2Point <> nil ) then begin
					axis2Point.SetPoint( 1, entityCollection.GetByIndex(0) );
					axis2Point.SetPoint( 2, entityCollection.GetByIndex(entityCollection.GetCount - 1) );
					entityAxis2Point.Create;
				end;
			end;
			iKompasObject.ksMessage( '   ' );
		end;
	end;
end;

//-------------------------------------------------------------------------------
//  ,   
// ---
procedure ConstrAxisEdge;
var
  part             : ksPart;
  entitySketch     : ksEntity;
  sketchDef        : ksSketchDefinition;
  basePlane        : ksEntity;
  sketchEdit       : ksDocument2D;
  entityExtr       : ksEntity;
  extrusionDef     : ksBaseExtrusionDefinition;
  entityCollection : ksEntityCollection;
  entityAxisEdge   : ksEntity;
  axisEdge         : ksAxisEdgeDefinition;
  entityAxisEdge2  : ksEntity;
begin
	part := ksPart( iDocument3D.GetPart(pTop_Part) ); //  
	if ( part <> nil ) then begin
		entitySketch := ksEntity( part.NewEntity(o3d_sketch) );
		if ( entitySketch <> nil ) then begin
			//   
			sketchDef := ksSketchDefinition( entitySketch.GetDefinition );
			if ( sketchDef <> nil ) then begin
				//     XOY
				basePlane := ksEntity( part.GetDefaultEntity(o3d_planeXOY) );
				sketchDef.SetPlane( basePlane ); //   XOY   
				entitySketch.Create;           //  

				//   
				sketchEdit := ksDocument2D( 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;                   //   

				entityExtr := ksEntity( part.NewEntity(o3d_baseExtrusion) );
				if ( entityExtr <> nil ) then begin
					//     
					extrusionDef := ksBaseExtrusionDefinition( entityExtr.GetDefinition ); //    
					if ( extrusionDef <> nil ) then begin
						extrusionDef.DirectionType := dtNormal;         //  
						extrusionDef.SetSideParam( true{ }, etBlind{  }, 20, 0, false );
						extrusionDef.SetThinParam( true, dtBoth, 20, 20 ); //     
						extrusionDef.SetSketch( entitySketch ); //   
						entityExtr.Create;                    //  
					end
				end;
		  end;
		end;

		entityCollection := ksEntityCollection( part.EntityCollection(o3d_edge) );

		if ( (entityCollection <> nil) And (entityCollection.GetCount > 1) ) then begin
			//    
			entityAxisEdge := ksEntity( part.NewEntity(o3d_axisEdge) );
			if ( entityAxisEdge <> nil ) then begin
				axisEdge := ksAxisEdgeDefinition( entityAxisEdge.GetDefinition );
				if ( axisEdge <> nil ) then begin
					axisEdge.SetEdge( entityCollection.GetByIndex(0) );
					entityAxisEdge.Create;
				end;
			end;
			iKompasObject.ksMessage( '  ' );

			//     
			entityAxisEdge2 := ksEntity( part.NewEntity(o3d_axisEdge) );
			if ( entityAxisEdge2 <> nil ) then begin
				axisEdge := ksAxisEdgeDefinition( entityAxisEdge2.GetDefinition );
				if ( axisEdge <> nil ) then begin
					axisEdge.SetEdge( entityCollection.GetByIndex(1) );
					entityAxisEdge2.Create;
				end;
			end;
			iKompasObject.ksMessage( '   ' );
		end;
	end;
end;

//-------------------------------------------------------------------------------
//    
// ---
(*
procedure ConstrAxisConeface;
var
  part              : ksPart;
  entitySketch      : ksEntity;
  sketchDef         : ksSketchDefinition;
  basePlane         : ksEntity;
  sketchEdit        : ksDocument2D;
  entityExtr        : ksEntity;
  extrusionDef      : ksBaseExtrusionDefinition;
  entityCollection  : ksEntityCollection;
  entityConFace     : ksEntity;
  i, count          : Integer;
  face              : ksFaceDefinition;
  entityAxisConFace : ksEntity;
  axisConFace       : ksAxisConefaceDefinition;
begin
	part := ksPart( iDocument3D.GetPart(pTop_Part) ); //  
	if ( part <> nil ) then begin
		entitySketch := ksEntity( part.NewEntity(o3d_sketch) );
		if ( entitySketch <> nil ) then begin
			//   
			sketchDef := ksSketchDefinition( entitySketch.GetDefinition );
			if ( sketchDef <> nil ) then begin
				//     XOY
				basePlane := ksEntity( part.GetDefaultEntity(o3d_planeXOY) );
				sketchDef.SetPlane( basePlane ); //   XOY   
				entitySketch.Create;           //  

				//   
				sketchEdit := ksDocument2D( sketchDef.BeginEdit );
				  sketchEdit.ksCircle( 0, 0, 50, 1 );
				sketchDef.EndEdit;                   //   

				entityExtr := ksEntity( part.NewEntity(o3d_baseExtrusion) );
				if ( entityExtr <> nil ) then begin
					//     
					extrusionDef := ksBaseExtrusionDefinition( entityExtr.GetDefinition ); //    
					if ( extrusionDef <> nil ) then begin
						extrusionDef.DirectionType := dtNormal;         //  
						extrusionDef.SetSideParam( true{ }, etBlind{  }, 20, 30, false, false );
						extrusionDef.SetThinParam( true, dtBoth, 10, 10 ); //     
						extrusionDef.SetSketch( entitySketch ); //   
						entityExtr.Create;                      //  
					end;
				end;
			end;
		end;

		entityCollection := ksEntityCollection( part.EntityCollection(o3d_face) );

    count := entityCollection.GetCount;
		for i := 0 to count - 1 do begin
			entityConFace := ksEntity( entityCollection.GetByIndex(i) );
			face := ksFaceDefinition( entityConFace.GetDefinition );
			if ( not face.IsConic ) then //    ,    
        entityConFace := nil
			else
				Break;
    end;


		//     
		entityAxisConFace := ksEntity( part.NewEntity(o3d_axisConeFace) );
		if ( entityAxisConFace <> nil ) then begin
			axisConFace := ksConstrAxisConefaceDefinition( entityAxisConFace.GetDefinition );
			if ( axisConFace <> nil ) then begin
				axisConFace.SetFace( entityConFace );
				entityAxisConFace.Create;
			end;
		end;
		iKompasObject.ksMessage( '   ' );
	end;
end;
*)
//-------------------------------------------------------------------------------
//    
// ---
procedure ConstrPlane3Point;
var
  part                    : ksPart;
  entitySketch            : ksEntity;
  sketchDef               : ksSketchDefinition;
  basePlane               : ksEntity;
  sketchEdit              : ksDocument2D;
  entityExtr              : ksEntity;
  extrusionDef            : ksBaseExtrusionDefinition;
  entityCollection        : ksEntityCollection;
  entityConstrPlane3Point : ksEntity;
  constrPlane3Point       : ksPlane3PointsDefinition;
begin
	part := ksPart( iDocument3D.GetPart(pTop_Part) ); //  
	if ( part <> nil ) then begin
		entitySketch := ksEntity( part.NewEntity(o3d_sketch) );
		if ( entitySketch <> nil ) then begin
			//   
			sketchDef := ksSketchDefinition( entitySketch.GetDefinition );
			if ( sketchDef <> nil ) then begin
				//     XOY
				basePlane := ksEntity( part.GetDefaultEntity(o3d_planeXOY) );
				sketchDef.SetPlane( basePlane ); //   XOY   
				entitySketch.Create;             //  

				//   
				sketchEdit := ksDocument2D( 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;                   //   

				entityExtr := ksEntity( part.NewEntity(o3d_baseExtrusion) );
				if ( entityExtr <> nil ) then begin
					//     
					extrusionDef := ksBaseExtrusionDefinition( entityExtr.GetDefinition ); //    
					if ( extrusionDef <> nil ) then begin
						extrusionDef.DirectionType := dtNormal;         //  
						extrusionDef.SetSideParam( true{ }, etBlind{  }, 20, 30, false );
						extrusionDef.SetThinParam( true, dtBoth, 10, 10 ); //     
						extrusionDef.SetSketch( entitySketch ); //   
						entityExtr.Create;                      //  
					end;
				end;
			end;
		end;

		entityCollection := ksEntityCollection( part.EntityCollection(o3d_vertex) );

		//    
		entityConstrPlane3Point := ksEntity( part.NewEntity(o3d_plane3Points) );
		if ( entityConstrPlane3Point <> nil ) then begin
			constrPlane3Point := ksPlane3PointsDefinition( entityConstrPlane3Point.GetDefinition );
			if ( constrPlane3Point <> nil ) then begin
				constrPlane3Point.SetPoint( 1, entityCollection.GetByIndex(0) );
				constrPlane3Point.SetPoint( 2, entityCollection.GetByIndex(1) );
				constrPlane3Point.SetPoint( 3, entityCollection.GetByIndex(2) );
				entityConstrPlane3Point.Create;
			end;
		end;
		iKompasObject.ksMessage( '   ' );
	end;
end;

//-------------------------------------------------------------------------------
//   ,          
// ---
procedure CreateConstrElem;
var
  part             : ksPart;
  entity           : ksEntity;
  offsetDef        : ksPlaneOffsetDefinition;
  basePlane        : ksEntity;
  entityAxis       : ksEntity;
  axis2PlanesDef   : ksAxis2PlanesDefinition;
  entityAnglePlane : ksEntity;
  planeAngleDef    : ksPlaneAngleDefinition;
begin
	part := ksPart( iDocument3D.GetPart(pTop_Part) ); //  
	if ( part <> nil ) then begin
		entity := ksEntity( part.NewEntity(o3d_planeOffset) );
		if ( entity <> nil ) then begin
			//    
			offsetDef := ksPlaneOffsetDefinition( entity.GetDefinition );
			if ( offsetDef <> nil ) then begin
				offsetDef.offset := 150; //    
				basePlane := ksEntity( part.GetDefaultEntity(o3d_planeXOY) );
				basePlane.name := 'XOY'; //   
				basePlane.Update;        //  

				offsetDef.SetPlane( basePlane ); //  
				offsetDef.direction := false;          //     
				entity.name := ' '; //    
				entity.Create;                 //   

				iKompasObject.ksMessage( '   ' );

				offsetDef.offset := 50;       //     
				basePlane := nil;
				//    
				basePlane := ksEntity( part.GetDefaultEntity(o3d_planeYOZ) );
				basePlane.name := 'YOZ';
		  	basePlane.Update;              //  

				offsetDef.direction := true;        //      
				offsetDef.SetPlane( basePlane );
				entity.Update;                 //  

				basePlane := nil;
				//    
				basePlane := ksEntity( part.GetDefaultEntity(o3d_planeXOY) );
				basePlane.name := 'XOY';

				iKompasObject.ksMessage( '    ' );

				//     
				entityAxis := ksEntity( part.NewEntity(o3d_axis2Planes) );
				if ( entityAxis <> nil ) then begin
					axis2PlanesDef := ksAxis2PlanesDefinition( entityAxis.GetDefinition );
					if ( axis2PlanesDef <> nil ) then begin
						axis2PlanesDef.SetPlane( 1, entity );    //   1
						axis2PlanesDef.SetPlane( 2, basePlane ); //   2
						entityAxis.name := '   '; //   
						entityAxis.Create;                     //  

						iKompasObject.ksMessage( '       ' );

						basePlane := nil;
						//    
						basePlane := ksEntity( part.GetDefaultEntity(o3d_planeXOZ) );
						basePlane.name := 'XOZ';

						axis2PlanesDef.SetPlane( 2, basePlane ); //   2
						entityAxis.Update;

						iKompasObject.ksMessage( '      \n     45' );

						entityAnglePlane := ksEntity( part.NewEntity(o3d_planeAngle) );
						if ( entityAnglePlane <> nil ) then begin
							//        
							planeAngleDef := ksPlaneAngleDefinition( entityAnglePlane.GetDefinition );
							if ( planeAngleDef <> nil ) then begin
								planeAngleDef.Angle := 45;           //     
								planeAngleDef.SetPlane( entity );    //  
								planeAngleDef.SetAxis( entityAxis ); //  
								entityAnglePlane.name := '     ';
								entityAnglePlane.Create;           //    

								iKompasObject.ksMessage( '    ' );

								planeAngleDef.SetPlane( basePlane ); //  
								entityAnglePlane.Update;           //   
							end;
						end;
					end;
				end;
			end;
		end;
	end;
end;

//------------------------------------------------------------------------------
// LibraryId
//---
function LibraryId: UINT; pascal;
begin
  Result := 100;
end;

//------------------------------------------------------------------------------
// LibraryEntry
//---
procedure LibraryEntry( command: WORD ); pascal;
begin
  iKompasObject := KompasObject(CreateKompasObject);

  if iKompasObject <> nil then
  begin
    iDocument3D := ksDocument3D(iKompasObject.ActiveDocument3D);

    if (iDocument3D <> nil) then
    begin
      case command of
        1  : ConstrAxisOperations;  //   
				2  : ConstrAxis2Point;  	  //     
				3  : ConstrAxisEdge;	      //  ,   
//				4  : ConstrAxisConeface;    //    
				5  : CreateConstrElem;      //   ,          
				6  : ConstrPlane3Point;     //    
//				8  : ::GetArraySketch;        //   ( )     ksEntityCollection ( IEntityCollection )
//				9  : ::GetSetUserParamComponent; //       
//				10 : ::GetSetArrayMate;       //    (ksEntityCollection)    .mates
      end;

      iKompasObject.ksMessageBoxResult;

      iDocument3D := nil;
    end;

    iKompasObject := nil;
  end;
end;

end.
