UNPKG

ducjs

Version:

The duc 2D CAD file format is a cornerstone of our advanced design system, conceived to cater to professionals seeking precision and efficiency in their design work.

225 lines (224 loc) 13.6 kB
import { ANGULAR_UNITS_FORMAT, DECIMAL_SEPARATOR, DIMENSION_UNITS_FORMAT, GRID_DISPLAY_TYPE, GRID_TYPE, UNIT_SYSTEM, } from "../flatbuffers/duc"; import { isValidBoolean, isValidEnumValue, isValidRadianValue, isValidString, restorePrecisionValue } from "./restoreDataState"; import { NEUTRAL_SCOPE, ScaleFactors } from "../technical"; import { PREDEFINED_STANDARDS } from "../technical/standards"; export const restoreStandards = (standards, // Pass current scope to resolve precision values if needed currentScope = NEUTRAL_SCOPE) => { if (!Array.isArray(standards) || standards.length === 0) { // If no standards are provided, return a default set. return DEFAULT_STANDARDS; } const restoredStandards = []; const restoredIds = new Set(); for (const s of standards) { if (!s || typeof s !== 'object') continue; const identifier = restoreIdentifier(s); if (!identifier || restoredIds.has(identifier.id)) { continue; // Skip if no valid ID or if ID is a duplicate } restoredStandards.push(Object.assign(Object.assign({}, identifier), { version: isValidString(s.version, "1.0.0"), readonly: isValidBoolean(s.readonly, false), overrides: restoreStandardOverrides(s.overrides, currentScope), styles: restoreStandardStyles(s.styles, currentScope), viewSettings: restoreStandardViewSettings(s.viewSettings, currentScope), units: restoreStandardUnits(s.units, currentScope), validation: restoreStandardValidation(s.validation, currentScope) })); restoredIds.add(identifier.id); } // Ensure the default standard is always present if it was missed if (!restoredIds.has(PREDEFINED_STANDARDS.DUC)) { restoredStandards.unshift(getDefaultStandard()); } return restoredStandards; }; // This would typically be defined in a central place with other default objects const getDefaultStandard = () => ({ id: PREDEFINED_STANDARDS.DUC, name: "DUC", version: "1.0.0", readonly: true, overrides: null, styles: null, viewSettings: null, units: null, validation: null, }); const DEFAULT_STANDARDS = [ getDefaultStandard(), // Potentially add other predefined standards here if they should always be present ]; /** * Checks if a given id is present in the standards array. * @returns true if found, false otherwise. */ export const isStandardIdPresent = (id, standards) => { if (!Array.isArray(standards) || typeof id !== "string") return false; return standards.some(s => typeof s.id === "string" && s.id === id); }; // --- Helper Functions for Restoration --- const restoreIdentifier = (ident) => { if (!ident || typeof ident !== 'object' || !isValidString(ident.id)) { return null; } return { id: ident.id, name: isValidString(ident.name, ident.id), description: isValidString(ident.description) || undefined, }; }; const restoreStandardUnits = (units, currentScope) => { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r; if (!units || typeof units !== 'object') return null; const primary = units.primaryUnits; const alternate = units.alternateUnits; if (!primary || !alternate) return null; return { primaryUnits: { linear: { format: isValidEnumValue((_a = primary.linear) === null || _a === void 0 ? void 0 : _a.format, DIMENSION_UNITS_FORMAT, DIMENSION_UNITS_FORMAT.DECIMAL), system: isValidEnumValue((_b = primary.linear) === null || _b === void 0 ? void 0 : _b.system, UNIT_SYSTEM, UNIT_SYSTEM.METRIC), precision: (_d = (_c = primary.linear) === null || _c === void 0 ? void 0 : _c.precision) !== null && _d !== void 0 ? _d : 2, suppressLeadingZeros: isValidBoolean((_e = primary.linear) === null || _e === void 0 ? void 0 : _e.suppressLeadingZeros, false), suppressTrailingZeros: isValidBoolean((_f = primary.linear) === null || _f === void 0 ? void 0 : _f.suppressTrailingZeros, false), decimalSeparator: isValidEnumValue((_g = primary.linear) === null || _g === void 0 ? void 0 : _g.decimalSeparator, DECIMAL_SEPARATOR, DECIMAL_SEPARATOR.DOT), suppressZeroFeet: isValidBoolean((_h = primary.linear) === null || _h === void 0 ? void 0 : _h.suppressZeroFeet, false), suppressZeroInches: isValidBoolean((_j = primary.linear) === null || _j === void 0 ? void 0 : _j.suppressZeroInches, false), }, angular: { format: isValidEnumValue((_k = primary.angular) === null || _k === void 0 ? void 0 : _k.format, ANGULAR_UNITS_FORMAT, ANGULAR_UNITS_FORMAT.DECIMAL_DEGREES), system: isValidEnumValue((_l = primary.angular) === null || _l === void 0 ? void 0 : _l.system, UNIT_SYSTEM, UNIT_SYSTEM.METRIC), precision: (_o = (_m = primary.angular) === null || _m === void 0 ? void 0 : _m.precision) !== null && _o !== void 0 ? _o : 2, suppressLeadingZeros: isValidBoolean((_p = primary.angular) === null || _p === void 0 ? void 0 : _p.suppressLeadingZeros, false), suppressTrailingZeros: isValidBoolean((_q = primary.angular) === null || _q === void 0 ? void 0 : _q.suppressTrailingZeros, false), }, }, alternateUnits: { format: isValidEnumValue(alternate === null || alternate === void 0 ? void 0 : alternate.format, DIMENSION_UNITS_FORMAT, DIMENSION_UNITS_FORMAT.DECIMAL), system: isValidEnumValue(alternate === null || alternate === void 0 ? void 0 : alternate.system, UNIT_SYSTEM, UNIT_SYSTEM.METRIC), precision: (_r = alternate === null || alternate === void 0 ? void 0 : alternate.precision) !== null && _r !== void 0 ? _r : 2, suppressLeadingZeros: isValidBoolean(alternate === null || alternate === void 0 ? void 0 : alternate.suppressLeadingZeros, false), suppressTrailingZeros: isValidBoolean(alternate === null || alternate === void 0 ? void 0 : alternate.suppressTrailingZeros, false), isVisible: isValidBoolean(alternate === null || alternate === void 0 ? void 0 : alternate.isVisible, false), multiplier: typeof (alternate === null || alternate === void 0 ? void 0 : alternate.multiplier) === 'number' ? alternate.multiplier : 1, } }; }; const restoreStandardOverrides = (overrides, currentScope) => { if (!overrides || typeof overrides !== 'object') return null; return { mainScope: isValidEnumValue(overrides.mainScope, ScaleFactors, undefined), elementsStrokeWidthOverride: overrides.elementsStrokeWidthOverride ? restorePrecisionValue(overrides.elementsStrokeWidthOverride, NEUTRAL_SCOPE, currentScope) : undefined, commonStyleId: isValidString(overrides.commonStyleId) || undefined, stackLikeStyleId: isValidString(overrides.stackLikeStyleId) || undefined, textStyleId: isValidString(overrides.textStyleId) || undefined, dimensionStyleId: isValidString(overrides.dimensionStyleId) || undefined, leaderStyleId: isValidString(overrides.leaderStyleId) || undefined, featureControlFrameStyleId: isValidString(overrides.featureControlFrameStyleId) || undefined, tableStyleId: isValidString(overrides.tableStyleId) || undefined, docStyleId: isValidString(overrides.docStyleId) || undefined, viewportStyleId: isValidString(overrides.viewportStyleId) || undefined, plotStyleId: isValidString(overrides.plotStyleId) || undefined, hatchStyleId: isValidString(overrides.hatchStyleId) || undefined, activeGridSettingsId: Array.isArray(overrides.activeGridSettingsId) ? overrides.activeGridSettingsId.map(String) : undefined, activeSnapSettingsId: isValidString(overrides.activeSnapSettingsId) || undefined, dashLineOverride: isValidString(overrides.dashLineOverride) || undefined, unitPrecision: overrides.unitPrecision ? { linear: typeof overrides.unitPrecision.linear === 'number' ? overrides.unitPrecision.linear : undefined, angular: typeof overrides.unitPrecision.angular === 'number' ? overrides.unitPrecision.angular : undefined, area: typeof overrides.unitPrecision.area === 'number' ? overrides.unitPrecision.area : undefined, volume: typeof overrides.unitPrecision.volume === 'number' ? overrides.unitPrecision.volume : undefined, } : undefined, }; }; const restoreStandardStyles = (styles, currentScope) => { if (!styles || typeof styles !== 'object') return null; // This is a simplified restoration. A full implementation would deeply restore each style object. return { commonStyles: styles.commonStyles || [], stackLikeStyles: styles.stackLikeStyles || [], textStyles: styles.textStyles || [], dimensionStyles: styles.dimensionStyles || [], leaderStyles: styles.leaderStyles || [], featureControlFrameStyles: styles.featureControlFrameStyles || [], tableStyles: styles.tableStyles || [], docStyles: styles.docStyles || [], viewportStyles: styles.viewportStyles || [], hatchStyles: styles.hatchStyles || [], xrayStyles: styles.xrayStyles || [], }; }; const restoreGridSettings = (settings, currentScope) => { if (!settings || typeof settings !== 'object') return null; const defaultGridStyle = { color: '#000000', opacity: 0.2, dashPattern: [] }; return { type: isValidEnumValue(settings.type, GRID_TYPE, GRID_TYPE.RECTANGULAR), readonly: isValidBoolean(settings.readonly, false), displayType: isValidEnumValue(settings.displayType, GRID_DISPLAY_TYPE, GRID_DISPLAY_TYPE.LINES), isAdaptive: isValidBoolean(settings.isAdaptive, true), xSpacing: restorePrecisionValue(settings.xSpacing, NEUTRAL_SCOPE, currentScope, 100), ySpacing: restorePrecisionValue(settings.ySpacing, NEUTRAL_SCOPE, currentScope, 100), subdivisions: typeof settings.subdivisions === 'number' ? settings.subdivisions : 10, origin: settings.origin || { x: 0, y: 0 }, rotation: isValidRadianValue(settings.rotation, 0), followUCS: isValidBoolean(settings.followUCS, false), majorStyle: settings.majorStyle || defaultGridStyle, minorStyle: settings.minorStyle || defaultGridStyle, showMinor: isValidBoolean(settings.showMinor, true), minZoom: typeof settings.minZoom === 'number' ? settings.minZoom : 0.1, maxZoom: typeof settings.maxZoom === 'number' ? settings.maxZoom : 100, autoHide: isValidBoolean(settings.autoHide, true), polarSettings: settings.polarSettings, isometricSettings: settings.isometricSettings, enableSnapping: isValidBoolean(settings.enableSnapping, true), }; }; const restoreStandardViewSettings = (viewSettings, currentScope) => { if (!viewSettings || typeof viewSettings !== 'object') return null; const restoredViews = (Array.isArray(viewSettings.views) ? viewSettings.views : []) .map((v) => { const identifier = restoreIdentifier(v); // ... deep restore of DucView ... return identifier ? Object.assign(Object.assign({}, identifier), v) : null; // simplified for now }).filter(Boolean); const restoredUcs = (Array.isArray(viewSettings.ucs) ? viewSettings.ucs : []) .map((u) => { const identifier = restoreIdentifier(u); // ... deep restore of DucUcs ... return identifier ? Object.assign(Object.assign({}, identifier), u) : null; // simplified for now }).filter(Boolean); const restoredGrids = (Array.isArray(viewSettings.gridSettings) ? viewSettings.gridSettings : []) .map((g) => { const identifier = restoreIdentifier(g); const settings = restoreGridSettings(g, currentScope); return (identifier && settings) ? Object.assign(Object.assign({}, identifier), settings) : null; }).filter(Boolean); const restoredSnaps = (Array.isArray(viewSettings.snapSettings) ? viewSettings.snapSettings : []) .map((s) => { const identifier = restoreIdentifier(s); // ... deep restore of SnapSettings ... return identifier ? Object.assign(Object.assign({}, identifier), s) : null; // simplified for now }).filter(Boolean); return { views: restoredViews, ucs: restoredUcs, gridSettings: restoredGrids, snapSettings: restoredSnaps, }; }; const restoreStandardValidation = (validation, currentScope) => { if (!validation || typeof validation !== 'object') return null; return { dimensionRules: validation.dimensionRules ? { minTextHeight: validation.dimensionRules.minTextHeight ? restorePrecisionValue(validation.dimensionRules.minTextHeight, NEUTRAL_SCOPE, currentScope) : undefined, maxTextHeight: validation.dimensionRules.maxTextHeight ? restorePrecisionValue(validation.dimensionRules.maxTextHeight, NEUTRAL_SCOPE, currentScope) : undefined, allowedPrecisions: Array.isArray(validation.dimensionRules.allowedPrecisions) ? validation.dimensionRules.allowedPrecisions.map(Number) : undefined, } : undefined, layerRules: validation.layerRules ? { prohibitedLayerNames: Array.isArray(validation.layerRules.prohibitedLayerNames) ? validation.layerRules.prohibitedLayerNames.map(String) : undefined, } : undefined, }; };