コード例 #1
0
        public List <Script> GetScripts()
        {
            List <Script> result = new List <Script>();

            FilterScriptService manager = new FilterScriptService();
            var filterScripts           = manager.ReadFilterScripts(_appSettings.ScriptDirectory);

            if (filterScripts != null && filterScripts.Any())
            {
                foreach (var filterScript in filterScripts)
                {
                    Script s = new Script();
                    s.FileName    = filterScript.Filename;
                    s.Description = filterScript.name;
                    if (filterScript.Items != null)
                    {
                        s.LstFilters = new List <FilterScriptParameter>();
                        foreach (var item in filterScript.Items)
                        {
                            FilterScriptParameter fsp = new FilterScriptParameter();

                            if (item.GetType() == typeof(FilterScriptXmlfilter))
                            {
                                var filterScriptXmlItem = (FilterScriptXmlfilter)item;
                                fsp.LstParameters = new List <ScriptParameter>();
                                fsp.Name          = filterScriptXmlItem.name;
                                if (filterScriptXmlItem.xmlparam != null)
                                {
                                    foreach (var param in filterScriptXmlItem?.xmlparam)
                                    {
                                        ScriptParameter p = new ScriptParameter();
                                        p.DefaultValue = param.value;
                                        p.Name         = param.name;
                                        p.Type         = ScriptParameterType.Text;
                                        fsp.LstParameters.Add(p);
                                    }
                                }

                                s.LstFilters.Add(fsp);
                            }

                            if (item.GetType() == typeof(FilterScriptFilter))
                            {
                                var filterScriptXmlItem = (FilterScriptFilter)item;
                                fsp.LstParameters = new List <ScriptParameter>();
                                fsp.Name          = filterScriptXmlItem.name;
                                if (filterScriptXmlItem.Param != null)
                                {
                                    foreach (var param in filterScriptXmlItem?.Param)
                                    {
                                        ScriptParameter p = new ScriptParameter();
                                        p.Description  = param.description;
                                        p.DefaultValue = param.value;
                                        p.Name         = param.name;
                                        p.Tooltip      = param.tooltip;
                                        p.Type         = ParameterConverter.ConvertParameter(param.type);
                                        fsp.LstParameters.Add(p);
                                    }
                                }

                                s.LstFilters.Add(fsp);
                            }
                        }
                    }

                    result.Add(s);
                }
            }

            return(result);
        }
