Files
willtools-demo/panellift/tests/test_edge_sliver.py
T
will 52d94303bc
ci / test (push) Has been cancelled
WillTools: precast shop-ticket QC and panel handling tools
Public demo snapshot of an in-house pyRevit extension for precast concrete
shop-ticket QC (37 checks / 46 checklist rows) and a standalone panel
handling solver (PCI Chapter 8).

- No client, job, plant or product data: knowledge layers ship as
  structural templates only.
- Ticket QC's model-read escalation targets a LAN model server endpoint
  (configurable), not a cloud provider.
- Built from the private development repo via tools/make_dist.py.
2026-09-03 16:33:47 -05:00

62 lines
2.6 KiB
Python

# -*- coding: utf-8 -*-
"""An opening that all but reaches an edge must not leave a fibre behind.
A real piece had an opening drawn to 11.1041 ft on a panel 11.1042 ft wide.
The 0.001 in of concrete left over was, arithmetically, the outermost material
in the section -- so every in-plane stress was reported at a fibre 110 in from
the centroid instead of 23 in, on a sliver nothing could be cast into. The
piece came back at 432 psi where a commercial check of the same piece said
162, and it was one of only two failures in a 194-piece sweep.
The stress at a fibre that is not really there is a stress nobody has.
"""
import pytest
from panellift import section
from panellift.model import Blockout
from conftest import make_panel
def _panel_with_opening(gap_ft):
"""A panel whose only opening stops `gap_ft` short of the far edge."""
panel = make_panel()
panel.blockouts = [Blockout(
name='O1', x0=10.0, y0=3.0, length=4.0,
width=panel.width_ft - 3.0 - gap_ft)]
return panel
@pytest.mark.parametrize('gap_ft', [0.0, 1e-4, 1e-3, 0.004])
def test_a_drafting_sliver_is_not_the_extreme_fibre(gap_ft):
"""Whether the opening lands exactly on the edge or a thousandth short,
the section has to be the same piece of concrete."""
exact = section.NetSection(_panel_with_opening(0.0), 12.0)
nearly = section.NetSection(_panel_with_opening(gap_ft), 12.0)
assert nearly.width_in == pytest.approx(exact.width_in, abs=0.1)
assert nearly.y_extremes_in[1] == pytest.approx(exact.y_extremes_in[1],
abs=0.1)
assert nearly.iy_in4 == pytest.approx(exact.iy_in4, rel=0.01)
def test_the_extreme_fibre_is_inside_the_concrete():
"""The outermost fibre cannot be further from the centroid than the
material is. This is what the sliver broke: 110 in of lever arm on a
section only 46 in wide."""
net = section.NetSection(_panel_with_opening(1e-3), 12.0)
reach = max(abs(v) for v in net.y_extremes_in)
assert reach <= net.width_in, (
'extreme fibre %.1f in from the centroid, but the section is only '
'%.1f in wide' % (reach, net.width_in))
def test_an_opening_well_short_of_the_edge_keeps_its_strip():
"""The snap is a noise floor, not a licence to delete real concrete. A
strip an inch and a half wide is still a strip."""
panel = _panel_with_opening(0.125) # 1.5 in of concrete left
net = section.NetSection(panel, 12.0)
strips = section.strips_at(panel, 12.0)
assert len(strips) == 2
assert net.y_extremes_in[1] > 0.5 * panel.width_ft * 12.0