52d94303bc
ci / test (push) Has been cancelled
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.
73 lines
2.7 KiB
Python
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
|