net6-solidworks

Cómo conectar con el API de SolidWorks desde NET6

Nueva entrada de la serie destinada a ver cómo conectar distintos programas a través de su API con una aplicación de NET6 escrita en C#.

Anteriormente hemos visto cómo conectar con los distintos aplicaciones de Microsoft Office, como Word, Excel y Outlook. También hemos visto que es la capacidad de integración entre distintas tecnologías es 1 de los puntos más relevantes del IoT.

Ahora nos vamos a pasar a controlar un software de CAD como SolidWorks. Poder interactuar con un software de CAD eso tiene muchísimas ocasiones dentro del campo de la industria y 4.0.

Imaginar por ejemplo la posibilidad de conectar una ESP32 con un sensor, y ante un determinado evento poder mostrar imprimir un plano, tomar un screenshot y guardarlo, mostrar un dibujo en 3D.

En general hay un montón de ejemplos muy interesantes dentro del campo de la industria 4.0 que se pueden obtener a partir de conectar un software de CAD con tu propia aplicación en NET6.

Lamentablemente el API de NET de SolidWorks es realmente malo. Precisamente es uno de los motivos por el que lo elegido para ver las diferencias entre una API bien formada y una API mal formada.

En cualquier caso aunque nos vaya a tocar un poco más sufrir por el camino, es perfectamente posible conectarse con solidworks desde una aplicación en .NET6.

Cómo conectar SolidWorks con una aplicación de NET6

Como de costumbre para este ejemplo queremos una simple aplicación de consola. Ahora debemos añadir las referencias COM de SolidWorks, que son:

  • SldWorks 20xx Type Library
  • SOLIDWORKS 20xx Commands type library
  • SOLIDWORKS 20xx Constant type library

donde 20xx Es la versión de solidworks que tengáis instalada. Como vemos, ya de primer momento, empezamos porque los nombres de las librerías no están claros (SldWorks? a que viene la abreviatura si el resto son SOLIDWORKS)

Por otro lado para acceder al API de SolidWorks necesitaremos hacer Marshaling, algo que no está disponible en NET6. Por tanto, os añado en el ejemplo de Github un código Marshal2 para suplir esta carencia.

Con nuestras referencias añadidas y nuestro objeto Marshal2, copiamos el siguiente código,

using DemoSolidWorksApi;
using SldWorks;
using System.Runtime.InteropServices;

var progId = "SldWorks.Application";
var progType = System.Type.GetTypeFromProgID(progId);

var app = Marshal2.GetActiveObject(progId) as ISldWorks;

var part = app.NewPart() as PartDoc;

var box = CreateBox(app, 0.2, 0.2);
box.Name = "MyBox";

var cyl = CreateCylinder(app, 1, 1);
cyl.Name = "MyCylinder";

Console.ReadLine();

static IFeature CreateBox(ISldWorks app, double diam, double height)
{
    var part = app.ActiveDoc as IPartDoc;

    var modeler = app.IGetModeler();

    var boxBody = modeler.CreateBodyFromBox(new double[]
    {
                0, 0, 0,
                1, 0, 0,
                1, 1, 1
    }) as Body;
    if (boxBody != null)
    {
        var feat = part.CreateFeatureFromBody3(boxBody, false, 1) as IFeature;
        return feat;
    }
    else
    {
        throw new NullReferenceException("Failed to create body. Make sure that the parameters are valid");
    }
}

static IFeature CreateCylinder(ISldWorks app, double diam, double height)
{
    var part = app.ActiveDoc as IPartDoc;

    var modeler = app.IGetModeler();

    var cylBody = modeler.CreateBodyFromCyl(new double[]
   {
                2, 0, 0,
                0, 1, 0,
                diam / 2, height
   }) as Body;

    if (cylBody != null)
    {
        var feat = part.CreateFeatureFromBody3(cylBody, false, 1) as IFeature;
        return feat;
    }
    else
    {
        throw new NullReferenceException("Failed to create body. Make sure that the parameters are valid");
    }
}

Donde simplemente estamos creando un cubo y un cilindro respectivamente. Suficiente para este ejemplo, y para ver lo horrible que es el API de NET de SolidWorks.

El modelo de objetos está mal definido, las clases no ofrecen información sobre los parámetros que reciben, ni los interface que necesitan. El orden de los parámetros es poco intuitivo, existen funciones obsoletizadas por todos lados, y la documentación es casi nula.

No estoy criticando al software de CAD en si. De hecho, hay mucha gente que es gran defensora de SolidWorks. Pero, objetivamente, su API en .NET es realmente mala.

En cualquier caso el ejemplo está ahí, funciona, y es un buen ejemplo de un API con el que nos va a tocar sufrir si nos toca usarla.

En la próxima entrada veremos cómo conectarnos con otro software de CAD, Autodesk Inventor, y ya os hago spoiler que su API está mucho mejor elaborada. ¡Hasta la próxima!

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full