diff --git a/B07_DesignDetail/openwebcad/src/helpers/import-export-handlers/import-entities-from-json.ts b/B07_DesignDetail/openwebcad/src/helpers/import-export-handlers/import-entities-from-json.ts index f02d5cd2..6783c378 100644 --- a/B07_DesignDetail/openwebcad/src/helpers/import-export-handlers/import-entities-from-json.ts +++ b/B07_DesignDetail/openwebcad/src/helpers/import-export-handlers/import-entities-from-json.ts @@ -1,22 +1,22 @@ -import { compact } from "es-toolkit"; -import { ArcEntity, type ArcJsonData } from "../../entities/ArcEntity"; -import { CircleEntity, type CircleJsonData } from "../../entities/CircleEntity"; -import { type Entity, EntityName, type JsonEntity } from "../../entities/Entity"; -import { HatchEntity, type HatchJsonData } from "../../entities/HatchEntity"; -import { ImageEntity, type ImageJsonData } from "../../entities/ImageEntity.ts"; -import { LineEntity, type LineJsonData } from "../../entities/LineEntity"; -import { MeasurementEntity, type MeasurementJsonData } from "../../entities/MeasurementEntity.ts"; -import { PointEntity, type PointJsonData } from "../../entities/PointEntity"; -import { PolyLineEntity, type PolyLineJsonData } from "../../entities/PolyLineEntity.ts"; -import { RectangleEntity, type RectangleJsonData } from "../../entities/RectangleEntity"; -import { TableEntity, type TableJsonData } from "../../entities/TableEntity.ts"; -import { TextEntity, type TextJsonData } from "../../entities/TextEntity.ts"; -import { setActiveLayerId, setEntities, setLayers } from "../../state"; -import { getNewLayer } from "../get-new-layer.ts"; +import { compact } from 'es-toolkit'; +import { ArcEntity, type ArcJsonData } from '../../entities/ArcEntity'; +import { CircleEntity, type CircleJsonData } from '../../entities/CircleEntity'; +import { type Entity, EntityName, type JsonEntity } from '../../entities/Entity'; +import { HatchEntity, type HatchJsonData } from '../../entities/HatchEntity'; +import { ImageEntity, type ImageJsonData } from '../../entities/ImageEntity.ts'; +import { LineEntity, type LineJsonData } from '../../entities/LineEntity'; +import { MeasurementEntity, type MeasurementJsonData } from '../../entities/MeasurementEntity.ts'; +import { PointEntity, type PointJsonData } from '../../entities/PointEntity'; +import { PolyLineEntity, type PolyLineJsonData } from '../../entities/PolyLineEntity.ts'; +import { RectangleEntity, type RectangleJsonData } from '../../entities/RectangleEntity'; +import { TableEntity, type TableJsonData } from '../../entities/TableEntity.ts'; +import { TextEntity, type TextJsonData } from '../../entities/TextEntity.ts'; +import { setActiveLayerId, setEntities, setLayers } from '../../state'; +import { getNewLayer } from '../get-new-layer.ts'; import type { - JsonDrawingFileDeserialized, - JsonDrawingFileSerialized, -} from "./export-entities-to-json"; + JsonDrawingFileDeserialized, + JsonDrawingFileSerialized, +} from './export-entities-to-json'; /** * Open a file selection dialog to select *.json files @@ -25,83 +25,83 @@ import type { * Set the entities in the state */ export function importEntitiesFromJsonFile(file: File | null | undefined) { - return new Promise((resolve) => { - if (!file) return; + return new Promise((resolve) => { + if (!file) return; - const reader = new FileReader(); - reader.addEventListener("load", async () => { - const json = reader.result as string; - const file = await getEntitiesAndLayersFromJsonString(json); - setEntities(file.entities); - setLayers(file.layers); - setActiveLayerId(file.layers[0].id); - resolve(); - }); - reader.readAsText(file, "utf-8"); - }); + const reader = new FileReader(); + reader.addEventListener('load', async () => { + const json = reader.result as string; + const file = await getEntitiesAndLayersFromJsonString(json); + setEntities(file.entities); + setLayers(file.layers); + setActiveLayerId(file.layers[0].id); + resolve(); + }); + reader.readAsText(file, 'utf-8'); + }); } export async function getEntitiesAndLayersFromJsonObject( - data: JsonDrawingFileSerialized, + data: JsonDrawingFileSerialized ): Promise { - const entityPromises: Promise[] = compact( - data.entities.map((entity) => { - switch (entity.type) { - case EntityName.Arc: - return ArcEntity.fromJson(entity as JsonEntity); - case EntityName.Circle: - return CircleEntity.fromJson(entity as JsonEntity); - case EntityName.Line: - return LineEntity.fromJson(entity as JsonEntity); - case EntityName.Point: - return PointEntity.fromJson(entity as JsonEntity); - case EntityName.Rectangle: - return RectangleEntity.fromJson(entity as JsonEntity); - case EntityName.Text: - return TextEntity.fromJson(entity as JsonEntity); - case EntityName.Measurement: - return MeasurementEntity.fromJson(entity as JsonEntity); - case EntityName.Image: - return ImageEntity.fromJson(entity as JsonEntity); - case EntityName.PolyLine: - return PolyLineEntity.fromJson(entity as JsonEntity); - case EntityName.Hatch: - return HatchEntity.fromJson(entity as JsonEntity); - case EntityName.Table: - return TableEntity.fromJson(entity as JsonEntity); + const entityPromises: Promise[] = compact( + data.entities.map((entity) => { + switch (entity.type) { + case EntityName.Arc: + return ArcEntity.fromJson(entity as JsonEntity); + case EntityName.Circle: + return CircleEntity.fromJson(entity as JsonEntity); + case EntityName.Line: + return LineEntity.fromJson(entity as JsonEntity); + case EntityName.Point: + return PointEntity.fromJson(entity as JsonEntity); + case EntityName.Rectangle: + return RectangleEntity.fromJson(entity as JsonEntity); + case EntityName.Text: + return TextEntity.fromJson(entity as JsonEntity); + case EntityName.Measurement: + return MeasurementEntity.fromJson(entity as JsonEntity); + case EntityName.Image: + return ImageEntity.fromJson(entity as JsonEntity); + case EntityName.PolyLine: + return PolyLineEntity.fromJson(entity as JsonEntity); + case EntityName.Hatch: + return HatchEntity.fromJson(entity as JsonEntity); + case EntityName.Table: + return TableEntity.fromJson(entity as JsonEntity); - default: - throw new Error(`Invalid entity type: ${entity.type}`); - } - }), - ); + default: + throw new Error(`Invalid entity type: ${entity.type}`); + } + }) + ); - const entities = compact(await Promise.all(entityPromises)); - // 순번이 아니라 id로 되돌린다 — compact가 null을 걷어 index가 어긋날 수 있다. - const groupIdById = new Map(data.entities.map((entity) => [entity.id, entity.groupId])); - for (const entity of entities) { - const groupId = groupIdById.get(entity.id); - if (groupId) entity.groupId = groupId; - } - let layers = data.layers; - if (!layers || layers.length === 0) { - layers = [getNewLayer()]; - } - return { - entities, - layers, - }; + const entities = compact(await Promise.all(entityPromises)); + // 순번이 아니라 id로 되돌린다 — compact가 null을 걷어 index가 어긋날 수 있다. + const groupIdById = new Map(data.entities.map((entity) => [entity.id, entity.groupId])); + for (const entity of entities) { + const groupId = groupIdById.get(entity.id); + if (groupId) entity.groupId = groupId; + } + let layers = data.layers; + if (!layers || layers.length === 0) { + layers = [getNewLayer()]; + } + return { + entities, + layers, + }; } export async function getEntitiesAndLayersFromJsonString( - json: string, + json: string ): Promise { - const data = JSON.parse(json) as JsonDrawingFileSerialized; + const data = JSON.parse(json) as JsonDrawingFileSerialized; - if (!data.entities) { - throw new Error("Invalid JSON file"); - } + if (!data.entities) { + throw new Error('Invalid JSON file'); + } - // TODO use map limit to avoid overloading the event loop - return await getEntitiesAndLayersFromJsonObject(data); + // TODO use map limit to avoid overloading the event loop + return await getEntitiesAndLayersFromJsonObject(data); }