How to use it

 

VB 2005 example

Delphi 7 example

 

 

VB 2005 Example

 

Prerequisite: check our VB 2005 sample to see the other components and their placement on the form

 

Step 1. Set pieces to be cut (also called parts or DEMAND pieces). Take care of grain direction if you work with wood.

 

        Optimization2DX1.NumberOfDemandPieces = 14

 

        Optimization2DX1.SetDemandPiece(0, 60, 40, 1, 0, 0)
        Optimization2DX1.SetDemandPiece(1, 60, 40, 1, 1, 0)
        Optimization2DX1.SetDemandPiece(2, 48, 40, 1, 2, 0)
        Optimization2DX1.SetDemandPiece(3, 60, 53, 1, 3, 0)
        Optimization2DX1.SetDemandPiece(4, 45, 45, 1, 4, 0)
        Optimization2DX1.SetDemandPiece(5, 50, 80, 1, 5, 0)
        Optimization2DX1.SetDemandPiece(6, 45, 75, 1, 6, 0)
        Optimization2DX1.SetDemandPiece(7, 100, 100, 1, 7, 0)
        Optimization2DX1.SetDemandPiece(8, 100, 100, 1, 8, 0)
        Optimization2DX1.SetDemandPiece(9, 90, 90, 1, 9, 0)
        Optimization2DX1.SetDemandPiece(10, 90, 90, 1, 10, 0)
        Optimization2DX1.SetDemandPiece(11, 90, 90, 1, 11, 0)
        Optimization2DX1.SetDemandPiece(12, 110, 110, 1, 12, 0)
        Optimization2DX1.SetDemandPiece(13, 110, 110, 1, 13, 0)
 

 

Step 2. Set the sheets to cut from (also called stock or REPOSITORY pieces).

 

        Optimization2DX1.NumberOfRepositoryPieces = 3

 

        Optimization2DX1.SetRepositoryPiece(0, 300, 200, 0, 0, 0, 0, 0, 0, 0)
        Optimization2DX1.SetRepositoryPiece(0, 200, 200, 0, 0, 0, 0, 1, 0, 0)
        Optimization2DX1.SetRepositoryPiece(0, 300, 250, 0, 0, 0, 0, 2, 0, 0)
 

 

Step 3. Set other parameters.

 

        Optimization2DX1.BladeWidth = 0

        Optimization2DX1.OptimizationLevel = 50

        Optimization2DX1.RandomSeed = 1

 

 

Step 4. Start the optimization process. You may choose one out of 3 optimization types.

 

        Optimization2DX1.StartGuillotine()

 

 

Step 5. Use the OnFinish event to extract the results of optimization.

 

' this example displays only the first sheet.

' if you want to obtain information about all sheets just iterate through all of them
' sheets are indexed from 0 to TotalNumberOfUtilizedRepositoryPieces
' usually the first parameter of the methods is the sheet index

        Dim SheetIndex As Long
        SheetIndex = 0 ' this is the first sheet
        Dim bm As Bitmap = New Bitmap(Picture1.Width, Picture1.Height)
        Dim g As Graphics = Graphics.FromImage(bm)
        Dim surf_covered As Double
       

        Optimization2DX1.SurfaceCovered(SheetIndex, surf_covered, rep_Index, rep_ID)
        tbUtilizedSurface.Text = CStr(surf_covered)
        g.Clear(Color.White)

        g.DrawRectangle(myPen, 0, 0, 300, 200)' draw the repository piece
 

        Optimization2DX1.NumberOfCuttings(SheetIndex, NoCuttings, rep_Index, rep_ID)
        For i = 0 To NoCuttings - 1
                Optimization2DX1.GetCut(SheetIndex, i, tx, ty, bx, by, thick, rep_Index, rep_ID)
                g.DrawLine(myPen, tx, ty, bx, by)
        Next i

        Optimization2DX1.NumberOfUtilizedDemandPieces(SheetIndex, NoPieces, rep_Index, rep_ID)
        For i = 0 To NoPieces - 1
                Optimization2DX1.GetUtilizedDemandPiece(SheetIndex, i, tx, ty, bx, by, rotated, rep_Index, dem_Index, rep_ID, dem_ID)
                text_size = g.MeasureString(CStr(System.Math.Abs(bx - tx)) & "x" & CStr(System.Math.Abs(by - ty)), Font)
                g.DrawString(CStr(System.Math.Abs(bx - tx)) & "x" & CStr(System.Math.Abs(by - ty)), Font, Brushes.Black, (bx + tx) / 2 - text_size.Width / 2, (by + ty) / 2 - text_size.Height / 2)
        Next i

        Optimization2DX1.NumberOfWastePieces(SheetIndex, NoWastes, rep_Index, rep_ID)
        For i = 0 To NoWastes - 1
                Optimization2DX1.GetWastePiece(SheetIndex, i, tx, ty, bx, by, rep_Index, rep_ID)
                text_size = g.MeasureString("w", Font)
                g.DrawString("w", Font, Brushes.Black, (bx + tx) / 2 - text_size.Width / 2, (by + ty) / 2 - text_size.Height / 2)' draw some text in the center of the waste
        Next i
Picture1.Image = bm
 

 

Delphi 7 Example

 

Prerequisite: check our Delphi 7/ 2007 sample to see the components and their placement on form.

 

