Hide menu
Loading...
Searching...
No Matches
nesting/nesting_computer/Program.cs

Refer to the Nesting Example

// ****************************************************************************
// $Id$
//
// Copyright (C) 2008-2014, Roman Lygin. All rights reserved.
// Copyright (C) 2014-2025, CADEX. All rights reserved.
//
// This file is part of the Manufacturing Toolkit software.
//
// You may use this file under the terms of the BSD license as follows:
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// ****************************************************************************
using cadex;
using cadex.Geom;
using System;
using System.Collections.Generic;
namespace nesting_computer
{
class Pattern
{
public Pattern(CurveSet theShape, string theName, uint theNumber)
{
myDrawingView.Add(theShape);
myName = theName;
myNumber = theNumber;
}
public View myDrawingView = new View();
public string myName;
public uint myNumber;
}
class Program
{
static int Main()
{
string aKey = MTKLicenseKey.Value();
// Activate the license (aKey must be defined in mtk_license.cs)
if (!LicenseManager.Activate(aKey))
{
Console.WriteLine("Failed to activate Manufacturing Toolkit license.");
return 1;
}
var aComputer = new Nesting_Computer();
// Configuring nesting parameters
var aParams = new Nesting_ComputerParameters();
aParams.SetIterationCount(10); // Number of iterations for optimization process
aParams.SetGenerationSize(10); // Initial count of random layouts; larger values may improve optimization
aParams.SetMutationRate(0.5); // Probability of random shape rearrangement to escape local optima
aParams.SetPartToPartDistance(1.0); // Minimum distance between shapes
aParams.SetPartToSheetBoundaryDistance(1.0); // Minimum distance between shapes and sheet edges
aParams.SetMirrorControl(false); // Allows mirrored shapes to improve layout efficiency
aParams.SetRotationCount(4); // Number of allowed rotation angles (e.g., 4 allows 0°, 90°, 180°, and 270°)
aParams.SetCurveTolerance(10); // Side length of squares used for polygonal approximation of curves
aComputer.SetParameters(aParams);
// Define material size and number (e.g., 1 sheets of 100x100 mm)
aComputer.AddMaterial(100.0, 100.0, 1);
var aPatterns = new List<Pattern>
{
new Pattern(CreateRectangle(50.0, 50.0), "Rectangle 50x50", 1),
new Pattern(CreateRectangle(20.0, 10.0), "Rectangle 20x10", 10)
};
PrintPatternsInfo(aPatterns);
// Load patterns into the computer
foreach (var aPattern in aPatterns)
{
aComputer.AddPattern(aPattern.myDrawingView, aPattern.myNumber);
}
// Start the Nesting process
Nesting_Data aData = aComputer.Perform();
// Print nesting information
PrintNestingInfo(aData);
return 0;
}
static CurveSet CreateRectangle(double theWidth, double theHeight)
{
var aRectangle= new CurveSet();
var aL1 = new Line2d(new Point2d(0, 0), new Direction2d(1, 0));
aL1.SetTrim(0, theWidth);
var aL2 = new Line2d(new Point2d(theWidth, 0), new Direction2d(0, 1));
aL2.SetTrim(0, theHeight);
var aL3 = new Line2d(new Point2d(theWidth, theHeight), new Direction2d(-1, 0));
aL3.SetTrim(0, theWidth);
var aL4 = new Line2d(new Point2d(0, theHeight), new Direction2d(0, -1));
aL4.SetTrim(0, theHeight);
aRectangle.AddCurve(aL1);
aRectangle.AddCurve(aL2);
aRectangle.AddCurve(aL3);
aRectangle.AddCurve(aL4);
return aRectangle;
}
static void PrintPatternsInfo(List<Pattern> thePatterns)
{
Console.WriteLine("------- Patterns Info -------");
foreach (var aPattern in thePatterns)
{
Console.WriteLine($"{aPattern.myName}: {aPattern.myNumber}");
}
}
static void PrintNestingInfo(Nesting_Data theData)
{
Console.WriteLine();
Console.WriteLine("------- Nesting Info -------");
double aTotalEfficiency = 0.0;
double aTotalScrap = 0.0;
var aSheets = theData.Sheets();
for (int i = 0; i < aSheets.Count; ++i)
{
Console.WriteLine($"# Sheet {i}");
Console.WriteLine($" Nested Parts: {aSheets[i].NestedParts()}");
aTotalScrap += aSheets[i].Scrap();
Console.WriteLine($" Scrap: {aSheets[i].Scrap() * 100}%");
aTotalEfficiency += aSheets[i].PlacementEfficiency();
Console.WriteLine($" Placement Efficiency: {aSheets[i].PlacementEfficiency() * 100}%");
Console.WriteLine();
}
Console.WriteLine($"Average Scrap: {aTotalScrap / aSheets.Count * 100}%");
Console.WriteLine($"Average Placement Efficiency: {aTotalEfficiency / aSheets.Count * 100}%");
}
}
}
Contains classes, types and enums related to drawings.
Contains classes, types, enums, and functions related to geometric entities.
Contains classes, namespaces, enums, types, and global functions related to Manufacturing Toolkit.