Sub InsertPointsAndDraw3DPolylines()
' Declaración de variables para puntos y textos
Dim AutoCAD As Object
Dim pointObj As AcadPoint
Dim textObj As AcadText
Dim descTextObj As AcadText
Dim pto(0 To 2) As Double
Dim textString As String
Dim descString As String
Dim Altura As Double
Dim ultimaFila As Long
Dim i As Long
Dim ptoDescripcion(0 To 2) As Double
Dim capa As AcadLayer
Dim capaName As String
Dim layerDict As Object
Dim colorIndex As Integer
' Declaración de variables para polilíneas 3D
Dim acad3DPol As Acad3DPolyline
Dim dblCoordinates() As Double
Dim k As Long
Dim layerName As String
Dim currentDescription As String
Dim startRow As Long
' Intentar conectar a AutoCAD
On Error Resume Next
Set AutoCAD = GetObject(, "AutoCAD.Application") ' Intentar conectarse a una instancia existente
On Error GoTo 0
' Si AutoCAD no está abierto, crear una nueva instancia
If AutoCAD Is Nothing Then
Set AutoCAD = CreateObject("AutoCAD.Application") ' Crear una nueva instancia
AutoCAD.Visible = True ' Asegurar que AutoCAD sea visible
End If
' Crear un nuevo dibujo en AutoCAD
AutoCAD.Documents.Add
' Establecer las variables PDMODE y PDsize
AutoCAD.ActiveDocument.SetVariable "PDMODE", Range("H2").Value
AutoCAD.ActiveDocument.SetVariable "PDsize", Range("H3").Value
' Encontrar la última fila con datos en la columna B (Este)
ultimaFila = Cells(Rows.Count, 2).End(xlUp).Row
' Altura del texto
Altura = Range("H11").Value
' Crear un diccionario para rastrear las capas creadas
Set layerDict = CreateObject("Scripting.Dictionary")
' Inicializar el índice de color para las capas
colorIndex = 1
' Bucle para agregar puntos, numeración y descripción
For i = 4 To ultimaFila
' Obtener coordenadas X (Este), Y (Norte), Z (Elevación)
pto(0) = Cells(i, 2).Value ' Este (X)
pto(1) = Cells(i, 3).Value ' Norte (Y)
pto(2) = Cells(i, 4).Value ' Elevación (Z)
' Obtener la descripción de la columna E
descString = Cells(i, 5).Value
' Verificar si ya existe una capa para esta descripción
If Not layerDict.Exists(descString) Then
' Si no existe, crear una nueva capa
Set capa = AutoCAD.ActiveDocument.Layers.Add(descString)
' Asignar un color a la capa (cíclico del 1 al 255)
capa.Color = colorIndex
' Añadir la capa al diccionario
layerDict.Add descString, capa
' Incrementar el índice de color
colorIndex = (colorIndex Mod 255) + 1 ' Evita que el colorIndex supere 255
Else
' Obtener la capa existente
Set capa = layerDict(descString)
End If
' Asignar la capa actual
AutoCAD.ActiveDocument.ActiveLayer = capa
' Insertar el punto en AutoCAD
Set pointObj = AutoCAD.ActiveDocument.ModelSpace.AddPoint(pto)
pointObj.Layer = descString ' Asignar la capa al punto
pointObj.Color = capa.Color ' Color del punto basado en la capa
' Obtener el número de punto de la columna A
textString = Cells(i, 1).Value
' Modificar las coordenadas del texto de numeración
pto(1) = pto(1) + 1 ' Mover en el eje Y
' Agregar el texto del número del punto en AutoCAD
Set textObj = AutoCAD.ActiveDocument.ModelSpace.AddText(textString, pto, Altura)
textObj.Layer = descString ' Asignar la capa
textObj.Color = capa.Color ' Cambiar el color
' Modificar las coordenadas del texto de descripción
ptoDescripcion(0) = pto(0) + 2 ' Mover en el eje X
ptoDescripcion(1) = pto(1) - 2 ' Mover en el eje Y
ptoDescripcion(2) = pto(2) ' Mantener la elevación
' Insertar el texto de la descripción en AutoCAD
Set descTextObj = AutoCAD.ActiveDocument.ModelSpace.AddText(descString, ptoDescripcion, Altura)
descTextObj.Layer = descString ' Asignar la capa
descTextObj.Color = capa.Color ' Cambiar el color
Next i
' Ahora procedemos con las polilíneas 3D
' Inicializar variables para polilíneas
startRow = 4 ' La fila donde comienzan los datos
currentDescription = Cells(startRow, 5).Value ' Primera descripción
' Bucle para dibujar polilíneas 3D por descripción
For i = startRow To ultimaFila
' Si la descripción cambia o se llega al final
If Cells(i, 5).Value <> currentDescription Or i = ultimaFila Then
' Dibujar la polilínea 3D para la descripción actual
Draw3DPolyline AutoCAD, startRow, i - 1, currentDescription
' Actualizar la descripción y el inicio de la nueva polilínea
currentDescription = Cells(i, 5).Value
startRow = i
End If
Next i
' Ajustar el zoom en AutoCAD
AutoCAD.ZoomExtents
MsgBox "Puntos y polilíneas 3D creados correctamente."
End Sub
Sub Draw3DPolyline(ByRef AutoCAD As Object, ByVal startRow As Long, ByVal endRow As Long, ByVal description As String)
' Declaración de variables
Dim acad3DPol As Acad3DPolyline
Dim dblCoordinates() As Double
Dim k As Long
Dim capa As AcadLayer
Dim i As Long
Dim pto(0 To 2) As Double
' Crear un arreglo para almacenar las coordenadas X, Y y Z
ReDim dblCoordinates(3 * (endRow - startRow + 1) - 1)
' Pasar las coordenadas X, Y y Z al arreglo
k = 0
For i = startRow To endRow
dblCoordinates(k) = Cells(i, 2) ' X
dblCoordinates(k + 1) = Cells(i, 3) ' Y
dblCoordinates(k + 2) = Cells(i, 4) ' Z
k = k + 3
Next i
' Crear una capa para la descripción si no existe
On Error Resume Next
Set capa = AutoCAD.ActiveDocument.Layers.Item(description)
If capa Is Nothing Then
Set capa = AutoCAD.ActiveDocument.Layers.Add(description)
End If
On Error GoTo 0
' Cambiar la capa activa
AutoCAD.ActiveDocument.ActiveLayer = capa
' Dibujar la polilínea 3D en AutoCAD
Set acad3DPol = AutoCAD.ActiveDocument.ModelSpace.Add3DPoly(dblCoordinates)
acad3DPol.Layer = description ' Asignar la capa
acad3DPol.Update
End Sub