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.
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# -*- 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
|
||||
Reference in New Issue
Block a user