diff --git a/.gitignore b/.gitignore index 6f6f5e6..bf577d8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ *.dll *.so *.dylib +*.idea # Test binary, built with `go test -c` *.test diff --git a/pkg/parser/entities.go b/pkg/parser/entities.go index f47414b..f9d2b0a 100644 --- a/pkg/parser/entities.go +++ b/pkg/parser/entities.go @@ -255,6 +255,7 @@ func ParseInsert(r *Reader, entities entity.Entities) error { return r.Err() } +Att: for insert.AttributesFollow == 1 && r.ScanDxfLine() { switch r.DxfLine().Line { case "ATTRIB": @@ -262,10 +263,9 @@ func ParseInsert(r *Reader, entities entity.Entities) error { return r.Err() } case "SEQEND": - // marks end of insert + // marks end of attributes ParseAcDbEntity(r, insert.Entity) - entities.AppendInsert(insert) - return r.Err() + break Att default: log.Fatal("[INSERT(", Line, ")] invalid subclass marker ", r.DxfLine().Line) } @@ -275,6 +275,7 @@ func ParseInsert(r *Reader, entities entity.Entities) error { } } + entities.AppendInsert(insert) return r.Err() } diff --git a/pkg/parser/parser.go b/pkg/parser/parser.go index 0c18914..53b3b91 100644 --- a/pkg/parser/parser.go +++ b/pkg/parser/parser.go @@ -1,10 +1,6 @@ package parser -import ( - "log" - - "github.com/aichingert/dxf/pkg/drawing" -) +import "github.com/aichingert/dxf/pkg/drawing" var ( Handle uint64 = 0 @@ -44,14 +40,19 @@ func FromFile(filename string) (*drawing.Dxf, error) { switch section.Line { case "HEADER": Wrap(ParseHeader, reader, dxf) + /* + case "TABLES": + Wrap(ParseTables, reader, dxf) + */ case "BLOCKS": Wrap(ParseBlocks, reader, dxf) - case "ENTITIES": - if err := ParseEntities(reader, dxf.EntitiesData); err != nil { - return dxf, err - } + /* + case "ENTITIES": + if err := ParseEntities(reader, dxf.EntitiesData); err != nil { + return dxf, err + } + */ default: - log.Println("WARNING: section not implemented: ", section) reader.SkipToLabel("ENDSEC") } case "EOF": diff --git a/pkg/parser/reader.go b/pkg/parser/reader.go index 4ba090f..ea670e5 100644 --- a/pkg/parser/reader.go +++ b/pkg/parser/reader.go @@ -252,17 +252,10 @@ func (r *Reader) Err() error { } func (r *Reader) SkipToLabel(label string) error { - for { - line, err := r.ConsumeDxfLine() - - if err != nil { - return err - } - - if line.Line == label { - return nil - } + for r.ScanDxfLine() && r.DxfLine().Line != label { } + + return r.Err() } func (r *Reader) PeekCode() (uint16, error) { diff --git a/pkg/parser/table.go b/pkg/parser/table.go new file mode 100644 index 0000000..696e8ed --- /dev/null +++ b/pkg/parser/table.go @@ -0,0 +1,60 @@ +package parser + +import ( + "log" + + "github.com/aichingert/dxf/pkg/drawing" + _ "github.com/aichingert/dxf/pkg/entity" +) + +func ParseTables(r *Reader, dxf *drawing.Dxf) error { + for r.ScanDxfLine() { + switch r.DxfLine().Line { + case "TABLE": + Wrap(parseTable, r, dxf) + case "ENDSEC": + return r.Err() + default: + log.Println("Table(", Line, "): ", r.DxfLine().Line) + return r.Err() + } + + if WrappedErr != nil { + return WrappedErr + } + } + + return r.Err() +} + +func parseTable(r *Reader, dxf *drawing.Dxf) error { + + for r.ScanDxfLine() { + switch r.DxfLine().Line { + case "VPORT": + fallthrough + case "LTYPE": + fallthrough + case "LAYER": + fallthrough + case "STYLE": + fallthrough + case "VIEW": + fallthrough + case "UCS": + fallthrough + case "APPID": + fallthrough + case "DIMSTYLE": + r.SkipToLabel("ENDTAB") + return r.Err() + + log.Fatal(r.DxfLine()) + default: + log.Fatal(Line, r.DxfLine()) + } + + } + + return r.Err() +}