Hide menu
Loading...
Searching...
No Matches
nesting/nesting_computer/nesting_computer.java

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.
//
// ****************************************************************************
import cadex.*;
import cadex.Drawing.*;
import cadex.Geom.*;
import java.util.*;
public class nesting_computer {
static {
try {
System.loadLibrary("CadExMTK");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load.\n" + e);
System.exit(1);
}
}
public static void main(String[] args) {
String aKey = MTKLicenseKey.Value();
// Activate the license (aKey must be defined in MTKLicenseKey.java)
if (!LicenseManager.Activate(aKey)) {
System.out.println("Failed to activate Manufacturing Toolkit license.");
System.exit(1);
}
Nesting_Computer aComputer = new Nesting_Computer();
// Configuring nesting parameters
Nesting_ComputerParameters 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);
List<Pattern> aPatterns = Arrays.asList(
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
for (Pattern aPattern : aPatterns) {
aComputer.AddPattern(aPattern.myDrawingView, aPattern.myNumber);
}
// Start the Nesting process
Nesting_Data aData = aComputer.Perform();
// Print nesting information
PrintNestingInfo(aData);
}
static class Pattern {
public Pattern(CurveSet theShape, String theName, int theNumber) {
myDrawingView.Add(theShape);
myName = theName;
myNumber = theNumber;
}
public View myDrawingView = new View();
public String myName;
public int myNumber;
}
static CurveSet CreateRectangle(double theWidth, double theHeight) {
CurveSet aRectangle = new CurveSet();
Line2d aL1 = new Line2d(new Point2d(0, 0), new Direction2d(1, 0));
aL1.SetTrim(0, theWidth);
Line2d aL2 = new Line2d(new Point2d(theWidth, 0), new Direction2d(0, 1));
aL2.SetTrim(0, theHeight);
Line2d aL3 = new Line2d(new Point2d(theWidth, theHeight), new Direction2d(-1, 0));
aL3.SetTrim(0, theWidth);
Line2d 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) {
System.out.println("------- Patterns Info -------");
for (Pattern aPattern : thePatterns) {
System.out.println(aPattern.myName + ": " + aPattern.myNumber);
}
}
static void PrintNestingInfo(Nesting_Data theData) {
System.out.println();
System.out.println("------- Nesting Info -------");
double aTotalEfficiency = 0.0;
double aTotalScrap = 0.0;
List<Nesting_Sheet> aSheets = theData.Sheets();
for (int i = 0; i < aSheets.size(); ++i) {
System.out.println("# Sheet " + i);
System.out.println(" Nested Parts: " + aSheets.get(i).NestedParts());
aTotalScrap += aSheets.get(i).Scrap();
System.out.println(" Scrap: " + aSheets.get(i).Scrap() * 100 + "%");
aTotalEfficiency += aSheets.get(i).PlacementEfficiency();
System.out.println(" Placement Efficiency: " + aSheets.get(i).PlacementEfficiency() * 100 + "%");
System.out.println();
}
System.out.println("Average Scrap: " + (aTotalScrap / aSheets.size() * 100) + "%");
System.out.println("Average Placement Efficiency: " + (aTotalEfficiency / aSheets.size() * 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.