コード例 #2
0
        public async Task <JobResult> UploadJob(IFormFile file, [FromForm] string fScriptParams, [FromForm] string scriptFilename, [FromForm] string outputFileFormat = "1")
        {
            //Result of the job
            JobResult res = new JobResult();

            if (String.IsNullOrEmpty(outputFileFormat))
            {
                outputFileFormat = "1"; //Standard OBJ
            }
            try
            {
                List <ScriptParameterFilter> filterScriptParams = new List <ScriptParameterFilter>();

                //Deserialize parameters for the script
                if (fScriptParams != null)
                {
                    filterScriptParams = JsonConvert.DeserializeObject <List <ScriptParameterFilter> >(fScriptParams);
                }

                string folderName  = _appSettings.UploadDirectoryName;
                string webRootPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
                string newPath     = Path.Combine(webRootPath, folderName);

                if (!Directory.Exists(newPath))
                {
                    try
                    {
                        //Create direcotry if it doesn't exits
                        Directory.CreateDirectory(newPath);
                    }
                    catch (Exception e)
                    {
                        res.ResultCode = new JobResultCode()
                        {
                            Message = e.ToString(), Number = JobResultNumber.OtherError
                        };
                    }
                }

                if (file.Length > 0) //Check if filelength greater than zero
                {
                    //Remove apostroph
                    string fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.ToString().Trim('"');

                    string fullPath = Path.Combine(newPath, fileName);

                    try
                    {
                        using (var stream = new FileStream(fullPath, FileMode.Create))
                        {
                            file.CopyTo(stream);
                        }
                    }
                    catch (Exception e)
                    {
                        res.ResultCode = new JobResultCode()
                        {
                            Message = e.ToString(), Number = JobResultNumber.OtherError
                        };
                    }

                    //Generates a ramdom job ID
                    string jobId = Guid.NewGuid().ToString("N");
                    res.JobId = jobId;

                    string pathToWorkJob = Path.Combine(_appSettings.WorkingDirectory, jobId);

                    try
                    {
                        Directory.CreateDirectory(pathToWorkJob);
                    }
                    catch (Exception e)
                    {
                        res.ResultCode = new JobResultCode()
                        {
                            Message = e.ToString(), Number = JobResultNumber.OtherError
                        };
                        return(res);
                    }

                    var workJobFileInput = Path.Combine(pathToWorkJob, CorrectFileName(fileName));

                    FFile.Copy(fullPath, workJobFileInput);
                    string workJobScript = Path.Combine(pathToWorkJob, scriptFilename);
                    FFile.Copy(Path.Combine(_appSettings.ScriptDirectory, scriptFilename), workJobScript);

                    FilterScriptService fManager = new FilterScriptService();
                    var fScript = fManager.ReadFilterScript(workJobScript);
                    foreach (var filter in filterScriptParams)
                    {
                        var filterScriptXml = fScript.Items.FirstOrDefault(a => a.GetType() == typeof(FilterScriptXmlfilter) && ((FilterScriptXmlfilter)a).name == filter.FilterName);
                        var filterScript    = fScript.Items.FirstOrDefault(a => a.GetType() == typeof(FilterScriptFilter) && ((FilterScriptFilter)a).name == filter.FilterName);

                        if (filterScript != null)
                        {
                            foreach (var filterParameter in filter.FilterParameter)
                            {
                                var param = ((FilterScriptFilter)filterScript).Param?.ToList().FirstOrDefault(a => a.name == filterParameter.Key);
                                if (param != null)
                                {
                                    param.value = filterParameter.Value;
                                }
                            }
                        }

                        if (filterScriptXml != null)
                        {
                            foreach (var filterParameter in filter.FilterParameter)
                            {
                                var param = ((FilterScriptXmlfilter)filterScriptXml).xmlparam?.ToList().FirstOrDefault(a => a.name == filterParameter.Key);
                                if (param != null)
                                {
                                    param.value = filterParameter.Value;
                                }
                            }
                        }
                    }

                    fManager.WriteFilterScript(workJobScript, fScript);
                    var index = CheckFileExtension(workJobFileInput);

                    if (index < 0) //Filetype is not supported
                    {
                        res.ResultCode = new JobResultCode()
                        {
                            Message = "Filetype is not supported. See supported filetypes.",
                            Number  = JobResultNumber.FiletypeNotSupported
                        };
                        return(res);
                    }

                    var oFileF = int.Parse(outputFileFormat);

                    //If gltf, do job with obj an then convert it to gltf
                    if (outputFileFormat == "5")
                    {
                        oFileF = 1;
                    }

                    string jobResultFilename = $"{workJobFileInput.Substring(0, index)}{_appSettings.ResultFileNameEnding}.{ParameterController.LstSupportedExportFormats.FirstOrDefault(a => a.Id == oFileF).Extension}";

                    var    outputFile       = Path.Combine(pathToWorkJob, jobResultFilename);
                    string filterOutputFile = Path.Combine(pathToWorkJob, $"{_appSettings.FilterOutputFilename}.txt");

                    MeshLabService mService = new MeshLabService();

                    try
                    {
                        mService.StartJob(filterOutputFile, workJobFileInput, workJobScript, outputFile, pathToWorkJob, true, _appSettings.MeshLabDirectory);
                    }
                    catch (Exception e)
                    {
                        res.ResultCode = new JobResultCode()
                        {
                            Number  = JobResultNumber.JobFailed,
                            Message = e.ToString()
                        };
                        return(res);
                    }

                    if (!FFile.Exists(outputFile))
                    {
                        res.ResultCode = new JobResultCode()
                        {
                            Number  = JobResultNumber.JobFailed,
                            Message = FFile.ReadAllText(filterOutputFile)
                        };
                        return(res);
                    }

                    if (outputFileFormat == "5")
                    {
                        try
                        {
                            using (AssimpContext cont = new AssimpContext())
                            {
                                var tmpDir = Path.Combine(pathToWorkJob, "output");
                                Directory.CreateDirectory(tmpDir);

                                var x = cont.ConvertFromFileToFile(jobResultFilename, Path.Combine(tmpDir, "output.gltf"), "gltf2");
                            }
                        }
                        catch (Exception) {}
                    }

                    res.FileResultName = Path.GetFileName(jobResultFilename);

                    var      hausdorff = -1.0;
                    MeshInfo meshInfo  = null;

                    if (FFile.Exists(filterOutputFile))
                    {
                        var foFile = FFile.ReadAllText(filterOutputFile);
                        hausdorff = mService.ParseHausdorff(foFile);
                        meshInfo  = mService.ParseMeshInfo(foFile);
                    }

                    FileInfo fiResult   = new FileInfo(outputFile);
                    FileInfo fiOriginal = new FileInfo(workJobFileInput);

                    res.AdditionalData = new Dictionary <string, string>();
                    if (hausdorff > 0)
                    {
                        res.AdditionalData.Add("Hausdorff", hausdorff.ToString(CultureInfo.InvariantCulture));
                    }

                    try
                    {
                        using (AssimpContext importer = new AssimpContext())
                        {
                            var  model     = importer.ImportFile(workJobFileInput);
                            long cntVertex = 0;
                            long cntFaces  = 0;

                            foreach (var modelMesh in model.Meshes)
                            {
                                cntVertex += modelMesh.VertexCount;
                                cntFaces  += modelMesh.FaceCount;
                            }

                            res.AdditionalData.Add("Number of Vertices of original model", cntVertex.ToString("N0"));
                            res.AdditionalData.Add("Number of Faces of original model", cntFaces.ToString("N0"));
                            importer.Dispose();
                        }
                    }
                    catch (Exception)
                    {}

                    try
                    {
                        using (AssimpContext importer = new AssimpContext())
                        {
                            var  model     = importer.ImportFile(outputFile);
                            long cntVertex = 0;
                            long cntFaces  = 0;

                            foreach (var modelMesh in model.Meshes)
                            {
                                cntVertex += modelMesh.VertexCount;
                                cntFaces  += modelMesh.FaceCount;
                            }

                            res.AdditionalData.Add("Number of Vertices of result model", cntVertex.ToString("N0"));
                            res.AdditionalData.Add("Number of Faces of result model", cntFaces.ToString("N0"));
                            importer.Dispose();
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }


                    res.FileInputSize = GetFileSizeInBytes(fiOriginal.Length);
                    if (outputFileFormat == "5")
                    {
                        try
                        {
                            using (AssimpContext cont = new AssimpContext())
                            {
                                var tmpDir = Path.Combine(pathToWorkJob, "output");
                                ZipFile.CreateFromDirectory(tmpDir, Path.Combine(pathToWorkJob, "output.zip"));
                                jobResultFilename  = Path.Combine(pathToWorkJob, "output.zip");
                                res.FileResultName = "output.zip";
                                DirectoryInfo info      = new DirectoryInfo(tmpDir);
                                long          totalSize = info.EnumerateFiles().Sum(f => f.Length);
                                res.FileResultSize = GetFileSizeInBytes(totalSize);
                                res.ReducedBy      = (100.0 - (double)totalSize / fiOriginal.Length * 100.0).ToString("F") + "%";
                            }
                        }
                        catch (Exception) { }
                    }
                    else
                    {
                        res.FileResultSize = GetFileSizeInBytes(fiResult.Length);
                        res.ReducedBy      = (100.0 - (double)fiResult.Length / fiOriginal.Length * 100.0).ToString("F") + "%";
                    }

                    res.ReducedBy = (100.0 - (double)fiResult.Length / fiOriginal.Length * 100.0).ToString("F") + "%";

                    res.ResultCode = new JobResultCode()
                    {
                        Message = "Success",
                        Number  = JobResultNumber.Success
                    };

                    return(res);
                }
                else
                {
                    res.ResultCode = new JobResultCode()
                    {
                        Number  = JobResultNumber.FileRequired,
                        Message = "File is required!"
                    };
                    return(res);
                }
            }
            catch (Exception ex)
            {
                res.ResultCode = new JobResultCode()
                {
                    Number  = JobResultNumber.OtherError,
                    Message = ex.ToString()
                };
                return(res);
            }
        }