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.