2D: Höhenkoten-Werkzeug + Masskette bleibt gerade + Punkt-Notation
Neues Werkzeug "Höhenkote" (SIA 400 B.5.4, Figur 18): Dreieck-Symbol +
Höhenwert an einem Punkt. Vier Varianten (OK/UK × fertig/roh) bestimmen
Dreieck-Richtung und Füllung, per Option umschaltbar. Die Norm ordnet
Zahlen UNTERHALB einer Masslinie explizit Höhenmassen zu — das war der
eigentliche Grund, warum ein separater Typ statt einer Bemassungs-Variante
nötig war.
Bemassungs-Korrektur: eine Masskette bleibt beim Zeichnen immer eine
GERADE Linie (Klicks ab dem dritten Punkt werden auf die durch Punkt 1/2
festgelegte Gerade projiziert), auch wenn die Bedienung wie eine Polylinie
funktioniert — vorher konnte man versehentlich einen Zickzack-Pfad
erzeugen.
Ausserdem: Masszahlen nutzen jetzt Punkt- statt Komma-Notation ("3.96"
statt "3,96") — die tatsächlich gezeichneten Beispiele in der Norm
(Figur 13/14/18) verwenden durchgängig den Punkt, nicht das Komma aus der
abstrakten B.5.2-Beispielliste.
This commit is contained in:
@@ -1529,6 +1529,8 @@ export function drawingVertices(d: import("../model/types").Drawing2D): Vec2[] {
|
||||
const mid: Vec2 = { x: (g.a.x + g.b.x) / 2 + nx, y: (g.a.y + g.b.y) / 2 + ny };
|
||||
return [g.a, g.b, mid];
|
||||
}
|
||||
// Kote: EIN Griff an der Dreieck-Spitze (zum Verschieben; siehe moveGrip).
|
||||
if (g.shape === "kote") return [g.at];
|
||||
// Text: EIN Griff am Ankerpunkt (zum Verschieben; siehe moveGrip).
|
||||
if (g.shape === "text") return [g.at];
|
||||
return [];
|
||||
@@ -1616,6 +1618,8 @@ function moveGrip(
|
||||
}
|
||||
// Text: der einzige Griff (Index 0) sitzt am Ankerpunkt → verschiebt ihn.
|
||||
if (g.shape === "text") return { ...d, geom: { ...g, at: pt } };
|
||||
// Kote: der einzige Griff (Index 0) sitzt an der Dreieck-Spitze.
|
||||
if (g.shape === "kote") return { ...d, geom: { ...g, at: pt } };
|
||||
// Kreis: Griff 0 (Ost) bzw. 1 (Nord) — zieht man die beiden Achsen
|
||||
// unabhängig auseinander, wird der Kreis zur Ellipse (rotation 0);
|
||||
// bleiben rx/ry (fast) gleich, bleibt es ein Kreis (s. `ellipseOrCircle`).
|
||||
@@ -1697,6 +1701,8 @@ function moveElementBy(
|
||||
return { ...d, geom: { ...g, pts: g.pts.map(mv) } };
|
||||
case "dimension":
|
||||
return { ...d, geom: { ...g, a: mv(g.a), b: mv(g.b) } };
|
||||
case "kote":
|
||||
return { ...d, geom: { ...g, at: mv(g.at) } };
|
||||
case "text":
|
||||
return { ...d, geom: { ...g, at: mv(g.at) } };
|
||||
default:
|
||||
|
||||
@@ -554,6 +554,7 @@ function geomBBox(g: Drawing2DGeom): SelectionBBox {
|
||||
acc(g.b.x + nx, g.b.y + ny);
|
||||
break;
|
||||
}
|
||||
case "kote":
|
||||
case "text":
|
||||
acc(g.at.x, g.at.y);
|
||||
break;
|
||||
|
||||
@@ -57,7 +57,8 @@ function drawingsBBox(
|
||||
} else if (g.shape === "dimension") {
|
||||
acc(g.a.x, g.a.y);
|
||||
acc(g.b.x, g.b.y);
|
||||
} else if (g.shape === "text") acc(g.at.x, g.at.y);
|
||||
} else if (g.shape === "kote") acc(g.at.x, g.at.y);
|
||||
else if (g.shape === "text") acc(g.at.x, g.at.y);
|
||||
}
|
||||
return Number.isFinite(minX) ? { minX, minY, maxX, maxY } : null;
|
||||
}
|
||||
@@ -76,6 +77,7 @@ function translateDrawing(d: Drawing2D, dx: number, dy: number): Drawing2D {
|
||||
case "bezier": return { ...d, geom: { ...g, pts: g.pts.map(mv) } };
|
||||
case "spline": return { ...d, geom: { ...g, pts: g.pts.map(mv) } };
|
||||
case "dimension": return { ...d, geom: { ...g, a: mv(g.a), b: mv(g.b) } };
|
||||
case "kote": return { ...d, geom: { ...g, at: mv(g.at) } };
|
||||
case "text": return { ...d, geom: { ...g, at: mv(g.at) } };
|
||||
default: return d;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user