DWG drawings in QGIS,
still readable
CAD layers, colours, line types, line widths, hatch patterns and text come across. Everything runs on your machine — drawings are never uploaded anywhere.
What Pro adds Free edition (DXF)
QGIS cannot open a modern DWG
QGIS reads DWG through a library called libdxfrw, which stops at the 2000 file format. Drawings you receive today are saved as 2013 or 2018. Put one into Project → Import Layers from DWG/DXF and after two minutes you still have zero layers and no error message. We reproduced this on all 44 drawings in our sample set.
The bug is #48637, open since May 2022. It is not an oversight — libdxfrw lost its maintainer in 2016 and QGIS' copy never received the AutoCAD 2018 fixes that other forks made. The QGIS community knows; replacing the library is a 2026 grant proposal that has not been funded.
The usual workaround is to convert the drawing to DXF first. That means two steps, and 5 of our 44 drawings still fail afterwards. It also assumes you have a CAD seat to convert with — the free ODA File Converter that gets recommended everywhere is licensed for non-commercial use only unless you are a paying ODA member, so a design office cannot legally rely on it. On macOS there is no free Autodesk viewer either.
EchoCad Pro opens the DWG directly. No conversion, no second tool, no licence question.
There are two editions
The free edition reads DXF — better than QGIS does, with text and hatches intact. Pro reads DWG with no converter and no second step, and turns a whole folder of drawings into data you can query. The part that reads the drawing is the same code in both.
| Feature | Free | Pro |
|---|---|---|
| DWG (R14 to 2018 and later) | — | yes, directly |
| DXF | yes | yes |
| Colours, line types, line widths, hatches, text | yes | yes |
| How many drawings per run | one, by hand | a whole folder |
| Drawing text turned into shape attributes | — | yes |
| Batch conversion with a per-file CSV report | — | yes |
| A whole delivery merged into one GeoPackage | — | yes |
| Skip layers switched off or frozen in the drawing | yes | yes |
| Open polylines closed into polygons | — | yes |
| Georeferencing from two reference points | — | yes |
| Elevations (Z) kept | — | yes |
| Mapping profiles — merge many CAD layers into one feature class | — | yes |
| Block attributes (ATTRIB) as queryable fields | — | yes |
| Runs from the Processing toolbox and models | — | yes |
| Converter needed | none — DXF is read directly | bundled — nothing to install |
Free — DXF, read properly
Plugins → EchoCad → Import drawing opens a window. Pick the DXF, check the coordinate system, import. There is no limit on how many drawings, and no time limit.
QGIS reads DXF too. It reads it worse: across our 44-drawing sample QGIS leaked
35 MTEXT formatting codes such as \pxqc; into the map as
visible text, and on complex plans the text is scaled so large it covers the drawing.
EchoCad leaked none.
- One QGIS layer per CAD layer, split into point, line and polygon, so you can style each one instead of fighting a single mixed layer
- Entity colour, line type (solid / dashed / dash-dot) and line width kept, so the distinctions the drawing already made are still visible in QGIS
- Text placed at its original size, rotation and colour — title block, notes and dimension text stay where they belong
- Hatch patterns rebuilt from the drawing’s own definitions. Angle, spacing and dash pattern are read out of the drawing, not flattened to a solid blob
- CJK text does not turn to mojibake. The encoding is decided from the actual bytes, not from what the header claims, so drawings with a wrong declaration still read
- The coordinate system comes from your project, so a drawing lands on top of the data you are already working with. Change it in the window whenever you want
- Optional GeoPackage output. Without it the layers are in memory and go away when you close QGIS
- Failures say why — unsupported format (R13 and older), empty drawing and timeout are told apart
- Layers switched off or frozen in the drawing can be skipped. Everything comes across by default — hidden does not mean unwanted, and a long list beats losing data quietly
Nothing to install and nothing to configure. The free edition reads DXF directly — there is no converter to fetch, so it works the same on a machine with no internet at all. If what you have is a DWG, save it as DXF from the CAD you already use, or take Pro and skip the step entirely.
Pro — the drawing, as data
The free edition already shows you as many drawings as you like. What Pro changes is what happens next — it pulls the values written in the drawing out into fields, turns lines into polygons and drawing coordinates into real ones, and repeats all of it across a whole folder.
Not one number below is invented. Every one was measured by running real delivered drawings and public samples, and the scripts that measured them are in the repository.
A drawing left as a picture, or turned into data
Across nine delivered drawings, 2,836 texts became attributes of the shapes they label. Nobody does that by hand. Rather than read, locate and retype thousands of values, offices give up and use the drawing as a backdrop — and the room numbers, pipe diameters and specs written on it simply do not exist in GIS.
What Pro changes is not how long the work takes. It is whether those values become data at all. Set it up once and next month’s delivery runs the same way.
1. Drawing text turned into shape attributes
Site drawings write their information as plain text, not as block attributes. We counted nine real delivered drawings: zero block attributes, 3,558 texts. Received as free-floating labels, none of that can be queried, joined or summed. You can only look at it.
Pro finds one owner shape for each text and writes it into a
label field. A text inside a polygon belongs to that polygon; outside one it goes
to the nearest shape within a tolerance. The tolerance is worked out from the drawing’s
own size — units and scale differ per drawing, so a fixed value would attach everything
in one drawing and nothing in the next.
label attribute of the room polygons, ready to join to your
register. Shapes that found no owner stay NULL — nothing is invented.
Measured — across nine delivered drawings, 2,836 of 5,640 texts (50%) found a shape. Piping isometrics run 64–88%, site plans 22–31%. The rest was not missed — it was declined. Title blocks, legends and general notes belong to no shape, so they are left alone. If one shape would take more than eight texts it is treated as a frame and cleared: a single blob of company name and revision history is worse than nothing.
2. Batch folder conversion with a per-file report
Drawings arrive by the folder, not one at a time. The free edition does one per run: open the window, pick the file, pick the coordinate system, import, repeat. Fine for one drawing, unusable for eighty.
- Point it at a folder and every DWG inside is converted. Subfolders optional
- One file failing does not stop the rest. It does not halt half way
- Text attaching, polygon closing and georeferencing apply to the whole run
- Per-file results go into a CSV report
- A whole delivery can land in one file. One GeoPackage per drawing
is the default; switch the option on and matching layers gather into a single
GeoPackage. Which drawing each feature came from stays in a
source_filefield
Below is a real report from one run over a folder of nine drawings. One of them was an R13 file. The run did not stop there, and what failed and why is on the record.
| file | status | note | layers | features | sec |
|---|---|---|---|---|---|
| facility-2011-dm-a04.dwg | ok | 42 | 7,172 | 8.8 | |
| cafm-plan-de.dwg | ok | Dropped 1 features with broken coordinates | 23 | 3,517 | 3.9 |
| fire-station.dwg | ok | 13 | 3,621 | 2.2 | |
| floorplan-elevation.dwg | ok | 19 | 1,111 | 4.0 | |
| building-a-floor0.dwg | ok | 18 | 327 | 2.3 | |
| site-survey-3.dwg | unsupported | Format AC1012. Only R14 and newer are supported. | 0 | 0 | 0.0 |
| tourist-home.dwg | ok | Dropped 5 features with broken coordinates | 34 | 17,496 | 6.6 |
Features dropped for broken coordinates are counted too. Drop them silently and nobody can explain the missing count later.
Measured — five drawings produce five files and 91 layers. An
eighty-drawing delivery makes eighty files and 1,456 layers, and someone then has to open
them all and merge the matching ones by hand. Switch merging on and pair it with a
mapping profile and the same sample becomes one file with 20 layers.
A profile only groups names within one drawing, so without merging an eighty-drawing
delivery ends up with eighty building_wall layers.
3. Open polylines closed into polygons
In CAD it is enough that a shape looks closed, so the last vertex is often a few millimetres off the first. GIS then receives a line, and you cannot compute an area or ask what is inside it. In our sample, 528 of 531 polylines in the delivered drawings were open.
Give a tolerance and anything within it is closed into a polygon. The original lines are left in place — a wrong tolerance would otherwise delete linework you needed, so the polygons are added on top and you can adjust and re-run. It is never on by default: closing a pipe run or a dimension line produces garbage.
Measured — nine delivered drawings at tolerance 1.0 produced 1,986 polygons. Because polygons are built before text is attached, the text hit rate rose from 47.9% to 50.3%.
4. Georeferencing from two reference points
Drawing near the origin is the CAD norm: 17 of 20 public sample drawings were in local coordinates. Dropped into QGIS as they are, they land nowhere near the site and will not overlay your basemap.
Give two points read off the drawing and their real-world coordinates, and Pro solves shift, rotation and scale in one step. Scale is applied equally to x and y: allowing shear would let a single mistyped digit skew the whole drawing silently. A wrong entry is better refused than quietly distorted.
Measured — reference point error 0.000000000, width preserved at 14,382.7736, all 11,831 features moved.
5. Elevations (Z) kept
In drawings such as piping isometrics, height is half the information. Flattened to 2D you can no longer tell which level a run passes through.
Turn the option on and the layers come across as 2.5D with the height on every vertex. Where 2D features are mixed in, they are given a height of zero and kept in the same layer — better than splitting one CAD layer into two.
Measured — all nine delivered drawings came through as 3D layers, with 1,757 to 27,330 distinct elevations in the piping isometrics. Previously every one of them was flattened to zero.
6. Mapping profiles — CAD layers onto your schema
A hundred drawings arrive with a hundred layer namings. A-WALL-EXST,
A-WALL-NEW and A-WALL-2F are all the same building wall,
but QGIS receives three layers.
A profile is a list of glob-pattern rules. The first match wins, so order is priority. A layer that matches nothing keeps its original name and is listed as unmatched, so you know at once whether something was left out. One JSON file, so a team can share it and keep it in git.
{
"version": 1,
"name": "example",
"rules": [
{ "match": "A-WALL-*", "layer_name": "building_wall", "geometry": "polygon" },
{ "match": "*-TEXT", "layer_name": "annotation", "geometry": "point" }
],
"default": { "layer_name": "{cad_layer}", "geometry": "auto" }
}
7. Block attributes (ATTRIB) as queryable fields
Where a drawing does use block attributes, that is where the manhole numbers, pipe diameters, asset codes and parcel numbers live. Neither the free edition nor QGIS’s own importer brings them across. The drawing opens; the attributes are gone.
Pro builds one block-reference point layer per CAD layer and spreads every attribute tag found there into a field. The original tag name is kept as the QGIS field alias, so a normalised field name loses nothing.
That said, drawings without block attributes are far more common. Our nine delivered samples had none at all. That is why item 1 comes first.
8. Runs from the Processing toolbox
Pro registers two algorithms under
Processing Toolbox → EchoCad → DWG —
Import DWG and Batch import DWG. You can call them without
opening a window at all.
import processing
processing.run("echocad:batchimportdwg", {
"INPUT_FOLDER": "D:/deliveries/2026-03/dwg",
"RECURSIVE": True,
"CRS": "EPSG:5186",
"PROFILE": "D:/office/office-schema.json",
"EXTRACT_ATTRIBS": True,
"JOIN_TEXT": True,
"CLOSE_TOLERANCE": 1.0,
"KEEP_Z": True,
"SKIP_HIDDEN": True,
"MERGE": True,
"OUTPUT": "D:/work/gpkg",
"REPORT": "D:/work/report.csv",
})
So it drops into the model builder, and you can chain a buffer, a join and an export straight after the conversion and run the lot in one go. If deliveries arrive in the same shape every month, building it once and re-running it is where the time actually goes. The free edition registers no algorithms at all — everything there goes through the import window, by hand.
9. Converter bundled — works on an isolated network
Pro ships with the converter for Windows and macOS — nothing to download, no path to point at, and it runs on a machine with no internet at all. The bundled build is LibreDWG 0.14.8578; the commonly packaged 0.13.3 converts 44 of our 50 samples and truncates 4, while 0.14.8578 converts 48.
Pro installs as a separate plugin (echocad_pro), so it never collides with the
free edition and updates never overwrite each other. It never needs the internet, so it works
on an isolated network. More screens and examples are on the
features page.
Price
The first year of updates is included. After that, updates renew at $99 a year. It is not a subscription — the version you have keeps working whether or not you renew.
Check the free edition on your own drawings first. See whether this tool reads what you actually work with — how the layers come apart, whether the text survives, whether the hatches are rebuilt. If you then need block attributes, mapping profiles and batch conversion on top of that, that is Pro.
What you need
- QGIS 3.34 LTR or newer — checked on 3.44 and 4.x too
- Windows or macOS
- DWG R14 or newer. R13 and older are refused up front with a message
The interface follows your QGIS language. Ten are included: English, German, Spanish, French, Italian, Japanese, Korean, Polish, Portuguese and Chinese.