En este post agregaremos el código Visual Basic necesario para poder exportar a celdas de Excel las coordenadas de cada uno de los vértices de una polilínea seleccionada desde el editor de AutoCAD.
En el tema anterior, agregamos a nuestro proyecto un formulario de Windows con sus respectivos controles, el cual nos va a ayudar a interactuar con los objetos de AutoCAD, en ese caso con la polilínea seleccionada.
Además, también nos ayudará a optar por exportar el nombre de la capa del objeto (polilínea) y después de manera opcional eliminarla del dibujo.
Agregar el código necesario en el cuadro de diálogo
Paso 1: Importar las referencias de los objetos de AutoCAD así como las de Microsoft Office en el código del formulario: frmUIAL.vb.
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Microsoft.Office.Interop
Paso 2: En la clase pública del formulario (Public Class FrmUIAL), debemos de establecer los nombres de los objetos con los cuales vamos a interactuar, lo haremos tanto para AutoCAD como para Excel.
'Objetos de AutoCAD
ReadOnly ACADDocument As Document = Application.DocumentManager.MdiActiveDocument
ReadOnly ACCADBaseDatos As Database = ACADDocument.Database
ReadOnly ACCADEditor As Editor = ACADDocument.Editor
'Objetos de Excel
Dim objApp As Excel.Application
Dim objBook As Excel._Workbook
Dim objBooks As Excel.Workbooks
Dim objSheets As Excel.Sheets
Dim objSheet As Excel._Worksheet
Dim range As Excel.Range
Paso 3: Agregar el código para el botón «btnAceptar» (Aceptar). Este código primero evalúa cuál de los 2 tabs del control (TabControl1) está activo y según eso, ejecuta el código necesario. Por defecto el tab actual o activo es el que permite «Exportar información a Excel» (TabPage1).
El código es el procedimiento que se ejecutará cuando el usuario haga clic en el botón «btnAceptar», es por lo que el evento predeterminado es «Click».
Private Sub btnAceptar_Click(sender As Object, e As EventArgs) Handles btnAceptar.Click
Dim selectedTab As TabPage = TabControl1.SelectedTab
Dim selectedIndex As Integer = TabControl1.SelectedIndex
If selectedIndex = 0 Then
Dim acSSPrompt As PromptSelectionResult = ACADDocument.Editor.GetSelection()
If acSSPrompt.Status = PromptStatus.OK Then
Dim acSSet As SelectionSet = acSSPrompt.Value
Dim fila As Long
Dim NumeroVertices As Integer
' Cargar una nueva instancia de Excel.
objApp = New Excel.Application()
objBooks = objApp.Workbooks
objBook = objBooks.Add
objSheets = objBook.Worksheets
objSheet = objSheets(1)
range = objSheet.Range("A1", Reflection.Missing.Value)
fila = 0
btnAceptar.DialogResult = DialogResult.OK
Me.Visible = False
For Each acSSObj As SelectedObject In acSSet
If Not IsDBNull(acSSObj) Then
Using acTrans As Transaction = ACCADBaseDatos.TransactionManager.StartTransaction()
'Abrir el objeto para editarlo
Dim acEnt As Entity = acTrans.GetObject(acSSObj.ObjectId, OpenMode.ForWrite)
Dim ColumnasConsiderar As Integer
If Not IsDBNull(acEnt) Then
Dim acEntPL As Polyline = acTrans.GetObject(acSSObj.ObjectId, OpenMode.ForRead)
Dim Capa = acEntPL.Layer
NumeroVertices = acEntPL.NumberOfVertices
If chkExportarCapa.Checked = False Then
ColumnasConsiderar = 2
Else
ColumnasConsiderar = 3
End If
range = range.Resize(NumeroVertices + 1, ColumnasConsiderar)
Dim saRet(NumeroVertices + 1, ColumnasConsiderar)
saRet(fila, 0) = "Este"
saRet(fila, 1) = "Norte"
If chkExportarCapa.Checked = True Then
saRet(fila, 2) = "Capa"
End If
fila += 1
For nCnt As Integer = 0 To NumeroVertices - 1
Dim punto As Point2d = acEntPL.GetPoint2dAt(nCnt)
Dim x As Double
Dim y As Double
x = punto.X
y = punto.Y
saRet(fila, 0) = x
saRet(fila, 1) = y
If chkExportarCapa.Checked = True Then
saRet(fila, 2) = Capa
End If
fila += 1
Next
'Escribir los valores de la matriz en el rango (celdas)
range.Value = saRet
'Se cambia de color a la entidad seleccionada
acEnt.ColorIndex = 3
If chkEliminarEntidad.Checked = True Then
acEnt.Erase()
End If
'Actualizar la base de datos
acTrans.Commit()
End If
End Using
End If
Next
objApp.Visible = True
Application.ShowAlertDialog("Se exportaron " + NumeroVertices.ToString + " vertices.")
Else
Application.ShowAlertDialog("No se seleccionó nada.")
End If
objApp.UserControl = True
'Limpiar las variables
range = Nothing
objSheet = Nothing
objSheets = Nothing
objBooks = Nothing
objApp = Nothing
End If
End Sub
Agregar el código necesario en la clase pública «Commands» creada en el post #4.
Con este código, le permitiremos a esta DLL que pueda mostrar el cuadro de diálogo cuando se invoque al nombre del comando establecido, recordemos que el nombre del comando para AutoCAD es «AcadExcelNet«.
El código final en el archivo de módulo «Comandos.vb» debería de quedar de la siguiente manera:
Imports Autodesk.AutoCAD.ApplicationServices
Namespace ACADExcelNE
Public Class Commands
'Proyecto de creación de una app DLL para conectar Microsoft Excel con AutoCAD.
'Desarrollado por Mario Torres Pejerrey para el portal DevCADLisp.com.
'DevCADLisp 2021: https://www.devcadlisp.com/
'https://mariotorres.pe/
'Esta línea de código se aumentó.
ReadOnly NetCADUIDlg As New FrmUIAL()
<Autodesk.AutoCAD.Runtime.CommandMethod("AcadExcelNet")>
Public Sub LoadUIDlg()
Try
'Mostrar la UI (código actualizado).
Application.ShowModalDialog(NetCADUIDlg)
Catch ex As System.Exception
Application.ShowAlertDialog("Algo ocurrió al cargar la rutina: " & ex.Message)
Exit Sub
End Try
End Sub
End Class
End Namespace
Compilar la solución para realizar las pruebas correspondientes
En el IDE de Visual Studio, en el menú «Compilar», haz clic en el submenú «Compilar solución«:
Recuerda que debes de revisar la ventana «Salida» para comprobar que la compilación fue correcta y la ruta en donde se ha generado el ensamblado (DLL).
En AutoCAD, ejecuta el comando «NETLOAD» y con el cuadro de diálogo mostrado, elige el archivo DLL que acabamos de generar:
En el mensaje de seguridad, elige la primera opción «Always Load«:
Dibuja una polilínea y luego ejecuta la DLL escribiendo el nombre de comando «AcadExcelNet«.
En el cuadro de diálogo de la interfaz de la aplicación DLL, selecciona la opción «Exportar también capa de la entidad» y luego haz clic en el botón «Aceptar«.
Luego ante la solicitud de selección, selecciona la polilínea creada y luego presiona Enter.
Podrás observar que automáticamente se cargará una nueva instancia de Excel, se escribirán los datos de las coordenadas de los vértices y el nombre de la capa del objeto en las celdas y por último se cambiará la capa del objeto seleccionado.
Si todo salió bien, AutoCAD mostrará un mensaje en el cual te indica el número de vértices exportados satisfactoriamente.
Si después de seleccionar la polilinea y presionar la tecla Enter notas que se pone un poco lenta tu PC, no apagues tu computadora o bajes la llave general de tu casa, es debido a que Excel se está cargando en forma no visible, luego lo verás cuando ya tenga los datos escritos en las celdas.
Como podrás observar, para enviar o escribir información desde AutoCAD a Excel a través de Visual Basic .NET es un proceso sencillo, pero debes de conocer cuales son los objetos de ambas aplicaciones con los cuales vas a interactuar y para ello te recomiendo que eches un vistaso a la ayuda del desarrollador.
Ir al siguiente tema: Importar datos de coordenadas de vértices desde Microsoft Excel a AutoCAD y dibujar una polilínea.