<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Using Project Info as an editable lookup table — a practical example in Project data &amp; BIM</title>
    <link>https://community.graphisoft.com/t5/Project-data-BIM/Using-Project-Info-as-an-editable-lookup-table-a-practical/m-p/704209#M15630</link>
    <description>&lt;P&gt;Hi everyone,&lt;/P&gt;
&lt;P&gt;Here's a technique I've been thinking about for a while: using the &lt;STRONG&gt;Project Information&lt;/STRONG&gt; fields as a lightweight, human-readable database that any team member can update without touching the property expressions themselves.&lt;/P&gt;
&lt;P&gt;The idea is simple: you store your lookup data as a plain text string in a Project Info property, using a consistent separator (here: &lt;STRONG&gt;!!&lt;/STRONG&gt;) to mark the end of each value. Then, property expressions parse that string on the fly.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;— The technique, step by step —&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;FONT size="4"&gt;&lt;EM&gt;1. Store your data in Project Info&lt;/EM&gt;&lt;/FONT&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Create a Project Info property (e.g. &lt;EM&gt;ABBREVIATION - DO NOT MODIFY&lt;/EM&gt;) and fill it like this:&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;Sanitary: SAN.!!
Bedroom A: BED.!!&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Each line follows the pattern: &lt;EM&gt;Key: Value!!&lt;/EM&gt;&lt;BR /&gt;The &lt;STRONG&gt;!!&lt;/STRONG&gt; acts as a right-hand delimiter. The newline is optional but helps readability — ArchiCAD ignores it in expressions.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;U&gt;2. The expression&lt;/U&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This expression reads the Zone Name and returns its abbreviation if one exists, or falls back to the original name (I made the expression in the rench version of archicad, Zone/ Nom de Zone is the french version of room name):&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;IF (CONTAINS (CONCAT ( {Property:Zone/Nom de Zone}; ": " );{Property:ProjectInfoPropertyDefinitionGroup/ABREVIATION-DO NOT MODIFY}
);SPLIT (SPLIT ({Property:ProjectInfoPropertyDefinitionGroup/ABREVIATION-DO NOT MODIFY};
CONCAT ( STR ( {Property:Zone/Nom de Zone} ); ": " );2);"!!";1);{Property:Zone/Nom de Zone}
)&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;U&gt;3. What the expression does — step by step&lt;/U&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 1 — &lt;A href="https://help.graphisoft.com/AC/29/INT/_AC29_Help/061_ExpressionFunctions/061_ExpressionFunctions-57.htm#XREF_90889_Contains_CONTAINS" target="_blank" rel="noopener"&gt;CONTAINS&lt;/A&gt;&amp;nbsp;: does a match exist?&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;CONTAINS (
CONCAT ( {Zone Name}; ": " );{Project Info string}
)&lt;/LI-CODE&gt;
&lt;P&gt;&lt;BR /&gt;Checks whether the &lt;U&gt;Zone Name followed by &lt;STRONG&gt;:&lt;/STRONG&gt;&lt;/U&gt;&amp;nbsp; appears anywhere in the Project Info string.&lt;BR /&gt;→ If &lt;STRONG&gt;FALSE&lt;/STRONG&gt;: the zone has no abbreviation → return the Zone Name as-is (the last argument of IF).&lt;BR /&gt;→ If &lt;STRONG&gt;TRUE&lt;/STRONG&gt;: proceed to extract the abbreviation.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 2 — First &lt;A href="https://help.graphisoft.com/AC/29/INT/_AC29_Help/061_ExpressionFunctions/061_ExpressionFunctions-66.htm" target="_blank" rel="noopener"&gt;SPLIT&lt;/A&gt;: isolate everything to the right of the key&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;SPLIT ( {Project Info string}; CONCAT ( {Zone Name}; ": " ); 2 )&lt;/LI-CODE&gt;
&lt;P&gt;Splits the full string at &lt;STRONG&gt;"Zone Name: " &lt;/STRONG&gt;(using&amp;nbsp;&lt;A href="https://help.graphisoft.com/AC/29/INT/_AC29_Help/061_ExpressionFunctions/061_ExpressionFunctions-56.htm#XREF_26627_CONCAT" target="_blank" rel="noopener"&gt;CONCAT&lt;/A&gt;&amp;nbsp;to add the &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt; and returns &lt;STRONG&gt;part 2&lt;/STRONG&gt; (everything after the key).&lt;BR /&gt;Example: from &lt;EM&gt;"Sanitary: SAN.!!&amp;nbsp;Bedroom A: BED.!!"&lt;/EM&gt; → &lt;EM&gt;"SAN.!!&amp;nbsp;Bedroom A: BED.!!"&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 3 — Second &lt;A href="https://help.graphisoft.com/AC/29/INT/_AC29_Help/061_ExpressionFunctions/061_ExpressionFunctions-66.htm" target="_blank" rel="noopener"&gt;SPLIT&lt;/A&gt;: cut off at the&lt;/STRONG&gt; !! &lt;STRONG&gt;delimiter&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;SPLIT ( [result of step 2]; "!!"; 1 )&lt;/LI-CODE&gt;
&lt;P&gt;Splits at &lt;STRONG&gt;!!&lt;/STRONG&gt; and returns &lt;STRONG&gt;part 1&lt;/STRONG&gt; (everything before the first &lt;STRONG&gt;!!&lt;/STRONG&gt;).&lt;BR /&gt;Example: &lt;EM&gt;"SAN.!!&amp;nbsp;Bedroom A: BED.!!"&lt;/EM&gt; → &lt;EM&gt;"SAN."&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;That's the abbreviation — clean and ready to use.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;— Why this approach is us&lt;/FONT&gt;&lt;FONT size="4"&gt;eful —&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;The lookup table lives in &lt;STRONG&gt;Project Info&lt;/STRONG&gt;, not buried in an expression. Any team member can update it.&lt;/LI&gt;
&lt;LI&gt;Only one thing to reserve, works even with modules.&lt;/LI&gt;
&lt;LI&gt;The expression itself never needs to change when you add new entries.&lt;/LI&gt;
&lt;LI&gt;The same logic works for any key→value substitution: room type codes, material abbreviations, etc.&lt;/LI&gt;
&lt;LI&gt;The &lt;STRONG&gt;!!&lt;/STRONG&gt; delimiter is visually distinctive and unlikely to appear in real room names (You can change the delimiter if you want).&lt;/LI&gt;
&lt;LI&gt;You can go to a new line between entries for readability — it doesn't affect parsing.&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The more complex variant (checking whether a zone's area falls within a min/max range per typology) follows exactly the same logic — I'll post that separately if there's interest.&lt;/P&gt;
&lt;P&gt;Hope this helps!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier" color="grey"&gt;Operating system used: &lt;EM&gt;Mac Apple Silicon &lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;</description>
    <pubDate>Tue, 02 Jun 2026 12:40:52 GMT</pubDate>
    <dc:creator>Mathias Jonathan</dc:creator>
    <dc:date>2026-06-02T12:40:52Z</dc:date>
    <item>
      <title>Using Project Info as an editable lookup table — a practical example</title>
      <link>https://community.graphisoft.com/t5/Project-data-BIM/Using-Project-Info-as-an-editable-lookup-table-a-practical/m-p/704209#M15630</link>
      <description>&lt;P&gt;Hi everyone,&lt;/P&gt;
