JareBear
JareBear

Reputation: 487

Python converting DXF files to PDF or PNG or JPEG

Does anyone know any way of converting DXF files to either PNG or PDF?

I have a huge list of DXF Files and I want to convert them to Images to view them quicker.

If its possible, how could you extract the DXF file values, like the thickness or measurements of that drawing that's in the DXF File.

Upvotes: 5

Views: 11930

Answers (4)

JareBear
JareBear

Reputation: 487

EDIT!!!

import matplotlib.pyplot as plt
import ezdxf
from ezdxf.addons.drawing import RenderContext, Frontend
from ezdxf.addons.drawing.matplotlib import MatplotlibBackend
import re


class DXF2IMG(object):

    default_img_format = '.png'
    default_img_res = 300
    def convert_dxf2img(self, names, img_format=default_img_format, img_res=default_img_res):
        for name in names:
            doc = ezdxf.readfile(name)
            msp = doc.modelspace()
            # Recommended: audit & repair DXF document before rendering
            auditor = doc.audit()
            # The auditor.errors attribute stores severe errors,
            # which *may* raise exceptions when rendering.
            if len(auditor.errors) != 0:
                raise Exception("The DXF document is damaged and can't be converted!")
            else:
                fig = plt.figure()
                ax = fig.add_axes([0, 0, 1, 1])
                ctx = RenderContext(doc)
                ctx.set_current_layout(msp)
                ctx.current_layout.set_colors(bg='#FFFFFF')
                out = MatplotlibBackend(ax)
                Frontend(ctx, out).draw_layout(msp, finalize=True)

                img_name = re.findall("(\S+)\.",name)  # select the image name that is the same as the dxf file name
                first_param = ''.join(img_name) + img_format  #concatenate list and string
                fig.savefig(first_param, dpi=img_res)


if __name__ == '__main__':
    first = DXF2IMG()
    first.convert_dxf2img(['GT-010.DXF'],img_format='.png')

@hamza-mohammed shared a solution that works marvellously!

Full credit goes to: https://github.com/Hamza442004/DXF2img

Above is the version with out the GUI in case anyone wants the real deal!

Upvotes: 2

Jaime Maldonado M
Jaime Maldonado M

Reputation: 51

The above code did not work for me. I had to replace the following part:

fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ctx = RenderContext(doc)
ctx.set_current_layout(msp)
ctx.current_layout.set_colors(bg='#FFFFFF')
out = MatplotlibBackend(ax)
Frontend(ctx, out).draw_layout(msp, finalize=True)

with the following:

fig = plt.figure()
ctx = RenderContext(doc)

# Better control over the LayoutProperties used by the drawing frontend
layout_properties = LayoutProperties.from_layout(msp)
layout_properties.set_colors(bg='#FFFFFF')

ax = fig.add_axes([0, 0, 1, 1])

out = MatplotlibBackend(ax, params={"lineweight_scaling": 0.1})

Frontend(ctx, out).draw_layout(msp,layout_properties=layout_properties, finalize=True)

Note: make sure to add this at the start:

from ezdxf.addons.drawing.properties import Properties, LayoutProperties

Upvotes: 3

Hamza Mohammed
Hamza Mohammed

Reputation: 53

https://github.com/Hamza442004/DXF2img

import matplotlib.pyplot as plt
import ezdxf
from ezdxf.addons.drawing import RenderContext, Frontend
from ezdxf.addons.drawing.matplotlib import MatplotlibBackend
#import wx
import glob
import re

class DXF2IMG(object):

default_img_format = '.png'
default_img_res = 300
def convert_dxf2img(self, names, img_format=default_img_format, img_res=default_img_res):
    for name in names:
        doc = ezdxf.readfile(name)
        msp = doc.modelspace()
        # Recommended: audit & repair DXF document before rendering
        auditor = doc.audit()
        # The auditor.errors attribute stores severe errors,
        # which *may* raise exceptions when rendering.
        if len(auditor.errors) != 0:
            raise exception("The DXF document is damaged and can't be converted!")
        else :
            fig = plt.figure()
            ax = fig.add_axes([0, 0, 1, 1])
            ctx = RenderContext(doc)
            ctx.set_current_layout(msp)
            ctx.current_layout.set_colors(bg='#FFFFFF')
            out = MatplotlibBackend(ax)
            Frontend(ctx, out).draw_layout(msp, finalize=True)

            img_name = re.findall("(\S+)\.",name)  # select the image name that is the same as the dxf file name
            first_param = ''.join(img_name) + img_format  #concatenate list and string
            fig.savefig(first_param, dpi=img_res)

Upvotes: 3

v-joe
v-joe

Reputation: 366

Dia from the GNOME project can convert dxf to png, it also has a Python interface allowing for scripting.

Upvotes: 1

Related Questions