protected void Compute() { if (null == HAnalysis) { return; } HAnalysis.ClearContent(); HAnalysis.AddContent(ListContentItems); LoadContainer(); HAnalysis.ConstraintSet = ConstraintSet; if (!HAnalysis.IsValid) { return; } try { HSolver solver = new HSolver(); Solutions = solver.BuildSolutions(HAnalysis); } catch (InvalidOperationException ex) { _log.WarnFormat("Solver -> {0}", ex.Message); } catch (Exception ex) { _log.Error(ex.ToString()); } }
public static bool GetHSolutionPart( List <ContentItem> items, PalletProperties palletProperties, HConstraintSetPallet constraintSet, int solIndex, int binIndex, Vector3D cameraPosition, bool showCotations, float fontSizeRatio, Size sz, ref double weightLoad, ref double weightTotal, ref Vector3D bbLoad, ref Vector3D bbGlob, ref byte[] imageBytes, ref string[] errors ) { List <string> lErrors = new List <string>(); try { var analysis = new HAnalysisPallet(null) { Pallet = palletProperties, ConstraintSet = constraintSet, Content = items, }; HSolver solver = new HSolver(); var solutions = solver.BuildSolutions(analysis); if (solIndex < solutions.Count) { var sol = solutions[solIndex]; bbGlob = sol.BBoxGlobal(binIndex).DimensionsVec; bbLoad = sol.BBoxLoad(binIndex).DimensionsVec; weightLoad = sol.LoadWeight(binIndex); weightTotal = sol.Weight(binIndex); Graphics3DImage graphics = new Graphics3DImage(sz) { FontSizeRatio = fontSizeRatio, CameraPosition = cameraPosition, ShowDimensions = showCotations }; ViewerHSolution sv = new ViewerHSolution(sol, binIndex); sv.Draw(graphics, Transform3D.Identity); graphics.Flush(); Bitmap bmp = graphics.Bitmap; ImageConverter converter = new ImageConverter(); imageBytes = (byte[])converter.ConvertTo(bmp, typeof(byte[])); } else { lErrors.Add("No valid solution found"); } } catch (Exception ex) { lErrors.Add(ex.Message); } errors = lErrors.ToArray(); return(0 == lErrors.Count); }
public static bool GetHSolutionBestCasePallet( List <ContentItem> items, PalletProperties palletProperties, HConstraintSetPallet constraintSet, Vector3D cameraPosition, bool showCotations, float fontSizeRatio, Size sz, ref int palletCount, ref string algorithm, ref byte[] imageBytes, ref string[] errors) { List <string> lErrors = new List <string>(); try { var analysis = new HAnalysisPallet(null) { Pallet = palletProperties, ConstraintSet = constraintSet, Content = items, }; HSolver solver = new HSolver(); var solutions = solver.BuildSolutions(analysis); // best solution is most likely : 5 if (solutions.Count > 0) { var sol = solutions[solutions.Count - 1]; algorithm = sol.Algorithm; palletCount = sol.SolItemCount; Graphics3DImage graphics = new Graphics3DImage(sz) { FontSizeRatio = fontSizeRatio, CameraPosition = cameraPosition, ShowDimensions = showCotations }; ViewerHSolution sv = new ViewerHSolution(sol, 0); sv.Draw(graphics, Transform3D.Identity); graphics.Flush(); Bitmap bmp = graphics.Bitmap; ImageConverter converter = new ImageConverter(); imageBytes = (byte[])converter.ConvertTo(bmp, typeof(byte[])); } else { lErrors.Add("No valid solution found"); } } catch (Exception ex) { lErrors.Add(ex.Message); } errors = lErrors.ToArray(); return(0 == lErrors.Count); }
static void Main(string[] args) { var dataSource = Config.GetDataSource(); var dataset = new DataPreparer(dataSource).GetCustomerAndVehicleData(); Solution solution = new Solution(); switch (Config.GetSolverType()) { case "GSolver": solution = new GSolver(dataset).Run(); break; case "BSolver": solution = new BSolver(dataset).Run(); break; case "HSolver": solution = new HSolver(dataset).Run(); break; case "SASolver": solution = new SASolver(dataset).Run(); break; default: break; } var outputPathString = Config.GetFileOperation().OutputPath + Config.GetFileOperation().OutputName; using StreamWriter file = File.CreateText(outputPathString); JsonSerializer serializer = new JsonSerializer(); serializer.Serialize(file, solution); }
public static bool GetHSolutionBestCasePallet( List <ContentItem> items, PalletProperties palletProperties, HConstraintSetPallet constraintSet, Vector3D cameraPosition, bool showCotations, float fontSizeRatio, Size sz, ref int palletCount, ref string algorithm, ref byte[] imageBytes, ref string[] errors) { List <string> lErrors = new List <string>(); try { var analysis = new HAnalysisPallet(null) { Pallet = palletProperties, ConstraintSet = constraintSet, Content = items, }; HSolver solver = new HSolver(); var solutions = solver.BuildSolutions(analysis); // get first solution (Sharp3DBin packing) if (solutions.Count > 0) { var sol = solutions[0]; algorithm = sol.Algorithm; palletCount = sol.SolItemCount; var tileSize = ImageTiling.TileSize(sz, palletCount); var listTiles = new List <Bitmap>(); for (int i = 0; i < palletCount; ++i) { Graphics3DImage graphics = new Graphics3DImage(tileSize) { FontSizeRatio = fontSizeRatio, CameraPosition = cameraPosition, ShowDimensions = showCotations }; ViewerHSolution sv = new ViewerHSolution(sol, i); sv.Draw(graphics, Transform3D.Identity); graphics.Flush(); listTiles.Add(graphics.Bitmap); } var bmp = ImageTiling.TileImage(sz, listTiles); ImageConverter converter = new ImageConverter(); imageBytes = (byte[])converter.ConvertTo(bmp, typeof(byte[])); } else { lErrors.Add("No valid solution found"); } } catch (Exception ex) { lErrors.Add(ex.Message); } errors = lErrors.ToArray(); return(0 == lErrors.Count); }
static void Main(string[] args) { string outputDir = @"D:\GitHub\StackBuilder\Sources\Test\treeDiM.StackBuilder.Engine.Heterogeneous3D.Test\Output"; DirectoryInfo directory = new DirectoryInfo(outputDir); directory.Empty(); var palletProperties = new PalletProperties(null, "EUR2", 1200.0, 1000.0, 140.0) { Color = Color.Yellow, Weight = 22.0 }; bool allowXY = false; var items = new List <ContentItem> { new ContentItem(new BoxProperties(null, 190, 200, 420, 10.0, Color.Red), 2) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, new ContentItem(new BoxProperties(null, 250, 200, 300, 10.0, Color.Blue), 1) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, new ContentItem(new BoxProperties(null, 250, 200, 250, 10.0, Color.Green), 1) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, new ContentItem(new BoxProperties(null, 250, 200, 290, 10.0, Color.Green), 1) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, new ContentItem(new BoxProperties(null, 80, 200, 210, 10.0, Color.White), 4) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, // 9 new ContentItem(new BoxProperties(null, 360, 460, 840, 10.0, Color.Purple), 1) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, new ContentItem(new BoxProperties(null, 160, 460, 100, 10.0, Color.AliceBlue), 2) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, new ContentItem(new BoxProperties(null, 160, 460, 320, 10.0, Color.Beige), 2) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, new ContentItem(new BoxProperties(null, 200, 300, 150, 10.0, Color.Brown), 1) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, new ContentItem(new BoxProperties(null, 200, 300, 690, 10.0, Color.Chartreuse), 1) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, // 7 new ContentItem(new BoxProperties(null, 200, 300, 210, 10.0, Color.Cyan), 4) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, new ContentItem(new BoxProperties(null, 120, 300, 70, 10.0, Color.LightPink), 12) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, new ContentItem(new BoxProperties(null, 520, 600, 420, 10.0, Color.LightGray), 2) { AllowedOrientations = new bool[] { allowXY, allowXY, true }, PriorityLevel = 0 }, new ContentItem(new BoxProperties(null, 260, 360, 210, 10.0, Color.Yellow), 4) { AllowedOrientations = new bool[] { allowXY, allowXY, true } }, new ContentItem(new BoxProperties(null, 260, 360, 840, 10.0, Color.Orange), 1) { AllowedOrientations = new bool[] { allowXY, allowXY, true } } // 23 }; var sortedItems = items.OrderBy(i => i.Pack.OuterDimensions.X * i.Pack.OuterDimensions.Y * i.Number).ToList(); var constraintSet = new HConstraintSetPallet() { MaximumHeight = 1300.0 }; var analysis = new HAnalysisPallet(null) { Pallet = palletProperties, ConstraintSet = constraintSet, Content = sortedItems }; HSolver solver = new HSolver(); var solutions = solver.BuildSolutions(analysis); int solIndex = 0; foreach (var sol in solutions) { Vector3D[] orientations = new Vector3D[] { Graphics3D.Corner_0, Graphics3D.Corner_90, Graphics3D.Corner_180, Graphics3D.Corner_270 }; for (int iOrientation = 0; iOrientation < 4; ++iOrientation) { List <Bitmap> images = new List <Bitmap>(); for (int binIndex = 0; binIndex < sol.SolItemCount; ++binIndex) { Vector3D bbGlob = sol.BBoxGlobal(binIndex).DimensionsVec; Vector3D bbLoad = sol.BBoxLoad(binIndex).DimensionsVec; double weightLoad = sol.LoadWeight(binIndex); double weightTotal = sol.Weight(binIndex); Graphics3DImage graphics = new Graphics3DImage(ImageTiling.TileSize(new Size(4000, 4000), sol.SolItemCount)) { FontSizeRatio = 0.02f, CameraPosition = orientations[iOrientation], ShowDimensions = false }; ViewerHSolution sv = new ViewerHSolution(sol, binIndex); sv.Draw(graphics, Transform3D.Identity); graphics.Flush(); images.Add(graphics.Bitmap); } Bitmap gBmp = ImageTiling.TileImage(new Size(2000, 2000), images); string sbSolutionName = $"sol_{sol.Algorithm}_{solIndex}_{iOrientation}.png"; gBmp.Save(Path.Combine(outputDir, sbSolutionName)); Console.WriteLine($"Saving {sbSolutionName}..."); } ++solIndex; } }