<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Rob Siegwart</title><link href="https://www.robsiegwart.com/" rel="alternate"/><link href="https://www.robsiegwart.com/feeds/all.atom.xml" rel="self"/><id>https://www.robsiegwart.com/</id><updated>2026-07-12T00:00:00-05:00</updated><entry><title>World Cup Teams by Club Composition</title><link href="https://www.robsiegwart.com/world-cup-teams-by-club-composition.html" rel="alternate"/><published>2026-07-12T00:00:00-05:00</published><updated>2026-07-12T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2026-07-12:/world-cup-teams-by-club-composition.html</id><summary type="html">&lt;p class="first last"&gt;Analyzing club concentration and domestic retention across 2026 World Cup
rosters.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A recent World Cup conversation got me thinking about how national teams at the
2026 World Cup differ in their club composition, that is, the club teams that
supply the players on their roster.&lt;/p&gt;
&lt;p&gt;My initial hunch was that teams drawing more from one or two clubs (for example,
Spain utilizing Barcelona players) might fare better due to pre-existing player
familiarity. Of course, that logic depends on the quality of that club — the
national team would only be as good as the club team it drew from. To test this,
team quality variances would have to be normalized.&lt;/p&gt;
&lt;p&gt;Nevertheless, out of curiosity I pulled the rosters for the 2026 World Cup &lt;a class="reference external" href="https://en.wikipedia.org/wiki/2026_FIFA_World_Cup_squads"&gt;as
posted on Wikipedia&lt;/a&gt;
and created some derivative charts and statistics:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#club-concentration-metrics"&gt;Club Concentration Metrics&lt;/a&gt; (Table)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#club-concentration-by-national-team"&gt;Club Concentration by National Team&lt;/a&gt; (Graph)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#top-feeder-leagues"&gt;Top Feeder Leagues&lt;/a&gt; (Graph)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#club-count-distribution"&gt;Club Count Distribution&lt;/a&gt; (Graph)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#top-feeder-clubs-by-player-count"&gt;Top Feeder Clubs by Player Count&lt;/a&gt; (Graph)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;HHI is a metric used here and refers to the &amp;quot;Herfindahl-Hirschman Index&amp;quot; which
is calculated by squaring the share of players for each club and then summing.
Squaring makes dominant clubs push the index up faster. For example,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A squad split 10/6/4/3/2/1 across six clubs gives:&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;(10/26)² + (6/26)² + (4/26)² + (3/26)² + (2/26)² + (1/26)² ≈ 0.246&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="section" id="takeaways"&gt;
&lt;h2&gt;Takeaways&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;Talent supply is heavily concentrated at the top.&lt;/strong&gt; The big 5 leagues (the
top leagues of England, Germany, Spain, France, and Italy) account for roughly
39% of all players. At the club level, Manchester City, Bayern Munich, PSG,
Arsenal, and Barcelona lead the way above a long list of other feeder clubs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Most rosters are patchwork&lt;/strong&gt;, where the median national team draws from 22
distinct club teams for the 26 players.&lt;ul&gt;
&lt;li&gt;Two teams, Sweden and Cape Verde, have no shared club teams among the
players: they each have exactly 26 club teams. The United States is not far
behind with 24.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High HHI nations&lt;/strong&gt; like Saudia Arabia and Qatar have a closed-pool effect,
where 90% of the players play in their own domestic league which causes the
pool to draw from to be smaller.&lt;ul&gt;
&lt;li&gt;The highest HHI European nation is Spain, followed by Germany.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domestic retention and concentration are correlated across all squads
(r=0.83).&lt;/strong&gt; Teams that keep more players at home do tend to be more
club-concentrated because a domestic league is a far smaller pool of clubs to
draw from. Spain is an outlier as its league has horizontal breadth -- six
different La Liga clubs feed Spain's national team.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The chemistry hypothesis is inconclusive&lt;/strong&gt;, but is not &amp;quot;no effect.&amp;quot; No trend
across group stage → semifinals, but with N=4 in the two most advanced buckets
and zero control for squad quality, this data can't distinguish &amp;quot;no effect&amp;quot;
from &amp;quot;too noisy to tell.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="club-concentration-metrics"&gt;
&lt;h2&gt;Club Concentration Metrics&lt;/h2&gt;
&lt;p&gt;In this table:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Top % = percentage of players from the top club&lt;/li&gt;
&lt;li&gt;Top-2 % = percentage of players from the top two clubs&lt;/li&gt;
&lt;li&gt;HHI = Herfindahl-Hirschman Index&lt;/li&gt;
&lt;li&gt;Effective clubs = &lt;cite&gt;1/HHI&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;Domestic % = percentage of players who play for a club team in their own nation&lt;/li&gt;
&lt;/ul&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="20%" /&gt;
&lt;col width="13%" /&gt;
&lt;col width="28%" /&gt;
&lt;col width="5%" /&gt;
&lt;col width="6%" /&gt;
&lt;col width="5%" /&gt;
&lt;col width="14%" /&gt;
&lt;col width="9%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Country&lt;/th&gt;
&lt;th class="head"&gt;Distinct Clubs&lt;/th&gt;
&lt;th class="head"&gt;Top Club&lt;/th&gt;
&lt;th class="head"&gt;Top %&lt;/th&gt;
&lt;th class="head"&gt;Top-2 %&lt;/th&gt;
&lt;th class="head"&gt;HHI&lt;/th&gt;
&lt;th class="head"&gt;Effective Clubs&lt;/th&gt;
&lt;th class="head"&gt;Domestic %&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;South Africa&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Mamelodi Sundowns&lt;/td&gt;
&lt;td&gt;30.8%&lt;/td&gt;
&lt;td&gt;61.5%&lt;/td&gt;
&lt;td&gt;0.2041&lt;/td&gt;
&lt;td&gt;4.9&lt;/td&gt;
&lt;td&gt;73.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Czech Republic&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Slavia Prague&lt;/td&gt;
&lt;td&gt;38.5%&lt;/td&gt;
&lt;td&gt;50.0%&lt;/td&gt;
&lt;td&gt;0.1982&lt;/td&gt;
&lt;td&gt;5.04&lt;/td&gt;
&lt;td&gt;65.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Saudi Arabia&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Al-Hilal&lt;/td&gt;
&lt;td&gt;26.9%&lt;/td&gt;
&lt;td&gt;50.0%&lt;/td&gt;
&lt;td&gt;0.1746&lt;/td&gt;
&lt;td&gt;5.73&lt;/td&gt;
&lt;td&gt;96.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Qatar&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Al-Duhail&lt;/td&gt;
&lt;td&gt;23.1%&lt;/td&gt;
&lt;td&gt;42.3%&lt;/td&gt;
&lt;td&gt;0.1568&lt;/td&gt;
&lt;td&gt;6.38&lt;/td&gt;
&lt;td&gt;96.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Spain&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Barcelona&lt;/td&gt;
&lt;td&gt;30.8%&lt;/td&gt;
&lt;td&gt;42.3%&lt;/td&gt;
&lt;td&gt;0.1479&lt;/td&gt;
&lt;td&gt;6.76&lt;/td&gt;
&lt;td&gt;65.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Egypt&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Al Ahly&lt;/td&gt;
&lt;td&gt;30.8%&lt;/td&gt;
&lt;td&gt;42.3%&lt;/td&gt;
&lt;td&gt;0.142&lt;/td&gt;
&lt;td&gt;7.04&lt;/td&gt;
&lt;td&gt;65.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Turkey&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Fenerbahçe&lt;/td&gt;
&lt;td&gt;23.1%&lt;/td&gt;
&lt;td&gt;46.2%&lt;/td&gt;
&lt;td&gt;0.1272&lt;/td&gt;
&lt;td&gt;7.86&lt;/td&gt;
&lt;td&gt;57.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Bayern Munich&lt;/td&gt;
&lt;td&gt;23.1%&lt;/td&gt;
&lt;td&gt;38.5%&lt;/td&gt;
&lt;td&gt;0.1243&lt;/td&gt;
&lt;td&gt;8.05&lt;/td&gt;
&lt;td&gt;73.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Jordan&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Al-Hussein&lt;/td&gt;
&lt;td&gt;26.9%&lt;/td&gt;
&lt;td&gt;38.5%&lt;/td&gt;
&lt;td&gt;0.1213&lt;/td&gt;
&lt;td&gt;8.24&lt;/td&gt;
&lt;td&gt;46.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Iran&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Tractor&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;30.8%&lt;/td&gt;
&lt;td&gt;0.0976&lt;/td&gt;
&lt;td&gt;10.24&lt;/td&gt;
&lt;td&gt;65.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;New Zealand&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;Auckland FC&lt;/td&gt;
&lt;td&gt;23.1%&lt;/td&gt;
&lt;td&gt;34.6%&lt;/td&gt;
&lt;td&gt;0.0917&lt;/td&gt;
&lt;td&gt;10.9&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Argentina&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;Atlético Madrid&lt;/td&gt;
&lt;td&gt;23.1%&lt;/td&gt;
&lt;td&gt;30.8%&lt;/td&gt;
&lt;td&gt;0.0888&lt;/td&gt;
&lt;td&gt;11.27&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;England&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Manchester City&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;30.8%&lt;/td&gt;
&lt;td&gt;0.0888&lt;/td&gt;
&lt;td&gt;11.27&lt;/td&gt;
&lt;td&gt;80.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;France&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;Paris Saint-Germain&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;td&gt;26.9%&lt;/td&gt;
&lt;td&gt;0.0799&lt;/td&gt;
&lt;td&gt;12.52&lt;/td&gt;
&lt;td&gt;30.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Portugal&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;Paris Saint-Germain&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;26.9%&lt;/td&gt;
&lt;td&gt;0.0799&lt;/td&gt;
&lt;td&gt;12.52&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Uzbekistan&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Pakhtakor&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;23.1%&lt;/td&gt;
&lt;td&gt;0.0769&lt;/td&gt;
&lt;td&gt;13.0&lt;/td&gt;
&lt;td&gt;61.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Mexico&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;Guadalajara&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;td&gt;26.9%&lt;/td&gt;
&lt;td&gt;0.071&lt;/td&gt;
&lt;td&gt;14.08&lt;/td&gt;
&lt;td&gt;46.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Belgium&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;Club Brugge&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;23.1%&lt;/td&gt;
&lt;td&gt;0.068&lt;/td&gt;
&lt;td&gt;14.7&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Netherlands&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;Brighton &amp;amp; Hove Albion&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;23.1%&lt;/td&gt;
&lt;td&gt;0.068&lt;/td&gt;
&lt;td&gt;14.7&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Brazil&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Flamengo&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;23.1%&lt;/td&gt;
&lt;td&gt;0.0651&lt;/td&gt;
&lt;td&gt;15.36&lt;/td&gt;
&lt;td&gt;26.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Iraq&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Al-Talaba&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;23.1%&lt;/td&gt;
&lt;td&gt;0.0621&lt;/td&gt;
&lt;td&gt;16.1&lt;/td&gt;
&lt;td&gt;38.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Australia&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Melbourne City&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;td&gt;0.0533&lt;/td&gt;
&lt;td&gt;18.78&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Canada&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Los Angeles FC&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;td&gt;0.0533&lt;/td&gt;
&lt;td&gt;18.78&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Norway&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Bodø/Glimt&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;td&gt;0.0533&lt;/td&gt;
&lt;td&gt;18.78&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Paraguay&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Palmeiras&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;td&gt;0.0533&lt;/td&gt;
&lt;td&gt;18.78&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;South Korea&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Jeonbuk Hyundai Motors&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;td&gt;0.0533&lt;/td&gt;
&lt;td&gt;18.78&lt;/td&gt;
&lt;td&gt;26.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Uruguay&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Flamengo&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;td&gt;0.0533&lt;/td&gt;
&lt;td&gt;18.78&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Austria&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;RB Leipzig&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0503&lt;/td&gt;
&lt;td&gt;19.88&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Curaçao&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Miami FC&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0503&lt;/td&gt;
&lt;td&gt;19.88&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Ecuador&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;Atlético Mineiro&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;td&gt;0.0503&lt;/td&gt;
&lt;td&gt;19.88&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Ghana&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;Auxerre&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;td&gt;0.0503&lt;/td&gt;
&lt;td&gt;19.88&lt;/td&gt;
&lt;td&gt;3.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Scotland&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Celtic&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0503&lt;/td&gt;
&lt;td&gt;19.88&lt;/td&gt;
&lt;td&gt;30.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Senegal&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Nice&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0503&lt;/td&gt;
&lt;td&gt;19.88&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Japan&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;Sint-Truiden&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0473&lt;/td&gt;
&lt;td&gt;21.12&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Panama&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;Saprissa&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0473&lt;/td&gt;
&lt;td&gt;21.12&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Algeria&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;Lille&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0444&lt;/td&gt;
&lt;td&gt;22.53&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Bosnia and Herzegovina&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;Schalke 04&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0444&lt;/td&gt;
&lt;td&gt;22.53&lt;/td&gt;
&lt;td&gt;3.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Colombia&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;Crystal Palace&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0444&lt;/td&gt;
&lt;td&gt;22.53&lt;/td&gt;
&lt;td&gt;3.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Croatia&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;Manchester City&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0444&lt;/td&gt;
&lt;td&gt;22.53&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;DR Congo&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;AEL&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0444&lt;/td&gt;
&lt;td&gt;22.53&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Morocco&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;PSV Eindhoven&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0444&lt;/td&gt;
&lt;td&gt;22.53&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Switzerland&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;Sevilla&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0444&lt;/td&gt;
&lt;td&gt;22.53&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Tunisia&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;Club Africain&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0444&lt;/td&gt;
&lt;td&gt;22.53&lt;/td&gt;
&lt;td&gt;23.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;United States&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;PSV Eindhoven&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;0.0444&lt;/td&gt;
&lt;td&gt;22.53&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Haiti&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;Colorado Springs Switchbacks FC&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;0.0414&lt;/td&gt;
&lt;td&gt;24.14&lt;/td&gt;
&lt;td&gt;3.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Ivory Coast&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;Charleroi&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;0.0414&lt;/td&gt;
&lt;td&gt;24.14&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Cape Verde&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;Chaves&lt;/td&gt;
&lt;td&gt;3.8%&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;0.0385&lt;/td&gt;
&lt;td&gt;26.0&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Sweden&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;Derby County&lt;/td&gt;
&lt;td&gt;3.8%&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;td&gt;0.0385&lt;/td&gt;
&lt;td&gt;26.0&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="tournament-results-metrics"&gt;
&lt;h2&gt;Tournament Results Metrics&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;As of 7/12/26 ~ Semi-finals stage&lt;/em&gt;&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="45%" /&gt;
&lt;col width="18%" /&gt;
&lt;col width="36%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Stage&lt;/th&gt;
&lt;th class="head"&gt;N&lt;/th&gt;
&lt;th class="head"&gt;Mean HHI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Group Stage&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;0.090&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Round of 32&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;0.062&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Round of 16&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;0.069&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Quarterfinal&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0.053&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Semifinalist&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0.101&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Squad concentration shows no clean relationship with how far a team advanced —
the four semifinalists were actually the most club-concentrated group on
average, but with just four teams in that bucket and no control for underlying
squad quality, that's not evidence of anything either way.&lt;/p&gt;
&lt;script src="https://robsiegwart.nyc3.digitaloceanspaces.com/data/world-cup-2026/chart.umd.min.js"&gt;&lt;/script&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/chartjs-chart-matrix@1.1"&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div class="section" id="club-concentration-by-national-team"&gt;
&lt;h2&gt;Club Concentration by National Team&lt;/h2&gt;
&lt;p&gt;Boxes represent distinct club teams and the darker ones contribute more players
than lighter ones.&lt;/p&gt;
&lt;figure class="chart-card"&gt;
    &lt;div style="overflow-x: auto;"&gt;
        &lt;div style="position: relative; height: 980px; min-width: 680px;"&gt;
        &lt;canvas id="concentration-heatmap-chart"&gt;&lt;/canvas&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;figcaption style="text-align: center; font-size: 12.5px; color: #666; margin-top: 6px;"&gt;Club rank within squad (1st = most-represented club)&lt;/figcaption&gt;
    &lt;div style="display: flex; align-items: center; justify-content: center; gap: 10px; margin-top: 12px;"&gt;
        &lt;span id="concentration-heatmap-legend-min"&gt;&lt;/span&gt;
        &lt;div style="width: 220px; height: 10px; border-radius: 5px;
                    background: linear-gradient(to right, #cde2fb, #6da7ec, #2a78d6, #184f95, #0d366b);"&gt;&lt;/div&gt;
        &lt;span id="concentration-heatmap-legend-max"&gt;&lt;/span&gt;
    &lt;/div&gt;
&lt;/figure&gt;

&lt;script src="https://robsiegwart.nyc3.digitaloceanspaces.com/data/world-cup-2026/concentration-heatmap-data.js"&gt;&lt;/script&gt;
&lt;script src="https://robsiegwart.nyc3.digitaloceanspaces.com/data/world-cup-2026/concentration-heatmap-chart.js"&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div class="section" id="top-feeder-leagues"&gt;
&lt;h2&gt;Top Feeder Leagues&lt;/h2&gt;
&lt;figure class="chart-card"&gt;
    &lt;div style="position: relative; height: 620px;"&gt;
        &lt;canvas id="feeder-leagues-chart"&gt;&lt;/canvas&gt;
    &lt;/div&gt;
    &lt;figcaption style="text-align: center; font-size: 12.5px; color: #666; margin-top: 6px;"&gt;Total players at the 2026 World Cup, by domestic league&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;script src="https://robsiegwart.nyc3.digitaloceanspaces.com/data/world-cup-2026/feeder-leagues-data.js"&gt;&lt;/script&gt;
&lt;script src="https://robsiegwart.nyc3.digitaloceanspaces.com/data/world-cup-2026/feeder-leagues-chart.js"&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div class="section" id="club-count-distribution"&gt;
&lt;h2&gt;Club Count Distribution&lt;/h2&gt;
&lt;figure class="chart-card"&gt;
    &lt;div style="position: relative; height: 460px;"&gt;
        &lt;canvas id="club-count-distribution-chart"&gt;&lt;/canvas&gt;
    &lt;/div&gt;
    &lt;figcaption style="text-align: center; font-size: 12.5px; color: #666; margin-top: 6px;"&gt;
        Distinct clubs represented in the 26-man squad
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;script src="https://robsiegwart.nyc3.digitaloceanspaces.com/data/world-cup-2026/club-count-distribution-data.js"&gt;&lt;/script&gt;
&lt;script src="https://robsiegwart.nyc3.digitaloceanspaces.com/data/world-cup-2026/club-count-distribution-chart.js"&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div class="section" id="top-feeder-clubs-by-player-count"&gt;
&lt;h2&gt;Top Feeder Clubs by Player Count&lt;/h2&gt;
&lt;figure class="chart-card" style="margin: 0;"&gt;
    &lt;div style="position: relative; height: 620px;"&gt;
        &lt;canvas id="feeder-clubs-by-players-chart"&gt;&lt;/canvas&gt;
    &lt;/div&gt;
    &lt;figcaption style="text-align: center; font-size: 12.5px; color: #666; margin-top: 6px;"&gt;
        Total players at the 2026 World Cup
    &lt;/figcaption&gt;
&lt;/figure&gt;


&lt;script src="https://robsiegwart.nyc3.digitaloceanspaces.com/data/world-cup-2026/feeder-clubs-by-players-data.js"&gt;&lt;/script&gt;
&lt;script src="https://robsiegwart.nyc3.digitaloceanspaces.com/data/world-cup-2026/feeder-clubs-by-players-chart.js"&gt;&lt;/script&gt;&lt;/div&gt;
</content><category term="Misc"/><category term="world cup"/></entry><entry><title>The Matrix, the Fall, and Our Addiction to Struggle</title><link href="https://www.robsiegwart.com/the-matrix-the-fall-and-our-addiction-to-struggle.html" rel="alternate"/><published>2025-07-23T00:00:00-05:00</published><updated>2025-07-23T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2025-07-23:/the-matrix-the-fall-and-our-addiction-to-struggle.html</id><summary type="html">&lt;p class="first last"&gt;This post explores The Matrix, our addiction to struggle, Gnostic soul trap
theory, and how Christ's suffering offers not another loop, but a true
escape.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I recently re-watched the 1999 movie The Matrix, one of my favorite movies. It's
rich with themes related to Gnosticism, soul trap theories, the nature of
reality, and the tension between fate and free will.&lt;/p&gt;
&lt;p&gt;In the scene where Morpheus is captured and interrogated, Agent Smith reveals
something interesting about previous versions of the Matrix. He states:&lt;/p&gt;
&lt;blockquote&gt;
“The first Matrix was designed to be a prefect human world. Where none
suffered. Where everyone would be happy.”&lt;/blockquote&gt;
&lt;p&gt;But it was a failure, and no one would accept it. In other words, they
&lt;strong&gt;rejected paradise.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This reminded me immediately of the &lt;strong&gt;Garden of Eden&lt;/strong&gt;. Before the Fall, Eden
was a perfect world designed by God. Yet humanity still chose the Tree of
Knowledge of Good and Evil. Not for food or power, but to &lt;strong&gt;know good and
evil&lt;/strong&gt;, and to experience &lt;strong&gt;contrast&lt;/strong&gt;, to &lt;em&gt;suffer and understand&lt;/em&gt;.&lt;/p&gt;
&lt;div class="section" id="human-nature"&gt;
&lt;h2&gt;Human Nature&lt;/h2&gt;
&lt;p&gt;This raises deeper questions about the nature of ourselves:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why do we seem to crave drama and suffering?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Or at the very least, why do we seek it out, over and over?&lt;/p&gt;
&lt;p&gt;We …&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;watch reality TV — human chaos as entertainment&lt;/li&gt;
&lt;li&gt;binge on horror films and tragedies&lt;/li&gt;
&lt;li&gt;gravitate towards war stories, survival games&lt;/li&gt;
&lt;li&gt;get entangled in toxic relationships&lt;/li&gt;
&lt;li&gt;watch the news which thrives on fear and shock&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It seems we &lt;em&gt;need&lt;/em&gt; there to be stakes. Without stakes, things are meaningless.
And in the absence of &lt;strong&gt;real stakes&lt;/strong&gt;, we manufacture simulated ones. Because
deep down, we equate &lt;em&gt;meaning&lt;/em&gt; with &lt;em&gt;adversity&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
    No resistance = no story.&lt;br&gt;
    No story = no self.
&lt;/blockquote&gt;&lt;p&gt;In the movie, Agent Smith says as much: &lt;strong&gt;that human beings are defined through
suffering&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;From a biological standpoint, we probably are wired for adversity. Our nervous
systems evolved under pressure: danger, famine, betrayal, hardship. And in
the absence of a real threat, we create surrogate ones: arguments, obsessions,
crises of meaning.&lt;/p&gt;
&lt;strong&gt;It's like we're wired for Eden &lt;em&gt;not&lt;/em&gt; to be enough.&lt;/strong&gt;&lt;/div&gt;
&lt;div class="section" id="gnostic-correlation"&gt;
&lt;h2&gt;Gnostic Correlation&lt;/h2&gt;
&lt;p&gt;From a Gnostic or soul-trap perspective, this hunger for struggle becomes a
mechanism of control. The Matrix (or world) is structured &lt;em&gt;intentionally&lt;/em&gt; around
struggle because it keeps you &lt;strong&gt;emotionally entangled&lt;/strong&gt;, &lt;strong&gt;energetically
drained&lt;/strong&gt;, and &lt;strong&gt;looping&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In that view, this drive for drama isn't noble, it's &lt;strong&gt;a trap&lt;/strong&gt;, a psychic
addiction.&lt;/p&gt;
&lt;p&gt;Soul trap theory often claims that after death, we're given a life review and
&lt;strong&gt;enticed to return&lt;/strong&gt;, either by guilt, emotional manipulation, or the illusion
of karmic debt. We ask for “another chance,” thinking we're progressing. But in
truth, we're just &lt;strong&gt;feeding the machine&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="a-christian-parallel"&gt;
&lt;h2&gt;A Christian Parallel&lt;/h2&gt;
&lt;p&gt;From a Christian point of view, this takes on even deeper weight.&lt;/p&gt;
&lt;p&gt;If we are indeed drawn to suffering, if humanity chose to fall, and if we are
cyclically trapped in systems of pain, then &lt;strong&gt;Christ's suffering&lt;/strong&gt; becomes
uniquely significant.&lt;/p&gt;
&lt;p&gt;He didn't just enter the loop, &lt;strong&gt;He broke it from within.&lt;/strong&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;He willingly endured suffering, not as drama or karmic payback, but as &lt;strong&gt;atonement&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;He chose the cross, not to validate our addiction to pain, but to &lt;strong&gt;redeem us from it&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;His resurrection wasn't a reset — it was &lt;strong&gt;a rupture&lt;/strong&gt; in the system. A path out.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So while &lt;em&gt;The Matrix&lt;/em&gt; may suggest the system thrives on suffering, Christianity
presents &lt;strong&gt;a suffering that redeems&lt;/strong&gt;, not entraps.&lt;/p&gt;
&lt;blockquote&gt;
    Christ didn't come to perpetuate the cycle.&lt;br&gt;
    He came to end it — by &lt;strong&gt;entering it fully, and then rising beyond it&lt;/strong&gt;.
&lt;/blockquote&gt;&lt;/div&gt;
</content><category term="Philosophy"/><category term="the matrix"/><category term="gnosticism"/><category term="christianity"/><category term="philosophy"/></entry><entry><title>Chess Is Life: Pattern Recognition as the Core Currency</title><link href="https://www.robsiegwart.com/chess-is-life-pattern-recognition.html" rel="alternate"/><published>2025-05-13T00:00:00-05:00</published><updated>2025-07-22T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2025-05-13:/chess-is-life-pattern-recognition.html</id><summary type="html">&lt;p class="first last"&gt;Pattern recognition is central to chess mastery, artificial intelligence,
and life. While chess patterns are domain-specific, the way we acquire them
reflects a deeper truth about how intelligence works.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The parallels between chess and life are quite astonishing. A recent AI chat
session sparked a realization: &lt;strong&gt;pattern recognition may be the most critical,
and perhaps fundamental, component of intelligence and agency&lt;/strong&gt; — our ability
to effectively navigate the world.&lt;/p&gt;
&lt;p&gt;Pattern recognition is central to chess mastery. Non-chess players might assume
that calculation and tactics dominate the game, and that grandmasters simply
calculate more deeply (which they do, of course). But in truth, what separates
them I believe is &lt;em&gt;pattern fluency&lt;/em&gt;. High-level players internalize thousands of
familiar structures, tactical motifs, and strategic imbalances. With enough
practice, a position on the board becomes not a puzzle to be solved, but a known
story, an echo of past experience.&lt;/p&gt;
&lt;p&gt;Just like in life. We don't gain fluency with the world through rules alone, but
through exposure. A young person might begin to navigate life independently
around the same age that chess prodigies reach mastery — the early to mid-teens.
Competence in both emerges not from memorization, but from immersion.&lt;/p&gt;
&lt;p&gt;Pattern recognition also lies at the heart of artificial intelligence. Language
models are not programmed with rules. Instead, they are trained on vast datasets
and learn by identifying statistical relationships. What appears to be
intelligent reasoning is, at its core, a remarkably sophisticated engine of
pattern prediction.&lt;/p&gt;
&lt;p&gt;This suggests something deeper: &lt;strong&gt;pattern recognition isn't just a tool — it's
the core currency of intelligence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The more patterns we can see, understand, and act upon, the more effective we
become in any environment.&lt;/p&gt;
&lt;p&gt;This also connects to creativity. One could define creativity as the ability to
connect seemingly unrelated ideas — another form of pattern recognition. In
fact, this article itself emerged from observing a pattern: the presence of
pattern recognition itself, across three domains: chess, AI, and human life.&lt;/p&gt;
&lt;p&gt;High-level chess players use a method called &lt;strong&gt;chunking&lt;/strong&gt;: processing
information in grouped structures instead of individual elements. Familiar
formations become perceptual units, allowing players to assess the board rapidly
and intuitively.&lt;/p&gt;
&lt;p&gt;This is the essence of intuition: subconscious pattern recognition operating
beneath the surface of conscious thought. And just like computers have GPUs for
fast parallel processing and CPUs for slower sequential tasks, the human mind
seems to split decision-making in similar ways. Our &amp;quot;GPU&amp;quot; intuition processes
large volumes of familiar input quickly, while our &amp;quot;CPU&amp;quot; logic works more
slowly and carefully.&lt;/p&gt;
&lt;p&gt;The same principle applies to language learning. A child doesn't begin by
learning grammar rules. They absorb patterns (sounds, rhythms, syntax) simply
through exposure. By age five, most children speak their native language
fluently, without ever studying its mechanics.&lt;/p&gt;
&lt;p&gt;So if you want to become more capable, more free — you don't need to memorize
more rules. You need to &lt;strong&gt;see more patterns&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Chess offers a compressed arena for developing a specific kind of pattern
recognition. In it we can see that the process of immersion, repetition, and
internalization helps the brain form intuitions and expertise more generally.
Mastery in chess doesn't make one universally insightful, but it does reveal
how deep familiarity with patterns enables high-level performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pattern recognition is what makes us agents, not just observers.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And in that sense, the more patterns we see, the more engaged we become with the
world.&lt;/p&gt;
</content><category term="Chess is Life"/><category term="chess"/><category term="philosophy"/></entry><entry><title>I Know This Steak Doesn't Exist</title><link href="https://www.robsiegwart.com/i-know-this-steak-doesnt-exist.html" rel="alternate"/><published>2025-05-13T00:00:00-05:00</published><updated>2025-05-13T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2025-05-13:/i-know-this-steak-doesnt-exist.html</id><summary type="html">&lt;p class="first last"&gt;A reflection on The Matrix's Cypher and the question of whether
choosing illusion over truth is really betrayal—or just human
nature. Ties in themes of spiritual escape, Christian belief, and
the biological drive for comfort.&lt;/p&gt;
</summary><content type="html">&lt;blockquote&gt;I know this steak doesn't exist. I know that when I put it in
my mouth, the Matrix is telling my brain that it is juicy and delicious.
After nine years, you know what I realize? Ignorance is bliss.
&lt;br&gt;
&lt;br&gt;
&amp;mdash;Cypher, The Matrix (1999)
&lt;/blockquote&gt;&lt;p&gt;This scene from the 1999 movie The Matrix came to mind when I was recently
pondering a hypothetical question. If you consider the idea that this world is a
trap or a prison—as proposed in systems like Gnosticism and perhaps certain
branches of Eastern philosophy or modern esotericism—then the central quest for
an individual becomes one of escape: how to get out of this trap, how to ascend,
and how to return to our origin or true home. But another angle came to mind:&lt;/p&gt;
&lt;blockquote&gt;
What if I like it here?&lt;/blockquote&gt;
&lt;p&gt;What if someone &lt;em&gt;knows&lt;/em&gt; this world's a prison planet, or there's a trap in the
afterlife—and still &lt;em&gt;chooses&lt;/em&gt; to stay, just like Cypher?&lt;/p&gt;
&lt;div class="section" id="christian-considerations"&gt;
&lt;h2&gt;Christian Considerations&lt;/h2&gt;
&lt;p&gt;The idea of the soul trap isn't explicitly taught or conveyed in traditional
Christian theology, though some scriptures hint at the experience of spiritual
deception, exile, or entrapment. For example, 2 Corinthians 4:4 speaks of “the
god of this world” blinding minds, and Ephesians 6:12 describes a battle not
against flesh and blood but against spiritual forces of evil in the heavenly
realms. Other passages, like Philippians 3:20 (“our citizenship is in heaven”)
and Hebrews 11:13-16 (describing life on earth as exile), suggest that our
current world is not the soul's final home.&lt;/p&gt;
&lt;p&gt;However, one core idea in Christian theology is the promise of ascending to
heaven after death. In this sense, the soul trap concept loosely parallels that
framework—it's still about escaping the present world. Modern Christianity often
emphasizes the afterlife: heaven or hell. Meanwhile, much of the theological
emphasis tends to treat our current existence in this fallen world as something
to simply endure—an unfortunate, tainted waiting room for a better, redeemed
reality to come.&lt;/p&gt;
&lt;p&gt;I've always found that imbalance a little strange. If we were made by God to
exist here on Earth, surely there's a purpose to this life beyond simply trying
to make it to heaven. Perhaps the Christian counterargument is that this was
true before the Fall. Still, the idea that our sole goal now is to escape Earth
and reach heaven seems overly reductive—maybe even contrary to the intrinsic
incarnational nature of Christian belief.&lt;/p&gt;
&lt;p&gt;The Bible does speak to the value of life here. For example, John 10:10 states,
&lt;em&gt;“My purpose is to give them a rich and satisfying life.”&lt;/em&gt; And in Ecclesiastes
3:12-13:&lt;/p&gt;
&lt;blockquote&gt;
“So I concluded there is nothing better than to be happy and enjoy ourselves
as long as we can. And people should eat and drink and enjoy the fruits of
their labor, for these are gifts from God.”&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="biological-code-and-the-drive-for-comfort"&gt;
&lt;h2&gt;Biological Code and the Drive for Comfort&lt;/h2&gt;
&lt;p&gt;Regardless of one's religious or philosophical worldview, it seems reasonable to
assume that whoever or whatever created this realm also created us—whether
through design or evolution—and embedded within us a kind of biological
software.&lt;/p&gt;
&lt;p&gt;That software is optimized to seek comfort, safety, self-preservation, and to
avoid pain and suffering.&lt;/p&gt;
&lt;p&gt;So if someone sees the Matrix (or this Earth plane) as their best shot at
pleasure, security, or meaning, they may very well choose it.&lt;/p&gt;
&lt;p&gt;Not because they're faulty in some way or they hate truth, but because the code
is working as designed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="awakening-is-a-bug"&gt;
&lt;h2&gt;Awakening Is a Bug&lt;/h2&gt;
&lt;p&gt;In this model, here's the twist:&lt;/p&gt;
&lt;blockquote&gt;
Awakening isn't a feature of the system. It's a bug.&lt;/blockquote&gt;
&lt;p&gt;The desire to break free from comfort, to reject the simulation, to embrace the
brutal uncertainty of the “real”, that's aberrant behavior. It's anti-code.&lt;/p&gt;
&lt;p&gt;If someone isn't experiencing comfort, safety, or meaning in this world, then
awakening or escape might feel like a genuine internal longing. But if one is
surrounded by relative pleasure and security, the desire to unplug becomes
unnatural—almost irrational.&lt;/p&gt;
&lt;blockquote&gt;
This suggests that spiritual awakening might not be a common evolutionary
outcome, but a rare deviation—an anomaly in the system.&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="cypher-s-logic"&gt;
&lt;h2&gt;Cypher's Logic&lt;/h2&gt;
&lt;p&gt;Cypher isn't just a villain. He's a mirror, albiet an uncomfortable one.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;He wants what most people want: pleasure, power, peace.&lt;/li&gt;
&lt;li&gt;He's self-aware enough to admit it.&lt;/li&gt;
&lt;li&gt;He chooses the illusion &lt;em&gt;knowingly&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because deep down, we are all presented with the question,&lt;/p&gt;
&lt;blockquote&gt;
If you could be happy, would you care that it's not real?&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="final-thought"&gt;
&lt;h2&gt;Final Thought&lt;/h2&gt;
&lt;p&gt;The choice between truth and illusion isn't as simple as red pill vs. blue pill.
It cuts down to the deepest layers of who we are and how we were made. Unless
we're willing to examine our programming, Cypher's logic might not be betrayal
at all.&lt;/p&gt;
&lt;p&gt;It might just be the system doing what it was designed to do.&lt;/p&gt;
&lt;p&gt;But maybe, something deeper inside of us is whispering:&lt;/p&gt;
&lt;blockquote&gt;
Comfort isn't enough.&lt;/blockquote&gt;
&lt;/div&gt;
</content><category term="Philosophy"/><category term="the matrix"/><category term="philosophy"/><category term="gnosticism"/></entry><entry><title>Chess is Life: Conflict</title><link href="https://www.robsiegwart.com/chess-is-life-conflict.html" rel="alternate"/><published>2025-04-27T00:00:00-05:00</published><updated>2025-05-13T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2025-04-27:/chess-is-life-conflict.html</id><summary type="html">&lt;p class="first last"&gt;The first in a series of posts about how chess is a model for life, on how the game relates to various aspects of conflict&lt;/p&gt;
</summary><content type="html">&lt;p&gt;In my experience playing chess over the last few years, I've come to see that
many of the game's motifs mirror aspects of life. And in this post I will
attempt to present some ideas that are related to conflict — whether between
individuals, groups, or even within ourselves.&lt;/p&gt;
&lt;p&gt;Chess is a confrontational game between you and your opponent. For these
analogies we will expand it to one vs many or many vs many as well, however in
each case it could be represented with two sides or groups.&lt;/p&gt;
&lt;p&gt;Below are some motifs and parallels I've noticed between the mechanics of chess
and the dynamics of conflict in the world we live in.&lt;/p&gt;
&lt;div class="section" id="motifs"&gt;
&lt;h2&gt;Motifs&lt;/h2&gt;
&lt;div class="section" id="defense-through-offense"&gt;
&lt;h3&gt;Defense through offense&lt;/h3&gt;
&lt;p&gt;There is a phrase, often used in sports, which is roughly, &amp;quot;the best defense is
a good offense.&amp;quot; In chess, that's true. You will find as much as possible, you
want to keep moving your pieces forward, into your opponents territory, rather
than backwards and into your own. This forces your opponent to spend
his moves defending — not attacking you — a double win.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="don-t-let-your-guard-down"&gt;
&lt;h3&gt;Don't let your guard down&lt;/h3&gt;
&lt;p&gt;When you get a good position, it's tempting to relax — this is a big mistake!
Never relax until the game is over. Focus and ruthlessness are required until
the conclusion. In chess the hardest position to win is often a winning
position.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="never-interfere-with-an-enemy-making-a-mistake"&gt;
&lt;h3&gt;Never interfere with an enemy making a mistake&lt;/h3&gt;
&lt;p&gt;There is an old quote, &lt;em&gt;Never interrupt your enemy when he is making a mistake&lt;/em&gt;.
In chess, this is also true. If your opponent is playing badly, don't get fancy.
Just develop, play solidly, and take advantage of his mistakes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="be-an-assassin"&gt;
&lt;h3&gt;Be an assassin&lt;/h3&gt;
&lt;p&gt;This one is less about strategy and more about mindset. Chess helps develop —
and rewards — what I call an assassin mindset, made of qualities like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;intense focus at the present task and initiative at hand&lt;/li&gt;
&lt;li&gt;having a singular goal&lt;/li&gt;
&lt;li&gt;ruthless efficiency: filtering your moves to only those that directly advance
you toward your goal&lt;ul&gt;
&lt;li&gt;In chess, moves that don't meet this standard are considered passive and can
cause you to lose tempo, letting your opponent seize the initiative.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;going for the kill shot: playing or taking those actions or
moves which have the most devastating impact (checkmate, or the setup for it)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="having-fun-law-of-attraction-vibes"&gt;
&lt;h3&gt;Having fun (Law of Attraction vibes)&lt;/h3&gt;
&lt;p&gt;In life, when you don't take it too seriously and have fun, you often get better
results. Same with chess: obsess over your rating, and you will play worse.
Relax and just enjoy the game — you'll see the board better and play stronger.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="others"&gt;
&lt;h3&gt;Others&lt;/h3&gt;
&lt;table border="1" class="docutils"&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Motif&lt;/th&gt;
&lt;th class="head"&gt;Chess&lt;/th&gt;
&lt;th class="head"&gt;Life&lt;/th&gt;
&lt;th class="head"&gt;&amp;nbsp;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Advance with support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developing your pieces into supported positions&lt;/td&gt;
&lt;td&gt;In soccer, advancing the ball up the field with team support&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Harmony, energy balance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pieces defend each other and are on good squares&lt;/td&gt;
&lt;td&gt;Musical harmony; balancing loads in a mechanical design&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tactics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Attack an opponent's piece to distract it from its defensive role&lt;/td&gt;
&lt;td&gt;In Muay Thai, a kick attack can be first set up with a low kick to the leg&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Kamakaze&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sacrifice a piece to open the position or attack the king. (Also, &lt;em&gt;desperado&lt;/em&gt; tactics — grabbing an enemy piece before inevitable capture.)&lt;/td&gt;
&lt;td&gt;A kamakaze attack in battle, such as in the movie Lord of the Rings: The Two Towers, the orc carries a bomb to the wall to break it down&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Resiliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Recovering from mistakes and maintaining a fighting spirit&lt;/td&gt;
&lt;td&gt;In sports, overcoming mistakes instead of letting them wreck your mindset&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Mind Games&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Intentionally put youself into a worse position, so that your opponent feels he has an advantage, and therefore might be tempted to lower his defences and play with complacency (not something you would do in an actual game but maybe in a casual game against a lower-rated player)&lt;/td&gt;
&lt;td&gt;The Mongols would lure enemies into pursuit with a small force, then ambush them with the main body of troops at a pre-arranged location&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In chess as in life, conflict is inevitable — and understanding its mechanics is
the beginning of mastery.&lt;/p&gt;
&lt;p&gt;But the board holds more lessons still: chaos, order, agency, resilience. The
game, and life, are far from over.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Chess is Life"/><category term="chess"/><category term="philosophy"/></entry><entry><title>FEA Basics and Development of a 2D Link Element</title><link href="https://www.robsiegwart.com/fea-basics-and-development-of-a-2d-link-element.html" rel="alternate"/><published>2021-06-17T00:00:00-05:00</published><updated>2022-04-10T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-06-17:/fea-basics-and-development-of-a-2d-link-element.html</id><summary type="html">&lt;p&gt;In my quest to learn more about the inner workings of the finite element method
and its programming implementation, I have started off attempting to program the
simplest of FEA models and analyses via the direct stiffness method. (Here is my
work so far on the topic of this article …&lt;/p&gt;</summary><content type="html">&lt;p&gt;In my quest to learn more about the inner workings of the finite element method
and its programming implementation, I have started off attempting to program the
simplest of FEA models and analyses via the direct stiffness method. (Here is my
work so far on the topic of this article - &lt;a class="reference external" href="https://github.com/robsiegwart/simpleFEA"&gt;simpleFEA&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;To that end, a 2D link or truss element is probably the simplest finite element
there is (maybe besides a point mass).&lt;/p&gt;
&lt;div class="section" id="concepts"&gt;
&lt;h2&gt;Concepts&lt;/h2&gt;
&lt;div class="section" id="big-picture"&gt;
&lt;h3&gt;Big Picture&lt;/h3&gt;
&lt;p&gt;The basics of a linear structural FEA is the stiffness equation:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\mathbf{F} = \mathbf{K}\mathbf{U}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;where &lt;span class="math"&gt;\(\mathbf{F}\)&lt;/span&gt; is the global force vector, &lt;span class="math"&gt;\(\mathbf{K}\)&lt;/span&gt; the global
stiffness matrix, and &lt;span class="math"&gt;\(\mathbf{U}\)&lt;/span&gt; the global displacement vector. The size of
this system (length of vector) is equal to the total number of nodal
degrees-of-freedom (DOF). The goal of the linear finite element program
therefore is to assemble and solve this system of equations.&lt;/p&gt;
&lt;p&gt;The matrix form of this equation represents the interrelation of the
connectivity of nodes by elements. If expanded, each row would contain only
those nodes that contribute to the force term of that row. And, a node typically
is only connected to a few elements and because there are usually a large number
of elements, this matrix contains many empty/zero entries. (This leads to the
concept of &lt;em&gt;sparse matrices&lt;/em&gt; which are specialized ways to store matrix data when
much of the matrix is empty.)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="coordinate-systems"&gt;
&lt;h2&gt;Coordinate Systems&lt;/h2&gt;
&lt;p&gt;All elements have the concept of a local coordinate system where they are
aligned in a convenient orientation for deriving equations. When assembled into
a finite element model, however, the element may be oriented in any orientation.
Thus, a process of &lt;em&gt;transformation&lt;/em&gt; is needed to transform the quantities involved
in the constituent equations, such as force and displacement, from the local
element system to the global coordinate system, and vice-versa. For that, we use
a transformation matrix. In a &lt;a class="reference external" href="https://robsiegwart.com/blog/change-of-basis-and-the-transformation-matrix/"&gt;previous post&lt;/a&gt;
I demonstrated the basic concept of a transformation matrix.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="truss-element"&gt;
&lt;h2&gt;Truss Element&lt;/h2&gt;
&lt;p&gt;The truss element is represented schematically and can be modeled as a spring:
it may only take tension or compression. Each node has two DOF, &lt;cite&gt;x&lt;/cite&gt; and &lt;cite&gt;y&lt;/cite&gt;. The
element coordinate system has its x-axis aligned with the element direction
vector going from node &lt;cite&gt;i&lt;/cite&gt; to node &lt;cite&gt;j&lt;/cite&gt;. Quantities with respect to the local
element coordinate system are indicated by the bar over the variable.&lt;/p&gt;
&lt;img alt="" class="img-250" id="d-truss-element" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/FEA/link2d-1.png" /&gt;
&lt;p&gt;It is considered a &lt;em&gt;discrete&lt;/em&gt; element as opposed to a &lt;em&gt;continuum&lt;/em&gt; element which has
its variables governed by differential equations.&lt;/p&gt;
&lt;p&gt;With the element having constant properties &lt;cite&gt;A&lt;/cite&gt; (area), &lt;cite&gt;E&lt;/cite&gt; (elastic modulus), and
an inferred length from the nodes, &lt;cite&gt;L&lt;/cite&gt;, the element stiffness in the axial
direction is:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
k = \frac{AE}{L}
\end{equation*}
&lt;/div&gt;
&lt;img alt="" class="img-250" id="d-link-force-equilibrium" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/FEA/link2d-2.png" /&gt;
&lt;p&gt;Since the element may only take tension or compression, elemental y axis forces
do not contribute to member stiffness. Thus, force equilibrium and
force-displacement relations become:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\bar{f} = k\Delta x = \frac{AE}{L} (\bar{u}_{x,j} - \bar{u}_{x,i})
\end{equation*}
&lt;/div&gt;
&lt;p&gt;where &lt;span class="math"&gt;\(\Delta x\)&lt;/span&gt; is the elongation of the bar, equal to &lt;span class="math"&gt;\(\bar{u}_{x,j} - \bar{u}_{x,i}\)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Then, force equilibrium requires:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
-\bar{f}_{x,i} = \bar{f}_{x,j}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;The &lt;em&gt;local&lt;/em&gt; element stiffness equations are then as follows:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
-\bar{f}_{x,i} = \frac{AE}{L} (\bar{u}_{x,j} - \bar{u}_{x,i}) \qquad
\text{or} \qquad \bar{f}_{x,i} = \frac{AE}{L} (- \bar{u}_{x,j} +
\bar{u}_{x,i})
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
\bar{f}_{x,j} = \frac{AE}{L} (\bar{u}_{x,j} - \bar{u}_{x,i})
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Which can be combined into matrix form, &lt;span class="math"&gt;\(\mathbf{\bar{F}} = \mathbf{\bar{K}}\mathbf{\bar{U}}\)&lt;/span&gt;:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\begin{bmatrix} \bar{f}_{x,i} \\ \bar{f}_{y,i}\\ \bar{f}_{x,j}\\
\bar{f}_{y,j} \end{bmatrix} = \frac{AE}{L} \begin{bmatrix} 1 &amp;amp; 0 &amp;amp; -1 &amp;amp; 0 \\ 0 &amp;amp;
0 &amp;amp; 0 &amp;amp; 0\\-1 &amp;amp; - &amp;amp; 1 &amp;amp; 0\\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0\end{bmatrix} \begin{bmatrix}
\bar{u}_{x,i} \\ \bar{u}_{y,i}\\ \bar{u}_{x,j}\\ \bar{u}_{y,j} \end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;The 4x4 matrix with the coefficient is the element stiffness matrix in the
element coordinate system, and for an individual element in the context of a
collection of elements is denoted as &lt;span class="math"&gt;\(\mathbf{\bar{K}}^e\)&lt;/span&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="transformation"&gt;
&lt;h2&gt;Transformation&lt;/h2&gt;
&lt;p&gt;Transformation is needed to convert element quantities in the local element
coordinate system to those in the global element coordinate system so they may
be appropriately combined into global stiffness equations. The position or
orientation of the element is defined by the nodal coordinates.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\mathbf{\bar{u}_{x,i}}
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
\mathbf{\bar{u}_{y,i}}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Displacement transformations may be inferred from graphical analysis.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\bar{u}_{x,i} = u_{x,i}\cos\theta + u_{y,i}\sin\theta
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
\bar{u}_{y,i} = -u_{x,i}\sin\theta + u_{y,i}\cos\theta
\end{equation*}
&lt;/div&gt;
&lt;img alt="" class="img-250" id="u-x-i" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/FEA/uxi%20transform.png" /&gt;
&lt;p&gt;The equations for node j are the same as for node i.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\bar{u}_{x,j} = u_{x,j}\cos\theta + u_{y,j}\sin\theta
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
\bar{u}_{y,j} = u_{x,j}\sin\theta + u_{y,j}\cos\theta
\end{equation*}
&lt;/div&gt;
&lt;img alt="" class="img-250" id="u-y-i" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/FEA/uyi%20transform.png" /&gt;
&lt;p&gt;Putting all 4 equations into matrix form, and with the helpers of
&lt;span class="math"&gt;\(c=\cos\theta\)&lt;/span&gt; and &lt;span class="math"&gt;\(s=\sin\theta\)&lt;/span&gt;, we have:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\begin{bmatrix}\bar{u}_{x,i} \\ \bar{u}_{y,i} \\ \bar{u}_{x,j} \\
\bar{u}_{y,j}\end{bmatrix} = \begin{bmatrix} c &amp;amp; s &amp;amp; 0 &amp;amp; 0 \\ -s &amp;amp; c &amp;amp; 0 &amp;amp; 0 \\
0 &amp;amp; 0 &amp;amp; c &amp;amp; s \\ 0 &amp;amp; 0 &amp;amp; -s &amp;amp; c\end{bmatrix} \begin{bmatrix} u_{x,i} \\ u_{y,i}
\\ u_{x,j} \\ u_{y,j} \end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Force transformations are the same as for displacement:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\begin{bmatrix}\bar{f}_{x,i} \\ \bar{f}_{y,i} \\ \bar{f}_{x,j} \\
\bar{f}_{y,j}\end{bmatrix} = \begin{bmatrix} c &amp;amp; s &amp;amp; 0 &amp;amp; 0 \\ -s &amp;amp; c &amp;amp; 0 &amp;amp; 0 \\
0 &amp;amp; 0 &amp;amp; c &amp;amp; s \\ 0 &amp;amp; 0 &amp;amp; -s &amp;amp; c\end{bmatrix} \begin{bmatrix} f_{x,i} \\ f_{y,i}
\\ f_{x,j} \\ f_{y,j} \end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;The 4x4 matrix used here is the &lt;em&gt;transformation matrix&lt;/em&gt; and is denoted as
&lt;span class="math"&gt;\(\mathbf{T}^e\)&lt;/span&gt;. Conversion of quantities from the global coordinate system
to the element coordinate system is done by:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\mathbf{\bar{U}}^e = \mathbf{T}^e \mathbf{U}^e
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
\mathbf{\bar{F}}^e = \mathbf{T}^e \mathbf{F}^e
\end{equation*}
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="global-equations"&gt;
&lt;h2&gt;Global Equations&lt;/h2&gt;
&lt;p&gt;Generation of global equations is developed by first setting equal the equations
for the local element on a force basis, which yields:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\mathbf{\bar{F}}^e = \mathbf{\bar{K}}^e \mathbf{\bar{U}}^e
\end{equation*}
&lt;/div&gt;
&lt;p&gt;and is equal to:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\mathbf{T}^e\mathbf{F}^e = \mathbf{\bar{K}}^e \mathbf{T}^e\mathbf{U}^e
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Next, both sides are multiplied by &lt;span class="math"&gt;\((\mathbf{T}^e)^{-1}\)&lt;/span&gt;, which for this
element type is also equal to the transpose, &lt;span class="math"&gt;\((\mathbf{T}^e)^T\)&lt;/span&gt;:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
(\mathbf{T}^e)^T \mathbf{T}^e \mathbf{F}^e = (\mathbf{T}^e)^T
\mathbf{\bar{K}}^e \mathbf{T}^e \mathbf{U}^e
\end{equation*}
&lt;/div&gt;
&lt;p&gt;which becomes,&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\mathbf{F}^e = (\mathbf{T}^e)^T \mathbf{\bar{K}}^e \mathbf{T}^e \mathbf{U}^e
\end{equation*}
&lt;/div&gt;
&lt;p&gt;therefore, the element's stiffness matrix in &lt;em&gt;global coordinates&lt;/em&gt; is:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\mathbf{K}^e = (\mathbf{T}^e)^T \mathbf{\bar{K}}^e \mathbf{T}^e
\end{equation*}
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Introduction to Finite Element Methods (ASEN 5007). University of Colorado
at Boulder. &lt;a class="reference external" href="http://kis.tu.kielce.pl/mo/COLORADO_FEM/colorado/Home.html"&gt;http://kis.tu.kielce.pl/mo/COLORADO_FEM/colorado/Home.html&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;J. N. Reddy, Ph.D. Introduction to the Finite Element Method, Fourth Edition.
Analysis of Trusses, Chapter (McGraw-Hill Education: New York, Chicago, San
Francisco, Athens, London, Madrid, Mexico City, Milan, New Delhi, Singapore,
Sydney, Toronto, 2019, 2006, 1993, 1984).
&lt;a class="reference external" href="https://www.accessengineeringlibrary.com/content/book/9781259861901/toc-chapter/chapter6/section/section3"&gt;https://www.accessengineeringlibrary.com/content/book/9781259861901/toc-chapter/chapter6/section/section3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;script type='text/javascript'&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';

    var configscript = document.createElement('script');
    configscript.type = 'text/x-mathjax-config';
    configscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        availableFonts: ['STIX', 'TeX']," +
        "        preferredFont: 'STIX'," +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";

    (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="FEA"/><category term="python"/></entry><entry><title>Python @staticmethod, @classmethod</title><link href="https://www.robsiegwart.com/python-staticmethod-classmethod.html" rel="alternate"/><published>2021-06-09T00:00:00-05:00</published><updated>2021-06-09T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-06-09:/python-staticmethod-classmethod.html</id><summary type="html">&lt;p class="first last"&gt;Overview of Python's staticmethod and classmethod decorators.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;While regular class methods take in the class instance as the first parameter,
&lt;tt class="docutils literal"&gt;&amp;#64;classmethod&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&amp;#64;staticmethod&lt;/tt&gt; are available in Python to create class methods
with different behavior and usage.&lt;/p&gt;
&lt;div class="section" id="staticmethod"&gt;
&lt;h2&gt;&amp;#64;staticmethod&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;does not take in the class or the instance as the implicit first parameter&lt;/li&gt;
&lt;li&gt;can be called on either the class or an instance&lt;/li&gt;
&lt;li&gt;cannot access class or instance properties&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A typical usage might be to store any general utility function to the class,
such as when the arguments have nothing to do with the class or its instances.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nd"&gt;@staticmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="classmethod"&gt;
&lt;h2&gt;&amp;#64;classmethod&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;takes the class in as the implicit first parameter&lt;/li&gt;
&lt;li&gt;can be called on either the class or an instance&lt;/li&gt;
&lt;li&gt;has access to class properties&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A typical usage might be to create new class instances with some alternative
call signature:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

    &lt;span class="nd"&gt;@classmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;standard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;alternate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</content><category term="Python"/><category term="python"/></entry><entry><title>Unified Thread Tables</title><link href="https://www.robsiegwart.com/unified-thread-tables.html" rel="alternate"/><published>2021-06-09T00:00:00-05:00</published><updated>2021-06-09T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-06-09:/unified-thread-tables.html</id><summary type="html">&lt;p class="first last"&gt;Tables for threads in UNC and UNF including derived properties
such as tensile area and tensile area-equivalent diameter.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Thread tables for Unified coarse and fine threads along with tensile area and
equivalent tensile area diameter per equation A-3-7 from Ref &lt;a class="footnote-reference" href="#footnote-2" id="footnote-reference-1"&gt;[2]&lt;/a&gt;. Tap drills
are for 75% thread engagement, per Tables 3 and 4 of Ref &lt;a class="footnote-reference" href="#footnote-1" id="footnote-reference-2"&gt;[1]&lt;/a&gt; of section
&amp;quot;Threading&amp;quot;.&lt;/p&gt;
&lt;div class="section" id="unc"&gt;
&lt;h2&gt;UNC&lt;/h2&gt;
&lt;table class="full-width-table"&gt;
&lt;thead&gt;
    &lt;th&gt;Size, Number or Inches&lt;/th&gt;
    &lt;th&gt;Basic Major Diameter (in)&lt;/th&gt;
    &lt;th&gt;TPI&lt;/th&gt;
    &lt;th&gt;Tensile Area, in&lt;sup&gt;2&lt;/sup&gt;&lt;/th&gt;
    &lt;th&gt;Tensile Area Diameter, in&lt;/th&gt;
    &lt;th&gt;Tap Drill No&lt;/th&gt;
    &lt;th&gt;Tap Drill Size, in&lt;/th&gt;
    &lt;th&gt;Clearance Drill (Close)&lt;/th&gt;
    &lt;th&gt;Clearance Size (Close), in&lt;/th&gt;
    &lt;th&gt;Clearance Drill (Free)&lt;/th&gt;
    &lt;th&gt;Clearance Size (Free), in&lt;/th&gt;
&lt;/thead&gt;
    &lt;tr&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;0.0600&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;52&lt;/td&gt;
        &lt;td&gt;0.0635&lt;/td&gt;
        &lt;td&gt;50&lt;/td&gt;
        &lt;td&gt;0.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1&lt;/td&gt;
        &lt;td&gt;0.0730&lt;/td&gt;
        &lt;td&gt;64&lt;/td&gt;
        &lt;td&gt;0.0026&lt;/td&gt;
        &lt;td&gt;0.058&lt;/td&gt;
        &lt;td&gt;53&lt;/td&gt;
        &lt;td&gt;0.0595&lt;/td&gt;
        &lt;td&gt;48&lt;/td&gt;
        &lt;td&gt;0.076&lt;/td&gt;
        &lt;td&gt;46&lt;/td&gt;
        &lt;td&gt;0.081&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;2&lt;/td&gt;
        &lt;td&gt;0.0860&lt;/td&gt;
        &lt;td&gt;56&lt;/td&gt;
        &lt;td&gt;0.0037&lt;/td&gt;
        &lt;td&gt;0.069&lt;/td&gt;
        &lt;td&gt;50&lt;/td&gt;
        &lt;td&gt;0.07&lt;/td&gt;
        &lt;td&gt;43&lt;/td&gt;
        &lt;td&gt;0.089&lt;/td&gt;
        &lt;td&gt;41&lt;/td&gt;
        &lt;td&gt;0.096&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;3&lt;/td&gt;
        &lt;td&gt;0.0990&lt;/td&gt;
        &lt;td&gt;48&lt;/td&gt;
        &lt;td&gt;0.0049&lt;/td&gt;
        &lt;td&gt;0.079&lt;/td&gt;
        &lt;td&gt;47&lt;/td&gt;
        &lt;td&gt;0.0785&lt;/td&gt;
        &lt;td&gt;37&lt;/td&gt;
        &lt;td&gt;0.104&lt;/td&gt;
        &lt;td&gt;35&lt;/td&gt;
        &lt;td&gt;0.11&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;4&lt;/td&gt;
        &lt;td&gt;0.1120&lt;/td&gt;
        &lt;td&gt;40&lt;/td&gt;
        &lt;td&gt;0.0060&lt;/td&gt;
        &lt;td&gt;0.088&lt;/td&gt;
        &lt;td&gt;43&lt;/td&gt;
        &lt;td&gt;0.089&lt;/td&gt;
        &lt;td&gt;32&lt;/td&gt;
        &lt;td&gt;0.116&lt;/td&gt;
        &lt;td&gt;30&lt;/td&gt;
        &lt;td&gt;0.1285&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;5&lt;/td&gt;
        &lt;td&gt;0.1250&lt;/td&gt;
        &lt;td&gt;40&lt;/td&gt;
        &lt;td&gt;0.0080&lt;/td&gt;
        &lt;td&gt;0.101&lt;/td&gt;
        &lt;td&gt;38&lt;/td&gt;
        &lt;td&gt;0.1015&lt;/td&gt;
        &lt;td&gt;30&lt;/td&gt;
        &lt;td&gt;0.1285&lt;/td&gt;
        &lt;td&gt;29&lt;/td&gt;
        &lt;td&gt;0.136&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;6&lt;/td&gt;
        &lt;td&gt;0.1380&lt;/td&gt;
        &lt;td&gt;32&lt;/td&gt;
        &lt;td&gt;0.0091&lt;/td&gt;
        &lt;td&gt;0.108&lt;/td&gt;
        &lt;td&gt;36&lt;/td&gt;
        &lt;td&gt;0.1065&lt;/td&gt;
        &lt;td&gt;27&lt;/td&gt;
        &lt;td&gt;0.144&lt;/td&gt;
        &lt;td&gt;25&lt;/td&gt;
        &lt;td&gt;0.1495&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;8&lt;/td&gt;
        &lt;td&gt;0.1640&lt;/td&gt;
        &lt;td&gt;32&lt;/td&gt;
        &lt;td&gt;0.0140&lt;/td&gt;
        &lt;td&gt;0.134&lt;/td&gt;
        &lt;td&gt;29&lt;/td&gt;
        &lt;td&gt;0.136&lt;/td&gt;
        &lt;td&gt;18&lt;/td&gt;
        &lt;td&gt;0.1695&lt;/td&gt;
        &lt;td&gt;16&lt;/td&gt;
        &lt;td&gt;0.177&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;10&lt;/td&gt;
        &lt;td&gt;0.1900&lt;/td&gt;
        &lt;td&gt;24&lt;/td&gt;
        &lt;td&gt;0.0175&lt;/td&gt;
        &lt;td&gt;0.149&lt;/td&gt;
        &lt;td&gt;25&lt;/td&gt;
        &lt;td&gt;0.1495&lt;/td&gt;
        &lt;td&gt;9&lt;/td&gt;
        &lt;td&gt;0.196&lt;/td&gt;
        &lt;td&gt;7&lt;/td&gt;
        &lt;td&gt;0.201&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;12&lt;/td&gt;
        &lt;td&gt;0.2160&lt;/td&gt;
        &lt;td&gt;24&lt;/td&gt;
        &lt;td&gt;0.0242&lt;/td&gt;
        &lt;td&gt;0.175&lt;/td&gt;
        &lt;td&gt;16&lt;/td&gt;
        &lt;td&gt;0.177&lt;/td&gt;
        &lt;td&gt;2&lt;/td&gt;
        &lt;td&gt;0.221&lt;/td&gt;
        &lt;td&gt;1&lt;/td&gt;
        &lt;td&gt;0.228&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1/4&lt;/td&gt;
        &lt;td&gt;0.25&lt;/td&gt;
        &lt;td&gt;20&lt;/td&gt;
        &lt;td&gt;0.0318&lt;/td&gt;
        &lt;td&gt;0.201&lt;/td&gt;
        &lt;td&gt;7&lt;/td&gt;
        &lt;td&gt;0.201&lt;/td&gt;
        &lt;td&gt;F&lt;/td&gt;
        &lt;td&gt;0.257&lt;/td&gt;
        &lt;td&gt;H&lt;/td&gt;
        &lt;td&gt;0.266&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;5/16&lt;/td&gt;
        &lt;td&gt;0.3125&lt;/td&gt;
        &lt;td&gt;18&lt;/td&gt;
        &lt;td&gt;0.0524&lt;/td&gt;
        &lt;td&gt;0.258&lt;/td&gt;
        &lt;td&gt;F&lt;/td&gt;
        &lt;td&gt;0.257&lt;/td&gt;
        &lt;td&gt;P&lt;/td&gt;
        &lt;td&gt;0.323&lt;/td&gt;
        &lt;td&gt;Q&lt;/td&gt;
        &lt;td&gt;0.332&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;3/8&lt;/td&gt;
        &lt;td&gt;0.375&lt;/td&gt;
        &lt;td&gt;16&lt;/td&gt;
        &lt;td&gt;0.0775&lt;/td&gt;
        &lt;td&gt;0.314&lt;/td&gt;
        &lt;td&gt;5/16&lt;/td&gt;
        &lt;td&gt;0.3125&lt;/td&gt;
        &lt;td&gt;W&lt;/td&gt;
        &lt;td&gt;0.386&lt;/td&gt;
        &lt;td&gt;X&lt;/td&gt;
        &lt;td&gt;0.397&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;7/16&lt;/td&gt;
        &lt;td&gt;0.4375&lt;/td&gt;
        &lt;td&gt;14&lt;/td&gt;
        &lt;td&gt;0.1063&lt;/td&gt;
        &lt;td&gt;0.368&lt;/td&gt;
        &lt;td&gt;U&lt;/td&gt;
        &lt;td&gt;0.368&lt;/td&gt;
        &lt;td&gt;29/64&lt;/td&gt;
        &lt;td&gt;0.4531&lt;/td&gt;
        &lt;td&gt;15/32&lt;/td&gt;
        &lt;td&gt;0.4687&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1/2&lt;/td&gt;
        &lt;td&gt;0.5&lt;/td&gt;
        &lt;td&gt;13&lt;/td&gt;
        &lt;td&gt;0.1419&lt;/td&gt;
        &lt;td&gt;0.425&lt;/td&gt;
        &lt;td&gt;27/64&lt;/td&gt;
        &lt;td&gt;0.4219&lt;/td&gt;
        &lt;td&gt;33/64&lt;/td&gt;
        &lt;td&gt;0.5156&lt;/td&gt;
        &lt;td&gt;17/32&lt;/td&gt;
        &lt;td&gt;0.5312&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;9/16&lt;/td&gt;
        &lt;td&gt;0.5625&lt;/td&gt;
        &lt;td&gt;12&lt;/td&gt;
        &lt;td&gt;0.1819&lt;/td&gt;
        &lt;td&gt;0.481&lt;/td&gt;
        &lt;td&gt;31/64&lt;/td&gt;
        &lt;td&gt;0.4844&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;5/8&lt;/td&gt;
        &lt;td&gt;0.625&lt;/td&gt;
        &lt;td&gt;11&lt;/td&gt;
        &lt;td&gt;0.2260&lt;/td&gt;
        &lt;td&gt;0.536&lt;/td&gt;
        &lt;td&gt;17/32&lt;/td&gt;
        &lt;td&gt;0.5312&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;3/4&lt;/td&gt;
        &lt;td&gt;0.75&lt;/td&gt;
        &lt;td&gt;10&lt;/td&gt;
        &lt;td&gt;0.3345&lt;/td&gt;
        &lt;td&gt;0.653&lt;/td&gt;
        &lt;td&gt;21/32&lt;/td&gt;
        &lt;td&gt;0.6562&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;7/8&lt;/td&gt;
        &lt;td&gt;0.875&lt;/td&gt;
        &lt;td&gt;9&lt;/td&gt;
        &lt;td&gt;0.4617&lt;/td&gt;
        &lt;td&gt;0.767&lt;/td&gt;
        &lt;td&gt;49/64&lt;/td&gt;
        &lt;td&gt;0.7656&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1&lt;/td&gt;
        &lt;td&gt;1&lt;/td&gt;
        &lt;td&gt;8&lt;/td&gt;
        &lt;td&gt;0.6057&lt;/td&gt;
        &lt;td&gt;0.878&lt;/td&gt;
        &lt;td&gt;7/8&lt;/td&gt;
        &lt;td&gt;0.875&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 1/8&lt;/td&gt;
        &lt;td&gt;1.125&lt;/td&gt;
        &lt;td&gt;7&lt;/td&gt;
        &lt;td&gt;0.7633&lt;/td&gt;
        &lt;td&gt;0.986&lt;/td&gt;
        &lt;td&gt;63/64&lt;/td&gt;
        &lt;td&gt;0.9844&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 1/4&lt;/td&gt;
        &lt;td&gt;1.25&lt;/td&gt;
        &lt;td&gt;7&lt;/td&gt;
        &lt;td&gt;0.9691&lt;/td&gt;
        &lt;td&gt;1.111&lt;/td&gt;
        &lt;td&gt;1 7/64&lt;/td&gt;
        &lt;td&gt;1.1094&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 5/16&lt;/td&gt;
        &lt;td&gt;1.3125&lt;/td&gt;
        &lt;td&gt;7&lt;/td&gt;
        &lt;td&gt;1.0812&lt;/td&gt;
        &lt;td&gt;1.173&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 3/8&lt;/td&gt;
        &lt;td&gt;1.375&lt;/td&gt;
        &lt;td&gt;6&lt;/td&gt;
        &lt;td&gt;1.1549&lt;/td&gt;
        &lt;td&gt;1.213&lt;/td&gt;
        &lt;td&gt;1 7/32&lt;/td&gt;
        &lt;td&gt;1.2187&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 1/2&lt;/td&gt;
        &lt;td&gt;1.5&lt;/td&gt;
        &lt;td&gt;6&lt;/td&gt;
        &lt;td&gt;1.4052&lt;/td&gt;
        &lt;td&gt;1.338&lt;/td&gt;
        &lt;td&gt;1 11/32&lt;/td&gt;
        &lt;td&gt;1.3437&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 5/8&lt;/td&gt;
        &lt;td&gt;1.625&lt;/td&gt;
        &lt;td&gt;6&lt;/td&gt;
        &lt;td&gt;1.6802&lt;/td&gt;
        &lt;td&gt;1.463&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 3/4&lt;/td&gt;
        &lt;td&gt;1.75&lt;/td&gt;
        &lt;td&gt;5&lt;/td&gt;
        &lt;td&gt;1.8995&lt;/td&gt;
        &lt;td&gt;1.555&lt;/td&gt;
        &lt;td&gt;1 9/16&lt;/td&gt;
        &lt;td&gt;1.5625&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 7/8&lt;/td&gt;
        &lt;td&gt;1.875&lt;/td&gt;
        &lt;td&gt;5&lt;/td&gt;
        &lt;td&gt;2.2171&lt;/td&gt;
        &lt;td&gt;1.680&lt;/td&gt;
        &lt;td&gt;1 11/16&lt;/td&gt;
        &lt;td&gt;1.6875&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;2&lt;/td&gt;
        &lt;td&gt;2&lt;/td&gt;
        &lt;td&gt;4.5&lt;/td&gt;
        &lt;td&gt;2.4982&lt;/td&gt;
        &lt;td&gt;1.783&lt;/td&gt;
        &lt;td&gt;1 25/32&lt;/td&gt;
        &lt;td&gt;1.7812&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;2 1/4&lt;/td&gt;
        &lt;td&gt;2.25&lt;/td&gt;
        &lt;td&gt;4.5&lt;/td&gt;
        &lt;td&gt;3.2477&lt;/td&gt;
        &lt;td&gt;2.033&lt;/td&gt;
        &lt;td&gt;2 1/32&lt;/td&gt;
        &lt;td&gt;2.0312&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;2 1/2&lt;/td&gt;
        &lt;td&gt;2.5&lt;/td&gt;
        &lt;td&gt;4&lt;/td&gt;
        &lt;td&gt;3.9988&lt;/td&gt;
        &lt;td&gt;2.256&lt;/td&gt;
        &lt;td&gt;2 1/4&lt;/td&gt;
        &lt;td&gt;2.25&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;2 3/4&lt;/td&gt;
        &lt;td&gt;2.75&lt;/td&gt;
        &lt;td&gt;4&lt;/td&gt;
        &lt;td&gt;4.9340&lt;/td&gt;
        &lt;td&gt;2.506&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;3&lt;/td&gt;
        &lt;td&gt;3&lt;/td&gt;
        &lt;td&gt;4&lt;/td&gt;
        &lt;td&gt;5.9674&lt;/td&gt;
        &lt;td&gt;2.756&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;3 1/4&lt;/td&gt;
        &lt;td&gt;3.25&lt;/td&gt;
        &lt;td&gt;4&lt;/td&gt;
        &lt;td&gt;7.0989&lt;/td&gt;
        &lt;td&gt;3.006&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;3 1/2&lt;/td&gt;
        &lt;td&gt;3.5&lt;/td&gt;
        &lt;td&gt;4&lt;/td&gt;
        &lt;td&gt;8.3286&lt;/td&gt;
        &lt;td&gt;3.256&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;3 3/4&lt;/td&gt;
        &lt;td&gt;3.75&lt;/td&gt;
        &lt;td&gt;4&lt;/td&gt;
        &lt;td&gt;9.6565&lt;/td&gt;
        &lt;td&gt;3.506&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;4&lt;/td&gt;
        &lt;td&gt;4&lt;/td&gt;
        &lt;td&gt;4&lt;/td&gt;
        &lt;td&gt;11.0825&lt;/td&gt;
        &lt;td&gt;3.756&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="unf"&gt;
&lt;h2&gt;UNF&lt;/h2&gt;
&lt;table class="full-width-table"&gt;
&lt;thead&gt;
    &lt;th&gt;Size, Number or Inches&lt;/th&gt;
    &lt;th&gt;Basic Major Diameter (in)&lt;/th&gt;
    &lt;th&gt;TPI&lt;/th&gt;
    &lt;th&gt;Tensile Area, in&lt;sup&gt;2&lt;/sup&gt;&lt;/th&gt;
    &lt;th&gt;Tensile Area Diameter, in&lt;/th&gt;
    &lt;th&gt;Tap Drill No&lt;/th&gt;
    &lt;th&gt;Tap Drill Size, in&lt;/th&gt;
    &lt;th&gt;Clearance Drill (Close)&lt;/th&gt;
    &lt;th&gt;Clearance Size (Close), in&lt;/th&gt;
    &lt;th&gt;Clearance Drill (Free)&lt;/th&gt;
    &lt;th&gt;Clearance Size (Free), in&lt;/th&gt;
&lt;/thead&gt;
    &lt;tr&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;0.060&lt;/td&gt;
        &lt;td&gt;80&lt;/td&gt;
        &lt;td&gt;0.0018&lt;/td&gt;
        &lt;td&gt;0.048&lt;/td&gt;
        &lt;td&gt;3/64&lt;/td&gt;
        &lt;td&gt;0.0469&lt;/td&gt;
        &lt;td&gt;52&lt;/td&gt;
        &lt;td&gt;0.0635&lt;/td&gt;
        &lt;td&gt;50&lt;/td&gt;
        &lt;td&gt;0.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1&lt;/td&gt;
        &lt;td&gt;0.073&lt;/td&gt;
        &lt;td&gt;72&lt;/td&gt;
        &lt;td&gt;0.0028&lt;/td&gt;
        &lt;td&gt;0.059&lt;/td&gt;
        &lt;td&gt;53&lt;/td&gt;
        &lt;td&gt;0.0595&lt;/td&gt;
        &lt;td&gt;48&lt;/td&gt;
        &lt;td&gt;0.076&lt;/td&gt;
        &lt;td&gt;46&lt;/td&gt;
        &lt;td&gt;0.081&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;2&lt;/td&gt;
        &lt;td&gt;0.086&lt;/td&gt;
        &lt;td&gt;64&lt;/td&gt;
        &lt;td&gt;0.0039&lt;/td&gt;
        &lt;td&gt;0.071&lt;/td&gt;
        &lt;td&gt;50&lt;/td&gt;
        &lt;td&gt;0.07&lt;/td&gt;
        &lt;td&gt;43&lt;/td&gt;
        &lt;td&gt;0.089&lt;/td&gt;
        &lt;td&gt;41&lt;/td&gt;
        &lt;td&gt;0.096&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;3&lt;/td&gt;
        &lt;td&gt;0.099&lt;/td&gt;
        &lt;td&gt;56&lt;/td&gt;
        &lt;td&gt;0.0052&lt;/td&gt;
        &lt;td&gt;0.082&lt;/td&gt;
        &lt;td&gt;45&lt;/td&gt;
        &lt;td&gt;0.082&lt;/td&gt;
        &lt;td&gt;37&lt;/td&gt;
        &lt;td&gt;0.104&lt;/td&gt;
        &lt;td&gt;35&lt;/td&gt;
        &lt;td&gt;0.11&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;4&lt;/td&gt;
        &lt;td&gt;0.112&lt;/td&gt;
        &lt;td&gt;48&lt;/td&gt;
        &lt;td&gt;0.0066&lt;/td&gt;
        &lt;td&gt;0.092&lt;/td&gt;
        &lt;td&gt;42&lt;/td&gt;
        &lt;td&gt;0.0935&lt;/td&gt;
        &lt;td&gt;32&lt;/td&gt;
        &lt;td&gt;0.116&lt;/td&gt;
        &lt;td&gt;30&lt;/td&gt;
        &lt;td&gt;0.1285&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;5&lt;/td&gt;
        &lt;td&gt;0.125&lt;/td&gt;
        &lt;td&gt;44&lt;/td&gt;
        &lt;td&gt;0.0083&lt;/td&gt;
        &lt;td&gt;0.103&lt;/td&gt;
        &lt;td&gt;37&lt;/td&gt;
        &lt;td&gt;0.104&lt;/td&gt;
        &lt;td&gt;30&lt;/td&gt;
        &lt;td&gt;0.1285&lt;/td&gt;
        &lt;td&gt;29&lt;/td&gt;
        &lt;td&gt;0.136&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;6&lt;/td&gt;
        &lt;td&gt;0.138&lt;/td&gt;
        &lt;td&gt;40&lt;/td&gt;
        &lt;td&gt;0.0101&lt;/td&gt;
        &lt;td&gt;0.114&lt;/td&gt;
        &lt;td&gt;33&lt;/td&gt;
        &lt;td&gt;0.113&lt;/td&gt;
        &lt;td&gt;27&lt;/td&gt;
        &lt;td&gt;0.144&lt;/td&gt;
        &lt;td&gt;25&lt;/td&gt;
        &lt;td&gt;0.1495&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;8&lt;/td&gt;
        &lt;td&gt;0.164&lt;/td&gt;
        &lt;td&gt;36&lt;/td&gt;
        &lt;td&gt;0.0147&lt;/td&gt;
        &lt;td&gt;0.137&lt;/td&gt;
        &lt;td&gt;29&lt;/td&gt;
        &lt;td&gt;0.136&lt;/td&gt;
        &lt;td&gt;18&lt;/td&gt;
        &lt;td&gt;0.1695&lt;/td&gt;
        &lt;td&gt;16&lt;/td&gt;
        &lt;td&gt;0.177&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;10&lt;/td&gt;
        &lt;td&gt;0.19&lt;/td&gt;
        &lt;td&gt;32&lt;/td&gt;
        &lt;td&gt;0.0200&lt;/td&gt;
        &lt;td&gt;0.160&lt;/td&gt;
        &lt;td&gt;21&lt;/td&gt;
        &lt;td&gt;0.159&lt;/td&gt;
        &lt;td&gt;9&lt;/td&gt;
        &lt;td&gt;0.196&lt;/td&gt;
        &lt;td&gt;7&lt;/td&gt;
        &lt;td&gt;0.201&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;12&lt;/td&gt;
        &lt;td&gt;0.216&lt;/td&gt;
        &lt;td&gt;28&lt;/td&gt;
        &lt;td&gt;0.0258&lt;/td&gt;
        &lt;td&gt;0.181&lt;/td&gt;
        &lt;td&gt;14&lt;/td&gt;
        &lt;td&gt;0.182&lt;/td&gt;
        &lt;td&gt;2&lt;/td&gt;
        &lt;td&gt;0.221&lt;/td&gt;
        &lt;td&gt;1&lt;/td&gt;
        &lt;td&gt;0.228&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1/4&lt;/td&gt;
        &lt;td&gt;0.25&lt;/td&gt;
        &lt;td&gt;28&lt;/td&gt;
        &lt;td&gt;0.0364&lt;/td&gt;
        &lt;td&gt;0.215&lt;/td&gt;
        &lt;td&gt;3&lt;/td&gt;
        &lt;td&gt;0.213&lt;/td&gt;
        &lt;td&gt;F&lt;/td&gt;
        &lt;td&gt;0.257&lt;/td&gt;
        &lt;td&gt;H&lt;/td&gt;
        &lt;td&gt;0.266&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;5/16&lt;/td&gt;
        &lt;td&gt;0.3125&lt;/td&gt;
        &lt;td&gt;24&lt;/td&gt;
        &lt;td&gt;0.0581&lt;/td&gt;
        &lt;td&gt;0.272&lt;/td&gt;
        &lt;td&gt;I&lt;/td&gt;
        &lt;td&gt;0.272&lt;/td&gt;
        &lt;td&gt;P&lt;/td&gt;
        &lt;td&gt;0.323&lt;/td&gt;
        &lt;td&gt;Q&lt;/td&gt;
        &lt;td&gt;0.332&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;3/8&lt;/td&gt;
        &lt;td&gt;0.375&lt;/td&gt;
        &lt;td&gt;24&lt;/td&gt;
        &lt;td&gt;0.0878&lt;/td&gt;
        &lt;td&gt;0.334&lt;/td&gt;
        &lt;td&gt;Q&lt;/td&gt;
        &lt;td&gt;0.332&lt;/td&gt;
        &lt;td&gt;W&lt;/td&gt;
        &lt;td&gt;0.386&lt;/td&gt;
        &lt;td&gt;X&lt;/td&gt;
        &lt;td&gt;0.397&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;7/16&lt;/td&gt;
        &lt;td&gt;0.4375&lt;/td&gt;
        &lt;td&gt;20&lt;/td&gt;
        &lt;td&gt;0.1187&lt;/td&gt;
        &lt;td&gt;0.389&lt;/td&gt;
        &lt;td&gt;25/64&lt;/td&gt;
        &lt;td&gt;0.3906&lt;/td&gt;
        &lt;td&gt;29/64&lt;/td&gt;
        &lt;td&gt;0.4531&lt;/td&gt;
        &lt;td&gt;15/32&lt;/td&gt;
        &lt;td&gt;0.4687&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1/2&lt;/td&gt;
        &lt;td&gt;0.5&lt;/td&gt;
        &lt;td&gt;20&lt;/td&gt;
        &lt;td&gt;0.1600&lt;/td&gt;
        &lt;td&gt;0.451&lt;/td&gt;
        &lt;td&gt;29/64&lt;/td&gt;
        &lt;td&gt;0.4531&lt;/td&gt;
        &lt;td&gt;33/64&lt;/td&gt;
        &lt;td&gt;0.5156&lt;/td&gt;
        &lt;td&gt;17/32&lt;/td&gt;
        &lt;td&gt;0.5312&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;9/16&lt;/td&gt;
        &lt;td&gt;0.5625&lt;/td&gt;
        &lt;td&gt;18&lt;/td&gt;
        &lt;td&gt;0.2030&lt;/td&gt;
        &lt;td&gt;0.508&lt;/td&gt;
        &lt;td&gt;33/64&lt;/td&gt;
        &lt;td&gt;0.5156&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;5/8&lt;/td&gt;
        &lt;td&gt;0.625&lt;/td&gt;
        &lt;td&gt;18&lt;/td&gt;
        &lt;td&gt;0.2560&lt;/td&gt;
        &lt;td&gt;0.571&lt;/td&gt;
        &lt;td&gt;37/64&lt;/td&gt;
        &lt;td&gt;0.5781&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;3/4&lt;/td&gt;
        &lt;td&gt;0.75&lt;/td&gt;
        &lt;td&gt;16&lt;/td&gt;
        &lt;td&gt;0.3730&lt;/td&gt;
        &lt;td&gt;0.689&lt;/td&gt;
        &lt;td&gt;11/16&lt;/td&gt;
        &lt;td&gt;0.6875&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;7/8&lt;/td&gt;
        &lt;td&gt;0.875&lt;/td&gt;
        &lt;td&gt;14&lt;/td&gt;
        &lt;td&gt;0.5095&lt;/td&gt;
        &lt;td&gt;0.805&lt;/td&gt;
        &lt;td&gt;13/16&lt;/td&gt;
        &lt;td&gt;0.8125&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1&lt;/td&gt;
        &lt;td&gt;1&lt;/td&gt;
        &lt;td&gt;12&lt;/td&gt;
        &lt;td&gt;0.6630&lt;/td&gt;
        &lt;td&gt;0.919&lt;/td&gt;
        &lt;td&gt;59/64&lt;/td&gt;
        &lt;td&gt;0.9219&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 1/8&lt;/td&gt;
        &lt;td&gt;1.125&lt;/td&gt;
        &lt;td&gt;12&lt;/td&gt;
        &lt;td&gt;0.8557&lt;/td&gt;
        &lt;td&gt;1.044&lt;/td&gt;
        &lt;td&gt;1 &lt;/span&gt;3/64&lt;/td&gt;
        &lt;td&gt;1.0469&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 1/4&lt;/td&gt;
        &lt;td&gt;1.25&lt;/td&gt;
        &lt;td&gt;12&lt;/td&gt;
        &lt;td&gt;1.0729&lt;/td&gt;
        &lt;td&gt;1.169&lt;/td&gt;
        &lt;td&gt;1 &lt;/span&gt;11/64&lt;/td&gt;
        &lt;td&gt;1.1719&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 5/16&lt;/td&gt;
        &lt;td&gt;1.3125&lt;/td&gt;
        &lt;td&gt;12&lt;/td&gt;
        &lt;td&gt;1.1908&lt;/td&gt;
        &lt;td&gt;1.231&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 3/8&lt;/td&gt;
        &lt;td&gt;1.375&lt;/td&gt;
        &lt;td&gt;12&lt;/td&gt;
        &lt;td&gt;1.3147&lt;/td&gt;
        &lt;td&gt;1.294&lt;/td&gt;
        &lt;td&gt;1 &lt;/span&gt;19/64&lt;/td&gt;
        &lt;td&gt;1.2969&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;1 1/2&lt;/td&gt;
        &lt;td&gt;1.5&lt;/td&gt;
        &lt;td&gt;12&lt;/td&gt;
        &lt;td&gt;1.5810&lt;/td&gt;
        &lt;td&gt;1.419&lt;/td&gt;
        &lt;td&gt;1 &lt;/span&gt;27/64&lt;/td&gt;
        &lt;td&gt;1.4219&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;table class="docutils footnote" frame="void" id="footnote-1" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Machinery's Handbook, 28th Edition. Industrial Press.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="footnote-2" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;ANSI/AISC 360-16, Specification for Structural Steel Buildings.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="Engineering Reference"/><category term="bolting"/></entry><entry><title>Weld as a Line - Geometric Properties Table</title><link href="https://www.robsiegwart.com/weld-as-a-line-table.html" rel="alternate"/><published>2021-06-02T00:00:00-05:00</published><updated>2021-06-02T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-06-02:/weld-as-a-line-table.html</id><summary type="html">&lt;p class="first last"&gt;Property tables for welds when treated as a line using the
Blodgett method.&lt;/p&gt;
</summary><content type="html">&lt;div class="section" id="properties"&gt;
&lt;h2&gt;Properties&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;span class="math"&gt;\(s\)&lt;/span&gt; - weld size&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(t\)&lt;/span&gt; - weld throat dimension, equal to &lt;span class="math"&gt;\(0.707s\)&lt;/span&gt; for typical fillet welds (joint angles between 80 and 100 degrees)&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(d\)&lt;/span&gt; - height of weld shape&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(b\)&lt;/span&gt; - width of weld shape&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(A_u\)&lt;/span&gt; - unit weld area&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(I_{u,x}\)&lt;/span&gt;, &lt;span class="math"&gt;\(I_{u,y}\)&lt;/span&gt; - unit area moment of inertias, x-x and y-y axes, respectively&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(J_u\)&lt;/span&gt; - Unit polar moment of inertia&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unit properties are defined in terms of unit weld size. Multiply their values by
the throat dimension to obtain the actual value of the property, which is used
in calculations when the weld size is known:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
A = A_ut
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
I_x = I_{u,x}t \qquad I_y = I_{u,y}t
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
J = J_ut
\end{equation*}
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="table"&gt;
&lt;h2&gt;Table&lt;/h2&gt;
&lt;table class="full-width-table"&gt;
    &lt;thead&gt;
        &lt;th&gt;Shape&lt;/th&gt;
        &lt;th&gt;&lt;/th&gt;
        &lt;th&gt;$$ \bar{x} $$&lt;/th&gt;
        &lt;th&gt;$$ \bar{y} $$&lt;/th&gt;
        &lt;th&gt;$$ A_u $$&lt;/th&gt;
        &lt;th&gt;$$ I_{u,x} $$&lt;/th&gt;
        &lt;th&gt;$$ I_{u,y} $$&lt;/th&gt;
        &lt;th&gt;$$ J_u $$&lt;/th&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;Line&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;&lt;img  src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/line4.png"&gt;&lt;/td&gt;
            &lt;td&gt;0&lt;/td&gt;
            &lt;td&gt;$$ \frac{d}{2} $$&lt;/td&gt;
            &lt;td&gt;$$ d $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{d^3}{12} $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{dt^3}{12} \text{*}$$&lt;/td&gt;
            &lt;td&gt;$$ \frac{d^3}{12} $$&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;Double Line&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;&lt;img src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/dl3.png"&gt;
            &lt;/td&gt;
            &lt;td&gt;$$ b/2 $$&lt;/td&gt;
            &lt;td&gt;$$ d/2 $$&lt;/td&gt;
            &lt;td&gt;$$ 2d $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{d^3}{6} $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{db^2}{2} $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{d(3b^2+d^2}{6} $$&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;L&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;&lt;img  src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/L.png"&gt;&lt;/td&gt;
            &lt;td&gt;$$ \frac{b^2}{2(b+d)} $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{d^2}{2(b+d)} $$&lt;/td&gt;
            &lt;td&gt;$$ b+d $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{d^3(d+4b)}{12(b+d)} $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{b^3(d+4b)}{12(b+d)} $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{b^4 + d^4 + 4bd(b^2+d^2)}{12(b+d)} $$&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;&lt;img  src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/C.png"&gt;&lt;/td&gt;
            &lt;td&gt;$$ \frac{b^2}{2b+d} $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{d}{2} $$&lt;/td&gt;
            &lt;td&gt;$$ 2b+d $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{d^2}{12}(d+6b) $$&lt;/td&gt;
            &lt;td&gt;$$ b^3\left( \frac{b+2d}{3(2b+d)} \right) $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{d^2}{12}(d+6b) + b^3\left( \frac{b+2d}{3(2b+d)} \right) $$&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;Box&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;&lt;img  src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/box.png"&gt;&lt;/td&gt;
            &lt;td&gt;$$ \frac{b}{2} $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{d}{2} $$&lt;/td&gt;
            &lt;td&gt;$$ 2(b+d) $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{d^2}{6}(d+3b) $$&lt;/td&gt;
            &lt;td&gt;$$ \frac{b^2}{6}(b+3d) $$&lt;/td&gt;
            &lt;td style="text-align: left;"&gt;$$ \frac{(b+d)^3}{6} $$&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;Circle&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;&lt;img id="circle_figure" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/circle.png"&gt;&lt;/td&gt;
            &lt;td&gt;$$0$$&lt;/td&gt;
            &lt;td&gt;$$0$$&lt;/td&gt;
            &lt;td&gt;$$ 2\pi r $$&lt;/td&gt;
            &lt;td&gt;$$ \pi r^3 $$&lt;/td&gt;
            &lt;td&gt;$$ \pi r^3 $$&lt;/td&gt;
            &lt;td&gt;$$ 2\pi r^3 $$&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;p style="font-size: 75%; line-height: 1.25; margin: auto;"&gt;* Typically not defined for this axis, but this allows one to compute a bending stress given a y-y moment.&lt;/p&gt;&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Collins, Busby, Staab. &lt;em&gt;Mechanical Design of Machine Elements and Machines.&lt;/em&gt; 2nd Ed.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;script type='text/javascript'&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';

    var configscript = document.createElement('script');
    configscript.type = 'text/x-mathjax-config';
    configscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        availableFonts: ['STIX', 'TeX']," +
        "        preferredFont: 'STIX'," +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";

    (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="Engineering Design"/><category term="welding"/><category term="machine design"/></entry><entry><title>Easily Zip Ghost Themes with Python</title><link href="https://www.robsiegwart.com/easily-zip-ghost-themes-with-python.html" rel="alternate"/><published>2021-06-01T00:00:00-05:00</published><updated>2022-04-11T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-06-01:/easily-zip-ghost-themes-with-python.html</id><summary type="html">&lt;p&gt;Previous iterations of this site used the Ghost blogging platform which utilized
a custom theme. In order to upload it to the Ghost application a zipped folder
of the theme is required. To save mouse clicks and keyboard strokes, I wrote a
Python script to zip the theme files and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Previous iterations of this site used the Ghost blogging platform which utilized
a custom theme. In order to upload it to the Ghost application a zipped folder
of the theme is required. To save mouse clicks and keyboard strokes, I wrote a
Python script to zip the theme files and save out a .zip file with the version
included in the filename.&lt;/p&gt;
&lt;p&gt;For Ghost, the theme version is set in the &lt;tt class="docutils literal"&gt;package.json&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;package-lock.json&lt;/span&gt;&lt;/tt&gt;
files for it to be recognized in the Ghost admin. The Python script below gets
the version value from &lt;tt class="docutils literal"&gt;package.json&lt;/tt&gt; and includes it in the zipped file name.&lt;/p&gt;
&lt;p&gt;The Python script is placed in the directory to be zipped and some variables are
set:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;BASE_NAME&lt;/tt&gt; - base name of the output zip file with the output name being
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;[BASE_NAME]-[VERSION].zip&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;OUTDIR&lt;/tt&gt; - local output directory name for the resulting zip file&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;REMOVE_DIRS&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;REMOVE_FILES&lt;/tt&gt; - lists of directories and files, respectively,
to exclude in the resulting zip file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then, running this file compiles the files in the current directory and all
subdirectories with the exceptions listed in &lt;tt class="docutils literal"&gt;REMOVE_DIRS&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;REMOVE_FILES&lt;/tt&gt; and
places an named zip file in the directory specified in &lt;tt class="docutils literal"&gt;OUTDIR&lt;/tt&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;glob&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;zipfile&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;BASE_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;my_zip_file&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;OUTDIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Zipped&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;REMOVE_DIRS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Zipped&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.vscode&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.git&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;REMOVE_FILES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;VERSION&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;zip.py&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;routes.yaml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;package.json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;packagejson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;packagejson&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;version&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;theme_files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;theme_files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theme_files&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;REMOVE_DIRS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;REMOVE_FILES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OUTDIR&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OUTDIR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;zip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zipfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZipFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OUTDIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;.zip&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;compression&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;zipfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZIP_DEFLATED&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;zipdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dirs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nb"&gt;dir&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dirs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;zipdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theme_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;zipdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
</content><category term="Python"/><category term="python"/></entry><entry><title>GD&amp;T -- Basics</title><link href="https://www.robsiegwart.com/gd-t-basics.html" rel="alternate"/><published>2021-05-31T00:00:00-05:00</published><updated>2022-04-10T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-05-31:/gd-t-basics.html</id><summary type="html"/><content type="html">&lt;div class="section" id="concepts"&gt;
&lt;h2&gt;Concepts&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;Feature&lt;/strong&gt; - A part surface&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feature of size (FOS)&lt;/strong&gt; - A cylindrical or spherical surface or a set of two
opposed elements or parallel surfaces associated with a size dimension.&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Internal FOS&lt;/em&gt; - Internal surfaces such as a hole or slot.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;External FOS&lt;/em&gt; - External surfaces such as a shaft or tab.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img alt="" class="img-250" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Feature.png" /&gt;
&lt;img alt="" class="img-250" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/FOS.png" /&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;Feature of size dimension&lt;/strong&gt; - A dimension associated with a FOS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Non-feature of size dimension&lt;/strong&gt; - A dimension not associated with a FOS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actual Local Size&lt;/strong&gt; - The value of any individual distance at any cross section of a FOS
(for example any two point measurement taken with a pair of calipers).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Envelope, Actual Mating (AME)&lt;/strong&gt; - A similar perfect counterpart - for an external feature
of size is the smallest size that can be contracted about the feature; for an
internal feature of size is the largest size that can be expanded within the
feature - so that it just contacts the surfaces at the highest points. This
surface resides outside the material.&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Related AME&lt;/em&gt; - is constrained in orientation to the applicable datums&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Unrelated AME&lt;/em&gt; - is not constrained in orientation to the applicable datums
and is rotated to align the the axis of the part&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Envelope, Actual Mininum Material&lt;/strong&gt; - a similar perfect counterpart of largest size that
can be expanded in a external FOS, and the smallest size that can be
contracted about an internal FOS. Can also be related and unrelated. This
surface resides inside the material.&lt;/li&gt;
&lt;/ul&gt;
&lt;img alt="" class="img-250" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/AME%20-%20internal.png" /&gt;
&lt;img alt="" class="img-250" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/AME-external.png" /&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;Basic dimension&lt;/strong&gt; - A dimension that represents the theoretically exact size, true
profile, orientation, or location of a feature or gage information such as
datum targets. When basic dimensions are used, they must be accompanied by
geometric tolerances. Typically denoted by enclosing the value in a
rectangle.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="material-conditions"&gt;
&lt;h2&gt;Material Conditions&lt;/h2&gt;
&lt;p&gt;Valid for features of size (FOS). Every feature of size has a maximum and
minimum material condition.&lt;/p&gt;
&lt;div class="section" id="maximum-material-condition-mmc"&gt;
&lt;h3&gt;Maximum Material Condition (MMC)&lt;/h3&gt;
&lt;p&gt;The condition in which the geometry contains the maximum amount of material
within the stated limits of size. Examples:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Smallest hole&lt;/li&gt;
&lt;li&gt;Largest shaft&lt;/li&gt;
&lt;li&gt;Narrowest slot&lt;/li&gt;
&lt;li&gt;Largest tab&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="minimum-material-condition-lmc"&gt;
&lt;h3&gt;Minimum Material Condition (LMC)&lt;/h3&gt;
&lt;p&gt;The condition in which the geometry contains the minimum amount of material
within the stated limits of size. Examples:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Largest hole&lt;/li&gt;
&lt;li&gt;Smallest shaft&lt;/li&gt;
&lt;li&gt;Largest slot&lt;/li&gt;
&lt;li&gt;Smallest tab&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="regardless-of-feature-size-rfs"&gt;
&lt;h3&gt;Regardless of Feature Size (RFS)&lt;/h3&gt;
&lt;p&gt;Indicates geometric tolerances apply at any increment of size of the feature
within its size tolerance. In other words, the geometric tolerance is valid at
whatever size the part is produced at.&lt;/p&gt;
&lt;p&gt;No symbol is associated with this condition as it is the default condition.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="modifiers"&gt;
&lt;h2&gt;Modifiers&lt;/h2&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="57%" /&gt;
&lt;col width="26%" /&gt;
&lt;col width="17%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Term&lt;/th&gt;
&lt;th class="head"&gt;Abbreviation&lt;/th&gt;
&lt;th class="head"&gt;Symbol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Maximum material condition&lt;/td&gt;
&lt;td&gt;MMC&lt;/td&gt;
&lt;td&gt;&lt;img alt="image1" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/MMC.PNG" style="height: 35px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Least material condition&lt;/td&gt;
&lt;td&gt;LMC&lt;/td&gt;
&lt;td&gt;&lt;img alt="image2" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/LMC.PNG" style="height: 35px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Projected tolerance zone&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;img alt="image3" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Projected%20Tolerance%20Zone.PNG" style="height: 35px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Tangent plane&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;img alt="image4" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Tangent%20Zone.PNG" style="height: 35px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Diameter&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;img alt="image5" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Diameter.PNG" style="height: 35px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Radius&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;img alt="image6" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Radius.PNG" style="height: 35px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Controlled radius&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;img alt="image7" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Controlled%20Radius.PNG" style="height: 35px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Reference&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;( )&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="feature-control-frame"&gt;
&lt;h2&gt;Feature Control Frame&lt;/h2&gt;
&lt;p&gt;Geometric tolerances specified on a drawing use a feature control frame for
their syntax. This consists of a rectangular box divided into three main
subdivisions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;geometric characteristic symbol&lt;/li&gt;
&lt;li&gt;tolerance value + any modifiers&lt;/li&gt;
&lt;li&gt;datums&lt;/li&gt;
&lt;/ul&gt;
&lt;img alt="" class="img-350" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Feature_control_frame.2.png" /&gt;
&lt;/div&gt;
&lt;div class="section" id="rule-1"&gt;
&lt;h2&gt;Rule #1&lt;/h2&gt;
&lt;blockquote&gt;
Where only a tolerance of size is specified, the limits of size of an individual
feature prescribe the extent to which variations in its form and its size are
allowed.&lt;/blockquote&gt;
&lt;p&gt;This is often paraphrased as &amp;quot;perfect form at MMC&amp;quot;. At MMC, no further deviation
in form is allowed. When the size departs from MMC, some form error is allowed.
(Perfect form means all applicable form controls: straightness, flatness,
circularity, and cylindricity.)&lt;/p&gt;
&lt;p&gt;Can be overridden when a straightness control is applied to a FOS or if a note
explicitly stating such is included.&lt;/p&gt;
&lt;p&gt;Rule #1 does not affect the location, orientation, or relationship between
features of size.&lt;/p&gt;
&lt;p&gt;Does not apply to parts that are flexible or to stock parts (e.g. bar stock,
tubing, etc.).&lt;/p&gt;
&lt;p&gt;Inspection may be performed with a Go gage for FOS at MMC and a No-Go gage for
FOS at LMC.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="rule-2"&gt;
&lt;h2&gt;Rule #2&lt;/h2&gt;
&lt;blockquote&gt;
RFS applies, with respect to the individual tolerance, datum reference, or both,
where no modifying symbol is specified. MMC or LMC must be specified on the
drawing where required.&lt;/blockquote&gt;
&lt;p&gt;Where a geometric tolerance is applied on an RFS basis, the tolerance is limited
to the specified value regardless of the actual size of the feature.&lt;/p&gt;
&lt;/div&gt;
</content><category term="GD&amp;T"/></entry><entry><title>Geometric Characteristic Symbols</title><link href="https://www.robsiegwart.com/geometric-characteristic-symbols.html" rel="alternate"/><published>2021-05-25T00:00:00-05:00</published><updated>2021-05-25T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-05-25:/geometric-characteristic-symbols.html</id><summary type="html"/><content type="html">&lt;div class="section" id="form"&gt;
&lt;h2&gt;Form&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Never&lt;/strong&gt; uses a datum as a reference.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="74%" /&gt;
&lt;col width="26%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Characteristic&lt;/th&gt;
&lt;th class="head"&gt;Symbol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Straightness&lt;/td&gt;
&lt;td&gt;&lt;img alt="image1" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Straightness.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Flatness&lt;/td&gt;
&lt;td&gt;&lt;img alt="image2" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Flatness.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Circularity (Roundness)&lt;/td&gt;
&lt;td&gt;&lt;img alt="image3" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Circularity.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Cylindricity&lt;/td&gt;
&lt;td&gt;&lt;img alt="image4" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Cylindricity.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="profile"&gt;
&lt;h2&gt;Profile&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sometimes&lt;/strong&gt; uses a datum as a reference.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="71%" /&gt;
&lt;col width="29%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Characteristic&lt;/th&gt;
&lt;th class="head"&gt;Symbol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Profile of a line&lt;/td&gt;
&lt;td&gt;&lt;img alt="image5" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Profile%20of%20a%20line.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Profile of a surface&lt;/td&gt;
&lt;td&gt;&lt;img alt="image6" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Profile%20of%20a%20surface.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="orientation"&gt;
&lt;h2&gt;Orientation&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Always&lt;/strong&gt; uses a datum as a reference.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="67%" /&gt;
&lt;col width="33%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Characteristic&lt;/th&gt;
&lt;th class="head"&gt;Symbol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Angularity&lt;/td&gt;
&lt;td&gt;&lt;img alt="image7" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Angularity.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Perpendicularity&lt;/td&gt;
&lt;td&gt;&lt;img alt="image8" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Perpendicularity.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Parallelism&lt;/td&gt;
&lt;td&gt;&lt;img alt="image9" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Parallelism.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="location"&gt;
&lt;h2&gt;Location&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Always&lt;/strong&gt; uses a datum as a reference.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="61%" /&gt;
&lt;col width="39%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Characteristic&lt;/th&gt;
&lt;th class="head"&gt;Symbol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Position&lt;/td&gt;
&lt;td&gt;&lt;img alt="image10" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Position.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Concentricity&lt;/td&gt;
&lt;td&gt;&lt;img alt="image11" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Concentricity.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Symmetry&lt;/td&gt;
&lt;td&gt;&lt;img alt="image12" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Symmetry.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="runout"&gt;
&lt;h2&gt;Runout&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Always&lt;/strong&gt; uses a datum as a reference.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="63%" /&gt;
&lt;col width="38%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Characteristic&lt;/th&gt;
&lt;th class="head"&gt;Symbol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Circular runout&lt;/td&gt;
&lt;td&gt;&lt;img alt="image13" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Circular%20runout.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total runout&lt;/td&gt;
&lt;td&gt;&lt;img alt="image14" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/GD&amp;amp;T/Total%20runout.png" style="height: 50px;" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="GD&amp;T"/></entry><entry><title>ASTM A36</title><link href="https://www.robsiegwart.com/astm-a36.html" rel="alternate"/><published>2021-05-17T00:00:00-05:00</published><updated>2021-05-20T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-05-17:/astm-a36.html</id><summary type="html">&lt;p class="first last"&gt;Summary of properties for ASTM A36&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;ASTM A36/A36M - 05&lt;/strong&gt; - &lt;em&gt;Standard Specification for Carbon Structural Steel&lt;/em&gt;&lt;/p&gt;
&lt;div class="section" id="mechanical-properties"&gt;
&lt;h2&gt;Mechanical Properties&lt;/h2&gt;
&lt;div class="section" id="strength"&gt;
&lt;h3&gt;Strength&lt;/h3&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="40%" /&gt;
&lt;col width="60%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Tensile&lt;/td&gt;
&lt;td&gt;58 - 80 ksi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Yield&lt;/td&gt;
&lt;td&gt;36 ksi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="strain"&gt;
&lt;h3&gt;Strain&lt;/h3&gt;
&lt;div class="section" id="plates-and-bars"&gt;
&lt;h4&gt;Plates and Bars&lt;/h4&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="77%" /&gt;
&lt;col width="23%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Elongation in 8 in&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Elongation in 2 in&lt;/td&gt;
&lt;td&gt;23%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="shapes"&gt;
&lt;h4&gt;Shapes&lt;/h4&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="77%" /&gt;
&lt;col width="23%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Elongation in 8 in&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Elongation in 2 in&lt;/td&gt;
&lt;td&gt;21%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="chemical-properties"&gt;
&lt;h2&gt;Chemical Properties&lt;/h2&gt;
&lt;p&gt;All shapes and sizes:&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="59%" /&gt;
&lt;col width="41%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Element&lt;/th&gt;
&lt;th class="head"&gt;Range, %&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Carbon&lt;/td&gt;
&lt;td&gt;0.25 - 0.29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Manganese&lt;/td&gt;
&lt;td&gt;0.6 - 0.90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Phosphorus, max&lt;/td&gt;
&lt;td&gt;0.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Sulfur, max&lt;/td&gt;
&lt;td&gt;0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Silicon&lt;/td&gt;
&lt;td&gt;0.15 - 0.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Copper, min&lt;/td&gt;
&lt;td&gt;0.20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="Engineering Reference"/><category term="material data"/></entry><entry><title>ASTM A500</title><link href="https://www.robsiegwart.com/astm-a500.html" rel="alternate"/><published>2021-05-17T00:00:00-05:00</published><updated>2021-05-20T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-05-17:/astm-a500.html</id><summary type="html">&lt;p class="first last"&gt;Summary of properties for ASTM A500&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;ASTM A500-03a (2003 revision a)&lt;/strong&gt; &lt;em&gt;Standard Specification for Cold-Formed
Welded and Seamless Carbon Steel Structural Tubing in Rounds and Shapes&lt;/em&gt;&lt;/p&gt;
&lt;div class="section" id="mechanical"&gt;
&lt;h2&gt;Mechanical&lt;/h2&gt;
&lt;div class="section" id="round-structural-tubing"&gt;
&lt;h3&gt;Round Structural Tubing&lt;/h3&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="44%" /&gt;
&lt;col width="14%" /&gt;
&lt;col width="14%" /&gt;
&lt;col width="14%" /&gt;
&lt;col width="14%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Property&lt;/th&gt;
&lt;th class="head"&gt;Grade A&lt;/th&gt;
&lt;th class="head"&gt;Grade B&lt;/th&gt;
&lt;th class="head"&gt;Grade C&lt;/th&gt;
&lt;th class="head"&gt;Grade D&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Yield (psi)&lt;/td&gt;
&lt;td&gt;33,000&lt;/td&gt;
&lt;td&gt;42,000&lt;/td&gt;
&lt;td&gt;46,000&lt;/td&gt;
&lt;td&gt;36,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Tensile (psi)&lt;/td&gt;
&lt;td&gt;45,000&lt;/td&gt;
&lt;td&gt;58,000&lt;/td&gt;
&lt;td&gt;62,000&lt;/td&gt;
&lt;td&gt;58,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Elongation in 2 in (%)&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="shaped-structural-tubing"&gt;
&lt;h3&gt;Shaped Structural Tubing&lt;/h3&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="44%" /&gt;
&lt;col width="14%" /&gt;
&lt;col width="14%" /&gt;
&lt;col width="14%" /&gt;
&lt;col width="14%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;&amp;nbsp;&lt;/th&gt;
&lt;th class="head"&gt;&amp;nbsp;&lt;/th&gt;
&lt;th class="head"&gt;&amp;nbsp;&lt;/th&gt;
&lt;th class="head"&gt;&amp;nbsp;&lt;/th&gt;
&lt;th class="head"&gt;&amp;nbsp;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Yield (psi)&lt;/td&gt;
&lt;td&gt;39,000&lt;/td&gt;
&lt;td&gt;46,000&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;36,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Tensile (psi)&lt;/td&gt;
&lt;td&gt;45,000&lt;/td&gt;
&lt;td&gt;58,000&lt;/td&gt;
&lt;td&gt;62,000&lt;/td&gt;
&lt;td&gt;58,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Elongation in 2 in (%)&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="tolerance"&gt;
&lt;h2&gt;Tolerance&lt;/h2&gt;
&lt;div class="section" id="round-tubing"&gt;
&lt;h3&gt;Round Tubing&lt;/h3&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="72%" /&gt;
&lt;col width="28%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Up to 1.900 OD&lt;/td&gt;
&lt;td&gt;+/-0.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Greater than 2.00+ OD&lt;/td&gt;
&lt;td&gt;+/- 0.75%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="square-and-rectangular-tubing"&gt;
&lt;h3&gt;Square and Rectangular Tubing&lt;/h3&gt;
&lt;p&gt;Permissible variations in outside flat dimensions for square and rectangular
tubing:&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="44%" /&gt;
&lt;col width="56%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Outside Large Flat (in)&lt;/th&gt;
&lt;th class="head"&gt;Permissible Variation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;&amp;lt; 2.5&lt;/td&gt;
&lt;td&gt;0.020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2.5 - 3.5&lt;/td&gt;
&lt;td&gt;0.025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3.5 - 5.5&lt;/td&gt;
&lt;td&gt;0.030&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&amp;gt; 5.5&lt;/td&gt;
&lt;td&gt;0.01 times the flat dimension&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="chemical"&gt;
&lt;h2&gt;Chemical&lt;/h2&gt;
&lt;p&gt;All grades:&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="35%" /&gt;
&lt;col width="65%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Element&lt;/th&gt;
&lt;th class="head"&gt;%&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;0.23 - 0.30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Mn&lt;/td&gt;
&lt;td&gt;0.35 - 1.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;P&lt;/td&gt;
&lt;td&gt;0.035 - 0.045&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;0.035 - 0.045&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Cu&lt;/td&gt;
&lt;td&gt;0.18 - 0.20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="Engineering Reference"/><category term="material data"/></entry><entry><title>K-Factor and Bend Allowance</title><link href="https://www.robsiegwart.com/k-factor-and-bend-allowance.html" rel="alternate"/><published>2021-05-17T00:00:00-05:00</published><updated>2021-05-24T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-05-17:/k-factor-and-bend-allowance.html</id><summary type="html"/><content type="html">&lt;div class="section" id="definitions"&gt;
&lt;h2&gt;Definitions&lt;/h2&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;em&gt;Bend allowance&lt;/em&gt;, &lt;span class="math"&gt;\(L_b\)&lt;/span&gt;, is the length of the neutral axis and is used to
determine the blank length of a bent part.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;position&lt;/em&gt; of the neutral axis depends on the radius and thickness of the
bend&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;div class="math"&gt;
\begin{equation*}
L_b = \alpha(R + kT)
\end{equation*}
&lt;/div&gt;
&lt;p&gt;where:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;span class="math"&gt;\(\alpha\)&lt;/span&gt; is bend angle in radians&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(R\)&lt;/span&gt; is the bend radius&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(T\)&lt;/span&gt; is the thickness of the sheet&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(k\)&lt;/span&gt; the K-Factor, a constant&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span class="math"&gt;\(k\)&lt;/span&gt; is a factor proportioning the neutral axis in the thickness direction,
with zero at the inner surface. Therefore, a smaller &lt;span class="math"&gt;\(k\)&lt;/span&gt; value places the
neutral surface closer to the inside of the bend radius.&lt;/p&gt;
&lt;p&gt;Thus, when the neutral axis is at the center of the sheet's thickness
(midplane), &lt;span class="math"&gt;\(k = 0.5\)&lt;/span&gt;. For sharp bends with a small &lt;span class="math"&gt;\(R/T\)&lt;/span&gt; ratio, the neutral
axis shifts towards the center of the bend and the factor &lt;span class="math"&gt;\(k\)&lt;/span&gt; decreases. This
causes the blank length to be smaller than the case of when it is at the
midplane.&lt;/p&gt;
&lt;p&gt;The engineering strain in a sheet during bending is:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
e=\frac{1}{(2R/T) + 1}
\end{equation*}
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="rules-of-thumb"&gt;
&lt;h2&gt;Rules of Thumb&lt;/h2&gt;
&lt;p&gt;&lt;span class="math"&gt;\(k\)&lt;/span&gt; vales range from 0.33 for &lt;span class="math"&gt;\(R&amp;lt;2T\)&lt;/span&gt; to 0.5 for &lt;span class="math"&gt;\(R &amp;gt; 2T\)&lt;/span&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="minimum-bend-radius-for-various-materials-at-room-temperature"&gt;
&lt;h2&gt;Minimum Bend Radius for Various Materials at Room Temperature&lt;/h2&gt;
&lt;p&gt;Values in this table are based on the minimum bend radius, which is that radius
which does not produce a crack in the outer fibers when bent. This is dependent
on material properties and in particular the reduction of area.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
R = T\left(\frac{50}{r} - 1\right)
\end{equation*}
&lt;/div&gt;
&lt;p&gt;where &lt;span class="math"&gt;\(r\)&lt;/span&gt; = reduction of area.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="67%" /&gt;
&lt;col width="19%" /&gt;
&lt;col width="14%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Material&lt;/th&gt;
&lt;th class="head"&gt;Soft&lt;/th&gt;
&lt;th class="head"&gt;Hard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Aluminum alloys&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;6T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Beryllium copper&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Brass, low-leaded&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Magnesium&lt;/td&gt;
&lt;td&gt;5T&lt;/td&gt;
&lt;td&gt;13T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Austenitic stainless steel&lt;/td&gt;
&lt;td&gt;0.5T&lt;/td&gt;
&lt;td&gt;6T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Low-carbon, low-alloy, HSLA&lt;/td&gt;
&lt;td&gt;0.5T&lt;/td&gt;
&lt;td&gt;4T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Titanium&lt;/td&gt;
&lt;td&gt;0.7T&lt;/td&gt;
&lt;td&gt;3T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Titanium alloys&lt;/td&gt;
&lt;td&gt;2.6T&lt;/td&gt;
&lt;td&gt;4T&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Manufacturing Engineering and Technology, Kalpakjian, 3rd Ed.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;script type='text/javascript'&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';

    var configscript = document.createElement('script');
    configscript.type = 'text/x-mathjax-config';
    configscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        availableFonts: ['STIX', 'TeX']," +
        "        preferredFont: 'STIX'," +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";

    (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="Engineering Reference"/><category term="sheet metal"/></entry><entry><title>ASTM A516</title><link href="https://www.robsiegwart.com/astm-a516.html" rel="alternate"/><published>2021-05-17T02:26:35+00:00</published><updated>2021-05-20T21:04:17+00:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-05-17:/astm-a516.html</id><summary type="html">&lt;p class="first last"&gt;Summary of properties for ASTM A516&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;ASTM A516/A516M-05&lt;/strong&gt; &lt;em&gt;Standard Specification for Pressure Vessel Plates, Carbon
Steel, for Moderate- and Lower-Temperature Service&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Four grades are contained in this specification:&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="19%" /&gt;
&lt;col width="81%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Grade&lt;/th&gt;
&lt;th class="head"&gt;Tensile Strength, ksi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;55-75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;60-80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;65-85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;70-90&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="section" id="mechanical-properties"&gt;
&lt;h2&gt;Mechanical Properties&lt;/h2&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="40%" /&gt;
&lt;col width="15%" /&gt;
&lt;col width="15%" /&gt;
&lt;col width="15%" /&gt;
&lt;col width="15%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Property&lt;/th&gt;
&lt;th class="head"&gt;Grade 55&lt;/th&gt;
&lt;th class="head"&gt;Grade 60&lt;/th&gt;
&lt;th class="head"&gt;Grade 65&lt;/th&gt;
&lt;th class="head"&gt;Grade 70&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Tensile strength, ksi&lt;/td&gt;
&lt;td&gt;55-75&lt;/td&gt;
&lt;td&gt;60-80&lt;/td&gt;
&lt;td&gt;65-85&lt;/td&gt;
&lt;td&gt;70-90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Yield strength, ksi&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Elongation in 8 in, %&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Elongation in 2 in, %&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="chemical-properties"&gt;
&lt;h2&gt;Chemical Properties&lt;/h2&gt;
&lt;p&gt;Values are aggregated across all sizes.&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="22%" /&gt;
&lt;col width="20%" /&gt;
&lt;col width="20%" /&gt;
&lt;col width="20%" /&gt;
&lt;col width="20%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Element&lt;/th&gt;
&lt;th class="head"&gt;Grade 55&lt;/th&gt;
&lt;th class="head"&gt;Grade 60&lt;/th&gt;
&lt;th class="head"&gt;Grade 65&lt;/th&gt;
&lt;th class="head"&gt;Grade 70&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Carbon&lt;/td&gt;
&lt;td&gt;0.18-0.26&lt;/td&gt;
&lt;td&gt;0.21-0.27&lt;/td&gt;
&lt;td&gt;0.24-0.29&lt;/td&gt;
&lt;td&gt;0.27-0.31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Manganese&lt;/td&gt;
&lt;td&gt;0.60-1.30&lt;/td&gt;
&lt;td&gt;0.60-1.30&lt;/td&gt;
&lt;td&gt;0.79-1.30&lt;/td&gt;
&lt;td&gt;0.79-1.30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Phosphorus&lt;/td&gt;
&lt;td&gt;0.035&lt;/td&gt;
&lt;td&gt;0.035&lt;/td&gt;
&lt;td&gt;0.035&lt;/td&gt;
&lt;td&gt;0.035&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Sulfur&lt;/td&gt;
&lt;td&gt;0.035&lt;/td&gt;
&lt;td&gt;0.035&lt;/td&gt;
&lt;td&gt;0.035&lt;/td&gt;
&lt;td&gt;0.035&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Silicon&lt;/td&gt;
&lt;td&gt;0.13-0.45&lt;/td&gt;
&lt;td&gt;0.13-0.45&lt;/td&gt;
&lt;td&gt;0.13-0.45&lt;/td&gt;
&lt;td&gt;0.13-0.45&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="Engineering Reference"/><category term="material data"/></entry><entry><title>Bolting Materials</title><link href="https://www.robsiegwart.com/bolting-materials.html" rel="alternate"/><published>2021-05-17T02:19:45+00:00</published><updated>2021-05-17T02:19:45+00:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-05-17:/bolting-materials.html</id><summary type="html">&lt;p class="first last"&gt;Summary of SAE and ASTM bolt grades.&lt;/p&gt;
</summary><content type="html">&lt;div class="section" id="sae"&gt;
&lt;h2&gt;SAE&lt;/h2&gt;
&lt;table class="wide-table"&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Grade&lt;/th&gt;
            &lt;th&gt;Material&lt;/th&gt;
            &lt;th&gt;Size Range, in&lt;/th&gt;
            &lt;th&gt;Min UTS, ksi&lt;/th&gt;
            &lt;th&gt;Min Yield, ksi&lt;/th&gt;
            &lt;th&gt;Min Proof, ksi&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;1&lt;/td&gt;
            &lt;td&gt;Low or medium-carbon&lt;/td&gt;
            &lt;td&gt;1/4 - 1 1/2&lt;/td&gt;
            &lt;td&gt;60&lt;/td&gt;
            &lt;td&gt;36&lt;/td&gt;
            &lt;td&gt;33&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;2&lt;/td&gt;
            &lt;td&gt;Low or medium-carbon&lt;/td&gt;
            &lt;td&gt;1/4 - 3/4&lt;/td&gt;
            &lt;td&gt;74&lt;/td&gt;
            &lt;td&gt;57&lt;/td&gt;
            &lt;td&gt;55&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;7/8 - 1 1/2&lt;/td&gt;
            &lt;td&gt;60&lt;/td&gt;
            &lt;td&gt;36&lt;/td&gt;
            &lt;td&gt;33&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;4&lt;/td&gt;
            &lt;td&gt;Medium-carbon, cold drawn&lt;/td&gt;
            &lt;td&gt;1/4 - 1 1/2&lt;/td&gt;
            &lt;td&gt;115&lt;/td&gt;
            &lt;td&gt;100&lt;/td&gt;
            &lt;td&gt;65&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;5&lt;/td&gt;
            &lt;td&gt;Medium-carbon, Q&amp;amp;T&lt;/td&gt;
            &lt;td&gt;1/4 - 1&lt;/td&gt;
            &lt;td&gt;120&lt;/td&gt;
            &lt;td&gt;92&lt;/td&gt;
            &lt;td&gt;85&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;1 1/8 - 1 1/2&lt;/td&gt;
            &lt;td&gt;150&lt;/td&gt;
            &lt;td&gt;81&lt;/td&gt;
            &lt;td&gt;74&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;5.2&lt;/td&gt;
            &lt;td&gt;Low-carbon martensite, Q&amp;amp;T&lt;/td&gt;
            &lt;td&gt;1/4 - 1&lt;/td&gt;
            &lt;td&gt;120&lt;/td&gt;
            &lt;td&gt;92&lt;/td&gt;
            &lt;td&gt;85&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;7&lt;/td&gt;
            &lt;td&gt;Medium-carbon allow, Q&amp;amp;T&lt;/td&gt;
            &lt;td&gt;1/4 - 1 1/2&lt;/td&gt;
            &lt;td&gt;133&lt;/td&gt;
            &lt;td&gt;115&lt;/td&gt;
            &lt;td&gt;105&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;8&lt;/td&gt;
            &lt;td&gt;Medium-carbon allow, Q&amp;amp;T&lt;/td&gt;
            &lt;td&gt;1/4 - 1 1/2&lt;/td&gt;
            &lt;td&gt;150&lt;/td&gt;
            &lt;td&gt;130&lt;/td&gt;
            &lt;td&gt;120&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;8.2&lt;/td&gt;
            &lt;td&gt;Low-carbon martensite, Q&amp;amp;T&lt;/td&gt;
            &lt;td&gt;1/4 - 1&lt;/td&gt;
            &lt;td&gt;150&lt;/td&gt;
            &lt;td&gt;130&lt;/td&gt;
            &lt;td&gt;120&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="astm"&gt;
&lt;h2&gt;ASTM&lt;/h2&gt;
&lt;table class="wide-table"&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Class&lt;/th&gt;
            &lt;th&gt;Material&lt;/th&gt;
            &lt;th&gt;Size Range, in&lt;/th&gt;
            &lt;th&gt;Min UTS, ksi&lt;/th&gt;
            &lt;th&gt;Min Yield, ksi&lt;/th&gt;
            &lt;th&gt;Min Proof, ksi&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;A307&lt;/td&gt;
            &lt;td&gt;Low-carbon&lt;/td&gt;
            &lt;td&gt;1/4 - 1 1/2&lt;/td&gt;
            &lt;td&gt;60&lt;/td&gt;
            &lt;td&gt;36&lt;/td&gt;
            &lt;td&gt;33&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;A325, type 1*&lt;/td&gt;
            &lt;td&gt;Medium-carbon, Q&amp;amp;T&lt;/td&gt;
            &lt;td&gt;1/2 - 1&lt;/td&gt;
            &lt;td&gt;120&lt;/td&gt;
            &lt;td&gt;92&lt;/td&gt;
            &lt;td&gt;85&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;1 1/8 - 1 1/2&lt;/td&gt;
            &lt;td&gt;105&lt;/td&gt;
            &lt;td&gt;81&lt;/td&gt;
            &lt;td&gt;74&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;A325, type 2*&lt;/td&gt;
            &lt;td&gt;Medium-carbon, Q&amp;amp;T&lt;/td&gt;
            &lt;td&gt;1/2 - 1&lt;/td&gt;
            &lt;td&gt;120&lt;/td&gt;
            &lt;td&gt;92&lt;/td&gt;
            &lt;td&gt;85&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;1 1/8 - 1 1/2&lt;/td&gt;
            &lt;td&gt;105&lt;/td&gt;
            &lt;td&gt;81&lt;/td&gt;
            &lt;td&gt;74&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;A325, type 3*&lt;/td&gt;
            &lt;td&gt;Weathering steel, Q&amp;amp;T&lt;/td&gt;
            &lt;td&gt;1/2 - 1&lt;/td&gt;
            &lt;td&gt;120&lt;/td&gt;
            &lt;td&gt;92&lt;/td&gt;
            &lt;td&gt;85&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;1 1/8 - 1 1/2&lt;/td&gt;
            &lt;td&gt;105&lt;/td&gt;
            &lt;td&gt;81&lt;/td&gt;
            &lt;td&gt;74&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;A354, Gr BC&lt;/td&gt;
            &lt;td&gt;Alloy steel, Q&amp;amp;T&lt;/td&gt;
            &lt;td&gt;1/2 - 2 1/2&lt;/td&gt;
            &lt;td&gt;125&lt;/td&gt;
            &lt;td&gt;109&lt;/td&gt;
            &lt;td&gt;105&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;A354, Gr BD&lt;/td&gt;
            &lt;td&gt;Alloy steel, Q&amp;amp;T&lt;/td&gt;
            &lt;td&gt;1/4 - 4&lt;/td&gt;
            &lt;td&gt;150&lt;/td&gt;
            &lt;td&gt;130&lt;/td&gt;
            &lt;td&gt;120&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;A449&lt;/td&gt;
            &lt;td&gt;Medium-carbon, Q&amp;amp;T&lt;/td&gt;
            &lt;td&gt;1/4 - 1&lt;/td&gt;
            &lt;td&gt;120&lt;/td&gt;
            &lt;td&gt;92&lt;/td&gt;
            &lt;td&gt;85&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;1 1/8 - 1 1/2&lt;/td&gt;
            &lt;td&gt;105&lt;/td&gt;
            &lt;td&gt;81&lt;/td&gt;
            &lt;td&gt;74&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;1 3/4 - 3&lt;/td&gt;
            &lt;td&gt;90&lt;/td&gt;
            &lt;td&gt;58&lt;/td&gt;
            &lt;td&gt;55&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;A490 Typ. 1*&lt;/td&gt;
            &lt;td&gt;Alloy steel, Q&amp;amp;T&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;150&lt;/td&gt;
            &lt;td&gt;130&lt;/td&gt;
            &lt;td&gt;120&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;p&gt;* &lt;em&gt;Standards A325 and A490 were withdrawn by ASTM in 2016 and replaced by ASTM F3125.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="Engineering Reference"/><category term="bolting"/><category term="material data"/></entry><entry><title>Constant Acceleration Equations</title><link href="https://www.robsiegwart.com/constant-acceleration-equations.html" rel="alternate"/><published>2021-05-17T02:15:52+00:00</published><updated>2021-05-24T18:21:11+00:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-05-17:/constant-acceleration-equations.html</id><summary type="html">&lt;p class="first last"&gt;Summary of equations of motion for constant acceleration&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;acceleration, &lt;span class="math"&gt;\(a\)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;velocity, &lt;span class="math"&gt;\(v\)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;position, &lt;span class="math"&gt;\(x\)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;time, &lt;span class="math"&gt;\(t\)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="math"&gt;
\begin{equation*}
v = v_0 + at
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
x = x_0 + \frac{1}{2}(v + v_0)t
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
x ~= x_0 + v_0t + \frac{1}{2}at^2
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
2a(x - x_0) = v^2 - v^2
\end{equation*}
&lt;/div&gt;
&lt;script type='text/javascript'&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';

    var configscript = document.createElement('script');
    configscript.type = 'text/x-mathjax-config';
    configscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        availableFonts: ['STIX', 'TeX']," +
        "        preferredFont: 'STIX'," +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";

    (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="Engineering Reference"/></entry><entry><title>Critical Tip Velocity</title><link href="https://www.robsiegwart.com/critical-tip-velocity.html" rel="alternate"/><published>2021-05-16T00:00:00-05:00</published><updated>2022-01-23T00:00:00-06:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-05-16:/critical-tip-velocity.html</id><summary type="html"/><content type="html">&lt;p&gt;The following describes an object moving at constant velocity and impacting a
rigid obstacle, leading to pivoting and tip-over. The objective is to find the
translational velocity that causes the object to rise to the &amp;quot;just-tipping&amp;quot;
condition (maximal rise in height).&lt;/p&gt;
&lt;p&gt;The equations are based on conservation of momentum and conservation of energy.
The linear momentum is converted to an angular momentum by considering its
moment arm about the pivot point. After impact, the angular momentum is
converted from its initial value to zero at the &amp;quot;just tipping point&amp;quot;. Energy is
also conserved as the rotational kinetic energy is converted to potential
energy.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Misc/tipover.png" /&gt;
&lt;div class="section" id="variables"&gt;
&lt;h2&gt;Variables&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;span class="math"&gt;\(v_0\)&lt;/span&gt; - initial translational velocity&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(H_O\)&lt;/span&gt; - angular momentum about pivot point O&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(m\)&lt;/span&gt; - mass&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(y\)&lt;/span&gt; - vertical distance from pivot point O to center of gravity&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(I_O\)&lt;/span&gt; - moment of inertia about pivot point O&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(KE\)&lt;/span&gt; - kinetic energy&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(PE\)&lt;/span&gt; - potential energy&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(g\)&lt;/span&gt; - gravitational acceleration constant&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(h\)&lt;/span&gt; - CG height change&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(\theta_0\)&lt;/span&gt; - resting angle between the CG vector relative to the pivot
point and the horizontal plane&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(\omega\)&lt;/span&gt; - rotational velocity&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="equations"&gt;
&lt;h2&gt;Equations&lt;/h2&gt;
&lt;p&gt;Translational momentum moment,&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
H = mv_0y
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Angular momentum,&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
H_O = I_O\omega
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Rotational kinetic energy,&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
KE = \frac{1}{2}I_O\omega^2
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Potential energy,&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
PE = mgh
\end{equation*}
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="critical-tipping-velocity"&gt;
&lt;h2&gt;Critical Tipping Velocity&lt;/h2&gt;
&lt;p&gt;The initial angular velocity, &lt;span class="math"&gt;\(\omega_0\)&lt;/span&gt;, can be solved by equating the two
momentum quantities.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
H = H_O
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
\omega_0 = \frac{mv_0y}{I_O}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;After impact, for the object to rise to the just-tipping point (maximum CG
height change), the rotational kinetic energy is completely converted to
potential energy:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\frac{1}{2}I_O\omega^2 = mgh
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
\frac{1}{2}I_O \left( \frac{mv_0y}{I_O} \right)^2 = mgh
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Rearranging for the initial velocity, &lt;span class="math"&gt;\(v_0\)&lt;/span&gt;:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
v_0 = \sqrt{\frac{2ghI_O}{my^2}}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Furthermore, the CG height change &lt;span class="math"&gt;\(h\)&lt;/span&gt; is known and can be expressed in terms
of the rest angle, &lt;span class="math"&gt;\(\theta_0\)&lt;/span&gt;:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
h = r - r\sin\theta_0 = r(1-\sin\theta_0)
\end{equation*}
&lt;/div&gt;
&lt;p&gt;&lt;span class="math"&gt;\(v_0\)&lt;/span&gt; then becomes:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
v_0 = \sqrt{\frac{2gr(1-\sin\theta_0)I_O}{my^2}}
\end{equation*}
&lt;/div&gt;
&lt;/div&gt;
&lt;script type='text/javascript'&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';

    var configscript = document.createElement('script');
    configscript.type = 'text/x-mathjax-config';
    configscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        availableFonts: ['STIX', 'TeX']," +
        "        preferredFont: 'STIX'," +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";

    (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="Engineering Design"/></entry><entry><title>matplotlib Quick Ref</title><link href="https://www.robsiegwart.com/matplotlib-quick-ref.html" rel="alternate"/><published>2021-04-03T00:00:00-05:00</published><updated>2021-05-25T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2021-04-03:/matplotlib-quick-ref.html</id><summary type="html"/><content type="html">&lt;div class="section" id="preliminaries"&gt;
&lt;h2&gt;Preliminaries&lt;/h2&gt;
&lt;p&gt;To import matplotlib, the recommended way is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="basic-plotting-with-plt"&gt;
&lt;h2&gt;Basic Plotting with plt&lt;/h2&gt;
&lt;p&gt;The imported plt can be used for interactive and basic usage, similar to MATLAB.
A typical workflow might be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Assemble your data&lt;/li&gt;
&lt;li&gt;Create a plot using one of the plot types&lt;/li&gt;
&lt;li&gt;Add options, legends, axes configurations, annotations using &lt;tt class="docutils literal"&gt;plt.*&lt;/tt&gt; methods&lt;/li&gt;
&lt;li&gt;Call &lt;tt class="docutils literal"&gt;plt.show()&lt;/tt&gt; to show the plot (may or may not be needed depending on the
environment/software you are using)&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;See &lt;a class="reference external" href="https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.html"&gt;here&lt;/a&gt; for
the full list of methods and API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="some-common-methods"&gt;
&lt;h2&gt;Some Common Methods&lt;/h2&gt;
&lt;div class="section" id="plot-types"&gt;
&lt;h3&gt;Plot types&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;plt.plot&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;plt.bar&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;plt.pie&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="annotations"&gt;
&lt;h3&gt;Annotations&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;plt.axhline&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;plt.axvline&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;plt.arrow&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;plt.annotate&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;plt.text&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;plt.title&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="axis"&gt;
&lt;h3&gt;Axis&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;plt.xlabel&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;plt.ylabel&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;plt.xticks&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;plt.yticks&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;plt.xlim&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;plt.ylim&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="object-approach"&gt;
&lt;h2&gt;Object Approach&lt;/h2&gt;
&lt;p&gt;This approach is initiated by calling the &lt;a class="reference external" href="https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplots.html#matplotlib.pyplot.subplots"&gt;subplots()&lt;/a&gt;
function with returns separated &lt;a class="reference external" href="https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.html"&gt;Figure&lt;/a&gt; and
&lt;a class="reference external" href="https://matplotlib.org/stable/api/axes_api.html"&gt;Axes&lt;/a&gt; objects, allowing direct access to each respective object:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This function also allows separate figures and multi-axis figures to be created
and assigned to separate variables:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;fig2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Additionally, multiple axes (i.e. plots) in one figure can be created with &lt;tt class="docutils literal"&gt;ncols&lt;/tt&gt;
and &lt;tt class="docutils literal"&gt;nrows&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nrows&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ncols&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Use the &lt;tt class="docutils literal"&gt;sharey&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;sharex&lt;/tt&gt; arguments to share x or y axes between subplots:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nrows&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ncols&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sharey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Plot calls may then be used on the &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt; object:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To save the plot to a file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;my_figure.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To show the plot, call &lt;tt class="docutils literal"&gt;plt.show()&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;fig1.show()&lt;/tt&gt; - which one is preferable
depends on the environment and context you are using as explained
&lt;a class="reference external" href="https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure.show"&gt;here2&lt;/a&gt;.
Also, depending on your environment these may not not be needed at all (such
as in iPython/Jupyter).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuring"&gt;
&lt;h2&gt;Configuring&lt;/h2&gt;
&lt;p&gt;Color, linestyle, linewidth, and other properties of the plot can be specified
in the plot call.&lt;/p&gt;
&lt;p&gt;See &lt;a class="reference external" href="https://matplotlib.org/stable/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D"&gt;here3&lt;/a&gt;
for a full list of options.&lt;/p&gt;
&lt;div class="section" id="options"&gt;
&lt;h3&gt;Options&lt;/h3&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="30%" /&gt;
&lt;col width="70%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Property&lt;/th&gt;
&lt;th class="head"&gt;Keyword argument&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Line color&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;color&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;c&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Line width&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;linewidth&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;lw&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a class="reference external" href="https://matplotlib.org/stable/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D.set_linestyle"&gt;Line style&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;linestyle&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;ls&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a class="reference external" href="https://matplotlib.org/stable/api/markers_api.html#module-matplotlib.markers"&gt;Marker style&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;marker&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="colors"&gt;
&lt;h3&gt;Colors&lt;/h3&gt;
&lt;p&gt;Colors may be entered in a
&lt;a class="reference external" href="https://matplotlib.org/stable/tutorials/colors/colors.html"&gt;variety of ways&lt;/a&gt; - string name,
RGB tuple, HEX string, etc. A range of color names are included in matplotlib by
default. Basic colors are available in addition to those named in the
&lt;a class="reference external" href="https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart"&gt;X window system&lt;/a&gt; and the
&lt;a class="reference external" href="https://xkcd.com/color/rgb/"&gt;xkcd color survey&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Basic colors include: &lt;tt class="docutils literal"&gt;blue&lt;/tt&gt;/ &lt;tt class="docutils literal"&gt;b&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;green&lt;/tt&gt;/ &lt;tt class="docutils literal"&gt;g&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;red&lt;/tt&gt;/&lt;cite&gt;r&lt;/cite&gt;, &lt;tt class="docutils literal"&gt;cyan&lt;/tt&gt;/ &lt;tt class="docutils literal"&gt;c&lt;/tt&gt;,
&lt;tt class="docutils literal"&gt;magenta&lt;/tt&gt;/ &lt;tt class="docutils literal"&gt;m&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;yellow&lt;/tt&gt;/ &lt;tt class="docutils literal"&gt;y&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;black&lt;/tt&gt;/ &lt;tt class="docutils literal"&gt;k&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;white&lt;/tt&gt;/ &lt;tt class="docutils literal"&gt;w&lt;/tt&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="legend"&gt;
&lt;h3&gt;Legend&lt;/h3&gt;
&lt;p&gt;Add a legend by calling &lt;a class="reference external" href="https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.legend.html#matplotlib.axes.Axes.legend"&gt;ax.legend()&lt;/a&gt;.
For the legend to have names, labels are typically first specified in the plot
call with the legend keyword argument:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Velocity&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alternatively, if you store a reference or get the line object from an existing
axes, you can call:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, when calling &lt;tt class="docutils literal"&gt;ax.legend()&lt;/tt&gt; the legend generator knows names for each line.
These methods are preferred since the names and data are linked together.&lt;/p&gt;
&lt;p&gt;Placement of the legend can be set to 9 points forming a grid pattern over the
axes, by setting the &lt;tt class="docutils literal"&gt;loc&lt;/tt&gt; argument to a combination of &lt;tt class="docutils literal"&gt;upper&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;lower&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;left&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;right&lt;/tt&gt;,
&lt;tt class="docutils literal"&gt;center&lt;/tt&gt; (for example &lt;tt class="docutils literal"&gt;upper left&lt;/tt&gt;). &lt;tt class="docutils literal"&gt;center&lt;/tt&gt; only places it in the middle of both
directions. &lt;tt class="docutils literal"&gt;best&lt;/tt&gt; places the legend in the area with the minimum amount of
overlap with other elements.&lt;/p&gt;
&lt;p&gt;See the API for the many other available options.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="other-things"&gt;
&lt;h2&gt;Other Things&lt;/h2&gt;
&lt;div class="section" id="grids"&gt;
&lt;h3&gt;Grids&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.grid.html#matplotlib.axes.Axes.grid"&gt;Turning on grids&lt;/a&gt;
can be achieved with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;both&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The which argument specifies which axis to turn them on for (&lt;tt class="docutils literal"&gt;x&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;y&lt;/tt&gt;, or &lt;tt class="docutils literal"&gt;both&lt;/tt&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="styles"&gt;
&lt;h3&gt;Styles&lt;/h3&gt;
&lt;p&gt;There are some &lt;a class="reference external" href="https://matplotlib.org/stable/gallery/style_sheets/style_sheets_reference.html"&gt;predefined styles&lt;/a&gt;
to use in your plots. The style names for these include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Solarize_Light2&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_classic_test_patch&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;bmh&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;classic&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dark_background&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;fast&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;fivethirtyeight&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ggplot&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;grayscale&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;seaborn&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-bright&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-colorblind&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-dark&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-dark-palette&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-darkgrid&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-deep&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-muted&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-notebook&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-paper&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-pastel&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-poster&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-talk&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-ticks&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-white&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;seaborn-whitegrid&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;tableau-colorblind10&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A style can be turned in your session via:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To activate a style for just a specific plot, you can use the with mechanism:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Or,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="square-1-1-plots"&gt;
&lt;h3&gt;Square/1:1 plots&lt;/h3&gt;
&lt;p&gt;Use &lt;a class="reference external" href="https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_aspect.html#matplotlib.axes.Axes.set_aspect"&gt;Axes.set_aspect('equal')&lt;/a&gt;
to make the axes scales have a 1:1 ratio.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Python"/><category term="python"/></entry><entry><title>Remove "Figure" from Cross-References in Word</title><link href="https://www.robsiegwart.com/remove-figure-from-cross-references-in-word.html" rel="alternate"/><published>2020-11-06T00:00:00-06:00</published><updated>2021-04-20T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2020-11-06:/remove-figure-from-cross-references-in-word.html</id><summary type="html">&lt;p&gt;When adding Figure cross-references in Word there are 5 options for the &amp;quot;Insert
reference to&amp;quot; field, which determines what the cross-reference displays:&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="20%" /&gt;
&lt;col width="80%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Option&lt;/th&gt;
&lt;th class="head"&gt;Rendered as&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Entire Caption&lt;/td&gt;
&lt;td&gt;&lt;cite&gt;Figure 1: Lorem ipsum dolor sit amet ...&lt;/cite&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Only label and number&lt;/td&gt;
&lt;td&gt;&lt;cite&gt;Figure 1&lt;/cite&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Only caption text&lt;/td&gt;
&lt;td&gt;&lt;cite&gt;Lorem ipsum dolor sit amet ...&lt;/cite&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Page number …&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</summary><content type="html">&lt;p&gt;When adding Figure cross-references in Word there are 5 options for the &amp;quot;Insert
reference to&amp;quot; field, which determines what the cross-reference displays:&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="20%" /&gt;
&lt;col width="80%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Option&lt;/th&gt;
&lt;th class="head"&gt;Rendered as&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Entire Caption&lt;/td&gt;
&lt;td&gt;&lt;cite&gt;Figure 1: Lorem ipsum dolor sit amet ...&lt;/cite&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Only label and number&lt;/td&gt;
&lt;td&gt;&lt;cite&gt;Figure 1&lt;/cite&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Only caption text&lt;/td&gt;
&lt;td&gt;&lt;cite&gt;Lorem ipsum dolor sit amet ...&lt;/cite&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Page number&lt;/td&gt;
&lt;td&gt;(page number the figure is on)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Above/below&lt;/td&gt;
&lt;td&gt;&lt;cite&gt;above&lt;/cite&gt; if the figure is above the reference position or &lt;cite&gt;below&lt;/cite&gt; if the figure is below it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each of these contains some information about the reference. If just the figure
&lt;em&gt;number&lt;/em&gt; is desired, well, none of these will do the job. This, however can be
accomplished by adding additional formatting switches.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Misc/options.png" /&gt;
&lt;p&gt;The result of issuing &lt;tt class="docutils literal"&gt;Insert &amp;gt; &lt;span class="pre"&gt;Cross-reference&lt;/span&gt;&lt;/tt&gt; is a &lt;a class="reference external" href="https://support.microsoft.com/en-us/office/field-codes-ref-field-b2531c23-05d6-4e3b-b54f-aee24447ceb2?ui=en-US&amp;amp;rs=en-US&amp;amp;ad=US"&gt;REF&lt;/a&gt;
field code. To edit the field code, press &lt;tt class="docutils literal"&gt;Alt + F9&lt;/tt&gt;. This will toggle the display
of the document to show the contents of all field codes and allow editing. (To
return to normal view, press &lt;tt class="docutils literal"&gt;Alt + F9&lt;/tt&gt; again.)&lt;/p&gt;
&lt;p&gt;A cross-reference for a figure caption might look like:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;
{ REF _Ref55500687 \h }
&lt;/pre&gt;
&lt;p&gt;To have it just show the number and not the &amp;quot;Figure &amp;quot; portion, add the following
to the contents inside the curly braces:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;
\# &amp;quot;0&amp;quot;
&lt;/pre&gt;
&lt;p&gt;Yielding:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;
{ REF _Ref55500687 \h \# &amp;quot;0&amp;quot; }
&lt;/pre&gt;
&lt;p&gt;In some instances Word might tell you that picture switch must be the first
formatting switch. In this case just move the &lt;tt class="docutils literal"&gt;\# &amp;quot;0&amp;quot;&lt;/tt&gt; to the left before
other switches.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Misc/word_example.png" /&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://answers.microsoft.com/en-us/msoffice/forum/msoffice_word-mso_other-mso_2007/how-to-display-figure-number-only-in-cross/02ae3cd0-6c3c-401d-990c-5220d7f0be1e"&gt;Microsoft community forums answer by Stefan Blom&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><category term="Reference"/></entry><entry><title>reStructuredText Elements</title><link href="https://www.robsiegwart.com/restructuredtext-quick-ref.html" rel="alternate"/><published>2020-10-26T00:00:00-05:00</published><updated>2021-05-24T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2020-10-26:/restructuredtext-quick-ref.html</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html"&gt;reStructuredText&lt;/a&gt;
is a great markup language used in the Python world but can also be used for general text
activities. It has more specificity in its design and has more functionality
when compared to others in its class such as Markdown.&lt;/p&gt;
&lt;p&gt;It is the format for content for this website …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html"&gt;reStructuredText&lt;/a&gt;
is a great markup language used in the Python world but can also be used for general text
activities. It has more specificity in its design and has more functionality
when compared to others in its class such as Markdown.&lt;/p&gt;
&lt;p&gt;It is the format for content for this website since I use the Pelican static
site generator which natively uses RST format for writing content.&lt;/p&gt;
&lt;p&gt;The below is a side-by-side comparison of most of the reStructuredText
elements and their equivalent when processed; in this case pandoc was used to
convert from RST to html. This list also does not include all forms of each
element - for the complete specification see the link above.&lt;/p&gt;
&lt;ul class="rst_quick_ref_links_index"&gt;
  &lt;li&gt;&lt;a href="#inline_markup"&gt;inline markup&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#paragraph"&gt;paragraph&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#bullet_list"&gt;bullet list&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#enumerated_list"&gt;enumerated list&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#definition_list"&gt;definition list&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#field_list&lt;"&gt;field list&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#literal block"&gt;literal block&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#line_block"&gt;line block&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#block_quote"&gt;block quote&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#table_simple"&gt;table (simple)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#table_grid"&gt;table (grid)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#footnotes"&gt;footnotes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#citation"&gt;citation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#hyperlink_internal"&gt;hyperlink (internal)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#hyperlink_external"&gt;hyperlink (external)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#hyperlink_embedded"&gt;hyperlink (embedded)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#directive_substitution"&gt;directive substitution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;table class="wide-table"&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;reStructuredText&lt;/th&gt;
            &lt;th&gt;Result&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr id="inline_markup"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#inline-markup" target="_blank"&gt;inline markup&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;*emphasis*

**strong emphasis**

`interpreted text`

``inline literal text``&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;p&gt;&lt;em&gt;emphasis&lt;/em&gt;&lt;/p&gt;
                &lt;p&gt;&lt;strong&gt;strong emphasis&lt;/strong&gt;&lt;/p&gt;
                &lt;p&gt;&lt;span class="title-ref"&gt;interpreted text&lt;/span&gt;&lt;/p&gt;
                &lt;p&gt;&lt;code&gt;inline literal text&lt;/code&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="paragraph"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#paragraphs" target="_blank"&gt;paragraph&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Pellentesque ornare
commodo est eget tempor. Pellentesque
vitae nulla velit.

Praesent non nisl id eros gravida
tempor eget in sapien. Curabitur
vestibulum dapibus placerat.&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ornare commodo est eget tempor.
                    Pellentesque vitae nulla velit.&lt;/p&gt;

                &lt;p&gt;Praesent non nisl id eros gravida tempor eget in sapien. Curabitur vestibulum dapibus placerat.&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="bullet_list"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#bullet-lists" target="_blank"&gt;bullet list&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;- Lorem ipsum dolor sit amet
- Pellentesque ornare
- Pellentesque vitae nulla
  gravida tempor eget in sapien
- Nunc euismod tellus turpis,
  efficitur non.&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;ul&gt;
                    &lt;li&gt;Lorem ipsum dolor sit amet&lt;/li&gt;
                    &lt;li&gt;Pellentesque ornare&lt;/li&gt;
                    &lt;li&gt;Pellentesque vitae nulla gravida tempor eget in sapien&lt;/li&gt;
                    &lt;li&gt;Nunc euismod tellus turpis, efficitur non.&lt;/li&gt;
                &lt;/ul&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="enumerated_list"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#enumerated-lists" target="_blank"&gt;enumerated list&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;A. Lorem ipsum dolor sit amet,
   consectetur adipiscing elit.
B. Pellentesque ornare commodo
C. Pellentesque vitae nulla
   gravida tempor eget in sapien

a. Lorem ipsum dolor sit amet,
   consectetur adipiscing elit.
b. Pellentesque ornare commodo

  i. Lorem ipsum dolor sit amet,
      consectetur adipiscing elit.
  ii. Pellentesque ornare commodo
      est eget tempor.&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;ol type="A"&gt;
                    &lt;li&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/li&gt;
                    &lt;li&gt;Pellentesque ornare commodo&lt;/li&gt;
                    &lt;li&gt;Pellentesque vitae nulla gravida tempor eget in sapien&lt;/li&gt;
                &lt;/ol&gt;
                &lt;br&gt;
                &lt;ol type="a"&gt;
                    &lt;li&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/li&gt;
                    &lt;li&gt;Pellentesque ornare commodo
                        &lt;ol type="i"&gt;
                            &lt;li&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/li&gt;
                            &lt;li&gt;Pellentesque ornare commodo est eget tempor.&lt;/li&gt;
                        &lt;/ol&gt;
                    &lt;/li&gt;
                &lt;/ol&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="definition_list"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#definition-lists" target="_blank"&gt;definition list&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;Lorem ipsum
    dolor sit amet

    consectetur adipiscing elit.

Pellentesque
    ornare commodo est eget tempor.&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;dl&gt;
                    &lt;dt&gt;Lorem ipsum&lt;/dt&gt;
                    &lt;dd&gt;
                        &lt;p&gt;dolor sit amet&lt;/p&gt;
                        &lt;p&gt;consectetur adipiscing elit.&lt;/p&gt;
                    &lt;/dd&gt;
                    &lt;dt&gt;Pellentesque&lt;/dt&gt;
                    &lt;dd&gt;
                        &lt;p&gt;ornare commodo est eget tempor.&lt;/p&gt;
                    &lt;/dd&gt;
                &lt;/dl&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="field_list"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#field-lists" target="_blank"&gt;field list&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;:Lorem ipsum:
    dolor sit amet

    consectetur adipiscing elit.

:Pellentesque:
    ornare commodo est eget tempor.

:Vestibulum:
    - vitae arcu ex
    - Fusce aliquet faucibus rutrum
    - Integer at tortor tellus&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;dl&gt;
                    &lt;dt&gt;Lorem ipsum&lt;/dt&gt;
                    &lt;dd&gt;
                        &lt;p&gt;dolor sit amet&lt;/p&gt;
                        &lt;p&gt;consectetur adipiscing elit.&lt;/p&gt;
                    &lt;/dd&gt;
                    &lt;dt&gt;Pellentesque&lt;/dt&gt;
                    &lt;dd&gt;
                        &lt;p&gt;ornare commodo est eget tempor.&lt;/p&gt;
                    &lt;/dd&gt;
                    &lt;dt&gt;Vestibulum&lt;/dt&gt;
                    &lt;dd&gt;
                        &lt;ul&gt;
                            &lt;li&gt;vitae arcu ex&lt;/li&gt;
                            &lt;li&gt;Fusce aliquet faucibus rutrum&lt;/li&gt;
                            &lt;li&gt;Integer at tortor tellus&lt;/li&gt;
                        &lt;/ul&gt;
                    &lt;/dd&gt;
                &lt;/dl&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="literal_block"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#literal-blocks" target="_blank"&gt;literal block&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;Duis imperdiet id orci quis consequat.
Nam in sem consequat, laoreet enim ut,
aliquet nibh. Sed vitae sem ipsum.
Aliquam nec gravida dolor. &lt;span class="highlighted"&gt;::

    Morbi mollis vitae mauris ac interdum.
    Pellentesque id posuere magna, fermentum
    Nam libero lacus, elementum eu faucibus
    aliquet, venenatis quis augue.

    Quisque rutrum arcu elit, sed tempor
    sed. Donec bibendum sit amet libero&lt;/span&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;p&gt;Duis imperdiet id orci quis consequat. Nam in sem consequat, laoreet enim ut, aliquet nibh. Sed vitae
                    sem ipsum.
                    Aliquam nec gravida dolor. :&lt;/p&gt;
                &lt;pre&gt;Morbi mollis vitae mauris ac interdum.
Pellentesque id posuere magna, fermentum
Nam libero lacus, elementum eu faucibus
aliquet, venenatis quis augue.

Quisque rutrum arcu elit, sed tempor
sed. Donec bibendum sit amet libero&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="line_block"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#line-blocks" target="_blank"&gt;line block&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;| Duis imperdiet id orci quis consequat.
| Nam in sem consequat, laoreet enim ut
|
| Sed vitae sem ipsum. Aliquam nec
| mauris ac interdum. Pellentesque
| fermentum dapibus purus.
| eu faucibus aliquet&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;div&gt;Duis imperdiet id orci quis consequat.&lt;br /&gt;
                    Nam in sem consequat, laoreet enim ut&lt;br /&gt;
                    &lt;br /&gt;
                    Sed vitae sem ipsum. Aliquam nec&lt;br /&gt;
                    mauris ac interdum. Pellentesque&lt;br /&gt;
                    fermentum dapibus purus.&lt;br /&gt;
                    eu faucibus aliquet
                &lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="block_quote"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#block-quotes" target="_blank"&gt;block quote&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;Duis imperdiet id orci quis consequat.
Nam in sem consequat, laoreet enim ut,

    &lt;span class="highlighted"&gt;Morbi mollis vitae mauris ac interdum.
    Pellentesque id posuere magna, fermentum dapibus purus.
    Nam libero lacus, elementum eu faucibus
    aliquet, venenatis quis augue.

    -- Morbi mollis&lt;/span&gt;
&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;p&gt;Duis imperdiet id orci quis consequat. Nam in sem consequat, laoreet enim ut,&lt;/p&gt;
                &lt;blockquote&gt;
                    &lt;p&gt;Morbi mollis vitae mauris ac interdum. Pellentesque id posuere magna, fermentum dapibus purus.
                        Nam libero lacus,
                        elementum eu faucibus aliquet, venenatis quis augue.&lt;/p&gt;
                    &lt;p&gt;-- Morbi mollis&lt;/p&gt;
                &lt;/blockquote&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="table_simple"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#simple-tables" target="_blank"&gt;table (simple)&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;================== =======================
Morbi mollis       vitae mauris
================== =======================
Pellentesque
id posuere magna   fermentum dapibus purus
Nam libero         aliquet, venenatis quis
================== =======================&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;table&gt;
                    &lt;thead&gt;
                        &lt;tr&gt;
                            &lt;th&gt;Morbi mollis&lt;/th&gt;
                            &lt;th&gt;vitae mauris&lt;/th&gt;
                        &lt;/tr&gt;
                    &lt;/thead&gt;
                    &lt;tbody&gt;
                        &lt;tr&gt;
                            &lt;td&gt;Pellentesque&lt;/td&gt;
                            &lt;td&gt;&lt;/td&gt;
                        &lt;/tr&gt;
                        &lt;tr&gt;
                            &lt;td&gt;id posuere magna&lt;/td&gt;
                            &lt;td&gt;fermentum dapibus purus&lt;/td&gt;
                        &lt;/tr&gt;
                        &lt;tr&gt;
                            &lt;td&gt;Nam libero&lt;/td&gt;
                            &lt;td&gt;aliquet, venenatis quis&lt;/td&gt;
                        &lt;/tr&gt;
                    &lt;/tbody&gt;
                &lt;/table&gt;

            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="table_grid"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#grid-tables" target="_blank"&gt;table (grid)&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;+------------------+---------------------------+
| Morbi mollis     | vitae mauris              |
+==================+===========================+
| Pellentesque     |                           |
+------------------+---------------------------+
| id posuere magna | fermentum dapibus purus   |
+------------------+---------------------------+
| Nam libero       | aliquet, venenatis quis   |
+------------------+---------------------------+&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;table&gt;
                    &lt;thead&gt;
                        &lt;tr&gt;
                            &lt;th&gt;Morbi mollis&lt;/th&gt;
                            &lt;th&gt;vitae mauris&lt;/th&gt;
                        &lt;/tr&gt;
                    &lt;/thead&gt;
                    &lt;tbody&gt;
                        &lt;tr&gt;
                            &lt;td&gt;Pellentesque&lt;/td&gt;
                            &lt;td&gt;&lt;/td&gt;
                        &lt;/tr&gt;
                        &lt;tr&gt;
                            &lt;td&gt;id posuere magna,&lt;/td&gt;
                            &lt;td&gt;fermentum dapibus purus&lt;/td&gt;
                        &lt;/tr&gt;
                        &lt;tr&gt;
                            &lt;td&gt;Nam libero&lt;/td&gt;
                            &lt;td&gt;aliquet, venenatis quis&lt;/td&gt;
                        &lt;/tr&gt;
                    &lt;/tbody&gt;
                &lt;/table&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="footnotes"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#footnotes" target="_blank"&gt;footnotes&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Pellentesque ornare
commodo est eget tempor. Pellentesque
vitae nulla velit &lt;span class="highlighted"&gt;[1]_&lt;/span&gt;.

Praesent non nisl id eros gravida
tempor eget in sapien. Curabitur
vestibulum dapibus placerat &lt;span class="highlighted"&gt;[2]_&lt;/span&gt;.


&lt;span class="highlighted"&gt;.. [1] Lorem ipsum dolor sit amet
.. [2] Duis imperdiet id orci quis consequat.&lt;/span&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ornare commodo est eget tempor.
                    Pellentesque
                    vitae nulla velit&lt;a href="#fn1" id="fnref1" role="doc-noteref"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;.&lt;/p&gt;
                &lt;p&gt;Praesent non nisl id eros gravida tempor eget in sapien. Curabitur vestibulum dapibus placerat&lt;a
                        href="#fn2" id="fnref2" role="doc-noteref"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;.&lt;/p&gt;
                &lt;section class="footnotes" role="doc-endnotes"&gt;
                    &lt;hr /&gt;
                    &lt;ol&gt;
                        &lt;li id="fn1" role="doc-endnote"&gt;
                            &lt;p&gt;Lorem ipsum dolor sit amet&lt;a href="#fnref1" class="footnote-back"
                                    role="doc-backlink"&gt;↩︎&lt;/a&gt;&lt;/p&gt;
                        &lt;/li&gt;
                        &lt;li id="fn2" role="doc-endnote"&gt;
                            &lt;p&gt;Duis imperdiet id orci quis consequat.&lt;a href="#fnref2" role="doc-backlink"&gt;↩︎&lt;/a&gt;&lt;/p&gt;
                        &lt;/li&gt;
                    &lt;/ol&gt;
                &lt;/section&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="citation"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#citations" target="_blank"&gt;citations&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Pellentesque ornare
commodo est eget tempor. Pellentesque
vitae nulla velit &lt;span class="highlighted"&gt;[Lorem1]_&lt;/span&gt;.

&lt;span class="highlighted"&gt;.. [Lorem1] Lorem ipsum dolor sit amet&lt;/span&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ornare commodo est eget tempor.
                    Pellentesque
                    vitae nulla velit &lt;a href="#Lorem1"&gt;[Lorem1]&lt;/a&gt;.&lt;/p&gt;
                &lt;div id="citations"&gt;
                    &lt;dl&gt;
                        &lt;dt&gt;&lt;span id="Lorem1"&gt;Lorem1&lt;/span&gt;&lt;/dt&gt;
                        &lt;dd&gt;
                            &lt;p&gt;Lorem ipsum dolor sit amet&lt;/p&gt;
                        &lt;/dd&gt;
                    &lt;/dl&gt;
                &lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="hyperlink_internal"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#hyperlink-targets" target="_blank"&gt;hyperlink (internal)&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Pellentesque ornare
commodo est eget tempor. Pellentesque
vitae nulla velit.

&lt;span class="highlighted"&gt;.. _internal1:&lt;/span&gt;

The previous line specifies a hyperlink
target which links to this paragraph by
giving it an id.

Later on to link to this paragraph,
use &lt;span class="highlighted"&gt;internal1_.&lt;/span&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ornare commodo est eget tempor.
                    Pellentesque
                    vitae nulla velit.&lt;/p&gt;
                &lt;div id="internal1"&gt;
                    &lt;p&gt;The previous line specifies a hyperlink target which links to this paragraph by giving it an id.
                    &lt;/p&gt;
                &lt;/div&gt;
                &lt;p&gt;Later on to link to this paragraph, use &lt;a href="#internal1"&gt;internal1&lt;/a&gt;.&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="hyperlink_external"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#hyperlink-targets" target="_blank"&gt;hyperlink (external)&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Pellentesque ornare
commodo est eget tempor. &lt;span class="highlighted"&gt;python_&lt;/span&gt;
pellentesque vitae nulla velit.

Praesent non nisl id eros gravida
tempor eget in sapien. Curabitur
vestibulum dapibus placerat
&lt;span class="highlighted"&gt;`asme home`_&lt;/span&gt;.

&lt;span class="highlighted"&gt;.. _python: https://python.org
.. _asme home: https://asme.org&lt;/span&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ornare commodo est eget tempor.
                    &lt;a href="https://python.org"&gt;python&lt;/a&gt; pellentesque vitae nulla velit.&lt;/p&gt;
                &lt;p&gt;Praesent non nisl id eros gravida tempor eget in sapien. Curabitur vestibulum dapibus placerat &lt;a
                        href="https://asme.org"&gt;asme home&lt;/a&gt;.&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="hyperlink_embedded"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#hyperlink-targets" target="_blank"&gt;hyperlink (embedded)&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;Click &lt;span class="highlighted"&gt;`here &amp;lt;https://asme.org&amp;gt;`_&lt;/span&gt; for the ASME
home page.&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;p&gt;Click &lt;a href="https://asme.org"&gt;here&lt;/a&gt; for the ASME home page.&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr id="directive_substitution"&gt;
            &lt;td&gt;
                &lt;p class="rst_label"&gt;&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#substitution-references" target="_blank"&gt;directive substitution&lt;/a&gt;&lt;/p&gt;
                &lt;pre&gt;Lorem ipsum dolor sit amet, consectetur
adipiscing elit. &lt;span class="highlighted"&gt;|pellentesque|&lt;/span&gt; ornare
commodo est eget tempor. Pellentesque
vitae nulla velit.

Praesent non nisl id eros gravida
tempor eget in sapien. Curabitur
vestibulum dapibus placerat.

&lt;span class="highlighted"&gt;.. |pellentesque| math:: a^2 + xb^3&lt;/span&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/p&gt;
                &lt;p&gt;&lt;em&gt;a&lt;/em&gt;&lt;sup&gt;2&lt;/sup&gt; + &lt;em&gt;x&lt;/em&gt;&lt;em&gt;b&lt;/em&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/p&gt;
                &lt;p&gt;ornare commodo est
                    eget tempor. Pellentesque vitae nulla velit.&lt;/p&gt;
                &lt;p&gt;Praesent non nisl id eros gravida tempor eget in sapien. Curabitur vestibulum dapibus placerat.&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;</content><category term="Python"/><category term="python"/></entry><entry><title>SolidWorks Save-to-PDF Macro</title><link href="https://www.robsiegwart.com/solidworks-save-to-pdf-macro.html" rel="alternate"/><published>2020-03-08T00:00:00-06:00</published><updated>2020-07-07T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2020-03-08:/solidworks-save-to-pdf-macro.html</id><summary type="html">&lt;p class="first last"&gt;Developing a &amp;quot;save-to-pdf&amp;quot; macro button for SolidWorks drawings.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Saving drawings as PDF is a common task in SolidWorks. Here we will create a
macro and corresponding toolbar button to save an active SolidWorks drawing as a
PDF for better productivity. This script saves a PDF file to the current
directory and overwrites any pdf of the same name.&lt;/p&gt;
&lt;div class="section" id="record"&gt;
&lt;h2&gt;Record&lt;/h2&gt;
&lt;p&gt;Using SolidWorks' macro recorder (&lt;cite&gt;Tools &amp;gt; Macro &amp;gt; Record&lt;/cite&gt;), opening a SolidWorks
drawing and choosing &lt;cite&gt;File &amp;gt; Save As &amp;gt; PDF&lt;/cite&gt;, we get the following macro:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;&amp;#39; ******************************************************************************&lt;/span&gt;
&lt;span class="c"&gt;&amp;#39; C:\\Users\\user\\AppData\\Local\\Temp\\swx1900\\Macro1.swb - macro recorded on 03/07/20 by user&lt;/span&gt;
&lt;span class="c"&gt;&amp;#39; ******************************************************************************&lt;/span&gt;

&lt;span class="k"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;swApp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;Object&lt;/span&gt;

&lt;span class="k"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;Object&lt;/span&gt;
&lt;span class="k"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;boolstatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;Boolean&lt;/span&gt;
&lt;span class="k"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;longstatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;Long&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;longwarnings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;Long&lt;/span&gt;

&lt;span class="k"&gt;Sub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;swApp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;_
&lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SldWorks&lt;/span&gt;

&lt;span class="k"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;swApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActiveDoc&lt;/span&gt;
&lt;span class="n"&gt;longstatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SaveAs3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;lt;output_pdf_file&amp;gt;\&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;End&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Sub&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="edit"&gt;
&lt;h2&gt;Edit&lt;/h2&gt;
&lt;p&gt;In this case the output filename is hardcoded into the script (&lt;tt class="docutils literal"&gt;&amp;lt;output_pdf_file&amp;gt;&lt;/tt&gt;).
We want to change that to be the same name as the active document, just with
a &lt;tt class="docutils literal"&gt;.pdf&lt;/tt&gt; extension.&lt;/p&gt;
&lt;p&gt;To do that, we add the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;strFilename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;

&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClearSelection2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;strFilename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetPathName&lt;/span&gt;
&lt;span class="n"&gt;strFilename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strFilename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strFilename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;pdf\&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We obtain the filename from &lt;tt class="docutils literal"&gt;Part.GetPathName&lt;/tt&gt; and modify the extension with the
next line which removes the last 6 characters (&lt;tt class="docutils literal"&gt;slddrw&lt;/tt&gt;) and replaces it with pdf.&lt;/p&gt;
&lt;p&gt;Then, we replace the filename in &lt;tt class="docutils literal"&gt;Part.SaveAs3&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;longstatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SaveAs3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;strFilename&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The final script then looks like the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;swApp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;Object&lt;/span&gt;

&lt;span class="k"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;Object&lt;/span&gt;
&lt;span class="k"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;boolstatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;Boolean&lt;/span&gt;
&lt;span class="k"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;longstatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;Long&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;longwarnings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;Long&lt;/span&gt;

&lt;span class="k"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;strFilename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;

&lt;span class="k"&gt;Sub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;swApp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;_
&lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SldWorks&lt;/span&gt;

&lt;span class="k"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;swApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActiveDoc&lt;/span&gt;
&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClearSelection2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;True&lt;/span&gt;

&lt;span class="n"&gt;strFilename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetPathName&lt;/span&gt;
&lt;span class="n"&gt;strFilename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strFilename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strFilename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;pdf\&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;longstatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SaveAs3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strFilename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;End&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Sub&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The macro can be run with &lt;cite&gt;Tools &amp;gt; Macro &amp;gt; Run&lt;/cite&gt;, which will open a dialog to
choose a macro file. But this is not ideal for something that will be run
frequently.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="install"&gt;
&lt;h2&gt;Install&lt;/h2&gt;
&lt;p&gt;To install the macro in a more usable manner, we can place a shortcut to the
macro as a custom button in the SolidWorks interface. To do this we first have
to create a new macro by choosing:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;Tools &amp;gt; Macro &amp;gt; New&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;and specifying a filename and save location. Then, the macro editor is shown
where we can enter code. Copy and paste the script above into the editor and
save.&lt;/p&gt;
&lt;p&gt;Then, to add it to the toolbar, choose &lt;tt class="docutils literal"&gt;Tools &amp;gt; Customize&lt;/tt&gt;, and under the
Commands tab, select the &lt;cite&gt;Macro&lt;/cite&gt; category, and then drag the &lt;cite&gt;New Macro Button&lt;/cite&gt;
icon to the desired toolbar destination. For this example, we will place it in
the top bar for easy access.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/SolidWorksMacro/macro_dialog.png" /&gt;
&lt;p&gt;After dragging and dropping onto a toolbar, a dialog opens for us to specify
what macro to run. For the &lt;cite&gt;Macro&lt;/cite&gt; entry, browse to the macro file just created
and click Open. The &lt;cite&gt;Method&lt;/cite&gt; field should auto-populate, and references the
subroutine defined as &lt;tt class="docutils literal"&gt;main&lt;/tt&gt;. Tooltip text can be specified which will display
when the cursor hovers over the button. Additionally, a custom icon can be added
which is a 16px x 16px bitmap image. I created one here of the Acrobat logo.
Click OK and the macro button should be created.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/SolidWorksMacro/toolbar.png" /&gt;
&lt;/div&gt;
</content><category term="CAD"/><category term="solidworks"/></entry><entry><title>Experimenting with ANSYS ACT in Mechanical</title><link href="https://www.robsiegwart.com/experimenting-with-ansys-act-in-mechanical.html" rel="alternate"/><published>2019-09-07T00:00:00-05:00</published><updated>2022-03-28T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2019-09-07:/experimenting-with-ansys-act-in-mechanical.html</id><summary type="html">&lt;p class="first last"&gt;Playing around with Python integration in ANSYS Mechanical.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;ANSYS ACT is the scripting API for various ANSYS products. It is available for
Workbench, Mechanical, Fluent, and others. It uses Python 2 and in Mechanical it
allows much of the standard click operations to be accessed programmatically.&lt;/p&gt;
&lt;div class="section" id="usage"&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;In Mechanical, the ACT Console is a pane that allows for running and testing
scripts. It is accessed by clicking the white rectangular icon next to the Help
menu by default (in pre-tabbed interfaces - in ANSYS 2019R2, the program
switched to a tabbed interface).&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/experimenting-with-ansys-act-for-mechanical/btn.PNG" /&gt;
&lt;p&gt;With the ACT Console open, you have more or less a standard Python interpreter.
You issue commands in the command line (darkened area at the bottom), and see
results in the area above it. The console features auto-completion and can be
used interactively, especially while developing new scripts. New lines, such as
with &lt;cite&gt;for&lt;/cite&gt; loops, can be entered with &lt;cite&gt;SHIFT + ENTER&lt;/cite&gt;.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/experimenting-with-ansys-act-for-mechanical/console2.PNG" /&gt;
&lt;p&gt;There is a pane on the left which holds Snippets, which are simply files storing
code for reuse. You can create your own snippets for actions that you want to
remember or perform more than once. You do this by clicking on the Add Snippet
button (left most icon in the snippet portion of the toolbar). Then, when you
click on the snippet from the Bookmarks pane, the code is simply inserted into
the command line and can be executed by pressing &lt;cite&gt;ENTER&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;A collection of snippets can be grouped together and imported/exported. This
might be useful if you or your company has a set of scripts that you use. To use
this functionality, create a new group and give it a name. Drag your snippets
into it. Then, in the ACT toolbar, export the snippets to an XML file. This
exports all of the snippets, including the default ones that came loaded when
you opened the console. These can easily be removed by editing the XML file
after it is saved. In the XML file, find the group that has the name of your
group, and delete everything else, not including the parent xml tags. For
example, if I add the following snippet &lt;cite&gt;Snippet 1&lt;/cite&gt; and group &lt;cite&gt;My Snippets&lt;/cite&gt;:&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/experimenting-with-ansys-act-for-mechanical/console_2.png" /&gt;
&lt;p&gt;After exporting I find an xml file with the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cm"&gt;&amp;lt;!--?xml version=\&amp;quot;1.0\&amp;quot; encoding=\&amp;quot;utf-8\&amp;quot;?--&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;maxid=&lt;/span&gt;&lt;span class="s"&gt;\&amp;quot;5\&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;root&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;\&amp;quot;1\&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;label=&lt;/span&gt;&lt;span class="s"&gt;\&amp;quot;Folder\&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;bookmark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;\&amp;quot;2\&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;label=&lt;/span&gt;&lt;span class="s"&gt;\&amp;quot;ExtAPI\&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;\t&lt;span class="cm"&gt;&amp;lt;!--[CDATA[ExtAPI.]]--&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/bookmark&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/folder&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;\&amp;quot;4\&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;label=&lt;/span&gt;&lt;span class="s"&gt;\&amp;quot;My&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Snippets\&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;bookmark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;\&amp;quot;5\&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;label=&lt;/span&gt;&lt;span class="s"&gt;\&amp;quot;Snippet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;1\&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;\t&lt;span class="cm"&gt;&amp;lt;!--[CDATA[print Hello World!]]--&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/bookmark&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/folder&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/root&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/model&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this case I will want to simply delete the &lt;tt class="docutils literal"&gt;&amp;lt;folder&amp;gt;&lt;/tt&gt; item with the
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;label=\&amp;quot;Folder\&amp;quot;&lt;/span&gt;&lt;/tt&gt; attribute, since that is code not pertaining to my custom folder.
ANSYS stores the actual code for the snippet in the &lt;tt class="docutils literal"&gt;bookmark&lt;/tt&gt; field; in this case
the code is &lt;tt class="docutils literal"&gt;print Hello World!&lt;/tt&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="api"&gt;
&lt;h2&gt;API&lt;/h2&gt;
&lt;p&gt;An API is how operations and objects in Mechanical are retrieved and manipulated
with code. The default global variable that gives access to all objects in
Mechanical is &lt;tt class="docutils literal"&gt;ExtAPI&lt;/tt&gt;. From this you can access all other objects using Python
dot syntax. Listed below are some of the objects in Mechanical and their classes
and access points. It is common to assign these to a variable so that they do
not need to be fetched each time. For example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;solution&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ExtAPI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Analyses&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Solution&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;table class="wide-table"&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Object&lt;/th&gt;
            &lt;th width="50%"&gt;Access&lt;/th&gt;
            &lt;th&gt;Note&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;The Project&lt;/td&gt;
            &lt;td&gt;&lt;code&gt;ExtAPI.DataModel.Project&lt;/code&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;List of Analyses&lt;/td&gt;
            &lt;td&gt;&lt;code&gt;ExtAPI.DataModel.Project.Model.Analyses&lt;/code&gt;&lt;/td&gt;
            &lt;td&gt;This is list-like and indexable/loopable&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Analysis working directory&lt;/td&gt;
            &lt;td&gt;&lt;code&gt;ExtAPI.DataModel.Project.Model.Analyses[0].WorkingDir&lt;/code&gt;&lt;/td&gt;
            &lt;td&gt;Gets the working directory for the first analysis system (zeroth index)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Connections&lt;/td&gt;
            &lt;td&gt;&lt;code&gt;ExtAPI.DataModel.Project.Model.Connections&lt;/code&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Solution&lt;/td&gt;
            &lt;td&gt;&lt;code&gt;ExtAPI.DataModel.Project.Model.Analyses[0].Solution&lt;/code&gt;&lt;/td&gt;
            &lt;td&gt;This is the solution object for the first analysis system (zeroth index)&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;br&gt;
&lt;table class="wide-table"&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Object&lt;/th&gt;
            &lt;th&gt;Class&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;Force Reaction Probe&lt;/td&gt;
            &lt;td&gt;&lt;code&gt;Ansys.ACT.Automation.Mechanical.Results.ProbeResults.ForceReaction&lt;/code&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Moment Reaction Probe&lt;/td&gt;
            &lt;td&gt;&lt;code&gt;Ansys.ACT.Automation.Mechanical.Results.ProbeResults.MomentReaction&lt;/code&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Beam Probe&lt;/td&gt;
            &lt;td&gt;&lt;code&gt;Ansys.ACT.Automation.Mechanical.Results.ProbeResults.BeamProbe&lt;/code&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Tree Group Folder&lt;/td&gt;
            &lt;td&gt;&lt;code&gt;Ansys.ACT.Automation.Mechanical.TreeGroupingFolder&lt;/code&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="section" id="change-the-python-directory-to-the-user-files-directory-for-a-project"&gt;
&lt;h2&gt;Change the Python directory to the &lt;tt class="docutils literal"&gt;user_files&lt;/tt&gt; directory for a Project&lt;/h2&gt;
&lt;p&gt;Scripts that save out to a file might want to take advantage of the &lt;cite&gt;user_files&lt;/cite&gt;
directory. The &lt;cite&gt;user_files&lt;/cite&gt; directory exists at the first level of the project
files directory and is for storing user information pertaining to a Workbench
project. I haven't found the path for this as a parameter in the API directly so
the below is a way to obtain it from an analysis working directory. It splits
the path at the Workbench project folder, so &lt;cite&gt;_files&lt;/cite&gt; must not come before the
Workbench folder in the path or it will return the wrong location.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;chdir&lt;/span&gt;
&lt;span class="n"&gt;MECH_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ExtAPI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Analyses&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WorkingDir&lt;/span&gt;
&lt;span class="n"&gt;user_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MECH_dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;_files&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;_files\user_files&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;chdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="usage-example-results-exporting"&gt;
&lt;h2&gt;Usage Example: Results Exporting&lt;/h2&gt;
&lt;p&gt;One of the major limitations of Workbench / Mechanical is getting result probes
out of Mechanical and into an external file (Excel, text file, etc.). If you
only have a few result probes this is no problem - copy and paste will work
fine. However, if you have a hundred, there is not an easy way to get all of the
data and more importantly formatted as you like. Additionally, for a contact,
you will likely want a Force Probe and a Moment Probe; these are two separate
items in the Solution and you must export both and associate correctly with the
contact they are referring to. With ACT, you can &lt;a class="reference external" href="https://github.com/robsiegwart/ANSYS-ACT-snippets/blob/master/Export%20Weld%20Force-Moment%20Probes%20from%20Solution.py"&gt;programmatically loop through
these items&lt;/a&gt;
and save them to a text file.&lt;/p&gt;
&lt;div class="section" id="beams"&gt;
&lt;h3&gt;Beams&lt;/h3&gt;
&lt;p&gt;In this case you have some beams in your model defined under the Connections
folder and you'd like to export the beam probes. If you've already created a
result probe for them, you can retrieve and export them as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;solution&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ExtAPI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Analyses&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Solution&lt;/span&gt;
&lt;span class="n"&gt;beam_probes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetType&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Ansys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ACT&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Automation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Mechanical&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProbeResults&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BeamProbe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;solution&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Beam results.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Beam Probes&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Name&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;Axial Force&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;Torque&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;Shear Force at I&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;Shear Force at J&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;Moment at I&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;Moment at J&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;bp&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;beam_probes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BoundaryConditionSelection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AxialForce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Torque&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ShearForceAtI&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ShearForceAtJ&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MomentAtI&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MomentAtJ&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With the following tree, and after setting the working directory to the
&lt;tt class="docutils literal"&gt;user_files&lt;/tt&gt; directory, running the above code produces &lt;tt class="docutils literal"&gt;Beam results.txt&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="code literal-block" id="beam-results-txt"&gt;
Name    Axial Force Torque  Shear Force at I    Shear Force at J    Moment at I Moment at J

Bolt 1  23.464579153988097  -0.69336988094428165    95.214531366676013  95.214531366676013  12.945849648564687  11.227034167745025
Bolt 2  -23.464579153988097     -0.70081092496467057    104.8404773221031   104.8404773221031   14.025457881021863  12.521195678519947
&lt;/pre&gt;
&lt;p&gt;This file is tab-delimited and the bolt names come from the name of the beam
items in the Connections folder. Additionally, the unit is stripped from the
result.&lt;/p&gt;
&lt;p&gt;See full snippets on Github: &lt;a class="reference external" href="https://github.com/robsiegwart/ANSYS-ACT-snippets"&gt;https://github.com/robsiegwart/ANSYS-ACT-snippets&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="FEA"/><category term="python"/><category term="ANSYS"/></entry><entry><title>Merging and Watermarking PDF Files with Python</title><link href="https://www.robsiegwart.com/merging-and-watermarking-pdf-files-with-python.html" rel="alternate"/><published>2019-08-25T00:00:00-05:00</published><updated>2020-07-07T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2019-08-25:/merging-and-watermarking-pdf-files-with-python.html</id><summary type="html">&lt;p&gt;There are many Python libraries available for working with PDF files. Here we
will perform merging and watermarking operations with the Python library
&lt;a class="reference external" href="https://github.com/pmaupin/pdfrw"&gt;pdfrw&lt;/a&gt;. This package is bundled in the WinPython
distribution.&lt;/p&gt;
&lt;p&gt;It is assumed that your path has been set to find the correct Python interpreter
such that pdfrw …&lt;/p&gt;</summary><content type="html">&lt;p&gt;There are many Python libraries available for working with PDF files. Here we
will perform merging and watermarking operations with the Python library
&lt;a class="reference external" href="https://github.com/pmaupin/pdfrw"&gt;pdfrw&lt;/a&gt;. This package is bundled in the WinPython
distribution.&lt;/p&gt;
&lt;p&gt;It is assumed that your path has been set to find the correct Python interpreter
such that pdfrw can be imported.&lt;/p&gt;
&lt;div class="section" id="merging"&gt;
&lt;h2&gt;Merging&lt;/h2&gt;
&lt;p&gt;A merging script can be created in only a few lines of code. Let's create a
script that will merge all of the PDF files within a directory, using a command
line argument to specify the output file name. Locate the script in the same
directory as the files, and it will grab all of the files with a .pdf extension
and then combine those (in the same order as if issuing an 'ls' command) into a
single output PDF file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# merge.py&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;glob&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pdfrw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PdfReader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PdfWriter&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;output_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;*.pdf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PdfWriter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;pdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PdfReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addpages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This can then be run with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;in the terminal or command prompt.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="watermarking"&gt;
&lt;h2&gt;Watermarking&lt;/h2&gt;
&lt;p&gt;With watermarking, a separate pdf file (the watermark) is overlaid on top of
another pdf file (the base file). For the watermark to show up at the correct
location the watermark file must be the same size as the base pdf file. With
this script the first argument will be the input file to apply the watermark to,
and a second argument which is the name of the pdf file to use as the watermark.
Again the script is to reside in the same directory as the files.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# watermark.py&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pdfrw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PdfReader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PdfWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PageMerge&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;input_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;watermark_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;input_pdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PdfReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PdfReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;watermark_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;input_pdf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;merger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PageMerge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;merger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PdfWriter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.pdf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;_w.pdf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;input_pdf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To run, in a terminal or command prompt issue:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;watermark&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</content><category term="Python"/><category term="python"/></entry><entry><title>Zero Gravity Hinges - An Analysis of Microsoft's Surface Studio Hinge</title><link href="https://www.robsiegwart.com/zero-gravity-hinges-an-analysis-of-microsofts-surface-studio-hinge.html" rel="alternate"/><published>2019-07-22T00:00:00-05:00</published><updated>2021-05-17T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2019-07-22:/zero-gravity-hinges-an-analysis-of-microsofts-surface-studio-hinge.html</id><summary type="html">&lt;p class="first last"&gt;An analysis of Microsoft's Surface Studio hinge by reverse-engineering
from published promotional video footage.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Some time ago (2016), Microsoft released the Surface Studio accompanied by a
&lt;a class="reference external" href="https://www.youtube.com/watch?v=ifZXp2geVKI"&gt;great promo video&lt;/a&gt;. This product
is an all-in-one computer featuring an adjustable display that maintains its
position at any location set by the user. The hinge used with it - termed a
&amp;quot;zero gravity&amp;quot; hinge - allows for this free positioning of the display and here
we will attempt to analyze this type of design and determine how it works.&lt;/p&gt;
&lt;div class="section" id="design-notes"&gt;
&lt;h2&gt;Design Notes&lt;/h2&gt;
&lt;p&gt;Without actually deconstructing one of these I am using images from the promo
video and other publicly available information as reference.&lt;/p&gt;
&lt;p&gt;Some observations:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The support arms are not independent - it is a 1 degree-of-freedom (DOF)
system&lt;/li&gt;
&lt;li&gt;Compression springs are used in the base and torsion springs are used in the
display&lt;/li&gt;
&lt;li&gt;A four-bar linkage is used in the support arms to connect the base to the
display&lt;/li&gt;
&lt;li&gt;This can be used to give the desired orientation response of the display by
changing the lengths of the connecting members&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This &lt;a class="reference external" href="https://www.youtube.com/watch?v=ZcUhdJWhpEQ"&gt;YouTube video&lt;/a&gt; confirms these
observations.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Zero-gravity-hinge/Main%20figure.png" /&gt;
&lt;/div&gt;
&lt;div class="section" id="analysis"&gt;
&lt;h2&gt;Analysis&lt;/h2&gt;
&lt;div class="section" id="overview"&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;First we construct the overall layout and label relevant parts:&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Zero-gravity-hinge/Figure%201.PNG" /&gt;
&lt;p&gt;where,&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
m_s = \text{mass of support}
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
m_d = \text{mass of display}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;At first glance,&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;At &lt;span class="math"&gt;\(B\)&lt;/span&gt;, it appears that the moment needing resisted is only due to the
display&lt;/li&gt;
&lt;li&gt;At &lt;span class="math"&gt;\(A\)&lt;/span&gt;, the moment due to the support arms and the display need resisted&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, since the linkage has only 1 DOF, the display would be supported (i.e.
prevented from rotating) by applying a single moment anywhere along this chain
such as at location &lt;span class="math"&gt;\(B\)&lt;/span&gt; or &lt;span class="math"&gt;\(A\)&lt;/span&gt;. Thus, the moment due to the torsion
spring in the display contributes to overall support of deadweight loads.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="mechanism"&gt;
&lt;h3&gt;Mechanism&lt;/h3&gt;
&lt;p&gt;Based on screenshots from the above linked videos, there is a linkage (brown)
internal to the two supporting arms that interfaces with compression springs in
the base (purple). This linkage relates the orientation of the display with
respect to the base.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Zero-gravity-hinge/Figure%202.png" /&gt;
&lt;div class="section" id="base-compression-springs"&gt;
&lt;h4&gt;Base Compression Springs&lt;/h4&gt;
&lt;p&gt;At Point A there are a total of four compression springs that act against a
rocker arm (cyan). This provides a supporting moment at this joint. This moment
is due to the offset height &lt;span class="math"&gt;\(h\)&lt;/span&gt; and the spring force &lt;span class="math"&gt;\(f_b=k_b\Delta l_b\)&lt;/span&gt;.
Here the moment varies non-linearly as the support arm is rotated since &lt;span class="math"&gt;\(h\)&lt;/span&gt;
changes in addition to the spring force changing.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Zero-gravity-hinge/Figure%203.PNG" /&gt;
&lt;p&gt;Using the following values and properties (estimates but actually tuned to give
the best result - to see if this design could work), and the accompanying Python
code, this results in a moment response curve as shown below.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
r = 0.3 \text{ in}
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
k_{b} = 4\times40 \text{ lbf/in}
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
l_{free} = 2.5 \text{ in}
\end{equation*}
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Nomenclature:&lt;/span&gt;
&lt;span class="c1"&gt;#   r         = base hinge moment arm length, inches&lt;/span&gt;
&lt;span class="c1"&gt;#   r_fb      = position vector of the base of the compression spring from the&lt;/span&gt;
&lt;span class="c1"&gt;#               pivot point (Point A)&lt;/span&gt;
&lt;span class="c1"&gt;#   k_b       = spring constant of the base compression spring, lbf/in&lt;/span&gt;
&lt;span class="c1"&gt;#   l_free    = free length of the base compression spring&lt;/span&gt;
&lt;span class="c1"&gt;#   start     = start of base hinge rotation, degrees&lt;/span&gt;
&lt;span class="c1"&gt;#   end       = end of base hinge rotation, degrees&lt;/span&gt;
&lt;span class="c1"&gt;#   r_a       = Pivot arm position vector&lt;/span&gt;
&lt;span class="c1"&gt;#   r_afb     = Spring direction vector&lt;/span&gt;
&lt;span class="c1"&gt;#   u_fb      = Spring direction unit vector&lt;/span&gt;
&lt;span class="c1"&gt;#   f_b       = Spring force vector&lt;/span&gt;
&lt;span class="c1"&gt;#   M         = Moment = r x F&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;
&lt;span class="n"&gt;r_fb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mf"&gt;1.53&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;k_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;
&lt;span class="n"&gt;l_free&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.5&lt;/span&gt;
&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;

&lt;span class="n"&gt;spring_M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thetas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;theta&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;theta_rad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta_rad&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta_rad&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;r_afb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r_a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;r_fb&lt;/span&gt;
    &lt;span class="n"&gt;u_fb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r_afb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r_afb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k_b&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l_free&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r_afb&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;&lt;span class="n"&gt;u_fb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;M&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cross&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;f_b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;spring_M&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;thetas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thetas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spring_M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dashed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Moment due to compression springs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Rotation, deg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Torque (Moment), in-lbs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Zero-gravity-hinge/fig1.png" /&gt;
&lt;/div&gt;
&lt;div class="section" id="torsion-spring"&gt;
&lt;h4&gt;Torsion Spring&lt;/h4&gt;
&lt;p&gt;The moment due to the torsion spring is simply linear and dependent on the
torsion spring stiffness. I am assuming and using some preload on this spring as
I did with the compression spring.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Zero-gravity-hinge/Torsion%20Spring.png" /&gt;
&lt;p&gt;The following properties are used and the resulting moments plotted.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;k_d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.25&lt;/span&gt;                  &lt;span class="c1"&gt;# spring rate, lbf-in/deg&lt;/span&gt;
&lt;span class="n"&gt;k_d_pre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt;                &lt;span class="c1"&gt;# Preload amount, lbs-in&lt;/span&gt;

&lt;span class="n"&gt;tor_sp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tor_sp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;k_d&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;k_d_pre&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ax2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thetas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tor_sp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;g&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Moment due to torsion spring&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thetas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spring_M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Moment due to compression springs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dashed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="c1"&gt;# Add resisting moments of the compression springs and the torsion spring&lt;/span&gt;
&lt;span class="n"&gt;combined&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tor_sp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;spring_M&lt;/span&gt;
&lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thetas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;combined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Combined moment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Rotation, deg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Torque (Moment), in-lbs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Zero-gravity-hinge/fig2.png" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="moment-at-the-base-hinge-from-components-due-to-gravity"&gt;
&lt;h3&gt;Moment at the Base Hinge From Components Due to Gravity&lt;/h3&gt;
&lt;p&gt;Now, we calculate the loads due to deadweight. The two components involved are
the display and the support arms. Each is assigned a weight:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
m_d=10\text{ lbs}
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
m_s=4\text{ lbs, both arms}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;To assess if the display will be supported (or if it will fall or rise), we
compare the resisting moments due to the springs to the total deadweight moment.
The total deadweight moment is the resultant moment of each of the contributing
moments of the display and support arms. Maintaining the display position in any
configuration requires that the resisting moments and load moments be exactly
equal; though small amounts of difference can be taken up through friction by
the system connecting components.&lt;/p&gt;
&lt;p&gt;Calculating the deadweight moment requires analysis of the support arm linkage.
As an approximation of this we can infer the positions of the support arms and
display graphically using the following screenshots:&lt;/p&gt;
&lt;p&gt;The center of gravities are taken at the midpoint of both the support arms and
display. This allows the combined moment to be estimated:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;scipy.interpolate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;interp1d&lt;/span&gt;

&lt;span class="c1"&gt;# Measurement based approach - infer linkage from screenshot measurements&lt;/span&gt;
&lt;span class="n"&gt;r_d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.9&lt;/span&gt;              &lt;span class="c1"&gt;# distance from display pivot point to display CG, inches&lt;/span&gt;
&lt;span class="n"&gt;r_s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt;              &lt;span class="c1"&gt;# distance from base pivot to support arms CG, inches&lt;/span&gt;

&lt;span class="n"&gt;m_s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.75&lt;/span&gt;             &lt;span class="c1"&gt;# mass of support arms, lbs&lt;/span&gt;
&lt;span class="n"&gt;m_d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;               &lt;span class="c1"&gt;# mass of display, lbs&lt;/span&gt;

&lt;span class="n"&gt;M_dw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;              &lt;span class="c1"&gt;# deadweight total moment, in-lbs&lt;/span&gt;

&lt;span class="c1"&gt;# support arm and display angle measurements&lt;/span&gt;
&lt;span class="n"&gt;disp_rot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;interp1d&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mf"&gt;5.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;14.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;34.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;52.8&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mf"&gt;142.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;132.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;115.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;96&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;quadratic&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;t2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;theta&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_rot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_rot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;theta_rad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;M_dw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;m_s&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;r_s&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta_rad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;m_d&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;r_s&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta_rad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;r_d&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disp_rot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ax3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ax3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;M_dw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;black&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Deadweight moment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Moment Due to Deadweight&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Moment, in-lbs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Base hinge rotation, degrees&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;fig3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fig3.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;dpi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Make a composite final figure&lt;/span&gt;
&lt;span class="n"&gt;fig4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ax4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ax4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thetas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;combined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Combined supporting moment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thetas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tor_sp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;g&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Moment due to torsion spring&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thetas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spring_M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dashed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Moment due to compression springs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;M_dw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;black&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Deadweight moment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Moment, in-lbs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Base hinge rotation, degrees&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Zero-gravity-hinge/fig3.png" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="moment-summary"&gt;
&lt;h2&gt;Moment Summary&lt;/h2&gt;
&lt;p&gt;Finally, plotting the combined moment with the deadweight moment shows
reasonable agreement. More accurate properties - component weights and CG's, in
addition to spring properties - would allow for better correlation but the
concept confirms that this configuration can result in the desired behavior.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Zero-gravity-hinge/fig4.png" /&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusions"&gt;
&lt;h2&gt;Conclusions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;The configuration of springs and linkages show that equal (or near equal)
moments are developed to create static equilibrium&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Friction between components could take up small differences in loads or
provide for some support for the user&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Tuning is accomplished primarily by selection of spring stiffenesses, spring
preload amounts (i.e. the load at resting positions), length of the base
hinge rocker arm, and potentially also by adjusting the weight and CG of the
computer components (though less desirable than adjusting spring parameters)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;script type='text/javascript'&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';

    var configscript = document.createElement('script');
    configscript.type = 'text/x-mathjax-config';
    configscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        availableFonts: ['STIX', 'TeX']," +
        "        preferredFont: 'STIX'," +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";

    (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="Engineering Design"/><category term="python"/><category term="machine design"/></entry><entry><title>Layout Sketches and Parameter-Driven Design in Fusion 360</title><link href="https://www.robsiegwart.com/layout-sketches-and-parameter-driven-design-in-fusion-360.html" rel="alternate"/><published>2019-05-06T00:00:00-05:00</published><updated>2020-07-07T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2019-05-06:/layout-sketches-and-parameter-driven-design-in-fusion-360.html</id><summary type="html">&lt;p&gt;Fusion 360 has good support for parameters in CAD documents and the ability to
drive designs using them. Here we will create a fully parametric design based on
functional design parameters, using the following table as an example. As you
can see, nominal dimensions can be specified to create different …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Fusion 360 has good support for parameters in CAD documents and the ability to
drive designs using them. Here we will create a fully parametric design based on
functional design parameters, using the following table as an example. As you
can see, nominal dimensions can be specified to create different versions of the
design:&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Demo.gif" /&gt;
&lt;div class="section" id="setup"&gt;
&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;To input parameters open the Parameters dialog which is available under the
Modify panel of the Design tab. Here we will enter all of the pertinent values
governing our design. Putting as much information here at the outset can make
the design more robust and parametric.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Parameters.PNG" /&gt;
&lt;/div&gt;
&lt;div class="section" id="layout-sketches"&gt;
&lt;h2&gt;Layout Sketches&lt;/h2&gt;
&lt;p&gt;Layout sketches are then made and dimensions linked to parameters. For the table
we will create a rectangle for the overall shape and an offset plane equal to
the height. Set the two dimensions for the rectangle equal to the width and
height variables. This is accomplished by simply typing their names in the
dimension field text. Fusion 360 gives you some suggestions after you start
typing to which you can hit Enter to autocomplete.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Layout%20sketch%201.PNG" /&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Layout%20sketch%202.PNG" /&gt;
&lt;p&gt;These two items are sufficient for creating the table top, as seen below, simply
by adjusting the Start property of the Extrude feature. Next, we add a sketch
for one of the legs. We can add a coincident constraint to the first sketch to
keep the leg at the extents of the table, which is applied at each of the lower
left corners of the leg and table rectangles. Since we defined a leg dimension
for the structural HSS, we link the width and thickness dimensions to the
parameters (indicated by the addition of &amp;quot;fx&amp;quot;).&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Layout%20sketch%203.PNG" /&gt;
&lt;/div&gt;
&lt;div class="section" id="create-components"&gt;
&lt;h2&gt;Create Components&lt;/h2&gt;
&lt;div class="section" id="legs"&gt;
&lt;h3&gt;Legs&lt;/h3&gt;
&lt;p&gt;Now it is time to start creating components. All of the features created thus
far exist at the top level. To add a new component right click on the top of the
tree and click &amp;quot;New Component&amp;quot;. This adds a &amp;quot;Component1&amp;quot; and activates it. We
will create a Leg so we rename it &amp;quot;Leg&amp;quot;. By showing only the leg sketch we add a
new extrude and extrude the leg profile. Since we will be performing a component
pattern later, we add addional features to the component in the feet and
casters. This way anything we do here will be copied to the other three legs.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Leg%201.PNG" /&gt;
&lt;p&gt;To add a baseplate we create a new sketch on the component origin plane and by
only showing the layout leg sketch we created initially we can make sure to
constrain to that and not anything else. It is generally a good practice to
constrain and create references to upstream sketch geometry rather than to solid
features since solid features are more likely to change, and thus result in
broken references which must be repaired.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Leg%202.PNG" /&gt;
&lt;p&gt;Next we extrude this profile, add some fillets to the HSS extrusion, and add 4
holes in the base plate.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Leg%203.PNG" /&gt;
&lt;p&gt;Finally, we add a McMaster-Carr part using the built-in importing feature. We do
this while still in the Leg component since it will be included in the
rectangular pattern that we are about to do and makes some sense to think of it
as part of the leg assembly. However, it could also be added in at the top level
since that probably more realisticly reflects its location in the BOM.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Leg%204.png" /&gt;
&lt;p&gt;After doing that and adding a caster, bolt, and nut, we have a leg assembly
ready to be patterned:&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Leg%205.PNG" /&gt;
&lt;p&gt;We then activate the top level and create a Component Pattern. Select Components
as the type and click on the Leg. Click on the global X axis to set the pattern
direction and in the distance we can enter in one of our parameters, or an
expression using parameters. Our values will be: &lt;cite&gt;width - leg_width&lt;/cite&gt; for the x
value and &lt;cite&gt;depth - leg_width&lt;/cite&gt; for the z value, and adding a negative for the
z-direction.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Pattern%201.PNG" /&gt;
&lt;/div&gt;
&lt;div class="section" id="cross-members"&gt;
&lt;h3&gt;Cross Members&lt;/h3&gt;
&lt;p&gt;Next we add cross members. The procedure is the same as for the legs, making
sure to hide created bodies in order to create relations to existing sketch
geometry and not solid geometry.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Cross%201.PNG" /&gt;
&lt;p&gt;We extrude, add fillets, and pattern components to add additional members.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Cross%202.PNG" /&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Cross%203.PNG" /&gt;
&lt;/div&gt;
&lt;div class="section" id="side-plates"&gt;
&lt;h3&gt;Side Plates&lt;/h3&gt;
&lt;p&gt;To create side plates we first add a plane at the front face of the table. This
can be set by either keying in an offset equal to &lt;cite&gt;depth/2&lt;/cite&gt; or by offsetting to a
sketch point. Then, we sketch in some geometry for the plate, and make sure to
dimension it in a way that allows it to be scaled in the x-direction without
error. Additional expressions could be added here, for example to set the length
of the horizontal side lines to be some fraction of the overall width.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Side%20plate%201.PNG" /&gt;
&lt;/div&gt;
&lt;div class="section" id="top"&gt;
&lt;h3&gt;Top&lt;/h3&gt;
&lt;p&gt;Lastly, the top plate is added. Here we simply re-use the layout sketches
created initially. In the extrude dialog box, set the Start property to From
Object and select the construction plane. Then, add a Push/Pull (offset face)
feature to extend the sides over the legs, if desired.&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/layout-sketches-and-parameter-driven-design-in-fusion-360/Top%201.PNG" /&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;To complete the design I add Ground features to each component to prevent
components from moving. Apply any physical properties through the Physical
Materials context menu and at this point the design should be complete. Scaling
and resizing of the table is easy and can be accomplished by changing values in
the Parameters dialog box.&lt;/p&gt;
&lt;p&gt;The key points to this approach are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create parameters specifying all relevant and pertinent properties for your
design&lt;/li&gt;
&lt;li&gt;Create as much reference geometry in the top level as needed: sketches,
planes, axes&lt;/li&gt;
&lt;li&gt;Create components for parts&lt;/li&gt;
&lt;li&gt;Make sketches at the component level reference top-level sketches and
reference geometry&lt;/li&gt;
&lt;li&gt;Make sketch and feature dimensions incorporate parameters or parameter
expressions&lt;/li&gt;
&lt;li&gt;Add Grounds to components at the end of the timeline&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="CAD"/></entry><entry><title>Change of Basis and the Transformation Matrix</title><link href="https://www.robsiegwart.com/change-of-basis-and-the-transformation-matrix.html" rel="alternate"/><published>2019-02-15T00:00:00-06:00</published><updated>2020-07-07T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2019-02-15:/change-of-basis-and-the-transformation-matrix.html</id><summary type="html">&lt;p class="first last"&gt;Basics of transformation matrices&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A vector is represented traditionally with respect to a coordinate system. More
generally it is represented by a set of basis vectors - two vectors which are
linearly independent and form a vector subspace. A vector is therefore a linear
combination of these basis vectors. In a global cartesian coordinate system
these are the unit vectors &lt;span class="math"&gt;\(\hat{x}\)&lt;/span&gt;, &lt;span class="math"&gt;\(\hat{y}\)&lt;/span&gt;, and &lt;span class="math"&gt;\(\hat{z}\)&lt;/span&gt;.
A vector can be represented in another coordinate system by changing its basis
vectors.&lt;/p&gt;
&lt;div class="section" id="definitions"&gt;
&lt;h2&gt;Definitions&lt;/h2&gt;
&lt;p&gt;With:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;span class="math"&gt;\(M\)&lt;/span&gt;, a basis matrix containing the basis vectors as columns&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(\vec{v}\)&lt;/span&gt;, a column vector in the basis vector space &lt;span class="math"&gt;\(M\)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When written as:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\vec{a} = M\vec{v}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;the vector &lt;span class="math"&gt;\(\hat{a}\)&lt;/span&gt; is the vector in global coordinates.&lt;/p&gt;
&lt;p&gt;The reverse can be achieved to determine a vector defined by a different basis:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\vec{v}=M^{-1}\vec{a}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;This works both for 2-D and 3-D vectors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="example"&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;Let a set of basis vectors be defined as:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\begin{bmatrix}1&amp;amp;3\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\begin{bmatrix}-1&amp;amp;4\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;The basis matrix being:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
M=\begin{bmatrix}1&amp;amp;-1\\4&amp;amp;4\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;These basis vectors result in the following grid when plotted:&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/change-of-basis-and-the-transformation-matrix/Basis_csys%20-%20b.jpg" /&gt;
&lt;/div&gt;
&lt;div class="section" id="conversion-to-global-coordinates"&gt;
&lt;h2&gt;Conversion to Global Coordinates&lt;/h2&gt;
&lt;p&gt;Set a vector in this space &amp;nbsp;equal to &lt;span class="math"&gt;\(\begin{bmatrix}-2&amp;amp;3\end{bmatrix}\)&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;This vector using basis coordinates is plotted as the following:&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/change-of-basis-and-the-transformation-matrix/Basis%20to%20global%201.jpg" /&gt;
&lt;p&gt;The vector &lt;span class="math"&gt;\(\vec{a}\)&lt;/span&gt; (in global coordinates) is calculated with Eq 1. and
is therefore equal to&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\vec{a}=\begin{bmatrix}1&amp;amp;-1\\3&amp;amp;4\end{bmatrix}\begin{bmatrix}-2\\3\end{bmatrix}=\begin{bmatrix}-5&amp;amp;6\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/change-of-basis-and-the-transformation-matrix/Basis%20to%20global%202%20-%20b.jpg" /&gt;
&lt;/div&gt;
&lt;div class="section" id="converstion-to-basis-coordinates"&gt;
&lt;h2&gt;Converstion to Basis Coordinates&lt;/h2&gt;
&lt;p&gt;Using a vector in global coordinates of:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
a=\begin{bmatrix}3&amp;amp;-1\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;we have:&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/change-of-basis-and-the-transformation-matrix/Global%20to%20basis%201%20-%20b.jpg" /&gt;
&lt;p&gt;And to convert it to the basis space, we multiply the vector by the inverse of
the basis matrix.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
v=\begin{bmatrix}1&amp;amp;-1\\3&amp;amp;4\end{bmatrix}^{-1}\begin{bmatrix}3\\1\end{bmatrix}=\begin{bmatrix}0.571&amp;amp;0.143\\-0.429&amp;amp;0.143\end{bmatrix}\begin{bmatrix}3\\1\end{bmatrix}=\begin{bmatrix}1.571\\-1.429\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/change-of-basis-and-the-transformation-matrix/Global%20to%20basis%202%20-%20b.jpg" /&gt;
&lt;/div&gt;
&lt;div class="section" id="transformation-matrix"&gt;
&lt;h2&gt;Transformation Matrix&lt;/h2&gt;
&lt;p&gt;Change of basis can be used to derive transformation matices.&lt;/p&gt;
&lt;div class="section" id="rotation"&gt;
&lt;h3&gt;Rotation&lt;/h3&gt;
&lt;p&gt;Counter-clockwise rotation by an angle &lt;span class="math"&gt;\(\theta\)&lt;/span&gt; is developed using unit
vectors established by this angle:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\hat{x}=\begin{bmatrix}\cos{\theta}&amp;amp;\sin{\theta}\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
\hat{y}=\begin{bmatrix}-\sin{\theta}&amp;amp;\cos{\theta}\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
M_{rotate}=\begin{bmatrix}\cos{\theta}&amp;amp;-\sin{\theta}\\\sin{\theta}&amp;amp;\cos{\theta}\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/change-of-basis-and-the-transformation-matrix/Rotation.png" /&gt;
&lt;/div&gt;
&lt;div class="section" id="scale"&gt;
&lt;h3&gt;Scale&lt;/h3&gt;
&lt;p&gt;With scaling, the global unit vectors maintain the same orientation but are
scaled in length by a scale factor, &lt;span class="math"&gt;\(s\)&lt;/span&gt;. The new basis vectors are then the
following:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\hat{x}=\begin{bmatrix}s_x&amp;amp;1\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
\hat{y}=\begin{bmatrix}1&amp;amp;s_y\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
M_{scale}=\begin{bmatrix}s_x&amp;amp;1\\1&amp;amp;s_y\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/change-of-basis-and-the-transformation-matrix/Scale.png" /&gt;
&lt;/div&gt;
&lt;div class="section" id="shear"&gt;
&lt;h3&gt;Shear&lt;/h3&gt;
&lt;p&gt;Shearing along a principal axis may be derived as follows, for example when
along the x-axis:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\hat{x}=\begin{bmatrix}1&amp;amp;0\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
\hat{y}=\begin{bmatrix}\sin{\theta}&amp;amp;1\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
M_{shear,x}=\begin{bmatrix}1&amp;amp;\sin{\theta}\\0&amp;amp;1\end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/change-of-basis-and-the-transformation-matrix/Shear.png" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="polygon-transformation"&gt;
&lt;h2&gt;Polygon Transformation&lt;/h2&gt;
&lt;p&gt;As an example of transformation matrices, let's create and transform a generic
polygon using Python and matplotlib.&lt;/p&gt;
&lt;p&gt;Using the following points as definition:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;xy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;we obtain this polygon:&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/change-of-basis-and-the-transformation-matrix/Poly.png" /&gt;
&lt;div class="section" id="rotation-1"&gt;
&lt;h3&gt;Rotation&lt;/h3&gt;
&lt;p&gt;For a rotation of 45 degrees, counter-clockwise about the origin, the
transformation matrix becomes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;  &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;M&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hstack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;print&lt;span class="o"&gt;(&lt;/span&gt;M&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.70710678&lt;span class="w"&gt; &lt;/span&gt;-0.70710678&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.70710678&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.70710678&lt;span class="o"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The new polygon points are then calculated with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;xy_new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;xy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Adding the rotated polygon to the plot:&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/change-of-basis-and-the-transformation-matrix/Rotate_poly.png" /&gt;
&lt;/div&gt;
&lt;div class="section" id="scale-1"&gt;
&lt;h3&gt;Scale&lt;/h3&gt;
&lt;p&gt;Using scale factors of 1.9 and 1.4 for the x and y axis, respectively:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.9&lt;/span&gt;
&lt;span class="n"&gt;sy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.4&lt;/span&gt;

&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt; &lt;span class="n"&gt;sx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sy&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;M&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hstack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;print&lt;span class="o"&gt;(&lt;/span&gt;M&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.9&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.4&lt;span class="o"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We calculate the points for the scaled polygon the same way:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;xy_new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;xy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;poly_scaled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Polygon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xy_new&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edgecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;blue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And plotting:&lt;/p&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/change-of-basis-and-the-transformation-matrix/Scale_poly.png" /&gt;
&lt;/div&gt;
&lt;div class="section" id="shear-1"&gt;
&lt;h3&gt;Shear&lt;/h3&gt;
&lt;p&gt;Here we will shear along the x-axis by 45 degrees. The transformation matrix is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;

&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angle&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;M&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hstack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;print&lt;span class="o"&gt;(&lt;/span&gt;M&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.70710678&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And the sheared polygon is calculated using matrix multiplication again:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;xy_new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;xy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;poly_scaled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Polygon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xy_new&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edgecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;blue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;img alt="" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/change-of-basis-and-the-transformation-matrix/Shear_poly.png" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;script type='text/javascript'&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';

    var configscript = document.createElement('script');
    configscript.type = 'text/x-mathjax-config';
    configscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        availableFonts: ['STIX', 'TeX']," +
        "        preferredFont: 'STIX'," +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";

    (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="Mathematics"/><category term="python"/></entry><entry><title>Interpolating Logarithmic Plots for Fatigue Analysis</title><link href="https://www.robsiegwart.com/interpolating-logarithmic-plots-for-fatigue-analysis.html" rel="alternate"/><published>2019-01-23T00:00:00-06:00</published><updated>2019-01-23T00:00:00-06:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2019-01-23:/interpolating-logarithmic-plots-for-fatigue-analysis.html</id><summary type="html">&lt;p class="first last"&gt;Here we will develop some classes for interpolating general multi-linear fatigue
curves using SciPy's &lt;a class="reference external" href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html"&gt;interp1d&lt;/a&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Here we will develop some classes for interpolating general multi-linear fatigue
curves using SciPy's &lt;a class="reference external" href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html"&gt;interp1d&lt;/a&gt;. &lt;cite&gt;interp1d&lt;/cite&gt; creates a class instance which can
then be called with lookup values:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;      &lt;span class="c1"&gt;# X-axis values&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="c1"&gt;# Y-axis values&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;interp1d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;y1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;# Query at a new value, x1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="semi-log"&gt;
&lt;h2&gt;Semi-Log&lt;/h2&gt;
&lt;p&gt;Using a linear interpolation function on a semi-log graph requires that the log
of the values is used on the log axis. With fatigue curve arrays of &lt;span class="math"&gt;\(N\)&lt;/span&gt;
and &lt;span class="math"&gt;\(S\)&lt;/span&gt;, interpolating for stress can be done by:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
f=\text{interp1d}(\log_{10}N, S)
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
S_{new}=f(\log_{10}N_{new})
\end{equation*}
&lt;/div&gt;
&lt;p&gt;And interpolating for cycles:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
f=\text{interp1d}(S, \log_{10}N)
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
N_{new}=10^{f(S_{new})}
\end{equation*}
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="log-log"&gt;
&lt;h2&gt;Log-Log&lt;/h2&gt;
&lt;p&gt;Log-log calculations are the same as Semi-log but with the exception that both
axes use the logarithm of the values.&lt;/p&gt;
&lt;p&gt;To obtain stress:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
f=\text{interp1d}(\log_{10}N, \log_{10}S)
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
S_{new}=10^{f(\log_{10}N_{new})}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;To obtain cycles:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
f=\text{interp1d}(\log_{10}S, \log_{10}N)
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
N_{new}=10^{f(\log_{10}S_{new})}
\end{equation*}
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;In Python we can implement the above as classes. First a general class common to
both log-log and semi-log:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;scipy.interpolate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;interp1d&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;FatigueCurve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39; Base class for a fatigue curve.&lt;/span&gt;

&lt;span class="sd"&gt;        Parameters&lt;/span&gt;
&lt;span class="sd"&gt;        ----------&lt;/span&gt;
&lt;span class="sd"&gt;        points : list&lt;/span&gt;
&lt;span class="sd"&gt;            A list containing (N,S) data point pairs (2+)&lt;/span&gt;

&lt;span class="sd"&gt;    &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;_plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39; Plot setup method &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Cycles&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Stress&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;both&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;both&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lightgrey&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next we create classes for semi-log and log-log:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;SemiLogCurve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FatigueCurve&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getS_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;interp1d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getN_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;interp1d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;_semilogx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39; Plot an interpolated value on a semilog fatigue curve. &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;semilogx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;o&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;semilogx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;o&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;annotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;(&lt;/span&gt;&lt;span class="si"&gt;{:,.2}&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="si"&gt;{:,.2}&lt;/span&gt;&lt;span class="s1"&gt;)&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39; Interpolate stress from cycles. &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getS_f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_plot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_semilogx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39; Interpolate cycles from stress. &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getN_f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_plot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_semilogx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_plot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;semilogx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="fm"&gt;__call__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getS&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;LogLogCurve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FatigueCurve&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getS_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;interp1d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getN_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;interp1d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;_loglog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39; Plot an interpolated value on a log-log fatigue curve. &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loglog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;o&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loglog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;o&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;annotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;(&lt;/span&gt;&lt;span class="si"&gt;{:,.2}&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="si"&gt;{:,.2}&lt;/span&gt;&lt;span class="s1"&gt;)&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39; Interpolate stress from cycles &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getS_f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_plot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_loglog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39; Interpolate cycles from stress &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getN_f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_plot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_loglog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_plot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loglog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="fm"&gt;__call__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getS&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="usage"&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LogLogCurve&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="mf"&gt;1e3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;50e3&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mf"&gt;1e6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;20e3&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mf"&gt;1e7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;18e3&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;70e3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;28459&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;img alt="Logarithmic plot getting stress from cycles" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Interpolating_logarithmic_plots/getS_2.png" /&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;34e3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;18309&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;img alt="Logarithmic plot getting cycles from stress" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/Interpolating_logarithmic_plots/getN_2.png" /&gt;
&lt;/div&gt;
&lt;script type='text/javascript'&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';

    var configscript = document.createElement('script');
    configscript.type = 'text/x-mathjax-config';
    configscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        availableFonts: ['STIX', 'TeX']," +
        "        preferredFont: 'STIX'," +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";

    (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="Engineering Design"/><category term="machine design"/><category term="python"/></entry><entry><title>Failure Theories</title><link href="https://www.robsiegwart.com/failure-theories.html" rel="alternate"/><published>2015-10-06T00:00:00-05:00</published><updated>2015-10-06T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2015-10-06:/failure-theories.html</id><summary type="html"/><content type="html">&lt;p&gt;For part stresses that are multi-axial, failure theories relate the failure in a
part subjected to arbitrary multi-axial loads to that of a uni-axially loaded
test specimen. The general form of these relationships are:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
M_{part}\geq M_{specimen}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Where M is a “modulus” chosen by each theory that can be either calculated or
measured in the part and test specimen, and then compared to assess failure.
Often the modulus is a function of the principal normal or shear stresses.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
f(\sigma_1,\sigma_2,\sigma_3)\geq \sigma_c
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
f(\tau_1,\tau_2,\tau_3)\geq \tau_c
\end{equation*}
&lt;/div&gt;
&lt;p&gt;where &lt;span class="math"&gt;\(\sigma_c\)&lt;/span&gt; and &lt;span class="math"&gt;\(\tau_c\)&lt;/span&gt; are the chosen characteristic failure
strengths from the uniaxial tension test.&lt;/p&gt;
&lt;p&gt;The major theories are:&lt;/p&gt;
&lt;div class="section" id="maximum-normal-stress-theory"&gt;
&lt;h2&gt;Maximum Normal Stress Theory&lt;/h2&gt;
&lt;p&gt;Failure (i.e. yielding, fracture) is expected to occur if the maximum normal
stress in the part exceeds the maximum normal stress in test specimen at failure
(yielding, fracture).&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\max(\sigma_1,\sigma_2, \sigma_3)\geq \sigma_c
\end{equation*}
&lt;/div&gt;
&lt;div class="math"&gt;
\begin{equation*}
\min(\sigma_1,\sigma_2,\sigma_3) \leq \sigma_c
\end{equation*}
&lt;/div&gt;
&lt;p&gt;where &lt;span class="math"&gt;\(\sigma_t\)&lt;/span&gt; and &lt;span class="math"&gt;\(\sigma_c\)&lt;/span&gt; are test specimen tensile and
compressive strengths, respectively.&lt;/p&gt;
&lt;p&gt;This theory is applicable to brittle materials but not to ductile materials.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="maximum-shearing-stress-theory"&gt;
&lt;h2&gt;Maximum Shearing Stress Theory&lt;/h2&gt;
&lt;p&gt;Here failure is predicted to occur if the maximum shearing stress (the principal
shearing stress) is equal to or exceeds the maximum shear stress in a test
specimen at failure.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\max(|\tau_1|, |\tau_2|, |\tau_3|) \geq \tau_c
\end{equation*}
&lt;/div&gt;
&lt;p&gt;&lt;span class="math"&gt;\(\tau_c\)&lt;/span&gt; is the maximum shearing stress in the test specimen, and for a
uniaxial tension test the max shear stress occurs at 45 degrees to the applied
load direction and is equal to half of the first principal stress, which is the
nominal tensile stress.&lt;/p&gt;
&lt;p&gt;This theory applies well to ductile materials and to ductile yielding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="distortion-energy-theory-von-mises"&gt;
&lt;h2&gt;Distortion Energy Theory (von Mises)&lt;/h2&gt;
&lt;p&gt;This theory postulates that the distortion energy - that which contributes to
shape change and not to change in volume - affects the failure of the part.
Dilation energy, that which only changes the volume, does not contribute to the
failure of the part. The latter is produced by hydrostatic stress, which has
been shown to not induce yielding or fracture (none under compression, but
fracture under high levels of tensile stress).&lt;/p&gt;
&lt;p&gt;The equation for the distortion energy theorem is:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\frac{(\sigma_1 - \sigma_2)^2 + (\sigma_2 - \sigma_3)^2 + (\sigma_3 - \sigma_1)^2}{2} \geq \sigma_f^2
\end{equation*}
&lt;/div&gt;
&lt;p&gt;The left side of the equation when (sigma_f) is solved is the von Mises stress:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\sigma_{vm} = \sqrt{\frac{(\sigma_1-\sigma_2)^2 + (\sigma_2-\sigma_3)^2 + (\sigma_3-\sigma_1)^2}{2}}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;The yield and failure surface can be plotted, obtaining an infinite cylinder.
According to the theory all stress points that lie within the surface do not
produce failure and those outside do.&lt;/p&gt;
&lt;img alt="Von mises yield surface plot in 3 dimensions" class="img-350" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/vonMises-1-b.png" /&gt;
&lt;p&gt;For a 2D stress state, the yield surface produces an elliptical failure curve
when intersected with a plane.&lt;/p&gt;
&lt;img alt="Von mises yield surface plot in 3 dimensions" class="img-350" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/vonMises-2-c.png" /&gt;
&lt;img alt="Von mises yield surface plot in 2 dimensions with elliptical intersection with sigma1-sigma2 plane" class="img-350" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/vonMises-3-a.png" /&gt;
&lt;p&gt;This can be verified by setting &lt;span class="math"&gt;\(\sigma_3\)&lt;/span&gt; equal to 0 and plotting. With a
constant of 1:&lt;/p&gt;
&lt;img alt="Von mises yield surface plot in 2 dimensions" class="img-350" src="https://robsiegwart.nyc3.digitaloceanspaces.com/Images/ellipse_plot-a.PNG" /&gt;
&lt;/div&gt;
&lt;script type='text/javascript'&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';

    var configscript = document.createElement('script');
    configscript.type = 'text/x-mathjax-config';
    configscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        availableFonts: ['STIX', 'TeX']," +
        "        preferredFont: 'STIX'," +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";

    (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="Engineering Design"/><category term="strength of materials"/></entry><entry><title>Principal Stresses in 3D</title><link href="https://www.robsiegwart.com/principal-stresses-in-3d.html" rel="alternate"/><published>2015-09-14T00:00:00-05:00</published><updated>2015-09-14T00:00:00-05:00</updated><author><name>Rob Siegwart</name></author><id>tag:www.robsiegwart.com,2015-09-14:/principal-stresses-in-3d.html</id><summary type="html">&lt;p&gt;When a stress element is characterized by its six stress components and these
components are put in stress tensor form, the principal normal stresses are
simply the eigenvalues of the stress tensor, and the principal planes are
defined by the eigenvectors. This is easily computed using a mathematical
program such …&lt;/p&gt;</summary><content type="html">&lt;p&gt;When a stress element is characterized by its six stress components and these
components are put in stress tensor form, the principal normal stresses are
simply the eigenvalues of the stress tensor, and the principal planes are
defined by the eigenvectors. This is easily computed using a mathematical
program such as MathCAD, Matlab, etc. Here we will use Python and the
library NumPy.&lt;/p&gt;
&lt;div class="section" id="principal-normal-stress"&gt;
&lt;h2&gt;Principal Normal Stress&lt;/h2&gt;
&lt;p&gt;Put the stresses into the stress tensor form:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
S=\begin{bmatrix}\sigma_x &amp;amp; \tau_{xy} &amp;amp; \tau_{zx} \\ \tau_{xy} &amp;amp; \sigma_y &amp;amp; \tau_{yz} \\ \tau_{zx} &amp;amp; \tau_{yz} &amp;amp; \sigma_z \end{bmatrix}
\end{equation*}
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;S_xx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;S_xy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;S_zx&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
               &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;S_xy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;S_yy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;S_yz&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
               &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;S_zx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;S_yz&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;S_zz&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, compute the eigenvalues and eigenvectors. In Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;e_val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To store the eigenvalues in the variable e_val and the eigenvectors in the
variable &lt;span class="math"&gt;\(e_vec\)&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;The principal stresses can be assigned by sorting, based on the assignment
relation of &lt;span class="math"&gt;\(\sigma_1 &amp;gt; \sigma_2 &amp;gt; \sigma_3\)&lt;/span&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;p3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e_val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# sort smallest to largest&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The eigenvectors are stored as column vectors in the e_vec array. To access
these, we first need to associate the principal stresses with their positions
in the original result in order to assign them the correct vector.
To do this we will convert the original eigenvalue array to a regular list and
use standard Python indexing. Then, the vectors are extracted from the
eigenvector array using these indices.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;e_val_l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e_val&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;p1_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p2_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p3_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e_val_l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;e_val_l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;e_val_l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;p1_vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p2_vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p3_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e_vec&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt;&lt;span class="n"&gt;p1_index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;e_vec&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt;&lt;span class="n"&gt;p2_index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;e_vec&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt;&lt;span class="n"&gt;p3_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="principal-shear-stress"&gt;
&lt;h2&gt;Principal Shear Stress&lt;/h2&gt;
&lt;p&gt;The principal shearing stresses can be inferred from the usage of a Mohr circle.
In constructing a Mohr circle for a 3D stress state, the maximum shearing stress
can be shown to be one half of the difference between the maximum and minimum
principal normal stresses. From the Mohr circle the principal shearing stresses
can be determined as:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{align*}
\tau_1=(\sigma_1-\sigma_3)/2 \\
\tau_2=(\sigma_1-\sigma_2)/2 \\
\tau_3=(\sigma_2-\sigma_3)/2
\end{align*}
&lt;/div&gt;
&lt;p&gt;In Python,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;tau1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;tau2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;tau3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The principal shearing planes bisect the two principal normal planes used in
determining the principal shearing stress. The &lt;span class="math"&gt;\(\tau_1\)&lt;/span&gt; plane bisects the
&lt;span class="math"&gt;\(\sigma_1\)&lt;/span&gt; and &lt;span class="math"&gt;\(\sigma_3\)&lt;/span&gt; planes, and since all principal normal planes
are orthogonal to each other, the principal shearing planes are at 45 degrees
to each principal normal plane.&lt;/p&gt;
&lt;p&gt;To find the vectors for these planes, we compute the vector that bisects
the vectors for the normal principal stresses. Add them vectorally to obtain a
rhombus, the diagonal of which splits the rhombus into two equal segments.&lt;/p&gt;
&lt;p&gt;In Python we add our normal principal vectors and divide by the magnitude to
normalize:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;tau1_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1_vec&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;p3_vec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1_vec&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;p3_vec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tau2_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1_vec&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;p2_vec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1_vec&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;p2_vec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tau3_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p2_vec&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;p3_vec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p2_vec&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;p3_vec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;script type='text/javascript'&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';

    var configscript = document.createElement('script');
    configscript.type = 'text/x-mathjax-config';
    configscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        availableFonts: ['STIX', 'TeX']," +
        "        preferredFont: 'STIX'," +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";

    (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="Engineering Design"/><category term="python"/><category term="strength of materials"/></entry></feed>