public async void ImportFile()
        {
            var filters        = Helpers.ToAvaloniaFileFilter(FileFormat.AllFileFiltersAvalonia);
            var orderedFilters = new List <FileDialogFilter> {
                filters[UserSettings.Instance.General.DefaultOpenFileExtensionIndex]
            };

            for (int i = 0; i < filters.Count; i++)
            {
                if (i == UserSettings.Instance.General.DefaultOpenFileExtensionIndex)
                {
                    continue;
                }
                orderedFilters.Add(filters[i]);
            }

            var dialog = new OpenFileDialog
            {
                AllowMultiple = false,
                Filters       = orderedFilters,
                Directory     = UserSettings.Instance.General.DefaultDirectoryOpenFile
            };
            var files = await dialog.ShowAsync(ParentWindow);

            if (files is null || files.Length <= 0)
            {
                return;
            }
            if (FileFormat.FindByExtension(files[0], true) is null)
            {
                return;
            }
            Operation.FilePath = files[0];
        }
Esempio n. 2
0
        public static async Task <int> Main(params string[] args)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
            OperationProgress progress = new OperationProgress();
            Stopwatch         sw       = new Stopwatch();
            uint count       = 0;
            var  rootCommand = new RootCommand("MSLA/DLP, file analysis, repair, conversion and manipulation")
            {
                new Option(new [] { "-f", "--file" }, "Input file to read")
                {
                    IsRequired = true,
                    Argument   = new Argument <FileSystemInfo>("filepath").ExistingOnly()
                },
                new Option(new [] { "-o", "--output" }, "Output file to save the modifications, if aware, it saves to the same input file")
                {
                    Argument = new Argument <FileSystemInfo>("filepath")
                },
                new Option(new [] { "-e", "--extract" }, "Extract file content to a folder")
                {
                    Argument = new Argument <DirectoryInfo>("folder")
                },
                new Option(new [] { "-c", "--convert" }, "Converts input into a output file format by it extension")
                {
                    Argument = new Argument <FileSystemInfo>("filepath"),
                },

                new Option(new [] { "-p", "--properties" }, "Print a list of all properties/settings"),
                new Option(new [] { "-gcode" }, "Print the GCode if available"),
                new Option(new [] { "-i", "--issues" }, "Compute and print a list of all issues"),
                new Option(new [] { "-r", "--repair" }, "Attempt to repair all issues")
                {
                    Argument = new Argument <int[]>("[start layer index] [end layer index] [islands 0/1] [remove empty layers 0/1] [resin traps 0/1]"),
                },

                new Option(new [] { "-mr", "--mut-resize" }, "Resizes layer images in a X and/or Y factor, starting from 100% value")
                {
                    Argument = new Argument <decimal[]>("[x%] [y%] [start layer index] [end layer index] [fade 0/1]")
                },
                new Option(new [] { "-ms", "--mut-solidify" }, "Closes all inner holes")
                {
                    Argument = new Argument <uint[]>("[start layer index] [end layer index]")
                },
                new Option(new [] { "-me", "--mut-erode" }, "Erodes away the boundaries of foreground object")
                {
                    Argument = new Argument <uint[]>("[start iterations] [end iterations] [start layer index] [end layer index] [fade 0/1]")
                },
                new Option(new [] { "-md", "--mut-dilate" }, "It is just opposite of erosion")
                {
                    Argument = new Argument <uint[]>("[start iterations] [end iterations] [start layer index] [end layer index] [fade 0/1]")
                },
                new Option(new [] { "-mc", "--mut-close" }, "Dilation followed by Erosion")
                {
                    Argument = new Argument <uint[]>("[start iterations] [end iterations] [start layer index] [end layer index] [fade 0/1]")
                },
                new Option(new [] { "-mo", "--mut-open" }, "Erosion followed by Dilation")
                {
                    Argument = new Argument <uint[]>("[start iterations] [end iterations] [start layer index] [end layer index] [fade 0/1]")
                },
                new Option(new [] { "-mg", "--mut-gradient" }, "The difference between dilation and erosion of an image")
                {
                    Argument = new Argument <uint[]>("[kernel size] [start layer index] [end layer index] [fade 0/1]")
                },

                new Option(new [] { "-mpy", "--mut-py" }, "Performs down-sampling step of Gaussian pyramid decomposition")
                {
                    Argument = new Argument <uint[]>("[start layer index] [end layer index]")
                },
                new Option(new [] { "-mgb", "--mut-gaussian-blur" }, "Each pixel is a sum of fractions of each pixel in its neighborhood")
                {
                    Argument = new Argument <ushort[]>("[aperture] [sigmaX] [sigmaY]")
                },
                new Option(new [] { "-mmb", "--mut-median-blur" }, "Each pixel becomes the median of its surrounding pixels")
                {
                    Argument = new Argument <ushort>("[aperture]")
                },
            };

            rootCommand.Handler = CommandHandler.Create(
                (
                    FileSystemInfo file,
                    FileSystemInfo convert,
                    DirectoryInfo extract,
                    bool properties,
                    bool gcode,
                    bool issues,
                    int[] repair
                    //decimal[] mutResize
                ) =>
            {
                var fileFormat = FileFormat.FindByExtension(file.FullName, true, true);
                if (ReferenceEquals(fileFormat, null))
                {
                    Console.WriteLine($"Error: {file.FullName} is not a known nor valid format.");
                }
                else
                {
                    Console.Write($"Reading: {file}");
                    sw.Restart();
                    fileFormat.Decode(file.FullName, progress);
                    sw.Stop();
                    Console.WriteLine($", in {sw.ElapsedMilliseconds}ms");
                    Console.WriteLine("----------------------");
                    Console.WriteLine($"Layers: {fileFormat.LayerCount} x {fileFormat.LayerHeight}mm = {fileFormat.PrintHeight}mm");
                    Console.WriteLine($"Resolution: {new Size((int) fileFormat.ResolutionX, (int) fileFormat.ResolutionY)}");
                    Console.WriteLine($"AntiAlias: {fileFormat.ValidateAntiAliasingLevel()}");

                    Console.WriteLine($"Bottom Layer Count: {fileFormat.BottomLayerCount}");
                    Console.WriteLine($"Bottom Exposure Time: {fileFormat.BottomExposureTime}s");
                    Console.WriteLine($"Layer Exposure Time: {fileFormat.ExposureTime}s");
                    Console.WriteLine($"Print Time: {fileFormat.PrintTime}s");
                    Console.WriteLine($"Cost: {fileFormat.MaterialCost}$");
                    Console.WriteLine($"Resin Name: {fileFormat.MaterialName}");
                    Console.WriteLine($"Machine Name: {fileFormat.MachineName}");

                    Console.WriteLine($"Thumbnails: {fileFormat.CreatedThumbnailsCount}");
                    Console.WriteLine("----------------------");
                }

                if (!ReferenceEquals(extract, null))
                {
                    Console.Write($"Extracting to {extract.FullName}");
                    sw.Restart();
                    fileFormat.Extract(extract.FullName, true, true, progress);
                    sw.Stop();
                    Console.WriteLine($", finished in {sw.ElapsedMilliseconds}ms");
                }

                if (properties)
                {
                    count = 0;
                    Console.WriteLine("Listing all properties:");
                    Console.WriteLine("----------------------");
                    foreach (var config in fileFormat.Configs)
                    {
                        Console.WriteLine("******************************");
                        Console.WriteLine($"\t{config.GetType().Name}");
                        Console.WriteLine("******************************");
                        foreach (PropertyInfo propertyInfo in config.GetType()
                                 .GetProperties(BindingFlags.Public | BindingFlags.Instance))
                        {
                            count++;
                            if (propertyInfo.Name.Equals("Item"))
                            {
                                continue;
                            }
                            Console.WriteLine($"{propertyInfo.Name}: {propertyInfo.GetValue(config)}");
                        }
                    }

                    Console.WriteLine("----------------------");
                    Console.WriteLine($"Total properties: {count}");
                }

                if (gcode)
                {
                    if (ReferenceEquals(fileFormat.GCode, null))
                    {
                        Console.WriteLine("No GCode available");
                    }
                    else
                    {
                        Console.WriteLine("----------------------");
                        Console.WriteLine(fileFormat.GCode);
                        Console.WriteLine("----------------------");
                        Console.WriteLine($"Total lines: {fileFormat.GCode.Length}");
                    }
                }

                if (issues)
                {
                    Console.WriteLine("Computing Issues, please wait.");
                    sw.Restart();
                    var issueList = fileFormat.LayerManager.GetAllIssues(null, null, null, null, true, null, progress);
                    sw.Stop();

                    Console.WriteLine("Issues:");
                    Console.WriteLine("----------------------");
                    count = 0;
                    foreach (var issue in issueList)
                    {
                        Console.WriteLine(issue);
                        count++;
                    }

                    /*for (uint layerIndex = 0; layerIndex < fileFormat.LayerCount; layerIndex++)
                     * {
                     *  if(!issuesDict.TryGetValue(layerIndex, out var list)) continue;
                     *  foreach (var issue in list)
                     *  {
                     *      Console.WriteLine(issue);
                     *      count++;
                     *  }
                     * }*/

                    Console.WriteLine("----------------------");
                    Console.WriteLine($"Total Issues: {count} in {sw.ElapsedMilliseconds}ms");
                }

                if (!ReferenceEquals(convert, null))
                {
                    var fileConvert = FileFormat.FindByExtension(convert.FullName, true, true);
                    if (ReferenceEquals(fileFormat, null))
                    {
                        Console.WriteLine($"Error: {convert.FullName} is not a known nor valid format.");
                    }
                    else
                    {
                        Console.WriteLine($"Converting {fileFormat.GetType().Name} to {fileConvert.GetType().Name}: {convert.Name}");

                        try
                        {
                            sw.Restart();
                            fileFormat.Convert(fileConvert, convert.FullName, progress);
                            sw.Stop();
                            Console.WriteLine($"Convertion done in {sw.ElapsedMilliseconds}ms");
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e);
                        }
                    }
                }

                if (!ReferenceEquals(repair, null))
                {
                    uint layerStartIndex   = (uint)(repair.Length >= 1 ? Math.Max(0, repair[0]) : 0);
                    uint layerEndIndex     = repair.Length >= 2 ? (uint)repair[1].Clamp(0, (int)(fileFormat.LayerCount - 1)) : fileFormat.LayerCount - 1;
                    bool repairIslands     = repair.Length < 3 || repair[2] > 0 || repair[2] < 0;
                    bool removeEmptyLayers = repair.Length < 4 || repair[3] > 0 || repair[3] < 0;
                    bool repairResinTraps  = repair.Length < 5 || repair[4] > 0 || repair[4] < 0;

                    //fileFormat.LayerManager.RepairLayers(layerStartIndex, layerEndIndex, 2, 1, 4, repairIslands, removeEmptyLayers, repairResinTraps, null, progress);
                }
            });


            //await rootCommand.InvokeAsync(args);
            await rootCommand.InvokeAsync("-f body_Tough0.1mm_SL1_5h16m_HOLLOW_DRAIN.sl1 -r -1");

            return(1);
        }
