mono/packages/cad/docs/glb.md

12 KiB
Raw Permalink Blame History

Converting SolidWorks Files to GLTF/GLB Format

This documentation provides approaches for converting SolidWorks files to gLTF/GLB format using the SolidWorks Interop API and C#.

Overview

gLTF (GL Transmission Format) and its binary variant GLB are file formats for 3D models widely used in web applications and AR/VR. Converting SolidWorks files to these formats allows for broader compatibility and usage.

Approaches for Conversion

Here are several approaches to convert SolidWorks files to gLTF/GLB using the Interop API:

Approach 1: SolidWorks to Intermediate Format to gLTF

This approach uses SolidWorks API to export to an intermediate format (e.g., STL, STEP, or OBJ) that can then be converted to gLTF/GLB using a third-party library.

using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconstants;
using System.Runtime.InteropServices.Com;
using System;

public class SolidWorksToGLTFConverter
{
    private SldWorks swApp;
    private ModelDoc swModel;

    public SolidWorksToGLTFConverter()
    {
        // Connect to SolidWorks (must be installed)
        swApp = (SldWorks) Marshal.GetActiveObject("SldWorks.Application");
        // If SolidWorks is not running, start it
        if (swApp == null)
        {
            swApp = (SldWorks) Marshal.BindToMonoNamed("SldWorks.Application", "SldWorks.Application");
            swApp.Visible = true;
            swApp.UserControl = false;
        }
    }

    public void ConvertToGLTF(string sourcePath, string destinationPath)
    {
        try
        {
            // Open the SolidWorks file
            int errors = 0;
            int warnings = 0;
            swModel = swApp.OpenDoc(sourcePath, (int)swOpenDocOptions_e.SwOpenDocOption_Silent, (int)swDocType_e.swDocPART, ref errors, ref warnings);

            if (swModel == null)
            {
                CheckLastError();
                throw new Exception("Failed to open the SolidWorks file.");
            }

            // Generate an intermediate file (STL)
            string intermediatePath = System.IO.Path.ChangeExtension(destinationPath, ".stl");
            int status = swModel.Extension.SaveAs(intermediatePath, (int)swSaveAsVersion_e.swSaveAsCurrentVersion, (int)swSaveAsOption_e.swSaveAsOption_Copy, null, ref errors, ref warnings);

            if (status != 1)
            {
                throw new Exception("Failed to save the STL file.");
            }

            // Close the document
            swApp.CloseDoc(sourcePath);

            // Now use a library like AssimpNet to convert from STL to gLTF
            // This is an example using AssimpNet (requires NuGet package)
            ConvertSTLToGLTF(intermediatePath, destinationPath);

            // Clean up the intermediate file
            System.IO.File.Delete(intermediatePath);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            throw;
        }
    }

    private void ConvertSTLToGLTF(string stlPath, string gltfPath)
    {
        // Using AssimpNet library (install via NuGet: AssimpNet)
        /*
        // Install-Package AssimpNet
        using Assimp;
        using Assimp.Gltf;
        
        // Create a new importer and scene
        var importer = new Assimp.Assimp();
        var scene = importer.ImportFile(stlPath);
        
        if (scene == null || scene.SceneFlags == PostProcessSteps.TargetRealTime_Max)
        {
            throw new Exception("Failed to load STL file: " + Assimp.GetErrorString());
        }
        
        // Export to gLTF
/GLB
        var exportFormat = new Gltf2ExportFormat();
        var exporter = new Assimp.Exporter();
        var gltfPathExtension = System.IO.Path.GetExtension(gltfPath).ToLower();
        
        if (gltfPathExtension == ".glb")
        {
            exportFormat.PrettyPrinted = false; // Binary format
        }
        else
        {
            exportFormat.PrettyPrinted = true; // JSON format
        }
        
        exporter.Export(scene, ExportFormat.Gltf2, gltfPath, exportFormat);
        */
        
        // NOTE: This is just a placeholder for the AssimpNet code
        // You need to add the proper AssimpNet NuGet package and uncomment the code above
        Console.WriteLine("Converting stl to gLTF/GLB...");
    }

    private void CheckLastError()
    {
        int errorCode = 0;
        string errorMessage = swApp.GetLastError(ref errorCode);
        if (errorCode != 0)
        {
            Console.WriteLine("SolidWorks Error: (" + errorCode + ") " + errorMessage);
        }
    }

    public void Dispose()
    {
        // Clean up SolidWorks instance
        if (swApp != null)
        {
            swApp.Exit();
            Marshal.ReleaseComObject(swApp);
        }
    }
}

Approach 2: Direct Export using SolidWorks GTF Addin

If you have a SolidWorks addin that can export to gLTF/GLB, you can use the Interop API to automate the process:;

