File: embed_dxf_dwg_xref.py

package info (click to toggle)
ezdxf 1.4.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 104,528 kB
  • sloc: python: 182,341; makefile: 116; lisp: 20; ansic: 4
file content (87 lines) | stat: -rw-r--r-- 2,858 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#  Copyright (c) 2023, Manfred Moitzi
#  License: MIT License
import pathlib
import ezdxf
from ezdxf.addons import odafc
from ezdxf.document import Drawing
from ezdxf import xref, units

CWD = pathlib.Path("~/Desktop/Outbox").expanduser()
if not CWD.exists():
    CWD = pathlib.Path(".")

# ------------------------------------------------------------------------------
# This example shows how to attach DXF and DWG files as external references to a
# host document.
# ------------------------------------------------------------------------------


def make_dxf_xref_document(name: str, dxfversion="R2013") -> Drawing:
    # AutoCAD does not accept DXF R12 files as XREF :(
    ref_doc = ezdxf.new(dxfversion, units=units.M)
    ref_doc.modelspace().add_circle(
        center=(5, 5), radius=2.5, dxfattribs={"layer": "CIRCLE"}
    )
    ref_doc.header["$INSBASE"] = (5, 5, 0)  # set XREF base point for insertion
    ref_doc.saveas(CWD / name)
    return ref_doc


# AutoCAD accepts DXF files (>DXF12) as XREFs, but is unwilling to resolve the
# DXF files created by ezdxf, which opened for itself is a total valid DXF
# document.
#
# It seems that AutoCAD does not resolve any DXF file as an XREF file, no matter what
# CAD application created the DXF file!
# The much more friendly BricsCAD has no problem to resolve the DXF files as XREFs.
#
# Export the DXF document as DWG file by the odafc addon, for more information
# see the docs: https://ezdxf.mozman.at/docs/addons/odafc.html
# At least the DWG file is accepted by AutoCAD.


def export_dwg_xref_document(name: str, doc: Drawing) -> None:
    dwg = CWD / name
    try:
        odafc.export_dwg(doc, str(dwg), replace=True)
    except odafc.ODAFCError as e:
        print(str(e))


def create_xrefs(dxf_name, dwg_name, dxfversion):
    xref_doc = make_dxf_xref_document(dxf_name, dxfversion=dxfversion)
    export_dwg_xref_document(dwg_name, xref_doc)


def embed_dxf_xref(dxf_name: str, dxfversion: str) -> None:
    host_doc = ezdxf.new(dxfversion, units=units.M)
    host_doc.filename = str(CWD / "host_embedded_dxf.dxf")

    xref.attach(host_doc, block_name="dxf_xref", filename=dxf_name)
    block = host_doc.blocks.get("dxf_xref")
    xref.embed(block)
    host_doc.save()


def embed_dwg_xref(dwg_name: str, dxfversion: str) -> None:
    host_doc = ezdxf.new(dxfversion, units=units.M)
    host_doc.filename = str(CWD / "host_embedded_dwg.dxf")

    xref.attach(host_doc, block_name="dwg_xref", filename=dwg_name)
    block = host_doc.blocks.get("dwg_xref")
    xref.embed(block, load_fn=odafc.readfile)
    host_doc.save()


def main():
    dxfversion = "R2013"
    dxf_name = "xref.dxf"
    dwg_name = "xref.dwg"
    create_xrefs(dxf_name, dwg_name, dxfversion)

    embed_dxf_xref(dxf_name, dxfversion)
    embed_dwg_xref(dwg_name, dxfversion)


if __name__ == "__main__":
    main()