Material Library
Partly availableSome of what this page describes is in DimSum today and some is still coming. Parts marked Coming are designed but not built yet.
Every table in your tool libraries, in one place — lumber, sheathing, fasteners, whatever your POS carries — where every row is a material and every material is a part: load one into a tool and it stays linked to its row until you unlink it, so a change to the table is offered to every part loaded from it.
Overview
"I want materials to be parts, these are just a little more specific... It would live in the material library, if we wanted to add it as a part into a template, we open the material library, add in the part. This is similar to a table, but the table should have the 'list' of material, importable, exportable, then the materials/parts are generated from those lists... If I import it into a template, then it should stay linked to the material library until I change that. If I update the list, the material library gets updated instantly, in turn updating the parts linked to it."
So a material is not a new kind of thing. It is a row of a list, and adding it into a tool makes a saved part whose properties follow that row. Everything else is machinery DimSum already had:
| Asked for | What it is |
|---|---|
| "materials to be parts" | a saved part (Tool Designer) |
| "the table should have the list" | a table — one imported list is one section of the library, and its columns are the fields |
| "stay linked … until I change that" | a row the part follows — type your own value to break one property, clear it to follow again |
| "updating the parts linked to it" | a following property reads the current cell, so a re-import reaches it with nothing done to the part |
| an old job meeting a changed list | the update screen (Dynamic Lists & tables) |
It's for any trade: a framer's LVLs, a roofer's shingles, an electrician's boxes and wire. If your POS can export it, it can be a table.
Where to find it
- The Tools tab → Material Library, the second entry on the designer's rail: Tools · Material Library · Assemblies. Its head says what it is for — Everything a property pulls from: lists of choices, and tables whose every row is a material — and it holds two sections, as two tabs, Lists then Tables. It opens on Tables.
- Lists — the same Lists section as before, moved in: each folder's shared lists, grouped by folder, Division and Trade included. Nothing about lists changed.
- Tables, under two headings on the left:
- DimSum Defaults — the tables in DimSum Defaults, read-only.
- Custom — one folder per
.tsumin your tools folder, named by its file and listed alphabetically — the same folders the Tools tree shows — each with its tables and their size (columns × rows, 14×30). A table is opened, edited, renamed and deleted where it is: nothing switches, and its edits go on the one Undo, which names the folder — Undo Edit cell in My Tools. Folders are made, renamed and deleted from the Tools tree's right-click (Tool Designer → Folders). - Under the folders: Table in ‹folder›, Import… into ‹folder› and Create a CSV template…. The folder is the one of whatever is selected — click a table in My Tools and they read Table in My Tools, Import… into My Tools.
- See Tool Designer.
- Removed: a job has no material lists or tables of its own; the Material Library is the only place they live.
- Bulk price updates by re-importing your price file — the only way: was dropped. CSV is the only import and export — Excel import was dropped the same day.
- Tool Designer → Parts → + → Advanced part: a part that names one of these tables and filters it; its Table box lists every table here, flat, by name and row count — Lumber3 (30) (below).
How to use it
Import a table — it asks nothing
The wizard's column-by-column questions are gone — for every table in a library, not only a POS export.
- A header that matches a known property is that property. A header called
Materialis Made Of, as it has been - Every other header becomes a custom property, named after the header, as Text, in a group called Custom. Nothing is ignored and nothing is asked: change a column's type, unit or group afterwards, in its column settings. (or set them in the file itself, in the rows under the names — Settings rows.) A header with a reference character in it loses it (
Price/ftis Price ft), and a header naming something a column cannot be called — Type, the Audit four, a second Cost — arrives as Type (imported), still remembered by its header. - The key — what a re-import matches rows on — is Item # when a header matches it, else the first column.
- The column that names each row is Name when a header matches it, else Description, else the key.
- Any other file makes a new table, named after the file.
- A table's own Import… — top right of the table, beside Export… — re-imports into that table, whatever the file is called: matched on that table's own key, rows updated in place, new keys added, missing ones kept and flagged. This is the button for a price file your supplier named. A file with no column for the table's key is refused, by name. Walked through, and set against the folder's Import…, in Tool Designer → Import into a table you already have.
- Nothing is marked required, so no row is skipped for an empty cell; an empty key, or a key twice, still skips the row, and the answer counts it.
- One command, one
Ctrl+Z. A byte-order mark at the front of the file is stripped, so a CSV saved by Excel reads like any other, and the empty column a trailing comma makes is dropped.
It answers in one line, under the head: "Lumber2: 30 rows — 14 columns matched, no new custom properties, keyed on Item #." A re-import says what it did to the rows the table had: "Lumber2: re-imported — 30 updated, 0 added; 14 columns matched, no new custom properties, keyed on Item #." — with N kept and flagged when the file left some out, N ignored as before for headers an older wizard import was told to ignore, and any row not written counted on the end with its line and why. a file with settings rows says so on the end — "…; types, units and groups from rows 2–4" — naming the rows it read (Settings rows).
The table lands in the folder the button names — Import… into My Tools — under Custom, and opens on the right. DimSum Defaults is read-only, so an import into it is refused.
What went with the questions: the key-column step, the link / create / ignore step for each column, the Required ticks and the rows they skipped, and the preview before Import. So does a re-import comes back answered — there are no answers to remember, because a header lands on the same property every time by the same rule.
The create-template CSV stayed — Create a CSV template… under the folders: its header is the material standard plus the offered properties, so a file filled in from it imports with every column already a property of its own. its header is plain names — no (in) in it any more — followed by Type, Units and Group rows, so the file you fill in carries its settings back in (below).
Settings rows: Type, Units and Group in the file
A CSV may carry each column's settings in the rows under its names, in this order:
| Row | What it holds |
|---|---|
| 1 — Name | The column names. Always — the one row every file must have, as before |
| 2 — Type | Number, Percentage (or Percent), Slider, Text, Yes/No (or Yes / No, Checkbox, Boolean), Color (or Colour). Capitals, spaces, /, - and _ don't matter |
| 3 — Units | A unit DimSum knows: DimSum's own units, $ and % included; the material standard's lb, psi, in4 and in3; your own units from System Settings → Units; and any unit a column in that folder already uses |
| 4 — Group | Any text — one of DimSum's groups, or one of your own |
Rows 2–4 are there only if you put them there. A file of boards does not normally have a row of the word Number in it, so DimSum checks before it reads anything as a setting:
- Row 2 is Type only if at least one cell is filled and every filled cell is a type word. Otherwise there are no settings rows: row 2 is your first row of data, and the file imports as before.
- Row 3 is Units after a Type row, when every filled cell is a known unit. An all-blank row 3 counts as the Units row, so a table with no units at all still comes back in with its groups.
- A unit DimSum doesn't know is still read as the Units row when it plainly is one — every filled cell under a Number, Percentage or Slider column, short, and no digits except a power like
m2. The known units are set; the unknown one is left unset, and the answer says so: "…; types, units and groups from rows 2–4 (row 3: "bdft" isn't a unit DimSum knows, so Volume has none — add it in System Settings → Units and import again)". - Row 4 is Group after both, any text. An all-blank row 4 counts too.
- A blank cell leaves that column's setting as the import would have made it without the row (Import a table).
An example — four of the fourteen columns of samples\Lumber3.csv, which is the same 30 boards with the three settings rows under the names:
Item #,Description,Cost Each,Width
Text,Text,Number,Number
,,$,in
Product,General,Cost,3D
STUD-92,2x4 Stud 92-5/8 SPF,3.48,1.5| Item # | Description | Cost Each | Width | |
|---|---|---|---|---|
| Row 2 — Type | Text | Text | Number | Number |
| Row 3 — Units | (blank) | (blank) | $ | in |
| Row 4 — Group | Product | General | Cost | 3D |
| First row of data | STUD-92 | 2x4 Stud 92-5/8 SPF | 3.48 | 1.5 |
Row 2 is all type words, so it is Type. Row 3's filled cells, $ and in, are both known units, so it is Units — the two blanks leave Item # and Description as the import would have made them. So row 4 is Group, and STUD-92 is the first material. Cost Each arrives a Number in $, reading $3.48, filed under Cost; Width a Number in inches, under 3D. The rest of the file puts Stock Length in ft, Weight in lb and E and Fb in psi under Structural, and Supplier under Purchasing. Import samples\Lumber2.csv instead and its second line is STUD-92,… — not a type word — so it has no settings rows, and it imports as it always has.
It says so. The one-line answer ends with what it read:
| The file had | The answer ends |
|---|---|
| A Type row only (row 3 was data) | …; types from row 2 |
| Type and Units rows (row 4 was data) | …; types and units from rows 2–3 |
| All three | …; types, units and groups from rows 2–4 |
— plus …; N cells could not be converted when any cell didn't fit its new type. A file without settings rows gets the same line as before.
One Ctrl+Z takes the table and its settings together.
Re-importing sets them too. A file with settings rows imported into a table you already have — a same-named file through Import… into ‹folder›, or any file through the table's own Import… — sets those settings on the table's columns, in the same one Ctrl+Z as the rows. A type change converts the cells the way a column's Settings… does: every cell that reads as the new type becomes one, and a cell that does not is left exactly as it was, marked, and counted. A setting the column already has isn't applied again.
On a Material Library table, Export… writes the names, then Type as the Settings… dialog labels it (Number, Percentage, Slider, Text, Checkbox, Color), Units as stored (blank if none) and Group (blank if none), then the rows.
Create a CSV template… writes them too. Its header is plain names now — no (in) in it any more — then the Type, Units and Group rows, then the example row:
| Column | Type | Units | Group |
|---|---|---|---|
| Name, Description, Call Size, Made Of | Text | (blank) | General |
| Item # | Text | (blank) | Product |
| Width, Height | Number | in | 3D |
| Stock Length | Number | ft | 3D |
| Weight | Number | lb | 3D |
| Cost Each | Number | $ | Cost |
| The offered columns | Their own — E and Fb Number in psi, Waste % Percentage in % |
A job's own import and export were unchanged — and removed with the job's Lists & Tables and Materials.
Column Settings… is not changed. The settings rows are another way in to the same settings — change any of them afterwards from the column head (Column settings).
Column settings
Every column has its own settings — "so we can change what group it goes in, and what units its uses, and what type of value it is". In the Material Library a column head's button reads Settings…; editable any time, and Save column is one Ctrl+Z. it opens as a dialog titled Column settings, with the column's name beside it — — the cursor in Name, and Esc closes it; what is in it did not change:
| Setting | What it is |
|---|---|
| Name | The column's name, as before |
| Type | Number, Text, Yes / No, Percent, Colour — a column the import made up starts as Text |
| Units | The same dropdown a property's unit is — Length, Area, Volume, Count, Time, Percent and Money: $ (dollars). A number in a $ column reads $3.48, the way the panel writes money, not 3.48 $ |
| Group | The group the property this column sets is filed under — Custom for a column the import made up; type one of DimSum's groups or one of your own. A property a link creates from this column lands in it (Supplier set to Yard arrives under Yard) |
A number column also has Feet and inches and Decimals, as before.
$ is in every Units dropdown, under Money — a property's own Settings… as well as a column's. A dropdown linked to a $ column shows its choices as money ($8.42).
Changing a type converts what it can, and says by count what it could not. Turn a Text column of weights into a Number and every cell that reads as a number becomes one. A cell that does not is left exactly as it was — never blanked, because a blank would hide which cell was wrong — and counted: "Grade is Number now — 30 cells could not be converted to Number. One Ctrl+Z puts the column back." Those cells are drawn amber with a dotted underline, and the hover says why: "Not a number value — Grade is Number. Kept exactly as it was; type over it to fix it." When everything converts it says "— every cell converted."
Which column is Depth, and which is Width
the answer: let the user pick per library. So:
- Each library (material folder) says which column means Depth (Height, Depth, Size …) and which means Width. Open a table (Tools → Material Library → Lumber3): two dropdowns, Depth column and Width column, sit above the open table, and set it for that table's folder. Each lists the guess (Guess (Height)), every column name in the folder's tables, and None. The choice is a name, so it applies to every table in the folder that has a column of that name.
- Asked again after an import. Right after Import… into a folder, the two boxes come back with a line above them: Which column of this library is the Depth, and which the Width? DimSum guessed — change it if that is wrong.
- DimSum guesses, and shows its guess (Guess (Height), or Guess (none) when the table on screen has neither): for Depth, a column named Depth, else one named Height, else none; for Width, a column named Width. A table with both Depth and Height uses Depth. Pick another column if the guess is wrong, or None. Picking the guess's own answers on both sides is the guess again.
- In DimSum Defaults, or a folder another DimSum has open, the boxes are greyed with the reason.
- A linked beam or joist takes its depth from the chosen column, and its width from the chosen Width column.
- The warning is for None only. When the Depth column is None and the matched row has a Height, Needs attention says so — B1's Beam Material has a Height of 9 1/4" but no Depth, so Member Depth reads 11 7/8" — type Beam Depth, or pick the library's Depth column (or … type Joist Depth … on a Joist item) — and Member Depth keeps the part's own Depth.
- A size typed on the tool still wins over the table (Beam tool, Joist & Rafter tools).
- One Undo: Set the Depth and Width columns, or Guess the Depth and Width columns to go back to the guess. Refused, with a sentence: No table in {Library} has a column called {name}, or {Library} already uses those columns. DimSum Defaults is read-only, as always.
- A job's own copy of a row reads the guess.
A table an Advanced Part filters
An Advanced Part is a part made in the Tool Designer from the Parts tab's + → Advanced part. It names one table in the Material Library, filters it by the item's answers — Stock Length equals Height, Call Size equals Stud Size, or at least, at most, contains — and fills itself from the row left first in line (Dynamic Lists → The Advanced Part). What that means for the table:
- Every column of the table is a property of the part, filled from the matched row — the column that names the row too. Only a column called Name is left out, because the part has its own name. They are the only properties the match writes; everything else on the part is set as on a regular part.
- A comparison follows the column's type. A Number column compares as numbers in its unit — an input in other units is converted,
10'equals120 in, and a typed10on a column inftis 10 ft — and a Text column ignores capitals and end spaces. at least and at most on a Text column compare alphabetically. So a length you want to compare at least or at most belongs in a Number column with its unit: set it in the column's Settings… (Column settings), or in rows 2–3 of the CSV (Settings rows) —samples\Lumber3.csvhas Stock Length as Number,ft. - Row order counts when the part has no sort: with several rows left, the first in the table is the one it takes. With a sort, rows that tie keep the table's order, and blank cells — and words in a Number column — go last.
- A changed table is asked, never applied by itself. A matched row is written into a tool or a job as frozen values with the three names, like every pull from here. A change that leaves nothing matching is not offered — the part keeps its row until its own inputs change.
- Nothing left after the filters: the part is flagged and names the filter that emptied the list — No material matches these conditions — Stock Length equals Height left nothing. The fix is often here — a row the table doesn't have yet (no 2x6 at 9'), or a value spelled differently in the column.
- A folder that isn't on this machine — or a table renamed or deleted — leaves the part with its values and the line My Tools isn't in your materials folder, so this part can't be matched; the values are kept. It is not flagged.
Fixed parts: the Joist and Beam tools' materials
A fixed part is an Advanced Part that belongs to a smart tool. It comes with the tool, and the tool counts into it:
| Tool | Fixed part | Qty | Unit |
|---|---|---|---|
| Joist Tool | Joist | {Item > Joist Count} | ea |
| Beam Tool | Beam Material | {Item > Beam Qty} | ea |
| Beam Tool | Flitch Material (on only for a Header) | {Item > Member Count} | ea |
| Beam Tool | LF Material (a beam past the Longest Length) | {Item > LF Qty} | ft |
| Joist Tool | Joist Hanger | {Item > Hanger Count} | ea |
| Beam Tool | Beam Hanger Material | {Item > Beam Hanger Count} | ea |
| Beam Tool | Beam Pocket Material | {Item > Beam Pocket Count} | ea |
| Joist Tool | Rim Material | {Item > Rim Qty} (pieces) | ea |
- It's linked to a table here and filtered exactly as in A table an Advanced Part filters: any table, any filters, a sort. The shipped tools leave the table empty, so the link is yours to make on your copy. Typical filters: the Joist part on Call Size equals 2x10 and Stock Length at least
{Item > Longest Joist}, smallest first; the Beam Material on Stock Length equals{Item > Ordered Length}. A joist or beam edit that changes those outputs re-matches the part in the same Undo. - it is matched for each joist and for each beam (built. A joist filters on its own
{Joist Length}(and its own{Joist Material}), a beam on its own Ordered Length, so a 9' joist and a 14' joist in one area pick different boards. The match for each is worked out when it is read, once for each distinct set of inputs, and nothing is stored for it. The part on the tool item itself is still matched, for the longest joist or beam, which keeps Joist Width and the beam's Line Width meaning one number for the item. Estimating and reports show one line for each matched material, such as Joist — 2x10 14' — 9 ea (Area 1 J1–J9), and the item-level line for the part is gone, so nothing is counted twice. A joist or beam whose part has no match is flagged under Needs attention. One joist or beam can have its own values (a joist its own Joist Length or Joist Material, a beam its own Plies or Beam or Header), and its match follows them (Joist & Rafter tools, Beam tool). - It can't be deleted. Joist is part of the Joist tool, so it can't be deleted — set its Qty to 0 instead. That's all the app shows: since 0.5.30 a refusal no longer starts Error: BadRequest:. Its Qty is an ordinary formula, and 0 is allowed.
- It stays at the top of the parts. Moving it under another part is refused (… so it stays at the top of the parts); reordering it among the top-level parts is fine.
- It stays a Part. … so it stays a Part refuses Linear, Area or Point.
- It can be renamed. The tool finds it by what it is (its role), never by its name, and formulas that spell the name are rewritten as for any part.
- It shows a lock badge, Fixed — part of the Joist tool (or Beam tool), and Delete, Move into and the Make … actions are greyed with the reason.
- A copy of it is ordinary. Duplicate it, or save it as a saved part, and the copy is a plain Advanced Part you can delete.
- It's fixed only on its own kind of tool. On a Joist or Beam tool, or an item placed from one, the role counts; anywhere else the same part would be an ordinary Advanced Part.
- Changing its table works as for any Advanced Part: a changed row is offered on the update screen, and No material matches these conditions flags a filter that leaves nothing.
Every row is a material
- Every row of every table in the Material Library is a material. A row missing any of the material standard — Name, Description, Item #, Call Size, Made Of, Width, Height, Stock Length, Weight, Cost Each — is still a material, marked with what it is missing, by name: a quiet missing Cost Each at the end of its row, beside Add as a part took the button off (the label stays), and on hover "6x6x12 Doug Fir #2 is a material all the same — it is short of the material standard by Cost Each. Fill those columns in and the label goes." The standard is a label on a row, not a wall between two lists.
- The Table tied materials section is gone from the Tool Designer, and so is Fill these in… as the way to move a row from one section to the other: there are no longer two sections. A row gets what it is missing the way any table does — a column added, a cell typed in — and its label goes by itself, because what a row is missing is worked out fresh every time.
- There is nothing left to pull in — Pull a table in is gone from the designer. Every table is already in the Material Library.
- Create a CSV template… stays, word for word as it was. Add as a part stayed which took it off the rows: a material becomes a part through the Parts tab's + → Load part…. A part swapped for a material "in place of any sub-item" waits for a later build.
Import a list
a library's tables import with no questions (above). Kept for the record.
The import is a process — a wizard, in the sense — because it cannot be one button: a POS export does not use DimSum's names.
- Project Settings → Materials → Import a list… in a job. Pick the CSV. Choose whether it makes a new list or re-imports one you already have.
- Key column. Pick the column that identifies a row — SKU, Item #, whatever the export carries — and the column that names each row. "Match on a key column you pick." The key is remembered on the list, so a re-import shows it and does not ask again.
- Columns, one at a time. For each one: link it to a property you already have, create a new property — which asks which section it goes in ("custom property should ask what section it goes in") — or ignore it. An ignored column is never imported.
- Required. Tick a column and a row with that cell empty is skipped: "if that row does not have this column, it is skipped." The tick says so where you tick it.
- Preview. Every count, before anything is written: matched, new, kept and skipped — and every skipped row with its line, its column and why ("Line 4 — 2X12-16 — cost is empty"). A silent skip is a missing material nobody goes looking for.
Then Import. The whole import is one Ctrl+Z.
In a library, "link" means the name. A library file has no property registry to point at, so a column in a library carries the property's name — Item #, Cost — rather than a link. The wizard says so instead of offering a choice the file cannot hold. That is also why an export comes back out under the names you call things, not the names the POS used. In a job, a column links to a real property, including the preloaded ones every part has.
Re-import, which is the point
"If I update the list, the material library gets updated instantly." Run Import a list… again on the same list with the new file. Matched on the key column:
- Matched rows are updated in place, keeping who they are — so every part following one follows without being touched.
- New keys are added.
- Keys that are not in the file are kept, and flagged not in this import — never deleted. A part in a finished job must not lose its material because an export was filtered differently. A later import that carries the key again takes the flag off.
The preview says all of it before anything is written, and one Ctrl+Z puts the whole re-import back, parts included.
A re-import comes back answered. Pick the list under Where it goes and the wizard starts from what that list already has, so next month's file is Next, Next, Next:
- The key is greyed — "Lumber matches on Product Number, chosen when it was first imported. It does not move." It is found by the header it was imported from, so a key you renamed on the way in is still the key.
- Every column comes back as you answered it. Each column remembers the file header it came from, so
POS #mapped to Product Number the first time is found as Product Number the second — linked to its property in a job, or as the column itself in a library, with its type, unit, section and Required tick. It says where the answer came from — "Filled in from the list: this is its Product Number column, answered when it was first imported. Check it and go on, or change it." A header that already is the column's name is found the same way. - A column you ignored comes back ignored, and says so: "Ignored the last time this list was imported." The list keeps every header it was told to ignore, this time and every time before — less any a later import mapped after all.
- The column that names each row is remembered the same way, by the header it came from.
- Only a header the list has never seen is a real question, asked as on a first import.
What it remembers is written by the import itself, so one Ctrl+Z forgets it with the rest — the undo reads Undo Import ….
a library's re-import is a file with the same name as the table — or any file through the table's own Import… — and there is nothing to come back answered: the headers decide, the same way every time. Matched, new and kept-and-flagged work exactly as above.
Export a list
Export… writes the open section out as a CSV — every material, flagged ones included — under the column names you mapped them to. a Material Library table's Export… writes each column's Type, Units and Group as rows 2–4, under the names, so the file re-imports with its settings (Settings rows). A job's own export went with the job's tables
The material standard, and the two kinds
Asked what makes them different: "Tied = does not follow the material standard. Materials are going to be required to have quite a few properties set, so that we can place them in 3d, and use them in reports."
So the difference is conformance, not linkage. Both kinds follow their row and update with it; one has enough on it to be placed and reported, the other does not.
The material standard — what a true material must have set, and why each one is on the list. Anything missing makes the row table tied.
| Required | Why it is required |
|---|---|
| Name, Description, Item # | It has to be findable, and a report prints all three |
| Call Size | 2x6 — what it is called, and what a report prints instead of a description |
| Made Of | SPF, Doug Fir, A36, PVC. Never called Material — that word means something else (below) |
| Width, Height | The dressed cross-section, in the stock's own frame |
| Stock Length | What you buy. The length a piece is used at belongs to the takeoff |
| Weight | Loads, shipping, and the number most often asked for |
| Cost Each | A material with no price cannot be estimated with |
Qty is not on the list. Every part has one already, and the own rule for it — "this will be set manually every time" — is the opposite of something a list supplies. Checking it made every row of a real POS export arrive tied, on the one property no export carries, which read as a bug and was the standard working. It is not in the generated CSV template either, for the same reason.
Not required, and deliberately: Grade, Finish, Supplier, E, Fb, Moment of Inertia, Section Modulus, Capacity, Coverage, Purchase Unit, Waste %. They are offered — DimSum knows these names and will match a column to them — but a material without them is still a material.
Orientation is not a material property. A 2x6 is 1½ × 5½ whether it stands as a stud, lies flat as a plate or sits on edge as a joist: which way it points is a placement fact and belongs to the tool.
"Set" means two things at once: the list has a column supplying that property, and this row's cell in it is not blank. Present-but-empty is not set — a column called Cost Each holding nothing prices nothing — and it is the same rule the import already applies when it skips a row on a required column. Which column supplies a property is the same question a bind asks: the property the column was mapped to, else the column's own name. So a POS export whose item# was mapped to Item # meets that part of the standard and one that was not does not — the same answer {Item #} would give. Name is the label column, because the label already names the row.
Two sections, and one button. The Material Library's grid splits into Materials and Table tied materials below them. A tied row says what it is missing, by name, and gets Fill these in…, which makes the missing columns and sets the cells in one Ctrl+Z — after which the row moves up by itself, because what a row is missing is worked out fresh rather than remembered. What a row is missing rides on the row itself, so the grid and a report cannot come to different answers.
Any table can be pulled in, from this library or another. Pulling one in gives it a key column — which is all a section of the Material Library is — so every row becomes a tied material at once, and nothing is promoted by itself. From another library the table comes whole, every row and not only the bound ones, and a table this file already has is pulled in where it stands rather than doubled. there is nothing to pull in, in the Tool Designer: every table is in the Material Library. A job's Materials pulled one in, removed it.
An import renames the column outright and remembers Material as the header it came from, so a re-import still matches it. Refused rather than shadowed: a formula whose meaning depended on what somebody imported is exactly what the reference words exist to prevent.
The required ten know their own spellings. desc, item#, item #, cost, price, sku — with and without the unit written in — are matched against the ten at the import, where the column is being named, and only for headers the wizard left alone. That is why a plain POS export now arrives as materials rather than as a screen of tied rows. Matching later would have been worse than useless: a row would say it has Cost Each while {Cost Each} on its part found nothing. there is no wizard in a library, so these spellings decide every header, and the offered set is matched the same way.
What still fights, honestly. Neither sample export carries every column of the standard, so a first import can still leave rows tied — that is the standard working, not a bug, and it is why Fill these in… had to make columns as well as set cells. One fill lifts a whole list at once.
Add a material into a tool as a part
"We open the material library, add in the part."
- Tools → Material Library → Tables, open a table and find the row.
- Add as a part at the end of the row, pick the folder it goes in, and confirm. It needs a folder in the library first. the button is gone from the rows — — and a material becomes a part through the Parts tab's + → Load part… instead.
- A saved part appears there, called what the row is called — 2x6 SPF 16ft — with a property for every mapped column, each one following the row: its Cost reads
{Table > POS Items > Cost}, and shows the cell's value. - Re-import the list with a new price and the saved part reads the new price, with nothing done to it.
The column that names the row sets no property of its own — it is what the part is called.
It says what it made and where: "2x6x16 SPF added to My Templates › Framing › Walls — it follows this row from now on." Until then the command worked and the screen closed in silence, on the one screen that hides the library tree. A tab is a destination as well as a folder, and the disabled button now names both.
One row makes one part per folder. Press Add as part twice in the same folder and the second is refused by name — "2x6x16 SPF of Lumber is already a part here, called … — open that one, or put this one in another folder" — because a saved part is not a quantity, and two of them means {Framing > 2x6} picks one at random. Two folders is how to have it twice, and the refusal says so.
Pick a material straight out of the library
"I imported a list inside the materials library, I cannot select it as a part in the 'Load a part…' section of a new part. Thats what I want, materials are parts. They should always allow me to select them from the library, without having to import them into a job first."
Load a part… now lists the library's materials beside the saved parts, in their own group, found by the same search box. Pick one and a part is placed holding that material's values — no import into the job first, nothing saved in the library on the way, and no list or table landing in the .dsum (below). The picker groups the two kinds by the same fact the Material Library grid does, so a tied row is visibly a tied row before you pick it.
the From folder box names the place — Tools → Custom → Framing, Tools → Custom → My Tools, Materials → Custom → My Tools, DimSum Defaults (read-only). Pick a material folder and every row of its tables is listed under MATERIALS, each named by its naming column with its table beside it. Loading one makes a part — Undo Load a part in Framing — and no table is copied into the tool folder.
Load part… keeps that From folder box as it is, marks each material row with what it is missing of the material standard — missing Cost Each — the way the Material Library marks it (Every row is a material), and loads a row when you click it.
A create-template CSV. "This would create a csv template for us to add all of our rows to. It would just populate the columns." One button writes a CSV whose header is the material standard plus the offered properties, each with its unit where it has one, and one example row — a 2x6 that meets the standard, blank under everything that is only offered — ready to fill in and import back. It is a fact about DimSum and not about any one file, so it writes with no project open. the header is plain names (the unit is no longer written into it), followed by the Type, Units and Group rows and then the example row, so a file filled in from it arrives with its settings (Settings rows).
Into a tool, and on into a job
"If I import it into a template, then it should stay linked to the material library until I change that. If I update the list, the material library gets updated instantly, in turn updating the parts linked to it." Inside a library, every hop keeps the link. Into a job, it does not — a job holds the numbers, frozen.
| Hop | What happens |
|---|---|
| Add as part | A saved part, every property {Table > Lumber > …} plus the number it reads, following its row |
| Load a part… into a tool, in the same library | The part keeps following its row |
| Load a part… from another library | The table comes too — whole, every row — because every library stands on its own. From then on the part follows that library's copy |
| Place the tool, or Load a part… in a job | The part arrives holding literal numbers and three names. No table travels — not into the .dsum and not into its journal |
| Open the job with the library deleted | It opens whole and reads the same numbers, because the numbers are its own |
Change the list, and the library follows at once. Re-import next month's file and the saved part and every tool it was loaded into read the new price immediately, with nothing done to them. That is "instantly", and it is true inside the library.
So placing copies:
- The literal values, not
{Table > … > …}formulas. The part reads the same numbers on any machine, with no library present, forever. - Three names — the library's name, the list's name and the row's key — kept as plain text, for one purpose only (below).
- And nothing else. No table, no column, no cell, in the file or in the journal behind it.
A formula is frozen too, not just a bare reference. {Table > Lumber > Cost} lands as the number it last read, and {Table > Lumber > Cost} * 2 lands as 8.42 * 2 — the reference replaced where it stands, the arithmetic left alone. With no table in the job, a formula still naming one would be a screenful of ERROR.
Updates arrive when the library is open, and never by themselves. The three names are not a path. They are how the update screen finds the row again while that library is open: it matches by name and offers the new numbers as old → new, every instance of that row, with Select all, Update selected and one Ctrl+Z over the whole batch. A library that is gone is simply not among the rows it can offer — no error, no path to mend, nothing to say. Refresh in the top bar still counts what is waiting.
An unticked instance keeps its number, and is offered again next time. Nothing is shared any more, so there is nothing to stop following: an instance you leave unticked keeps the number it holds because the number is its own, and it comes back the next time that library is open. The screen's warning says exactly that — "keeps the number it has now, and the update screen will offer this again." Skip writes nothing and remembers a version nobody took.
Save as tool… on a frozen part carries the three names back out to the library, not a row.
Rename or delete in the library. Deleting a row, a column or the list freezes those parts at the number the cell held, the same as Unlink — never a screenful of ERROR. Unlink, and typing your own value, keep the number and stop following, exactly as everywhere else.
Known, and not built: a job can only be offered a newer number while the library is open. Nothing goes looking through the file system for one when a job opens — that is the Refresh Center, and it will find the update screen already built and already finding rows by name. And a tool copied into a second library brings the table with it and then follows that library's own copy — re-importing in the first library does not reach it.
Link a part in a job to a material
A formula that already names one still reads blank, with its warning. Kept for the record.*
- Make or import the job's materials in Project Settings → Materials.
- Open a part. The Material line says none linked. Click Pick…, search, and pick a row. Rows the last import did not carry are marked, and are still perfectly linkable.
{Material > Cost},{Material > Species}— any column of that list — now reads on that part. Unlink stops it pointing at the material.
With nothing linked, {Material > Cost} reads blank, with a small warning. Not a red ERROR — nothing is wrong — and not silence: the row gets the amber treatment a unit mismatch has, the hover says "no material linked", and Needs attention lists it as a warning.
Deleting a material unlinks every part that pointed at it, in the same Ctrl+Z, so those parts read blank and say why rather than pointing at nothing. Undo puts the material and its links back together.
Add a material by hand
+ Material at the foot of a section adds a row (it starts as New material 1, because a material needs a name). Edit any cell in place. A field of the section is a column: add, rename or remove one the way you would on any table.
The rail renames in place: double-click a section in the left rail, or press F2, and the row itself becomes the box. It is the same rename as the editor's title — one command, one Ctrl+Z and the same warning, "Every formula naming this list as a table is rewritten with it" — and a read-only library refuses there exactly as it refuses everywhere else.
Options & settings
A table in the Material Library
| What | Behaviour |
|---|---|
| Where it is stored | Where tables always were — inside its library's .tsum. There is no material-library file. in a .tsum in the materials folder, apart from the tools |
| Its folder | DimSum Defaults if it is in DimSum Defaults (read-only); Custom → its folder — the .tsum it is stored in — with its size (columns × rows) |
| Opened | Where it is, in its folder — nothing switches; the one Undo names the folder |
| Its columns | Whatever the file's headers were: a known property where a header matches one, a custom Text property in the Custom group where it does not. a file's settings rows set each column's Type, Units and Group, a blank cell leaving it as above (Settings rows) |
| Its key | Item # when a header matches it, else the first column |
| The column that names each row | Name, else Description, else the key |
| A column's settings | Settings… on its head: type, units (with $ under Money) and group, one undo each; a type change says by count what it could not convert and marks those cells |
| What a row is | A material, always — labelled missing … with what it lacks of the standard, if anything |
A section
| What | Behaviour |
|---|---|
| Its fields | Whatever columns the file had, called whatever you mapped them to. There are no fixed system fields — Name, SKU and Cost are not special any more |
| Its key column | Chosen at the first import, remembered, used by every import after |
| The column that names each row | Picked in the wizard; it is what a generated part is called, and it sets no property |
| Required columns | A row missing one is skipped, and the import says which line and why |
| A flagged row | Not in this import — kept, still linkable, still read by anything following it |
| Which of the two kinds a row is | Worked out, never set: a row with all ten of the standard set is a material, anything short of it is table tied and says what it is missing |
How other features use it
| Feature | Uses | State |
|---|---|---|
| Parts | A generated saved part follows its row; a job part read a linked material with {Material > …} | the job part's link removed |
| Load part… (Tool Designer) | A material folder's rows under MATERIALS, loaded as a frozen part with three names | each row marked with what it is missing, loaded on a click, and the part staying linked, **** |
| The Tool Designer's update screen | A loaded part or a pick whose row or table has changed, offered old → new, opening by itself on the Tools tab, Refresh in the bottom bar reading 1 behind; Unlink at the top of a part () | |
| Advanced Part | One table, filtered by the item's answers; the row first in line fills every column of the part, frozen with its three names; a changed table offered on the update screen (above) | |
| A material in place of any part | Swapping a part for a material | Coming |
| A property's Settings… | Material Library: Lists / Tables — link a property to a list or a table, its dropdown groups saying where each came from: Lists, Tables in this job, Material Library → Custom → ‹folder› for each folder that has tables, Material Library → DimSum Defaults (once it has tables) | the link itself ****. two groups, Lists and Tables, with no folders — a folder name only where two share a name |
| Formulas | {Material > Any Column}, blank with a warning when nothing is linked | not offered by the Property Picker — an existing formula still reads blank with its warning |
| Joist and Beam tools | Their fixed parts, Advanced Parts filtering a table here; Joist Width and the beam's Line Width read the matched row's Width; each joist and each beam is matched on its own (Fixed parts) | |
| Joist Hanger, Beam Hanger Material, Beam Pocket Material | Three more fixed parts, filtering a table here, matched for each joist or beam (Fixed parts) | |
| Rim Material, sheathing layers | A fourth fixed part on the Joist tool, matched for each rim member, and sheathing layers, Advanced Parts you can add and remove, matched for the item (Fixed parts) | (ships in |
| A beam's or joist's real size | The library's chosen Depth and Width columns, read by the fixed parts, giving Member Depth and Member Width (Which column is Depth) | |
| Wall tool | Size dropdowns; actual cross-section → Width/Height | Coming |
| Assembly slots | Filtering a slot to the materials that belong in it | Coming |
| Reports | Any field; an Engineering / Species Report starter template | Coming |
| Export Profiles | Item #, SKU, supplier columns for POS/ERP uploads (Export Profiles) | Coming |
Examples
A POS export, end to end (the run the build was proven on, with made-up items):
| sku | item # | desc | cost | species |
|---|---|---|---|---|
| 2X10-12 | 2X10-12 | 2x10x12 SPF #2 | 12.50 | SPF |
| 2X10-16 | 2X10-16 | 2x10x16 SPF #2 | 17.25 | SPF |
| 2X12-16 | 2X12-16 | 2x12x16 SPF #2 | SPF |
Map sku to SKU (the key), item # to a new Item # in a section you call POS, cost to Cost and tick it required, ignore species. The preview says 3 rows · 2 new · 1 skipped — Line 4, 2X12-16, cost is empty, and nothing is written until Import.
Now change 2x10x12's price to 13.95, drop 2X10-16 from the file, give 2X12-16 a cost, and import again: 1 matched · 1 new · 1 kept and flagged. Anything following the 2x10x12 row reads 13.95 without being touched; 2X10-16 is still there, tagged not in this import, at its old price. One Ctrl+Z puts it all back.
Coverage: insulation with a Coverage column of 75 sf per bag, linked to a part on 348.75 sf of wall cavity → ROUNDUP({Item > Area} / {Material > Coverage}, 0) → 348.75 ÷ 75 = 4.65 → 5 bags. DimSum never rounds on its own; the formula does.
Tips & shortcuts
- Pick a key that never changes for an item — SKU or Item #, not the description.
- Tick required on the columns you cannot work without (usually cost). The preview tells you exactly which rows it skipped and why.
- Map the POS's
item#/POS #to the Item # you already have, rather than creating a second one. In a job, the preloaded ones are offered. - Re-import rather than editing prices by hand — the flags tell you what the supplier dropped.
- Keep Item # and SKU exactly as your POS/ERP expects; they flow into Export Profiles later.
Rules, limits & edge cases
- Keys missing from a re-import are never deleted — they are kept and flagged. Delete a material yourself if you mean it gone.
- Deleting a material unlinks every part pointing at it, in the same undo.
- Renaming a list rewrites every part following it; deleting a row, column or list freezes them at their number.
- A job holds no table at all. Placing copies frozen numbers and three names, and a formula naming a table is frozen with them. Inside a library a table is still matched by its id, so pulling the same one in twice never doubles it.
- A job's numbers change only when you say so. A newer number is offered on the update screen only while that library is open, and an instance you leave unticked keeps its number — and is offered again next time.
- Import asks nothing: a header matching a known property is that property, every other one a custom Text property in Custom. A same-named file re-imports on the key; anything else is a new table. One
Ctrl+Z. - DimSum Defaults' tables are read-only, like everything else in DimSum Defaults. Copy what you want into a library of your own.
- Every row is a material: a row short of the standard is labelled with what it is missing and is still a material; there is no tied section to move it out of in the Tool Designer.
- A type change never blanks a cell: what it cannot convert stays as it was, marked, and counted.
- Settings rows are read only when row 2 is all type words: then row 3 is Units if every filled cell is a known unit (or plainly a unit — the unknown one left unset and named), row 4 Group after both, and an all-blank row 3 or 4 counts. Anything else imports as before. Row 1 is always the names. A job's own import and export take no part.
- A row is tied until the standard is met: all ten properties with a column supplying them and a cell that is not blank. Fill these in… makes the columns and sets the cells in one undo, and the row moves up by itself.
- A column called
Materialimports as Made Of, and the header is remembered so a re-import matches it again. - One row makes one part per folder: the second is refused by name, because a saved part is not a quantity. Two folders is how to have it twice.
- A row with no name cannot become a part — the core refuses it and says so.
- Add as part is the library's: a job has no tools to put a part into. it is gone from the Tool Designer's table rows too — Load part… is the one way a material becomes a part.
- In a library, a column carries a property's name; only a job can link a column to a property by identity.
- A linked part is asked, never changed behind its back, and an update writes only the tool folders it touched — never a material folder. A removed column is offered as removed; the part keeps its value unless you take it.
- Engineered values, when you import them, are data for formulas and reports. DimSum is a takeoff tool, not engineering software; verify sizing with the engineer or manufacturer.