public bool ExportToGLTFUsingAddin(string sourcePath, string destinationPath)
{
    try
    {
        // Connect to SolidWorks
        SldWorks swApp = (SldWorks) Marshal.GetActiveObject("SldWorks.Application");
        if (swApp == null)
        {
            swApp = (SldWorks) Marshal.BindToMonoNamed("SldWorks.Application", "SldWorks.Application");
            swApp.Visible = true;
        }

        // Open the SolidWorks file
        int errors = 0;
        int warnings = 0;
        ModelDoc swModel = swApp.OpenDoc(sourcePath, (int)swOpenDocOptions_e.SwOpenDocOption_Silent, (int)swDocType_e.swDocPART, ref errors, ref warnings);

        if (swModel == null)
        {
            // Handle error
            return false;
        }

        // Get the GLTF Export addin (assuming it's installed)
        object gltfAddin = null;
        try {
            // This is a placeholder - actual addin name will vary based on what's installed
            gltfAddin = swApp.GetAddinObject("GLTFExporter.Addin"); 
        }
        catch (Exception exp) {
            Console.WriteLine("Error loading GLTF export addin: " + exp.Message);
            return false;
        }

        if (gltfAddin != null) {
            // Call the addin's export method (the exact method name and parameters will depend on the addin)
            // Example:
            // gltfAddin.ExportGltf(swModel, destinationPath);
            
            // Close the model
            swApp.CloseDoc(sourcePath);
            return true;
        }
        else {
            Console.WriteLine("GLTF export addin not found or not properly loaded.");
            return false;
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("Error: " + e.Message);
        return false;
    }
}

Approach 3: Using SolidWorks eCommerce Technologies| Com<6F>View API

If you have access to SolidWorks eCommerce Technologies' CompView, you can use its API to generate gLTF files.

using EdsCompViewLib;
using System;

public class CompViewGLTFExporter
{
    public void ExportToGLTF(string sourcePath, string destinationPath)
    {
        try
        {
            // Initialize CompView (exact code will depend on version)
            EdsCompViewLib.EdsCompView compView = new EdsCompViewLib.EdsCompView();
            compView.Initialize();

            // Optional: Set license information if required
            // compView.License("license_key");

            // Open the SolidWorks file
            var openStatus = compView.OpenDocument(sourcePath);
            if (!openStatus)
            {
                throw new Exception("Failed to open document in CompView.");
            }

            // Configure gLTF export settings
            var settings = new GltfExportSettings();
            settings.EmbedTextures = true;
            settings.IncludeMaterials = true;
            settings.UseBinaryFormat = System.IO.Path.GetExtension(destinationPath).ToLower() == ".glb";

            // Export the gLTF file
            bool exportSuccess = compView.ExportGLTF(destinationPath, settings);
            if (!exportSuccess)
            {
                throw new Exception("Failed to export gLTF/GLB.");
            }

            // Close the document and cleanup CompView
            compView.CloseDocument();
            compView.Uninitialize();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error while exporting to gLTF: " + ex.Message);
            throw;
        }
    }
}

// Placeholder class for example purposes
public class GltfExportSettings
{
    public bool EmbedTextures { get; set; }
    public bool IncludeMaterials { get; set; }
    public bool UseBinaryFormat { get; set; }
}

Approach 4: Using SolidWorks DocumentManager API

If you have SolidWorks PDD or Enterprise PDM/PLC, you can use the DocumentManager API:

using EDPLibrary7; // Enterprise PDM API
using System;

public class PDMGLTFExporter
{
    public bool ExportToGLTF(string fileId, string destinationPath)
    {
        try
        {
            // Connect to EDSW
            IEdmVault7 vault = new EdmVault7();
            if (!vault.IsLoggedIn)
            {
                var loggedIn = vault.Login("username", "password", "vault_name");
                if (!loggedIn)
                {
                    Console.WriteLine("Failed to log in to PDM.");
                    return false;
                }
            }

            // Get the file from PDM
            IEdmFile7 edmFile = vault.GetFileById(fileId);
            if (edmFile == null)
            {
                Console.WriteLine("File not found in PDM.");
                return false;
            }

            // Get local copy of the file
            string localPath = edmFile.Get();
            
            // Now use either Approach 1 or 2 above to convert the local file to gLTF/GLB
            // Example using the first approach:
            using (var converter = new SolidWorksToGLTFConverter())
            {
                converter.ConvertToGLTF(localPath, destinationPath);
            }
            
            // Cleanup local file if needed
            edmFile.UndoGet(); // Optional: releases local copy
            
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            return false;
        }
    }
}

Tips and Best Practices

  1. Test With Simple Models First: Start with simple models before processing complex assemblies.

  2. Handle Materials Carefully: gLTF supports PBR (Physically-Based Rendering) materials which may need special handling when converting from SolidWorks.

  3. Consider Textures and Specification Compliance: Ensure textures are handled correctly and the output is compliant with the gLTF specification.

  4. Use Validation Tools: Validate the generated gLTF/GLB files using tools like gltf-validator or Babylon.js Sandbox.

  5. Handle Large Assemblies with Care: Very large assemblies might need to be broken down or optimized for web viewing.

Third-Party Libraries and Tools

  1. AssimpNet - C# bindings for Assimp, a powerful 3D model import/export library that supports gLTF/GLB export.

  2. SharpGLTF - A C# glTF 2.0 io library to create gLTF files from scratch.

  3. Open3D Model Viewer - Microsoft's Open3D Model Viewer supports gLTF/GLB and includes conversion utilities.

  4. ComView - An engineering file viewing solution with API for converting files to various formats including gLTF.

Conclusion

There are several approaches to convert SolidWorks files to gLTF/GLB format using the SolidWorks Interop API and C#. The best approach depends on your specific requirements, available tools, and the complexity of your models. Whether you use an intermediate format, a direct export via an addin, or a third-party tool, make sure to validate the output gLTF/GLB files and optimize them for your intended use case.


## Prompt

suggest ways to convert solidwork files via interop API into .gltf or .glb, via SDK (#c), store in ./docs/glb.md, with code examples