Step 1. Set pieces to be cut (also called parts or DEMAND pieces).  Take care of grain direction if you work with wood.

 


        Optimization2DX1.NumberOfDemandPieces := 14;

        Optimization2DX1.SetDemandPiece(0, 60, 40, 1, 0, 0);
        Optimization2DX1.SetDemandPiece(1, 60, 40, 1, 1, 0);
        Optimization2DX1.SetDemandPiece(2, 48, 40, 1, 2, 0);
        Optimization2DX1.SetDemandPiece(3, 60, 53, 1, 3, 0);
        Optimization2DX1.SetDemandPiece(4, 45, 45, 1, 4, 0);
        Optimization2DX1.SetDemandPiece(5, 50, 80, 1, 5, 0);
        Optimization2DX1.SetDemandPiece(6, 45, 75, 1, 6, 0);
        Optimization2DX1.SetDemandPiece(7, 100, 100, 1, 7, 0);
        Optimization2DX1.SetDemandPiece(8, 100, 100, 1, 8, 0);
        Optimization2DX1.SetDemandPiece(9, 90, 90, 1, 9, 0);
        Optimization2DX1.SetDemandPiece(10, 90, 90, 1, 10, 0);
        Optimization2DX1.SetDemandPiece(11, 90, 90, 1, 11, 0);
        Optimization2DX1.SetDemandPiece(12, 110, 110, 1, 12, 0);
        Optimization2DX1.SetDemandPiece(13, 110, 110, 1, 13, 0);

 

Step 2. Set the sheets to cut from (also called stock or REPOSITORY pieces).

 

        Optimization2DX1.NumberOfRepositoryPieces := 3;
        Optimization2DX1.SetRepositoryPiece(0, 300, 200, 0, 0, 0, 0, 0, 0, 0);
        Optimization2DX1.SetRepositoryPiece(1, 300, 200, 0, 0, 0, 0, 1, 0, 0);
        Optimization2DX1.SetRepositoryPiece(2, 300, 200, 0, 0, 0, 0, 2, 0, 0);

 

Step 3. Set other parameters.

 

        Optimization2DX1.BladeWidth := 0;

        Optimization2DX1.OptimizationLevel := 50;

        Optimization2DX1.RandomSeed := 1;

        Optimization2DX1.MaximalCutLength := 300;
 

 

Step 4. Start the optimization process.

 

        Optimization2DX1.StartGuillotine();

 

 

Step 5. Use the OnFinish event to extract the results of optimization.

 

' this example displays only the first sheet.

' if you want to obtain information about all sheets just iterate through all of them
' sheets are indexed from 0 to TotalNumberOfUtilizedRepositoryPieces
' usually the first parameter of the methods is the sheet index
 

// the variables
  var
        NoWastes, NoCuttings, NoPieces, i : integer;
        tx, ty, bx, by, thick, rotated : longint;
        poz_x, poz_y : integer;
        rep_ID, rep_Index, dem_Index, dem_ID: longint;
        sf_cov : double;
        SheetIndex : longint;
 

// the actual code

 

        Optimization2DX1.SurfaceCovered(SheetIndex, sf_cov, rep_Index, rep_ID);
        eSurfaceCovered.Text := FloatToStr(sf_cov);
        Image1.Canvas.Rectangle(0, 0, 300, 200); // clear the drawing surface

        Optimization2DX1.NumberOfCuttings(SheetIndex, NoCuttings, rep_Index, rep_ID);

        for i := 0 to NoCuttings - 1 do
        begin
            Optimization2DX1.GetCut(SheetIndex, i, tx, ty, bx, by, thick, rep_Index, rep_ID);
            Image1.Canvas.MoveTo(tx, ty);
            Image1.Canvas.LineTo(bx, by); // draw the cuttings
        end;

        // utilized rectangles
        Optimization2DX1.NumberOfUtilizedDemandPieces(SheetIndex, NoPieces, rep_Index, rep_ID);
        for i := 0 to NoPieces - 1 do
        begin
            Optimization2DX1.GetUtilizedDemandPiece(SheetIndex, i, tx, ty, bx, by, rotated, rep_Index, dem_Index, rep_ID, dem_ID); // get the position of each piece
            poz_x := (bx+tx) div 2 - Image1.Canvas.TextWidth(FloatToStr(bx-tx)+'x'+FloatToStr(by-ty)) div 2;
            poz_y := (by+ty) div 2 - Image1.Canvas.TextHeight(FloatToStr(bx-tx)+'x'+FloatToStr(by-ty)) div 2;;
            Image1.Canvas.TextOut(poz_x, poz_y, FloatToStr(abs(bx - tx)) + 'x' + FloatToStr(abs(by - ty)));
        end;

        // waste rectangles
        Optimization2DX1.NumberOfWastePieces(SheetIndex, NoWastes, rep_Index, rep_ID);
        for i := 0 to NoWastes - 1 do
        begin
            Optimization2DX1.GetWastePiece(SheetIndex, i, tx, ty, bx, by, rep_Index, rep_ID); // get each wastes
            lbWaste.AddItem(FloatToStr(abs(tx - bx)) + ' x ' + FloatToStr(abs(by - ty)), nil);

            poz_x := (bx + tx) div 2 - Image1.Canvas.TextWidth('w') div 2;
            poz_y := (by + ty) div 2 - Image1.Canvas.TextHeight('w') div 2;
            Image1.Canvas.TextOut(poz_x, poz_y, 'w'); // draw a text "w" in the middle of the waste
        end;