@ifc-lite/drawing-2d 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +373 -0
- package/dist/drawing-generator.d.ts +80 -0
- package/dist/drawing-generator.d.ts.map +1 -0
- package/dist/drawing-generator.js +281 -0
- package/dist/drawing-generator.js.map +1 -0
- package/dist/edge-extractor.d.ts +47 -0
- package/dist/edge-extractor.d.ts.map +1 -0
- package/dist/edge-extractor.js +204 -0
- package/dist/edge-extractor.js.map +1 -0
- package/dist/gpu-section-cutter.d.ts +42 -0
- package/dist/gpu-section-cutter.d.ts.map +1 -0
- package/dist/gpu-section-cutter.js +405 -0
- package/dist/gpu-section-cutter.js.map +1 -0
- package/dist/graphic-overrides/index.d.ts +10 -0
- package/dist/graphic-overrides/index.d.ts.map +1 -0
- package/dist/graphic-overrides/index.js +8 -0
- package/dist/graphic-overrides/index.js.map +1 -0
- package/dist/graphic-overrides/presets.d.ts +22 -0
- package/dist/graphic-overrides/presets.d.ts.map +1 -0
- package/dist/graphic-overrides/presets.js +283 -0
- package/dist/graphic-overrides/presets.js.map +1 -0
- package/dist/graphic-overrides/rule-engine.d.ts +64 -0
- package/dist/graphic-overrides/rule-engine.d.ts.map +1 -0
- package/dist/graphic-overrides/rule-engine.js +438 -0
- package/dist/graphic-overrides/rule-engine.js.map +1 -0
- package/dist/graphic-overrides/types.d.ts +200 -0
- package/dist/graphic-overrides/types.d.ts.map +1 -0
- package/dist/graphic-overrides/types.js +5 -0
- package/dist/graphic-overrides/types.js.map +1 -0
- package/dist/hatch-generator.d.ts +76 -0
- package/dist/hatch-generator.d.ts.map +1 -0
- package/dist/hatch-generator.js +282 -0
- package/dist/hatch-generator.js.map +1 -0
- package/dist/hidden-line.d.ts +64 -0
- package/dist/hidden-line.d.ts.map +1 -0
- package/dist/hidden-line.js +318 -0
- package/dist/hidden-line.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/line-merger.d.ts +35 -0
- package/dist/line-merger.d.ts.map +1 -0
- package/dist/line-merger.js +265 -0
- package/dist/line-merger.js.map +1 -0
- package/dist/math.d.ts +90 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +284 -0
- package/dist/math.js.map +1 -0
- package/dist/openings/index.d.ts +7 -0
- package/dist/openings/index.d.ts.map +1 -0
- package/dist/openings/index.js +10 -0
- package/dist/openings/index.js.map +1 -0
- package/dist/openings/opening-filter.d.ts +61 -0
- package/dist/openings/opening-filter.d.ts.map +1 -0
- package/dist/openings/opening-filter.js +244 -0
- package/dist/openings/opening-filter.js.map +1 -0
- package/dist/openings/opening-relationship-builder.d.ts +35 -0
- package/dist/openings/opening-relationship-builder.d.ts.map +1 -0
- package/dist/openings/opening-relationship-builder.js +121 -0
- package/dist/openings/opening-relationship-builder.js.map +1 -0
- package/dist/openings/opening-utils.d.ts +55 -0
- package/dist/openings/opening-utils.d.ts.map +1 -0
- package/dist/openings/opening-utils.js +128 -0
- package/dist/openings/opening-utils.js.map +1 -0
- package/dist/polygon-builder.d.ts +62 -0
- package/dist/polygon-builder.d.ts.map +1 -0
- package/dist/polygon-builder.js +261 -0
- package/dist/polygon-builder.js.map +1 -0
- package/dist/section-cutter.d.ts +49 -0
- package/dist/section-cutter.d.ts.map +1 -0
- package/dist/section-cutter.js +220 -0
- package/dist/section-cutter.js.map +1 -0
- package/dist/sheet/frame-renderer.d.ts +28 -0
- package/dist/sheet/frame-renderer.d.ts.map +1 -0
- package/dist/sheet/frame-renderer.js +199 -0
- package/dist/sheet/frame-renderer.js.map +1 -0
- package/dist/sheet/frame-types.d.ts +57 -0
- package/dist/sheet/frame-types.d.ts.map +1 -0
- package/dist/sheet/frame-types.js +88 -0
- package/dist/sheet/frame-types.js.map +1 -0
- package/dist/sheet/index.d.ts +26 -0
- package/dist/sheet/index.d.ts.map +1 -0
- package/dist/sheet/index.js +12 -0
- package/dist/sheet/index.js.map +1 -0
- package/dist/sheet/paper-sizes.d.ts +36 -0
- package/dist/sheet/paper-sizes.d.ts.map +1 -0
- package/dist/sheet/paper-sizes.js +252 -0
- package/dist/sheet/paper-sizes.js.map +1 -0
- package/dist/sheet/scale-bar-renderer.d.ts +29 -0
- package/dist/sheet/scale-bar-renderer.d.ts.map +1 -0
- package/dist/sheet/scale-bar-renderer.js +287 -0
- package/dist/sheet/scale-bar-renderer.js.map +1 -0
- package/dist/sheet/scale-bar-types.d.ts +82 -0
- package/dist/sheet/scale-bar-types.d.ts.map +1 -0
- package/dist/sheet/scale-bar-types.js +66 -0
- package/dist/sheet/scale-bar-types.js.map +1 -0
- package/dist/sheet/sheet-types.d.ts +84 -0
- package/dist/sheet/sheet-types.d.ts.map +1 -0
- package/dist/sheet/sheet-types.js +77 -0
- package/dist/sheet/sheet-types.js.map +1 -0
- package/dist/sheet/title-block-renderer.d.ts +44 -0
- package/dist/sheet/title-block-renderer.d.ts.map +1 -0
- package/dist/sheet/title-block-renderer.js +335 -0
- package/dist/sheet/title-block-renderer.js.map +1 -0
- package/dist/sheet/title-block-types.d.ts +100 -0
- package/dist/sheet/title-block-types.d.ts.map +1 -0
- package/dist/sheet/title-block-types.js +174 -0
- package/dist/sheet/title-block-types.js.map +1 -0
- package/dist/styles.d.ts +77 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +347 -0
- package/dist/styles.js.map +1 -0
- package/dist/styling/index.d.ts +7 -0
- package/dist/styling/index.d.ts.map +1 -0
- package/dist/styling/index.js +10 -0
- package/dist/styling/index.js.map +1 -0
- package/dist/styling/layer-mapping.d.ts +57 -0
- package/dist/styling/layer-mapping.d.ts.map +1 -0
- package/dist/styling/layer-mapping.js +303 -0
- package/dist/styling/layer-mapping.js.map +1 -0
- package/dist/styling/line-styles.d.ts +49 -0
- package/dist/styling/line-styles.d.ts.map +1 -0
- package/dist/styling/line-styles.js +123 -0
- package/dist/styling/line-styles.js.map +1 -0
- package/dist/styling/line-weights.d.ts +61 -0
- package/dist/styling/line-weights.d.ts.map +1 -0
- package/dist/styling/line-weights.js +183 -0
- package/dist/styling/line-weights.js.map +1 -0
- package/dist/svg-exporter.d.ts +63 -0
- package/dist/svg-exporter.d.ts.map +1 -0
- package/dist/svg-exporter.js +278 -0
- package/dist/svg-exporter.js.map +1 -0
- package/dist/symbols/door-symbol.d.ts +82 -0
- package/dist/symbols/door-symbol.d.ts.map +1 -0
- package/dist/symbols/door-symbol.js +390 -0
- package/dist/symbols/door-symbol.js.map +1 -0
- package/dist/symbols/index.d.ts +8 -0
- package/dist/symbols/index.d.ts.map +1 -0
- package/dist/symbols/index.js +11 -0
- package/dist/symbols/index.js.map +1 -0
- package/dist/symbols/symbol-renderer.d.ts +29 -0
- package/dist/symbols/symbol-renderer.d.ts.map +1 -0
- package/dist/symbols/symbol-renderer.js +173 -0
- package/dist/symbols/symbol-renderer.js.map +1 -0
- package/dist/symbols/symbol-utils.d.ts +48 -0
- package/dist/symbols/symbol-utils.d.ts.map +1 -0
- package/dist/symbols/symbol-utils.js +129 -0
- package/dist/symbols/symbol-utils.js.map +1 -0
- package/dist/symbols/window-symbol.d.ts +57 -0
- package/dist/symbols/window-symbol.d.ts.map +1 -0
- package/dist/symbols/window-symbol.js +209 -0
- package/dist/symbols/window-symbol.js.map +1 -0
- package/dist/types.d.ts +443 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +31 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* Line weight configuration with actual widths
|
|
6
|
+
*/
|
|
7
|
+
export const LINE_WEIGHT_CONFIG = {
|
|
8
|
+
heavy: { widthMm: 0.5, widthPx: 2 },
|
|
9
|
+
medium: { widthMm: 0.35, widthPx: 1.4 },
|
|
10
|
+
light: { widthMm: 0.25, widthPx: 1 },
|
|
11
|
+
hairline: { widthMm: 0.18, widthPx: 0.7 },
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* IFC type to line weight mapping for cut lines
|
|
15
|
+
*/
|
|
16
|
+
export const IFC_TYPE_WEIGHTS = {
|
|
17
|
+
// Structural - heavy
|
|
18
|
+
IfcWall: 'heavy',
|
|
19
|
+
IfcWallStandardCase: 'heavy',
|
|
20
|
+
IfcColumn: 'heavy',
|
|
21
|
+
IfcBeam: 'heavy',
|
|
22
|
+
IfcSlab: 'heavy',
|
|
23
|
+
IfcFooting: 'heavy',
|
|
24
|
+
IfcPile: 'heavy',
|
|
25
|
+
IfcRoof: 'heavy',
|
|
26
|
+
// Semi-structural - medium
|
|
27
|
+
IfcStair: 'medium',
|
|
28
|
+
IfcStairFlight: 'medium',
|
|
29
|
+
IfcRamp: 'medium',
|
|
30
|
+
IfcRampFlight: 'medium',
|
|
31
|
+
IfcRailing: 'medium',
|
|
32
|
+
IfcCurtainWall: 'medium',
|
|
33
|
+
// Openings - medium
|
|
34
|
+
IfcDoor: 'medium',
|
|
35
|
+
IfcWindow: 'medium',
|
|
36
|
+
IfcOpeningElement: 'light',
|
|
37
|
+
// Non-structural - light
|
|
38
|
+
IfcCovering: 'light',
|
|
39
|
+
IfcFurnishingElement: 'light',
|
|
40
|
+
IfcFurniture: 'light',
|
|
41
|
+
IfcBuildingElementProxy: 'light',
|
|
42
|
+
IfcDistributionElement: 'light',
|
|
43
|
+
IfcFlowTerminal: 'light',
|
|
44
|
+
IfcFlowSegment: 'light',
|
|
45
|
+
// Spaces - hairline
|
|
46
|
+
IfcSpace: 'hairline',
|
|
47
|
+
IfcZone: 'hairline',
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Category to base weight mapping
|
|
51
|
+
*/
|
|
52
|
+
const CATEGORY_WEIGHTS = {
|
|
53
|
+
cut: 'heavy',
|
|
54
|
+
projection: 'light',
|
|
55
|
+
hidden: 'hairline',
|
|
56
|
+
silhouette: 'medium',
|
|
57
|
+
crease: 'light',
|
|
58
|
+
boundary: 'light',
|
|
59
|
+
annotation: 'hairline',
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Category to line style mapping
|
|
63
|
+
*/
|
|
64
|
+
const CATEGORY_STYLES = {
|
|
65
|
+
cut: 'solid',
|
|
66
|
+
projection: 'solid',
|
|
67
|
+
hidden: 'dashed',
|
|
68
|
+
silhouette: 'solid',
|
|
69
|
+
crease: 'solid',
|
|
70
|
+
boundary: 'solid',
|
|
71
|
+
annotation: 'solid',
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Assigns line weights and styles to drawing lines
|
|
75
|
+
*/
|
|
76
|
+
export class LineWeightAssigner {
|
|
77
|
+
ifcTypeWeights;
|
|
78
|
+
constructor(customWeights) {
|
|
79
|
+
this.ifcTypeWeights = { ...IFC_TYPE_WEIGHTS, ...customWeights };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Assign weight and style to a drawing line
|
|
83
|
+
*/
|
|
84
|
+
assignWeight(line) {
|
|
85
|
+
const baseWeight = this.getBaseWeight(line);
|
|
86
|
+
const lineStyle = this.getLineStyle(line);
|
|
87
|
+
const semanticType = this.getSemanticType(line);
|
|
88
|
+
return {
|
|
89
|
+
...line,
|
|
90
|
+
lineWeight: baseWeight,
|
|
91
|
+
lineStyle,
|
|
92
|
+
semanticType,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Process all lines in a drawing
|
|
97
|
+
*/
|
|
98
|
+
processLines(lines) {
|
|
99
|
+
return lines.map((line) => this.assignWeight(line));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get the base weight for a line
|
|
103
|
+
*/
|
|
104
|
+
getBaseWeight(line) {
|
|
105
|
+
// Cut lines use IFC type-based weight
|
|
106
|
+
if (line.category === 'cut') {
|
|
107
|
+
return this.ifcTypeWeights[line.ifcType] ?? CATEGORY_WEIGHTS.cut;
|
|
108
|
+
}
|
|
109
|
+
// Hidden lines are always hairline
|
|
110
|
+
if (line.visibility === 'hidden' || line.category === 'hidden') {
|
|
111
|
+
return 'hairline';
|
|
112
|
+
}
|
|
113
|
+
// Other categories use their base weight
|
|
114
|
+
return CATEGORY_WEIGHTS[line.category] ?? 'light';
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get the line style
|
|
118
|
+
*/
|
|
119
|
+
getLineStyle(line) {
|
|
120
|
+
if (line.visibility === 'hidden' || line.category === 'hidden') {
|
|
121
|
+
return 'dashed';
|
|
122
|
+
}
|
|
123
|
+
return CATEGORY_STYLES[line.category] ?? 'solid';
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Determine semantic type for layer assignment
|
|
127
|
+
*/
|
|
128
|
+
getSemanticType(line) {
|
|
129
|
+
const { category, ifcType, visibility } = line;
|
|
130
|
+
if (visibility === 'hidden') {
|
|
131
|
+
return 'hidden';
|
|
132
|
+
}
|
|
133
|
+
if (category === 'cut') {
|
|
134
|
+
const upper = ifcType.toUpperCase();
|
|
135
|
+
if (upper.includes('WALL'))
|
|
136
|
+
return 'wall-cut';
|
|
137
|
+
if (upper.includes('COLUMN'))
|
|
138
|
+
return 'column-cut';
|
|
139
|
+
if (upper.includes('SLAB') || upper.includes('FLOOR'))
|
|
140
|
+
return 'slab-cut';
|
|
141
|
+
if (upper.includes('STAIR'))
|
|
142
|
+
return 'stair-cut';
|
|
143
|
+
if (upper.includes('DOOR'))
|
|
144
|
+
return 'opening-frame';
|
|
145
|
+
if (upper.includes('WINDOW'))
|
|
146
|
+
return 'window-frame';
|
|
147
|
+
return 'wall-cut';
|
|
148
|
+
}
|
|
149
|
+
if (category === 'projection') {
|
|
150
|
+
const upper = ifcType.toUpperCase();
|
|
151
|
+
if (upper.includes('WALL'))
|
|
152
|
+
return 'wall-projection';
|
|
153
|
+
if (upper.includes('FURNISH') || upper.includes('FURNITURE'))
|
|
154
|
+
return 'furniture';
|
|
155
|
+
if (upper.includes('EQUIPMENT'))
|
|
156
|
+
return 'equipment';
|
|
157
|
+
return 'wall-projection';
|
|
158
|
+
}
|
|
159
|
+
if (category === 'annotation') {
|
|
160
|
+
return 'annotation';
|
|
161
|
+
}
|
|
162
|
+
return 'wall-projection';
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get the actual width in mm for a weight
|
|
166
|
+
*/
|
|
167
|
+
getWidthMm(weight) {
|
|
168
|
+
return LINE_WEIGHT_CONFIG[weight].widthMm;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get the actual width in pixels for a weight (at 96 DPI)
|
|
172
|
+
*/
|
|
173
|
+
getWidthPx(weight) {
|
|
174
|
+
return LINE_WEIGHT_CONFIG[weight].widthPx;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Create a default line weight assigner
|
|
179
|
+
*/
|
|
180
|
+
export function createLineWeightAssigner(customWeights) {
|
|
181
|
+
return new LineWeightAssigner(customWeights);
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=line-weights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-weights.js","sourceRoot":"","sources":["../../src/styling/line-weights.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG Exporter - Export 2D drawings to SVG format
|
|
3
|
+
*
|
|
4
|
+
* Generates architectural-quality SVG output with:
|
|
5
|
+
* - Proper line weights and styles
|
|
6
|
+
* - Hatch patterns
|
|
7
|
+
* - Layer organization
|
|
8
|
+
* - Scale and paper size handling
|
|
9
|
+
*/
|
|
10
|
+
import type { Drawing2D, DrawingPolygon, Bounds2D } from './types';
|
|
11
|
+
import { type PaperSize, type DrawingScale } from './styles';
|
|
12
|
+
export interface SVGExportOptions {
|
|
13
|
+
/** Paper size */
|
|
14
|
+
paperSize?: PaperSize;
|
|
15
|
+
/** Drawing scale (e.g., { name: '1:100', factor: 100 }) */
|
|
16
|
+
scale?: DrawingScale;
|
|
17
|
+
/** Padding around drawing in mm */
|
|
18
|
+
padding?: number;
|
|
19
|
+
/** Include hidden lines */
|
|
20
|
+
showHiddenLines?: boolean;
|
|
21
|
+
/** Include hatching */
|
|
22
|
+
showHatching?: boolean;
|
|
23
|
+
/** Include title block */
|
|
24
|
+
showTitleBlock?: boolean;
|
|
25
|
+
/** Drawing title */
|
|
26
|
+
title?: string;
|
|
27
|
+
/** Project name */
|
|
28
|
+
projectName?: string;
|
|
29
|
+
/** Background color (default: white) */
|
|
30
|
+
backgroundColor?: string;
|
|
31
|
+
/** Units for dimension display */
|
|
32
|
+
units?: 'mm' | 'm';
|
|
33
|
+
}
|
|
34
|
+
export declare class SVGExporter {
|
|
35
|
+
private hatchGenerator;
|
|
36
|
+
/**
|
|
37
|
+
* Export a 2D drawing to SVG string
|
|
38
|
+
*/
|
|
39
|
+
export(drawing: Drawing2D, options?: SVGExportOptions): string;
|
|
40
|
+
/**
|
|
41
|
+
* Export just the cut polygons with hatching (for section fills)
|
|
42
|
+
*/
|
|
43
|
+
exportPolygons(polygons: DrawingPolygon[], bounds: Bounds2D, options?: SVGExportOptions): string;
|
|
44
|
+
private computeTransform;
|
|
45
|
+
private transformPoint;
|
|
46
|
+
private createHeader;
|
|
47
|
+
private createDefs;
|
|
48
|
+
private createPolygonDefs;
|
|
49
|
+
private createHatchPatternDefs;
|
|
50
|
+
private createLineLayer;
|
|
51
|
+
private renderLine;
|
|
52
|
+
private createHatchingLayer;
|
|
53
|
+
private renderPolygon;
|
|
54
|
+
private polygonToPath;
|
|
55
|
+
private renderHatchLine;
|
|
56
|
+
private createTitleBlock;
|
|
57
|
+
private escapeXml;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Export a Drawing2D to SVG string
|
|
61
|
+
*/
|
|
62
|
+
export declare function exportToSVG(drawing: Drawing2D, options?: SVGExportOptions): string;
|
|
63
|
+
//# sourceMappingURL=svg-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg-exporter.d.ts","sourceRoot":"","sources":["../src/svg-exporter.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,SAAS,EAET,cAAc,EAEd,QAAQ,EAET,MAAM,SAAS,CAAC;AAGjB,OAAO,EAKL,KAAK,SAAS,EACd,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAOlB,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uBAAuB;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0BAA0B;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kCAAkC;IAClC,KAAK,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC;CACpB;AAaD,qBAAa,WAAW;IACtB,OAAO,CAAC,cAAc,CAAwB;IAE9C;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM;IAmElE;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM;IAsBpG,OAAO,CAAC,gBAAgB;IA4BxB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,sBAAsB;IAwC9B,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,mBAAmB;IA4B3B,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,SAAS;CAQlB;AAMD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAGlF"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { HatchGenerator } from './hatch-generator';
|
|
5
|
+
import { getLineStyle, getHatchPattern, PAPER_SIZES, COMMON_SCALES, } from './styles';
|
|
6
|
+
import { boundsSize, boundsCenter } from './math';
|
|
7
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
8
|
+
// SVG EXPORTER CLASS
|
|
9
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
10
|
+
export class SVGExporter {
|
|
11
|
+
hatchGenerator = new HatchGenerator();
|
|
12
|
+
/**
|
|
13
|
+
* Export a 2D drawing to SVG string
|
|
14
|
+
*/
|
|
15
|
+
export(drawing, options = {}) {
|
|
16
|
+
const { paperSize = PAPER_SIZES.A3_LANDSCAPE, scale = COMMON_SCALES.find((s) => s.factor === drawing.config.scale) || COMMON_SCALES[5], padding = 20, showHiddenLines = true, showHatching = true, showTitleBlock = false, title = 'Section', projectName = '', backgroundColor = '#FFFFFF', } = options;
|
|
17
|
+
// Calculate transform from drawing coordinates to SVG coordinates
|
|
18
|
+
const transform = this.computeTransform(drawing.bounds, paperSize, scale, padding);
|
|
19
|
+
// Build SVG
|
|
20
|
+
let svg = this.createHeader(paperSize, backgroundColor);
|
|
21
|
+
svg += this.createDefs(drawing, scale.factor);
|
|
22
|
+
// Layer: Hatching (bottom)
|
|
23
|
+
if (showHatching && drawing.cutPolygons.length > 0) {
|
|
24
|
+
svg += this.createHatchingLayer(drawing.cutPolygons, transform, scale.factor);
|
|
25
|
+
}
|
|
26
|
+
// Layer: Hidden lines
|
|
27
|
+
if (showHiddenLines) {
|
|
28
|
+
const hiddenLines = drawing.lines.filter((l) => l.visibility === 'hidden');
|
|
29
|
+
if (hiddenLines.length > 0) {
|
|
30
|
+
svg += this.createLineLayer('hidden-lines', hiddenLines, transform, 'Hidden Lines');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Layer: Projection lines
|
|
34
|
+
const projectionLines = drawing.lines.filter((l) => l.category === 'projection' && l.visibility !== 'hidden');
|
|
35
|
+
if (projectionLines.length > 0) {
|
|
36
|
+
svg += this.createLineLayer('projection-lines', projectionLines, transform, 'Projection');
|
|
37
|
+
}
|
|
38
|
+
// Layer: Silhouettes and creases
|
|
39
|
+
const featureLines = drawing.lines.filter((l) => (l.category === 'silhouette' || l.category === 'crease' || l.category === 'boundary') &&
|
|
40
|
+
l.visibility !== 'hidden');
|
|
41
|
+
if (featureLines.length > 0) {
|
|
42
|
+
svg += this.createLineLayer('feature-lines', featureLines, transform, 'Feature Edges');
|
|
43
|
+
}
|
|
44
|
+
// Layer: Cut lines (top)
|
|
45
|
+
const cutLines = drawing.lines.filter((l) => l.category === 'cut');
|
|
46
|
+
if (cutLines.length > 0) {
|
|
47
|
+
svg += this.createLineLayer('cut-lines', cutLines, transform, 'Cut Lines');
|
|
48
|
+
}
|
|
49
|
+
// Title block
|
|
50
|
+
if (showTitleBlock) {
|
|
51
|
+
svg += this.createTitleBlock(paperSize, title, projectName, scale);
|
|
52
|
+
}
|
|
53
|
+
svg += '</svg>';
|
|
54
|
+
return svg;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Export just the cut polygons with hatching (for section fills)
|
|
58
|
+
*/
|
|
59
|
+
exportPolygons(polygons, bounds, options = {}) {
|
|
60
|
+
const { paperSize = PAPER_SIZES.A3_LANDSCAPE, scale = COMMON_SCALES[5], padding = 20, backgroundColor = '#FFFFFF', } = options;
|
|
61
|
+
const transform = this.computeTransform(bounds, paperSize, scale, padding);
|
|
62
|
+
let svg = this.createHeader(paperSize, backgroundColor);
|
|
63
|
+
svg += this.createPolygonDefs(scale.factor);
|
|
64
|
+
svg += this.createHatchingLayer(polygons, transform, scale.factor);
|
|
65
|
+
svg += '</svg>';
|
|
66
|
+
return svg;
|
|
67
|
+
}
|
|
68
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
69
|
+
// PRIVATE METHODS
|
|
70
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
71
|
+
computeTransform(bounds, paperSize, scale, padding) {
|
|
72
|
+
const size = boundsSize(bounds);
|
|
73
|
+
const center = boundsCenter(bounds);
|
|
74
|
+
// Available drawing area
|
|
75
|
+
const availableWidth = paperSize.width - padding * 2;
|
|
76
|
+
const availableHeight = paperSize.height - padding * 2;
|
|
77
|
+
// Scale: world units to mm on paper
|
|
78
|
+
const worldToMm = 1000 / scale.factor; // mm per world unit (assuming world is in meters)
|
|
79
|
+
// Center the drawing
|
|
80
|
+
const offsetX = paperSize.width / 2 - center.x * worldToMm;
|
|
81
|
+
const offsetY = paperSize.height / 2 + center.y * worldToMm; // Flip Y
|
|
82
|
+
return {
|
|
83
|
+
scale: worldToMm,
|
|
84
|
+
offsetX,
|
|
85
|
+
offsetY,
|
|
86
|
+
flipY: true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
transformPoint(point, transform) {
|
|
90
|
+
return {
|
|
91
|
+
x: point.x * transform.scale + transform.offsetX,
|
|
92
|
+
y: transform.flipY
|
|
93
|
+
? -point.y * transform.scale + transform.offsetY
|
|
94
|
+
: point.y * transform.scale + transform.offsetY,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
createHeader(paperSize, backgroundColor) {
|
|
98
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
99
|
+
<svg xmlns="http://www.w3.org/2000/svg"
|
|
100
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
101
|
+
width="${paperSize.width}mm"
|
|
102
|
+
height="${paperSize.height}mm"
|
|
103
|
+
viewBox="0 0 ${paperSize.width} ${paperSize.height}">
|
|
104
|
+
<rect width="100%" height="100%" fill="${backgroundColor}"/>
|
|
105
|
+
`;
|
|
106
|
+
}
|
|
107
|
+
createDefs(drawing, scaleFactor) {
|
|
108
|
+
let defs = ' <defs>\n';
|
|
109
|
+
defs += this.createHatchPatternDefs(scaleFactor);
|
|
110
|
+
defs += ' </defs>\n';
|
|
111
|
+
return defs;
|
|
112
|
+
}
|
|
113
|
+
createPolygonDefs(scaleFactor) {
|
|
114
|
+
let defs = ' <defs>\n';
|
|
115
|
+
defs += this.createHatchPatternDefs(scaleFactor);
|
|
116
|
+
defs += ' </defs>\n';
|
|
117
|
+
return defs;
|
|
118
|
+
}
|
|
119
|
+
createHatchPatternDefs(scaleFactor) {
|
|
120
|
+
const spacing = 3 * (scaleFactor / 100); // Adjust for scale
|
|
121
|
+
let defs = '';
|
|
122
|
+
// Diagonal hatch
|
|
123
|
+
defs += ` <pattern id="hatch-diagonal" patternUnits="userSpaceOnUse"
|
|
124
|
+
width="${spacing}" height="${spacing}" patternTransform="rotate(45)">
|
|
125
|
+
<line x1="0" y1="0" x2="0" y2="${spacing}" stroke="#000" stroke-width="0.15"/>
|
|
126
|
+
</pattern>\n`;
|
|
127
|
+
// Cross-hatch
|
|
128
|
+
defs += ` <pattern id="hatch-cross" patternUnits="userSpaceOnUse"
|
|
129
|
+
width="${spacing}" height="${spacing}">
|
|
130
|
+
<line x1="0" y1="0" x2="${spacing}" y2="${spacing}" stroke="#000" stroke-width="0.1"/>
|
|
131
|
+
<line x1="${spacing}" y1="0" x2="0" y2="${spacing}" stroke="#000" stroke-width="0.1"/>
|
|
132
|
+
</pattern>\n`;
|
|
133
|
+
// Horizontal lines
|
|
134
|
+
defs += ` <pattern id="hatch-horizontal" patternUnits="userSpaceOnUse"
|
|
135
|
+
width="${spacing}" height="${spacing}">
|
|
136
|
+
<line x1="0" y1="${spacing / 2}" x2="${spacing}" y2="${spacing / 2}" stroke="#000" stroke-width="0.1"/>
|
|
137
|
+
</pattern>\n`;
|
|
138
|
+
// Concrete dots
|
|
139
|
+
defs += ` <pattern id="hatch-concrete" patternUnits="userSpaceOnUse"
|
|
140
|
+
width="${spacing * 2}" height="${spacing * 2}">
|
|
141
|
+
<circle cx="${spacing * 0.3}" cy="${spacing * 0.3}" r="0.3" fill="#666"/>
|
|
142
|
+
<circle cx="${spacing * 1.3}" cy="${spacing * 1.3}" r="0.3" fill="#666"/>
|
|
143
|
+
<circle cx="${spacing * 0.8}" cy="${spacing * 1.6}" r="0.2" fill="#888"/>
|
|
144
|
+
</pattern>\n`;
|
|
145
|
+
// Steel (dense diagonal)
|
|
146
|
+
defs += ` <pattern id="hatch-steel" patternUnits="userSpaceOnUse"
|
|
147
|
+
width="${spacing * 0.7}" height="${spacing * 0.7}" patternTransform="rotate(45)">
|
|
148
|
+
<line x1="0" y1="0" x2="0" y2="${spacing * 0.7}" stroke="#333" stroke-width="0.2"/>
|
|
149
|
+
</pattern>\n`;
|
|
150
|
+
return defs;
|
|
151
|
+
}
|
|
152
|
+
createLineLayer(id, lines, transform, label) {
|
|
153
|
+
let layer = ` <g id="${id}" inkscape:label="${label}" inkscape:groupmode="layer">\n`;
|
|
154
|
+
for (const line of lines) {
|
|
155
|
+
layer += this.renderLine(line, transform);
|
|
156
|
+
}
|
|
157
|
+
layer += ' </g>\n';
|
|
158
|
+
return layer;
|
|
159
|
+
}
|
|
160
|
+
renderLine(line, transform) {
|
|
161
|
+
const style = getLineStyle(line.category, line.ifcType);
|
|
162
|
+
const p0 = this.transformPoint(line.line.start, transform);
|
|
163
|
+
const p1 = this.transformPoint(line.line.end, transform);
|
|
164
|
+
const dashArray = style.dashPattern.length > 0 ? ` stroke-dasharray="${style.dashPattern.join(' ')}"` : '';
|
|
165
|
+
return ` <line x1="${p0.x.toFixed(3)}" y1="${p0.y.toFixed(3)}" x2="${p1.x.toFixed(3)}" y2="${p1.y.toFixed(3)}"
|
|
166
|
+
stroke="${style.color}" stroke-width="${style.weight}"
|
|
167
|
+
stroke-linecap="${style.lineCap}"${dashArray}
|
|
168
|
+
data-entity-id="${line.entityId}" data-ifc-type="${line.ifcType}"/>\n`;
|
|
169
|
+
}
|
|
170
|
+
createHatchingLayer(polygons, transform, scaleFactor) {
|
|
171
|
+
let layer = ' <g id="hatching" inkscape:label="Hatching" inkscape:groupmode="layer">\n';
|
|
172
|
+
for (const polygon of polygons) {
|
|
173
|
+
const pattern = getHatchPattern(polygon.ifcType);
|
|
174
|
+
if (pattern.type === 'none')
|
|
175
|
+
continue;
|
|
176
|
+
// Render polygon with fill
|
|
177
|
+
layer += this.renderPolygon(polygon, transform, pattern);
|
|
178
|
+
// Generate and render hatch lines for non-solid fills
|
|
179
|
+
if (pattern.type !== 'solid' && pattern.type !== 'glass') {
|
|
180
|
+
const hatchResult = this.hatchGenerator.generateHatch(polygon, scaleFactor);
|
|
181
|
+
for (const hatchLine of hatchResult.lines) {
|
|
182
|
+
layer += this.renderHatchLine(hatchLine, transform, pattern);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
layer += ' </g>\n';
|
|
187
|
+
return layer;
|
|
188
|
+
}
|
|
189
|
+
renderPolygon(polygon, transform, pattern) {
|
|
190
|
+
const pathData = this.polygonToPath(polygon.polygon, transform);
|
|
191
|
+
let fill;
|
|
192
|
+
if (pattern.type === 'solid') {
|
|
193
|
+
fill = pattern.fillColor || '#CCCCCC';
|
|
194
|
+
}
|
|
195
|
+
else if (pattern.type === 'glass') {
|
|
196
|
+
fill = pattern.fillColor || 'rgba(200, 230, 255, 0.3)';
|
|
197
|
+
}
|
|
198
|
+
else if (pattern.type === 'none') {
|
|
199
|
+
fill = 'none';
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// Use pattern fill
|
|
203
|
+
fill = `url(#hatch-${pattern.type})`;
|
|
204
|
+
}
|
|
205
|
+
return ` <path d="${pathData}" fill="${fill}"
|
|
206
|
+
stroke="${pattern.strokeColor}" stroke-width="${pattern.lineWeight}"
|
|
207
|
+
data-entity-id="${polygon.entityId}" data-ifc-type="${polygon.ifcType}"/>\n`;
|
|
208
|
+
}
|
|
209
|
+
polygonToPath(polygon, transform) {
|
|
210
|
+
let path = '';
|
|
211
|
+
// Outer boundary
|
|
212
|
+
if (polygon.outer.length > 0) {
|
|
213
|
+
const first = this.transformPoint(polygon.outer[0], transform);
|
|
214
|
+
path += `M ${first.x.toFixed(3)} ${first.y.toFixed(3)}`;
|
|
215
|
+
for (let i = 1; i < polygon.outer.length; i++) {
|
|
216
|
+
const p = this.transformPoint(polygon.outer[i], transform);
|
|
217
|
+
path += ` L ${p.x.toFixed(3)} ${p.y.toFixed(3)}`;
|
|
218
|
+
}
|
|
219
|
+
path += ' Z';
|
|
220
|
+
}
|
|
221
|
+
// Holes
|
|
222
|
+
for (const hole of polygon.holes) {
|
|
223
|
+
if (hole.length > 0) {
|
|
224
|
+
const first = this.transformPoint(hole[0], transform);
|
|
225
|
+
path += ` M ${first.x.toFixed(3)} ${first.y.toFixed(3)}`;
|
|
226
|
+
for (let i = 1; i < hole.length; i++) {
|
|
227
|
+
const p = this.transformPoint(hole[i], transform);
|
|
228
|
+
path += ` L ${p.x.toFixed(3)} ${p.y.toFixed(3)}`;
|
|
229
|
+
}
|
|
230
|
+
path += ' Z';
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return path;
|
|
234
|
+
}
|
|
235
|
+
renderHatchLine(hatchLine, transform, pattern) {
|
|
236
|
+
const p0 = this.transformPoint(hatchLine.line.start, transform);
|
|
237
|
+
const p1 = this.transformPoint(hatchLine.line.end, transform);
|
|
238
|
+
return ` <line x1="${p0.x.toFixed(3)}" y1="${p0.y.toFixed(3)}" x2="${p1.x.toFixed(3)}" y2="${p1.y.toFixed(3)}"
|
|
239
|
+
stroke="${pattern.strokeColor}" stroke-width="${pattern.lineWeight}" stroke-linecap="butt"/>\n`;
|
|
240
|
+
}
|
|
241
|
+
createTitleBlock(paperSize, title, projectName, scale) {
|
|
242
|
+
const blockWidth = 180;
|
|
243
|
+
const blockHeight = 50;
|
|
244
|
+
const x = paperSize.width - blockWidth - 10;
|
|
245
|
+
const y = paperSize.height - blockHeight - 10;
|
|
246
|
+
return ` <g id="title-block">
|
|
247
|
+
<rect x="${x}" y="${y}" width="${blockWidth}" height="${blockHeight}"
|
|
248
|
+
fill="white" stroke="black" stroke-width="0.5"/>
|
|
249
|
+
<line x1="${x}" y1="${y + 20}" x2="${x + blockWidth}" y2="${y + 20}" stroke="black" stroke-width="0.3"/>
|
|
250
|
+
<line x1="${x}" y1="${y + 35}" x2="${x + blockWidth}" y2="${y + 35}" stroke="black" stroke-width="0.3"/>
|
|
251
|
+
<line x1="${x + 100}" y1="${y + 20}" x2="${x + 100}" y2="${y + blockHeight}" stroke="black" stroke-width="0.3"/>
|
|
252
|
+
<text x="${x + 5}" y="${y + 14}" font-family="Arial" font-size="10" font-weight="bold">${this.escapeXml(title)}</text>
|
|
253
|
+
<text x="${x + 5}" y="${y + 30}" font-family="Arial" font-size="8">${this.escapeXml(projectName)}</text>
|
|
254
|
+
<text x="${x + 5}" y="${y + 45}" font-family="Arial" font-size="8">Scale: ${scale.name}</text>
|
|
255
|
+
<text x="${x + 105}" y="${y + 30}" font-family="Arial" font-size="7">Date:</text>
|
|
256
|
+
<text x="${x + 105}" y="${y + 45}" font-family="Arial" font-size="7">${new Date().toLocaleDateString()}</text>
|
|
257
|
+
</g>\n`;
|
|
258
|
+
}
|
|
259
|
+
escapeXml(str) {
|
|
260
|
+
return str
|
|
261
|
+
.replace(/&/g, '&')
|
|
262
|
+
.replace(/</g, '<')
|
|
263
|
+
.replace(/>/g, '>')
|
|
264
|
+
.replace(/"/g, '"')
|
|
265
|
+
.replace(/'/g, ''');
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
269
|
+
// CONVENIENCE FUNCTION
|
|
270
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
271
|
+
/**
|
|
272
|
+
* Export a Drawing2D to SVG string
|
|
273
|
+
*/
|
|
274
|
+
export function exportToSVG(drawing, options) {
|
|
275
|
+
const exporter = new SVGExporter();
|
|
276
|
+
return exporter.export(drawing, options);
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=svg-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg-exporter.js","sourceRoot":"","sources":["../src/svg-exporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Door symbol generator for architectural floor plans
|
|
3
|
+
*
|
|
4
|
+
* Generates standard door symbols including:
|
|
5
|
+
* - Swing arc (quarter circle showing door travel)
|
|
6
|
+
* - Door leaf line (panel in closed position)
|
|
7
|
+
* - Support for single/double swing, sliding, folding doors
|
|
8
|
+
*/
|
|
9
|
+
import type { ArchitecturalSymbol, OpeningInfo, Point2D, Line2D, DoorOperationType, Bounds2D } from '../types';
|
|
10
|
+
/**
|
|
11
|
+
* Result of door symbol generation
|
|
12
|
+
*/
|
|
13
|
+
export interface DoorSymbolResult {
|
|
14
|
+
/** The architectural symbol */
|
|
15
|
+
symbol: ArchitecturalSymbol;
|
|
16
|
+
/** Lines to draw (arc segments, leaf lines) */
|
|
17
|
+
lines: Line2D[];
|
|
18
|
+
/** Arc path for SVG (if applicable) */
|
|
19
|
+
arcPath?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Configuration for door symbol generation
|
|
23
|
+
*/
|
|
24
|
+
export interface DoorSymbolConfig {
|
|
25
|
+
/** Number of segments for arc approximation */
|
|
26
|
+
arcSegments: number;
|
|
27
|
+
/** Swing angle in degrees (default 90) */
|
|
28
|
+
swingAngle: number;
|
|
29
|
+
/** Show door leaf line */
|
|
30
|
+
showLeaf: boolean;
|
|
31
|
+
/** Show threshold line */
|
|
32
|
+
showThreshold: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generates door symbols for 2D floor plans
|
|
36
|
+
*/
|
|
37
|
+
export declare class DoorSymbolGenerator {
|
|
38
|
+
private config;
|
|
39
|
+
constructor(config?: Partial<DoorSymbolConfig>);
|
|
40
|
+
/**
|
|
41
|
+
* Generate door symbol from opening info
|
|
42
|
+
*/
|
|
43
|
+
generateFromOpening(opening: OpeningInfo, bounds2D: Bounds2D, wallDirection: Point2D): DoorSymbolResult;
|
|
44
|
+
/**
|
|
45
|
+
* Generate a door symbol at a specific position
|
|
46
|
+
*/
|
|
47
|
+
generateSymbol(center: Point2D, width: number, operation: DoorOperationType, wallDirection: Point2D, swingDirection: Point2D): DoorSymbolResult;
|
|
48
|
+
/**
|
|
49
|
+
* Generate single swing door symbol
|
|
50
|
+
*/
|
|
51
|
+
private generateSwingDoor;
|
|
52
|
+
/**
|
|
53
|
+
* Generate double door symbol (two leaves meeting in middle)
|
|
54
|
+
*/
|
|
55
|
+
private generateDoubleDoor;
|
|
56
|
+
/**
|
|
57
|
+
* Generate sliding door symbol
|
|
58
|
+
*/
|
|
59
|
+
private generateSlidingDoor;
|
|
60
|
+
/**
|
|
61
|
+
* Generate double sliding door symbol
|
|
62
|
+
*/
|
|
63
|
+
private generateDoubleSlidingDoor;
|
|
64
|
+
/**
|
|
65
|
+
* Generate folding door symbol
|
|
66
|
+
*/
|
|
67
|
+
private generateFoldingDoor;
|
|
68
|
+
/**
|
|
69
|
+
* Generate revolving door symbol
|
|
70
|
+
*/
|
|
71
|
+
private generateRevolvingDoor;
|
|
72
|
+
/**
|
|
73
|
+
* Generate arc as line segments
|
|
74
|
+
*/
|
|
75
|
+
private generateArc;
|
|
76
|
+
/**
|
|
77
|
+
* Generate SVG arc path string
|
|
78
|
+
*/
|
|
79
|
+
private generateArcSVGPath;
|
|
80
|
+
private getPerpendicularDirection;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=door-symbol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"door-symbol.d.ts","sourceRoot":"","sources":["../../src/symbols/door-symbol.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAGnB,WAAW,EACX,OAAO,EACP,MAAM,EACN,iBAAiB,EACjB,QAAQ,EACT,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,aAAa,EAAE,OAAO,CAAC;CACxB;AASD;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAIlD;;OAEG;IACH,mBAAmB,CACjB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,OAAO,GACrB,gBAAgB;IAgBnB;;OAEG;IACH,cAAc,CACZ,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,iBAAiB,EAC5B,aAAa,EAAE,OAAO,EACtB,cAAc,EAAE,OAAO,GACtB,gBAAgB;IA+BnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+EzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoE1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmD3B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA2CjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqD3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgD7B;;OAEG;IACH,OAAO,CAAC,WAAW;IAmCnB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,yBAAyB;CAGlC"}
|