public MRecipe GenerateRecipe(string outputFileName) { if ( _geometriesBuffer == null || _geometriesBuffer.Keys.Count <= 0 || !File.Exists(PatternFilePath) ) { throw new Exception("Missing or Invalid pattern"); } var patternName = Path.GetFileNameWithoutExtension(outputFileName); var device = new MRecipeDevice(patternName); var recipe = new MRecipe(new MRecipePlate("Plate", device)); // add fiducials to recipe plate recipe.Plates.First().Fiducials = new ObservableCollection <MFiducialInfo>(Fiducials); if (SeperateLayers) { var dataDirectory = Path.Combine( Path.GetDirectoryName(outputFileName), $"{patternName} Data" ); if (!Directory.Exists(dataDirectory)) { Directory.CreateDirectory(dataDirectory); } foreach (var layerName in _geometriesBuffer?.Keys) { var fileName = Path.Combine( dataDirectory, $"{layerName}.dxf" ); GeometricArithmeticModule.SaveDXF(fileName, _geometriesBuffer[layerName]); var layer = new MRecipeDeviceLayer(layerName); layer.AlignmentType = AlignmentType; layer.PatternFilePath = fileName; layer.ProcessParametersFilePath = ProcessParametersFilePath; layer.TargetProcessMode = TargetProcessMode?.Name.EnglishValue; layer.TileSettings = (MTileSettings)TileSettings.Clone(); device.AddLayer(layer); } recipe.Save( Path.Combine( dataDirectory, $"{patternName}.{MRecipe.DefaultFileExtension}" ) ); } else { var layer = new MRecipeDeviceLayer(patternName); layer.AlignmentType = AlignmentType; layer.PatternFilePath = PatternFilePath; layer.ProcessParametersFilePath = ProcessParametersFilePath; layer.TargetProcessMode = TargetProcessMode?.Name.EnglishValue; layer.TileSettings = (MTileSettings)TileSettings.Clone(); device.AddLayer(layer); recipe.Save( Path.Combine( Path.GetDirectoryName(PatternFilePath), $"{patternName}.{MRecipe.DefaultFileExtension}" ) ); } // update recipe's parents recipe.UpdateParents(); return(recipe); }