&lt;P&gt;Here's a technique I've been thinking about for a while: using the &lt;STRONG&gt;Project Information&lt;/STRONG&gt; fields as a lightweight, human-readable database that any team member can update without touching the property expressions themselves.&lt;/P&gt;
&lt;P&gt;The idea is simple: you store your lookup data as a plain text string in a Project Info property, using a consistent separator (here: &lt;STRONG&gt;!!&lt;/STRONG&gt;) to mark the end of each value. Then, property expressions parse that string on the fly.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;— The technique, step by step —&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;FONT size="4"&gt;&lt;EM&gt;1. Store your data in Project Info&lt;/EM&gt;&lt;/FONT&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Create a Project Info property (e.g. &lt;EM&gt;ABBREVIATION - DO NOT MODIFY&lt;/EM&gt;) and fill it like this:&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;Sanitary: SAN.!!
Bedroom A: BED.!!&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Each line follows the pattern: &lt;EM&gt;Key: Value!!&lt;/EM&gt;&lt;BR /&gt;The &lt;STRONG&gt;!!&lt;/STRONG&gt; acts as a right-hand delimiter. The newline is optional but helps readability — ArchiCAD ignores it in expressions.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;U&gt;2. The expression&lt;/U&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This expression reads the Zone Name and returns its abbreviation if one exists, or falls back to the original name (I made the expression in the rench version of archicad, Zone/ Nom de Zone is the french version of room name):&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;IF (CONTAINS (CONCAT ( {Property:Zone/Nom de Zone}; ": " );{Property:ProjectInfoPropertyDefinitionGroup/ABREVIATION-DO NOT MODIFY}
);SPLIT (SPLIT ({Property:ProjectInfoPropertyDefinitionGroup/ABREVIATION-DO NOT MODIFY};
CONCAT ( STR ( {Property:Zone/Nom de Zone} ); ": " );2);"!!";1);{Property:Zone/Nom de Zone}
)&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;U&gt;3. What the expression does — step by step&lt;/U&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 1 — &lt;A href="https://help.graphisoft.com/AC/29/INT/_AC29_Help/061_ExpressionFunctions/061_ExpressionFunctions-57.htm#XREF_90889_Contains_CONTAINS" target="_blank" rel="noopener"&gt;CONTAINS&lt;/A&gt;&amp;nbsp;: does a match exist?&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;CONTAINS (
CONCAT ( {Zone Name}; ": " );{Project Info string}
)&lt;/LI-CODE&gt;
&lt;P&gt;&lt;BR /&gt;Checks whether the &lt;U&gt;Zone Name followed by &lt;STRONG&gt;:&lt;/STRONG&gt;&lt;/U&gt;&amp;nbsp; appears anywhere in the Project Info string.&lt;BR /&gt;→ If &lt;STRONG&gt;FALSE&lt;/STRONG&gt;: the zone has no abbreviation → return the Zone Name as-is (the last argument of IF).&lt;BR /&gt;→ If &lt;STRONG&gt;TRUE&lt;/STRONG&gt;: proceed to extract the abbreviation.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 2 — First &lt;A href="https://help.graphisoft.com/AC/29/INT/_AC29_Help/061_ExpressionFunctions/061_ExpressionFunctions-66.htm" target="_blank" rel="noopener"&gt;SPLIT&lt;/A&gt;: isolate everything to the right of the key&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;SPLIT ( {Project Info string}; CONCAT ( {Zone Name}; ": " ); 2 )&lt;/LI-CODE&gt;
&lt;P&gt;Splits the full string at &lt;STRONG&gt;"Zone Name: " &lt;/STRONG&gt;(using&amp;nbsp;&lt;A href="https://help.graphisoft.com/AC/29/INT/_AC29_Help/061_ExpressionFunctions/061_ExpressionFunctions-56.htm#XREF_26627_CONCAT" target="_blank" rel="noopener"&gt;CONCAT&lt;/A&gt;&amp;nbsp;to add the &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt; and returns &lt;STRONG&gt;part 2&lt;/STRONG&gt; (everything after the key).&lt;BR /&gt;Example: from &lt;EM&gt;"Sanitary: SAN.!!&amp;nbsp;Bedroom A: BED.!!"&lt;/EM&gt; → &lt;EM&gt;"SAN.!!&amp;nbsp;Bedroom A: BED.!!"&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 3 — Second &lt;A href="https://help.graphisoft.com/AC/29/INT/_AC29_Help/061_ExpressionFunctions/061_ExpressionFunctions-66.htm" target="_blank" rel="noopener"&gt;SPLIT&lt;/A&gt;: cut off at the&lt;/STRONG&gt; !! &lt;STRONG&gt;delimiter&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;SPLIT ( [result of step 2]; "!!"; 1 )&lt;/LI-CODE&gt;
&lt;P&gt;Splits at &lt;STRONG&gt;!!&lt;/STRONG&gt; and returns &lt;STRONG&gt;part 1&lt;/STRONG&gt; (everything before the first &lt;STRONG&gt;!!&lt;/STRONG&gt;).&lt;BR /&gt;Example: &lt;EM&gt;"SAN.!!&amp;nbsp;Bedroom A: BED.!!"&lt;/EM&gt; → &lt;EM&gt;"SAN."&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;That's the abbreviation — clean and ready to use.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;— Why this approach is us&lt;/FONT&gt;&lt;FONT size="4"&gt;eful —&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;The lookup table lives in &lt;STRONG&gt;Project Info&lt;/STRONG&gt;, not buried in an expression. Any team member can update it.&lt;/LI&gt;
&lt;LI&gt;Only one thing to reserve, works even with modules.&lt;/LI&gt;
&lt;LI&gt;The expression itself never needs to change when you add new entries.&lt;/LI&gt;
&lt;LI&gt;The same logic works for any key→value substitution: room type codes, material abbreviations, etc.&lt;/LI&gt;
&lt;LI&gt;The &lt;STRONG&gt;!!&lt;/STRONG&gt; delimiter is visually distinctive and unlikely to appear in real room names (You can change the delimiter if you want).&lt;/LI&gt;
&lt;LI&gt;You can go to a new line between entries for readability — it doesn't affect parsing.&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The more complex variant (checking whether a zone's area falls within a min/max range per typology) follows exactly the same logic — I'll post that separately if there's interest.&lt;/P&gt;
&lt;P&gt;Hope this helps!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier" color="grey"&gt;Operating system used: &lt;EM&gt;Mac Apple Silicon &lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Jun 2026 12:40:52 GMT</pubDate>
      <guid>https://community.graphisoft.com/t5/Project-data-BIM/Using-Project-Info-as-an-editable-lookup-table-a-practical/m-p/704209#M15630</guid>
      <dc:creator>Mathias Jonathan</dc:creator>
      <dc:date>2026-06-02T12:40:52Z</dc:date>
    </item>
  </channel>
</rss>

