Shows the volume and size of a selected group, component or mesh as it is placed, an arc's angle, the total area of selected faces, and the print check's size and volume.
How the precision is kept
The definition's own volume and box come from the model kernel in 64-bit and are scaled by the placement matrix: the volume by the absolute 3×3 determinant, each size by the length of the matching matrix column. Lengths, areas and volumes are formatted by the units module; a few values are rounded for the panel text only.
Calculations under this policy
5 calculations in 1 source file. The code is read from the released app when this page loads. It is the calculation people run, not a copy kept for this page.
The volume of a closed group or component and its width, depth and height as placed.
k = ∛|det M₃ₓ₃|; volume = V × k × k × k; size_q = (max_q − min_q) × |column q|; retyped size → L ÷ |column q|
The full 3×3 determinant is used. Taking its cube root and cubing it again returns |det| only to within rounding, a step that multiplying by |det| directly would not add. A retyped size is divided by the column length to give the definition's own size.
modelcraft.js
lines 2545 to 2555
ModelCraft 0.8.1
const k = Math.cbrt(Math.abs(inst.m[0] * (inst.m[5] * inst.m[10] - inst.m[9] * inst.m[6]) - inst.m[4] * (inst.m[1] * inst.m[10] - inst.m[9] * inst.m[2]) + inst.m[8] * (inst.m[1] * inst.m[6] - inst.m[5] * inst.m[2])));
row(t('app.info.volume'), formatVolume(s.volume * k * k * k, u));
}
const bb = model.bbox(d);
// the size as placed: the definition's own size times this placement's scale along each of its axes
const sc = [0, 1, 2].map((q) => Math.hypot(inst.m[q * 4], inst.m[q * 4 + 1], inst.m[q * 4 + 2]));
if (bb) [t('app.info.width'), t('app.info.depth'), t('app.info.height')].forEach((lb, q) => {
const own = bb.max[q] - bb.min[q], placed = own * sc[q];
if (isStacked(d)) row(lb, formatLength(placed, u)); // 0.8 GH.2: the stack decides the size (change a factor)
else if (placed > 1e-6) lenBox(lb, 'mc-size' + q, placed, (L) => model.change(t(d.kind === 'component' ? 'app.undo.resize_component' : 'app.undo.resize_group'), (m) => m.setDefSize(d.id, q, L / sc[q]), [d.id]));
else row(lb, formatLength(0, u));
Volume and size of a placed mesh
64-bit
The volume of a closed mesh and its size as placed.
k = ∛|det M₃ₓ₃|; volume = V × k³; size_q = (max_q − min_q) × |column q|
The same scaling as for a solid: the mesh's own volume and bounds, times the cube of the cube root of the determinant and times each column's length.
The areas are added in selection order in 64-bit and formatted once at the end.
modelcraft.js
line 2644
ModelCraft 0.8.1
if (nF) { let a = 0; for (const s of sel) if (s.t === 'f') { const f = def.faces.get(s.id); if (f) a += faceArea(def, f); } row(t('app.info.total_area'), formatArea(a, u)); }
Print check size and volume
64-bit
The size in millimeters and the volume in cubic centimeters shown after a print check.