0

I'm working on an Excel spreadsheet to generate a DXF. So far I've been able to generate a function for lines, polylines, polygones, circles and simple text but I'm struggling to code a MTEXT function.

This is what I have at this point:

Function DXF_MTEXTO(ByRef DXF_TEXT As String, ByVal CAPA As String, _
               ByVal CX As Single, ByVal CY As Single, ByVal 
miTexto As String, _
               ByVal miAltura As Single, ByVal ang As Single) As String

DXF_TEXT = DXF_TEXT & 0 & vbCrLf            'Entidad
DXF_TEXT = DXF_TEXT & "MTEXT" & vbCrLf
DXF_TEXT = DXF_TEXT & 100 & vbCrLf          'Subclass marker
DXF_TEXT = DXF_TEXT & "AcDbEntity" & vbCrLf
DXF_TEXT = DXF_TEXT & 100 & vbCrLf          'Subclass marker
DXF_TEXT = DXF_TEXT & "AcDbMText" & vbCrLf
DXF_TEXT = DXF_TEXT & 8 & vbCrLf            'Capa
DXF_TEXT = DXF_TEXT & CAPA & vbCrLf
DXF_TEXT = DXF_TEXT & 10 & vbCrLf           'Coordenada X del texto
DXF_TEXT = DXF_TEXT & CX & vbCrLf
DXF_TEXT = DXF_TEXT & 20 & vbCrLf           'Coordenada Y del texto
DXF_TEXT = DXF_TEXT & CY & vbCrLf
DXF_TEXT = DXF_TEXT & 1 & vbCrLf            'Texto
DXF_TEXT = DXF_TEXT & miTexto & vbCrLf
DXF_TEXT = DXF_TEXT & 40 & vbCrLf           'Altura de texto
DXF_TEXT = DXF_TEXT & miAltura & vbCrLf
DXF_TEXT = DXF_TEXT & 41 & vbCrLf           ' Ancho de rectángulo de referencia
DXF_TEXT = DXF_TEXT & 16 & vbCrLf
DXF_TEXT = DXF_TEXT & 71 & vbCrLf           ' Punto de anclaje: 1 Top Left
DXF_TEXT = DXF_TEXT & 1 & vbCrLf
DXF_TEXT = DXF_TEXT & 72 & vbCrLf           ' Dirección del texto: 5 By Style
DXF_TEXT = DXF_TEXT & 5 & vbCrLf
DXF_TEXT = DXF_TEXT & 50 & vbCrLf           ' Rotación del texto
DXF_TEXT = DXF_TEXT & ang & vbCrLf
DXF_TEXT = DXF_TEXT & 90 & vbCrLf           ' Background fill: 0 = Off
DXF_TEXT = DXF_TEXT & 0 & vbCrLf

DXF_MTEXTO = DXF_TEXT
End Function

Could anybody please give me a hand? A piece of code, a reference (Different from AutoDesk DXF reference)

Thanks in advance!

I read the DXF references and tried to modify the other functions thinking it would work according to AutoDesk pdf.

For example, this is the function (It works pretty fine) for simple text:

This is the code I use for the begining of the file:

Function DXF_INICIO(ByRef DXF_TEXT As String) As String
    DXF_TEXT = 0 & vbCrLf
    DXF_TEXT = DXF_TEXT & "SECTION" & vbCrLf
    DXF_TEXT = DXF_TEXT & 2 & vbCrLf
    DXF_TEXT = DXF_TEXT & "ENTITIES" & vbCrLf

    DXF_INICIO = DXF_TEXT
End Function

This is the code I use for the end of the file:

Function DXF_FINAL(ByRef DXF_TEXT As String) As String
    DXF_TEXT = DXF_TEXT & 0 & vbCrLf
    DXF_TEXT = DXF_TEXT & "ENDSEC" & vbCrLf
    DXF_TEXT = DXF_TEXT & 0 & vbCrLf
    DXF_TEXT = DXF_TEXT & "EOF" & vbCrLf

    DXF_FINAL = DXF_TEXT
End Function

This is the code I use for the simple text (And it works pretty fine)

Function DXF_TEXTO(ByRef DXF_TEXT As String, ByVal CAPA As String, _
                   ByVal CX As Single, ByVal CY As Single, ByVal miTexto As String, _
                   ByVal miAltura As Single, ByVal ang As Single) As String

    DXF_TEXT = DXF_TEXT & 0 & vbCrLf
    DXF_TEXT = DXF_TEXT & "TEXT" & vbCrLf
    DXF_TEXT = DXF_TEXT & 8 & vbCrLf
    DXF_TEXT = DXF_TEXT & CAPA & vbCrLf
    DXF_TEXT = DXF_TEXT & 10 & vbCrLf
    DXF_TEXT = DXF_TEXT & CX & vbCrLf
    DXF_TEXT = DXF_TEXT & 20 & vbCrLf
    DXF_TEXT = DXF_TEXT & CY & vbCrLf
    DXF_TEXT = DXF_TEXT & 1 & vbCrLf
    DXF_TEXT = DXF_TEXT & miTexto & vbCrLf
    DXF_TEXT = DXF_TEXT & 40 & vbCrLf
    DXF_TEXT = DXF_TEXT & miAltura & vbCrLf
    DXF_TEXT = DXF_TEXT & 50 & vbCrLf
    DXF_TEXT = DXF_TEXT & ang & vbCrLf
    
    DXF_TEXTO = DXF_TEXT