Esempio n. 3
0
        Models.File ExtractFileInfo(GalleryContext db, Pack pack, Extractors.ExtractFileInfo fileInfo, Func <Stream> getStream)
        {
            var fileName = Scanner.NormalizedPath(fileInfo.FileName).TrimStart('\\');
            var file     = pack.GetFileByName(fileName);
            var name     = CanonicalName(fileName.Replace("\\", "/"));

            while (pack.Files.Any(r => r.Name == name && !ReferenceEquals(r, file)))
            {
                name += "_";
            }
            file.Name  = name;
            file.Order = fileInfo.Order++;
            //updateStatus(string.Format("Processing file '{0}'", file.FileName));
            var format = FileFormat.FindByExtension(Path.GetExtension(file.NativeFileName));

            if (format != null)
            {
                file.Format = format.Name;
                file.Type   = format.Type.Name;
            }
            else
            {
                file.Format = "ansi";
                file.Type   = FileType.Character.Name;
            }

            if (file.Type == FileType.Character.Name)
            {
                if (false && file.Content == null)
                {
                    using (var stream = getStream())
                    {
                        using (var outStream = new MemoryStream())
                        {
                            var parameters = new PabloDraw.ConvertParameters
                            {
                                InputStream  = stream,
                                InputFormat  = file.Format,
                                OutputFormat = "ascii",
                                OutputStream = outStream
                            };

                            Global.PabloEngine.Convert(parameters);
                            outStream.Position = 0;
                            using (var reader = new StreamReader(outStream, Encoding.GetEncoding(437)))
                            {
                                var content = file.Content ?? (file.Content = new FileContent {
                                    File = file
                                });
                                content.Text = reader.ReadToEnd().Replace((char)0, ' ');
                            }
                        }
                    }
                }
            }
            else if (file.Content != null)
            {
                file.Content = null;
            }

            return(file);
        }