Files
willtools-demo/panellift/tests/test_derating.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

73 lines
2.7 KiB
Python

# -*- coding: utf-8 -*-
"""An insert is worth less at release than at 28 days.
A catalogue rating is derived at one concrete strength and the anchor pulls a
cone of concrete out, so below that strength the capacity follows sqrt(f'c).
One handling report checks the same insert at stripping AND at erection, which
is why the rating cannot be derated once on the way in: it has to be done per
stage, at the strength that stage actually has.
"""
import dataclasses
import pytest
from conftest import make_panel
from panellift import checks, pci, statics
from panellift.model import Stage
def rated_panel(basis=3500.0, capacity=8000.0):
panel = make_panel()
return dataclasses.replace(panel, lifters=[
dataclasses.replace(l, capacity_lb=capacity, basis_fc_psi=basis)
for l in panel.lifters])
# ------------------------------------------------------------- the factor
def test_below_the_basis_it_follows_the_square_root():
assert pci.insert_derate(3500.0, 2500.0) == pytest.approx(0.8452, abs=1e-4)
def test_at_or_above_the_basis_nothing_is_gained():
"""Past the basis the anchor's own steel governs; stronger concrete around
it does not make the anchor stronger."""
assert pci.insert_derate(3500.0, 3500.0) == 1.0
assert pci.insert_derate(3500.0, 6000.0) == 1.0
def test_an_unstated_basis_does_not_silently_reduce_a_rating():
assert pci.insert_derate(None, 2500.0) == 1.0
assert pci.insert_derate(3500.0, None) == 1.0
# --------------------------------------------------------- through a check
def test_the_same_insert_is_rated_differently_at_two_stages():
panel = rated_panel()
lifter = panel.lifters[0]
at_release = Stage('stripping', 1.3, 2500.0)
at_28 = Stage('erection', 1.2, 6000.0)
assert checks.rated(lifter, at_release) == pytest.approx(6761, abs=1)
assert checks.rated(lifter, at_28) == pytest.approx(8000, abs=1)
def test_the_capacity_check_uses_the_derated_number(rolling):
panel = rated_panel()
stage = Stage('stripping', 1.3, 2500.0)
a = statics.analyse(panel, stage, rolling, role='strip')
inserts = [f for f in checks.check_insert_capacity(a, rolling)
if f.code == 'INSERT']
assert inserts
assert 'derated from 8,000 lb' in inserts[0].message
def test_no_basis_means_the_rating_is_taken_as_stated(rolling):
"""A plant that types a number into capacity_lb meant that number."""
panel = rated_panel(basis=None)
stage = Stage('stripping', 1.3, 2500.0)
a = statics.analyse(panel, stage, rolling, role='strip')
inserts = [f for f in checks.check_insert_capacity(a, rolling)
if f.code == 'INSERT']
assert inserts and 'derated' not in inserts[0].message