@structupath/pi-steel 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +51 -0
- package/package.json +37 -0
- package/skills/steel-rfq/SKILL.md +178 -0
- package/skills/steel-rfq/assets/company-profile.example.json +7 -0
- package/skills/steel-takeoff/SKILL.md +157 -0
- package/skills/steel-takeoff/assets/aisc-shapes-database.json +484 -0
- package/skills/steel-takeoff/assets/bom-template.csv +1 -0
- package/skills/steel-takeoff/assets/material-grades.json +153 -0
- package/skills/steel-takeoff/references/aisc-shapes-guide.md +96 -0
- package/skills/steel-takeoff/references/connection-types.md +124 -0
- package/skills/steel-takeoff/references/takeoff-procedures.md +163 -0
- package/skills/steel-takeoff/scripts/calculate-weight.sh +148 -0
- package/skills/steel-takeoff/scripts/lookup-member.sh +90 -0
- package/skills/steel-takeoff/scripts/validate-bom.py +218 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 StructuPath LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# pi-steel
|
|
2
|
+
|
|
3
|
+
Structural steel estimating skills for the [Pi coding agent](https://pi.dev) — built by working steel estimators, not by people guessing what a takeoff is.
|
|
4
|
+
|
|
5
|
+
By [StructuPath](https://structupath.ai), from the team behind a production structural-steel fabrication shop in Denver, CO.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pi install npm:@structupath/pi-steel
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## What's Inside
|
|
14
|
+
|
|
15
|
+
### `steel-takeoff` — takeoffs, BOMs, tonnage
|
|
16
|
+
|
|
17
|
+
Structural steel quantity takeoff with a bundled **AISC 16th Edition shapes database (477 shapes)** — W, HSS, angles, channels, pipe — plus scripts the agent runs directly:
|
|
18
|
+
|
|
19
|
+
- `lookup-member.sh` — full property set for any AISC designation (`W14X30` → plf, d, bf, A, Ix, Sx, …)
|
|
20
|
+
- `calculate-weight.sh` — BOM totals with connection and misc-steel allowances, tonnage, cost sensitivity
|
|
21
|
+
- `validate-bom.py` — catches invalid designations, wrong grades, duplicate marks, unreasonable weights
|
|
22
|
+
|
|
23
|
+
Also includes reference guides for AISC shape families, takeoff procedures with worked examples, connection types and hardware weights, material grades, and bolt capacities.
|
|
24
|
+
|
|
25
|
+
Ask your agent things like:
|
|
26
|
+
|
|
27
|
+
> "Do a takeoff from these drawings and build me a BOM"
|
|
28
|
+
> "What's the lightest W-shape with depth ≥ 18" and Ix ≥ 1000?"
|
|
29
|
+
> "Total tonnage on this BOM with 12% connections"
|
|
30
|
+
|
|
31
|
+
### `steel-rfq` — vendor quote requests
|
|
32
|
+
|
|
33
|
+
Turns a steel estimate/takeoff spreadsheet into a standardized vendor RFQ (.xlsx): materials grouped the way vendors stock them (W-shapes / plate / flat bar), yellow fill-in pricing columns, nesting/drop reference, and terms & conditions — branded with **your** company profile.
|
|
34
|
+
|
|
35
|
+
One-time setup: copy `skills/steel-rfq/assets/company-profile.example.json` to `company-profile.json` and put in your company name, city, and payment terms. The skill will ask and offer to save it if you skip this.
|
|
36
|
+
|
|
37
|
+
> "Send this takeoff out for pricing"
|
|
38
|
+
> "Generate an RFQ from this estimate"
|
|
39
|
+
|
|
40
|
+
## Requirements
|
|
41
|
+
|
|
42
|
+
- `jq` and `python3` (with `pandas` + `openpyxl` for RFQ generation)
|
|
43
|
+
- macOS or Linux
|
|
44
|
+
|
|
45
|
+
## License
|
|
46
|
+
|
|
47
|
+
MIT. AISC shape data derived from the publicly available AISC Shapes Database v16.0.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
Building software for steel fabricators? See [structupath.ai](https://structupath.ai).
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@structupath/pi-steel",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Structural steel estimating skills for the Pi coding agent — AISC takeoffs, bills of material, tonnage calcs, and vendor RFQ generation.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"pi-package",
|
|
8
|
+
"pi-skill",
|
|
9
|
+
"steel",
|
|
10
|
+
"structural-steel",
|
|
11
|
+
"estimating",
|
|
12
|
+
"takeoff",
|
|
13
|
+
"aisc",
|
|
14
|
+
"bom",
|
|
15
|
+
"rfq",
|
|
16
|
+
"construction",
|
|
17
|
+
"fabrication"
|
|
18
|
+
],
|
|
19
|
+
"author": "StructuPath (https://structupath.ai)",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/StructuPath/pi-steel.git"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://structupath.ai",
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=20.6.0"
|
|
28
|
+
},
|
|
29
|
+
"pi": {
|
|
30
|
+
"skills": ["./skills"]
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"skills",
|
|
34
|
+
"README.md",
|
|
35
|
+
"LICENSE"
|
|
36
|
+
]
|
|
37
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: steel-rfq
|
|
3
|
+
description: "Generate standardized Request for Quotation (RFQ) spreadsheets from steel estimate takeoff files. Use this skill whenever someone mentions RFQ, request for quote, vendor quote, material quote, sending a material list to vendors, quoting steel, or getting pricing from a supplier. Also trigger when someone uploads a steel estimate or takeoff spreadsheet and wants to send it out for pricing. Even if they just say 'I need to send this to my vendor' or 'get me prices on this material' — that's an RFQ."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Steel RFQ Generator
|
|
7
|
+
|
|
8
|
+
## What This Skill Does
|
|
9
|
+
|
|
10
|
+
This skill takes a steel estimate/takeoff spreadsheet (.xlsx) and produces a clean, standardized RFQ spreadsheet that can be sent directly to steel vendors. The output is always an Excel file with a consistent layout so every vendor gets the same professional format regardless of who creates it.
|
|
11
|
+
|
|
12
|
+
The RFQ format was designed around how steel vendors actually work — materials grouped by type (W-shapes, plates, flat bar) so vendors can quickly identify what they have in stock, quote pricing, and flag what they don't carry.
|
|
13
|
+
|
|
14
|
+
## Company Profile (required setup)
|
|
15
|
+
|
|
16
|
+
The RFQ carries the requesting company's identity. Load it from
|
|
17
|
+
`assets/company-profile.json` in this skill's directory (copy
|
|
18
|
+
`company-profile.example.json` and edit). If the file is missing, ask the
|
|
19
|
+
user for their company name, city/state, and payment terms before
|
|
20
|
+
generating, and offer to save the answers as `company-profile.json` for
|
|
21
|
+
next time.
|
|
22
|
+
|
|
23
|
+
Profile fields:
|
|
24
|
+
- `company_name` — appears in the header and terms & conditions
|
|
25
|
+
- `city_state` — appears in the header (e.g., "Denver, CO")
|
|
26
|
+
- `payment_terms` — default "Net 30 from date of delivery"
|
|
27
|
+
- `quote_validity_days` — default 30
|
|
28
|
+
- `logo` — optional filename in `assets/` to embed top-left
|
|
29
|
+
|
|
30
|
+
Never invent company details. If the profile is incomplete, ask.
|
|
31
|
+
|
|
32
|
+
## Input
|
|
33
|
+
|
|
34
|
+
Always a steel estimate spreadsheet (.xlsx). These files typically have:
|
|
35
|
+
- A "Steel Takeoff" sheet (or similar) with line items for structural members, plates, and connection hardware
|
|
36
|
+
- Item numbers (A-01, B-01, C-01, etc.), categories, descriptions, sizes, quantities, stock lengths, and weights
|
|
37
|
+
- Items marked "BY OTHERS" (typically purlins) that are NOT part of the fabricator's scope
|
|
38
|
+
|
|
39
|
+
The first step is always to read and understand the takeoff data before generating the RFQ.
|
|
40
|
+
|
|
41
|
+
## Reading the Estimate
|
|
42
|
+
|
|
43
|
+
1. Use pandas to read all sheets: `pd.ExcelFile(path)` then inspect sheet names
|
|
44
|
+
2. Find the takeoff sheet (look for "Takeoff", "Steel Takeoff", "Material List", "BOM", or the sheet with item-level steel data)
|
|
45
|
+
3. Read the full sheet with `header=None` to capture all rows including section headers
|
|
46
|
+
4. Identify the data structure:
|
|
47
|
+
- Section headers (e.g., "A. MAIN BUILDING — W-SHAPES")
|
|
48
|
+
- Column headers (Item, Category, Description, Size, Qty, Length, Weight, Stock Purchase, Purchase Wt, Notes)
|
|
49
|
+
- Line items with actual material data
|
|
50
|
+
- Items with "BY OTHERS" in the description — these get **excluded**
|
|
51
|
+
- Subtotal and total rows
|
|
52
|
+
|
|
53
|
+
## RFQ Output Format
|
|
54
|
+
|
|
55
|
+
The output is always a single .xlsx file with this exact structure:
|
|
56
|
+
|
|
57
|
+
### Header Block (Rows 1–3)
|
|
58
|
+
- **Row 1**: "REQUEST FOR QUOTATION — Structural Steel" — dark blue background (#1F3864), white bold Arial 14pt, merged across all columns
|
|
59
|
+
- **Row 2**: "[Project Name] | [Company Name] — [City, ST]" — same dark blue, white bold Arial 11pt
|
|
60
|
+
- **Row 3**: "Date Issued: [today] | Response Requested By: _______________ | Project Location: [location]" — same dark blue, white Arial 10pt
|
|
61
|
+
|
|
62
|
+
### Vendor Info Block (Rows 4–6)
|
|
63
|
+
Fillable fields for the vendor:
|
|
64
|
+
- Row 5: Company Name (merged A–B, input in C–E yellow) | Contact Name (merged F–G, input in H–J yellow)
|
|
65
|
+
- Row 6: Phone/Email (merged A–B, input in C–E yellow) | Quote Valid Until (merged F–G, input in H–J yellow)
|
|
66
|
+
|
|
67
|
+
### Instructions Row (Row 7)
|
|
68
|
+
Single merged row with italic gray text explaining how to fill out the yellow columns. Text:
|
|
69
|
+
> "Instructions: Please fill in the YELLOW columns (Unit Price, Total Price, Availability, Lead Time, Alternate Size, Notes). Mark Availability as 'In Stock', 'Lead Time', or 'Unavailable'. If suggesting an alternate size, list it and adjust pricing accordingly."
|
|
70
|
+
|
|
71
|
+
### Column Headers (Row 8)
|
|
72
|
+
14 columns with medium blue background (#2E75B6), white bold Arial 10pt:
|
|
73
|
+
|
|
74
|
+
| Column | Header | Width | Purpose |
|
|
75
|
+
|--------|--------|-------|---------|
|
|
76
|
+
| A | Item | 7 | Item number from estimate (A-01, C-02, E-01, etc.) |
|
|
77
|
+
| B | Category | 13 | Columns, Girders, Plate, Flat Bar, etc. |
|
|
78
|
+
| C | Description | 38 | Full description including which structure it belongs to |
|
|
79
|
+
| D | Size / Designation | 22 | AISC shape or plate dimensions |
|
|
80
|
+
| E | Grade | 12 | A992 Gr.50, A572 Gr.50, A36, etc. |
|
|
81
|
+
| F | Qty | 6 | Number of pieces or sticks needed |
|
|
82
|
+
| G | Stock Length / Size | 20 | How it's being purchased (e.g., "3 sticks × 30′") |
|
|
83
|
+
| H | Est. Purchase Wt (lbs) | 20 | Weight from the estimate |
|
|
84
|
+
| I | Unit Price ($) | 14 | **VENDOR FILLS** — yellow background |
|
|
85
|
+
| J | Total Price ($) | 14 | **VENDOR FILLS** — yellow background |
|
|
86
|
+
| K | Availability | 14 | **VENDOR FILLS** — yellow background |
|
|
87
|
+
| L | Lead Time (days) | 14 | **VENDOR FILLS** — yellow background |
|
|
88
|
+
| M | Alternate Size | 18 | **VENDOR FILLS** — yellow background |
|
|
89
|
+
| N | Notes | 30 | **VENDOR FILLS** — yellow background |
|
|
90
|
+
|
|
91
|
+
Vendor columns (I–N) get a darker gold header (#BF8F00) to distinguish them from the material data columns.
|
|
92
|
+
|
|
93
|
+
### Material Data Rows
|
|
94
|
+
|
|
95
|
+
**Grouping**: Always group by material type, not by structure. The three groups are:
|
|
96
|
+
1. **W-SHAPES — [Grade]** (columns and girders from all structures combined)
|
|
97
|
+
2. **PLATE STOCK — [Grade]** (all plate material)
|
|
98
|
+
3. **FLAT BAR STOCK — [Grade]** (all flat bar material)
|
|
99
|
+
|
|
100
|
+
Each group gets a section header row: merged across all columns, medium blue background, white bold text.
|
|
101
|
+
|
|
102
|
+
**Data rows**:
|
|
103
|
+
- Alternate row shading: light blue (#D6E4F0) and white
|
|
104
|
+
- Vendor columns (I–N) always have yellow background (#FFF2CC) regardless of row
|
|
105
|
+
- Weight column (H) formatted as `#,##0`
|
|
106
|
+
- Price columns (I–J) formatted as `$#,##0.00`
|
|
107
|
+
- All cells have thin borders
|
|
108
|
+
|
|
109
|
+
**Filtering rules**:
|
|
110
|
+
- EXCLUDE any item where the description contains "BY OTHERS" (purlins, etc.)
|
|
111
|
+
- EXCLUDE any item where Qty = 0
|
|
112
|
+
- If the estimate has a "Stock Purchase" section (Section E or similar) with consolidated purchase items for plates/flat bar, use those instead of the individual connection plate items. The stock purchase items represent what's actually being ordered (full sheets, full bars), which is what the vendor needs to quote.
|
|
113
|
+
- Keep individual W-shape items because each shape/length combination matters for vendor stock
|
|
114
|
+
|
|
115
|
+
### Totals Row
|
|
116
|
+
- "TOTAL PURCHASE WEIGHT / PRICE" label merged A–G, right-aligned bold
|
|
117
|
+
- Column H: `=SUM(H[first]:H[last])` formula for total weight, green background (#E2EFDA)
|
|
118
|
+
- Column J: `=SUM(J[first]:J[last])` formula for total price, green background
|
|
119
|
+
|
|
120
|
+
### Nesting / Drop Reference Table
|
|
121
|
+
Below the totals (skip a row), add a reference section:
|
|
122
|
+
- Header: "NESTING / DROP REFERENCE (For Fabricator Use)" — dark blue bold text
|
|
123
|
+
- Three columns: Material | Nesting Plan | Drop Notes
|
|
124
|
+
- Column headers with medium blue background
|
|
125
|
+
- One row per material showing the nesting layout and expected drop from the estimate
|
|
126
|
+
- This helps cross-check vendor stock lengths against the cutting plan
|
|
127
|
+
|
|
128
|
+
### Standard Terms & Conditions
|
|
129
|
+
Below the nesting table (skip a row), add:
|
|
130
|
+
- Header: "TERMS & CONDITIONS" — dark blue bold text
|
|
131
|
+
- Include these standard terms, each on its own row, substituting the company name and payment terms from the company profile:
|
|
132
|
+
|
|
133
|
+
1. **Delivery**: All material to be delivered FOB jobsite unless otherwise agreed. Vendor to confirm freight costs separately.
|
|
134
|
+
2. **Mill Certifications**: Mill test reports (MTRs) required for all structural steel per AISC/AWS standards. Certs must accompany delivery.
|
|
135
|
+
3. **Payment Terms**: [payment_terms from profile] unless otherwise negotiated in writing.
|
|
136
|
+
4. **Material Standards**: All wide-flange shapes to meet ASTM A992. All plate and bar to meet grade specified on this RFQ (A572 Gr.50 or A36).
|
|
137
|
+
5. **Substitutions**: No substitutions without prior written approval from [Company Name]. If quoting alternate sizes, clearly note in the "Alternate Size" column.
|
|
138
|
+
6. **Quote Validity**: Quoted prices to remain firm for [quote_validity_days] days from date of quote unless otherwise stated.
|
|
139
|
+
7. **Inspection**: [Company Name] reserves the right to inspect material upon delivery and reject material not meeting specifications.
|
|
140
|
+
8. **Cancellation**: Orders may be cancelled without penalty if material has not shipped. Restocking fees, if any, to be stated in quote.
|
|
141
|
+
|
|
142
|
+
### Branding / Logo
|
|
143
|
+
If the company profile names a logo file and it exists in the skill's `assets/` directory, insert it in cell A1 area (top-left) and adjust the header text to not overlap. Otherwise use the text header as described above.
|
|
144
|
+
|
|
145
|
+
## Print Setup
|
|
146
|
+
- Orientation: Landscape
|
|
147
|
+
- Fit to width: 1 page
|
|
148
|
+
- Fit to height: 0 (auto)
|
|
149
|
+
- Print title rows: Row 8 (column headers repeat on each page)
|
|
150
|
+
|
|
151
|
+
## File Naming
|
|
152
|
+
Output file: `[ProjectName]_RFQ_Material_List.xlsx`
|
|
153
|
+
- Extract project name from the estimate file (look in "Project Info" sheet or the first rows of the takeoff)
|
|
154
|
+
- Replace spaces with underscores
|
|
155
|
+
- Example: `Cherokee_Boys_RFQ_Material_List.xlsx`
|
|
156
|
+
|
|
157
|
+
## Step-by-Step Workflow
|
|
158
|
+
|
|
159
|
+
1. Load the company profile (or collect it from the user — see Company Profile above)
|
|
160
|
+
2. Read the uploaded estimate file with pandas to understand its structure
|
|
161
|
+
3. Identify the takeoff sheet and parse all line items
|
|
162
|
+
4. Filter out "BY OTHERS" items and zero-quantity items
|
|
163
|
+
5. Group remaining items by material type (W-shapes → Plates → Flat Bar)
|
|
164
|
+
6. If there's a stock purchase section, use those for plates/flat bar instead of individual pieces
|
|
165
|
+
7. Build the RFQ spreadsheet using openpyxl following the format above
|
|
166
|
+
8. Add formulas for totals and verify the SUM ranges cover exactly the data rows (formulas calculate when the vendor opens the file in Excel)
|
|
167
|
+
9. Add nesting/drop reference from the estimate notes
|
|
168
|
+
10. Add standard terms & conditions with profile values substituted
|
|
169
|
+
11. Insert logo if configured
|
|
170
|
+
12. Save the file and present it to the user
|
|
171
|
+
|
|
172
|
+
## Common Variations
|
|
173
|
+
|
|
174
|
+
**Multiple structures in one project**: Combine all materials into one RFQ, but note which structure each item belongs to in the Description column (e.g., "W12×65 Columns (Bldg A)").
|
|
175
|
+
|
|
176
|
+
**Plate stock with nesting**: When plates are purchased as full sheets and then cut, show the full sheet as the line item (that's what the vendor ships) and put the cutting plan in the nesting reference table.
|
|
177
|
+
|
|
178
|
+
**Mixed grades**: Group by material type first, then note the grade in each row. If a project has A992, A572, and A36, they all appear in the appropriate material type section with grade clearly marked.
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: steel-takeoff
|
|
3
|
+
description: >
|
|
4
|
+
Structural steel takeoff, AISC member lookup, and quantity estimating.
|
|
5
|
+
Use when performing steel takeoffs, reading structural prints/blueprints,
|
|
6
|
+
looking up AISC member properties (W-shapes, HSS, angles, channels, pipe),
|
|
7
|
+
building bills of materials (BOM), calculating steel tonnage, or preparing
|
|
8
|
+
steel bid packages. Keywords: steel, takeoff, BOM, AISC, W-shape, HSS,
|
|
9
|
+
angle, channel, weight, tonnage, structural, estimating, blueprint,
|
|
10
|
+
quantity survey, beam, column, brace, connection, erection, ironwork.
|
|
11
|
+
license: MIT
|
|
12
|
+
compatibility: Requires jq and python3. macOS or Linux.
|
|
13
|
+
metadata:
|
|
14
|
+
domain: structural-steel
|
|
15
|
+
version: "1.0.0"
|
|
16
|
+
aisc-edition: "16th"
|
|
17
|
+
shapes-count: "400+"
|
|
18
|
+
allowed-tools: Bash Read Edit Write
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Steel Takeoff Skill
|
|
22
|
+
|
|
23
|
+
Structural steel quantity takeoff and AISC member data lookup using the 16th Edition shapes database.
|
|
24
|
+
|
|
25
|
+
## Setup (run once per machine)
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
cd "$(dirname "$0")"
|
|
29
|
+
chmod +x scripts/*.sh
|
|
30
|
+
python3 -c "import json, csv, sys" || echo "ERROR: python3 required"
|
|
31
|
+
command -v jq >/dev/null || echo "ERROR: install jq (brew install jq / apt install jq)"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Quick Reference: AISC Member Lookup
|
|
35
|
+
|
|
36
|
+
Look up any AISC shape's full property set:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# Single member lookup — returns all properties
|
|
40
|
+
./scripts/lookup-member.sh "W14X30"
|
|
41
|
+
|
|
42
|
+
# Search for W-shapes by minimum moment of inertia
|
|
43
|
+
jq '[.[] | select(.type == "W" and .Ix >= 800)] | sort_by(.weight_per_ft) | .[:5]' assets/aisc-shapes-database.json
|
|
44
|
+
|
|
45
|
+
# Find lightest W-shape with depth >= 18" and Ix >= 1000 in⁴
|
|
46
|
+
jq '[.[] | select(.type == "W" and .d >= 18 and .Ix >= 1000)] | sort_by(.weight_per_ft) | .[0]' assets/aisc-shapes-database.json
|
|
47
|
+
|
|
48
|
+
# List all HSS rectangular shapes
|
|
49
|
+
jq '[.[] | select(.type == "HSS-RECT")] | sort_by(.weight_per_ft)' assets/aisc-shapes-database.json
|
|
50
|
+
|
|
51
|
+
# Find angles with leg >= 4"
|
|
52
|
+
jq '[.[] | select(.type == "L" and .d >= 4)]' assets/aisc-shapes-database.json
|
|
53
|
+
|
|
54
|
+
# Find channels by weight range
|
|
55
|
+
jq '[.[] | select(.type == "C" and .weight_per_ft >= 15 and .weight_per_ft <= 30)]' assets/aisc-shapes-database.json
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Takeoff Procedure
|
|
59
|
+
|
|
60
|
+
### Step 1 — Parse Drawings
|
|
61
|
+
Read the structural drawings and extract:
|
|
62
|
+
- Member marks (e.g., B1, B2, C1, G1, BR1)
|
|
63
|
+
- Member sizes (e.g., W14X30, HSS6X6X1/4, L4X4X3/8)
|
|
64
|
+
- Lengths (from grid dimensions or explicit call-outs, use feet-inches: 28'-6")
|
|
65
|
+
- Quantities (count per mark — check symmetry, typical bays, similar conditions)
|
|
66
|
+
- Connection types at each end
|
|
67
|
+
|
|
68
|
+
### Step 2 — Build the BOM
|
|
69
|
+
For each unique member mark, create a line item:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
cat assets/bom-template.csv
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Fields: Mark, Qty, Size, Grade, Length_ft, Unit_Wt_plf, Total_Wt_lbs, Connections, Notes
|
|
76
|
+
|
|
77
|
+
### Step 3 — Look Up Unit Weights
|
|
78
|
+
For every member size in the BOM, look up the unit weight from the AISC database:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
./scripts/lookup-member.sh "W14X30"
|
|
82
|
+
# Output: W14X30 | 30.0 plf | d=13.84" | bf=6.730" | A=8.85 in² | Ix=291 in⁴ | Sx=42.0 in³
|
|
83
|
+
|
|
84
|
+
./scripts/lookup-member.sh "HSS8X6X1/2"
|
|
85
|
+
# Output: HSS8X6X1/2 | 42.1 plf | d=8.00" | b=6.00" | A=11.7 in² | Ix=96.4 in⁴
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Step 4 — Calculate Totals
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# From a BOM CSV file
|
|
92
|
+
./scripts/calculate-weight.sh path/to/bom.csv
|
|
93
|
+
|
|
94
|
+
# Output includes:
|
|
95
|
+
# Per-line weights
|
|
96
|
+
# Total weight in lbs and tons
|
|
97
|
+
# Connection allowance (12%)
|
|
98
|
+
# Misc steel allowance (5%)
|
|
99
|
+
# Grand total with estimated cost
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Step 5 — Add Connections & Misc Steel
|
|
103
|
+
See [connection types reference](references/connection-types.md) for standard connection weights.
|
|
104
|
+
|
|
105
|
+
Rules of thumb for connection allowance:
|
|
106
|
+
| Building Type | Connection % |
|
|
107
|
+
|---|---|
|
|
108
|
+
| Simple warehouse / pre-eng | 8-10% |
|
|
109
|
+
| Standard commercial | 10-12% |
|
|
110
|
+
| Moment frames / complex | 12-18% |
|
|
111
|
+
| Heavy industrial / power | 15-20% |
|
|
112
|
+
|
|
113
|
+
### Step 6 — Validate
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
python3 scripts/validate-bom.py path/to/bom.csv
|
|
117
|
+
# Checks:
|
|
118
|
+
# ✓ Valid AISC designations
|
|
119
|
+
# ✓ Non-zero quantities and lengths
|
|
120
|
+
# ✓ Correct grade for shape type
|
|
121
|
+
# ✓ Reasonable weight-per-foot values
|
|
122
|
+
# ✓ No duplicate marks
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Material Grades Quick Reference
|
|
126
|
+
|
|
127
|
+
| Grade | Typical Use | Fy (ksi) | Fu (ksi) |
|
|
128
|
+
|---|---|---|---|
|
|
129
|
+
| A992 | W-shapes (default) | 50 | 65 |
|
|
130
|
+
| A500 Gr. B | HSS round | 42 | 58 |
|
|
131
|
+
| A500 Gr. C | HSS rectangular | 50 | 62 |
|
|
132
|
+
| A36 | Angles, channels, plates | 36 | 58 |
|
|
133
|
+
| A572 Gr. 50 | Plates, built-ups | 50 | 65 |
|
|
134
|
+
| A913 Gr. 50/65 | Jumbo shapes | 50/65 | 65/80 |
|
|
135
|
+
| A514 | High-strength plates | 100 | 110-130 |
|
|
136
|
+
| A588 | Weathering steel | 50 | 70 |
|
|
137
|
+
|
|
138
|
+
Full grade specs: `cat assets/material-grades.json`
|
|
139
|
+
|
|
140
|
+
## Bolt Reference
|
|
141
|
+
|
|
142
|
+
| Bolt Type | Grade | Tensile (ksi) | Shear (ksi) | Common Sizes |
|
|
143
|
+
|---|---|---|---|---|
|
|
144
|
+
| A325 / F1852 (TC) | — | 120 | 54/68 | 3/4", 7/8", 1" |
|
|
145
|
+
| A490 / F2280 (TC) | — | 150 | 68/84 | 3/4", 7/8", 1" |
|
|
146
|
+
| A307 | Gr. A | 60 | 24 | 1/2" - 1" |
|
|
147
|
+
|
|
148
|
+
- N = threads in shear plane (lower capacity)
|
|
149
|
+
- X = threads excluded (higher capacity)
|
|
150
|
+
- SC = slip-critical (higher bolt pretension required)
|
|
151
|
+
|
|
152
|
+
## Detailed References
|
|
153
|
+
|
|
154
|
+
For in-depth guidance on specific topics:
|
|
155
|
+
- [AISC Shapes Guide](references/aisc-shapes-guide.md) — all shape families, property definitions, selection guidance
|
|
156
|
+
- [Takeoff Procedures](references/takeoff-procedures.md) — detailed step-by-step with worked examples
|
|
157
|
+
- [Connection Types](references/connection-types.md) — standard connection details, hardware weights, bolt patterns
|