Skip to content

Commit 703e3c5

Browse files
authored
add: parse kicad9 embeded_files property (#155)
1 parent 06a9cd9 commit 703e3c5

3 files changed

Lines changed: 82 additions & 4 deletions

File tree

‎src/kicad/board.ts‎

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
Stroke,
1414
TitleBlock,
1515
expand_text_vars,
16+
EmbeddedFile,
1617
StrokeParams,
1718
type HasNetName,
1819
type HasUniqueID,
@@ -34,7 +35,11 @@ export class KicadPCB {
3435
project?: Project;
3536
version: number;
3637
generator?: string;
37-
general?: { thickness: number };
38+
generator_version?: string;
39+
general? = {
40+
thickness: 1.6,
41+
legacy_teardrops: false,
42+
};
3843
paper?: Paper;
3944
title_block = new TitleBlock();
4045
setup?: Setup;
@@ -47,6 +52,8 @@ export class KicadPCB {
4752
vias: Via[] = [];
4853
drawings: Drawing[] = [];
4954
groups: Group[] = [];
55+
embedded_fonts: boolean = false;
56+
embedded_files: EmbeddedFile[] = [];
5057

5158
constructor(
5259
public filename: string,
@@ -59,7 +66,13 @@ export class KicadPCB {
5966
P.start("kicad_pcb"),
6067
P.pair("version", T.number),
6168
P.pair("generator", T.string),
62-
P.object("general", {}, P.pair("thickness", T.number)),
69+
P.pair("generator_version", T.string),
70+
P.object(
71+
"general",
72+
{},
73+
P.pair("thickness", T.number),
74+
P.pair("legacy_teardrops", T.boolean),
75+
),
6376
P.item("paper", Paper),
6477
P.item("title_block", TitleBlock),
6578
P.list("layers", T.item(Layer)),
@@ -88,6 +101,8 @@ export class KicadPCB {
88101
P.collection("drawings", "gr_rect", T.item(GrRect, this)),
89102
P.collection("drawings", "gr_text", T.item(GrText, this)),
90103
P.collection("groups", "group", T.item(Group)),
104+
P.pair("embedded_fonts", T.boolean),
105+
P.list("embedded_files", T.item(EmbeddedFile)),
91106
),
92107
);
93108

@@ -854,6 +869,8 @@ export class Footprint implements HasUniqueID {
854869
#pads_by_number = new Map<string, Pad>();
855870
zones: Zone[] = [];
856871
models: Model[] = [];
872+
embedded_fonts: boolean = false;
873+
embedded_files: EmbeddedFile[] = [];
857874
#bbox: BBox;
858875

859876
constructor(
@@ -911,6 +928,8 @@ export class Footprint implements HasUniqueID {
911928
P.collection("zones", "zone", T.item(Zone, this)),
912929
P.collection("models", "model", T.item(Model)),
913930
P.collection("pads", "pad", T.item(Pad, this)),
931+
P.pair("embedded_fonts", T.boolean),
932+
P.list("embedded_files", T.item(EmbeddedFile)),
914933
),
915934
);
916935

@@ -1763,9 +1782,10 @@ export class Model {
17631782
}
17641783
}
17651784

1766-
export class Group {
1785+
export class Group implements HasUniqueID {
17671786
name: string;
1768-
id: string;
1787+
id?: string;
1788+
uuid?: string;
17691789
locked = false;
17701790
members: string[];
17711791

@@ -1778,8 +1798,13 @@ export class Group {
17781798
P.positional("name", T.string),
17791799
P.atom("locked"),
17801800
P.pair("id", T.string),
1801+
P.pair("uuid", T.string),
17811802
P.list("members", T.string),
17821803
),
17831804
);
17841805
}
1806+
1807+
get unique_id(): string | undefined {
1808+
return this.uuid ?? this.id;
1809+
}
17851810
}

‎src/kicad/common.ts‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,48 @@ export class Stroke {
362362
}
363363
}
364364

365+
export enum EmbeddedFileType {
366+
Datasheet = "datasheet",
367+
Font = "font",
368+
Model = "model",
369+
Worksheet = "worksheet",
370+
Other = "other",
371+
}
372+
373+
export class EmbeddedFile {
374+
name: string;
375+
type: EmbeddedFileType;
376+
data?: string;
377+
checksum: string;
378+
379+
constructor(expr: Parseable) {
380+
Object.assign(
381+
this,
382+
parse_expr(
383+
expr,
384+
P.start("file"),
385+
P.pair("name", T.string),
386+
P.pair("type", T.string),
387+
P.pair("data", T.string),
388+
P.pair("checksum", T.string),
389+
),
390+
);
391+
}
392+
393+
async decompress_file(): Promise<File | undefined> {
394+
// see also:
395+
// https://gitlab.com/kicad/code/kicad/-/blob/master/common/embedded_files.cpp#L253
396+
if (!this.data) {
397+
// need be found in the board file
398+
return undefined;
399+
}
400+
401+
// TODO
402+
403+
return undefined;
404+
}
405+
}
406+
365407
/** Stroke and additional parameters for dashed lines. */
366408
export class StrokeParams {
367409
stroke: Stroke;

‎src/kicad/schematic.ts‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
Paper,
1515
Stroke,
1616
TitleBlock,
17+
EmbeddedFile,
1718
expand_text_vars,
1819
unescape_string,
1920
} from "./common";
@@ -59,6 +60,7 @@ export class KicadSch {
5960
project?: Project;
6061
version: number;
6162
generator?: string;
63+
generator_version?: string;
6264
uuid: string;
6365
paper?: Paper;
6466
title_block = new TitleBlock();
@@ -78,6 +80,8 @@ export class KicadSch {
7880
sheet_instances?: SheetInstances;
7981
symbol_instances?: SymbolInstances;
8082
sheets: SchematicSheet[] = [];
83+
embedded_fonts: boolean = false;
84+
embedded_files: EmbeddedFile[] = [];
8185

8286
constructor(
8387
public filename: string,
@@ -90,6 +94,7 @@ export class KicadSch {
9094
P.start("kicad_sch"),
9195
P.pair("version", T.number),
9296
P.pair("generator", T.string),
97+
P.pair("generator_version", T.string),
9398
P.pair("uuid", T.string),
9499
P.item("paper", Paper),
95100
P.item("title_block", TitleBlock),
@@ -126,6 +131,8 @@ export class KicadSch {
126131
P.item("sheet_instances", SheetInstances),
127132
P.item("symbol_instances", SymbolInstances),
128133
P.collection("sheets", "sheet", T.item(SchematicSheet, this)),
134+
P.pair("embedded_fonts", T.boolean),
135+
P.list("embedded_files", T.item(EmbeddedFile)),
129136
),
130137
);
131138

@@ -812,6 +819,8 @@ export class LibSymbol {
812819
drawings: Drawing[] = [];
813820
pins: PinDefinition[] = [];
814821
units: Map<number, LibSymbol[]> = new Map();
822+
embedded_fonts = false;
823+
embedded_files: EmbeddedFile[] = [];
815824

816825
#pins_by_number: Map<string, PinDefinition> = new Map();
817826
#properties_by_id: Map<number, Property> = new Map();
@@ -852,6 +861,8 @@ export class LibSymbol {
852861
P.collection("drawings", "rectangle", T.item(Rectangle, this)),
853862
P.collection("drawings", "text", T.item(LibText, this)),
854863
P.collection("drawings", "textbox", T.item(TextBox, this)),
864+
P.pair("embedded_fonts", T.boolean),
865+
P.collection("embedded_files", "file", T.item(EmbeddedFile)),
855866
),
856867
);
857868

0 commit comments

Comments
 (0)