Java๋ก ๊ตฌํํ AutoCAD DWG ํ์ผ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
OpenDesign Specification v5.4.1์ ๊ธฐ๋ฐ์ผ๋ก R13๋ถํฐ R2018๊น์ง์ DWG ํ์ผ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ๋ฅผ ์ง์ํฉ๋๋ค.
src/
โโโ io/dwg/
โ โโโ core/ # ์ ์์ค I/O, ๋ฒ์ ๊ฐ์ง, ์ ํธ๋ฆฌํฐ
โ โ โโโ io/ # BitStream ์ฝ๊ธฐ/์ฐ๊ธฐ
โ โ โโโ type/ # DwgHandle, Point3D ๋ฑ
โ โ โโโ util/ # LZ77, CRC, ๋ฌธ์์ด ์ธ์ฝ๋ฉ
โ โ โโโ version/ # DwgVersion, ๋ฒ์ ๊ฐ์ง
โ โ
โ โโโ format/ # ๋ฒ์ ๋ณ ํ์ผ ๊ตฌ์กฐ ํธ๋ค๋ฌ
โ โ โโโ common/ # ๊ณตํต ์ธํฐํ์ด์ค
โ โ โโโ r13/ # R13-R15 ๊ตฌํ
โ โ โโโ r2004/ # R2004 ๊ตฌํ
โ โ โโโ r2007/ # R2007-R2010 ๊ตฌํ
โ โ
โ โโโ sections/ # ์น์
ํ์/๋ผ์ดํฐ
โ โ โโโ header/ # Header ๋ณ์
โ โ โโโ classes/ # ํด๋์ค ์ ์
โ โ โโโ handles/ # ํธ๋ค ๋งต
โ โ โโโ objects/ # ์ํฐํฐ/๊ฐ์ฒด
โ โ
โ โโโ entities/ # ๋๋ฉ์ธ ๋ชจ๋ธ (์์ ๋ฐ์ดํฐ)
โ โ โโโ concrete/ # Line, Circle, Arc, Text ๋ฑ
โ โ โโโ ...
โ โ
โ โโโ api/ # ๊ณ ์์ค ๊ณต๊ฐ API
โ โ โโโ DwgReader
โ โ โโโ DwgWriter
โ โ โโโ DwgDocument
โ โ
โ โโโ test/ # ํ
์คํธ
โ โโโ DwgParsingStageTest
dwg-core โ dwg-format โ dwg-sections โ dwg-entities โ dwg-api
| ๋ชจ๋ | ์ฑ ์ |
|---|---|
dwg-core |
๋นํธ์คํธ๋ฆผ I/O, ํ์ , LZ77/CRC |
dwg-format |
๋ฒ์ ๋ณ ํ์ผ ๊ตฌ์กฐ (R13~R2018) |
dwg-sections |
์น์ ํ์/๋ผ์ดํฐ |
dwg-entities |
์์ ๋ฐ์ดํฐ ๋ชจ๋ธ (์ํฐํฐ+๋น์ํฐํฐ) |
dwg-api |
๊ณต๊ฐ API (DwgReader, DwgWriter) |
- Strategy:
DwgFileStructureHandlerโ ๋ฒ์ ๋ณ ํ์ฑ ์ ๋ต - Factory:
DwgFileStructureHandlerFactoryโ ๋ฒ์ ์ ๋ง๋ ํธ๋ค๋ฌ ์ ํ - Registry:
SectionParserRegistryโ ์น์ ์ด๋ฆ โ ํ์ ๋งคํ - Builder:
DwgReader,DwgDocumentโ Fluent API
Phase 2: ๊ธฐ์ด ๊ตฌํ โ
- BitStream I/O (์ฝ๊ธฐ/์ฐ๊ธฐ), DWG ํ์ , ๋ฒ์ ๊ฐ์ง, LZ77/CRC
Phase 4: R2000 ์ง์ โ
- R2000 HeaderVariables, ์น์ ํ์ฑ (22๊ฐ ์ํ ํ์ผ 100% ํต๊ณผ)
Phase 5: R2004 ์ํฐํฐ ํด์ โ
- Objects ์น์ ๋นํธ ๋จ์ ํ์ฑ, 64๊ฐ ์ํฐํฐ ๋ฆฌ๋ ๊ตฌํ
Phase 6A: R2007/R2010/R2013/R2018 ๊ธฐ์ด โ
- R2007 Reed-Solomon ํค๋, PageMap/SectionMap ์ถ์ถ
- R2010+ ํ์ผ ๊ตฌ์กฐ ์ธ์
Phase 6B: Objects ์น์ ์ถ์ถ โ
- R2007 RS(255,239) ๋ณตํธํ ๋ฐ LZ77 ํด์
- Objects ์น์ 197KB+ ์ถ์ถ (18๊ฐ ์ํ 100%)
Phase 7: ์์ ํตํฉ ๋ฐ ๊ฒ์ฆ โ
- Handles ์คํ์ ๊ณ์ฐ ์์ (blockCount 8๋ฐ์ดํธ ์ ๋ ฌ)
- ์์ฐจ ํ์ฑ ํด๋ฐฑ ๊ตฌํ
- 4,816 ์ํฐํฐ ์ถ์ถ (+42% ๊ฐ์ )
Phase 8: ์ํฐํฐ ํ์ ํ์ฅ โ
- 74๊ฐ ์ํฐํฐ ํ์ ๊ตฌํ (์์ ์ปค๋ฒ๋ฆฌ์ง)
- 19๊ฐ ์ ๊ท ํ์ ์ถ๊ฐ (MLINE, MTEXT, WIPEOUT, IMAGE ๋ฑ)
Phase 9 Tier 1: R2004 LZ77 ์์ โ
- R2004 ์ ์ฉ LZ77 ๋์ปดํ๋ ์ ๊ตฌํ (+42% ๊ฐ์ , 645๊ฐ ์ถ๊ฐ ์ํฐํฐ)
Phase 9 Tier 3: R2010+ ๋ผ์ฐํ ์์ โ
- ์ํคํ ์ฒ ๋ฒ๊ทธ ๋ฐ๊ฒฌ: R2010/R2013/R2018์ R2004 ํ์ผ ๊ตฌ์กฐ ์ฌ์ฉ
- R2007 ํธ๋ค๋ฌ ๋์ R2004 ํธ๋ค๋ฌ๋ก ๋ผ์ฐํ ๋ณ๊ฒฝ
- Reed-Solomon ๋์ฝ๋ ๋จ์ํ (deinterleave๋ง, BM ์๋ฌ์ ์ ์ ๊ฑฐ)
- ์ํฐํฐ ์ถ์ถ 6,825 โ 12,756 (+87%)
| ๋ฉํธ๋ฆญ | ๋ฌ์ฑ |
|---|---|
| ์ํ ํ์ผ ํต๊ณผ์จ | 130/141 (92.2%) |
| ์ํฐํฐ ํ์ ์ปค๋ฒ๋ฆฌ์ง | 74/74 (100%) |
| ์ด ์ถ์ถ ์ํฐํฐ | 12,756๊ฐ |
| R2007+ ํ์ผ ์ฑ๊ณต๋ฅ | 28/28 (100%) |
| ๋์ ๊ฐ์ ์จ (Phase 1 ๋๋น) | +165% |
- ์ฑ๋ฅ ์ต์ ํ (์ผ๋ถ R2018 ํ์ผ ์์ฐจ ํ์ฑ ํด๋ฐฑ)
- R13/R14 ์์ ์ง์
- ๋ณด์กฐ ์น์ ํ์ ํ์ฅ (AppInfo, Preview, XData)
- ์ฐ๊ธฐ ๊ธฐ๋ฅ (Phase 3)
- Java 16+
- Maven 3.6+
mvn clean compile# Windows
run_test.bat path/to/sample.dwg
# macOS/Linux
./run_test.sh path/to/sample.dwg
# ์ง์ ์คํ
mvn compile
java -cp target/classes:target/dependency/* \
io.dwg.test.DwgParsingStageTest path/to/sample.dwg์์ธํ ํ ์คํธ ๊ฐ์ด๋๋ TESTING.md ์ฐธ์กฐ.
๋ฌธ์ : R2010, R2013, R2018 ํ์ผ์ด 0๊ฐ ์ํฐํฐ ์ถ์ถ (์์ ์คํจ)
๊ทผ๋ณธ ์์ธ: libredwg๋ฅผ ์ฐธ๊ณ ํ ๊ฒฐ๊ณผ, ํ์ผ ๊ตฌ์กฐ ๋ผ์ฐํ ์์ ์ค๋ํ ์ํคํ ์ฒ ์ฐจ์ด ๋ฐ๊ฒฌ
// libredwg/src/decode.c:222-226
VERSIONS (R_2007a, R_2007) { return decode_R2007 (dat, dwg); }
SINCE (R_2010b) { return decode_R2004 (dat, dwg); }๋ฐ๊ฒฌ: R2010, R2013, R2018์ R2004 ํ์ผ ๊ตฌ์กฐ ์ฌ์ฉ
- R2007์ ์ ์ผํ๊ฒ Reed-Solomon(255,239) ํค๋ ์ํธํ ์ฌ์ฉ
- R2010+๋ R2004 ๋ฐฉ์ (XOR ์ํธํ + LZ77)
ํด๊ฒฐ: ํ์ผ ๋ผ์ฐํ ๋ณ๊ฒฝ
// Before: R2010/R2013/R2018 โ R2007FileStructureHandler (XOR ๊ตฌ์กฐ๋ก RS ์ฝ์ผ๋ ค๋ค ์คํจ)
// After: R2010/R2013/R2018 โ R2004FileStructureHandler (์ฌ๋ฐ๋ฅธ ๊ตฌ์กฐ)
case R2004: case R2010: case R2013: case R2018:
return new R2004FileStructureHandler();
case R2007:
return new R2007FileStructureHandler();๋ณด๋์ค ๋ฐ๊ฒฌ: Reed-Solomon ๋์ฝ๋ ๋จ์ํ
- libredwg๋ RS ์๋ฌ ์ ์ ํธ์ถ์ ์ฃผ์ ์ฒ๋ฆฌ
- ๋์ฝ๋๋ฅผ deinterleave ์ ์ฉ์ผ๋ก ๋จ์ํ
- ์ด์ Berlekamp-Massey ์๋ฌ ์ ์ ์ ๊ฑฐ
๊ฒฐ๊ณผ:
- R2010+ ์ฑ๊ณต๋ฅ : 7% โ 100%
- ์ถ์ถ ์ํฐํฐ: 6,825 โ 12,756 (+87%)
์๊ณ ๋ฆฌ์ฆ ๋ฒ๊ทธ๋ก ๋ณด์ด๋ ๋ฌธ์ ๋ฅผ ์กฐ์ฌํ ๋๋ ๋จผ์ ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ๋ฐ๋ฅธ ์ ๋ ฅ์ ๋ฐ๋์ง ํ์ธํ์ธ์. ์ด ๊ฒฝ์ฐ ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ ์ ์์ด์์ง๋ง ์๋ชป๋ ํ์ผ ๊ตฌ์กฐ๋ก ๋ผ์ฐํ ๋์ด ์์์ต๋๋ค.
import io.dwg.api.DwgReader;
import io.dwg.api.DwgDocument;
import io.dwg.entities.DwgEntity;
import java.nio.file.Paths;
// DWG ํ์ผ ์ฝ๊ธฐ
DwgDocument doc = DwgReader.defaultReader()
.open(Paths.get("drawing.dwg"));
// ๋ฌธ์ ์ ๋ณด
System.out.println("๋ฒ์ : " + doc.version());
System.out.println("๊ฐ์ฒด ์: " + doc.objectMap().size());
// ๋ ์ด์ด ์กฐํ
doc.layer("0")
.ifPresent(layer -> System.out.println("0 ๋ ์ด์ด ์์: " + layer.color()));
// ์ํฐํฐ ์กฐํ
List<DwgEntity> entities = doc.entities();
for (DwgEntity e : entities) {
System.out.println(e.objectType() + " at handle 0x" + Long.toHexString(e.handle()));
}| ๋ฒ์ | ์ฝ๊ธฐ | ์ํฐํฐ ์ถ์ถ | ํ์ผ ์ฑ๊ณต๋ฅ | ์ต๋ ์ํฐํฐ/ํ์ผ |
|---|---|---|---|---|
| R13 | ๐ก ๊ธฐ๋ณธ | ๐ก ํด๋ฐฑ | ์ผ๋ถ | - |
| R14 | ๐ก ๊ธฐ๋ณธ | ๐ก ํด๋ฐฑ | ์ผ๋ถ | - |
| R2000 | ๐ข ์์ฑ | ๐ข ์์ฑ | 100% | 500+ |
| R2004 | ๐ข ์์ฑ | ๐ข ์์ฑ | 100% | 2,500+ |
| R2007 | ๐ข ์์ฑ | ๐ข ์์ฑ | 100% | 600+ |
| R2010 | ๐ข ์์ฑ | ๐ข ์์ฑ | 100% | 300+ |
| R2013 | ๐ข ์์ฑ | ๐ข ์์ฑ | 100% | 500+ |
| R2018 | ๐ข ์์ฑ | ๐ข ์์ฑ | 100% | 400+ |
๋ฒ๋ก: ๐ข ์์ฑ / ๐ก ๊ธฐ๋ณธ/ํด๋ฐฑ / โ ๋ฏธ๊ตฌํ
๊ธฐํํ ์ํฐํฐ (30๊ฐ)
- 2D: LINE, CIRCLE, ARC, POLYLINE, LWPOLYLINE, SPLINE, ELLIPSE, TEXT, MTEXT
- 3D: 3DFACE, 3DPOLYLINE, REGION, SOLID, TRACE, SHAPE, MULTILEADER, ARC_DIMENSION
- ํน์: HATCH, IMAGE, UNDERLAY, WIPEOUT, SURFACE, MESH, MLINE
๊ฐ์ฒด ๋ฐ ์ ์ด (44๊ฐ)
- LAYER, LINETYPE, STYLE, DIMSTYLE, APPID, UCS, VIEW, VPORT
- ์ ์ด ๊ฐ์ฒด: BLOCK_CONTROL, ENDBLK, INSERT
- ์์ฑ: XREF, ATTRIB, ATTDEF
- ํ ์ด๋ธ: TABLE, SCALE_LIST, TABLESTYLE, CELLSTYLE, PLOTSTYLE
- ๋ฐ์ดํฐ: DICTIONARY, DICTIONARYVAR, LAYOUT, MATERIAL, DATASOURCE
- ๊ธฐํ: TOLERANCE, LEADER, OLE2FRAME, PROXY, PERSSUBENTMANAGER
[ํ์ผ ์ฝ๊ธฐ] โ [๋ฒ์ ๊ฐ์ง] โ [ํค๋ ํ์ฑ] โ [์น์
์ถ์ถ]
โ โ โ โ
1๋จ๊ณ 2๋จ๊ณ 3๋จ๊ณ 4๋จ๊ณ
[์น์
ํ์ฑ] โ [๊ฐ์ฒด ์์ฑ] โ [DwgDocument] โ [API ์ฌ์ฉ]
โ โ โ โ
5๋จ๊ณ 5๋จ๊ณ 6๋จ๊ณ ์ต์ข
๊ฐ ๋จ๊ณ๋ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธ ๊ฐ๋ฅํฉ๋๋ค (DwgParsingStageTest ์ฐธ๊ณ ).
DwgReaderโ ํ์ผ ์ฝ๊ธฐDwgWriterโ ํ์ผ ์ฐ๊ธฐDwgDocumentโ ํ์ฑ๋ ๋ฌธ์
DwgObjectโ ๋ชจ๋ ๊ฐ์ฒด์ ๊ธฐ๋ณธ ์ธํฐํ์ด์คDwgEntityโ ๋ํ ์ํฐํฐDwgVersionโ ๋ฒ์ ์ด๊ฑฐ ๋ฐ ๋ฒ์ ๋น๊ตHeaderVariablesโ ํค๋ ๋ณ์ (500+๊ฐ)HandleRegistryโ ํธ๋ค โ ์คํ์ ๋งคํ
BitStreamReaderโ ๋นํธ ๋จ์ ์ฝ๊ธฐBitStreamWriterโ ๋นํธ ๋จ์ ์ฐ๊ธฐByteBufferBitInputโ ๋ฒํผ ๊ธฐ๋ฐ ์ ๋ ฅByteBufferBitOutputโ ๋ฒํผ ๊ธฐ๋ฐ ์ถ๋ ฅ
MIT License
- OpenDesign Specification โ ๊ณต์ ์คํ
- AutoCAD DWG ํฌ๋งท ์ํค
- Autodesk ๊ณต์ ๋ฌธ์
์ด์ ๋ฐ PR์ ํ์ํฉ๋๋ค.
- Initial design: ebandal
- Contributors: ์ปค๋ฎค๋ํฐ (ํ์ฌ)