HTML JPG PDF XML 3MF
Aspose.3D  for .NET
3MF

Извлечь активы из 3MF через C#

Создавайте собственные приложения .NET для извлечения ресурсов из файлов 3MF с помощью серверных API.

Как извлечь активы из файла 3MF с помощью C#

Чтобы извлечь активы из файла 3MF, мы будем использовать

Aspose.3D for .NET

API — многофункциональная, мощная и простая в использовании платформа API для C#, предназначенная для извлечения активов. Открыть

NuGet

менеджер пакетов, поиск Aspose.3D и установить. Вы также можете использовать следующую команду из консоли диспетчера пакетов.

Команда консоли диспетчера пакетов


PM> Install-Package Aspose.3D

Действия по извлечению активов из 3MF через C#

Aspose.3D позволяет разработчикам легко извлекать активы из файла 3MF, написав всего несколько строк кода.

  • Загрузите файл 3MF через конструктор класса Scene- Создайте объект формата zip-файла в качестве формата выходного файла- Создайте класс архива и обработайте класс активов извлечения- Вызовите метод Extract и сохраните файл

Системные Требования

Aspose.3D for .NET поддерживается во всех основных операционных системах. Просто убедитесь, что у вас есть следующие предпосылки.

  • Microsoft Windows или совместимая ОС с .NET Framework, .NET Core, Mono- Среда разработки, такая как Microsoft Visual Studio- Aspose.3D for .NET упоминается в вашем проекте
 

C# код для извлечения ресурсов из 3MF


//Исходные файлы, которые необходимо извлечь активы
string file = "template.3mf";
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 и другие форматы.

    Бесплатное приложение для извлечения активов из 3MF

    Проверьте наши живые демонстрации, чтобы Экстрактор 3MF со следующими преимуществами.

      Не нужно ничего скачивать или настраивать
      Нет необходимости писать или компилировать код
      Просто загрузите файл 3MF и нажмите кнопку "Извлечь".
      Загрузите файл 3MF по ссылке, если требуется

    3MF Формат файла 3MF

    3MF, производственный формат 3D, используется приложениями для визуализации 3D объектных моделей в различных других приложениях, платформах, службах и принтерах. Он был создан, чтобы избежать ограничений и проблем в других форматах файлов 3D, таких как STL, для работы с последними версиями принтеров 3D. 3MF — относительно новый формат файлов, разработанный и опубликованный консорциумом 3MF.

    Подробнее

    Другое поддерживаемое приложение для извлечения ресурсов из форматов

    Используя C#, можно также извлекать активы из файлов многих других форматов, в том числе.

    3DS (3D Формат файла Studio Mesh)
    AMF (Формат аддитивного производства)
    ASE (Файл 2D-анимации)
    DAE (Биржа цифровых активов)
    DXF (Формат обмена чертежами)
    DRC (Google Draco)
    FBX (3D Формат)
    GLB (3D Двоичное представление файла)
    GLTF (Формат передачи GL)
    JT (Файл тесселяции Юпитера)
    OBJ (3D Формат файла)
    PLY (Формат файла многоугольника)
    PDF (3D PDF)
    RVM (Модель проектирования завода AVEVA)
    STL (Взаимозаменяемая геометрия поверхности 3D)
    U3D (Universal 3D)
    VRML (Язык моделирования виртуальной реальности)
    Икс (Изображение модели DirectX)
    USD (Описание универсальной сцены)
    USDZ (Универсальное описание сцены Zip-архив)