Skip to content

Commit 1da8cd0

Browse files
committed
try to copy logic from stl renderer
1 parent 6b67d4b commit 1da8cd0

File tree

5 files changed

+466
-14
lines changed

5 files changed

+466
-14
lines changed

packages/abstract-3d/src/renderers/svg/svg.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import {
2121
bounds2ToSize,
2222
bounds2Merge,
2323
vec2Zero,
24+
vec3Sub,
25+
vec3Flip,
2426
} from "../../abstract-3d.js";
2527
import { SvgOptions, zOrderElement } from "./svg-geometries/shared.js";
2628
import { box } from "./svg-geometries/svg-box.js";
@@ -103,21 +105,19 @@ function renderInternal(
103105
);
104106
const svgSize = vec2(unitSize.x + 1.5 * opts.stroke_thickness, unitSize.y + 1.5 * opts.stroke_thickness);
105107
const svgCenter = vec2(-offset.x + opts.stroke_thickness * 0.75, offset.y + opts.stroke_thickness * 0.75);
106-
107108
const point = (x: number, y: number): Vec2 => vec2(svgCenter.x + x, svgCenter.y - y);
109+
const unitCenterFlipped = vec3Flip(unitCenter);
108110

109111
const elements = Array<zOrderElement>();
110112
for (const g of scene.groups) {
111-
const pos = vec3Rot(g.pos, unitCenter, unitRot);
112-
const rot = vec3RotCombine(unitRot, g.rot ?? vec3Zero);
113-
elements.push(...svgGroup(g, pos, rot, point, opts));
113+
elements.push(...svgGroup(g, unitCenterFlipped, unitRot, point, opts));
114114
}
115115
const dimOpts: SvgOptions = { ...opts, only_stroke: false, gray_scale: false };
116116
elements.sort((a, b) => a.zOrder - b.zOrder);
117117
const cameraPos = vec3Rot(vec3(1, 1, 1), vec3Zero, unitRot);
118118
for (const d of scene.dimensions_deprecated?.dimensions ?? []) {
119119
if (flipViews(d.views[0], cameraPos) === opts.view) {
120-
const pos = vec3Rot(d.pos, unitCenter, unitRot);
120+
const pos = vec3TransRot(d.pos, unitCenterFlipped, unitRot);
121121
const rot = vec3RotCombine(unitRot, d.rot);
122122
for (const m of d.meshes) {
123123
elements.push(...svgMesh(m, pos, rot, point, scene.dimensions_deprecated?.material ?? { normal: "" }, dimOpts));
@@ -129,19 +129,19 @@ function renderInternal(
129129

130130
function svgGroup(
131131
g: Group,
132-
pos: Vec3,
133-
rot: Vec3,
132+
parentPos: Vec3,
133+
parentRot: Vec3,
134134
point: (x: number, y: number) => Vec2,
135135
opts: SvgOptions
136136
): ReadonlyArray<zOrderElement> {
137+
const pos = vec3TransRot(g.pos, parentPos, parentRot);
138+
const rot = vec3RotCombine(parentRot, g.rot ?? vec3Zero);
137139
const elements = Array<zOrderElement>();
138140
for (const m of g.meshes ?? []) {
139141
elements.push(...svgMesh(m, pos, rot, point, m.material, opts));
140142
}
141143
for (const sg of g.groups ?? []) {
142-
const sPos = vec3TransRot(sg.pos, pos, rot);
143-
const sRot = vec3RotCombine(rot, sg.rot ?? vec3Zero);
144-
elements.push(...svgGroup(sg, sPos, sRot, point, opts));
144+
elements.push(...svgGroup(sg, pos, rot, point, opts));
145145
}
146146
return elements;
147147
}

packages/abstract-visuals-example/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"private": true,
33
"name": "abstract-visuals-example",
4-
"version": "15.2.149",
4+
"version": "15.2.147",
55
"description": "abstract-visuals-example",
66
"repository": "https://github.com/dividab/abstract-visuals",
77
"main": "lib/index.js",

packages/abstract-visuals-example/src/app/abstract-3d-example.tsx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { ai } from "./double-view-ai.js";
77
import { createSVG } from "../../../abstract-image/src/exporters/svg-export-image.js";
88
import { dxf2dExportImage, DXF_DATA_URL } from "../../../abstract-image/src/exporters/dxf2d-export-image.js";
99
import { componentGeometries } from "./double-view-component-geometries.js";
10+
import { templateScene } from "./template-scene.js";
11+
import { Scene } from "../../../abstract-3d/src/abstract-3d.js";
1012

1113
export function Abstract3DExample(): React.ReactNode {
1214
const [selected, setSelected] = React.useState<string | undefined>(undefined);
@@ -20,6 +22,7 @@ export function Abstract3DExample(): React.ReactNode {
2022
const imageDataByUrlSvg: Record<string, any> = {};
2123
const imageDataByUrlDxf: Record<string, any> = {};
2224
const svgs = Array<string>();
25+
2326
for (const geo of Object.values(componentGeometries)) {
2427
for (const s of geo.scenes as any) {
2528
svgs.push(`data:image/svg+xml,${encodeURIComponent(Svg.render(s.scene, s.options).image)}`);
@@ -33,8 +36,18 @@ export function Abstract3DExample(): React.ReactNode {
3336
imageDataByUrlDxf[geo.image.url] = `${DXF_DATA_URL}${Dxf.renderScenes(geo.scenes as any)}`;
3437
}
3538

39+
const templateImage = Svg.render(templateScene as Scene, { stroke_thickness: 3, only_stroke: true }).image;
40+
3641
return (
3742
<div style={{ display: "flex", flexDirection: "column", height: "100%", background: "rgb(230, 230, 230)" }}>
43+
<style>
44+
{`
45+
.wrapper > svg {
46+
width: 100%;
47+
height: 100%;
48+
}
49+
`}
50+
</style>
3851
<div style={{ display: "flex", height: "20px", background: "rgb(251, 251, 251)" }}>
3952
<button
4053
onClick={() =>
@@ -80,9 +93,14 @@ export function Abstract3DExample(): React.ReactNode {
8093
Svg.render(systemair, { view: "front", stroke_thickness: 1, rotation: 270 }).image
8194
)}`}
8295
/>
96+
<div
97+
className="wrapper"
98+
style={{ width: "200px", height: "200px", minWidth: "200px" }}
99+
dangerouslySetInnerHTML={{ __html: templateImage }}
100+
/>
83101
<div dangerouslySetInnerHTML={{ __html: createSVG(ai, { imageDataByUrl: imageDataByUrlSvg }) }} />
84-
{svgs.map((svg) => (
85-
<img src={svg} width="200px" style={{ height: "max-content" }} />
102+
{svgs.map((svg, i) => (
103+
<img key={i} src={svg} width="200px" style={{ height: "max-content" }} />
86104
))}
87105
<div style={{ height: "calc(100% - 20px)", width: "100%", display: "flex" }}>
88106
<div style={{ height: "100%", width: "50%", display: "flex", flexDirection: "column" }}>

0 commit comments

Comments
 (0)