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); }
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); } }