Извлечь активы из PLY через C#
Создавайте собственные приложения .NET для извлечения ресурсов из файлов PLY с помощью серверных API.
Как извлечь активы из файла PLY с помощью C#
Чтобы извлечь активы из файла PLY, мы будем использовать
API — многофункциональная, мощная и простая в использовании платформа API для C#, предназначенная для извлечения активов. Открыть
менеджер пакетов, поиск Aspose.3D и установить. Вы также можете использовать следующую команду из консоли диспетчера пакетов.
Команда консоли диспетчера пакетов
PM> Install-Package Aspose.3D
Действия по извлечению активов из PLY через C#
Aspose.3D позволяет разработчикам легко извлекать активы из файла PLY, написав всего несколько строк кода.
- Загрузите файл PLY через конструктор класса Scene- Создайте объект формата zip-файла в качестве формата выходного файла- Создайте класс архива и обработайте класс активов извлечения- Вызовите метод Extract и сохраните файл
Системные Требования
Aspose.3D for .NET поддерживается во всех основных операционных системах. Просто убедитесь, что у вас есть следующие предпосылки.
- Microsoft Windows или совместимая ОС с .NET Framework, .NET Core, Mono- Среда разработки, такая как Microsoft Visual Studio- Aspose.3D for .NET упоминается в вашем проекте
C# код для извлечения ресурсов из PLY
//Исходные файлы, которые необходимо извлечь активы
string file = "template.ply";
Scene scene = new Scene(file);
//Выходные данные представлены в формате сжатого файла, а каталог представляет собой имя существующей папки.
var zipOutput = Path.Combine("Directory", "OutputFile.zip");
using var output = new FileStream(zipOutput, FileMode.Create);
using var za = new Zip(output);
//Вызовите метод Extract для выполнения операций извлечения ресурсов.
Extract(scene,za,true);
//Вызываемый метод извлечения, параметр текстуры указывает: следует ли извлекать текстуру
private void Extract(Scene scene, Zip za,bool texture)
{
var extractor = new Extractor(za,texture);
extractor.Extract(scene);
}
//Создайте класс обработки сжатых файлов
class Zip : IDisposable
{
private ZipArchive archive;
private HashSet<string> entries = new HashSet<string>();
public Zip(Stream stream)
{
archive = new ZipArchive(stream, ZipArchiveMode.Create);
}
public void Dispose()
{
archive.Dispose();
}
public void Add(string fileName, byte[] content, bool enableCompression)
{
var entryName = PickName(fileName);
var compressionLevel = enableCompression ? CompressionLevel.Fastest : CompressionLevel.NoCompression;
var entry = archive.CreateEntry(entryName, compressionLevel);
using var stream = entry.Open();
stream.Write(content, 0, content.Length);
}
private string PickName(string fileName)
{
if (!entries.Contains(fileName))
{
entries.Add(fileName);
return fileName;
}
var baseName = Path.GetFileNameWithoutExtension(fileName);
var ext = Path.GetExtension(fileName);
for (var idx = 2; ; idx++)
{
var newName = baseName + "_" + idx;
if (!string.IsNullOrEmpty(ext))
newName += ext;
if (entries.Contains(newName))
continue;
entries.Add(newName);
return newName;
}
}
}
//Создайте класс обработки извлечения активов
class Extractor
{
private Zip zip;
private bool texture;
HashSet<A3DObject> visited = new HashSet<A3DObject>();
public Extractor(Zip zip,bool texture)
{
this.zip = zip;
this.texture = texture;
}
private bool CanVisit(A3DObject obj)
{
if (visited.Contains(obj))
return false;
visited.Add(obj);
return true;
}
public void Extract(Scene scene)
{
if (scene.Library != null && scene.Library.Count > 0)
{
foreach (var obj in scene.Library)
{
Visit(obj);
}
}
VisitNode(scene.RootNode);
}
private void VisitNode(Node node)
{
if (!CanVisit(node))
return;
if (texture)
{
foreach (var mat in node.Materials)
{
VisitMaterial(mat);
}
}
foreach (var entity in node.Entities)
{
if (entity is Mesh)
Save((Mesh)entity, node.Name);
}
foreach (var child in node.ChildNodes)
{
VisitNode(child);
}
}
private void VisitMaterial(Material mat)
{
if (!CanVisit(mat))
return;
if (!texture)
return;
foreach (var tslot in mat)
{
if (tslot.Texture is Texture)
{
Save((Texture)tslot.Texture);
}
}
}
private void Visit(A3DObject obj)
{
if (texture && obj is Texture)
{
Save((Texture)obj);
}
else if (obj is Mesh)
{
Save((Mesh)obj, null);
}
else if (obj is Node)
{
VisitNode((Node)obj);
}
}
private void Save(Mesh mesh, string? nodeName)
{
if (!CanVisit(mesh))
return;
Scene scene = new Scene(mesh);
using (var ms = new MemoryStream())
{
scene.Save(ms, FileFormat.FBX7400ASCII);
var name = nodeName;
if (string.IsNullOrEmpty(name))
name = mesh.Name;
if (string.IsNullOrEmpty(name))
name = "mesh";
var ext = ".fbx";
zip.Add(name + ext, ms.ToArray(), true);
}
}
private void Save(Texture tex)
{
if (tex.Content == null || !CanVisit(tex))
return;
var fileName = tex.FileName != null ? Path.GetFileName(tex.FileName) : null;
zip.Add(fileName, tex.Content, false);
}
}
О Aspose.3D for .NET API
Aspose.3D – это CAD и Gameware API для загрузки, изменения и преобразования файлов 3D. API является автономным и не требует никакого 3D программного обеспечения для моделирования или визуализации. Можно легко использовать API для Discreet3DS, WavefrontOBJ, STL (ASCII, двоичный), Universal3D, FBX (ASCII, двоичный), Collada, glTF, PLY, GLB, DirectX и другие форматы.Бесплатное приложение для извлечения активов из PLY
Проверьте наши живые демонстрации, чтобы Экстрактор PLY со следующими преимуществами.
PLY Формат файла PLY
PLY, формат файла многоугольника, представляет собой формат файла 3D, в котором хранятся графические объекты, описываемые как набор многоугольников. Цель этого формата файла состояла в том, чтобы создать простой и удобный тип файла, который является достаточно общим, чтобы его можно было использовать для широкого спектра моделей. Формат файла PLY представлен как в формате ASCII, так и в двоичном формате для компактного хранения и быстрого сохранения и загрузки.
ПодробнееДругое поддерживаемое приложение для извлечения ресурсов из форматов
Используя C#, можно также извлекать активы из файлов многих других форматов, в том числе.