net6-inventor

Cómo conectar con el API de Autodesk Inventor desde NET6

Continuamos y, de momento al menos, terminamos con la serie de entradas destinadas a ver cómo conectar una aplicación a través de su API con una aplicación de NET6 escrita en C#.

Anteriormente hemos comentado que la integración de distintas tecnologías es uno de los puntos importantes de las aplicaciones de IoT. Así hemos visto cómo conectarnos con Microsoft Word, Excel, y Outlook.

En la entrada anterior hemos visto cómo conectarlos con un software de CAD como SolidWorks. Comentábamos que esto nos ofrece una gran cantidad de posibilidades, por ejemplo, dentro del ámbito de la industria 4.0.

También vimos que el API de SolidWorks no estaba especialmente bien formado ni documentada y, en general, trabajar con ella era un pequeño infierno. Hoy vamos a ver el API de otro software de CAD, Autodesk Inventor.

Independientemente de que nos guste más o menos como CAD, lo cierto es que el API de Autodesk Inventor es mucho mejor que la de Solid Works.

Así que vamos a ver un ejemplo de cómo podríamos conectarnos con el API de Autodesk Inventor desde una aplicación en NET6.

Cómo conectar Autodesk Inventor con una aplicación de NET6

Igual que en todos los ejemplos de la serie comenzamos creando una aplicación de consola de NET6. A continuación añadimos las siguientes referencia COM ‘Autodesk Inventor Object Library’.

Al igual que en el ejemplo de SolidWorks, el API de Autodesk Inventor necesita Marshaling, la cuál no está disponible en NET6. Por lo cuál os adjunto el objeto Marshal2 en el repo de código para cubrir esta carencia.

A continuación, copiamos el siguiente código,

var app = (Application)Marshal2.GetActiveObject("Inventor.Application");
var path = "your_inventor_file_path";
loadExitingPart(app, path);

createNewPart(app);

Console.ReadLine();

static void loadExitingPart(Application app, string path)
{
    var doc = app.Documents.Open(path);
    System.Threading.Thread.Sleep(200);
    app.CommandManager.ControlDefinitions["AppIsometricViewCmd"].Execute();
    app.ActiveView.DisplayMode = DisplayModeEnum.kTechnicalIllustrationRendering;

    doc.SaveAs("C:\\temp\\thumbnail.png", true);
}

static void createNewPart(Application app)
{
    var doc = app.Documents.Add(DocumentTypeEnum.kPartDocumentObject);
    
    var trans = app.TransactionManager.StartTransaction((_Document)doc, "My Command");
    drawCube(app, (PartDocument)trans.Document, 5, 5, 5);
    Thread.Sleep(200);
    app.CommandManager.ControlDefinitions["AppIsometricViewCmd"].Execute();
    trans.End();

    app.ActiveView.DisplayMode = DisplayModeEnum.kTechnicalIllustrationRendering;
}

static void drawCube(Application app, PartDocument doc, int x, int y, int z)
{
    var comp = doc.ComponentDefinition;

    var sketch = comp.Sketches.Add(comp.WorkPlanes[3]);

    var geo = app.TransientGeometry;
    var lines = sketch.SketchLines.AddAsTwoPointRectangle(geo.CreatePoint2d(0, 0), geo.CreatePoint2d(3, 3));

    var profile = sketch.Profiles.AddForSolid();

    var extrudeDef = comp.Features.ExtrudeFeatures.CreateExtrudeDefinition(profile, PartFeatureOperationEnum.kJoinOperation);
    extrudeDef.SetDistanceExtent(3, PartFeatureExtentDirectionEnum.kSymmetricExtentDirection);

    var extrude = comp.Features.ExtrudeFeatures.Add(extrudeDef);

    WorkAxis XAxis = comp.WorkAxes[1];
    WorkAxis YAxis = comp.WorkAxes[2];
    WorkAxis ZAxis = comp.WorkAxes[3];

    ObjectCollection objCol = app.TransientObjects.CreateObjectCollection();
    objCol.Add(extrude);

    var pattern = comp.Features.RectangularPatternFeatures.Add(objCol, XAxis, true, 5, 4, YDirectionEntity: YAxis, YCount: 5, YSpacing: 4);

    ObjectCollection objCol2 = app.TransientObjects.CreateObjectCollection();
    objCol2.Add(extrude);
    objCol2.Add(pattern);

    var pattern2 = comp.Features.RectangularPatternFeatures.Add(objCol2, ZAxis, true, 5, 4);
}

Este código proporciona funciones de ejemplo para abrir un fichero, y guardar una captura de pantalla del modelo. Y, por otro lado, para crear un nuevo fichero y crear una matriz 3D de cubos.

Aún con estos sencillos ejemplos ya es posible ver que modelo de objetos del API es mucho mejor. Además, las funciones proporcionan información sobre los parámetros que reciben y devuelven.

Y hasta aquí, al menos por ahora, esta serie dedicada a ver cómo conectarse con distintas aplicaciones desde un programa realizado por nosotros en .NET. Hemos visto ejemplos de APIs muy bien formadas (las de Microsoft) y otras no tan bien formadas.

En cualquier caso el proceso de trabajar con lápiz es siempre más o menos similar encontrar el nombre las referencias que tenemos que añadir a nuestro proyecto y sufrir con el modelo de objetos y la documentación hasta conseguir hacer las acciones que nosotros queremos.

Trabajar con API suele ser algo duro, pero da lugar a proyectos muy interesantes. Es un requisito muy habitual en aplicaciones de IoT e industria 4.0, y es uno de los puntos en los que más destaca Microsoft Windows.

De momento, dejamos esta serie aquí. Si en algún momento nos apetece hacer alguna entrada sobre algún otro API, ampliaremos la serie. ¡Nos vemos en la siguiente entrada!

Descarga el código

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