End Function

This is the error I got when using the MTEXT function: "Undefined group code 10 for object on line XX. Invalid or incomplete DXF input -- drawing discarded."

This is what the DXF looks like:

            0
            SECTION
            2
            ENTITIES
            0
            POLYLINE
            8
            001-WALL
            66
            1
            70
            1
            0
            VERTEX
            8
            001-WALL
            70
            1
            10
            3.4742
            20
            18.7913
            0
            VERTEX
            8
            001-WALL
            70
            1
            10
            6.0183
            20
            18.7913
            0
            VERTEX
            8
            001-WALL
            70
            1
            10
            6.0183
            20
            19.4579
            0
            VERTEX
            8
            001-WALL
            70
            1
            10
            3.4742
            20
            19.4579
            0
            SEQEND
            0
            MTEXT
            100
            AcDbEntity
            100
            AcDbMText
            8
            000-TEXT
            10
            6.079583
            20
            20.45793
            1
            #5@48"\PL: 2.55ft t: 8"\PVu: 3 kip\PVu/Vn: 40%
            40
            0.25
            41
            16
            71
            1
            72
            5
            50
            0
            90
            0
            0
            ENDSEC
            0
            EOF

1 Answers1

0

MTEXT entities require that you specify subclass markers, e.g.:

Function DXF_MTEXTO(ByRef DXF_TEXT As String, ByVal CAPA As String, _
               ByVal CX As Single, ByVal CY As Single, ByVal miTexto As String, _
               ByVal miAltura As Single, ByVal ang As Single) As String

DXF_TEXT = DXF_TEXT & 0 & vbCrLf            'Entidad
DXF_TEXT = DXF_TEXT & "MTEXT" & vbCrLf
DXF_TEXT = DXF_TEXT & 100 & vbCrLf          'Subclass marker
DXF_TEXT = DXF_TEXT & "AcDbEntity" & vbCrLf 'Subclass marker
DXF_TEXT = DXF_TEXT & 100 & vbCrLf          'Subclass marker
DXF_TEXT = DXF_TEXT & "AcDbMText" & vbCrLf  'Subclass marker
DXF_TEXT = DXF_TEXT & 8 & vbCrLf            'Capa
DXF_TEXT = DXF_TEXT & CAPA & vbCrLf
DXF_TEXT = DXF_TEXT & 10 & vbCrLf           'Coordenada X del texto
DXF_TEXT = DXF_TEXT & CX & vbCrLf
DXF_TEXT = DXF_TEXT & 20 & vbCrLf           'Coordenada Y del texto
DXF_TEXT = DXF_TEXT & CY & vbCrLf
DXF_TEXT = DXF_TEXT & 1 & vbCrLf            'Texto
DXF_TEXT = DXF_TEXT & miTexto & vbCrLf
DXF_TEXT = DXF_TEXT & 40 & vbCrLf           'Altura de texto
DXF_TEXT = DXF_TEXT & miAltura & vbCrLf
DXF_TEXT = DXF_TEXT & 41 & vbCrLf           ' Ancho de rectángulo de referencia
DXF_TEXT = DXF_TEXT & 16 & vbCrLf
DXF_TEXT = DXF_TEXT & 71 & vbCrLf           ' Punto de anclaje: 1 Top Left
DXF_TEXT = DXF_TEXT & 1 & vbCrLf
DXF_TEXT = DXF_TEXT & 72 & vbCrLf           ' Dirección del texto: 5 By Style
DXF_TEXT = DXF_TEXT & 5 & vbCrLf
DXF_TEXT = DXF_TEXT & 50 & vbCrLf           ' Rotación del texto
DXF_TEXT = DXF_TEXT & ang & vbCrLf
DXF_TEXT = DXF_TEXT & 90 & vbCrLf           ' Background fill: 0 = Off
DXF_TEXT = DXF_TEXT & 0 & vbCrLf

DXF_MTEXTO = DXF_TEXT
End Function

You may also need to define some header variables, else without this information AutoCAD will assume that the DXF is targeting R12 in which the MText entity did not exist.

Try adding the following at the start of the file:

0
SECTION
2
HEADER
9
$ACADVER
1
AC1032
0
ENDSEC
Lee Mac
  • 15,615
  • 6
  • 32
  • 80