<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Heavy Civil, Big Data</title><link href="https://www.heavycivilbigdata.com/" rel="alternate"/><link href="https://www.heavycivilbigdata.com/feeds/all.atom.xml" rel="self"/><id>https://www.heavycivilbigdata.com/</id><updated>2024-06-14T00:00:00-04:00</updated><subtitle>Thoughts on technology in AEC</subtitle><entry><title>Calculating cant alignments in IFC</title><link href="https://www.heavycivilbigdata.com/calculating-cant-alignments-in-ifc.html" rel="alternate"/><published>2024-06-14T00:00:00-04:00</published><updated>2024-06-14T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2024-06-14:/calculating-cant-alignments-in-ifc.html</id><summary type="html">&lt;p&gt;They always told me if I was using calculus, I was doing it&amp;nbsp;wrong&lt;/p&gt;</summary><content type="html">&lt;style type="text/css"&gt;/*!
*
* IPython notebook
*
*/
/* &lt;span class="caps"&gt;CSS&lt;/span&gt; font colors for translated &lt;span class="caps"&gt;ANSI&lt;/span&gt; escape sequences */
/* The color values are a mix of
   http://www.xcolors.net/dl/baskerville-ivorylight and
   http://www.xcolors.net/dl/euphrasia */
.ansi-black-fg {
  color: #&lt;span class="caps"&gt;3E424D&lt;/span&gt;;
}
.ansi-black-bg {
  background-color: #&lt;span class="caps"&gt;3E424D&lt;/span&gt;;
}
.ansi-black-intense-fg {
  color: #282C36;
}
.ansi-black-intense-bg {
  background-color: #282C36;
}
.ansi-red-fg {
  color: #&lt;span class="caps"&gt;E75C58&lt;/span&gt;;
}
.ansi-red-bg {
  background-color: #&lt;span class="caps"&gt;E75C58&lt;/span&gt;;
}
.ansi-red-intense-fg {
  color: #&lt;span class="caps"&gt;B22B31&lt;/span&gt;;
}
.ansi-red-intense-bg {
  background-color: #&lt;span class="caps"&gt;B22B31&lt;/span&gt;;
}
.ansi-green-fg {
  color: #00A250;
}
.ansi-green-bg {
  background-color: #00A250;
}
.ansi-green-intense-fg {
  color: #007427;
}
.ansi-green-intense-bg {
  background-color: #007427;
}
.ansi-yellow-fg {
  color: #&lt;span class="caps"&gt;DDB62B&lt;/span&gt;;
}
.ansi-yellow-bg {
  background-color: #&lt;span class="caps"&gt;DDB62B&lt;/span&gt;;
}
.ansi-yellow-intense-fg {
  color: #&lt;span class="caps"&gt;B27D12&lt;/span&gt;;
}
.ansi-yellow-intense-bg {
  background-color: #&lt;span class="caps"&gt;B27D12&lt;/span&gt;;
}
.ansi-blue-fg {
  color: #&lt;span class="caps"&gt;208FFB&lt;/span&gt;;
}
.ansi-blue-bg {
  background-color: #&lt;span class="caps"&gt;208FFB&lt;/span&gt;;
}
.ansi-blue-intense-fg {
  color: #&lt;span class="caps"&gt;0065CA&lt;/span&gt;;
}
.ansi-blue-intense-bg {
  background-color: #&lt;span class="caps"&gt;0065CA&lt;/span&gt;;
}
.ansi-magenta-fg {
  color: #&lt;span class="caps"&gt;D160C4&lt;/span&gt;;
}
.ansi-magenta-bg {
  background-color: #&lt;span class="caps"&gt;D160C4&lt;/span&gt;;
}
.ansi-magenta-intense-fg {
  color: #A03196;
}
.ansi-magenta-intense-bg {
  background-color: #A03196;
}
.ansi-cyan-fg {
  color: #&lt;span class="caps"&gt;60C6C8&lt;/span&gt;;
}
.ansi-cyan-bg {
  background-color: #&lt;span class="caps"&gt;60C6C8&lt;/span&gt;;
}
.ansi-cyan-intense-fg {
  color: #&lt;span class="caps"&gt;258F8F&lt;/span&gt;;
}
.ansi-cyan-intense-bg {
  background-color: #&lt;span class="caps"&gt;258F8F&lt;/span&gt;;
}
.ansi-white-fg {
  color: #&lt;span class="caps"&gt;C5C1B4&lt;/span&gt;;
}
.ansi-white-bg {
  background-color: #&lt;span class="caps"&gt;C5C1B4&lt;/span&gt;;
}
.ansi-white-intense-fg {
  color: #&lt;span class="caps"&gt;A1A6B2&lt;/span&gt;;
}
.ansi-white-intense-bg {
  background-color: #&lt;span class="caps"&gt;A1A6B2&lt;/span&gt;;
}
.ansi-default-inverse-fg {
  color: #&lt;span class="caps"&gt;FFFFFF&lt;/span&gt;;
}
.ansi-default-inverse-bg {
  background-color: #000000;
}
.ansi-bold {
  font-weight: bold;
}
.ansi-underline {
  text-decoration: underline;
}
/* The following styles are deprecated an will be removed in a future version */
.ansibold {
  font-weight: bold;
}
.ansi-inverse {
  outline: 0.5px dotted;
}
/* use dark versions for foreground, to improve visibility */
.ansiblack {
  color: black;
}
.ansired {
  color: darkred;
}
.ansigreen {
  color: darkgreen;
}
.ansiyellow {
  color: #c4a000;
}
.ansiblue {
  color: darkblue;
}
.ansipurple {
  color: darkviolet;
}
.ansicyan {
  color: steelblue;
}
.ansigray {
  color: gray;
}
/* and light for background, for the same reason */
.ansibgblack {
  background-color: black;
}
.ansibgred {
  background-color: red;
}
.ansibggreen {
  background-color: green;
}
.ansibgyellow {
  background-color: yellow;
}
.ansibgblue {
  background-color: blue;
}
.ansibgpurple {
  background-color: magenta;
}
.ansibgcyan {
  background-color: cyan;
}
.ansibggray {
  background-color: gray;
}
div.cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  border-radius: 2px;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  border-width: 1px;
  border-style: solid;
  border-color: transparent;
  width: 100%;
  padding: 5px;
  /* This acts as a spacer between cells, that is outside the border */
  margin: 0px;
  outline: none;
  position: relative;
  overflow: visible;
}
div.cell:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: transparent;
}
div.cell.jupyter-soft-selected {
  border-left-color: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
  border-left-width: 1px;
  padding-left: 5px;
  border-right-color: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
  border-right-width: 1px;
  background: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
}
@media print {
  div.cell.jupyter-soft-selected {
    border-color: transparent;
  }
}
div.cell.selected,
div.cell.selected.jupyter-soft-selected {
  border-color: #ababab;
}
div.cell.selected:before,
div.cell.selected.jupyter-soft-selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #&lt;span class="caps"&gt;42A5F5&lt;/span&gt;;
}
@media print {
  div.cell.selected,
  div.cell.selected.jupyter-soft-selected {
    border-color: transparent;
  }
}
.edit_mode div.cell.selected {
  border-color: #&lt;span class="caps"&gt;66BB6A&lt;/span&gt;;
}
.edit_mode div.cell.selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #&lt;span class="caps"&gt;66BB6A&lt;/span&gt;;
}
@media print {
  .edit_mode div.cell.selected {
    border-color: transparent;
  }
}
.prompt {
  /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */
  min-width: 14ex;
  /* This padding is tuned to match the padding on the CodeMirror editor. */
  padding: 0.4em;
  margin: 0px;
  font-family: monospace;
  text-align: right;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
  /* Don't highlight prompt number selection */
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  /* Use default cursor */
  cursor: default;
}
@media (max-width: 540px) {
  .prompt {
    text-align: left;
  }
}
div.inner_cell {
  min-width: 0;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_area {
  border: 1px solid #cfcfcf;
  border-radius: 2px;
  background: #f7f7f7;
  line-height: 1.21429em;
}
/* This is needed so that empty prompt areas can collapse to zero height when there
   is no content in the output_subarea and the prompt. The main purpose of this is
   to make sure that empty JavaScript output_subareas have no height. */
div.prompt:empty {
  padding-top: 0;
  padding-bottom: 0;
}
div.unrecognized_cell {
  padding: 5px 5px 5px 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.unrecognized_cell .inner_cell {
  border-radius: 2px;
  padding: 5px;
  font-weight: bold;
  color: red;
  border: 1px solid #cfcfcf;
  background: #eaeaea;
}
div.unrecognized_cell .inner_cell a {
  color: inherit;
  text-decoration: none;
}
div.unrecognized_cell .inner_cell a:hover {
  color: inherit;
  text-decoration: none;
}
@media (max-width: 540px) {
  div.unrecognized_cell &gt; div.prompt {
    display: none;
  }
}
div.code_cell {
  /* avoid page breaking on code cells when printing */
}
@media print {
  div.code_cell {
    page-break-inside: avoid;
  }
}
/* any special styling for code cells that are currently running goes here */
div.input {
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.input {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_prompt {
  color: #&lt;span class="caps"&gt;303F9F&lt;/span&gt;;
  border-top: 1px solid transparent;
}
div.input_area &gt; div.highlight {
  margin: 0.4em;
  border: none;
  padding: 0px;
  background-color: transparent;
}
div.input_area &gt; div.highlight &gt; pre {
  margin: 0px;
  border: none;
  padding: 0px;
  background-color: transparent;
}
/* The following gets added to the &lt;head&gt; if it is detected that the user has a
 * monospace font with inconsistent normal/bold/italic height.  See
 * notebookmain.js.  Such fonts will have keywords vertically offset with
 * respect to the rest of the text.  The user should select a better font.
 * See: https://github.com/ipython/ipython/issues/1503
 *
 * .CodeMirror span {
 *      vertical-align: bottom;
 * }
 */
.CodeMirror {
  line-height: 1.21429em;
  /* Changed from 1em to our global default */
  font-size: 14px;
  height: auto;
  /* Changed to auto to autogrow */
  background: none;
  /* Changed from white to allow our bg to show through */
}
.CodeMirror-scroll {
  /*  The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/
  /*  We have found that if it is visible, vertical scrollbars appear with font size changes.*/
  overflow-y: hidden;
  overflow-x: auto;
}
.CodeMirror-lines {
  /* In &lt;span class="caps"&gt;CM2&lt;/span&gt;, this used to be 0.4em, but in &lt;span class="caps"&gt;CM3&lt;/span&gt; it went to 4px. We need the em value because */
  /* we have set a different line-height and want this to scale with that. */
  /* Note that this should set vertical padding only, since CodeMirror assumes
       that horizontal padding will be set on CodeMirror pre */
  padding: 0.4em 0;
}
.CodeMirror-linenumber {
  padding: 0 8px 0 4px;
}
.CodeMirror-gutters {
  border-bottom-left-radius: 2px;
  border-top-left-radius: 2px;
}
.CodeMirror pre {
  /* In &lt;span class="caps"&gt;CM3&lt;/span&gt; this went to 4px from 0 in &lt;span class="caps"&gt;CM2&lt;/span&gt;. This sets horizontal padding only,
    use .CodeMirror-lines for vertical */
  padding: 0 0.4em;
  border: 0;
  border-radius: 0;
}
.CodeMirror-cursor {
  border-left: 1.4px solid black;
}
@media screen and (min-width: 2138px) and (max-width: 4319px) {
  .CodeMirror-cursor {
    border-left: 2px solid black;
  }
}
@media screen and (min-width: 4320px) {
  .CodeMirror-cursor {
    border-left: 4px solid black;
  }
}
/*

Original style from softwaremaniacs.org (c) Ivan Sagalaev &lt;Maniac@SoftwareManiacs.Org&gt;
Adapted from GitHub theme

*/
.highlight-base {
  color: #000;
}
.highlight-variable {
  color: #000;
}
.highlight-variable-2 {
  color: #1a1a1a;
}
.highlight-variable-3 {
  color: #333333;
}
.highlight-string {
  color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;;
}
.highlight-comment {
  color: #408080;
  font-style: italic;
}
.highlight-number {
  color: #080;
}
.highlight-atom {
  color: #88F;
}
.highlight-keyword {
  color: #008000;
  font-weight: bold;
}
.highlight-builtin {
  color: #008000;
}
.highlight-error {
  color: #f00;
}
.highlight-operator {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
  font-weight: bold;
}
.highlight-meta {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
}
/* previously not defined, copying from default codemirror */
.highlight-def {
  color: #00f;
}
.highlight-string-2 {
  color: #f50;
}
.highlight-qualifier {
  color: #555;
}
.highlight-bracket {
  color: #997;
}
.highlight-tag {
  color: #170;
}
.highlight-attribute {
  color: #00c;
}
.highlight-header {
  color: blue;
}
.highlight-quote {
  color: #090;
}
.highlight-link {
  color: #00c;
}
/* apply the same style to codemirror */
.cm-s-ipython span.cm-keyword {
  color: #008000;
  font-weight: bold;
}
.cm-s-ipython span.cm-atom {
  color: #88F;
}
.cm-s-ipython span.cm-number {
  color: #080;
}
.cm-s-ipython span.cm-def {
  color: #00f;
}
.cm-s-ipython span.cm-variable {
  color: #000;
}
.cm-s-ipython span.cm-operator {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
  font-weight: bold;
}
.cm-s-ipython span.cm-variable-2 {
  color: #1a1a1a;
}
.cm-s-ipython span.cm-variable-3 {
  color: #333333;
}
.cm-s-ipython span.cm-comment {
  color: #408080;
  font-style: italic;
}
.cm-s-ipython span.cm-string {
  color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;;
}
.cm-s-ipython span.cm-string-2 {
  color: #f50;
}
.cm-s-ipython span.cm-meta {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
}
.cm-s-ipython span.cm-qualifier {
  color: #555;
}
.cm-s-ipython span.cm-builtin {
  color: #008000;
}
.cm-s-ipython span.cm-bracket {
  color: #997;
}
.cm-s-ipython span.cm-tag {
  color: #170;
}
.cm-s-ipython span.cm-attribute {
  color: #00c;
}
.cm-s-ipython span.cm-header {
  color: blue;
}
.cm-s-ipython span.cm-quote {
  color: #090;
}
.cm-s-ipython span.cm-link {
  color: #00c;
}
.cm-s-ipython span.cm-error {
  color: #f00;
}
.cm-s-ipython span.cm-tab {
  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);
  background-position: right;
  background-repeat: no-repeat;
}
div.output_wrapper {
  /* this position must be relative to enable descendents to be absolute within it */
  position: relative;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  z-index: 1;
}
/* class for the output area when it should be height-limited */
div.output_scroll {
  /* ideally, this would be max-height, but &lt;span class="caps"&gt;FF&lt;/span&gt; barfs all over that */
  height: 24em;
  /* &lt;span class="caps"&gt;FF&lt;/span&gt; needs this *and the wrapper* to specify full width, or it will shrinkwrap */
  width: 100%;
  overflow: auto;
  border-radius: 2px;
  -webkit-box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  display: block;
}
/* output div while it is collapsed */
div.output_collapsed {
  margin: 0px;
  padding: 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
div.out_prompt_overlay {
  height: 100%;
  padding: 0px 0.4em;
  position: absolute;
  border-radius: 2px;
}
div.out_prompt_overlay:hover {
  /* use inner shadow to get border that is computed the same on WebKit/&lt;span class="caps"&gt;FF&lt;/span&gt; */
  -webkit-box-shadow: inset 0 0 1px #000;
  box-shadow: inset 0 0 1px #000;
  background: rgba(240, 240, 240, 0.5);
}
div.output_prompt {
  color: #D84315;
}
/* This class is the outer container of all output sections. */
div.output_area {
  padding: 0px;
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.output_area .MathJax_Display {
  text-align: left !important;
}
div.output_area 
div.output_area 
div.output_area img,
div.output_area svg {
  max-width: 100%;
  height: auto;
}
div.output_area img.unconfined,
div.output_area svg.unconfined {
  max-width: none;
}
div.output_area .mglyph &gt; img {
  max-width: none;
}
/* This is needed to protect the pre formating from global settings such
   as that of bootstrap */
.output {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.output_area {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
div.output_area pre {
  margin: 0;
  padding: 1px 0 1px 0;
  border: 0;
  vertical-align: baseline;
  color: black;
  background-color: transparent;
  border-radius: 0;
}
/* This class is for the output subarea inside the output_area and after
   the prompt div. */
div.output_subarea {
  overflow-x: auto;
  padding: 0.4em;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
  max-width: calc(100% - 14ex);
}
div.output_scroll div.output_subarea {
  overflow-x: visible;
}
/* The rest of the output_* classes are for special styling of the different
   output types */
/* all text output has this class: */
div.output_text {
  text-align: left;
  color: #000;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
}
/* stdout/stderr are 'text' as well as 'stream', but execute_result/error are *not* streams */
div.output_stderr {
  background: #fdd;
  /* very light red background for stderr */
}
div.output_latex {
  text-align: left;
}
/* Empty output_javascript divs should have no height */
div.output_javascript:empty {
  padding: 0;
}
.js-error {
  color: darkred;
}
/* raw_input styles */
div.raw_input_container {
  line-height: 1.21429em;
  padding-top: 5px;
}
pre.raw_input_prompt {
  /* nothing needed here. */
}
input.raw_input {
  font-family: monospace;
  font-size: inherit;
  color: inherit;
  width: auto;
  /* make sure input baseline aligns with prompt */
  vertical-align: baseline;
  /* padding + margin = 0.5em between prompt and cursor */
  padding: 0em 0.25em;
  margin: 0em 0.25em;
}
input.raw_input:focus {
  box-shadow: none;
}
p.p-space {
  margin-bottom: 10px;
}
div.output_unrecognized {
  padding: 5px;
  font-weight: bold;
  color: red;
}
div.output_unrecognized a {
  color: inherit;
  text-decoration: none;
}
div.output_unrecognized a:hover {
  color: inherit;
  text-decoration: none;
}
.rendered_html {
  color: #000;
  /* any extras will just be numbers: */
}



.rendered_html :link {
  text-decoration: underline;
}
.rendered_html :visited {
  text-decoration: underline;
}






.rendered_html h1:first-child {
  margin-top: 0.538em;
}
.rendered_html h2:first-child {
  margin-top: 0.636em;
}
.rendered_html h3:first-child {
  margin-top: 0.777em;
}
.rendered_html h4:first-child {
  margin-top: 1em;
}
.rendered_html h5:first-child {
  margin-top: 1em;
}
.rendered_html h6:first-child {
  margin-top: 1em;
}
.rendered_html ul:not(.list-inline),
.rendered_html ol:not(.list-inline) {
  padding-left: 2em;
}








.rendered_html * + ul {
  margin-top: 1em;
}
.rendered_html * + ol {
  margin-top: 1em;
}





.rendered_html pre,




.rendered_html tr,
.rendered_html th,


.rendered_html tbody tr:nth-child(odd) {
  background: #f5f5f5;
}
.rendered_html tbody tr:hover {
  background: rgba(66, 165, 245, 0.2);
}
.rendered_html * + table {
  margin-top: 1em;
}

.rendered_html * + p {
  margin-top: 1em;
}

.rendered_html * + img {
  margin-top: 1em;
}
.rendered_html img,

.rendered_html img.unconfined,


.rendered_html * + .alert {
  margin-top: 1em;
}
[dir="rtl"] 
div.text_cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.text_cell &gt; div.prompt {
    display: none;
  }
}
div.text_cell_render {
  /*font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;*/
  outline: none;
  resize: none;
  width: inherit;
  border-style: none;
  padding: 0.5em 0.5em 0.5em 0.4em;
  color: #000;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}
a.anchor-link:link {
  text-decoration: none;
  padding: 0px 20px;
  visibility: hidden;
}
h1:hover .anchor-link,
h2:hover .anchor-link,
h3:hover .anchor-link,
h4:hover .anchor-link,
h5:hover .anchor-link,
h6:hover .anchor-link {
  visibility: visible;
}
.text_cell.rendered .input_area {
  display: none;
}
.text_cell.rendered 
.text_cell.rendered .rendered_html tr,
.text_cell.rendered .rendered_html th,
.text_cell.rendered 
.text_cell.unrendered .text_cell_render {
  display: none;
}
.text_cell .dropzone .input_area {
  border: 2px dashed #bababa;
  margin: -1px;
}
.cm-header-1,
.cm-header-2,
.cm-header-3,
.cm-header-4,
.cm-header-5,
.cm-header-6 {
  font-weight: bold;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.cm-header-1 {
  font-size: 185.7%;
}
.cm-header-2 {
  font-size: 157.1%;
}
.cm-header-3 {
  font-size: 128.6%;
}
.cm-header-4 {
  font-size: 110%;
}
.cm-header-5 {
  font-size: 100%;
  font-style: italic;
}
.cm-header-6 {
  font-size: 100%;
  font-style: italic;
}
&lt;/style&gt;
&lt;style type="text/css"&gt;pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 .highlight pre  .hll { background-color: #ffffcc }
 .highlight pre  { background: #f8f8f8; }
 .highlight pre  .c { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment */
 .highlight pre  .err { border: 1px solid #F00 } /* Error */
 .highlight pre  .k { color: #008000; font-weight: bold } /* Keyword */
 .highlight pre  .o { color: #666 } /* Operator */
 .highlight pre  .ch { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Hashbang */
 .highlight pre  .cm { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Multiline */
 .highlight pre  .cp { color: #9C6500 } /* Comment.Preproc */
 .highlight pre  .cpf { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.PreprocFile */
 .highlight pre  .c1 { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Single */
 .highlight pre  .cs { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Special */
 .highlight pre  .gd { color: #A00000 } /* Generic.Deleted */
 .highlight pre  .ge { font-style: italic } /* Generic.Emph */
 .highlight pre  .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
 .highlight pre  .gr { color: #E40000 } /* Generic.Error */
 .highlight pre  .gh { color: #000080; font-weight: bold } /* Generic.Heading */
 .highlight pre  .gi { color: #008400 } /* Generic.Inserted */
 .highlight pre  .go { color: #717171 } /* Generic.Output */
 .highlight pre  .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
 .highlight pre  .gs { font-weight: bold } /* Generic.Strong */
 .highlight pre  .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
 .highlight pre  .gt { color: #04D } /* Generic.Traceback */
 .highlight pre  .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
 .highlight pre  .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
 .highlight pre  .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
 .highlight pre  .kp { color: #008000 } /* Keyword.Pseudo */
 .highlight pre  .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
 .highlight pre  .kt { color: #B00040 } /* Keyword.Type */
 .highlight pre  .m { color: #666 } /* Literal.Number */
 .highlight pre  .s { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String */
 .highlight pre  .na { color: #687822 } /* Name.Attribute */
 .highlight pre  .nb { color: #008000 } /* Name.Builtin */
 .highlight pre  .nc { color: #00F; font-weight: bold } /* Name.Class */
 .highlight pre  .no { color: #800 } /* Name.Constant */
 .highlight pre  .nd { color: #&lt;span class="caps"&gt;A2F&lt;/span&gt; } /* Name.Decorator */
 .highlight pre  .ni { color: #717171; font-weight: bold } /* Name.Entity */
 .highlight pre  .ne { color: #&lt;span class="caps"&gt;CB3F38&lt;/span&gt;; font-weight: bold } /* Name.Exception */
 .highlight pre  .nf { color: #00F } /* Name.Function */
 .highlight pre  .nl { color: #767600 } /* Name.Label */
 .highlight pre  .nn { color: #00F; font-weight: bold } /* Name.Namespace */
 .highlight pre  .nt { color: #008000; font-weight: bold } /* Name.Tag */
 .highlight pre  .nv { color: #19177C } /* Name.Variable */
 .highlight pre  .ow { color: #&lt;span class="caps"&gt;A2F&lt;/span&gt;; font-weight: bold } /* Operator.Word */
 .highlight pre  .w { color: #&lt;span class="caps"&gt;BBB&lt;/span&gt; } /* Text.Whitespace */
 .highlight pre  .mb { color: #666 } /* Literal.Number.Bin */
 .highlight pre  .mf { color: #666 } /* Literal.Number.Float */
 .highlight pre  .mh { color: #666 } /* Literal.Number.Hex */
 .highlight pre  .mi { color: #666 } /* Literal.Number.Integer */
 .highlight pre  .mo { color: #666 } /* Literal.Number.Oct */
 .highlight pre  .sa { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Affix */
 .highlight pre  .sb { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Backtick */
 .highlight pre  .sc { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Char */
 .highlight pre  .dl { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Delimiter */
 .highlight pre  .sd { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;; font-style: italic } /* Literal.String.Doc */
 .highlight pre  .s2 { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Double */
 .highlight pre  .se { color: #&lt;span class="caps"&gt;AA5D1F&lt;/span&gt;; font-weight: bold } /* Literal.String.Escape */
 .highlight pre  .sh { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Heredoc */
 .highlight pre  .si { color: #&lt;span class="caps"&gt;A45A77&lt;/span&gt;; font-weight: bold } /* Literal.String.Interpol */
 .highlight pre  .sx { color: #008000 } /* Literal.String.Other */
 .highlight pre  .sr { color: #&lt;span class="caps"&gt;A45A77&lt;/span&gt; } /* Literal.String.Regex */
 .highlight pre  .s1 { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Single */
 .highlight pre  .ss { color: #19177C } /* Literal.String.Symbol */
 .highlight pre  .bp { color: #008000 } /* Name.Builtin.Pseudo */
 .highlight pre  .fm { color: #00F } /* Name.Function.Magic */
 .highlight pre  .vc { color: #19177C } /* Name.Variable.Class */
 .highlight pre  .vg { color: #19177C } /* Name.Variable.Global */
 .highlight pre  .vi { color: #19177C } /* Name.Variable.Instance */
 .highlight pre  .vm { color: #19177C } /* Name.Variable.Magic */
 .highlight pre  .il { color: #666 } /* Literal.Number.Integer.Long */&lt;/style&gt;&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Rule &lt;span class="caps"&gt;ALA003&lt;/span&gt; of the buildingSMART &lt;a href="https://validate.buildingsmart.org"&gt;validation service&lt;/a&gt;
looks at individual alignment segments to confirm that the same geometry type is used in the business logic
and in the geometric&amp;nbsp;representation.&lt;/p&gt;
&lt;p&gt;During development, there was a question raised regarding the proper entity type to be used in the representation segment
that corresponds to a linear transition of cant in the business logic.
The ensuing discussion in the implementer&amp;#8217;s forum in &lt;a href="https://github.com/buildingSMART/IFC4.x-IF/issues/145"&gt;&lt;span class="caps"&gt;IFC4&lt;/span&gt;.x-&lt;span class="caps"&gt;IF&lt;/span&gt;#145&lt;/a&gt;
lead to considerable confusion on my&amp;nbsp;part.&lt;/p&gt;
&lt;p&gt;Therefore I decided to develop this notebook to do some calculations for the &lt;a href="https://github.com/user-attachments/files/15816340/ACCA_sleepers-linear-placement-cant-implicit.zip"&gt;model in question&lt;/a&gt;.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&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;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;ifcopenshell&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;ifcopenshell.geom&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;geom&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;geom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;IN_PATH&lt;/span&gt; &lt;span class="o"&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="s2"&gt;&amp;quot;..&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;assets&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;models&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;alignment_validation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;FILE_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ACCA_sleepers-linear-placement-cant-implicit.ifc&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;IN_FILE&lt;/span&gt; &lt;span class="o"&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;IN_PATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_NAME&lt;/span&gt;&lt;span class="p"&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;ifcopenshell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IN_FILE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# per inspection, this model contains only 1 alignment&lt;/span&gt;
&lt;span class="n"&gt;align&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;by_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;IfcAlignment&amp;quot;&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;align&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[2]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;#2497=IfcAlignment(&amp;#39;2rc47I60124e8RihHvjEbb&amp;#39;,#1,&amp;#39;Test Alignment&amp;#39;,$,$,#2746,#2749,$)&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;prod_rep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;align&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Representation&lt;/span&gt;
&lt;span class="n"&gt;prod_rep&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[3]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;#2749=IfcProductDefinitionShape($,$,(#2750,#2751))&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;shape_reps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prod_rep&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Representations&lt;/span&gt;
&lt;span class="n"&gt;shape_reps&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[4]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;(#2750=IfcShapeRepresentation(#2752,&amp;#39;Axis&amp;#39;,&amp;#39;Curve3D&amp;#39;,(#2668)),
 #2751=IfcShapeRepresentation(#2752,&amp;#39;FootPrint&amp;#39;,&amp;#39;Curve2D&amp;#39;,(#2572)))&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;seg_ref_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;shape_reps&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;Items&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;seg_ref_curve&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[5]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;#2668=IfcSegmentedReferenceCurve((#2669,#2681,#2695,#2709,#2727),.F.,#2630,#2723)&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;grad_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seg_ref_curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseCurve&lt;/span&gt;
&lt;span class="n"&gt;grad_curve&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[6]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;#2630=IfcGradientCurve((#2631,#2650),.F.,#2572,#2647)&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;comp_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;grad_curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseCurve&lt;/span&gt;
&lt;span class="n"&gt;comp_curve&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[7]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;#2572=IfcCompositeCurve((#2573,#2586,#2598,#2611),.F.)&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# traverse the alignment cant layout&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;align&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsNestedBy&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;RelatedObjects&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;_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_a&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;IfcAlignmentCant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;cant_layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;

&lt;span class="n"&gt;cant_layout&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[8]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;#2541=IfcAlignmentCant(&amp;#39;2uexyjTX5CfOJI4h9D7ngN&amp;#39;,#1,&amp;#39;CANT&amp;#39;,$,$,#2743,$,1.5)&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;seg&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cant_layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsNestedBy&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;RelatedObjects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;dp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DesignParameters&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;#2551=IfcAlignmentCantSegment($,$,0.,400.,0.,0.,0.,0.,.CONSTANTCANT.)
#2557=IfcAlignmentCantSegment($,$,400.,49.999993741124,0.,1.,0.,0.,.LINEARTRANSITION.)
#2563=IfcAlignmentCantSegment($,$,449.999993741124,100.000006258876,1.,1.,0.,0.,.CONSTANTCANT.)
#2569=IfcAlignmentCantSegment($,$,550.,400.,1.,0.,0.,0.,.LINEARTRANSITION.)
#2737=IfcAlignmentCantSegment($,$,950.,0.,0.,0.,0.,0.,.LINEARTRANSITION.)
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;From inspection, we see that the initial transition in the cant layout, #2557,
is a linear transition from 0.0 to 1.0 m of cant from distance 400.0 to&amp;nbsp;450.0.&lt;/p&gt;
&lt;p&gt;Therefore, create a function to calculate the cant values at 5 m intervals along this transition.
We&amp;#8217;re helped by the fact that there is no change in the vertical alignment along this portion of the alignment,
meaning that the calculated elevations are 0.0.
Therefore,&amp;nbsp;the &lt;code&gt;z&lt;/code&gt; coordinate of the segmented reference curve corresponds to 1/2 the total&amp;nbsp;cant.&lt;/p&gt;
&lt;p&gt;The low rail is the axis of rotation and the total cant is the distance the high rail is elevated above its normal position.
Therefore at the centerline of rail, where the alignment is located,&amp;nbsp;the &lt;code&gt;z&lt;/code&gt; coordinate is 1/2 the total cant&amp;nbsp;amount.&lt;/p&gt;
&lt;p&gt;Said another&amp;nbsp;way:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;segmented_ref_curve_z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gradient_curve_z&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;total_cant&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;gradient_curve_z&lt;/span&gt; &lt;span class="o"&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;segmented_ref_curve_z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;total_cant&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&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;evaluate_u&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ifcopenshell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;entity_instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dist_along&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="o"&gt;-&amp;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;ndarray&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;pwf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ifcopenshell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ifcopenshell_wrapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map_shape&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;curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wrapped_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pwf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dist_along&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ar&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;t&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;ar&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;3&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;ar&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="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ar&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="k"&gt;return&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;dist_along&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;z&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;dtype&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;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[11]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# set up the distances to be evaluated&lt;/span&gt;
&lt;span class="n"&gt;distances&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;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;400.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;450.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;endpoint&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="n"&gt;dtype&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;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;coords&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;evaluate_u&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seg_ref_curve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&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;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;This is obviously far from a correctly pythonic use of numpy, but it gets the job&amp;nbsp;done.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[12]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# slice a 2d array of [distance_along, total cant]&lt;/span&gt;

&lt;span class="n"&gt;cant_coords&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;coords&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="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;coords&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="n"&gt;dtype&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;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;
&lt;span class="n"&gt;cant_coords&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[12]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;array([[4.00000000e+02, 0.00000000e+00],
       [4.05000000e+02, 9.99950129e-02],
       [4.10000000e+02, 1.99990026e-01],
       [4.14999997e+02, 2.99985039e-01],
       [4.19999986e+02, 3.99980052e-01],
       [4.24999957e+02, 4.99975064e-01],
       [4.29999892e+02, 5.99970077e-01],
       [4.34999766e+02, 6.99965090e-01],
       [4.39999545e+02, 7.99960103e-01],
       [4.44999180e+02, 8.99955116e-01],
       [4.49998611e+02, 9.99950129e-01]])&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Conclusion"&gt;Conclusion&lt;a class="anchor-link" href="#Conclusion"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;It still may not make sense to me, but the &lt;a href="https://www.ifcopenshell.org"&gt;IfcOpenShell&lt;/a&gt; implementation clearly calculates the correct values of cant
for this example model.
Therefore I&amp;#8217;m happy to stand corrected, with thanks to &lt;a href="https://github.com/RickBrice"&gt;RickBrice&lt;/a&gt; and &lt;a href="https://github.com/peterrdf"&gt;peterrdf&lt;/a&gt;
for their patience and&amp;nbsp;explanation.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
 


&lt;script type="text/javascript"&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = '//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
    mathjaxscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: 'center'," +
        "    displayIndent: '0em'," +
        "    showMathMenu: true," +
        "    tex2jax: { " +
        "        inlineMath: [ ['$','$'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        " linebreaks: { automatic: true, width: '95% container' }, " +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important'} }" +
        "    } " +
        "}); ";
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;
</content><category term="how-to"/><category term="python"/><category term="ifc"/></entry><entry><title>A Framework for Digital Delivery of Infrastructure Projects</title><link href="https://www.heavycivilbigdata.com/framework-digital-delivery-infrastructure-projects.html" rel="alternate"/><published>2023-07-01T00:00:00-04:00</published><updated>2023-07-01T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2023-07-01:/framework-digital-delivery-infrastructure-projects.html</id><summary type="html">&lt;p&gt;Share Data, Not&amp;nbsp;Drawings&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#thesis"&gt;Thesis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#current-state"&gt;Current state&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#pdf-based-delivery"&gt;&lt;span class="caps"&gt;PDF&lt;/span&gt; - based&amp;nbsp;delivery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#common-open-format-ifc-43"&gt;Common, Open Format - &lt;span class="caps"&gt;IFC&lt;/span&gt;&amp;nbsp;4.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#data-must-meet-specific-requirements"&gt;Data must meet specific requirements&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#information-delivery-specification"&gt;Information Delivery&amp;nbsp;Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#specific-requirements-for-project-information"&gt;Specific Requirements for Project&amp;nbsp;Information&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#model-as-legal-document"&gt;Model as Legal&amp;nbsp;Document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="thesis"&gt;Thesis&lt;/h3&gt;
&lt;p&gt;Infrastructure project delivery is shifting from drawing-based &lt;span class="caps"&gt;PDF&lt;/span&gt;
to data-based models.
Here&amp;#8217;s a framework for digital delivery that parallels the
current state of affairs
in the hopes of minimizing discomfort and speeding&amp;nbsp;adoption.&lt;/p&gt;
&lt;h3 id="current-state"&gt;Current&amp;nbsp;state&lt;/h3&gt;
&lt;p&gt;The vast majority of my experience in heavy civil design and construction
has been in my home state of Indiana.
Therefore, I&amp;#8217;ll use the Indiana Department of Transportation (&lt;span class="caps"&gt;INDOT&lt;/span&gt;) as my basis of discussion.
Note that I&amp;#8217;m not speaking on behalf of the department or trying to come off as
an authoritative voice -
just making observations for the sake of&amp;nbsp;discussion.&lt;/p&gt;
&lt;h4 id="pdf-based-delivery"&gt;&lt;span class="caps"&gt;PDF&lt;/span&gt; - based&amp;nbsp;delivery&lt;/h4&gt;
&lt;p&gt;The vast majority of Plans, Specs &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; Estimates (&lt;span class="caps"&gt;PSE&lt;/span&gt;) are currently transacted via &lt;span class="caps"&gt;PDF&lt;/span&gt;.
This is particularly the case if we focus specifically on plans.
&lt;span class="caps"&gt;INDOT&lt;/span&gt; has never dictated or forced consultant designers to use a specific &lt;span class="caps"&gt;CADD&lt;/span&gt; platform.
They do publish the resources of documentation of the Microstation / OpenRoads civil workspace
that they use for in-house design, but consultants are not obligated to use&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Plan submittals are required to be made via &lt;span class="caps"&gt;PDF&lt;/span&gt; and must adhere to certain&amp;nbsp;criteria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;maximum file&amp;nbsp;size&lt;/li&gt;
&lt;li&gt;look and feel (fonts, lineweights,&amp;nbsp;abbreviations)&lt;/li&gt;
&lt;li&gt;sheet naming and&amp;nbsp;scales&lt;/li&gt;
&lt;li&gt;sheet titles and arrangement&amp;nbsp;order&lt;/li&gt;
&lt;li&gt;sheet numbering for addendums, revisions and construction&amp;nbsp;changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The title sheet of each plan set has additional&amp;nbsp;requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;project identification - name, project number, route, description of the work, features&amp;nbsp;crossed&lt;/li&gt;
&lt;li&gt;geospatial location - latitude and&amp;nbsp;longitude&lt;/li&gt;
&lt;li&gt;construction Contract&amp;nbsp;Number&lt;/li&gt;
&lt;li&gt;Des&amp;nbsp;Number&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="common-open-format-ifc-43"&gt;Common, Open Format - &lt;span class="caps"&gt;IFC&lt;/span&gt;&amp;nbsp;4.3&lt;/h3&gt;
&lt;p&gt;Digital delivery is best accomplished via &lt;span class="caps"&gt;IFC&lt;/span&gt; 4.3.
Like &lt;span class="caps"&gt;PDF&lt;/span&gt;, it is a published data format not proprietary to any specific software system or vendor.
This means that there are multiple options for viewing model data - including those that are free (no cost)
for read-only&amp;nbsp;viewing.&lt;/p&gt;
&lt;p&gt;This also means that there are multiple authoring tools available.
Like the current state of affairs, designers have the ability to choose their
preferred modeling platform for generating and checking design model&amp;nbsp;data. &lt;/p&gt;
&lt;p&gt;Lastly, like &lt;span class="caps"&gt;PDF&lt;/span&gt;, &lt;span class="caps"&gt;IFC&lt;/span&gt; is an &lt;span class="caps"&gt;ISO&lt;/span&gt; standard.
Specifically, &lt;span class="caps"&gt;IFC&lt;/span&gt; 4.3 is currently in candidate status for final approval
as an updated &lt;span class="caps"&gt;ISO&lt;/span&gt; standard,
ensuring that model information in this format will continue to be accessible
for multiple decades in the&amp;nbsp;future.&lt;/p&gt;
&lt;h3 id="data-must-meet-specific-requirements"&gt;Data must meet specific&amp;nbsp;requirements&lt;/h3&gt;
&lt;h4 id="information-delivery-specification"&gt;&lt;a href="https://technical.buildingsmart.org/projects/information-delivery-specification-ids/"&gt;Information Delivery&amp;nbsp;Specification&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Information Delivery Specification (&lt;span class="caps"&gt;IDS&lt;/span&gt;) is a relative newcomer to the openBIM scene.
&lt;span class="caps"&gt;IDS&lt;/span&gt; is a machine-readable specification that defines the digital governance requirements
for an information exchange.
You could think of this as Model View Definition (&lt;span class="caps"&gt;MVD&lt;/span&gt;) -&amp;nbsp;lite.&lt;/p&gt;
&lt;p&gt;You could also think of this as a &lt;span class="caps"&gt;BIM&lt;/span&gt; checklist that can be performed automatically
by supporting software to validate &lt;span class="caps"&gt;IFC&lt;/span&gt; data against project or client standards.
In my experience, &lt;span class="caps"&gt;IDS&lt;/span&gt; is best suited to checking attribution via the presence of
specific property set definitions, property sets, and&amp;nbsp;values.&lt;/p&gt;
&lt;p&gt;Making our analogy back to current state of affairs,
&lt;span class="caps"&gt;IDS&lt;/span&gt; is similar to current &amp;#8220;look and feel&amp;#8221; requirements for plans.
You can use the authoring tool of your choice,
but the &lt;span class="caps"&gt;PDF&lt;/span&gt; output must match the published example plans for
fonts, abbreviations, and sheet ordering.
I have focused on this analogy specifically because I remember a &amp;#8220;look and feel&amp;#8221; check as
a specific part of our &lt;span class="caps"&gt;QC&lt;/span&gt; process and documentation from earlier in my&amp;nbsp;career.&lt;/p&gt;
&lt;h4 id="specific-requirements-for-project-information"&gt;Specific Requirements for Project&amp;nbsp;Information&lt;/h4&gt;
&lt;p&gt;Like the requirements listed above for a title sheet,
digital deliverables should include similar project&amp;nbsp;information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;geospatial&amp;nbsp;positioning&lt;/li&gt;
&lt;li&gt;contract&amp;nbsp;number&lt;/li&gt;
&lt;li&gt;project identification / Des&amp;nbsp;Number&lt;/li&gt;
&lt;li&gt;route name and reference posts / mile&amp;nbsp;markers&lt;/li&gt;
&lt;li&gt;features&amp;nbsp;crossed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of these can be built in to consistent &lt;span class="caps"&gt;QC&lt;/span&gt; processes via &lt;span class="caps"&gt;IDS&lt;/span&gt;.&lt;/p&gt;
&lt;h3 id="model-as-legal-document"&gt;Model as Legal&amp;nbsp;Document&lt;/h3&gt;
&lt;p&gt;There is an industry trend towards replacing traditional construction plans
with the model data itself.
Certain agencies have already piloted this approach with varying degrees of success.
I&amp;#8217;ve observed a fair amount of concern from designers about this approach,
stating that they don&amp;#8217;t feel comfortable certifying model data&amp;nbsp;itself.&lt;/p&gt;
&lt;p&gt;However, they are already doing this when certifying &lt;span class="caps"&gt;PDF&lt;/span&gt; plans.
That is to say that they are not certifying the binary content
of the files themselves, but rather the presentation of that binary content
in a viewer such as Bluebeam&amp;nbsp;Revu.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s not different with &lt;span class="caps"&gt;IFC&lt;/span&gt; - you are certifying the representation of the
model content as presented in an acceptable viewer.
In fact, the situation is even better with &lt;span class="caps"&gt;IFC&lt;/span&gt; because it is a human-readable
plain text format.
You can open it in any text viewer and review the data itself.
Try doing that with a &lt;span class="caps"&gt;PDF&lt;/span&gt;!&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;2D plan set is to &lt;span class="caps"&gt;PDF&lt;/span&gt; as 3D model is to &lt;span class="caps"&gt;IFC&lt;/span&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Boiling things down to that analogy will go a long way towards
calming fears about this new approach and ultimately
getting practitioners on board and speeding overall adoption in the industry.
This sets the stage for better cost control and schedule performance
while also paving the way towards better as-built records
that flow into asset management systems and set the stage for infrastructure digital&amp;nbsp;twins.&lt;/p&gt;</content><category term="opinion"/><category term="VDC"/><category term="BIM"/><category term="IFC"/></entry><entry><title>Automation investment and payoff</title><link href="https://www.heavycivilbigdata.com/automation-investment-and-payoff.html" rel="alternate"/><published>2023-02-11T00:00:00-05:00</published><updated>2023-02-11T00:00:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2023-02-11:/automation-investment-and-payoff.html</id><summary type="html">&lt;p&gt;May the numbers be ever in your&amp;nbsp;favor&lt;/p&gt;</summary><content type="html">&lt;style type="text/css"&gt;/*!
*
* IPython notebook
*
*/
/* &lt;span class="caps"&gt;CSS&lt;/span&gt; font colors for translated &lt;span class="caps"&gt;ANSI&lt;/span&gt; escape sequences */
/* The color values are a mix of
   http://www.xcolors.net/dl/baskerville-ivorylight and
   http://www.xcolors.net/dl/euphrasia */
.ansi-black-fg {
  color: #&lt;span class="caps"&gt;3E424D&lt;/span&gt;;
}
.ansi-black-bg {
  background-color: #&lt;span class="caps"&gt;3E424D&lt;/span&gt;;
}
.ansi-black-intense-fg {
  color: #282C36;
}
.ansi-black-intense-bg {
  background-color: #282C36;
}
.ansi-red-fg {
  color: #&lt;span class="caps"&gt;E75C58&lt;/span&gt;;
}
.ansi-red-bg {
  background-color: #&lt;span class="caps"&gt;E75C58&lt;/span&gt;;
}
.ansi-red-intense-fg {
  color: #&lt;span class="caps"&gt;B22B31&lt;/span&gt;;
}
.ansi-red-intense-bg {
  background-color: #&lt;span class="caps"&gt;B22B31&lt;/span&gt;;
}
.ansi-green-fg {
  color: #00A250;
}
.ansi-green-bg {
  background-color: #00A250;
}
.ansi-green-intense-fg {
  color: #007427;
}
.ansi-green-intense-bg {
  background-color: #007427;
}
.ansi-yellow-fg {
  color: #&lt;span class="caps"&gt;DDB62B&lt;/span&gt;;
}
.ansi-yellow-bg {
  background-color: #&lt;span class="caps"&gt;DDB62B&lt;/span&gt;;
}
.ansi-yellow-intense-fg {
  color: #&lt;span class="caps"&gt;B27D12&lt;/span&gt;;
}
.ansi-yellow-intense-bg {
  background-color: #&lt;span class="caps"&gt;B27D12&lt;/span&gt;;
}
.ansi-blue-fg {
  color: #&lt;span class="caps"&gt;208FFB&lt;/span&gt;;
}
.ansi-blue-bg {
  background-color: #&lt;span class="caps"&gt;208FFB&lt;/span&gt;;
}
.ansi-blue-intense-fg {
  color: #&lt;span class="caps"&gt;0065CA&lt;/span&gt;;
}
.ansi-blue-intense-bg {
  background-color: #&lt;span class="caps"&gt;0065CA&lt;/span&gt;;
}
.ansi-magenta-fg {
  color: #&lt;span class="caps"&gt;D160C4&lt;/span&gt;;
}
.ansi-magenta-bg {
  background-color: #&lt;span class="caps"&gt;D160C4&lt;/span&gt;;
}
.ansi-magenta-intense-fg {
  color: #A03196;
}
.ansi-magenta-intense-bg {
  background-color: #A03196;
}
.ansi-cyan-fg {
  color: #&lt;span class="caps"&gt;60C6C8&lt;/span&gt;;
}
.ansi-cyan-bg {
  background-color: #&lt;span class="caps"&gt;60C6C8&lt;/span&gt;;
}
.ansi-cyan-intense-fg {
  color: #&lt;span class="caps"&gt;258F8F&lt;/span&gt;;
}
.ansi-cyan-intense-bg {
  background-color: #&lt;span class="caps"&gt;258F8F&lt;/span&gt;;
}
.ansi-white-fg {
  color: #&lt;span class="caps"&gt;C5C1B4&lt;/span&gt;;
}
.ansi-white-bg {
  background-color: #&lt;span class="caps"&gt;C5C1B4&lt;/span&gt;;
}
.ansi-white-intense-fg {
  color: #&lt;span class="caps"&gt;A1A6B2&lt;/span&gt;;
}
.ansi-white-intense-bg {
  background-color: #&lt;span class="caps"&gt;A1A6B2&lt;/span&gt;;
}
.ansi-default-inverse-fg {
  color: #&lt;span class="caps"&gt;FFFFFF&lt;/span&gt;;
}
.ansi-default-inverse-bg {
  background-color: #000000;
}
.ansi-bold {
  font-weight: bold;
}
.ansi-underline {
  text-decoration: underline;
}
/* The following styles are deprecated an will be removed in a future version */
.ansibold {
  font-weight: bold;
}
.ansi-inverse {
  outline: 0.5px dotted;
}
/* use dark versions for foreground, to improve visibility */
.ansiblack {
  color: black;
}
.ansired {
  color: darkred;
}
.ansigreen {
  color: darkgreen;
}
.ansiyellow {
  color: #c4a000;
}
.ansiblue {
  color: darkblue;
}
.ansipurple {
  color: darkviolet;
}
.ansicyan {
  color: steelblue;
}
.ansigray {
  color: gray;
}
/* and light for background, for the same reason */
.ansibgblack {
  background-color: black;
}
.ansibgred {
  background-color: red;
}
.ansibggreen {
  background-color: green;
}
.ansibgyellow {
  background-color: yellow;
}
.ansibgblue {
  background-color: blue;
}
.ansibgpurple {
  background-color: magenta;
}
.ansibgcyan {
  background-color: cyan;
}
.ansibggray {
  background-color: gray;
}
div.cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  border-radius: 2px;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  border-width: 1px;
  border-style: solid;
  border-color: transparent;
  width: 100%;
  padding: 5px;
  /* This acts as a spacer between cells, that is outside the border */
  margin: 0px;
  outline: none;
  position: relative;
  overflow: visible;
}
div.cell:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: transparent;
}
div.cell.jupyter-soft-selected {
  border-left-color: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
  border-left-width: 1px;
  padding-left: 5px;
  border-right-color: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
  border-right-width: 1px;
  background: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
}
@media print {
  div.cell.jupyter-soft-selected {
    border-color: transparent;
  }
}
div.cell.selected,
div.cell.selected.jupyter-soft-selected {
  border-color: #ababab;
}
div.cell.selected:before,
div.cell.selected.jupyter-soft-selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #&lt;span class="caps"&gt;42A5F5&lt;/span&gt;;
}
@media print {
  div.cell.selected,
  div.cell.selected.jupyter-soft-selected {
    border-color: transparent;
  }
}
.edit_mode div.cell.selected {
  border-color: #&lt;span class="caps"&gt;66BB6A&lt;/span&gt;;
}
.edit_mode div.cell.selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #&lt;span class="caps"&gt;66BB6A&lt;/span&gt;;
}
@media print {
  .edit_mode div.cell.selected {
    border-color: transparent;
  }
}
.prompt {
  /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */
  min-width: 14ex;
  /* This padding is tuned to match the padding on the CodeMirror editor. */
  padding: 0.4em;
  margin: 0px;
  font-family: monospace;
  text-align: right;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
  /* Don't highlight prompt number selection */
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  /* Use default cursor */
  cursor: default;
}
@media (max-width: 540px) {
  .prompt {
    text-align: left;
  }
}
div.inner_cell {
  min-width: 0;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_area {
  border: 1px solid #cfcfcf;
  border-radius: 2px;
  background: #f7f7f7;
  line-height: 1.21429em;
}
/* This is needed so that empty prompt areas can collapse to zero height when there
   is no content in the output_subarea and the prompt. The main purpose of this is
   to make sure that empty JavaScript output_subareas have no height. */
div.prompt:empty {
  padding-top: 0;
  padding-bottom: 0;
}
div.unrecognized_cell {
  padding: 5px 5px 5px 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.unrecognized_cell .inner_cell {
  border-radius: 2px;
  padding: 5px;
  font-weight: bold;
  color: red;
  border: 1px solid #cfcfcf;
  background: #eaeaea;
}
div.unrecognized_cell .inner_cell a {
  color: inherit;
  text-decoration: none;
}
div.unrecognized_cell .inner_cell a:hover {
  color: inherit;
  text-decoration: none;
}
@media (max-width: 540px) {
  div.unrecognized_cell &gt; div.prompt {
    display: none;
  }
}
div.code_cell {
  /* avoid page breaking on code cells when printing */
}
@media print {
  div.code_cell {
    page-break-inside: avoid;
  }
}
/* any special styling for code cells that are currently running goes here */
div.input {
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.input {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_prompt {
  color: #&lt;span class="caps"&gt;303F9F&lt;/span&gt;;
  border-top: 1px solid transparent;
}
div.input_area &gt; div.highlight {
  margin: 0.4em;
  border: none;
  padding: 0px;
  background-color: transparent;
}
div.input_area &gt; div.highlight &gt; pre {
  margin: 0px;
  border: none;
  padding: 0px;
  background-color: transparent;
}
/* The following gets added to the &lt;head&gt; if it is detected that the user has a
 * monospace font with inconsistent normal/bold/italic height.  See
 * notebookmain.js.  Such fonts will have keywords vertically offset with
 * respect to the rest of the text.  The user should select a better font.
 * See: https://github.com/ipython/ipython/issues/1503
 *
 * .CodeMirror span {
 *      vertical-align: bottom;
 * }
 */
.CodeMirror {
  line-height: 1.21429em;
  /* Changed from 1em to our global default */
  font-size: 14px;
  height: auto;
  /* Changed to auto to autogrow */
  background: none;
  /* Changed from white to allow our bg to show through */
}
.CodeMirror-scroll {
  /*  The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/
  /*  We have found that if it is visible, vertical scrollbars appear with font size changes.*/
  overflow-y: hidden;
  overflow-x: auto;
}
.CodeMirror-lines {
  /* In &lt;span class="caps"&gt;CM2&lt;/span&gt;, this used to be 0.4em, but in &lt;span class="caps"&gt;CM3&lt;/span&gt; it went to 4px. We need the em value because */
  /* we have set a different line-height and want this to scale with that. */
  /* Note that this should set vertical padding only, since CodeMirror assumes
       that horizontal padding will be set on CodeMirror pre */
  padding: 0.4em 0;
}
.CodeMirror-linenumber {
  padding: 0 8px 0 4px;
}
.CodeMirror-gutters {
  border-bottom-left-radius: 2px;
  border-top-left-radius: 2px;
}
.CodeMirror pre {
  /* In &lt;span class="caps"&gt;CM3&lt;/span&gt; this went to 4px from 0 in &lt;span class="caps"&gt;CM2&lt;/span&gt;. This sets horizontal padding only,
    use .CodeMirror-lines for vertical */
  padding: 0 0.4em;
  border: 0;
  border-radius: 0;
}
.CodeMirror-cursor {
  border-left: 1.4px solid black;
}
@media screen and (min-width: 2138px) and (max-width: 4319px) {
  .CodeMirror-cursor {
    border-left: 2px solid black;
  }
}
@media screen and (min-width: 4320px) {
  .CodeMirror-cursor {
    border-left: 4px solid black;
  }
}
/*

Original style from softwaremaniacs.org (c) Ivan Sagalaev &lt;Maniac@SoftwareManiacs.Org&gt;
Adapted from GitHub theme

*/
.highlight-base {
  color: #000;
}
.highlight-variable {
  color: #000;
}
.highlight-variable-2 {
  color: #1a1a1a;
}
.highlight-variable-3 {
  color: #333333;
}
.highlight-string {
  color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;;
}
.highlight-comment {
  color: #408080;
  font-style: italic;
}
.highlight-number {
  color: #080;
}
.highlight-atom {
  color: #88F;
}
.highlight-keyword {
  color: #008000;
  font-weight: bold;
}
.highlight-builtin {
  color: #008000;
}
.highlight-error {
  color: #f00;
}
.highlight-operator {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
  font-weight: bold;
}
.highlight-meta {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
}
/* previously not defined, copying from default codemirror */
.highlight-def {
  color: #00f;
}
.highlight-string-2 {
  color: #f50;
}
.highlight-qualifier {
  color: #555;
}
.highlight-bracket {
  color: #997;
}
.highlight-tag {
  color: #170;
}
.highlight-attribute {
  color: #00c;
}
.highlight-header {
  color: blue;
}
.highlight-quote {
  color: #090;
}
.highlight-link {
  color: #00c;
}
/* apply the same style to codemirror */
.cm-s-ipython span.cm-keyword {
  color: #008000;
  font-weight: bold;
}
.cm-s-ipython span.cm-atom {
  color: #88F;
}
.cm-s-ipython span.cm-number {
  color: #080;
}
.cm-s-ipython span.cm-def {
  color: #00f;
}
.cm-s-ipython span.cm-variable {
  color: #000;
}
.cm-s-ipython span.cm-operator {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
  font-weight: bold;
}
.cm-s-ipython span.cm-variable-2 {
  color: #1a1a1a;
}
.cm-s-ipython span.cm-variable-3 {
  color: #333333;
}
.cm-s-ipython span.cm-comment {
  color: #408080;
  font-style: italic;
}
.cm-s-ipython span.cm-string {
  color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;;
}
.cm-s-ipython span.cm-string-2 {
  color: #f50;
}
.cm-s-ipython span.cm-meta {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
}
.cm-s-ipython span.cm-qualifier {
  color: #555;
}
.cm-s-ipython span.cm-builtin {
  color: #008000;
}
.cm-s-ipython span.cm-bracket {
  color: #997;
}
.cm-s-ipython span.cm-tag {
  color: #170;
}
.cm-s-ipython span.cm-attribute {
  color: #00c;
}
.cm-s-ipython span.cm-header {
  color: blue;
}
.cm-s-ipython span.cm-quote {
  color: #090;
}
.cm-s-ipython span.cm-link {
  color: #00c;
}
.cm-s-ipython span.cm-error {
  color: #f00;
}
.cm-s-ipython span.cm-tab {
  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);
  background-position: right;
  background-repeat: no-repeat;
}
div.output_wrapper {
  /* this position must be relative to enable descendents to be absolute within it */
  position: relative;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  z-index: 1;
}
/* class for the output area when it should be height-limited */
div.output_scroll {
  /* ideally, this would be max-height, but &lt;span class="caps"&gt;FF&lt;/span&gt; barfs all over that */
  height: 24em;
  /* &lt;span class="caps"&gt;FF&lt;/span&gt; needs this *and the wrapper* to specify full width, or it will shrinkwrap */
  width: 100%;
  overflow: auto;
  border-radius: 2px;
  -webkit-box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  display: block;
}
/* output div while it is collapsed */
div.output_collapsed {
  margin: 0px;
  padding: 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
div.out_prompt_overlay {
  height: 100%;
  padding: 0px 0.4em;
  position: absolute;
  border-radius: 2px;
}
div.out_prompt_overlay:hover {
  /* use inner shadow to get border that is computed the same on WebKit/&lt;span class="caps"&gt;FF&lt;/span&gt; */
  -webkit-box-shadow: inset 0 0 1px #000;
  box-shadow: inset 0 0 1px #000;
  background: rgba(240, 240, 240, 0.5);
}
div.output_prompt {
  color: #D84315;
}
/* This class is the outer container of all output sections. */
div.output_area {
  padding: 0px;
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.output_area .MathJax_Display {
  text-align: left !important;
}
div.output_area 
div.output_area 
div.output_area img,
div.output_area svg {
  max-width: 100%;
  height: auto;
}
div.output_area img.unconfined,
div.output_area svg.unconfined {
  max-width: none;
}
div.output_area .mglyph &gt; img {
  max-width: none;
}
/* This is needed to protect the pre formating from global settings such
   as that of bootstrap */
.output {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.output_area {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
div.output_area pre {
  margin: 0;
  padding: 1px 0 1px 0;
  border: 0;
  vertical-align: baseline;
  color: black;
  background-color: transparent;
  border-radius: 0;
}
/* This class is for the output subarea inside the output_area and after
   the prompt div. */
div.output_subarea {
  overflow-x: auto;
  padding: 0.4em;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
  max-width: calc(100% - 14ex);
}
div.output_scroll div.output_subarea {
  overflow-x: visible;
}
/* The rest of the output_* classes are for special styling of the different
   output types */
/* all text output has this class: */
div.output_text {
  text-align: left;
  color: #000;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
}
/* stdout/stderr are 'text' as well as 'stream', but execute_result/error are *not* streams */
div.output_stderr {
  background: #fdd;
  /* very light red background for stderr */
}
div.output_latex {
  text-align: left;
}
/* Empty output_javascript divs should have no height */
div.output_javascript:empty {
  padding: 0;
}
.js-error {
  color: darkred;
}
/* raw_input styles */
div.raw_input_container {
  line-height: 1.21429em;
  padding-top: 5px;
}
pre.raw_input_prompt {
  /* nothing needed here. */
}
input.raw_input {
  font-family: monospace;
  font-size: inherit;
  color: inherit;
  width: auto;
  /* make sure input baseline aligns with prompt */
  vertical-align: baseline;
  /* padding + margin = 0.5em between prompt and cursor */
  padding: 0em 0.25em;
  margin: 0em 0.25em;
}
input.raw_input:focus {
  box-shadow: none;
}
p.p-space {
  margin-bottom: 10px;
}
div.output_unrecognized {
  padding: 5px;
  font-weight: bold;
  color: red;
}
div.output_unrecognized a {
  color: inherit;
  text-decoration: none;
}
div.output_unrecognized a:hover {
  color: inherit;
  text-decoration: none;
}
.rendered_html {
  color: #000;
  /* any extras will just be numbers: */
}



.rendered_html :link {
  text-decoration: underline;
}
.rendered_html :visited {
  text-decoration: underline;
}






.rendered_html h1:first-child {
  margin-top: 0.538em;
}
.rendered_html h2:first-child {
  margin-top: 0.636em;
}
.rendered_html h3:first-child {
  margin-top: 0.777em;
}
.rendered_html h4:first-child {
  margin-top: 1em;
}
.rendered_html h5:first-child {
  margin-top: 1em;
}
.rendered_html h6:first-child {
  margin-top: 1em;
}
.rendered_html ul:not(.list-inline),
.rendered_html ol:not(.list-inline) {
  padding-left: 2em;
}








.rendered_html * + ul {
  margin-top: 1em;
}
.rendered_html * + ol {
  margin-top: 1em;
}





.rendered_html pre,




.rendered_html tr,
.rendered_html th,


.rendered_html tbody tr:nth-child(odd) {
  background: #f5f5f5;
}
.rendered_html tbody tr:hover {
  background: rgba(66, 165, 245, 0.2);
}
.rendered_html * + table {
  margin-top: 1em;
}

.rendered_html * + p {
  margin-top: 1em;
}

.rendered_html * + img {
  margin-top: 1em;
}
.rendered_html img,

.rendered_html img.unconfined,


.rendered_html * + .alert {
  margin-top: 1em;
}
[dir="rtl"] 
div.text_cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.text_cell &gt; div.prompt {
    display: none;
  }
}
div.text_cell_render {
  /*font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;*/
  outline: none;
  resize: none;
  width: inherit;
  border-style: none;
  padding: 0.5em 0.5em 0.5em 0.4em;
  color: #000;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}
a.anchor-link:link {
  text-decoration: none;
  padding: 0px 20px;
  visibility: hidden;
}
h1:hover .anchor-link,
h2:hover .anchor-link,
h3:hover .anchor-link,
h4:hover .anchor-link,
h5:hover .anchor-link,
h6:hover .anchor-link {
  visibility: visible;
}
.text_cell.rendered .input_area {
  display: none;
}
.text_cell.rendered 
.text_cell.rendered .rendered_html tr,
.text_cell.rendered .rendered_html th,
.text_cell.rendered 
.text_cell.unrendered .text_cell_render {
  display: none;
}
.text_cell .dropzone .input_area {
  border: 2px dashed #bababa;
  margin: -1px;
}
.cm-header-1,
.cm-header-2,
.cm-header-3,
.cm-header-4,
.cm-header-5,
.cm-header-6 {
  font-weight: bold;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.cm-header-1 {
  font-size: 185.7%;
}
.cm-header-2 {
  font-size: 157.1%;
}
.cm-header-3 {
  font-size: 128.6%;
}
.cm-header-4 {
  font-size: 110%;
}
.cm-header-5 {
  font-size: 100%;
  font-style: italic;
}
.cm-header-6 {
  font-size: 100%;
  font-style: italic;
}
&lt;/style&gt;
&lt;style type="text/css"&gt;pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 .highlight pre  .hll { background-color: #ffffcc }
 .highlight pre  { background: #f8f8f8; }
 .highlight pre  .c { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment */
 .highlight pre  .err { border: 1px solid #F00 } /* Error */
 .highlight pre  .k { color: #008000; font-weight: bold } /* Keyword */
 .highlight pre  .o { color: #666 } /* Operator */
 .highlight pre  .ch { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Hashbang */
 .highlight pre  .cm { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Multiline */
 .highlight pre  .cp { color: #9C6500 } /* Comment.Preproc */
 .highlight pre  .cpf { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.PreprocFile */
 .highlight pre  .c1 { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Single */
 .highlight pre  .cs { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Special */
 .highlight pre  .gd { color: #A00000 } /* Generic.Deleted */
 .highlight pre  .ge { font-style: italic } /* Generic.Emph */
 .highlight pre  .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
 .highlight pre  .gr { color: #E40000 } /* Generic.Error */
 .highlight pre  .gh { color: #000080; font-weight: bold } /* Generic.Heading */
 .highlight pre  .gi { color: #008400 } /* Generic.Inserted */
 .highlight pre  .go { color: #717171 } /* Generic.Output */
 .highlight pre  .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
 .highlight pre  .gs { font-weight: bold } /* Generic.Strong */
 .highlight pre  .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
 .highlight pre  .gt { color: #04D } /* Generic.Traceback */
 .highlight pre  .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
 .highlight pre  .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
 .highlight pre  .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
 .highlight pre  .kp { color: #008000 } /* Keyword.Pseudo */
 .highlight pre  .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
 .highlight pre  .kt { color: #B00040 } /* Keyword.Type */
 .highlight pre  .m { color: #666 } /* Literal.Number */
 .highlight pre  .s { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String */
 .highlight pre  .na { color: #687822 } /* Name.Attribute */
 .highlight pre  .nb { color: #008000 } /* Name.Builtin */
 .highlight pre  .nc { color: #00F; font-weight: bold } /* Name.Class */
 .highlight pre  .no { color: #800 } /* Name.Constant */
 .highlight pre  .nd { color: #&lt;span class="caps"&gt;A2F&lt;/span&gt; } /* Name.Decorator */
 .highlight pre  .ni { color: #717171; font-weight: bold } /* Name.Entity */
 .highlight pre  .ne { color: #&lt;span class="caps"&gt;CB3F38&lt;/span&gt;; font-weight: bold } /* Name.Exception */
 .highlight pre  .nf { color: #00F } /* Name.Function */
 .highlight pre  .nl { color: #767600 } /* Name.Label */
 .highlight pre  .nn { color: #00F; font-weight: bold } /* Name.Namespace */
 .highlight pre  .nt { color: #008000; font-weight: bold } /* Name.Tag */
 .highlight pre  .nv { color: #19177C } /* Name.Variable */
 .highlight pre  .ow { color: #&lt;span class="caps"&gt;A2F&lt;/span&gt;; font-weight: bold } /* Operator.Word */
 .highlight pre  .w { color: #&lt;span class="caps"&gt;BBB&lt;/span&gt; } /* Text.Whitespace */
 .highlight pre  .mb { color: #666 } /* Literal.Number.Bin */
 .highlight pre  .mf { color: #666 } /* Literal.Number.Float */
 .highlight pre  .mh { color: #666 } /* Literal.Number.Hex */
 .highlight pre  .mi { color: #666 } /* Literal.Number.Integer */
 .highlight pre  .mo { color: #666 } /* Literal.Number.Oct */
 .highlight pre  .sa { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Affix */
 .highlight pre  .sb { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Backtick */
 .highlight pre  .sc { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Char */
 .highlight pre  .dl { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Delimiter */
 .highlight pre  .sd { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;; font-style: italic } /* Literal.String.Doc */
 .highlight pre  .s2 { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Double */
 .highlight pre  .se { color: #&lt;span class="caps"&gt;AA5D1F&lt;/span&gt;; font-weight: bold } /* Literal.String.Escape */
 .highlight pre  .sh { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Heredoc */
 .highlight pre  .si { color: #&lt;span class="caps"&gt;A45A77&lt;/span&gt;; font-weight: bold } /* Literal.String.Interpol */
 .highlight pre  .sx { color: #008000 } /* Literal.String.Other */
 .highlight pre  .sr { color: #&lt;span class="caps"&gt;A45A77&lt;/span&gt; } /* Literal.String.Regex */
 .highlight pre  .s1 { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Single */
 .highlight pre  .ss { color: #19177C } /* Literal.String.Symbol */
 .highlight pre  .bp { color: #008000 } /* Name.Builtin.Pseudo */
 .highlight pre  .fm { color: #00F } /* Name.Function.Magic */
 .highlight pre  .vc { color: #19177C } /* Name.Variable.Class */
 .highlight pre  .vg { color: #19177C } /* Name.Variable.Global */
 .highlight pre  .vi { color: #19177C } /* Name.Variable.Instance */
 .highlight pre  .vm { color: #19177C } /* Name.Variable.Magic */
 .highlight pre  .il { color: #666 } /* Literal.Number.Integer.Long */&lt;/style&gt;&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;I often find myself considering whether or not to automate a particular work process.
In retrospect, I believe this comes primarily from some experiences very early in my career,
as well as an overall lifelong interest in computing and software&amp;nbsp;development.&lt;/p&gt;
&lt;p&gt;Recently, I had a pleasant experience regarding the amount of time invested in
automating a process relative to the amount of time needed to recognize a return on that&amp;nbsp;investment.&lt;/p&gt;
&lt;h3 id="Pitfalls"&gt;Pitfalls&lt;a class="anchor-link" href="#Pitfalls"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;It&amp;#8217;s easy to fall into the trap of applying automation to any task,
particularly if it involves a lot of data.
At the outset, it seems obvious that this approach will ultimately be more efficient.
However, that&amp;#8217;s rarely the&amp;nbsp;case.&lt;/p&gt;
&lt;p&gt;Part of the problem is the fact that you need to understand the problem fully before
you can efficiently automate it.
Many times what seems to be a straightforward process ends up having
twists and turns and edge cases along the&amp;nbsp;way.&lt;/p&gt;
&lt;p&gt;Most importantly, if a task is only going to happen a few times - as opposed to an
ongoing, reptitive need - then it is a terrible candidate for&amp;nbsp;automation.&lt;/p&gt;
&lt;h3 id="Obligatory-xkcd-reference"&gt;Obligatory xkcd reference&lt;a class="anchor-link" href="#Obligatory-xkcd-reference"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Of course, one of the premier geek references also addresses this conundrum with a
handy table to be used as&amp;nbsp;reference:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://xkcd.com/1205/"&gt;&lt;img src="https://imgs.xkcd.com/comics/is_it_worth_the_time.png" alt="xkcd comic 125 - Is it worth the time?"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="The-Problem-Statement"&gt;The Problem Statement&lt;a class="anchor-link" href="#The-Problem-Statement"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The business problem at the heart of this story relates to data published regularly to a website.
The website is public and is updated monthly with the data of interest.
This data is published as a series of &lt;span class="caps"&gt;PDF&lt;/span&gt; files, with approximately ten files -
sometimes more, sometimes less - posted in any given&amp;nbsp;month.&lt;/p&gt;
&lt;p&gt;Automated processes for extracting the data were already in place, but the downloads
from the web site were still a manual process.
When I was keeping up with the monthly downloads as a manual process,
things weren&amp;#8217;t too bad.
However, in the last two years the downloads have fallen by the wayside until the end of the&amp;nbsp;year.&lt;/p&gt;
&lt;p&gt;When you&amp;#8217;re dealing with downloading an entire year&amp;#8217;s worth of data,
it&amp;#8217;s not quite as tolerable to download the 100+ files manually all in one&amp;nbsp;sitting.&lt;/p&gt;
&lt;h3 id="The-Solution"&gt;The Solution&lt;a class="anchor-link" href="#The-Solution"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;python&lt;/code&gt;, of course!
Looking purely at the &lt;span class="caps"&gt;URL&lt;/span&gt; patterns for the site it seemed obvious that the front end
was supported by a &lt;span class="caps"&gt;REST&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt; on the backend that would return data according to the
query parameters passed via &lt;span class="caps"&gt;URL&lt;/span&gt;.
Reviewing the network traces in the browser confirmed this hunch, as well as provided
the schema for the data returned from the &lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;The trickiest part was teasing out the unique &lt;span class="caps"&gt;ID&lt;/span&gt; required in the request for the &lt;span class="caps"&gt;PDF&lt;/span&gt;.
Once that was in place, I developed a few routines using the&amp;nbsp;wonderful &lt;code&gt;requests&lt;/code&gt; package,
and fun was had by&amp;nbsp;all.&lt;/p&gt;
&lt;h3 id="The-Calculation"&gt;The Calculation&lt;a class="anchor-link" href="#The-Calculation"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;So now, for the good part.  As mentioned, this turned out to be the rare instance where
the investment in automation paid off automatically.
Let&amp;#8217;s crunch the numbers.
To do so, we&amp;#8217;ll use the &lt;a href="https://pint.readthedocs.io/en/stable/index.html"&gt;&lt;code&gt;pint&lt;/code&gt;&lt;/a&gt; library to track our various denominations of&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ll also define a&amp;nbsp;unit &lt;code&gt;pdf&lt;/code&gt; equal to 100 Joules.
The scalar amount is arbitrary, but the &lt;span class="caps"&gt;SI&lt;/span&gt; unit of work was selected because
in the abstract sense, I want to accomplish a work&amp;nbsp;task.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&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;pint&lt;/span&gt;

&lt;span class="n"&gt;ureg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitRegistry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pdf_file = 100 * Joule = pdf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantity&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="s2"&gt;&amp;quot;pdf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;q&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[1]:&lt;/div&gt;



&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;
10 pdf_file
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;It turns out that there were 112 total pdf files to be downloaded to cover the entire current year.
From timestamps on the files for the previous year,
I saw that it took me 34 minutes to download 24 files when I was doing it&amp;nbsp;manually.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;manual_files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pdf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;manual_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;minutes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;manual_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;manual_time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;seconds&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;manual_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;manual_time&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;manual_files&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Manual rate is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;manual_rate&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Manual rate is 85.0 second / pdf_file.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;After I had developed the automated process, I was able to download the 112 files in 25&amp;nbsp;minutes.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;automated_files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;112&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pdf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;automated_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;minutes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;seconds&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;automated_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;automated_time&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;automated_files&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Automated rate is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;automated_rate&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Automated rate is 13.392857142857142 second / pdf_file.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;So now we can calculate the savings realized by developing the automated process, which took 1 hour and 45 minutes in&amp;nbsp;total.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;development_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantity&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="s2"&gt;&amp;quot;hour&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantity&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="s2"&gt;&amp;quot;minutes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;unit_rate_difference&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;manual_rate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;magnitude&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;automated_rate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;magnitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;seconds&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantity&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="s2"&gt;&amp;quot;pdf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unit rate difference is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;unit_rate_difference&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;gross_time_savings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unit_rate_difference&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;automated_files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Gross time savings is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;gross_time_savings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;minutes&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;net_time_savings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gross_time_savings&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;development_time&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Net time savings is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;net_time_savings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;minutes&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Unit rate difference is 71.60714285714286 second / pdf_file
Gross time savings is 133.66666666666666 minute
Net time savings is 28.666666666666668 minute
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;So not only did the investment in automation pay itself back immediately,
but it also provided an extra half hour of &amp;#8220;free&amp;#8221;&amp;nbsp;time. &lt;code&gt;python&lt;/code&gt; for the&amp;nbsp;win!&lt;/p&gt;
&lt;h3 id="Conclusion"&gt;Conclusion&lt;a class="anchor-link" href="#Conclusion"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This exercise turned out to be the rare instance where developing automation
pays for itself immediately.
Even better, this investment will continue to pay itself back over the
coming months and years as more data is posted and needs to be
extracted, transformed, and&amp;nbsp;loaded.&lt;/p&gt;
&lt;p&gt;Why was this a success?
As mentioned, one of the downfalls with automating a process too soon
is that you don&amp;#8217;t understand all the &amp;#8216;gotchas&amp;#8217;.
In this case I had already spent multiple years doing these tasks&amp;nbsp;manually.&lt;/p&gt;
&lt;p&gt;Secondly, the development went quickly due to my understanding of web development
and &lt;span class="caps"&gt;REST&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt;&amp;#8217;s in general.
All of my previous dalliances in web scraping had focused on&amp;nbsp;using &lt;code&gt;selenium&lt;/code&gt;
and a headless browser to simulate a user picking links and navigating through pages.
Now that I have a good deal of experience with full-stack development
I was able to shortcut the user interface entirely and go straight to the data
exposed by the &lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
 


&lt;script type="text/javascript"&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = '//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
    mathjaxscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: 'center'," +
        "    displayIndent: '0em'," +
        "    showMathMenu: true," +
        "    tex2jax: { " +
        "        inlineMath: [ ['$','$'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        " linebreaks: { automatic: true, width: '95% container' }, " +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important'} }" +
        "    } " +
        "}); ";
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;
</content><category term="story"/><category term="python"/></entry><entry><title>SmartHouse.__init__()</title><link href="https://www.heavycivilbigdata.com/smarthouse__init__.html" rel="alternate"/><published>2022-09-08T00:00:00-04:00</published><updated>2022-09-08T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2022-09-08:/smarthouse__init__.html</id><summary type="html">&lt;p&gt;The one with sensors and Home&amp;nbsp;Assistant&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#prologue-meross-smart-switch"&gt;Prologue: Meross Smart&amp;nbsp;Switch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#smart-thermostat"&gt;Smart&amp;nbsp;Thermostat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#hardware-installation-and-unexpected-re-wiring"&gt;Hardware Installation and Unexpected&amp;nbsp;Re-wiring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#a-new-life-for-an-old-pi"&gt;A new life for an old&amp;nbsp;Pi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#initial-thoughts"&gt;Initial&amp;nbsp;thoughts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#next-steps"&gt;Next&amp;nbsp;Steps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;I recently took some initial steps towards home automation
by installing a smart thermostat and setting up
&lt;a href="https://home-assistant.io"&gt;Home Assistant&lt;/a&gt;.
Here&amp;#8217;s a rundown of my&amp;nbsp;experience.&lt;/p&gt;
&lt;h3 id="prologue-meross-smart-switch"&gt;Prologue: Meross Smart&amp;nbsp;Switch&lt;/h3&gt;
&lt;p&gt;Actually, I guess I started down this path a few months ago.
In preparation for a family vacation to Seattle,
my father-in-law purchased us a set of four &lt;a href="https://www.meross.com"&gt;Meross&lt;/a&gt;
smart outlets.
These units are Wifi-enabled but also have an actual manual button on the side.
This is nice - you can turn things on and off &lt;em&gt;&amp;#8220;The Old Fashioned Way&amp;#8221;&lt;/em&gt;
without needing an&amp;nbsp;app.&lt;/p&gt;
&lt;p&gt;Before leaving on vacation, I went about setting up these outlets
in four different rooms in our house and connected a lamp to each.
Initially I named each of the outlets based on their serial numbers.
Pretty quickly I realized that this wasn&amp;#8217;t a good idea and
revised the names to something much more&amp;nbsp;sensible.&lt;/p&gt;
&lt;p&gt;&lt;img alt="iPhone screenshot of four named Meross outlets" src="./images/smarthouse_init/meross_outlets.jpg" title="A sane naming convention"&gt;&lt;/p&gt;
&lt;p&gt;Once everything was hooked up and working, I had quite the good time
turning each of the lamps on and off via the app.
However, I forgot to set a programmed schedule before we left -
which pretty much defeated the purpose of getting them set up in the first&amp;nbsp;place.&lt;/p&gt;
&lt;p&gt;However that turned out to prove the usefulness of these outlets.
We were a few days into vacation when I was riding on I-5 and remembered
that I hadn&amp;#8217;t programmed our smart lights.
So I pulled out my phone, did some quick reading of the docs,
and configured a &amp;#8220;on at dusk, off at sunrise&amp;#8221; program for the four lights
from 2,000 miles&amp;nbsp;away.&lt;/p&gt;
&lt;p&gt;This turned out to be much easier than what we had done in the past.
We have a single timer that plugs in to an outlet,
and I had configured it prior to leaving on multiple previous trips.
However it was difficult to use and I had to look up the manual each time
we wanted to use it.
Having the Meross smart outlets makes this much easier moving&amp;nbsp;forward.&lt;/p&gt;
&lt;p&gt;And, as much as I hate to admit it, since returning from vacation
I have turned off the reading light
in our room via the app when I was too lazy to reach over and do it&amp;nbsp;manually.&lt;/p&gt;
&lt;h3 id="smart-thermostat"&gt;Smart&amp;nbsp;Thermostat&lt;/h3&gt;
&lt;p&gt;A few months ago our natural gas provider sent information on an incentive program
for smart thermostats.
There were a number of offerings ranging from free to substantially discounted.
We decided to go with the ecobee lite model, which was discounted roughly&amp;nbsp;70%.&lt;/p&gt;
&lt;p&gt;I read the installation instructions a few times before unpacking the hardware,
and there was some ominous language about &amp;#8220;your thermostat is &lt;em&gt;probably&lt;/em&gt;&amp;nbsp;compatible&amp;#8221;.&lt;/p&gt;
&lt;h3 id="hardware-installation-and-unexpected-re-wiring"&gt;Hardware Installation and Unexpected&amp;nbsp;Re-wiring&lt;/h3&gt;
&lt;p&gt;And so it happened that early on a Saturday afternoon I took the plunge
and unboxed the hardware.
The instructions estimated that installation would take roughly 30 minutes.
Given my previous experience with &lt;span class="caps"&gt;DIY&lt;/span&gt; around the house I figured that would 
roughly correlate to three hours, give or&amp;nbsp;take.&lt;/p&gt;
&lt;p&gt;Right off the bat there was some drama with children facing the possibility of
an afternoon with no screens, but it turned out that our furnace had a handy shutoff switch.
With power turned off, I successfully removed the cover on the furnace and the
cover on the&amp;nbsp;thermostat.&lt;/p&gt;
&lt;p&gt;Sure enough, the wiring didn&amp;#8217;t match anything in the instruction&amp;nbsp;manual:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Thermostat wiring with four wires labeled A, B, C, and D" src="./images/smarthouse_init/ex_thermo_wiring.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Some internet research confirmed that existing &lt;span class="caps"&gt;HVAC&lt;/span&gt; system utilizes a manufacturer-specific
&amp;#8220;communicating&amp;#8221; thermostat.
I feared that we were potentially dead in the water, but ultimately found a very helpful
thread from a pro that explained the basics of our current Carrier system.
The pro ended up talking the original poster through the necessary steps
for implementing a Wifi-compatible&amp;nbsp;thermostat.&lt;/p&gt;
&lt;p&gt;Most importantly - in my eyes at least - was the note that this reconfiguration
would not violate any warranty provisions.
And the internet is always right, so I was ready to plow&amp;nbsp;ahead.&lt;/p&gt;
&lt;p&gt;I took another look at the wiring in the wall behind the original thermostat
and noticed that there were three or four additional wire strands
available, should I need them.
Tracing things back at the furnace control panel confirmed the same.
I was also easily able to identify the same four wires at the&amp;nbsp;furnace.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Wiring at the furnace showing the same four wires labeled A, B, C, and D" src="./images/smarthouse_init/ex_furnace_wiring.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Without too much trouble I was able to remove the plug and disconnect each wire.
Based on the ecobee manual I just needed to match the wires
based on color, with the exception of the white &lt;strong&gt;C&lt;/strong&gt; power cable.
I moved the wires over to the conventional terminals on the front of the furnace
board and tightened everything&amp;nbsp;down.&lt;/p&gt;
&lt;p&gt;I had a little bit of confusion over the &lt;strong&gt;Y&lt;/strong&gt; and &lt;strong&gt;Y2&lt;/strong&gt; options,
but figured that &lt;strong&gt;Y&lt;/strong&gt; was the default and would make the most&amp;nbsp;sense.&lt;/p&gt;
&lt;p&gt;Upstairs, I did a similar bit of wiring to connect everything based on the defaults
shown in the installation manual.
This was pretty straightforward, although I did wonder if I should
be using more than just these four&amp;nbsp;wires.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Thermostat wiring with four wires relocated to new spots" src="./images/smarthouse_init/new_thermo_wiring.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I took a hard look again at where I had landed on the back of the thermostat and realized I needed to
go back downstairs and make a small tweak at the&amp;nbsp;furnace.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Wiring at the furnace showing the four wires relocated to new spots" src="./images/smarthouse_init/new_furnace_wiring.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I flipped the power back on at the furnace and nothing threw sparks, so I figured that was a good sign.
Back upstairs, I connected the thermostat per the instructions and let it power up.
Everything went smoothly there and before long everything was up and&amp;nbsp;running.&lt;/p&gt;
&lt;p&gt;The initial program was pretty basic - hold 78 during the day and cool off a few degrees at night.
Our house is not typically empty during the day,
so there was no need to vary things based on&amp;nbsp;occupancy.&lt;/p&gt;
&lt;p&gt;I did notice that the thermostat seemed to only have two states - cooling and off.
That seems to confirm my initial hunch that I will need to attach
more of the available wires at both the thermostat and furnace
to be able to manage heating as well.
I probably should research this some more, but at this point in the build
I was just about ready to call it a&amp;nbsp;day.&lt;/p&gt;
&lt;p&gt;I went ahead and created an account with ecobee and explored their&amp;nbsp;website.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ecobee web site landing page" src="../images/smarthouse_init/ecobee_home.png"&gt;&lt;/p&gt;
&lt;p&gt;They seem to have some interesting data-sciency type features called HomeIQ.
But you need to have at least a month worth of data before it starts providing any feedback.
This fact makes it hard, at least on desktop,
to see where you can do system monitoring&amp;nbsp;online.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ecobee web site showing no Home IQ information yet" src="../images/smarthouse_init/ecobee_home_iq_more_data_needed.png"&gt;&lt;/p&gt;
&lt;p&gt;However if you scroll down past this information and look in the lower right corner
you can find the link to system monitoring&amp;nbsp;information.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ecobee web site with link to system monitoring information" src="../images/smarthouse_init/ecobee_system_monitor.png"&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s where you can see minute-by minute stats plotted against indoor and outdoor&amp;nbsp;temperature&lt;/p&gt;
&lt;p&gt;&lt;img alt="Chart of indoor/outdoor temperature and system state" src="../images/smarthouse_init/ecobee_system_temp_chart.png"&gt;&lt;/p&gt;
&lt;p&gt;as well as&amp;nbsp;humidity.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Chart of indoor/outdoor humidity and system state" src="../images/smarthouse_init/ecobee_system_humidity_chart.png"&gt;&lt;/p&gt;
&lt;p&gt;If you come back later (as I did for this blog post) you can see charts of data over wider time spans
such as weekly and monthly.
One interesting graph was titled &amp;#8220;Weather Effect&amp;#8221; and plotted average daily temperatures and total system run&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Chart of outdoor temperature and system run time" src="../images/smarthouse_init/ecobee_system_weather_effects.png"&gt;&lt;/p&gt;
&lt;p&gt;The website also allows you to download data locally as &lt;span class="caps"&gt;CSV&lt;/span&gt;.
Once Home Assistant is connected to the ecobee cloud it will periodically download and save
this information as well, so in my use case there doesn&amp;#8217;t seem to be much value in
a manual&amp;nbsp;download.&lt;/p&gt;
&lt;p&gt;After exploring the web site I spent a little bit of time messing around with the app on my phone.
It was amusing to wait for the furnace to shut off, then slide the temperature
back down and hear it kick back&amp;nbsp;on.&lt;/p&gt;
&lt;h3 id="a-new-life-for-an-old-pi"&gt;A new life for an old&amp;nbsp;Pi&lt;/h3&gt;
&lt;p&gt;While it was nice to be able to adjust the thermostat from an app or web site,
my true interest was in gathering sensor data.
My hypothesis is that by tracking the indoor temperature and humidity
against ambient temperature in humidity I would be able to establish
some relationship between the outdoor environment
and the house&amp;#8217;s ability to regulate the indoor environment.
However there are also a few potential automations that I have in mind,
particularly related to managing our attic fan
and triggering it to run based on&amp;nbsp;temperature.&lt;/p&gt;
&lt;p&gt;Based on a recommendation from a co-worker, I decided to standardize
on &lt;a href="https://home-assistant.io"&gt;Home Assistant&lt;/a&gt;.
Not only is it open source, but it is also primarily written in python.
Those characteristics made it hard to resist.
The recommended installation method was via burning their &lt;span class="caps"&gt;OS&lt;/span&gt; image
to an &lt;span class="caps"&gt;SD&lt;/span&gt; card for use with Raspberry&amp;nbsp;Pi.&lt;/p&gt;
&lt;p&gt;I have an RPi 3 that has been lying about for a number of years.
I initially purchased it for use with Lego Mindstorms controllers,
but it has mostly sat around unused.
The installation went smoothly and I soon had the Pi up and&amp;nbsp;running.&lt;/p&gt;
&lt;p&gt;&lt;img alt="HomeAssistant website showing a message to wait while the operating system finishes installing" src="../images/smarthouse_init/HA_waiting.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I ended up following the suggestions by both installing the iOS app
and reading the founder&amp;#8217;s vision for the platform.
Before long, the installation had finished and it was time to dig&amp;nbsp;in.&lt;/p&gt;
&lt;p&gt;&lt;img alt="HomeAssistant app showing a welcome message" src="../images/smarthouse_init/HA_welcome.jpg"&gt;&lt;/p&gt;
&lt;p&gt;There were some initial steps required such as creating a username / password and
setting a location for your home.
The iOS app required Location Services to be enabled, which was a bit interesting.
I initially tried to disable this but the app would not open unless
location was enabled.
So I begrudgingly set it up for &lt;em&gt;only while using&lt;/em&gt; the&amp;nbsp;app.&lt;/p&gt;
&lt;p&gt;Not surprisingly, the first device to be configured was my phone.
HomeAssistant recognized my phone right away and created a number of properties
(I know that&amp;#8217;s not the right terminology but I can remember the proper term)
and started tracking things like battery state and whether or not the phone
was charging.
I could potentially see some value there but it also tracked things like
local &lt;span class="caps"&gt;IP&lt;/span&gt; address and whether or not it was connected to Wifi.
It didn&amp;#8217;t take long before I had all of that functionality turned&amp;nbsp;off.&lt;/p&gt;
&lt;p&gt;Setting up the thermostat was pretty straightforward and the
HomeAssistant documentation was clear.
It required registering as a developer with ecobee,
then using a &lt;span class="caps"&gt;PIN&lt;/span&gt; to authenticate the&amp;nbsp;application.&lt;/p&gt;
&lt;h3 id="initial-thoughts"&gt;Initial&amp;nbsp;thoughts&lt;/h3&gt;
&lt;p&gt;Thus far I have to say I am a fan of HomeAssistant.
The biggest reason is that &lt;span class="caps"&gt;HA&lt;/span&gt; strives to be a unifier
of multiple products across multiple manufacturers.
Also I appreciate that it is focused on local data storage
as opposed to cloud-only.
Currently all of the thermostat data is being pulled from cloud storage,
but accordingly to some research it appears that I might be able to convert
it to local-only via&amp;nbsp;Homekit.&lt;/p&gt;
&lt;p&gt;Lastly, it doesn&amp;#8217;t hurt that HomeAssistant is primarily written
in python - my programming language of&amp;nbsp;choice.&lt;/p&gt;
&lt;h3 id="next-steps"&gt;Next&amp;nbsp;Steps&lt;/h3&gt;
&lt;p&gt;So, that&amp;#8217;s the story of our new smart thermostat and
HomeAssistant as the overall smart hub for our house.
Now that I&amp;#8217;ve accomplish a basic setup as a starting point,
next steps will&amp;nbsp;include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;configuring &lt;span class="caps"&gt;SSH&lt;/span&gt; to connect to the Pi from other&amp;nbsp;hosts&lt;/li&gt;
&lt;li&gt;setting up an external hard drive for redundancy and data&amp;nbsp;backups&lt;/li&gt;
&lt;li&gt;potentially moving to a different different &lt;span class="caps"&gt;SD&lt;/span&gt; card that is optimized for heavy&amp;nbsp;I/O&lt;/li&gt;
&lt;/ul&gt;</content><category term="story"/></entry><entry><title>Book Review: Python Testing with Pytest</title><link href="https://www.heavycivilbigdata.com/book-review-python-testing-with-pytest.html" rel="alternate"/><published>2022-08-01T00:00:00-04:00</published><updated>2022-08-01T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2022-08-01:/book-review-python-testing-with-pytest.html</id><summary type="html">&lt;p&gt;If you write python, you should use pytest.  If you use pytest, you need this&amp;nbsp;book.&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#python-testing-with-pytest"&gt;Python Testing With&amp;nbsp;pytest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#my-take"&gt;My&amp;nbsp;Take&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#strengths-and-weaknesses"&gt;Strengths and Weaknesses&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#pros"&gt;Pros&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cons"&gt;Cons&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;It&amp;#8217;s a bit embarrassing that I haven&amp;#8217;t posted anything in more than a year.
I need to get back on track with at least semi-regular blogging.
What better way to do so than to review the first hardcopy
book I&amp;#8217;ve purchased in 10+&amp;nbsp;years?&lt;/p&gt;
&lt;h2 id="python-testing-with-pytest"&gt;Python Testing With&amp;nbsp;pytest&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://pragprog.com/titles/bopytest2/python-testing-with-pytest-second-edition/"&gt;
&lt;img src="images/bopytest2.jpg" alt="Cover of the book Python Testing with pytest, second edition" height=480 width=400 /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been aware of this book for years.  It was written by Brian Okken,
who co-hosts the &lt;a href="https://pythonbytes.fm"&gt;Python Bytes&lt;/a&gt;
podcast.
I had some expendable income earlier this spring and decided that the time was right to pick up a copy.
Timing was on my side, as the 2nd edition had just been&amp;nbsp;released.&lt;/p&gt;
&lt;h2 id="my-take"&gt;My&amp;nbsp;Take&lt;/h2&gt;
&lt;p&gt;Working through this book was a fantastic experience.
It reminded me of earlier in my career when I had started
to learn some &lt;span class="caps"&gt;CAD&lt;/span&gt; software on my own.
My experience with pytest was similar - I was able to function
and had picked up the basics ok,
but there was a whole world of additional functionality
that I wasn&amp;#8217;t even aware of.
I could hear Brian&amp;#8217;s voice coming through in the prose
and it very much reminded me of learning from a senior-level expert.
In the case of this book, Brian strikes a great balance between
making valuable suggestions without being overly&amp;nbsp;prescriptive.&lt;/p&gt;
&lt;p&gt;I mostly tried to work through a chapter at a time.
Initially I did this purely by reading while away from the computer.
This meant that I got through the content fairly quickly,
but didn&amp;#8217;t retain a whole lot.
As expected, going through the content a second time by actually working the examples
in python was quite valuable.
I would say I spent roughly half of the time using the example code more or less
verbatim, with the remainder of the time spent applying the knowledge directly
on a&amp;nbsp;project.&lt;/p&gt;
&lt;p&gt;Early on, my python experience consisted primarily of
fairly simple packages and scripts run on the command line.
These were fairly straightforward to test,
and I was typically disciplined in following a &lt;span class="caps"&gt;TDD&lt;/span&gt; approach.
Correspondingly, these tools have held up well in&amp;nbsp;production.&lt;/p&gt;
&lt;p&gt;More recently I have been the primary developer of a serverless &lt;span class="caps"&gt;REST&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt;
connected to DynamoDB in &lt;span class="caps"&gt;AWS&lt;/span&gt;.
The system architecture here is quite a bit more complicated,
and I was really struggling with managing the state of the database
and building out a test suite that did not depend on a specific manual state
of the data.
I also was confounded by repeatability - the suite would be inconsistent between runs
as side effects of certain tests affected the function of other&amp;nbsp;tests.&lt;/p&gt;
&lt;p&gt;I was already using fixtures, but this book opened my eyes to all the nuances
available.
Particularly useful was learning about&amp;nbsp;the &lt;code&gt;--setup-show&lt;/code&gt; flag that would
provide a log of which fixtures were being called at which point.
I also learned about marks, test classes, and parametrization.
All of these tools have been incorporated into the testing plan for this&amp;nbsp;project.&lt;/p&gt;
&lt;p&gt;At a higher level, the testing strategy listed in Part &lt;span class="caps"&gt;II&lt;/span&gt; was very useful.
I was struggling to find a nice middle ground between tiny unit tests
and full on, end-to-end system tests.
Brian&amp;#8217;s guidance in the book helped me realize that I don&amp;#8217;t need to test &lt;strong&gt;everything&lt;/strong&gt;
involved in the app.
For example, part of the data strategy relies upon DynamoDB streams.
However, testing to confirm the emittance and format of a stream record
is not something this app needs to be concerned with.
Therefore I was able to greatly simplify the tests and build out some hard-coded test data.
This allowed for testing the stream triggers on my local machine,
which provides a much shorter feedback loop during debugging and&amp;nbsp;testing.&lt;/p&gt;
&lt;h2 id="strengths-and-weaknesses"&gt;Strengths and&amp;nbsp;Weaknesses&lt;/h2&gt;
&lt;p&gt;No technical book is perfect, but this sure is a strong&amp;nbsp;entry.&lt;/p&gt;
&lt;h3 id="pros"&gt;Pros&lt;/h3&gt;
&lt;p&gt;Overall I found the book to be balanced and well-paced.
The chapters build on each other somewhat,
but you can skip around if desired (as I did) and still get a lot of&amp;nbsp;value.&lt;/p&gt;
&lt;p&gt;Maybe most importantly, Brian makes a solid case for testing
early and often without forcing the reader into a
100% - &lt;span class="caps"&gt;TDD&lt;/span&gt; approach.
Chapter 7, &lt;em&gt;Strategy&lt;/em&gt;, is one of my favorite parts of the book as it lists
solid guidance that otherwise would only be acquired via multiple years of&amp;nbsp;experience.&lt;/p&gt;
&lt;p&gt;I haven&amp;#8217;t had a use case for it yet, but the book also covers a lot of ground
regarding &amp;#8220;modern&amp;#8221; python development using tools&amp;nbsp;like &lt;code&gt;pyproject.toml&lt;/code&gt; and &lt;code&gt;tox&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="cons"&gt;Cons&lt;/h3&gt;
&lt;p&gt;The only downside I can see is that the&amp;nbsp;example &lt;code&gt;Cards&lt;/code&gt; project is very basic
and primarily runs via the command line.
That&amp;#8217;s understandable as something more complicated would likely overwhelm
a rookie pythonista.
More involved testing, including tests of a &lt;span class="caps"&gt;REST&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt; and web interface,
are left as an exercise for the reader and probably are best suite to a tool
like &lt;a href="https://playwright.dev/python"&gt;Playwright&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This book has become another invaluable resource in my library,
both as a guide and also for reference purposes.
I&amp;#8217;m a firm believer in unit testing and code coverage,
and as a result of reading this book I&amp;#8217;m an even bigger fan&amp;nbsp;of &lt;code&gt;pytest&lt;/code&gt;.
At the end of the day, it&amp;#8217;s clear that
&lt;strong&gt;if you write python code, you need to use pytest.&lt;/strong&gt;
&lt;strong&gt;If you use pytest, you need this&amp;nbsp;book!&lt;/strong&gt;&lt;/p&gt;</content><category term="review"/><category term="python"/><category term="testing"/></entry><entry><title>Throwback Thursday - TiddlyWiki</title><link href="https://www.heavycivilbigdata.com/throwback-thursday-tiddlywiki.html" rel="alternate"/><published>2021-10-28T00:00:00-04:00</published><updated>2022-08-09T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2021-10-28:/throwback-thursday-tiddlywiki.html</id><summary type="html">&lt;p&gt;Getting things done with a personal, non-linear&amp;nbsp;notebook&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#a-new-pm-needs-to-get-things-done"&gt;A New &lt;span class="caps"&gt;PM&lt;/span&gt; Needs to Get Things Done&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#getting-things-done"&gt;Getting Things&amp;nbsp;Done&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#enter-tiddlywiki"&gt;Enter TiddlyWiki&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#this-is-great"&gt;This is&amp;nbsp;Great!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#this-is-not-so-great"&gt;This is Not So&amp;nbsp;Great&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#tweaking-outlook"&gt;Tweaking&amp;nbsp;Outlook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#onenote-the-one-notebook-to-rule-them-all"&gt;OneNote, The One Notebook To Rule Them&amp;nbsp;All&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#finding-a-place-for-tiddlywiki"&gt;Finding A Place For&amp;nbsp;TiddlyWiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#a-personal-linear-notebook-for-paper"&gt;A Personal, Linear Notebook For Paper&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#a-paper-list-of-what-needs-to-get-done"&gt;A Paper List of What Needs To Get&amp;nbsp;Done&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#lessons-learned"&gt;Lessons&amp;nbsp;Learned&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Here&amp;#8217;s a retrospective look back
on a path to personal&amp;nbsp;productivity. &lt;/p&gt;
&lt;h3 id="a-new-pm-needs-to-get-things-done"&gt;A New &lt;span class="caps"&gt;PM&lt;/span&gt; Needs to Get Things&amp;nbsp;Done&lt;/h3&gt;
&lt;p&gt;In 2007 I was 5 years into my career and reaching a typical inflection point
from junior project engineer to independent task responsibility and
project management.
My transition to project management actually happened rather quickly
and I soon realized I need to scale up my work planning and
organizational&amp;nbsp;habits.&lt;/p&gt;
&lt;h4 id="getting-things-done"&gt;Getting Things&amp;nbsp;Done&lt;/h4&gt;
&lt;p&gt;Around this time there was a bit of a movement brewing related to the challenges
of knowledge work as email volume was continuing to swell
and the general expectation that everyone could multi-task effectively,
all the time.
One particular personality seemed to rise above the fray in promoting
a &amp;#8220;mind like calm water&amp;#8221; philosophy for &lt;a href="https://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0143126563"&gt;Getting Things Done&lt;/a&gt;.
I bought the book in late fall, then obtained a label maker at Christmas
and got busy building out my personal filing&amp;nbsp;system.&lt;/p&gt;
&lt;p&gt;I also built out the recommended folder structure in Outlook and got busy
developing habits around reading an email once before deciding if it was a task,
something to keep for reference, or something to immediately delete.
I never became particularly fanatical about Inbox Zero,
but to this day I do tend to keep it below 100 messages at any given&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;As the book and associated philosophy gained steam, support tools began to spring up
such as a paid add-on for Microsoft Outlook that would provide further integration
between the tyranny of email and the new neural pathways being etched in my cranium.
I considered a purchase but my typically thrifty personality -
and interest in programming for the web -
lead me in a different&amp;nbsp;direction.&lt;/p&gt;
&lt;h3 id="enter-tiddlywiki"&gt;Enter&amp;nbsp;TiddlyWiki&lt;/h3&gt;
&lt;p&gt;Billing itself as a &lt;strong&gt;non linear notebook for the web&lt;/strong&gt;,
&lt;a href="https://tiddlywiki.com/"&gt;TiddlyWiki&lt;/a&gt; took the hotness of MediaWiki
and turned it into a single page app before a &lt;span class="caps"&gt;SPA&lt;/span&gt;
was really a thing.
This was back when Wikipedia was disrupting the universe
and a wiki was the solution to any and all manner of
thorny knowledge sharing challenges in the&amp;nbsp;workplace.&lt;/p&gt;
&lt;p&gt;TiddlyWiki included inline JavaScript
as the controller and stored data in divs called &amp;#8220;tiddlers&amp;#8221;.
You didn&amp;#8217;t need a database
because it&amp;#8217;s a self-contained single html file
and overriding browser settings to allow file access
meant you could even run it all on A &lt;span class="caps"&gt;USB&lt;/span&gt; stick
if you were so&amp;nbsp;inclined.&lt;/p&gt;
&lt;h4 id="this-is-great"&gt;This is&amp;nbsp;Great!&lt;/h4&gt;
&lt;p&gt;My team was growing and I moved more and more
into oversight, coaching, and coordination.
I could review my TiddlyWiki first thing
in the morning, then practice&amp;nbsp;some
&lt;code&gt;MBWA&lt;/code&gt; - Management By Walking&amp;nbsp;Around.&lt;/p&gt;
&lt;h4 id="this-is-not-so-great"&gt;This is Not So&amp;nbsp;Great&lt;/h4&gt;
&lt;p&gt;Over time, TiddlyWiki turned out to be not so great.
One primary shortcoming was that it didn&amp;#8217;t integrate with Outlook. 
I found that nearly all tasks that I had to deal with,
regardless of whether I was able to delegate or had to personally
handle it, started as an email message or meeting invite.
TiddlyWiki had some basic calendaring &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; reminder capabilities,
but it required manual effort in loading it up every day
and intentionally looking for things that were overdue
or had been flagged in the past for me to&amp;nbsp;review.&lt;/p&gt;
&lt;p&gt;Obviously calendars and reminders are baked right in to Outlook,
and this became even more obvious when I learned from a library book
that you could drag a message over to the calendar icon to turn it into
a calendar&amp;nbsp;reminder.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Incidentally, that library book never made it back&amp;#8230;&lt;/em&gt; so it earned
an ongoing residence on my bookshelf.
Most importantly, changes in &lt;span class="caps"&gt;IT&lt;/span&gt; policy following an acquisition
meant that end users could only run approved executables.
This meant I could no longer run a light instance of &lt;span class="caps"&gt;XAMPP&lt;/span&gt;
from the &lt;span class="caps"&gt;USB&lt;/span&gt; stick.
The only way I was able to make it work was to use &lt;span class="caps"&gt;IE6&lt;/span&gt;&amp;#8230;&amp;nbsp;yuck.&lt;/p&gt;
&lt;h3 id="tweaking-outlook"&gt;Tweaking&amp;nbsp;Outlook&lt;/h3&gt;
&lt;p&gt;So as I started to learn towards Outlook for day to day task management
I briefly considered investing in a plug-in to implement &lt;span class="caps"&gt;GTD&lt;/span&gt;.
It turned out that it was much easier to create the standard&amp;nbsp;folders:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@Next&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@WaitingFor&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@Future&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@Someday/Maybe&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I also implemented a&amp;nbsp;generic &lt;code&gt;Storage&lt;/code&gt; folder where all saved messages
would go by default.&amp;nbsp;Within &lt;code&gt;Storage&lt;/code&gt; I set up a series of search folders
to automatically group messages by the categories that I assigned -
typically by project.
This turned out to be a key cheat code in my ability
to file and recall information when needed.
That and threaded-message views set on by&amp;nbsp;default.&lt;/p&gt;
&lt;p&gt;I also started using the task list in Outlook.
As I mentioned above, most tasks came from email
so it seemed logical to flag messages so that they automatically
became tasks.
However I never really took to the default view in Outlook
so I started to print it out regularly.
But that just meant it was perpetually out of date.
Also, the red text for overdue tasks was causing additional
cognitive stress, so I kept adjusting dates -
which caused more stress because there was so much extra&amp;nbsp;work.&lt;/p&gt;
&lt;h3 id="onenote-the-one-notebook-to-rule-them-all"&gt;OneNote, The One Notebook To Rule Them&amp;nbsp;All&lt;/h3&gt;
&lt;p&gt;Then I got introduced to OneNote and learned that
it was the &lt;strong&gt;Right Way&lt;/strong&gt; to do this sort of thing. 
I gave it a shot and my first impression was that it might be  the
Trapper Keeper UltraKeeper 2000 that I never had in grade school. 
Plus I could &amp;#8220;print&amp;#8221; an email and store it
somewhere in OneNote.
That eventually became my downfall.
Once I had the categories and hierarchy built out,
I started bumping into problems where I couldn&amp;#8217;t find
where something should go.
Or maybe it should go in two places.
Maybe it was related to a specific past project
but might also be useful for an upcoming project
and so I wanted to file it there&amp;nbsp;also.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paralysis by analysis caused more and more mental friction, but at least I didn&amp;#8217;t need to ask for a bigger file&amp;nbsp;cabinet.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="finding-a-place-for-tiddlywiki"&gt;Finding A Place For&amp;nbsp;TiddlyWiki&lt;/h3&gt;
&lt;p&gt;It turns out that TiddlyWiki was a useful tool,
just not at $DAY_JOB.
I started to look for new opportunities and
embarked on a career pivot towards Virtual Design and Construction.
I started thinking through business plans for
Potentially going at it alone as a freelancer.
At the same time I spun up a presence on LinkedIn
And started cold-emailing &lt;span class="caps"&gt;HR&lt;/span&gt; staff about job postings.
I was tracking all of these interactions and planning my strategy
In TiddlyWiki, and it was a fantastic tool.
But technology alone usually doesn&amp;#8217;t get the job done -
There needs to be a personal connection between human beings.
I was getting efficient at generating cover letters
And resumes, but wasn&amp;#8217;t getting any&amp;nbsp;results.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It turns out that it&amp;#8217;s really, really hard to get an interview if you don&amp;#8217;t already know someone on the&amp;nbsp;inside.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Conversely, it can be a breeze if you have a strong network.
The good news is that you don&amp;#8217;t necessarily need
to spend a ton of effort to build out that network.
Treat others with respect, always give your best effort,
be quick to share praise and even quicker to take blame.
Co-workers will head off for other pastures and ultimately become
the connection that lets you bypass the line of unknown applicants
and go straight to the interview and hiring process.
At least, that&amp;#8217;s what worked for&amp;nbsp;me.&lt;/p&gt;
&lt;p&gt;Ok, back to the&amp;nbsp;story&amp;#8230;&lt;/p&gt;
&lt;h3 id="a-personal-linear-notebook-for-paper"&gt;A Personal, Linear Notebook For&amp;nbsp;Paper&lt;/h3&gt;
&lt;p&gt;If Dead Tree Format (&lt;span class="caps"&gt;DTF&lt;/span&gt;) is your thing, you&amp;#8217;ll need
some sort of notebook that you like.
Moleskine was popular back in the day (maybe it still is).
For me it worked out well that the&amp;nbsp;new &lt;code&gt;$DAY_JOB&lt;/code&gt;
had a long-standing tradition of using company-branded
half-sheet-ish sized notebooks for meeting notes,
informal phone logs, mind mapping, you name it.
Years earlier I had discovered the best pens in the universe,
the Pentel P6 line, because we used them for &lt;span class="caps"&gt;DTF&lt;/span&gt;-based
markups on plan sheets.
I definitely needed the red 0.5 mm
for markups because otherwise I couldn&amp;#8217;t be precise enough
with strike-throughs and my poor penmanship
would cause the ink to run together.
Then a bridge engineer showed up with a purple 0.7 - &lt;span class="caps"&gt;MIND&lt;/span&gt; &lt;span class="caps"&gt;BLOWN&lt;/span&gt;!!!
Anyway, back to the&amp;nbsp;present&amp;#8230;&lt;/p&gt;
&lt;p&gt;It turns out that when you&amp;#8217;re married to a teacher
you automatically get an inside track to the crazy-good
deals on school supplies.
These are the ones that show up after the back-to-school rush
is over and stores need to clear out&amp;nbsp;inventory.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m living like a king now with backups to the backups
and all sorts of fancy new colors.
Seriously - she&amp;#8217;s the&amp;nbsp;best!!&lt;/p&gt;
&lt;p&gt;&lt;img alt="An array of Pilot G2 pens in multiple colors" src="./images/tiddlywiki_pilotG2_rainbow.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Anyway, my half-size-sheet-ish notebook is the go-to for
day to day note-taking.
Each entry is separated by a horizontal line
and gets a topic and a date.
Which reminds me - &lt;strong&gt;&lt;span class="caps"&gt;ALWAYS&lt;/span&gt;&lt;/strong&gt; write the date on any piece of paper
that is going to stick around for more than say three months.
You will use the same type of paper for years and your handwriting
won&amp;#8217;t change, so going back through things later will be much
easier if it&amp;#8217;s all dated.
At least, that&amp;#8217;s what works for me.  &lt;span class="caps"&gt;YMMV&lt;/span&gt;.&lt;/p&gt;
&lt;h4 id="a-paper-list-of-what-needs-to-get-done"&gt;A Paper List of What Needs To Get&amp;nbsp;Done&lt;/h4&gt;
&lt;p&gt;So, I created a template that works for me and has a grid
of spaces for a typical 5-day work week
with an extra overflow to capture things in the medium-term.
As tasks are finished, I happily check them off and cross them out
in purple.
If something slips, I just draw a big arrow to another day
or re-write it on the next week&amp;#8217;s list
when I start building that out Monday morning.
Not only does this work well for me with minimal cerebral damage
but it also is a great antidote to the feeling you get on Friday
when you wonder where the week went and what you actually worked on
over the past 40-ish&amp;nbsp;hours.&lt;/p&gt;
&lt;h3 id="lessons-learned"&gt;Lessons&amp;nbsp;Learned&lt;/h3&gt;
&lt;p&gt;There&amp;#8217;s no single &amp;#8220;right way&amp;#8221; to organize knowledge work.
I like to think that I have taken good bits from various
people that I&amp;#8217;ve worked with along the way,
as well as implemented portions of specific systems
when it makes sense.
I already mentioned the folder structure that I use for
organizing email.
Similarly I also try to touch an email just once before deciding
if it needs action, should be kept for reference, or should
be deleted&amp;nbsp;immediately.&lt;/p&gt;
&lt;p&gt;Likewise I think I&amp;#8217;ve landed in a comfortable spot in terms of
digital work versus manual / paper work.
My workspace is mostly paperless - certainly much more so than it was
a decade ago - but not&amp;nbsp;entirely.&lt;/p&gt;
&lt;p&gt;So, here&amp;#8217;s to TiddlyWiki&amp;#8230; you were a great tool and an interesting
part of my career to&amp;nbsp;date.&lt;/p&gt;</content><category term="story"/><category term="productivity"/></entry><entry><title>Why You Need Civil BIM, not CAD</title><link href="https://www.heavycivilbigdata.com/why-you-need-civil-bim-not-cad.html" rel="alternate"/><published>2021-05-10T00:00:00-04:00</published><updated>2021-05-10T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2021-05-10:/why-you-need-civil-bim-not-cad.html</id><summary type="html">&lt;p&gt;Geometry + Attributes =&amp;nbsp;Features&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#cad-is-a-graphics-display-system-bim-is-a-feature-modeling-platform"&gt;&lt;span class="caps"&gt;CAD&lt;/span&gt; is a graphics display system, &lt;span class="caps"&gt;BIM&lt;/span&gt; is a feature modeling&amp;nbsp;platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-fallacy-of-data-organization-by-layer"&gt;The Fallacy of Data Organization By&amp;nbsp;Layer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#civil-cad-is-better-but-still-has-gaps"&gt;Civil &lt;span class="caps"&gt;CAD&lt;/span&gt; is better, but still has&amp;nbsp;gaps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#surface-modeling-is-not-bim"&gt;Surface modeling is not &lt;span class="caps"&gt;BIM&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-cad-is-merging-with-bim"&gt;How &lt;span class="caps"&gt;CAD&lt;/span&gt; is merging with &lt;span class="caps"&gt;BIM&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Much of the transportation industry is still operating
in a world of 2D &lt;span class="caps"&gt;CAD&lt;/span&gt;.
It&amp;#8217;s what we are familiar with and what we are comfortable
with, but it&amp;#8217;s&amp;nbsp;obsolete.&lt;/p&gt;
&lt;h3 id="cad-is-a-graphics-display-system-bim-is-a-feature-modeling-platform"&gt;&lt;span class="caps"&gt;CAD&lt;/span&gt; is a graphics display system, &lt;span class="caps"&gt;BIM&lt;/span&gt; is a feature modeling&amp;nbsp;platform&lt;/h3&gt;
&lt;p&gt;&lt;span class="caps"&gt;CAD&lt;/span&gt; originally stood for &lt;strong&gt;Computer-Aided Drafting&lt;/strong&gt; because its adoption basically entailed
taking the traditional drafting table and Leroy machine and replacing them&amp;nbsp;with
&lt;code&gt;MTEXT&lt;/code&gt; in AutoCAD.
Somewhere around the mid-oughts it became fashionable to add&amp;nbsp;another &lt;code&gt;D&lt;/code&gt; 
and talk about &lt;strong&gt;Computer-Aided Drafting and Design&lt;/strong&gt;.
Whether you prefer a single D or two, &lt;span class="caps"&gt;CAD&lt;/span&gt; is primarily about
geometry, dimensions and&amp;nbsp;text.&lt;/p&gt;
&lt;p&gt;The end goal is a set of construction plans,
and that&amp;#8217;s generally the end of the road.
There are no attributes or metadata to provide semantic
information about what is being represented.
Color, lineweight and linestyle are fixed,
not driven by data or&amp;nbsp;attribution.&lt;/p&gt;
&lt;h3 id="the-fallacy-of-data-organization-by-layer"&gt;The Fallacy of Data Organization By&amp;nbsp;Layer&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;As an aside, I&amp;#8217;m talking about Layer in terms of
an organizational construct within AutoCAD.
If you come from the Bentley side of the fence,
this term is interchangeable with&amp;nbsp;level.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In &lt;span class="caps"&gt;CAD&lt;/span&gt;, a layer is a display property.
It is all about whether or not something should show up
in a particular view.
Anyone with experience in a mis-configured system with
poor layer display management can understand the frustration
of never knowing if the sheets are going to be correct
until you plot&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;Anyway, the&amp;nbsp;term &lt;code&gt;layer&lt;/code&gt; goes back to manual drafting
where different types of information (topo survey,
alignments, etc.) were drafted in pencil
on individual mylar sheets,
then stacked together&amp;nbsp;in &lt;code&gt;layers&lt;/code&gt; before final inking
took place.
Again, this is an example of &lt;span class="caps"&gt;CAD&lt;/span&gt; being used as a digital
construct of the manual drafting era.
&amp;#8220;Here&amp;#8217;s how we do it on the board, so let&amp;#8217;s do the same
thing on the&amp;nbsp;computer&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Over time, layers became less about managing display
and more about managing information.
The primary way to differentiate between different features
such as survey vs. alignments was to carve out a sacred
text of layer names (or numbers, pre-V8) that were to be
utilized during all drafting activities.
This led to more and more layers being utilized and
resulted in working environments that might have upward of
2,000 standard&amp;nbsp;layers.&lt;/p&gt;
&lt;p&gt;One example I remember was a system that had separate
level names for each size of each type of storm sewer pipe.
This was for a &lt;span class="caps"&gt;DOT&lt;/span&gt; that had five types of pipe
and maybe a dozen standard diameters.
You would never have a situation where you wanted to display
all of the 12&amp;#8221; and 15&amp;#8221; pipes but not the 18&amp;#8221; ones on a plan
sheet, so a single layer for proposed storm sewer pipe
would have more than sufficed.
However, this system ended up with 60 different levels
to be used, requiring great amounts of effort
when an iteration of storm sewer system design would change
both the geometry and the pipe&amp;nbsp;diameter.&lt;/p&gt;
&lt;p&gt;As I recall, the primary driver for this arrangement
was that all &lt;span class="caps"&gt;CAD&lt;/span&gt; elements were to utilize ByLevel linetypes
and the system was configured to use custom linetypes
for the various pipe&amp;nbsp;diameters.&lt;/p&gt;
&lt;h3 id="civil-cad-is-better-but-still-has-gaps"&gt;Civil &lt;span class="caps"&gt;CAD&lt;/span&gt; is better, but still has&amp;nbsp;gaps&lt;/h3&gt;
&lt;p&gt;Legacy versions of Geopak provided rudimentary capabilities
to provide flexibility beyond the &amp;#8220;Level Name is the feature description&amp;#8221; mantra.
This was accomplished via use of adhoc attributes.
I saw this used most often for quantity takeoffs and pay item information.
In the example above, this would allow for the use of
a single level for all proposed pipes.
Integration with D &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; C Manager and use of plan view
criteria files could theoretically drive display properties
such as the custom linestyles of pipe diameters,
but it was not particularly sophisticated and required
expertise in text-based programming with C-based syntax.
&lt;em&gt;
(Somewhere on a neglected server there are mountains
of curly braces enjoying retirement after banging through
thousands of iterations of draw, draw skip, and mark&amp;nbsp;point).
&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="surface-modeling-is-not-bim"&gt;Surface modeling is not &lt;span class="caps"&gt;BIM&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Civil designers are quick to point to surface modeling
and contouring from digital terrain models as 3D modeling.
Since 3D modeling is an integral (but not the only!) component
of &lt;span class="caps"&gt;BIM&lt;/span&gt;, we can&amp;#8217;t really call this &lt;span class="caps"&gt;BIM&lt;/span&gt;.
Two&amp;nbsp;reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A surface model is actually 2.5D, not 3D, because you can&amp;#8217;t
   have a surface that backs up on itself or includes perfectly
   vertical edges.  In other words, each X,Y point in the 2D plane
   can intercept the triangulation once and only&amp;nbsp;once.&lt;/li&gt;
&lt;li&gt;There&amp;#8217;s no division between components.  Triangles for a curb
   bordered by a sidewalk on one side and pavement on the other
   are all part of the same blob of data.
   These elements can&amp;#8217;t be displayed or symbolized individually
   from a &lt;span class="caps"&gt;DTM&lt;/span&gt; and they can&amp;#8217;t be utilized for detailed quantity takeoffs.
   For true Civil &lt;span class="caps"&gt;BIM&lt;/span&gt;, you need closed 3D meshes with&amp;nbsp;metadata.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="how-cad-is-merging-with-bim"&gt;How &lt;span class="caps"&gt;CAD&lt;/span&gt; is merging with &lt;span class="caps"&gt;BIM&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;I first started developing this post a year ago,
and originally had this heading as &amp;#8220;The Future&amp;#8221;.
But truthfully, the future is now.
There&amp;#8217;s no need to wait for new tools and upcoming software releases -
the current tools are more than capable of supporting Civil &lt;span class="caps"&gt;BIM&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;This is evident in the current civil modeling platforms where
model elements are specialized data types based on feature definitions.
A 3D polyline isn&amp;#8217;t just a polyline, it&amp;#8217;s a linear feature defined
as w-beam guardrail at 6&amp;#8217;-3&amp;#8221; post spacing.
A mesh isn&amp;#8217;t just a mesh - it&amp;#8217;s a pavement component with material,
density, and pay item&amp;nbsp;definitions.&lt;/p&gt;
&lt;p&gt;On the Bentley side, Item Types are providing the additional capability
to develop specialized model elements that inherit from the basic &lt;span class="caps"&gt;DGN&lt;/span&gt;
element types (line, ellipse, point) in the spirit of object-oriented
programming.
Symbology can be driven by item type content via display styles, 
regardless of what level the features reside on. 
Recent upgrades to the &lt;span class="caps"&gt;CONNECT&lt;/span&gt; platform have increased the capability
of Item Types - particularly with the ability to limit properties
to a predefined list,&amp;nbsp;or &lt;code&gt;domain&lt;/code&gt; of values.
Coming back to the storm sewer example,&amp;nbsp;the &lt;code&gt;Pipe Type&lt;/code&gt; categorization would
be defined as a domain-limited field with values&amp;nbsp;of &lt;code&gt;1, 2, 3, 4&lt;/code&gt; and &lt;code&gt;5&lt;/code&gt; .&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;It&amp;#8217;s an exciting time to be in the transportation design and construction
industry.
The transition from &lt;span class="caps"&gt;CAD&lt;/span&gt; to &lt;span class="caps"&gt;BIM&lt;/span&gt; is every bit as revolutionary as the previous
transition from board drafting to &lt;span class="caps"&gt;CAD&lt;/span&gt;.
Proper execution of a well-reasoned &lt;span class="caps"&gt;BIM&lt;/span&gt; Execution Plan not only serves
the design and construction sectors, but lays the foundation for digital
twins and the metaverse of the&amp;nbsp;future.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(I claim bonus points for fitting in some major buzzwords there at the&amp;nbsp;end.&lt;/em&gt;&lt;/p&gt;</content><category term="opinion"/><category term="BIM"/><category term="VDC"/></entry><entry><title>Gemini Principles for Digital Twins</title><link href="https://www.heavycivilbigdata.com/gemini-principles-for-digital-twins.html" rel="alternate"/><published>2020-11-10T00:00:00-05:00</published><updated>2020-11-10T00:00:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2020-11-10:/gemini-principles-for-digital-twins.html</id><summary type="html">&lt;p&gt;principiis enim binarii&amp;nbsp;geminos&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#purpose"&gt;Purpose&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#public-good"&gt;Public&amp;nbsp;Good&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#value-creation"&gt;Value&amp;nbsp;Creation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#insight"&gt;Insight&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#trust"&gt;Trust&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#security"&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#openness"&gt;Openness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#quality"&gt;Quality&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#function"&gt;Function&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#federation"&gt;Federation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#curation"&gt;Curation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#evolution"&gt;Evolution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#wrapping-up"&gt;Wrapping&amp;nbsp;up&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;I recently took a swing at describing
&lt;a href="./what-is-a-digital-twin.html#what-is-a-digital-twin"&gt;my version of a digital twin&lt;/a&gt;.
At the time, I wasn&amp;#8217;t aware of much prior art other than
the typical hype cycle.
Recently, I was pleasantly surprised to come across
a framework for digital twins developed by
&lt;a href="https://www.cdbb.cam.ac.uk/"&gt;Centre for Digital Built Britain&lt;/a&gt;.
More specifically, the Digital Framework Task Group
has published a report outlining a common set of definitions
and principles related to the development and use of digital twins.
Termed the &lt;a href="https://www.cdbb.cam.ac.uk/system/files/documents/TheGeminiPrinciples.pdf"&gt;Gemini Principles&lt;/a&gt;,
this report outlines nine key principles within three groups of
purpose, trust, and&amp;nbsp;function.&lt;/p&gt;
&lt;h3 id="purpose"&gt;Purpose&lt;/h3&gt;
&lt;p&gt;Leading off, we see that a digital twin must have a clear purpose.
The three principles that define the purpose include
Public good, Value creation, and&amp;nbsp;Insight.&lt;/p&gt;
&lt;h4 id="public-good"&gt;Public&amp;nbsp;Good&lt;/h4&gt;
&lt;p&gt;From the&amp;nbsp;text:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Must be used to deliver genuine public benefit in&amp;nbsp;perpetuity&amp;#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My&amp;nbsp;take:&lt;/p&gt;
&lt;p&gt;This is a great start.
If a digital twin isn&amp;#8217;t going to benefit its consumers,
then why expend the effort to create and maintain&amp;nbsp;it?&lt;/p&gt;
&lt;h4 id="value-creation"&gt;Value&amp;nbsp;Creation&lt;/h4&gt;
&lt;p&gt;From the&amp;nbsp;text:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Must enable value creation and performance&amp;nbsp;improvement&amp;#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My&amp;nbsp;take:&lt;/p&gt;
&lt;p&gt;This principle drives at a key question when discussing digital twins - 
&amp;#8220;What do I get?&amp;#8221;.
And the answer here isn&amp;#8217;t one-size-fits-all.
Digital twins need to be flexible and tailored to specific use cases
and needs - often most clearly identified as &amp;#8220;pain points&amp;#8221; within
the current state of an entity or process.
The second part of this principle points to a common use case
where an effective digital twin will improve performance
as measured by key indicators such as percentage of a transit system&amp;#8217;s on-time service
or pavement condition over time relative to what was predicted by the mix&amp;nbsp;design.&lt;/p&gt;
&lt;h4 id="insight"&gt;Insight&lt;/h4&gt;
&lt;p&gt;From the&amp;nbsp;text:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Must provide determinable insight into the built&amp;nbsp;environment&amp;#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My&amp;nbsp;take:&lt;/p&gt;
&lt;p&gt;This has been my go-to term when making the case for infrastructure digital twins.
A primary challenge in maintaining the built environment is that
much of the critical components are hidden out of sight.
In a building, drywall conceals the framing and electrical wiring.
On a bridge, the rebar is invisible underneath its concrete encasement.
Stormwater drainage systems operate by gravity and therefore have to be
underground to be of much use.
Capturing all of that information in a digital twin provides &amp;#8220;X-ray vision&amp;#8221;
of these hidden components via 3D viewers and Virtual Reality or Mixed Reality environments.
In the bridge example, an inspector can see a surface crack in a column and correlate
its physical location to the as-designed or (preferably)
as-built reinforcement model within the digital twin.
The criticality of the observed cracking as it relates to overall structural integrity
can then be assessed in real-time without having to return to the office to track down record plans on&amp;nbsp;microfiche.&lt;/p&gt;
&lt;h3 id="trust"&gt;Trust&lt;/h3&gt;
&lt;p&gt;Next, we see that a digital twin must be trustworthy.
Trustworthiness is demonstrated by Security, Openness, and&amp;nbsp;Quality.&lt;/p&gt;
&lt;h4 id="security"&gt;Security&lt;/h4&gt;
&lt;p&gt;From the&amp;nbsp;text:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Must enable security and be secure&amp;nbsp;itself&amp;#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My&amp;nbsp;take:&lt;/p&gt;
&lt;p&gt;As digital citizens of the 21st century,
we can all understand the need for security,
even when it comes at the cost of convenience.
It can be frustrating to have to reach for a hardware key when
two-factor authentication is required, but the internet never forgets
and you can&amp;#8217;t put the toothpaste back in the tube after a data&amp;nbsp;breach.&lt;/p&gt;
&lt;h4 id="openness"&gt;Openness&lt;/h4&gt;
&lt;p&gt;From the&amp;nbsp;text:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Must be as open as&amp;nbsp;possible&amp;#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My&amp;nbsp;take:&lt;/p&gt;
&lt;p&gt;Data wants to be free, and no one should be excluded from the benefits
of a digital twin just because they haven&amp;#8217;t bought in to proprietary systems
or aren&amp;#8217;t running a mainstream operating system.
The Information Age is founded upon open standards such as &lt;span class="caps"&gt;TCP&lt;/span&gt;/&lt;span class="caps"&gt;IP&lt;/span&gt; and &lt;span class="caps"&gt;HTML&lt;/span&gt;
and a digital twin should be no&amp;nbsp;different.&lt;/p&gt;
&lt;h4 id="quality"&gt;Quality&lt;/h4&gt;
&lt;p&gt;From the&amp;nbsp;text:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Must be built on data of an appropriate&amp;nbsp;quality&amp;#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My&amp;nbsp;take:&lt;/p&gt;
&lt;p&gt;This immediately makes me think of Level of Development (&lt;span class="caps"&gt;LOD&lt;/span&gt;)
when used in the context of Building Information Modeling (&lt;span class="caps"&gt;BIM&lt;/span&gt;).
If you are going to fabricate replacement parts based on the geometry
stored in the digital twin, then that data had well better meet
&lt;span class="caps"&gt;LOD&lt;/span&gt; 350 or higher.
Conversely it is possible to have too much of a good thing.
Geometric detail requires more bytes per unit of physical asset and
these storage needs may not scale well across a huge system such as
a statewide transportation&amp;nbsp;inventory.&lt;/p&gt;
&lt;h3 id="function"&gt;Function&lt;/h3&gt;
&lt;p&gt;Rounding out the Gemini Principles, we see that a digital twin
must function effectively by providing Federation, Curation, and&amp;nbsp;Evolution.&lt;/p&gt;
&lt;h4 id="federation"&gt;Federation&lt;/h4&gt;
&lt;p&gt;From the&amp;nbsp;text:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Must be based on a standard connected&amp;nbsp;environment&amp;#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My&amp;nbsp;take:&lt;/p&gt;
&lt;p&gt;Again, my mind goes to the division of information within
a &lt;span class="caps"&gt;BIM&lt;/span&gt; environment.
Each design discipline is responsible for modeling their
portion of the work, be it structural, electrical, civil, etc.
These models are then connected and combined into a common
data environment where clash detection can be performed and
the proposed work can be evaluated as a whole.
This principle also applies to the Operations and Maintenance phase.
For example, a department of transportation may have responsibility
divided between organizational units focused on bridges, pavements,
environmental resources, ancillary structures, and other subsystems.
Too often data is siloed and constrained by blockage between disparate systems.
An effective digital twin eliminates blockage and allows for frictionless
information sharing across all&amp;nbsp;participants.&lt;/p&gt;
&lt;h4 id="curation"&gt;Curation&lt;/h4&gt;
&lt;p&gt;From the&amp;nbsp;text:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Must have clear ownership, governance and&amp;nbsp;regulation&amp;#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My&amp;nbsp;take:&lt;/p&gt;
&lt;p&gt;Absolutely!  In my career I&amp;#8217;ve experienced this need most often
when sharing &lt;span class="caps"&gt;CAD&lt;/span&gt; data.
Downstream users tend to distrust any information provided by a third
party and governance is typically managed informally
via handshake agreements.
I&amp;#8217;ve also experienced curation done well when consuming aerial imagery
and digital elevation models that contain metadata identifying the party
that generated the information and outlining its permissable use.
More recently I&amp;#8217;ve noted that open data portals tend to provide
clear curation information that is standardized and accessed just as
easily as the data&amp;nbsp;itself.&lt;/p&gt;
&lt;h4 id="evolution"&gt;Evolution&lt;/h4&gt;
&lt;p&gt;From the&amp;nbsp;text:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Must be able to adapt as technology and society&amp;nbsp;evolve&amp;#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My&amp;nbsp;take:&lt;/p&gt;
&lt;p&gt;The text mentions that the Gemini Principles are &amp;#8220;descriptive of intent
but agnostic on solutions&amp;#8221;.
Nowhere is this seen more clearly than in this final principle.
A digital twin doesn&amp;#8217;t have to chase fads or constantly be reinvented
in the latest javascript framework flavor of the month. 
It does have to evolve to meet additional maturation of technology.
A great example is the (relatively) recent shift from traditional
desktop machines to mobile devices.
Responsive layouts have emerged to meet the users where they are,
and there are certain to be new challenges and innovations in the future
that will shape the format and delivery of digital twins.
My guess is that the next big shift will involve widespread adoption of
augmented reality devices and the patterns that form for
effective and efficient user experiences with this type of&amp;nbsp;hardware.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping&amp;nbsp;up&lt;/h2&gt;
&lt;p&gt;So there it is - a nice symmetry of 3 groups of 3 principles each.
Short enough to be easily digested while open-ended enough to guide
discussions and drill down to the value that a digital twin will provide
- whatever the use case or user base.
I&amp;#8217;m grateful for the work done by the Centre for Digital Built Britain
and all contributing individuals that had a role in developing this guidance.
It has certainly helped me personally in providing a framework of
understanding around the nebulous concept of digital twins
and I&amp;#8217;m equally certain that it will continue to be of good use
in the future when seeking to develop digital twins as a means
of value creation as opposed to bandwagon&amp;nbsp;jumping.&lt;/p&gt;</content><category term="opinion"/><category term="digital twin"/></entry><entry><title>Miles per burrito</title><link href="https://www.heavycivilbigdata.com/miles-per-burrito.html" rel="alternate"/><published>2020-04-06T00:00:00-04:00</published><updated>2020-04-06T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2020-04-06:/miles-per-burrito.html</id><summary type="html">&lt;p&gt;con salsa&amp;nbsp;verde&lt;/p&gt;</summary><content type="html">&lt;style type="text/css"&gt;/*!
*
* IPython notebook
*
*/
/* &lt;span class="caps"&gt;CSS&lt;/span&gt; font colors for translated &lt;span class="caps"&gt;ANSI&lt;/span&gt; escape sequences */
/* The color values are a mix of
   http://www.xcolors.net/dl/baskerville-ivorylight and
   http://www.xcolors.net/dl/euphrasia */
.ansi-black-fg {
  color: #&lt;span class="caps"&gt;3E424D&lt;/span&gt;;
}
.ansi-black-bg {
  background-color: #&lt;span class="caps"&gt;3E424D&lt;/span&gt;;
}
.ansi-black-intense-fg {
  color: #282C36;
}
.ansi-black-intense-bg {
  background-color: #282C36;
}
.ansi-red-fg {
  color: #&lt;span class="caps"&gt;E75C58&lt;/span&gt;;
}
.ansi-red-bg {
  background-color: #&lt;span class="caps"&gt;E75C58&lt;/span&gt;;
}
.ansi-red-intense-fg {
  color: #&lt;span class="caps"&gt;B22B31&lt;/span&gt;;
}
.ansi-red-intense-bg {
  background-color: #&lt;span class="caps"&gt;B22B31&lt;/span&gt;;
}
.ansi-green-fg {
  color: #00A250;
}
.ansi-green-bg {
  background-color: #00A250;
}
.ansi-green-intense-fg {
  color: #007427;
}
.ansi-green-intense-bg {
  background-color: #007427;
}
.ansi-yellow-fg {
  color: #&lt;span class="caps"&gt;DDB62B&lt;/span&gt;;
}
.ansi-yellow-bg {
  background-color: #&lt;span class="caps"&gt;DDB62B&lt;/span&gt;;
}
.ansi-yellow-intense-fg {
  color: #&lt;span class="caps"&gt;B27D12&lt;/span&gt;;
}
.ansi-yellow-intense-bg {
  background-color: #&lt;span class="caps"&gt;B27D12&lt;/span&gt;;
}
.ansi-blue-fg {
  color: #&lt;span class="caps"&gt;208FFB&lt;/span&gt;;
}
.ansi-blue-bg {
  background-color: #&lt;span class="caps"&gt;208FFB&lt;/span&gt;;
}
.ansi-blue-intense-fg {
  color: #&lt;span class="caps"&gt;0065CA&lt;/span&gt;;
}
.ansi-blue-intense-bg {
  background-color: #&lt;span class="caps"&gt;0065CA&lt;/span&gt;;
}
.ansi-magenta-fg {
  color: #&lt;span class="caps"&gt;D160C4&lt;/span&gt;;
}
.ansi-magenta-bg {
  background-color: #&lt;span class="caps"&gt;D160C4&lt;/span&gt;;
}
.ansi-magenta-intense-fg {
  color: #A03196;
}
.ansi-magenta-intense-bg {
  background-color: #A03196;
}
.ansi-cyan-fg {
  color: #&lt;span class="caps"&gt;60C6C8&lt;/span&gt;;
}
.ansi-cyan-bg {
  background-color: #&lt;span class="caps"&gt;60C6C8&lt;/span&gt;;
}
.ansi-cyan-intense-fg {
  color: #&lt;span class="caps"&gt;258F8F&lt;/span&gt;;
}
.ansi-cyan-intense-bg {
  background-color: #&lt;span class="caps"&gt;258F8F&lt;/span&gt;;
}
.ansi-white-fg {
  color: #&lt;span class="caps"&gt;C5C1B4&lt;/span&gt;;
}
.ansi-white-bg {
  background-color: #&lt;span class="caps"&gt;C5C1B4&lt;/span&gt;;
}
.ansi-white-intense-fg {
  color: #&lt;span class="caps"&gt;A1A6B2&lt;/span&gt;;
}
.ansi-white-intense-bg {
  background-color: #&lt;span class="caps"&gt;A1A6B2&lt;/span&gt;;
}
.ansi-default-inverse-fg {
  color: #&lt;span class="caps"&gt;FFFFFF&lt;/span&gt;;
}
.ansi-default-inverse-bg {
  background-color: #000000;
}
.ansi-bold {
  font-weight: bold;
}
.ansi-underline {
  text-decoration: underline;
}
/* The following styles are deprecated an will be removed in a future version */
.ansibold {
  font-weight: bold;
}
.ansi-inverse {
  outline: 0.5px dotted;
}
/* use dark versions for foreground, to improve visibility */
.ansiblack {
  color: black;
}
.ansired {
  color: darkred;
}
.ansigreen {
  color: darkgreen;
}
.ansiyellow {
  color: #c4a000;
}
.ansiblue {
  color: darkblue;
}
.ansipurple {
  color: darkviolet;
}
.ansicyan {
  color: steelblue;
}
.ansigray {
  color: gray;
}
/* and light for background, for the same reason */
.ansibgblack {
  background-color: black;
}
.ansibgred {
  background-color: red;
}
.ansibggreen {
  background-color: green;
}
.ansibgyellow {
  background-color: yellow;
}
.ansibgblue {
  background-color: blue;
}
.ansibgpurple {
  background-color: magenta;
}
.ansibgcyan {
  background-color: cyan;
}
.ansibggray {
  background-color: gray;
}
div.cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  border-radius: 2px;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  border-width: 1px;
  border-style: solid;
  border-color: transparent;
  width: 100%;
  padding: 5px;
  /* This acts as a spacer between cells, that is outside the border */
  margin: 0px;
  outline: none;
  position: relative;
  overflow: visible;
}
div.cell:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: transparent;
}
div.cell.jupyter-soft-selected {
  border-left-color: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
  border-left-width: 1px;
  padding-left: 5px;
  border-right-color: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
  border-right-width: 1px;
  background: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
}
@media print {
  div.cell.jupyter-soft-selected {
    border-color: transparent;
  }
}
div.cell.selected,
div.cell.selected.jupyter-soft-selected {
  border-color: #ababab;
}
div.cell.selected:before,
div.cell.selected.jupyter-soft-selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #&lt;span class="caps"&gt;42A5F5&lt;/span&gt;;
}
@media print {
  div.cell.selected,
  div.cell.selected.jupyter-soft-selected {
    border-color: transparent;
  }
}
.edit_mode div.cell.selected {
  border-color: #&lt;span class="caps"&gt;66BB6A&lt;/span&gt;;
}
.edit_mode div.cell.selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #&lt;span class="caps"&gt;66BB6A&lt;/span&gt;;
}
@media print {
  .edit_mode div.cell.selected {
    border-color: transparent;
  }
}
.prompt {
  /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */
  min-width: 14ex;
  /* This padding is tuned to match the padding on the CodeMirror editor. */
  padding: 0.4em;
  margin: 0px;
  font-family: monospace;
  text-align: right;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
  /* Don't highlight prompt number selection */
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  /* Use default cursor */
  cursor: default;
}
@media (max-width: 540px) {
  .prompt {
    text-align: left;
  }
}
div.inner_cell {
  min-width: 0;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_area {
  border: 1px solid #cfcfcf;
  border-radius: 2px;
  background: #f7f7f7;
  line-height: 1.21429em;
}
/* This is needed so that empty prompt areas can collapse to zero height when there
   is no content in the output_subarea and the prompt. The main purpose of this is
   to make sure that empty JavaScript output_subareas have no height. */
div.prompt:empty {
  padding-top: 0;
  padding-bottom: 0;
}
div.unrecognized_cell {
  padding: 5px 5px 5px 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.unrecognized_cell .inner_cell {
  border-radius: 2px;
  padding: 5px;
  font-weight: bold;
  color: red;
  border: 1px solid #cfcfcf;
  background: #eaeaea;
}
div.unrecognized_cell .inner_cell a {
  color: inherit;
  text-decoration: none;
}
div.unrecognized_cell .inner_cell a:hover {
  color: inherit;
  text-decoration: none;
}
@media (max-width: 540px) {
  div.unrecognized_cell &gt; div.prompt {
    display: none;
  }
}
div.code_cell {
  /* avoid page breaking on code cells when printing */
}
@media print {
  div.code_cell {
    page-break-inside: avoid;
  }
}
/* any special styling for code cells that are currently running goes here */
div.input {
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.input {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_prompt {
  color: #&lt;span class="caps"&gt;303F9F&lt;/span&gt;;
  border-top: 1px solid transparent;
}
div.input_area &gt; div.highlight {
  margin: 0.4em;
  border: none;
  padding: 0px;
  background-color: transparent;
}
div.input_area &gt; div.highlight &gt; pre {
  margin: 0px;
  border: none;
  padding: 0px;
  background-color: transparent;
}
/* The following gets added to the &lt;head&gt; if it is detected that the user has a
 * monospace font with inconsistent normal/bold/italic height.  See
 * notebookmain.js.  Such fonts will have keywords vertically offset with
 * respect to the rest of the text.  The user should select a better font.
 * See: https://github.com/ipython/ipython/issues/1503
 *
 * .CodeMirror span {
 *      vertical-align: bottom;
 * }
 */
.CodeMirror {
  line-height: 1.21429em;
  /* Changed from 1em to our global default */
  font-size: 14px;
  height: auto;
  /* Changed to auto to autogrow */
  background: none;
  /* Changed from white to allow our bg to show through */
}
.CodeMirror-scroll {
  /*  The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/
  /*  We have found that if it is visible, vertical scrollbars appear with font size changes.*/
  overflow-y: hidden;
  overflow-x: auto;
}
.CodeMirror-lines {
  /* In &lt;span class="caps"&gt;CM2&lt;/span&gt;, this used to be 0.4em, but in &lt;span class="caps"&gt;CM3&lt;/span&gt; it went to 4px. We need the em value because */
  /* we have set a different line-height and want this to scale with that. */
  /* Note that this should set vertical padding only, since CodeMirror assumes
       that horizontal padding will be set on CodeMirror pre */
  padding: 0.4em 0;
}
.CodeMirror-linenumber {
  padding: 0 8px 0 4px;
}
.CodeMirror-gutters {
  border-bottom-left-radius: 2px;
  border-top-left-radius: 2px;
}
.CodeMirror pre {
  /* In &lt;span class="caps"&gt;CM3&lt;/span&gt; this went to 4px from 0 in &lt;span class="caps"&gt;CM2&lt;/span&gt;. This sets horizontal padding only,
    use .CodeMirror-lines for vertical */
  padding: 0 0.4em;
  border: 0;
  border-radius: 0;
}
.CodeMirror-cursor {
  border-left: 1.4px solid black;
}
@media screen and (min-width: 2138px) and (max-width: 4319px) {
  .CodeMirror-cursor {
    border-left: 2px solid black;
  }
}
@media screen and (min-width: 4320px) {
  .CodeMirror-cursor {
    border-left: 4px solid black;
  }
}
/*

Original style from softwaremaniacs.org (c) Ivan Sagalaev &lt;Maniac@SoftwareManiacs.Org&gt;
Adapted from GitHub theme

*/
.highlight-base {
  color: #000;
}
.highlight-variable {
  color: #000;
}
.highlight-variable-2 {
  color: #1a1a1a;
}
.highlight-variable-3 {
  color: #333333;
}
.highlight-string {
  color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;;
}
.highlight-comment {
  color: #408080;
  font-style: italic;
}
.highlight-number {
  color: #080;
}
.highlight-atom {
  color: #88F;
}
.highlight-keyword {
  color: #008000;
  font-weight: bold;
}
.highlight-builtin {
  color: #008000;
}
.highlight-error {
  color: #f00;
}
.highlight-operator {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
  font-weight: bold;
}
.highlight-meta {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
}
/* previously not defined, copying from default codemirror */
.highlight-def {
  color: #00f;
}
.highlight-string-2 {
  color: #f50;
}
.highlight-qualifier {
  color: #555;
}
.highlight-bracket {
  color: #997;
}
.highlight-tag {
  color: #170;
}
.highlight-attribute {
  color: #00c;
}
.highlight-header {
  color: blue;
}
.highlight-quote {
  color: #090;
}
.highlight-link {
  color: #00c;
}
/* apply the same style to codemirror */
.cm-s-ipython span.cm-keyword {
  color: #008000;
  font-weight: bold;
}
.cm-s-ipython span.cm-atom {
  color: #88F;
}
.cm-s-ipython span.cm-number {
  color: #080;
}
.cm-s-ipython span.cm-def {
  color: #00f;
}
.cm-s-ipython span.cm-variable {
  color: #000;
}
.cm-s-ipython span.cm-operator {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
  font-weight: bold;
}
.cm-s-ipython span.cm-variable-2 {
  color: #1a1a1a;
}
.cm-s-ipython span.cm-variable-3 {
  color: #333333;
}
.cm-s-ipython span.cm-comment {
  color: #408080;
  font-style: italic;
}
.cm-s-ipython span.cm-string {
  color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;;
}
.cm-s-ipython span.cm-string-2 {
  color: #f50;
}
.cm-s-ipython span.cm-meta {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
}
.cm-s-ipython span.cm-qualifier {
  color: #555;
}
.cm-s-ipython span.cm-builtin {
  color: #008000;
}
.cm-s-ipython span.cm-bracket {
  color: #997;
}
.cm-s-ipython span.cm-tag {
  color: #170;
}
.cm-s-ipython span.cm-attribute {
  color: #00c;
}
.cm-s-ipython span.cm-header {
  color: blue;
}
.cm-s-ipython span.cm-quote {
  color: #090;
}
.cm-s-ipython span.cm-link {
  color: #00c;
}
.cm-s-ipython span.cm-error {
  color: #f00;
}
.cm-s-ipython span.cm-tab {
  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);
  background-position: right;
  background-repeat: no-repeat;
}
div.output_wrapper {
  /* this position must be relative to enable descendents to be absolute within it */
  position: relative;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  z-index: 1;
}
/* class for the output area when it should be height-limited */
div.output_scroll {
  /* ideally, this would be max-height, but &lt;span class="caps"&gt;FF&lt;/span&gt; barfs all over that */
  height: 24em;
  /* &lt;span class="caps"&gt;FF&lt;/span&gt; needs this *and the wrapper* to specify full width, or it will shrinkwrap */
  width: 100%;
  overflow: auto;
  border-radius: 2px;
  -webkit-box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  display: block;
}
/* output div while it is collapsed */
div.output_collapsed {
  margin: 0px;
  padding: 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
div.out_prompt_overlay {
  height: 100%;
  padding: 0px 0.4em;
  position: absolute;
  border-radius: 2px;
}
div.out_prompt_overlay:hover {
  /* use inner shadow to get border that is computed the same on WebKit/&lt;span class="caps"&gt;FF&lt;/span&gt; */
  -webkit-box-shadow: inset 0 0 1px #000;
  box-shadow: inset 0 0 1px #000;
  background: rgba(240, 240, 240, 0.5);
}
div.output_prompt {
  color: #D84315;
}
/* This class is the outer container of all output sections. */
div.output_area {
  padding: 0px;
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.output_area .MathJax_Display {
  text-align: left !important;
}
div.output_area 
div.output_area 
div.output_area img,
div.output_area svg {
  max-width: 100%;
  height: auto;
}
div.output_area img.unconfined,
div.output_area svg.unconfined {
  max-width: none;
}
div.output_area .mglyph &gt; img {
  max-width: none;
}
/* This is needed to protect the pre formating from global settings such
   as that of bootstrap */
.output {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.output_area {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
div.output_area pre {
  margin: 0;
  padding: 1px 0 1px 0;
  border: 0;
  vertical-align: baseline;
  color: black;
  background-color: transparent;
  border-radius: 0;
}
/* This class is for the output subarea inside the output_area and after
   the prompt div. */
div.output_subarea {
  overflow-x: auto;
  padding: 0.4em;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
  max-width: calc(100% - 14ex);
}
div.output_scroll div.output_subarea {
  overflow-x: visible;
}
/* The rest of the output_* classes are for special styling of the different
   output types */
/* all text output has this class: */
div.output_text {
  text-align: left;
  color: #000;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
}
/* stdout/stderr are 'text' as well as 'stream', but execute_result/error are *not* streams */
div.output_stderr {
  background: #fdd;
  /* very light red background for stderr */
}
div.output_latex {
  text-align: left;
}
/* Empty output_javascript divs should have no height */
div.output_javascript:empty {
  padding: 0;
}
.js-error {
  color: darkred;
}
/* raw_input styles */
div.raw_input_container {
  line-height: 1.21429em;
  padding-top: 5px;
}
pre.raw_input_prompt {
  /* nothing needed here. */
}
input.raw_input {
  font-family: monospace;
  font-size: inherit;
  color: inherit;
  width: auto;
  /* make sure input baseline aligns with prompt */
  vertical-align: baseline;
  /* padding + margin = 0.5em between prompt and cursor */
  padding: 0em 0.25em;
  margin: 0em 0.25em;
}
input.raw_input:focus {
  box-shadow: none;
}
p.p-space {
  margin-bottom: 10px;
}
div.output_unrecognized {
  padding: 5px;
  font-weight: bold;
  color: red;
}
div.output_unrecognized a {
  color: inherit;
  text-decoration: none;
}
div.output_unrecognized a:hover {
  color: inherit;
  text-decoration: none;
}
.rendered_html {
  color: #000;
  /* any extras will just be numbers: */
}



.rendered_html :link {
  text-decoration: underline;
}
.rendered_html :visited {
  text-decoration: underline;
}






.rendered_html h1:first-child {
  margin-top: 0.538em;
}
.rendered_html h2:first-child {
  margin-top: 0.636em;
}
.rendered_html h3:first-child {
  margin-top: 0.777em;
}
.rendered_html h4:first-child {
  margin-top: 1em;
}
.rendered_html h5:first-child {
  margin-top: 1em;
}
.rendered_html h6:first-child {
  margin-top: 1em;
}
.rendered_html ul:not(.list-inline),
.rendered_html ol:not(.list-inline) {
  padding-left: 2em;
}








.rendered_html * + ul {
  margin-top: 1em;
}
.rendered_html * + ol {
  margin-top: 1em;
}





.rendered_html pre,




.rendered_html tr,
.rendered_html th,


.rendered_html tbody tr:nth-child(odd) {
  background: #f5f5f5;
}
.rendered_html tbody tr:hover {
  background: rgba(66, 165, 245, 0.2);
}
.rendered_html * + table {
  margin-top: 1em;
}

.rendered_html * + p {
  margin-top: 1em;
}

.rendered_html * + img {
  margin-top: 1em;
}
.rendered_html img,

.rendered_html img.unconfined,


.rendered_html * + .alert {
  margin-top: 1em;
}
[dir="rtl"] 
div.text_cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.text_cell &gt; div.prompt {
    display: none;
  }
}
div.text_cell_render {
  /*font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;*/
  outline: none;
  resize: none;
  width: inherit;
  border-style: none;
  padding: 0.5em 0.5em 0.5em 0.4em;
  color: #000;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}
a.anchor-link:link {
  text-decoration: none;
  padding: 0px 20px;
  visibility: hidden;
}
h1:hover .anchor-link,
h2:hover .anchor-link,
h3:hover .anchor-link,
h4:hover .anchor-link,
h5:hover .anchor-link,
h6:hover .anchor-link {
  visibility: visible;
}
.text_cell.rendered .input_area {
  display: none;
}
.text_cell.rendered 
.text_cell.rendered .rendered_html tr,
.text_cell.rendered .rendered_html th,
.text_cell.rendered 
.text_cell.unrendered .text_cell_render {
  display: none;
}
.text_cell .dropzone .input_area {
  border: 2px dashed #bababa;
  margin: -1px;
}
.cm-header-1,
.cm-header-2,
.cm-header-3,
.cm-header-4,
.cm-header-5,
.cm-header-6 {
  font-weight: bold;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.cm-header-1 {
  font-size: 185.7%;
}
.cm-header-2 {
  font-size: 157.1%;
}
.cm-header-3 {
  font-size: 128.6%;
}
.cm-header-4 {
  font-size: 110%;
}
.cm-header-5 {
  font-size: 100%;
  font-style: italic;
}
.cm-header-6 {
  font-size: 100%;
  font-style: italic;
}
&lt;/style&gt;
&lt;style type="text/css"&gt;pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 .highlight pre  .hll { background-color: #ffffcc }
 .highlight pre  { background: #f8f8f8; }
 .highlight pre  .c { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment */
 .highlight pre  .err { border: 1px solid #F00 } /* Error */
 .highlight pre  .k { color: #008000; font-weight: bold } /* Keyword */
 .highlight pre  .o { color: #666 } /* Operator */
 .highlight pre  .ch { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Hashbang */
 .highlight pre  .cm { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Multiline */
 .highlight pre  .cp { color: #9C6500 } /* Comment.Preproc */
 .highlight pre  .cpf { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.PreprocFile */
 .highlight pre  .c1 { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Single */
 .highlight pre  .cs { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Special */
 .highlight pre  .gd { color: #A00000 } /* Generic.Deleted */
 .highlight pre  .ge { font-style: italic } /* Generic.Emph */
 .highlight pre  .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
 .highlight pre  .gr { color: #E40000 } /* Generic.Error */
 .highlight pre  .gh { color: #000080; font-weight: bold } /* Generic.Heading */
 .highlight pre  .gi { color: #008400 } /* Generic.Inserted */
 .highlight pre  .go { color: #717171 } /* Generic.Output */
 .highlight pre  .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
 .highlight pre  .gs { font-weight: bold } /* Generic.Strong */
 .highlight pre  .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
 .highlight pre  .gt { color: #04D } /* Generic.Traceback */
 .highlight pre  .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
 .highlight pre  .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
 .highlight pre  .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
 .highlight pre  .kp { color: #008000 } /* Keyword.Pseudo */
 .highlight pre  .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
 .highlight pre  .kt { color: #B00040 } /* Keyword.Type */
 .highlight pre  .m { color: #666 } /* Literal.Number */
 .highlight pre  .s { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String */
 .highlight pre  .na { color: #687822 } /* Name.Attribute */
 .highlight pre  .nb { color: #008000 } /* Name.Builtin */
 .highlight pre  .nc { color: #00F; font-weight: bold } /* Name.Class */
 .highlight pre  .no { color: #800 } /* Name.Constant */
 .highlight pre  .nd { color: #&lt;span class="caps"&gt;A2F&lt;/span&gt; } /* Name.Decorator */
 .highlight pre  .ni { color: #717171; font-weight: bold } /* Name.Entity */
 .highlight pre  .ne { color: #&lt;span class="caps"&gt;CB3F38&lt;/span&gt;; font-weight: bold } /* Name.Exception */
 .highlight pre  .nf { color: #00F } /* Name.Function */
 .highlight pre  .nl { color: #767600 } /* Name.Label */
 .highlight pre  .nn { color: #00F; font-weight: bold } /* Name.Namespace */
 .highlight pre  .nt { color: #008000; font-weight: bold } /* Name.Tag */
 .highlight pre  .nv { color: #19177C } /* Name.Variable */
 .highlight pre  .ow { color: #&lt;span class="caps"&gt;A2F&lt;/span&gt;; font-weight: bold } /* Operator.Word */
 .highlight pre  .w { color: #&lt;span class="caps"&gt;BBB&lt;/span&gt; } /* Text.Whitespace */
 .highlight pre  .mb { color: #666 } /* Literal.Number.Bin */
 .highlight pre  .mf { color: #666 } /* Literal.Number.Float */
 .highlight pre  .mh { color: #666 } /* Literal.Number.Hex */
 .highlight pre  .mi { color: #666 } /* Literal.Number.Integer */
 .highlight pre  .mo { color: #666 } /* Literal.Number.Oct */
 .highlight pre  .sa { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Affix */
 .highlight pre  .sb { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Backtick */
 .highlight pre  .sc { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Char */
 .highlight pre  .dl { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Delimiter */
 .highlight pre  .sd { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;; font-style: italic } /* Literal.String.Doc */
 .highlight pre  .s2 { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Double */
 .highlight pre  .se { color: #&lt;span class="caps"&gt;AA5D1F&lt;/span&gt;; font-weight: bold } /* Literal.String.Escape */
 .highlight pre  .sh { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Heredoc */
 .highlight pre  .si { color: #&lt;span class="caps"&gt;A45A77&lt;/span&gt;; font-weight: bold } /* Literal.String.Interpol */
 .highlight pre  .sx { color: #008000 } /* Literal.String.Other */
 .highlight pre  .sr { color: #&lt;span class="caps"&gt;A45A77&lt;/span&gt; } /* Literal.String.Regex */
 .highlight pre  .s1 { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Single */
 .highlight pre  .ss { color: #19177C } /* Literal.String.Symbol */
 .highlight pre  .bp { color: #008000 } /* Name.Builtin.Pseudo */
 .highlight pre  .fm { color: #00F } /* Name.Function.Magic */
 .highlight pre  .vc { color: #19177C } /* Name.Variable.Class */
 .highlight pre  .vg { color: #19177C } /* Name.Variable.Global */
 .highlight pre  .vi { color: #19177C } /* Name.Variable.Instance */
 .highlight pre  .vm { color: #19177C } /* Name.Variable.Magic */
 .highlight pre  .il { color: #666 } /* Literal.Number.Integer.Long */&lt;/style&gt;&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;With the &lt;span class="caps"&gt;COVID&lt;/span&gt;-19 pandemic currently affecting
so many of us in the &lt;span class="caps"&gt;US&lt;/span&gt; and other parts of the world,
it felt like a good time to write about something more
light-hearted.
In that spirit, today we are going to be examining
bicycle commuting - 
specifically, typical caloric expenditures per unit&amp;nbsp;distance.&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/infinity-mpg-bike.JPG" alt="bicycle with infinity miles per gallon in the city and on the highway"&gt;&lt;/p&gt;
&lt;h3 id="Background"&gt;Background&lt;a class="anchor-link" href="#Background"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In the not-too-distant-past, I was a regular
(typically once a week) bicycle commuter.
I usually rode during three of the four seasons,
starting first on a
used Trek hybrid and ultimately ending up with a
drop bar touring&amp;nbsp;bicycle.&lt;/p&gt;
&lt;p&gt;At some point, I ran across this graphic of a bicycle
claiming to provide transportation efficiency at
&amp;#8220;infinity miles per gallon&amp;#8221;.
I posted it on my cube wall and was eventually challenged
to substantiate this claim.
At that time, I worked out a mini-dissertation on paper.
Sadly, that calculation has been lost - likely to a
recycling bin in a New Year&amp;#8217;s cleaning purge.
Since the Internet never forgets, I figured that
this time around I would work back through
the calcs in this
&lt;a href="https://jupyter.org"&gt;Jupyter Notebook&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="Research"&gt;Research&lt;a class="anchor-link" href="#Research"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In order to determine a reasonable approximation
of miles per gallon for cycling, we must first
make accomodations for the difference in fueling
mechanisms of the internal combustion engine
versus a human cycle operator.
The bicycle is propelled by the human, who is
fueled by food.
In cases such as this where a transportation mode
is powered by alternative fuels,
the efficiency of the alternative energy source
is typically converted to a miles per gallon
equivalence, or MPGe.
As I recall, I did that same calculation previously.
But what stands out from the past, and what I
wish to cover first, is to express the efficiency
of bicycle commuting in terms of miles per
unit of food.
Therefore, we need to select a reasonable,
common unit of food with a known caloric content.
Additionally, we need to determine a reasonable rate
of caloric expenditure per unit of time for&amp;nbsp;cycling.&lt;/p&gt;
&lt;h3 id="Settling-on-a-Unit-of-Measurement-and-Running-the-Calcs"&gt;Settling on a Unit of Measurement and Running the Calcs&lt;a class="anchor-link" href="#Settling-on-a-Unit-of-Measurement-and-Running-the-Calcs"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Simply replacing a gallon of gasoline for a gallon of
something like potato salad made sense initially.
But that didn&amp;#8217;t stand up as a suitable unit of food.
How often do you run out (or order delivery) for a gallon
of food at one time?
No, it makes much more sense to use a more sensible portion size.
While we&amp;#8217;re at it, let&amp;#8217;s pick something that reasonably could
be consumed &lt;strong&gt;while&lt;/strong&gt; cycling, such as&amp;#8230; a burrito!
Therefore, we&amp;#8217;ll be calculating miles per burrito (&lt;span class="caps"&gt;MPB&lt;/span&gt;)
when commuting by&amp;nbsp;bicycle.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m most familiar with Qdoba as a common source of burritos,
so let&amp;#8217;s use their &lt;a href="./static/qdoba-nutrition-information.pdf"&gt;current nutrition guide&lt;/a&gt;.
And, before we start slinging code, it would be a good idea to
note that I will be using the &lt;a href="https://pint.readthedocs.io"&gt;pint&lt;/a&gt;
library within python for all of the unit conversions.
Therefore, let&amp;#8217;s go ahead and sum up the ingredients for a
grilled adobo chicken&amp;nbsp;burrito.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&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;pint&lt;/span&gt;

&lt;span class="n"&gt;ureg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitRegistry&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;burrito_calories&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;quot;&amp;quot;&amp;quot;calculate the total caloric value of a typical burrito configuration&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;tortilla&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;210&lt;/span&gt;
    &lt;span class="n"&gt;chicken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;
    &lt;span class="n"&gt;black_beans&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;140&lt;/span&gt;
    &lt;span class="n"&gt;brown_rice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;170&lt;/span&gt;
    &lt;span class="n"&gt;lettuce&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;pico_de_gallo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="n"&gt;salsa_verde&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;
    &lt;span class="n"&gt;three_cheese_queso&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;all_ingredients&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;tortilla&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; \
        &lt;span class="n"&gt;chicken&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; \
        &lt;span class="n"&gt;black_beans&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; \
        &lt;span class="n"&gt;brown_rice&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; \
        &lt;span class="n"&gt;lettuce&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; \
        &lt;span class="n"&gt;pico_de_gallo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; \
        &lt;span class="n"&gt;salsa_verde&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; \
        &lt;span class="n"&gt;three_cheese_queso&lt;/span&gt;
    
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;all_ingredients&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kcalorie&lt;/span&gt;
    
&lt;span class="n"&gt;bc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;burrito_calories&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bc&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; per burrito&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;785 kilocalorie per burrito
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Good thing I asked that they go light on the queso.
We&amp;#8217;re almost to 800 calories without adding any chips, guac, or a&amp;nbsp;drink!&lt;/p&gt;
&lt;h3 id="Caloric-Expenditure"&gt;Caloric Expenditure&lt;a class="anchor-link" href="#Caloric-Expenditure"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The next step is to determine a typical caloric expenditure during
bicycle commuting.
Pretty much every fitness tracker out there will give you an estimate
of calories burned for a given activity.
I wanted something a little more scientific, so I went to the bookshelf
to consult a copy of
&lt;a href="https://mitpress.mit.edu/books/bicycling-science-third-edition"&gt;Bicycling Science, Third Edition&lt;/a&gt;.
There, in Table 2.1 on page 76, we find a metabolic heat value for a
touring cyclist covering 12 miles per hour equal to 6 kCal per minute.
Combining this value with our total for the burrito&amp;nbsp;gives:&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;metabolic_heat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&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="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;miles&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kcalorie&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Energy flow rate: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;metabolic_heat&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;efficiency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;metabolic_heat&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;bc&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Calculated efficiency: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;efficiency&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; per burrito (MPB).&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Energy flow rate: 0.0333 mile / kilocalorie
Calculated efficiency: 26.1667 mile per burrito (MPB).
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;There you have it!
26 &lt;span class="caps"&gt;MPB&lt;/span&gt;, give or&amp;nbsp;take.&lt;/p&gt;
&lt;h3 id="MPG-Equivalence"&gt;&lt;span class="caps"&gt;MPG&lt;/span&gt; Equivalence&lt;a class="anchor-link" href="#MPG-Equivalence"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Let&amp;#8217;s see how this stacks up against typical automobiles.
A skim through the literature on 
&lt;a href="https://sunocoracefuels.com/fuel/sr18"&gt;Sonoco Racing Fuels&lt;/a&gt;
gives us a value of 111,000 Btu per gallon of 118 octane leaded fuel.
Let&amp;#8217;s assume your typical 87 octance isn&amp;#8217;t quite as potent
and round down to 100,000&amp;nbsp;Btu.&lt;/p&gt;
&lt;p&gt;This will give us MPGe for&amp;nbsp;cycling:&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;gallon_of_gas_energy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ureg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Btu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;kcalorie&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;mpge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;metabolic_heat&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;gallon_of_gas_energy&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Commuting by bike is equivalent to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mpge&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; per gallon.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Commuting by bike is equivalent to 840.5481 mile per gallon.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Not too&amp;nbsp;shabby!&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
 


&lt;script type="text/javascript"&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = '//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
    mathjaxscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: 'center'," +
        "    displayIndent: '0em'," +
        "    showMathMenu: true," +
        "    tex2jax: { " +
        "        inlineMath: [ ['$','$'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        " linebreaks: { automatic: true, width: '95% container' }, " +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important'} }" +
        "    } " +
        "}); ";
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;
</content><category term="story"/><category term="python"/></entry><entry><title>Infrastructure As Code</title><link href="https://www.heavycivilbigdata.com/infrastructure-as-code.html" rel="alternate"/><published>2020-02-19T20:05:00-05:00</published><updated>2020-02-19T20:05:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2020-02-19:/infrastructure-as-code.html</id><summary type="html">&lt;p&gt;not just for information&amp;nbsp;systems&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#devops-trends"&gt;DevOps&amp;nbsp;trends&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#an-interesting-parallel-to-the-physical-world"&gt;An interesting parallel to the physical&amp;nbsp;world&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Last week I reached another milestone of sorts on my journey as a developer.
I took a bit of a deep dive into the
&lt;a href="https://aws.amazon.com/cdk"&gt;&lt;span class="caps"&gt;AWS&lt;/span&gt; Cloud Development Kit (&lt;span class="caps"&gt;CDK&lt;/span&gt;)&lt;/a&gt;.
&lt;span class="caps"&gt;CDK&lt;/span&gt; is a development framework that allows a developer to
stand up cloud infrastructure &amp;#8220;stacks&amp;#8221; by writing code in
any one of a handful of popular programming languages.
Not surprisingly, my personal favorite - python -
gets a seat at the&amp;nbsp;table.&lt;/p&gt;
&lt;h3 id="devops-trends"&gt;DevOps&amp;nbsp;trends&lt;/h3&gt;
&lt;p&gt;One general trend in software development is towards the 
&amp;#8220;single-threaded&amp;#8221; (&lt;span class="caps"&gt;AWS&lt;/span&gt;&amp;#8217;s term, I can&amp;#8217;t take credit for that)
software development team.
This refers to the notion of having developers run the
majority of the unit tests and manage hardware deployments,
in addition to writing the actual code.
This development pattern typically includes a &lt;span class="caps"&gt;CI&lt;/span&gt;/&lt;span class="caps"&gt;CD&lt;/span&gt; pipeline
that allows for new code versions to be automatically released to production,
assuming that it passes the automated test suite.
Tools like &lt;a href="https://www.ansible.com"&gt;Ansible&lt;/a&gt;,
&lt;a href="https://www.chef.io"&gt;Chef&lt;/a&gt;,
&lt;a href="https://www.saltstack.com"&gt;Saltstack&lt;/a&gt;,
&lt;a href="https://www.puppet.com"&gt;Puppet&lt;/a&gt;,
and perhaps the grand-daddy of them all - 
&lt;a href="https://travis-ci.com"&gt;Travis &lt;span class="caps"&gt;CI&lt;/span&gt;&lt;/a&gt; -
all serve generally this purpose as part of an integrated&amp;nbsp;stack.&lt;/p&gt;
&lt;p&gt;This approach to SaaS delivery is great for all the same reasons that
scripted instructions on the command line
will always run rings around picks and clicks on a screen with a mouse.
Better yet, a scripted approach is traceable, auditable, and repeatable.
DevOps automation is great for all the same reasons that git is the best tool
for source control and Docker has revolutionized &lt;span class="caps"&gt;OS&lt;/span&gt;&amp;nbsp;management:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you can copy and reuse the automation code on the next&amp;nbsp;project&lt;/li&gt;
&lt;li&gt;commands are scripted in plain text, which is lightweight and&amp;nbsp;opaque&lt;/li&gt;
&lt;li&gt;the code is self-documenting because every step of the process is
  written out, in&amp;nbsp;order&lt;/li&gt;
&lt;li&gt;workflows can be version controlled with branching and &amp;#8220;time&amp;nbsp;travel&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="an-interesting-parallel-to-the-physical-world"&gt;An interesting parallel to the physical&amp;nbsp;world&lt;/h3&gt;
&lt;p&gt;After getting fully stuck in to the &lt;span class="caps"&gt;CDK&lt;/span&gt; tutorials and workshops,
my brain was sufficiently stretched and ready for some
restorative rest and relaxation.
After logging off, I realized there was an even bigger parallel to the &lt;span class="caps"&gt;AEC&lt;/span&gt; industry.
When we think of DevOps and deployment automation, we talk of infrastructure
in terms of networking, servers, GPUs, and object storage.
However, well before computing infrastructure became &amp;#8216;a thing&amp;#8217;,
we had the concept of infrastructure in the form of
physical assets like roads, bridges, and tunnels.
The light bulb switched on when I realized that there is a similar
movement afoot to also think of these physical features in terms
of infrastructure as&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;For example, as &lt;a href="./what-is-a-digital-twin.html"&gt;digital twins&lt;/a&gt;
become more and more commonplace,
they will require code to turn sensor data into actionable
information and dashboard visualizations.
Also, we are seeing computational geometry as a tool for quickly
evaluating multiple design options and rapidly iterating through
&amp;#8220;what if&amp;#8221; scenarios and optioneering.
These tools typically take form as visual programming,
but just behind the scenes is a full-on programming language
such as IronPython lurking just beneath the surface of
&lt;a href="https://www.autodesk.com/products/dynamo-studio/overview"&gt;Dynamo&lt;/a&gt;.
And nothing to say of the 800 lb gorilla that is &lt;span class="caps"&gt;AI&lt;/span&gt; and Machine Learning.
These heavy-duty algorithms and models run upon multiple layers of complex
code and are poised to disrupt &lt;span class="caps"&gt;AEC&lt;/span&gt; just as much, if not more,
than other market&amp;nbsp;sectors.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;It&amp;#8217;s been said that there is crazy huge potential for tech disruption in &lt;span class="caps"&gt;AEC&lt;/span&gt;
because we&amp;#8217;ve been much slower at transitioning to digitalization
than other sectors have.
Even though we might be last to the table, we can use concepts from other industries
such as the practice of DevOps for &amp;#8220;just-in-time&amp;#8221; software delivery
to realize quick gains in safety, quality, and efficiency with relatively low effort.
That&amp;#8217;s why I&amp;#8217;m happy spending my time on a posix shell
picking through a forest of seemingly random characters and indentations.
It&amp;#8217;s true that this is a window to the past worlds of mainframes
and time sharing.
But it&amp;#8217;s also true that this is a preview of the&amp;nbsp;future.&lt;/p&gt;</content><category term="misc"/><category term="AWS"/></entry><entry><title>In Praise of the WYCIWYG Editor</title><link href="https://www.heavycivilbigdata.com/in-praise-of-the-wyciwyg-editor.html" rel="alternate"/><published>2020-02-05T00:00:00-05:00</published><updated>2020-02-05T00:00:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2020-02-05:/in-praise-of-the-wyciwyg-editor.html</id><summary type="html">&lt;p&gt;wacky&amp;nbsp;wig&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#starting-out-on-wp-51-for-dos"&gt;Starting out on &lt;span class="caps"&gt;WP&lt;/span&gt; 5.1 for &lt;span class="caps"&gt;DOS&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#office-97-lands"&gt;Office 97&amp;nbsp;lands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#time-for-a-change"&gt;Time for a&amp;nbsp;change&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#back-to-html"&gt;Back to &lt;span class="caps"&gt;HTML&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#enter-python"&gt;Enter&amp;nbsp;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#learning-by-doing"&gt;Learning by&amp;nbsp;doing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#a-few-standard-deviations-outside-of-mainstream"&gt;A few standard deviations outside of&amp;nbsp;mainstream?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="starting-out-on-wp-51-for-dos"&gt;Starting out on &lt;span class="caps"&gt;WP&lt;/span&gt; 5.1 for &lt;span class="caps"&gt;DOS&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img
src="images/wp51.png"
alt="Opening screen of Word Perfect 5.1 for DOS" /&gt;&lt;/p&gt;
&lt;p&gt;After the typewriter,
WordPerfect 5.1 became my tool of choice for school papers
and other assorted random documents.
Our first printer at home was letter perfect
(I think that was the term)
because there was a wheel with protrusions for
numbers, letters, and basic&amp;nbsp;characters.&lt;/p&gt;
&lt;p&gt;When you sent a doc to the printer,
the wheel would spin and strike against a ribbon
putting just the right amount of ink where needed.
We were a few years from meeting Dan Matrix
and his wife Dot, to say nothing of color laser&amp;nbsp;output.&lt;/p&gt;
&lt;h3 id="office-97-lands"&gt;Office 97&amp;nbsp;lands&lt;/h3&gt;
&lt;p&gt;That changed in the fall of &amp;#8216;97.
I went from (happily) using &lt;span class="caps"&gt;WP&lt;/span&gt; 5.1 in the computer lab
to marveling at the slick interface delivered by Microsoft Office 97
running on my own, brand new&amp;nbsp;Optiplex.&lt;/p&gt;
&lt;p&gt;There was even this awesome &lt;a href="https://www.artsy.net/article/artsy-editorial-life-death-microsoft-clippy-paper-clip-loved-hate"&gt;animated paper clip&lt;/a&gt;
that would pop up and help you with baffling tasks like writing a letter!
I typed a few lines and starting clicking around.
Holy Schnikes! I could make the words bigger, smaller, change the font,
add italics, color, crazy&amp;nbsp;symbols&amp;#8230;&lt;/p&gt;
&lt;p&gt;This black magic was &lt;span class="caps"&gt;WYSIWYG&lt;/span&gt; &lt;em&gt;(wizzy-wig)&lt;/em&gt;&amp;nbsp;editing:
&lt;code&gt;W&lt;/code&gt;hat &lt;code&gt;Y&lt;/code&gt;ou &lt;code&gt;S&lt;/code&gt;ee &lt;code&gt;I&lt;/code&gt;s &lt;code&gt;W&lt;/code&gt;hat &lt;code&gt;Y&lt;/code&gt;ou &lt;code&gt;G&lt;/code&gt;et.&lt;/p&gt;
&lt;p&gt;The promise was that when you were ready to render to
dead tree format,
the output would exactly match what you already saw on the screen.
Of course, that presumed that you hadn&amp;#8217;t done anything crazy
like adjusting the margins or sticking page numbers in the&amp;nbsp;footer.&lt;/p&gt;
&lt;p&gt;And so it went as I navigated academia and into industry.
As it worked out, I spent much more time in drafting and design
software than I did in&amp;nbsp;Word.&lt;/p&gt;
&lt;p&gt;There were a few times along the way where I tried to develop
technical documentation that was to be organized into
sections and chapters, presumably across multiple linked
*.doc files.
All of those efforts fizzled out before I got too far
into progressing beyond the basics in&amp;nbsp;Word.&lt;/p&gt;
&lt;h3 id="time-for-a-change"&gt;Time for a&amp;nbsp;change&lt;/h3&gt;
&lt;p&gt;That changed a few years ago.
We went through a major migration in our &lt;span class="caps"&gt;CADD&lt;/span&gt; platform
and needed to memorialize the new configuration in order to ease
the transition.
I knew what I wanted: consistent output with multiple
styles based on what the docs were describing -
monospaced Courier for text configurations,
blue italics for &lt;span class="caps"&gt;UI&lt;/span&gt; components to click on,
red bold capitals for &lt;span style="color: red"&gt;&lt;strong&gt;&lt;span class="caps"&gt;DO&lt;/span&gt; &lt;span class="caps"&gt;NOT&lt;/span&gt; &lt;span class="caps"&gt;EVER&lt;/span&gt; &lt;span class="caps"&gt;DO&lt;/span&gt; &lt;span class="caps"&gt;THIS&lt;/span&gt;!!!!!&lt;/strong&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Boy, was that painful in Word.
It seemed impossible to get image placement consistently&amp;nbsp;correct.&lt;/p&gt;
&lt;p&gt;I had terrible amounts of brain damage trying to get
consistent styling and proper numbering across the header hierarchy.
As the content grew, it got split out into multiple *.docx files,
which meant there was no easy way to cross-reference content
across sections and&amp;nbsp;chapters.&lt;/p&gt;
&lt;p&gt;The only real option for publishing was &lt;span class="caps"&gt;PDF&lt;/span&gt;,
which meant a lot of user clicking to navigate.
I tried to make everything better by building a web portal
of sorts that linked to the individual chapters and included a primitive
change&amp;nbsp;log.&lt;/p&gt;
&lt;h3 id="back-to-html"&gt;Back to &lt;span class="caps"&gt;HTML&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;It had been a long time since I had written any html -
almost 15 years.
I started the same way as before: hand coding html in a text editor.
I had upgraded to Notepad++ by this point, but that was about&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;After doing some research, it seemed like jquery and bootstrap
were taking over the world.
I eventually strung something together and it worked relatively well, 
with a lot of copy/pasting and crazy&amp;nbsp;nested &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; elements.
Hmmm, I thought&amp;#8230;
What if there was some sort of templating engine that could streamline
and automate all of that &lt;span class="caps"&gt;HTML&lt;/span&gt;&amp;nbsp;generation?&lt;/p&gt;
&lt;h3 id="enter-python"&gt;Enter&amp;nbsp;Python&lt;/h3&gt;
&lt;p&gt;Roughly at this same time, I was starting to
&lt;a href="./learn-python-the-hard-way.html"&gt;learn python&lt;/a&gt;.
After reading that
&lt;a href="https://realpython.com/vim-and-python-a-match-made-in-heaven/"&gt;vim and python were a match made in heaven&lt;/a&gt;,
I started learning&amp;nbsp;about &lt;code&gt;hjkl&lt;/code&gt; and &lt;code&gt;:wq&lt;/code&gt;.
Learning vim was like dropping &lt;span class="caps"&gt;TI&lt;/span&gt; in favor of an
&lt;a href="https://en.wikipedia.org/wiki/Reverse_Polish_notation"&gt;&lt;span class="caps"&gt;HP&lt;/span&gt; calculator&lt;/a&gt;.
Everything felt crazy-weird for about two weeks,
then things got&amp;nbsp;awesome.&lt;/p&gt;
&lt;p&gt;As I explored all of the batteries included with python,
I started noticing a beautiful consistency with the documentation.
It had the structure and formatting of doxygen but
didn&amp;#8217;t look like it belonged on Netscape Navigator 2.0.
What I was seeing was html generated by Sphinx from content written in rST.
Could this replace my half-bootstrap, half-Word&amp;nbsp;Frankenstein?&lt;/p&gt;
&lt;h3 id="learning-by-doing"&gt;Learning by&amp;nbsp;doing&lt;/h3&gt;
&lt;p&gt;I wasn&amp;#8217;t writing much python at this point, but I had just wrapped up
stringing together a macro in object-oriented &lt;span class="caps"&gt;VBA&lt;/span&gt;.
I couldn&amp;#8217;t get the ship turned towards python fast enough,
and here was the perfect opportunity to see if this new toolchain
might fit my needs for technical&amp;nbsp;documentation.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve made it this far into the story,
you can probably guess that the answer is a resounding &lt;span class="caps"&gt;YES&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;I could use all the standard directives to basically line up with my
requirements and get rock-solid consistent styling across the board.
Building up a table of contents was as easy as writing a table of contents
in plain text.
Cross-referencing was a breeze, and default output to &lt;span class="caps"&gt;HTML&lt;/span&gt; meant that
navigation was snappy and&amp;nbsp;efficient.&lt;/p&gt;
&lt;p&gt;Best of all, I could use that weird thing&amp;nbsp;called &lt;code&gt;git&lt;/code&gt; to track all of my changes
and even travel back in time if necessary.
Soon thereafter, I found I could get &lt;span class="caps"&gt;PDF&lt;/span&gt; output from the exact same&amp;nbsp;content.&lt;/p&gt;
&lt;p&gt;I probably didn&amp;#8217;t realize it at the time, but this new tooling provided
great separation of concerns - 
data here, logic there, presentation however and wherever you want&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Therefore, I am now claiming a new term for this approach
to content&amp;nbsp;generation:&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;WYCIWYG&lt;/span&gt; &lt;em&gt;(wacky-wig)&lt;/em&gt;&amp;nbsp;- &lt;code&gt;W&lt;/code&gt;hat &lt;code&gt;Y&lt;/code&gt;ou &lt;code&gt;C&lt;/code&gt;ode &lt;code&gt;I&lt;/code&gt;s &lt;code&gt;W&lt;/code&gt;hat &lt;code&gt;Y&lt;/code&gt;ou &lt;code&gt;G&lt;/code&gt;et&lt;/p&gt;
&lt;h3 id="a-few-standard-deviations-outside-of-mainstream"&gt;A few standard deviations outside of&amp;nbsp;mainstream?&lt;/h3&gt;
&lt;p&gt;I get it.  Word and Google docs aren&amp;#8217;t going to disappear tomorrow
in favor of terminal emulators and model editing.
However, before dismissing &lt;span class="caps"&gt;WYCIWYG&lt;/span&gt;, consider&amp;nbsp;this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lawyers still use Word Perfect due to formatting&amp;nbsp;strictness&lt;/li&gt;
&lt;li&gt;Microsoft project managers are writing docs in markdown
  and using git for change&amp;nbsp;management&lt;/li&gt;
&lt;li&gt;You can read to / from multiple formats with tools&amp;nbsp;like &lt;code&gt;pandoc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;I recently captured two full days of meeting notes in a single markdown file
  using &lt;span class="caps"&gt;VS&lt;/span&gt; Code with vim keybindings.  It was&amp;nbsp;splendid.&lt;/li&gt;
&lt;li&gt;Have you ever heard &amp;#8220;Wow, those styles were so easy to use and track changes
  stayed nice and tidy even though we had 45 people editing the Word doc&amp;nbsp;simultaneously!&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I didn&amp;#8217;t think&amp;nbsp;so.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;It&amp;#8217;s never been a better time to be on the command line.
While I know I won&amp;#8217;t ever totally escape &lt;span class="caps"&gt;WYSIWYG&lt;/span&gt;,
it&amp;#8217;s liberating to have - and utilize - its far superior alternative, &lt;span class="caps"&gt;WYCIWYG&lt;/span&gt;.&lt;/p&gt;</content><category term="story"/><category term="python"/><category term="vim"/></entry><entry><title>What is a digital twin?</title><link href="https://www.heavycivilbigdata.com/what-is-a-digital-twin.html" rel="alternate"/><published>2020-01-30T00:00:00-05:00</published><updated>2020-01-30T00:00:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2020-01-30:/what-is-a-digital-twin.html</id><summary type="html">&lt;p&gt;Fraternal, not&amp;nbsp;identical&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#a-worked-example-of-a-digital-twin"&gt;A Worked Example of a Digital&amp;nbsp;Twin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#is-that-it"&gt;Is that it?&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#internet-of-things-and-the-edge"&gt;Internet of Things and the&amp;nbsp;Edge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-do-i-get-a-digital-twin"&gt;How do I get a digital&amp;nbsp;twin?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;There currently is a lot of talk running around the industry about this
concept of a Digital Twin.
Bentley Systems in particular have utilized this term quite a bit in the recent past
in their marketing materials and visioning processes.
While this is a catchy term,
it&amp;#8217;s not a particularly concrete concept.
After a recent internal discussion,
I felt it would be great to try to lasso our collective thoughts and&amp;nbsp;opinions.&lt;/p&gt;
&lt;p&gt;Conceptually, a Digital Twin is a virtual model of a physical asset
that captures its geometry, geospatial position, and additional attributes of interest.
It&amp;#8217;s called a twin because (theoretically) any changes in the state of the physical asset
are automatically (quickly?) propagated to the virtual&amp;nbsp;representation.&lt;/p&gt;
&lt;h3 id="a-worked-example-of-a-digital-twin"&gt;A Worked Example of a Digital&amp;nbsp;Twin&lt;/h3&gt;
&lt;p&gt;Imagine a state department of transportation responsible for tens of thousands
of highway lane miles, including bridges, lighting, signs,
and multiple other types of physical assets.
An example of a digital twin for this type of organization might
be a highway impact attenuator installed at the beginning of a concrete barrier run.
The digital twin would capture its physical dimensions, geospatial position, linear reference
(e.g. route and milepost), manufacturer name, model name, installation date,
warranty information, and so on.
Let&amp;#8217;s say that this attenuator is a multi-cell crash unit with replaceable&amp;nbsp;parts.&lt;/p&gt;
&lt;p&gt;One day, an errant vehicle runs in to this attenuator.
The driver is ok, because the attenuator has done its job and prevented impact
with the much more rigid concrete barrier just a few feet downstream.
We&amp;#8217;ll say this is an attenuator with parallel rails and seven energy-absorbing cells.
The first three sections are damaged and need to be replaced,
but the remaining four are still in fine shape.
First responders file a report, clean up, and
report back to the &lt;span class="caps"&gt;DOT&lt;/span&gt; that this attenuator has been hit and needs some maintenance.
This incident is recorded as a change in state of the digital twin
and triggers a notice to maintenance staff that this unit requires servicing.
The maintenance staff locates some spare parts, schedules a crew,
and the repair is done.
The repair work is captured as an additional change in state of the digital twin
and the asset can then be reported again as being in a state of good&amp;nbsp;repair.&lt;/p&gt;
&lt;h3 id="is-that-it"&gt;Is that&amp;nbsp;it?&lt;/h3&gt;
&lt;p&gt;If you think that sounds sorta underwhelming, you&amp;#8217;re probably right.
The scenario I&amp;#8217;ve just described is along the lines of an incremental first step
towards an integrated information system.
In other words, this description by itself doesn&amp;#8217;t really match all of the hype
and excitement around digital twins.
If we take this example a few steps forward, we can understand digital twins
in terms of the current trends in the overall technology&amp;nbsp;landscape.&lt;/p&gt;
&lt;h4 id="internet-of-things-and-the-edge"&gt;Internet of Things and the&amp;nbsp;Edge&lt;/h4&gt;
&lt;p&gt;Kids of the 80s, especially musicians, might think first of an iconic
guitar player from Ireland.
In the context of technology, &amp;#8220;edge&amp;#8221; computing is a general term for
processing that takes place on the edge of the cloud.
In other words, the hardware is closer to the user
as opposed to being &amp;#8220;far away&amp;#8221; in the middle of the data center&amp;nbsp;cloud.&lt;/p&gt;
&lt;p&gt;The proliferation of &lt;span class="caps"&gt;IOT&lt;/span&gt; sensors and devices are a large driver
of a general shift in focus to the edge as the next growth area
in information technology.
The concept of a digital twin is piggybacking on this trend.
Imagine a bridge with temperature, stress, and other sensors
that could report an overweight non-permitted load
the second that it happens.
The vision of a physical asset that is fully instrumented
and able to maintain a digital representation in real time then becomes
an incredibly rich information source.
Rather than only having inspectors visit a bridge every two years,
the bridge can report condition in real time and give advance notice
of deterioration before it reaches a critical, unsafe&amp;nbsp;condition.&lt;/p&gt;
&lt;h3 id="how-do-i-get-a-digital-twin"&gt;How do I get a digital&amp;nbsp;twin?&lt;/h3&gt;
&lt;p&gt;Lots of asset information is decidedly non-digital.
One way to begin the transformation to digital twins is with a robust
information management strategy including data collection,
change management, data storage, system integration, and a host of other
thorny issues.
Reality Capture will no doubt be a large part of the initial generation
of digital twins.
The question will be how to scale up current processes to address
a statewide collection effort with the attendant concerns over how
long that will take and how much it will cost.
Perhaps there is an opportunity to leverage big data and machine
learning patterns that have been utilized to great effect in other
industries such as finance.
Whatever the path forward ultimately looks like,
there&amp;#8217;s no better time to get started than right&amp;nbsp;now.&lt;/p&gt;</content><category term="misc"/><category term="digital twin"/></entry><entry><title>Is IFC the format of the future?</title><link href="https://www.heavycivilbigdata.com/is-ifc-the-format-of-the-future.html" rel="alternate"/><published>2020-01-02T00:00:00-05:00</published><updated>2020-01-02T00:00:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2020-01-02:/is-ifc-the-format-of-the-future.html</id><summary type="html">&lt;p&gt;or is it just the format of&amp;nbsp;tomorrow?&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#background"&gt;Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#obligatory-xkcd-reference"&gt;Obligatory &lt;span class="caps"&gt;XKCD&lt;/span&gt;&amp;nbsp;Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ifc-is-a-good-bet"&gt;&lt;span class="caps"&gt;IFC&lt;/span&gt; is a Good&amp;nbsp;Bet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-argument-against"&gt;The Argument&amp;nbsp;Against&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ifc-is-a-schema-not-a-file-format"&gt;&lt;span class="caps"&gt;IFC&lt;/span&gt; is a Schema, Not a File&amp;nbsp;Format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;A while ago, I asked my team for blog post ideas and my supervisor
floated this topic as having potential for sparking 
some interesting discussion.
After giving it some thought, it&amp;#8217;s clear to me that
&lt;strong&gt;if we&amp;#8217;re going to truly transform the industry, &lt;span class="caps"&gt;IFC&lt;/span&gt; has to be the format of the&amp;nbsp;future.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="background"&gt;Background&lt;/h3&gt;
&lt;p&gt;There is currently a pooled fund study underway
in the &lt;span class="caps"&gt;US&lt;/span&gt; regarding &lt;a href="https://www.bimforbridgesus.com"&gt;&lt;span class="caps"&gt;BIM&lt;/span&gt; for Bridges&lt;/a&gt;.
This concept, often referred to as BrIM&amp;nbsp;for &lt;code&gt;Br&lt;/code&gt;idge &lt;code&gt;I&lt;/code&gt;nformation &lt;code&gt;M&lt;/code&gt;odel,
is focused on data modeling standards for electronic information sharing
related to design, construction, operations, and maintenance of bridges.
This working group recommends
&lt;a href="https://www.buildingsmart.org/standards/bsi-standards/industry-foundation-classes"&gt;Industry Foundation Classes (&lt;span class="caps"&gt;IFC&lt;/span&gt;)&lt;/a&gt; as the recommended format for this proposed
standardized data exchange.
The question at hand is in regards to whether this current standardization effort
will truly revolutionize the&amp;nbsp;industry.&lt;/p&gt;
&lt;h3 id="obligatory-xkcd-reference"&gt;Obligatory &lt;span class="caps"&gt;XKCD&lt;/span&gt;&amp;nbsp;Reference&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://xkcd.com/927"&gt;&lt;img alt="xkcd comic number 927" src="https://imgs.xkcd.com/comics/standards.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Industry veterans have seen similar discussions play out in the past with
data formats such as &lt;span class="caps"&gt;DXF&lt;/span&gt; for graphical &lt;span class="caps"&gt;CAD&lt;/span&gt; data
and a hodge-podge of standard formats for &lt;span class="caps"&gt;ASCII&lt;/span&gt; text files utilized for
sharing survey topography&amp;nbsp;data.&lt;/p&gt;
&lt;p&gt;Another example I remember from around the turn of the century 
is the discussion of &lt;a href="https://www.autodesk.com/viewers/dwg"&gt;&lt;span class="caps"&gt;DWF&lt;/span&gt;&lt;/a&gt; vs &lt;span class="caps"&gt;PDF&lt;/span&gt;.
&lt;span class="caps"&gt;DWF&lt;/span&gt; is a proprietary format developed by Autodesk for viewing, printing,
and annotating 2D and 3D content.
While in many ways potentially technically superior than &lt;span class="caps"&gt;PDF&lt;/span&gt;
(particularly, at the time, in file size),
&lt;span class="caps"&gt;DWF&lt;/span&gt; failed to topple the momentum that &lt;span class="caps"&gt;PDF&lt;/span&gt; had already gained
as the de-facto digital equivalent of the printed roll of plans.
In fact, by the early 2010&amp;#8217;s, electronic-only was the default
and my colleagues and I began utilizing &lt;span class="caps"&gt;DTF&lt;/span&gt; (dead tree format)
to specify that a printed, physical copy was&amp;nbsp;required.&lt;/p&gt;
&lt;p&gt;Given the multi-year effort required to research, implement, train,
and require a particular file format, it&amp;#8217;s understandable that
infrastructure asset owners may be hesitant to jump on the bandwagon of &lt;span class="caps"&gt;IFC&lt;/span&gt;
as &amp;#8216;yet another&amp;#8217; file&amp;nbsp;format.&lt;/p&gt;
&lt;h3 id="ifc-is-a-good-bet"&gt;&lt;span class="caps"&gt;IFC&lt;/span&gt; is a Good&amp;nbsp;Bet&lt;/h3&gt;
&lt;p&gt;The &lt;span class="caps"&gt;BIM&lt;/span&gt; For Bridges effort here in the states mimics standards being adopted worldwide.
&lt;span class="caps"&gt;BIM&lt;/span&gt; requirements are already a present-day fact of life for &lt;span class="caps"&gt;AEC&lt;/span&gt; practitioners
in markets including the &lt;span class="caps"&gt;UK&lt;/span&gt;, Europe, Middle East, and Asia.
In almost every case, &lt;span class="caps"&gt;IFC&lt;/span&gt; is preferred as the common data standard.
&lt;span class="caps"&gt;IFC&lt;/span&gt; is an ideal format for &lt;span class="caps"&gt;AEC&lt;/span&gt; data&amp;nbsp;because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it is an open format published as an &lt;span class="caps"&gt;ISO&lt;/span&gt; standard &lt;a href="https://www.iso.org/standards/70303.html"&gt;(&lt;span class="caps"&gt;ISO&lt;/span&gt;&amp;nbsp;16739-1:2018)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;it is mature, having published version 1.0 in&amp;nbsp;1996&lt;/li&gt;
&lt;li&gt;it is developed in the open, by consensus, and overseen by a non-profit&amp;nbsp;organization&lt;/li&gt;
&lt;li&gt;there is a thriving ecosystem of open-source tools and programs that can read and write the&amp;nbsp;format&lt;/li&gt;
&lt;li&gt;it is wide-ranging, including data models for:&lt;ul&gt;
&lt;li&gt;personal contact&amp;nbsp;information&lt;/li&gt;
&lt;li&gt;company organizational&amp;nbsp;structure&lt;/li&gt;
&lt;li&gt;quantity takeoffs and material&amp;nbsp;details&lt;/li&gt;
&lt;li&gt;critical path scheduling of&amp;nbsp;tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-argument-against"&gt;The Argument&amp;nbsp;Against&lt;/h3&gt;
&lt;p&gt;One of the most common rebuttals of an open, neutral format is that
each software vendor will end up implementing the standard in slightly different
ways, which only serves to further fragment the industry.
Also, proponents of proprietary binary formats often make claims of specific
&amp;#8220;magic&amp;#8221; features that their software tool of choice provides
and allegedly can&amp;#8217;t be replicated in a different format.
However, data lock-in to closed, proprietary formats is not in anyone&amp;#8217;s best
interests, excepting of course the software&amp;nbsp;vendors.&lt;/p&gt;
&lt;h3 id="ifc-is-a-schema-not-a-file-format"&gt;&lt;span class="caps"&gt;IFC&lt;/span&gt; is a Schema, Not a File&amp;nbsp;Format&lt;/h3&gt;
&lt;p&gt;Up to this point, we&amp;#8217;ve been thinking primarily in terms of a single
container manifesting itself as a *.ifc file stored on e.g. a hard drive.
However, this is short-sighted, because
&lt;a href="https://forums.buildingsmart.org/t/industry-foundation-classes-are-a-data-schema-not-a-file-format/1398"&gt;&lt;span class="caps"&gt;IFC&lt;/span&gt; is a schema, not a file format&lt;/a&gt;.
As we move to data streaming continuously from physical IoT sensors back to a Digital Twin,
the BrIM data will be dynamic.
For this reason, among others, BrIM will take on a service-oriented architecture
with versioning and time stamping.
Data will most likely live in a cloud environment in a data lake
or similar distributed storage system,
with multiple clients connecting simultaneously at any given time.
Indeed, there currently are multiple common data formats for &lt;span class="caps"&gt;IFC&lt;/span&gt; data,
including &lt;span class="caps"&gt;XML&lt;/span&gt; and &lt;span class="caps"&gt;JSON&lt;/span&gt; in addition to the typical &lt;span class="caps"&gt;STEP&lt;/span&gt; file.
This points to a great staying power for &lt;span class="caps"&gt;IFC&lt;/span&gt;.
And indeed, this object-oriented, schema-based focus is reflected in the
name - Industry&amp;nbsp;Foundation &lt;code&gt;Classes&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;It seems like there is more and more momentum around &lt;span class="caps"&gt;IFC&lt;/span&gt; with each passing month.
As we kick off a new year and a new decade,
I&amp;#8217;m definitely hitching my wagon to &lt;span class="caps"&gt;IFC&lt;/span&gt; - particularly for bridges
and other linear civil works that have been slow to make the leap to an
Information Model&amp;nbsp;focus.&lt;/p&gt;</content><category term="opinion"/><category term="IFC"/><category term="VDC"/><category term="BIM"/><category term="BrIM"/></entry><entry><title>Modeling the St. Louis Arch - Part 2</title><link href="https://www.heavycivilbigdata.com/modeling-the-st-louis-arch-part-2.html" rel="alternate"/><published>2019-11-23T00:00:00-05:00</published><updated>2022-08-16T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2019-11-23:/modeling-the-st-louis-arch-part-2.html</id><summary type="html">&lt;p&gt;More Computational&amp;nbsp;Geometry&lt;/p&gt;</summary><content type="html">&lt;style type="text/css"&gt;/*!
*
* IPython notebook
*
*/
/* &lt;span class="caps"&gt;CSS&lt;/span&gt; font colors for translated &lt;span class="caps"&gt;ANSI&lt;/span&gt; escape sequences */
/* The color values are a mix of
   http://www.xcolors.net/dl/baskerville-ivorylight and
   http://www.xcolors.net/dl/euphrasia */
.ansi-black-fg {
  color: #&lt;span class="caps"&gt;3E424D&lt;/span&gt;;
}
.ansi-black-bg {
  background-color: #&lt;span class="caps"&gt;3E424D&lt;/span&gt;;
}
.ansi-black-intense-fg {
  color: #282C36;
}
.ansi-black-intense-bg {
  background-color: #282C36;
}
.ansi-red-fg {
  color: #&lt;span class="caps"&gt;E75C58&lt;/span&gt;;
}
.ansi-red-bg {
  background-color: #&lt;span class="caps"&gt;E75C58&lt;/span&gt;;
}
.ansi-red-intense-fg {
  color: #&lt;span class="caps"&gt;B22B31&lt;/span&gt;;
}
.ansi-red-intense-bg {
  background-color: #&lt;span class="caps"&gt;B22B31&lt;/span&gt;;
}
.ansi-green-fg {
  color: #00A250;
}
.ansi-green-bg {
  background-color: #00A250;
}
.ansi-green-intense-fg {
  color: #007427;
}
.ansi-green-intense-bg {
  background-color: #007427;
}
.ansi-yellow-fg {
  color: #&lt;span class="caps"&gt;DDB62B&lt;/span&gt;;
}
.ansi-yellow-bg {
  background-color: #&lt;span class="caps"&gt;DDB62B&lt;/span&gt;;
}
.ansi-yellow-intense-fg {
  color: #&lt;span class="caps"&gt;B27D12&lt;/span&gt;;
}
.ansi-yellow-intense-bg {
  background-color: #&lt;span class="caps"&gt;B27D12&lt;/span&gt;;
}
.ansi-blue-fg {
  color: #&lt;span class="caps"&gt;208FFB&lt;/span&gt;;
}
.ansi-blue-bg {
  background-color: #&lt;span class="caps"&gt;208FFB&lt;/span&gt;;
}
.ansi-blue-intense-fg {
  color: #&lt;span class="caps"&gt;0065CA&lt;/span&gt;;
}
.ansi-blue-intense-bg {
  background-color: #&lt;span class="caps"&gt;0065CA&lt;/span&gt;;
}
.ansi-magenta-fg {
  color: #&lt;span class="caps"&gt;D160C4&lt;/span&gt;;
}
.ansi-magenta-bg {
  background-color: #&lt;span class="caps"&gt;D160C4&lt;/span&gt;;
}
.ansi-magenta-intense-fg {
  color: #A03196;
}
.ansi-magenta-intense-bg {
  background-color: #A03196;
}
.ansi-cyan-fg {
  color: #&lt;span class="caps"&gt;60C6C8&lt;/span&gt;;
}
.ansi-cyan-bg {
  background-color: #&lt;span class="caps"&gt;60C6C8&lt;/span&gt;;
}
.ansi-cyan-intense-fg {
  color: #&lt;span class="caps"&gt;258F8F&lt;/span&gt;;
}
.ansi-cyan-intense-bg {
  background-color: #&lt;span class="caps"&gt;258F8F&lt;/span&gt;;
}
.ansi-white-fg {
  color: #&lt;span class="caps"&gt;C5C1B4&lt;/span&gt;;
}
.ansi-white-bg {
  background-color: #&lt;span class="caps"&gt;C5C1B4&lt;/span&gt;;
}
.ansi-white-intense-fg {
  color: #&lt;span class="caps"&gt;A1A6B2&lt;/span&gt;;
}
.ansi-white-intense-bg {
  background-color: #&lt;span class="caps"&gt;A1A6B2&lt;/span&gt;;
}
.ansi-default-inverse-fg {
  color: #&lt;span class="caps"&gt;FFFFFF&lt;/span&gt;;
}
.ansi-default-inverse-bg {
  background-color: #000000;
}
.ansi-bold {
  font-weight: bold;
}
.ansi-underline {
  text-decoration: underline;
}
/* The following styles are deprecated an will be removed in a future version */
.ansibold {
  font-weight: bold;
}
.ansi-inverse {
  outline: 0.5px dotted;
}
/* use dark versions for foreground, to improve visibility */
.ansiblack {
  color: black;
}
.ansired {
  color: darkred;
}
.ansigreen {
  color: darkgreen;
}
.ansiyellow {
  color: #c4a000;
}
.ansiblue {
  color: darkblue;
}
.ansipurple {
  color: darkviolet;
}
.ansicyan {
  color: steelblue;
}
.ansigray {
  color: gray;
}
/* and light for background, for the same reason */
.ansibgblack {
  background-color: black;
}
.ansibgred {
  background-color: red;
}
.ansibggreen {
  background-color: green;
}
.ansibgyellow {
  background-color: yellow;
}
.ansibgblue {
  background-color: blue;
}
.ansibgpurple {
  background-color: magenta;
}
.ansibgcyan {
  background-color: cyan;
}
.ansibggray {
  background-color: gray;
}
div.cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  border-radius: 2px;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  border-width: 1px;
  border-style: solid;
  border-color: transparent;
  width: 100%;
  padding: 5px;
  /* This acts as a spacer between cells, that is outside the border */
  margin: 0px;
  outline: none;
  position: relative;
  overflow: visible;
}
div.cell:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: transparent;
}
div.cell.jupyter-soft-selected {
  border-left-color: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
  border-left-width: 1px;
  padding-left: 5px;
  border-right-color: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
  border-right-width: 1px;
  background: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
}
@media print {
  div.cell.jupyter-soft-selected {
    border-color: transparent;
  }
}
div.cell.selected,
div.cell.selected.jupyter-soft-selected {
  border-color: #ababab;
}
div.cell.selected:before,
div.cell.selected.jupyter-soft-selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #&lt;span class="caps"&gt;42A5F5&lt;/span&gt;;
}
@media print {
  div.cell.selected,
  div.cell.selected.jupyter-soft-selected {
    border-color: transparent;
  }
}
.edit_mode div.cell.selected {
  border-color: #&lt;span class="caps"&gt;66BB6A&lt;/span&gt;;
}
.edit_mode div.cell.selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #&lt;span class="caps"&gt;66BB6A&lt;/span&gt;;
}
@media print {
  .edit_mode div.cell.selected {
    border-color: transparent;
  }
}
.prompt {
  /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */
  min-width: 14ex;
  /* This padding is tuned to match the padding on the CodeMirror editor. */
  padding: 0.4em;
  margin: 0px;
  font-family: monospace;
  text-align: right;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
  /* Don't highlight prompt number selection */
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  /* Use default cursor */
  cursor: default;
}
@media (max-width: 540px) {
  .prompt {
    text-align: left;
  }
}
div.inner_cell {
  min-width: 0;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_area {
  border: 1px solid #cfcfcf;
  border-radius: 2px;
  background: #f7f7f7;
  line-height: 1.21429em;
}
/* This is needed so that empty prompt areas can collapse to zero height when there
   is no content in the output_subarea and the prompt. The main purpose of this is
   to make sure that empty JavaScript output_subareas have no height. */
div.prompt:empty {
  padding-top: 0;
  padding-bottom: 0;
}
div.unrecognized_cell {
  padding: 5px 5px 5px 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.unrecognized_cell .inner_cell {
  border-radius: 2px;
  padding: 5px;
  font-weight: bold;
  color: red;
  border: 1px solid #cfcfcf;
  background: #eaeaea;
}
div.unrecognized_cell .inner_cell a {
  color: inherit;
  text-decoration: none;
}
div.unrecognized_cell .inner_cell a:hover {
  color: inherit;
  text-decoration: none;
}
@media (max-width: 540px) {
  div.unrecognized_cell &gt; div.prompt {
    display: none;
  }
}
div.code_cell {
  /* avoid page breaking on code cells when printing */
}
@media print {
  div.code_cell {
    page-break-inside: avoid;
  }
}
/* any special styling for code cells that are currently running goes here */
div.input {
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.input {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_prompt {
  color: #&lt;span class="caps"&gt;303F9F&lt;/span&gt;;
  border-top: 1px solid transparent;
}
div.input_area &gt; div.highlight {
  margin: 0.4em;
  border: none;
  padding: 0px;
  background-color: transparent;
}
div.input_area &gt; div.highlight &gt; pre {
  margin: 0px;
  border: none;
  padding: 0px;
  background-color: transparent;
}
/* The following gets added to the &lt;head&gt; if it is detected that the user has a
 * monospace font with inconsistent normal/bold/italic height.  See
 * notebookmain.js.  Such fonts will have keywords vertically offset with
 * respect to the rest of the text.  The user should select a better font.
 * See: https://github.com/ipython/ipython/issues/1503
 *
 * .CodeMirror span {
 *      vertical-align: bottom;
 * }
 */
.CodeMirror {
  line-height: 1.21429em;
  /* Changed from 1em to our global default */
  font-size: 14px;
  height: auto;
  /* Changed to auto to autogrow */
  background: none;
  /* Changed from white to allow our bg to show through */
}
.CodeMirror-scroll {
  /*  The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/
  /*  We have found that if it is visible, vertical scrollbars appear with font size changes.*/
  overflow-y: hidden;
  overflow-x: auto;
}
.CodeMirror-lines {
  /* In &lt;span class="caps"&gt;CM2&lt;/span&gt;, this used to be 0.4em, but in &lt;span class="caps"&gt;CM3&lt;/span&gt; it went to 4px. We need the em value because */
  /* we have set a different line-height and want this to scale with that. */
  /* Note that this should set vertical padding only, since CodeMirror assumes
       that horizontal padding will be set on CodeMirror pre */
  padding: 0.4em 0;
}
.CodeMirror-linenumber {
  padding: 0 8px 0 4px;
}
.CodeMirror-gutters {
  border-bottom-left-radius: 2px;
  border-top-left-radius: 2px;
}
.CodeMirror pre {
  /* In &lt;span class="caps"&gt;CM3&lt;/span&gt; this went to 4px from 0 in &lt;span class="caps"&gt;CM2&lt;/span&gt;. This sets horizontal padding only,
    use .CodeMirror-lines for vertical */
  padding: 0 0.4em;
  border: 0;
  border-radius: 0;
}
.CodeMirror-cursor {
  border-left: 1.4px solid black;
}
@media screen and (min-width: 2138px) and (max-width: 4319px) {
  .CodeMirror-cursor {
    border-left: 2px solid black;
  }
}
@media screen and (min-width: 4320px) {
  .CodeMirror-cursor {
    border-left: 4px solid black;
  }
}
/*

Original style from softwaremaniacs.org (c) Ivan Sagalaev &lt;Maniac@SoftwareManiacs.Org&gt;
Adapted from GitHub theme

*/
.highlight-base {
  color: #000;
}
.highlight-variable {
  color: #000;
}
.highlight-variable-2 {
  color: #1a1a1a;
}
.highlight-variable-3 {
  color: #333333;
}
.highlight-string {
  color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;;
}
.highlight-comment {
  color: #408080;
  font-style: italic;
}
.highlight-number {
  color: #080;
}
.highlight-atom {
  color: #88F;
}
.highlight-keyword {
  color: #008000;
  font-weight: bold;
}
.highlight-builtin {
  color: #008000;
}
.highlight-error {
  color: #f00;
}
.highlight-operator {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
  font-weight: bold;
}
.highlight-meta {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
}
/* previously not defined, copying from default codemirror */
.highlight-def {
  color: #00f;
}
.highlight-string-2 {
  color: #f50;
}
.highlight-qualifier {
  color: #555;
}
.highlight-bracket {
  color: #997;
}
.highlight-tag {
  color: #170;
}
.highlight-attribute {
  color: #00c;
}
.highlight-header {
  color: blue;
}
.highlight-quote {
  color: #090;
}
.highlight-link {
  color: #00c;
}
/* apply the same style to codemirror */
.cm-s-ipython span.cm-keyword {
  color: #008000;
  font-weight: bold;
}
.cm-s-ipython span.cm-atom {
  color: #88F;
}
.cm-s-ipython span.cm-number {
  color: #080;
}
.cm-s-ipython span.cm-def {
  color: #00f;
}
.cm-s-ipython span.cm-variable {
  color: #000;
}
.cm-s-ipython span.cm-operator {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
  font-weight: bold;
}
.cm-s-ipython span.cm-variable-2 {
  color: #1a1a1a;
}
.cm-s-ipython span.cm-variable-3 {
  color: #333333;
}
.cm-s-ipython span.cm-comment {
  color: #408080;
  font-style: italic;
}
.cm-s-ipython span.cm-string {
  color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;;
}
.cm-s-ipython span.cm-string-2 {
  color: #f50;
}
.cm-s-ipython span.cm-meta {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
}
.cm-s-ipython span.cm-qualifier {
  color: #555;
}
.cm-s-ipython span.cm-builtin {
  color: #008000;
}
.cm-s-ipython span.cm-bracket {
  color: #997;
}
.cm-s-ipython span.cm-tag {
  color: #170;
}
.cm-s-ipython span.cm-attribute {
  color: #00c;
}
.cm-s-ipython span.cm-header {
  color: blue;
}
.cm-s-ipython span.cm-quote {
  color: #090;
}
.cm-s-ipython span.cm-link {
  color: #00c;
}
.cm-s-ipython span.cm-error {
  color: #f00;
}
.cm-s-ipython span.cm-tab {
  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);
  background-position: right;
  background-repeat: no-repeat;
}
div.output_wrapper {
  /* this position must be relative to enable descendents to be absolute within it */
  position: relative;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  z-index: 1;
}
/* class for the output area when it should be height-limited */
div.output_scroll {
  /* ideally, this would be max-height, but &lt;span class="caps"&gt;FF&lt;/span&gt; barfs all over that */
  height: 24em;
  /* &lt;span class="caps"&gt;FF&lt;/span&gt; needs this *and the wrapper* to specify full width, or it will shrinkwrap */
  width: 100%;
  overflow: auto;
  border-radius: 2px;
  -webkit-box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  display: block;
}
/* output div while it is collapsed */
div.output_collapsed {
  margin: 0px;
  padding: 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
div.out_prompt_overlay {
  height: 100%;
  padding: 0px 0.4em;
  position: absolute;
  border-radius: 2px;
}
div.out_prompt_overlay:hover {
  /* use inner shadow to get border that is computed the same on WebKit/&lt;span class="caps"&gt;FF&lt;/span&gt; */
  -webkit-box-shadow: inset 0 0 1px #000;
  box-shadow: inset 0 0 1px #000;
  background: rgba(240, 240, 240, 0.5);
}
div.output_prompt {
  color: #D84315;
}
/* This class is the outer container of all output sections. */
div.output_area {
  padding: 0px;
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.output_area .MathJax_Display {
  text-align: left !important;
}
div.output_area 
div.output_area 
div.output_area img,
div.output_area svg {
  max-width: 100%;
  height: auto;
}
div.output_area img.unconfined,
div.output_area svg.unconfined {
  max-width: none;
}
div.output_area .mglyph &gt; img {
  max-width: none;
}
/* This is needed to protect the pre formating from global settings such
   as that of bootstrap */
.output {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.output_area {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
div.output_area pre {
  margin: 0;
  padding: 1px 0 1px 0;
  border: 0;
  vertical-align: baseline;
  color: black;
  background-color: transparent;
  border-radius: 0;
}
/* This class is for the output subarea inside the output_area and after
   the prompt div. */
div.output_subarea {
  overflow-x: auto;
  padding: 0.4em;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
  max-width: calc(100% - 14ex);
}
div.output_scroll div.output_subarea {
  overflow-x: visible;
}
/* The rest of the output_* classes are for special styling of the different
   output types */
/* all text output has this class: */
div.output_text {
  text-align: left;
  color: #000;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
}
/* stdout/stderr are 'text' as well as 'stream', but execute_result/error are *not* streams */
div.output_stderr {
  background: #fdd;
  /* very light red background for stderr */
}
div.output_latex {
  text-align: left;
}
/* Empty output_javascript divs should have no height */
div.output_javascript:empty {
  padding: 0;
}
.js-error {
  color: darkred;
}
/* raw_input styles */
div.raw_input_container {
  line-height: 1.21429em;
  padding-top: 5px;
}
pre.raw_input_prompt {
  /* nothing needed here. */
}
input.raw_input {
  font-family: monospace;
  font-size: inherit;
  color: inherit;
  width: auto;
  /* make sure input baseline aligns with prompt */
  vertical-align: baseline;
  /* padding + margin = 0.5em between prompt and cursor */
  padding: 0em 0.25em;
  margin: 0em 0.25em;
}
input.raw_input:focus {
  box-shadow: none;
}
p.p-space {
  margin-bottom: 10px;
}
div.output_unrecognized {
  padding: 5px;
  font-weight: bold;
  color: red;
}
div.output_unrecognized a {
  color: inherit;
  text-decoration: none;
}
div.output_unrecognized a:hover {
  color: inherit;
  text-decoration: none;
}
.rendered_html {
  color: #000;
  /* any extras will just be numbers: */
}



.rendered_html :link {
  text-decoration: underline;
}
.rendered_html :visited {
  text-decoration: underline;
}






.rendered_html h1:first-child {
  margin-top: 0.538em;
}
.rendered_html h2:first-child {
  margin-top: 0.636em;
}
.rendered_html h3:first-child {
  margin-top: 0.777em;
}
.rendered_html h4:first-child {
  margin-top: 1em;
}
.rendered_html h5:first-child {
  margin-top: 1em;
}
.rendered_html h6:first-child {
  margin-top: 1em;
}
.rendered_html ul:not(.list-inline),
.rendered_html ol:not(.list-inline) {
  padding-left: 2em;
}








.rendered_html * + ul {
  margin-top: 1em;
}
.rendered_html * + ol {
  margin-top: 1em;
}





.rendered_html pre,




.rendered_html tr,
.rendered_html th,


.rendered_html tbody tr:nth-child(odd) {
  background: #f5f5f5;
}
.rendered_html tbody tr:hover {
  background: rgba(66, 165, 245, 0.2);
}
.rendered_html * + table {
  margin-top: 1em;
}

.rendered_html * + p {
  margin-top: 1em;
}

.rendered_html * + img {
  margin-top: 1em;
}
.rendered_html img,

.rendered_html img.unconfined,


.rendered_html * + .alert {
  margin-top: 1em;
}
[dir="rtl"] 
div.text_cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.text_cell &gt; div.prompt {
    display: none;
  }
}
div.text_cell_render {
  /*font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;*/
  outline: none;
  resize: none;
  width: inherit;
  border-style: none;
  padding: 0.5em 0.5em 0.5em 0.4em;
  color: #000;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}
a.anchor-link:link {
  text-decoration: none;
  padding: 0px 20px;
  visibility: hidden;
}
h1:hover .anchor-link,
h2:hover .anchor-link,
h3:hover .anchor-link,
h4:hover .anchor-link,
h5:hover .anchor-link,
h6:hover .anchor-link {
  visibility: visible;
}
.text_cell.rendered .input_area {
  display: none;
}
.text_cell.rendered 
.text_cell.rendered .rendered_html tr,
.text_cell.rendered .rendered_html th,
.text_cell.rendered 
.text_cell.unrendered .text_cell_render {
  display: none;
}
.text_cell .dropzone .input_area {
  border: 2px dashed #bababa;
  margin: -1px;
}
.cm-header-1,
.cm-header-2,
.cm-header-3,
.cm-header-4,
.cm-header-5,
.cm-header-6 {
  font-weight: bold;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.cm-header-1 {
  font-size: 185.7%;
}
.cm-header-2 {
  font-size: 157.1%;
}
.cm-header-3 {
  font-size: 128.6%;
}
.cm-header-4 {
  font-size: 110%;
}
.cm-header-5 {
  font-size: 100%;
  font-style: italic;
}
.cm-header-6 {
  font-size: 100%;
  font-style: italic;
}
&lt;/style&gt;
&lt;style type="text/css"&gt;pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 .highlight pre  .hll { background-color: #ffffcc }
 .highlight pre  { background: #f8f8f8; }
 .highlight pre  .c { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment */
 .highlight pre  .err { border: 1px solid #F00 } /* Error */
 .highlight pre  .k { color: #008000; font-weight: bold } /* Keyword */
 .highlight pre  .o { color: #666 } /* Operator */
 .highlight pre  .ch { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Hashbang */
 .highlight pre  .cm { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Multiline */
 .highlight pre  .cp { color: #9C6500 } /* Comment.Preproc */
 .highlight pre  .cpf { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.PreprocFile */
 .highlight pre  .c1 { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Single */
 .highlight pre  .cs { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Special */
 .highlight pre  .gd { color: #A00000 } /* Generic.Deleted */
 .highlight pre  .ge { font-style: italic } /* Generic.Emph */
 .highlight pre  .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
 .highlight pre  .gr { color: #E40000 } /* Generic.Error */
 .highlight pre  .gh { color: #000080; font-weight: bold } /* Generic.Heading */
 .highlight pre  .gi { color: #008400 } /* Generic.Inserted */
 .highlight pre  .go { color: #717171 } /* Generic.Output */
 .highlight pre  .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
 .highlight pre  .gs { font-weight: bold } /* Generic.Strong */
 .highlight pre  .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
 .highlight pre  .gt { color: #04D } /* Generic.Traceback */
 .highlight pre  .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
 .highlight pre  .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
 .highlight pre  .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
 .highlight pre  .kp { color: #008000 } /* Keyword.Pseudo */
 .highlight pre  .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
 .highlight pre  .kt { color: #B00040 } /* Keyword.Type */
 .highlight pre  .m { color: #666 } /* Literal.Number */
 .highlight pre  .s { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String */
 .highlight pre  .na { color: #687822 } /* Name.Attribute */
 .highlight pre  .nb { color: #008000 } /* Name.Builtin */
 .highlight pre  .nc { color: #00F; font-weight: bold } /* Name.Class */
 .highlight pre  .no { color: #800 } /* Name.Constant */
 .highlight pre  .nd { color: #&lt;span class="caps"&gt;A2F&lt;/span&gt; } /* Name.Decorator */
 .highlight pre  .ni { color: #717171; font-weight: bold } /* Name.Entity */
 .highlight pre  .ne { color: #&lt;span class="caps"&gt;CB3F38&lt;/span&gt;; font-weight: bold } /* Name.Exception */
 .highlight pre  .nf { color: #00F } /* Name.Function */
 .highlight pre  .nl { color: #767600 } /* Name.Label */
 .highlight pre  .nn { color: #00F; font-weight: bold } /* Name.Namespace */
 .highlight pre  .nt { color: #008000; font-weight: bold } /* Name.Tag */
 .highlight pre  .nv { color: #19177C } /* Name.Variable */
 .highlight pre  .ow { color: #&lt;span class="caps"&gt;A2F&lt;/span&gt;; font-weight: bold } /* Operator.Word */
 .highlight pre  .w { color: #&lt;span class="caps"&gt;BBB&lt;/span&gt; } /* Text.Whitespace */
 .highlight pre  .mb { color: #666 } /* Literal.Number.Bin */
 .highlight pre  .mf { color: #666 } /* Literal.Number.Float */
 .highlight pre  .mh { color: #666 } /* Literal.Number.Hex */
 .highlight pre  .mi { color: #666 } /* Literal.Number.Integer */
 .highlight pre  .mo { color: #666 } /* Literal.Number.Oct */
 .highlight pre  .sa { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Affix */
 .highlight pre  .sb { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Backtick */
 .highlight pre  .sc { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Char */
 .highlight pre  .dl { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Delimiter */
 .highlight pre  .sd { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;; font-style: italic } /* Literal.String.Doc */
 .highlight pre  .s2 { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Double */
 .highlight pre  .se { color: #&lt;span class="caps"&gt;AA5D1F&lt;/span&gt;; font-weight: bold } /* Literal.String.Escape */
 .highlight pre  .sh { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Heredoc */
 .highlight pre  .si { color: #&lt;span class="caps"&gt;A45A77&lt;/span&gt;; font-weight: bold } /* Literal.String.Interpol */
 .highlight pre  .sx { color: #008000 } /* Literal.String.Other */
 .highlight pre  .sr { color: #&lt;span class="caps"&gt;A45A77&lt;/span&gt; } /* Literal.String.Regex */
 .highlight pre  .s1 { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Single */
 .highlight pre  .ss { color: #19177C } /* Literal.String.Symbol */
 .highlight pre  .bp { color: #008000 } /* Name.Builtin.Pseudo */
 .highlight pre  .fm { color: #00F } /* Name.Function.Magic */
 .highlight pre  .vc { color: #19177C } /* Name.Variable.Class */
 .highlight pre  .vg { color: #19177C } /* Name.Variable.Global */
 .highlight pre  .vi { color: #19177C } /* Name.Variable.Instance */
 .highlight pre  .vm { color: #19177C } /* Name.Variable.Magic */
 .highlight pre  .il { color: #666 } /* Literal.Number.Integer.Long */&lt;/style&gt;&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Continuation"&gt;Continuation&lt;a class="anchor-link" href="#Continuation"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;When we left off last time, we had gotten to a 2D representation of the centroid of the arch cross-sections.
However, the centroid is used as &amp;#8220;construction&amp;#8221; geometry in this model - 
it doesn&amp;#8217;t represent something physical.
Rather, it is used for constructing, or laying out, portions of the model that will actually be built.
Yes, this is a little confusing because we are talking about construction in terms of concrete and steel,
but construction geometry as a term used in this context is common in 2D &lt;span class="caps"&gt;CADD&lt;/span&gt;
and other modeling&amp;nbsp;packages.&lt;/p&gt;
&lt;p&gt;To get started, we&amp;#8217;ll import the same packages, use the same constants,
and utilize the same functions previously&amp;nbsp;developed.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: Typically at this point in a data science project,
this would be a great time to start factoring notebook cells 
out into scripts and modules.
However, I&amp;#8217;m going to make the call
that I can live with some technical debt for the time&amp;nbsp;being.&lt;/em&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[18]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&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;math&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="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;figure.figsize&amp;#39;&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="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;8.5&lt;/span&gt;&lt;span class="p"&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;mpl_toolkits.mplot3d&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;Axes3D&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;mpmath&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;pandas&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;pd&lt;/span&gt;

&lt;span class="n"&gt;fc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;625.0925&lt;/span&gt; &lt;span class="c1"&gt;# Maximium height of centroid&lt;/span&gt;
&lt;span class="n"&gt;Qb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1262.6651&lt;/span&gt; &lt;span class="c1"&gt;# Maximum cross-sectional area at arch base&lt;/span&gt;
&lt;span class="n"&gt;Qt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;125.1406&lt;/span&gt; &lt;span class="c1"&gt;# Minimum cross-sectional area at arch top&lt;/span&gt;
&lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;299.2239&lt;/span&gt; &lt;span class="c1"&gt;# Half of centroid at arch base&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;fc&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Qb&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Qt&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="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;acosh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Qb&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Qt&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;El&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Y&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;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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;C&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="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;acosh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&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;A&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Intrados-and-Extrados"&gt;Intrados and Extrados&lt;a class="anchor-link" href="#Intrados-and-Extrados"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The &lt;span class="caps"&gt;NPS&lt;/span&gt; web site has served us well thus far.
However, we could certainly use some more detail on a methodology for calculating
the inner and outer edges of the arch to fully develop a 2D elevation view.
The detailed methodology for developing the arch geometry was
&lt;a href="https://www.jug.net/wt/arch.htm"&gt;laid out in the blueprints&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="A-Word-About-Symmetry"&gt;A Word About Symmetry&lt;a class="anchor-link" href="#A-Word-About-Symmetry"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The equations developed for cross-sectional charactistics of the arch
were developed for the right-hand side of the arch.
Speaking from experience, bad things will happen if you try to apply the same relationships
to the left (x &amp;lt; 0) side of the arch.
Therefore, we&amp;#8217;ll just calculate the right leg, then mirror about the X axis to get the other
half of our&amp;nbsp;model.&lt;/p&gt;
&lt;p&gt;With that important caveat in mind, let&amp;#8217;s build pythonic versions of these&amp;nbsp;equations:&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[19]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&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;Y&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;ret&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="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cosh&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="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;L&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&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;ret&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;1e-16&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ret&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;slope&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;C&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="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&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;A&lt;/span&gt; &lt;span class="o"&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;Y&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="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slope&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;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;atan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slope&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;Q&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="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;cross-sectional area at any Y&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Qb&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&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;Qt&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;H&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Q&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;quot;&amp;quot;&amp;quot;height of the equilateral triangular section&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Q&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;mpmath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpmath&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;30&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;W2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;H&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;quot;&amp;quot;&amp;quot;side of the equilateral triangular section&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;return&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;H&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;math&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;30&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# test some known values&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Value of Y at X=0 is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Y&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="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Elevation at X=0 is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;El&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Maximum cross-sectional area is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Q&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="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, or Qb = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Maximum cross-sectional area is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Q&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;L&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, or Qt = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Qb&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Height of triangle at the top is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Length of triangle side at the top is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;W2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Height of triangle at the bottom is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Qb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Length of triangle side at the bottom is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;W2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Qb&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Slope angle (alpha) near top of arch is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;degrees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.000001&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Value of Y at X=0 is 0.0000
Elevation at X=0 is 625.0925
Maximum cross-sectional area is 125.1406, or Qb = 125.1406
Maximum cross-sectional area is 1262.6651, or Qt = 1262.6651
Height of triangle at the top is 14.7224
Length of triangle side at the top is 17.0000
Height of triangle at the bottom is 46.7654
Length of triangle side at the bottom is 54.0000
Slope angle (alpha) near top of arch is 89.9933
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Great! Everything is checking out so&amp;nbsp;far.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Side note: ideally, we would be using a test suite such as &lt;a href="https://docs.pytest.org/en/latest"&gt;pytest&lt;/a&gt;
in lieu of print-mode debugging.
However, in a notebook such as this the focus is more on telling a story
than creating a piece of production&amp;nbsp;software.&lt;/em&gt;&lt;/p&gt;
&lt;h4 id="Data-Structure-+-Function-=-Class"&gt;Data Structure + Function = Class&lt;a class="anchor-link" href="#Data-Structure-+-Function-=-Class"&gt;&amp;#182;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Initially, my next step was to start defining individual functions to calculate points
on the interior and exterior of the arch at any given location along the centroid.
But, that would have duplicated a lot of the calculation logic.
So, let&amp;#8217;s think about what we actually want to do:
given any x coordinate on the centroid, calculate the y coordinate of the
centroid, along with the coordinates of the intrados and extrados.
This is the perfect time to write our first class.
This will allow us to encapsulate the calculations and results into
a single, tidy&amp;nbsp;spot.&lt;/p&gt;
&lt;p&gt;While we&amp;#8217;re at it, let&amp;#8217;s go ahead and make the leap to three dimensions.
One wrinkle here is that  our coordinate system defined thus far is 
consistent with a &amp;#8220;Y-up&amp;#8221; convention that is common in graphics.
This can be confusing for those of us that are used to &amp;#8220;Z-up&amp;#8221; in the &lt;span class="caps"&gt;CADD&lt;/span&gt; world.
For the arch, the centroid and intrados will be on the Z-plane (Z=0).
So that means we only need to worry about calculating Z coordinates for the extrados.
Since the arch doesn&amp;#8217;t have any torsion (twist) by design, we actually only need to
calculate a single Z offset, then assign the positive value to one extrados point
and the negated value to the other extrados point.
This Z offset will be one-half of W, the length of each side of the triangular&amp;nbsp;cross-section.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[20]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&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;NormalSection&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;quot;&amp;quot;&amp;quot;calculates the triangular cross-section of the arch at any provided&lt;/span&gt;
&lt;span class="sd"&gt;    value of x (offset from axis of symmetry)&amp;quot;&amp;quot;&amp;quot;&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;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;max_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;299.5458&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;max_x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Invalid value for x (must be between 0 and &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;max_x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)&amp;quot;&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;x&lt;/span&gt; &lt;span class="o"&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;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;1e-6&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;Y&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;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;atan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slope&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;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Q&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;h1&lt;/span&gt; &lt;span class="o"&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;h&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
        &lt;span class="n"&gt;h2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h1&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;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;W2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        
        &lt;span class="c1"&gt;# intrados&lt;/span&gt;
        &lt;span class="n"&gt;x3&lt;/span&gt; &lt;span class="o"&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;h1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;math&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;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;y3&lt;/span&gt; &lt;span class="o"&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;h1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;math&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;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        
        &lt;span class="c1"&gt;# extrados&lt;/span&gt;
        &lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="o"&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;h2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;math&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;a&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;y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;h2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;math&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;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        
        &lt;span class="c1"&gt;# counterclockwise winding&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;_pt1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;El&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y3&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="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_pt2&lt;/span&gt; &lt;span class="o"&gt;=&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="n"&gt;El&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;z&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;_pt3&lt;/span&gt; &lt;span class="o"&gt;=&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="n"&gt;El&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        
    &lt;span class="nd"&gt;@property&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;vertices&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="k"&gt;return&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="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_pt1&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;_pt2&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;_pt3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;float64&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;An easy way to test this class is to confirm that the extrados point at the top of the arch is equal to the total height of the arch (630 feet).
The distance between legs of the arch at the base should be 630 feet as&amp;nbsp;well.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[21]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Maximum height of arch is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;NormalSection&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;vertices&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;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Total width of arch at base is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&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;NormalSection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;299.5458&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Maximum height of arch is 630.0000.
Total width of arch at base is 630.0003.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Blueprint-Stations"&gt;Blueprint Stations&lt;a class="anchor-link" href="#Blueprint-Stations"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Now that we have a class defined to provide triangle vertices
at any value of x on the centroid construction geometry,
we need to know what values of x should actually be evaluated.
The arch blueprints included a 
&lt;a href="https://jug.net/wt/220f01/centroidxdat.htm"&gt;list of 72 stations with these values&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We can use pandas to parse this file so that we are creating
our virtual model of the arch geometry exactly as intended per the&amp;nbsp;blueprints.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: I renamed my local copy to have&amp;nbsp;a &lt;code&gt;*.txt&lt;/code&gt; extension
so that it didn&amp;#8217;t wreak havoc with the static site generator&amp;nbsp;tooling.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;read_html&lt;/code&gt; method returns a list of dataframes corresponding to
all of the tables in an html document.
From inspection of the input data, we know that we only want to keep the first&amp;nbsp;one.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[22]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;../static/centroidxdat.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index_col&lt;/span&gt;&lt;span class="o"&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="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&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;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;columns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inplace&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="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&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="s2"&gt;&amp;quot;centroid_x&amp;quot;&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inplace&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="n"&gt;stations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;centroid_x&amp;quot;&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;El&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;_&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;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stations&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;sections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NormalSection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&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;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stations&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;x3&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;_&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;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;span class="n"&gt;y3&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;_&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;

&lt;span class="n"&gt;x1w&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;_&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;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;span class="n"&gt;y1w&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;_&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;

&lt;span class="n"&gt;x1e&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;_&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;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;span class="n"&gt;y1e&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;_&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;

&lt;span class="n"&gt;triangles2d&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;float64&lt;/span&gt;&lt;span class="p"&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;vertices&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="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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;1&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&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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;1&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;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;x2d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;triangles2d&lt;/span&gt;&lt;span class="p"&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="n"&gt;y2d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;triangles2d&lt;/span&gt;&lt;span class="p"&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="n"&gt;axes&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;gca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_aspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;equal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylim&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;650&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;stations&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;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;centroid&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;green&amp;#39;&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="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;stations&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;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;centroid - north&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;green&amp;#39;&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;x3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y3&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;intrados - south&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;red&amp;#39;&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="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y3&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;intrados - north&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;red&amp;#39;&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;x1w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y1w&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;extrados - south&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;blue&amp;#39;&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="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x1w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y1w&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;extrados - north&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;blue&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;xs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x2d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y2d&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;xs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&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;gray&amp;#39;&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="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&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;gray&amp;#39;&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;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Fig. 1 - Elevation View of Extrados, Centroid, Intrados, and Sections&amp;quot;&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;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;




&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h1 id="Confirm-Results"&gt;Confirm Results&lt;a class="anchor-link" href="#Confirm-Results"&gt;&amp;#182;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Ok, so that looks good.
However, I said earlier that we were going to go ahead and make the jump to 3D.&amp;nbsp;Our &lt;code&gt;NormalSection&lt;/code&gt; class calculates 3D points for all of the triangular cross sections.
So, with a few more lines of code, we should be able to make a similar plot,
but with the inclusion of the Z-axis,
which is the direction coming in and out of the screen in Figure&amp;nbsp;1.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[23]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;z3&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;_&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;span class="n"&gt;z1w&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;_&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;span class="n"&gt;z1e&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;_&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;

&lt;span class="c1"&gt;# add the first point again at the end to make a closed shape&lt;/span&gt;
&lt;span class="n"&gt;triangles3d&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;float64&lt;/span&gt;&lt;span class="p"&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;vertices&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="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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;1&lt;/span&gt;&lt;span class="p"&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;vertices&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="p"&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;vertices&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;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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;1&lt;/span&gt;&lt;span class="p"&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;vertices&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="p"&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;vertices&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;0&lt;/span&gt;&lt;span class="p"&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;vertices&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;1&lt;/span&gt;&lt;span class="p"&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;vertices&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;2&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&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertices&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;1&lt;/span&gt;&lt;span class="p"&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;vertices&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;x3d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;triangles3d&lt;/span&gt;&lt;span class="p"&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="n"&gt;y3d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;triangles3d&lt;/span&gt;&lt;span class="p"&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="n"&gt;z3d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;triangles3d&lt;/span&gt;&lt;span class="p"&gt;[:,&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;fig&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;figure&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;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;projection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3d&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;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;stations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&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;zeros_like&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stations&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;zs&lt;/span&gt;&lt;span class="o"&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;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;orange&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;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="n"&gt;stations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&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;zeros_like&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;stations&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;zs&lt;/span&gt;&lt;span class="o"&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;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;orange&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;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y3&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;red&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;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="n"&gt;x3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y3&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;red&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;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x1w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z1w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y1w&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;blue&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;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="n"&gt;x1w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z1w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y1w&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;blue&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;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x1e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z1e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y1e&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;green&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;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="n"&gt;x1e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z1e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y1e&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;green&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;x3d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y3d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;z3d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x3d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y3d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;z3d&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;xs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x3d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z3d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y3d&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;gray&amp;#39;&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;xs&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="n"&gt;x3d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z3d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y3d&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;gray&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_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;350&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_ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;350&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_zlim&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;700&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;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Fig. 2 - 3D View of Extrados, Centroid, Intrados, and Sections&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt output_prompt"&gt;Out[23]:&lt;/div&gt;




&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;Text(0.5, 0.92, &amp;#39;Fig. 2 - 3D View of Extrados, Centroid, Intrados, and Sections&amp;#39;)&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;




&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Serialize-output"&gt;Serialize output&lt;a class="anchor-link" href="#Serialize-output"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Now that we&amp;#8217;ve calculated all of the geometry, let&amp;#8217;s serialize it
(write coordinates to a text file) so that we can potentially re-generate this model
in another platform such as&amp;nbsp;Blender.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re going to reverse the order of the triangles (arch cross-sections)
so that it starts at the bottom and progresses up to the top.
That way we can build our model in the same order
as the way that actual construction was carried&amp;nbsp;out.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[24]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&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;json&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="s2"&gt;&amp;quot;triangles.json&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;w&amp;quot;&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;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triangles3d&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="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;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&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;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h1 id="Conclusion"&gt;Conclusion&lt;a class="anchor-link" href="#Conclusion"&gt;&amp;#182;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Given the density of the sections, it&amp;#8217;s hard to pick out the centroid
in the 3d plot.
This makes sense, given that the centroid is merely &amp;#8216;construction&amp;#8217;
geometry and does not represent anything physically present in the real&amp;nbsp;world.&lt;/p&gt;
&lt;p&gt;Matplotlib does not provide any interaction out of the box.
This means we cannot zoom, pan, or otherwise adjust our view of the arch model.
However, now that we have our geometry,
we can use any number of external libraries for rendering the
geometry dynamically in the browser.
Similarly, we could write the geometry as a &lt;span class="caps"&gt;DXF&lt;/span&gt; polyface mesh
and load it into a &lt;span class="caps"&gt;CAD&lt;/span&gt; package such as MicroStation.
These next steps will be left for a (potential) future blog&amp;nbsp;post.&lt;/p&gt;
&lt;h3 id="Why-all-this-code?-Why-not-just-model-the-arch-directly-from-a-spreadsheet-or-other-data-source?"&gt;Why all this code? Why not just model the arch directly from a spreadsheet or other data source?&lt;a class="anchor-link" href="#Why-all-this-code?-Why-not-just-model-the-arch-directly-from-a-spreadsheet-or-other-data-source?"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;There are three main benefits of utilizing computational geometry
for 3D modeling such as I have done with the Gateway&amp;nbsp;Arch:&lt;/p&gt;
&lt;h4 id="1.-Parametric-Values-for-Maximum-Flexibility-and-Iteration-Speed"&gt;1. Parametric Values for Maximum Flexibility and Iteration Speed&lt;a class="anchor-link" href="#1.-Parametric-Values-for-Maximum-Flexibility-and-Iteration-Speed"&gt;&amp;#182;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The entire process, from start to finish, 
is based upon parameters that define the overall arch geometry.
If this were a proposed project still in the design phase,
we could easily do multiple variations as part of the &amp;#8216;what if?&amp;#8217;
iterative nature of design.  For example, we could change
one or more of the constants to scale the arch to a greater height,
or adjust another to vary the arch from the 1:1 aspect&amp;nbsp;ratio.&lt;/p&gt;
&lt;h4 id="2.-Change-management-with-source-control-tools-such-as-git."&gt;2. Change management with source control tools such as &lt;a href="https://git-scm.org"&gt;git&lt;/a&gt;.&lt;a class="anchor-link" href="#2.-Change-management-with-source-control-tools-such-as-git."&gt;&amp;#182;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;As any architect or engineer will tell you, change
is a constant during the design process.
Ideas will be discarded one day only to be resurrected days, weeks, or
months later.
Because we are developing all of the geometry with python code,
the parametric relationships are all captured in plain-text files
versus proprietary binary formats typical in &lt;span class="caps"&gt;CADD&lt;/span&gt; and &lt;span class="caps"&gt;BIM&lt;/span&gt; software.
Utilizing a tool such as git means that every iteration can be checkpointed
with a commit hash, timestamp, and optional tag.
Reverting to a previous version of the design
(or even carrying multiple variations forward at the same time)
is as easy as checking out a specific commit or branch in the revision&amp;nbsp;history.&lt;/p&gt;
&lt;h4 id="3.-Reducing-human-error"&gt;3. Reducing human error&lt;a class="anchor-link" href="#3.-Reducing-human-error"&gt;&amp;#182;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;When geometry is being created or entered by a human operator,
there is always the possibility of &amp;#8216;fat-fingering&amp;#8217; the data
via typos or other transpositional bugaboos.
By allowing a computer to generate the coordinate geometry algorithmically,
we eliminate this particular source of error.
Yes, there is still the potential for bugs or other errors in the code,
but careful checking along the way either manually
(as I have done in this example)
or via an automated test suite (best practice when using code in production),
those potential bugs can be fleshed out early in the&amp;nbsp;process.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
 


&lt;script type="text/javascript"&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = '//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
    mathjaxscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: 'center'," +
        "    displayIndent: '0em'," +
        "    showMathMenu: true," +
        "    tex2jax: { " +
        "        inlineMath: [ ['$','$'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        " linebreaks: { automatic: true, width: '95% container' }, " +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important'} }" +
        "    } " +
        "}); ";
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;
</content><category term="how-to"/><category term="python"/></entry><entry><title>Modeling the St. Louis Arch</title><link href="https://www.heavycivilbigdata.com/modeling-the-st-louis-arch.html" rel="alternate"/><published>2019-10-28T00:00:00-04:00</published><updated>2019-10-28T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2019-10-28:/modeling-the-st-louis-arch.html</id><summary type="html">&lt;p&gt;Computational Geometry gets real with a National Civil Engineering&amp;nbsp;Landmark&lt;/p&gt;</summary><content type="html">&lt;style type="text/css"&gt;/*!
*
* IPython notebook
*
*/
/* &lt;span class="caps"&gt;CSS&lt;/span&gt; font colors for translated &lt;span class="caps"&gt;ANSI&lt;/span&gt; escape sequences */
/* The color values are a mix of
   http://www.xcolors.net/dl/baskerville-ivorylight and
   http://www.xcolors.net/dl/euphrasia */
.ansi-black-fg {
  color: #&lt;span class="caps"&gt;3E424D&lt;/span&gt;;
}
.ansi-black-bg {
  background-color: #&lt;span class="caps"&gt;3E424D&lt;/span&gt;;
}
.ansi-black-intense-fg {
  color: #282C36;
}
.ansi-black-intense-bg {
  background-color: #282C36;
}
.ansi-red-fg {
  color: #&lt;span class="caps"&gt;E75C58&lt;/span&gt;;
}
.ansi-red-bg {
  background-color: #&lt;span class="caps"&gt;E75C58&lt;/span&gt;;
}
.ansi-red-intense-fg {
  color: #&lt;span class="caps"&gt;B22B31&lt;/span&gt;;
}
.ansi-red-intense-bg {
  background-color: #&lt;span class="caps"&gt;B22B31&lt;/span&gt;;
}
.ansi-green-fg {
  color: #00A250;
}
.ansi-green-bg {
  background-color: #00A250;
}
.ansi-green-intense-fg {
  color: #007427;
}
.ansi-green-intense-bg {
  background-color: #007427;
}
.ansi-yellow-fg {
  color: #&lt;span class="caps"&gt;DDB62B&lt;/span&gt;;
}
.ansi-yellow-bg {
  background-color: #&lt;span class="caps"&gt;DDB62B&lt;/span&gt;;
}
.ansi-yellow-intense-fg {
  color: #&lt;span class="caps"&gt;B27D12&lt;/span&gt;;
}
.ansi-yellow-intense-bg {
  background-color: #&lt;span class="caps"&gt;B27D12&lt;/span&gt;;
}
.ansi-blue-fg {
  color: #&lt;span class="caps"&gt;208FFB&lt;/span&gt;;
}
.ansi-blue-bg {
  background-color: #&lt;span class="caps"&gt;208FFB&lt;/span&gt;;
}
.ansi-blue-intense-fg {
  color: #&lt;span class="caps"&gt;0065CA&lt;/span&gt;;
}
.ansi-blue-intense-bg {
  background-color: #&lt;span class="caps"&gt;0065CA&lt;/span&gt;;
}
.ansi-magenta-fg {
  color: #&lt;span class="caps"&gt;D160C4&lt;/span&gt;;
}
.ansi-magenta-bg {
  background-color: #&lt;span class="caps"&gt;D160C4&lt;/span&gt;;
}
.ansi-magenta-intense-fg {
  color: #A03196;
}
.ansi-magenta-intense-bg {
  background-color: #A03196;
}
.ansi-cyan-fg {
  color: #&lt;span class="caps"&gt;60C6C8&lt;/span&gt;;
}
.ansi-cyan-bg {
  background-color: #&lt;span class="caps"&gt;60C6C8&lt;/span&gt;;
}
.ansi-cyan-intense-fg {
  color: #&lt;span class="caps"&gt;258F8F&lt;/span&gt;;
}
.ansi-cyan-intense-bg {
  background-color: #&lt;span class="caps"&gt;258F8F&lt;/span&gt;;
}
.ansi-white-fg {
  color: #&lt;span class="caps"&gt;C5C1B4&lt;/span&gt;;
}
.ansi-white-bg {
  background-color: #&lt;span class="caps"&gt;C5C1B4&lt;/span&gt;;
}
.ansi-white-intense-fg {
  color: #&lt;span class="caps"&gt;A1A6B2&lt;/span&gt;;
}
.ansi-white-intense-bg {
  background-color: #&lt;span class="caps"&gt;A1A6B2&lt;/span&gt;;
}
.ansi-default-inverse-fg {
  color: #&lt;span class="caps"&gt;FFFFFF&lt;/span&gt;;
}
.ansi-default-inverse-bg {
  background-color: #000000;
}
.ansi-bold {
  font-weight: bold;
}
.ansi-underline {
  text-decoration: underline;
}
/* The following styles are deprecated an will be removed in a future version */
.ansibold {
  font-weight: bold;
}
.ansi-inverse {
  outline: 0.5px dotted;
}
/* use dark versions for foreground, to improve visibility */
.ansiblack {
  color: black;
}
.ansired {
  color: darkred;
}
.ansigreen {
  color: darkgreen;
}
.ansiyellow {
  color: #c4a000;
}
.ansiblue {
  color: darkblue;
}
.ansipurple {
  color: darkviolet;
}
.ansicyan {
  color: steelblue;
}
.ansigray {
  color: gray;
}
/* and light for background, for the same reason */
.ansibgblack {
  background-color: black;
}
.ansibgred {
  background-color: red;
}
.ansibggreen {
  background-color: green;
}
.ansibgyellow {
  background-color: yellow;
}
.ansibgblue {
  background-color: blue;
}
.ansibgpurple {
  background-color: magenta;
}
.ansibgcyan {
  background-color: cyan;
}
.ansibggray {
  background-color: gray;
}
div.cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  border-radius: 2px;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  border-width: 1px;
  border-style: solid;
  border-color: transparent;
  width: 100%;
  padding: 5px;
  /* This acts as a spacer between cells, that is outside the border */
  margin: 0px;
  outline: none;
  position: relative;
  overflow: visible;
}
div.cell:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: transparent;
}
div.cell.jupyter-soft-selected {
  border-left-color: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
  border-left-width: 1px;
  padding-left: 5px;
  border-right-color: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
  border-right-width: 1px;
  background: #&lt;span class="caps"&gt;E3F2FD&lt;/span&gt;;
}
@media print {
  div.cell.jupyter-soft-selected {
    border-color: transparent;
  }
}
div.cell.selected,
div.cell.selected.jupyter-soft-selected {
  border-color: #ababab;
}
div.cell.selected:before,
div.cell.selected.jupyter-soft-selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #&lt;span class="caps"&gt;42A5F5&lt;/span&gt;;
}
@media print {
  div.cell.selected,
  div.cell.selected.jupyter-soft-selected {
    border-color: transparent;
  }
}
.edit_mode div.cell.selected {
  border-color: #&lt;span class="caps"&gt;66BB6A&lt;/span&gt;;
}
.edit_mode div.cell.selected:before {
  position: absolute;
  display: block;
  top: -1px;
  left: -1px;
  width: 5px;
  height: calc(100% +  2px);
  content: '';
  background: #&lt;span class="caps"&gt;66BB6A&lt;/span&gt;;
}
@media print {
  .edit_mode div.cell.selected {
    border-color: transparent;
  }
}
.prompt {
  /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */
  min-width: 14ex;
  /* This padding is tuned to match the padding on the CodeMirror editor. */
  padding: 0.4em;
  margin: 0px;
  font-family: monospace;
  text-align: right;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
  /* Don't highlight prompt number selection */
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  /* Use default cursor */
  cursor: default;
}
@media (max-width: 540px) {
  .prompt {
    text-align: left;
  }
}
div.inner_cell {
  min-width: 0;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_area {
  border: 1px solid #cfcfcf;
  border-radius: 2px;
  background: #f7f7f7;
  line-height: 1.21429em;
}
/* This is needed so that empty prompt areas can collapse to zero height when there
   is no content in the output_subarea and the prompt. The main purpose of this is
   to make sure that empty JavaScript output_subareas have no height. */
div.prompt:empty {
  padding-top: 0;
  padding-bottom: 0;
}
div.unrecognized_cell {
  padding: 5px 5px 5px 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.unrecognized_cell .inner_cell {
  border-radius: 2px;
  padding: 5px;
  font-weight: bold;
  color: red;
  border: 1px solid #cfcfcf;
  background: #eaeaea;
}
div.unrecognized_cell .inner_cell a {
  color: inherit;
  text-decoration: none;
}
div.unrecognized_cell .inner_cell a:hover {
  color: inherit;
  text-decoration: none;
}
@media (max-width: 540px) {
  div.unrecognized_cell &gt; div.prompt {
    display: none;
  }
}
div.code_cell {
  /* avoid page breaking on code cells when printing */
}
@media print {
  div.code_cell {
    page-break-inside: avoid;
  }
}
/* any special styling for code cells that are currently running goes here */
div.input {
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.input {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
/* input_area and input_prompt must match in top border and margin for alignment */
div.input_prompt {
  color: #&lt;span class="caps"&gt;303F9F&lt;/span&gt;;
  border-top: 1px solid transparent;
}
div.input_area &gt; div.highlight {
  margin: 0.4em;
  border: none;
  padding: 0px;
  background-color: transparent;
}
div.input_area &gt; div.highlight &gt; pre {
  margin: 0px;
  border: none;
  padding: 0px;
  background-color: transparent;
}
/* The following gets added to the &lt;head&gt; if it is detected that the user has a
 * monospace font with inconsistent normal/bold/italic height.  See
 * notebookmain.js.  Such fonts will have keywords vertically offset with
 * respect to the rest of the text.  The user should select a better font.
 * See: https://github.com/ipython/ipython/issues/1503
 *
 * .CodeMirror span {
 *      vertical-align: bottom;
 * }
 */
.CodeMirror {
  line-height: 1.21429em;
  /* Changed from 1em to our global default */
  font-size: 14px;
  height: auto;
  /* Changed to auto to autogrow */
  background: none;
  /* Changed from white to allow our bg to show through */
}
.CodeMirror-scroll {
  /*  The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/
  /*  We have found that if it is visible, vertical scrollbars appear with font size changes.*/
  overflow-y: hidden;
  overflow-x: auto;
}
.CodeMirror-lines {
  /* In &lt;span class="caps"&gt;CM2&lt;/span&gt;, this used to be 0.4em, but in &lt;span class="caps"&gt;CM3&lt;/span&gt; it went to 4px. We need the em value because */
  /* we have set a different line-height and want this to scale with that. */
  /* Note that this should set vertical padding only, since CodeMirror assumes
       that horizontal padding will be set on CodeMirror pre */
  padding: 0.4em 0;
}
.CodeMirror-linenumber {
  padding: 0 8px 0 4px;
}
.CodeMirror-gutters {
  border-bottom-left-radius: 2px;
  border-top-left-radius: 2px;
}
.CodeMirror pre {
  /* In &lt;span class="caps"&gt;CM3&lt;/span&gt; this went to 4px from 0 in &lt;span class="caps"&gt;CM2&lt;/span&gt;. This sets horizontal padding only,
    use .CodeMirror-lines for vertical */
  padding: 0 0.4em;
  border: 0;
  border-radius: 0;
}
.CodeMirror-cursor {
  border-left: 1.4px solid black;
}
@media screen and (min-width: 2138px) and (max-width: 4319px) {
  .CodeMirror-cursor {
    border-left: 2px solid black;
  }
}
@media screen and (min-width: 4320px) {
  .CodeMirror-cursor {
    border-left: 4px solid black;
  }
}
/*

Original style from softwaremaniacs.org (c) Ivan Sagalaev &lt;Maniac@SoftwareManiacs.Org&gt;
Adapted from GitHub theme

*/
.highlight-base {
  color: #000;
}
.highlight-variable {
  color: #000;
}
.highlight-variable-2 {
  color: #1a1a1a;
}
.highlight-variable-3 {
  color: #333333;
}
.highlight-string {
  color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;;
}
.highlight-comment {
  color: #408080;
  font-style: italic;
}
.highlight-number {
  color: #080;
}
.highlight-atom {
  color: #88F;
}
.highlight-keyword {
  color: #008000;
  font-weight: bold;
}
.highlight-builtin {
  color: #008000;
}
.highlight-error {
  color: #f00;
}
.highlight-operator {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
  font-weight: bold;
}
.highlight-meta {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
}
/* previously not defined, copying from default codemirror */
.highlight-def {
  color: #00f;
}
.highlight-string-2 {
  color: #f50;
}
.highlight-qualifier {
  color: #555;
}
.highlight-bracket {
  color: #997;
}
.highlight-tag {
  color: #170;
}
.highlight-attribute {
  color: #00c;
}
.highlight-header {
  color: blue;
}
.highlight-quote {
  color: #090;
}
.highlight-link {
  color: #00c;
}
/* apply the same style to codemirror */
.cm-s-ipython span.cm-keyword {
  color: #008000;
  font-weight: bold;
}
.cm-s-ipython span.cm-atom {
  color: #88F;
}
.cm-s-ipython span.cm-number {
  color: #080;
}
.cm-s-ipython span.cm-def {
  color: #00f;
}
.cm-s-ipython span.cm-variable {
  color: #000;
}
.cm-s-ipython span.cm-operator {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
  font-weight: bold;
}
.cm-s-ipython span.cm-variable-2 {
  color: #1a1a1a;
}
.cm-s-ipython span.cm-variable-3 {
  color: #333333;
}
.cm-s-ipython span.cm-comment {
  color: #408080;
  font-style: italic;
}
.cm-s-ipython span.cm-string {
  color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;;
}
.cm-s-ipython span.cm-string-2 {
  color: #f50;
}
.cm-s-ipython span.cm-meta {
  color: #&lt;span class="caps"&gt;AA22FF&lt;/span&gt;;
}
.cm-s-ipython span.cm-qualifier {
  color: #555;
}
.cm-s-ipython span.cm-builtin {
  color: #008000;
}
.cm-s-ipython span.cm-bracket {
  color: #997;
}
.cm-s-ipython span.cm-tag {
  color: #170;
}
.cm-s-ipython span.cm-attribute {
  color: #00c;
}
.cm-s-ipython span.cm-header {
  color: blue;
}
.cm-s-ipython span.cm-quote {
  color: #090;
}
.cm-s-ipython span.cm-link {
  color: #00c;
}
.cm-s-ipython span.cm-error {
  color: #f00;
}
.cm-s-ipython span.cm-tab {
  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);
  background-position: right;
  background-repeat: no-repeat;
}
div.output_wrapper {
  /* this position must be relative to enable descendents to be absolute within it */
  position: relative;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  z-index: 1;
}
/* class for the output area when it should be height-limited */
div.output_scroll {
  /* ideally, this would be max-height, but &lt;span class="caps"&gt;FF&lt;/span&gt; barfs all over that */
  height: 24em;
  /* &lt;span class="caps"&gt;FF&lt;/span&gt; needs this *and the wrapper* to specify full width, or it will shrinkwrap */
  width: 100%;
  overflow: auto;
  border-radius: 2px;
  -webkit-box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8);
  display: block;
}
/* output div while it is collapsed */
div.output_collapsed {
  margin: 0px;
  padding: 0px;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
div.out_prompt_overlay {
  height: 100%;
  padding: 0px 0.4em;
  position: absolute;
  border-radius: 2px;
}
div.out_prompt_overlay:hover {
  /* use inner shadow to get border that is computed the same on WebKit/&lt;span class="caps"&gt;FF&lt;/span&gt; */
  -webkit-box-shadow: inset 0 0 1px #000;
  box-shadow: inset 0 0 1px #000;
  background: rgba(240, 240, 240, 0.5);
}
div.output_prompt {
  color: #D84315;
}
/* This class is the outer container of all output sections. */
div.output_area {
  padding: 0px;
  page-break-inside: avoid;
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
div.output_area .MathJax_Display {
  text-align: left !important;
}
div.output_area 
div.output_area 
div.output_area img,
div.output_area svg {
  max-width: 100%;
  height: auto;
}
div.output_area img.unconfined,
div.output_area svg.unconfined {
  max-width: none;
}
div.output_area .mglyph &gt; img {
  max-width: none;
}
/* This is needed to protect the pre formating from global settings such
   as that of bootstrap */
.output {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: vertical;
  -moz-box-align: stretch;
  display: box;
  box-orient: vertical;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.output_area {
    /* Old browsers */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-align: stretch;
    display: -moz-box;
    -moz-box-orient: vertical;
    -moz-box-align: stretch;
    display: box;
    box-orient: vertical;
    box-align: stretch;
    /* Modern browsers */
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
}
div.output_area pre {
  margin: 0;
  padding: 1px 0 1px 0;
  border: 0;
  vertical-align: baseline;
  color: black;
  background-color: transparent;
  border-radius: 0;
}
/* This class is for the output subarea inside the output_area and after
   the prompt div. */
div.output_subarea {
  overflow-x: auto;
  padding: 0.4em;
  /* Old browsers */
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  /* Modern browsers */
  flex: 1;
  max-width: calc(100% - 14ex);
}
div.output_scroll div.output_subarea {
  overflow-x: visible;
}
/* The rest of the output_* classes are for special styling of the different
   output types */
/* all text output has this class: */
div.output_text {
  text-align: left;
  color: #000;
  /* This has to match that of the the CodeMirror class line-height below */
  line-height: 1.21429em;
}
/* stdout/stderr are 'text' as well as 'stream', but execute_result/error are *not* streams */
div.output_stderr {
  background: #fdd;
  /* very light red background for stderr */
}
div.output_latex {
  text-align: left;
}
/* Empty output_javascript divs should have no height */
div.output_javascript:empty {
  padding: 0;
}
.js-error {
  color: darkred;
}
/* raw_input styles */
div.raw_input_container {
  line-height: 1.21429em;
  padding-top: 5px;
}
pre.raw_input_prompt {
  /* nothing needed here. */
}
input.raw_input {
  font-family: monospace;
  font-size: inherit;
  color: inherit;
  width: auto;
  /* make sure input baseline aligns with prompt */
  vertical-align: baseline;
  /* padding + margin = 0.5em between prompt and cursor */
  padding: 0em 0.25em;
  margin: 0em 0.25em;
}
input.raw_input:focus {
  box-shadow: none;
}
p.p-space {
  margin-bottom: 10px;
}
div.output_unrecognized {
  padding: 5px;
  font-weight: bold;
  color: red;
}
div.output_unrecognized a {
  color: inherit;
  text-decoration: none;
}
div.output_unrecognized a:hover {
  color: inherit;
  text-decoration: none;
}
.rendered_html {
  color: #000;
  /* any extras will just be numbers: */
}



.rendered_html :link {
  text-decoration: underline;
}
.rendered_html :visited {
  text-decoration: underline;
}






.rendered_html h1:first-child {
  margin-top: 0.538em;
}
.rendered_html h2:first-child {
  margin-top: 0.636em;
}
.rendered_html h3:first-child {
  margin-top: 0.777em;
}
.rendered_html h4:first-child {
  margin-top: 1em;
}
.rendered_html h5:first-child {
  margin-top: 1em;
}
.rendered_html h6:first-child {
  margin-top: 1em;
}
.rendered_html ul:not(.list-inline),
.rendered_html ol:not(.list-inline) {
  padding-left: 2em;
}








.rendered_html * + ul {
  margin-top: 1em;
}
.rendered_html * + ol {
  margin-top: 1em;
}





.rendered_html pre,




.rendered_html tr,
.rendered_html th,


.rendered_html tbody tr:nth-child(odd) {
  background: #f5f5f5;
}
.rendered_html tbody tr:hover {
  background: rgba(66, 165, 245, 0.2);
}
.rendered_html * + table {
  margin-top: 1em;
}

.rendered_html * + p {
  margin-top: 1em;
}

.rendered_html * + img {
  margin-top: 1em;
}
.rendered_html img,

.rendered_html img.unconfined,


.rendered_html * + .alert {
  margin-top: 1em;
}
[dir="rtl"] 
div.text_cell {
  /* Old browsers */
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  /* Modern browsers */
  display: flex;
  flex-direction: row;
  align-items: stretch;
}
@media (max-width: 540px) {
  div.text_cell &gt; div.prompt {
    display: none;
  }
}
div.text_cell_render {
  /*font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;*/
  outline: none;
  resize: none;
  width: inherit;
  border-style: none;
  padding: 0.5em 0.5em 0.5em 0.4em;
  color: #000;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}
a.anchor-link:link {
  text-decoration: none;
  padding: 0px 20px;
  visibility: hidden;
}
h1:hover .anchor-link,
h2:hover .anchor-link,
h3:hover .anchor-link,
h4:hover .anchor-link,
h5:hover .anchor-link,
h6:hover .anchor-link {
  visibility: visible;
}
.text_cell.rendered .input_area {
  display: none;
}
.text_cell.rendered 
.text_cell.rendered .rendered_html tr,
.text_cell.rendered .rendered_html th,
.text_cell.rendered 
.text_cell.unrendered .text_cell_render {
  display: none;
}
.text_cell .dropzone .input_area {
  border: 2px dashed #bababa;
  margin: -1px;
}
.cm-header-1,
.cm-header-2,
.cm-header-3,
.cm-header-4,
.cm-header-5,
.cm-header-6 {
  font-weight: bold;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.cm-header-1 {
  font-size: 185.7%;
}
.cm-header-2 {
  font-size: 157.1%;
}
.cm-header-3 {
  font-size: 128.6%;
}
.cm-header-4 {
  font-size: 110%;
}
.cm-header-5 {
  font-size: 100%;
  font-style: italic;
}
.cm-header-6 {
  font-size: 100%;
  font-style: italic;
}
&lt;/style&gt;
&lt;style type="text/css"&gt;pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 .highlight pre  .hll { background-color: #ffffcc }
 .highlight pre  { background: #f8f8f8; }
 .highlight pre  .c { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment */
 .highlight pre  .err { border: 1px solid #F00 } /* Error */
 .highlight pre  .k { color: #008000; font-weight: bold } /* Keyword */
 .highlight pre  .o { color: #666 } /* Operator */
 .highlight pre  .ch { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Hashbang */
 .highlight pre  .cm { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Multiline */
 .highlight pre  .cp { color: #9C6500 } /* Comment.Preproc */
 .highlight pre  .cpf { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.PreprocFile */
 .highlight pre  .c1 { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Single */
 .highlight pre  .cs { color: #&lt;span class="caps"&gt;3D7B7B&lt;/span&gt;; font-style: italic } /* Comment.Special */
 .highlight pre  .gd { color: #A00000 } /* Generic.Deleted */
 .highlight pre  .ge { font-style: italic } /* Generic.Emph */
 .highlight pre  .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
 .highlight pre  .gr { color: #E40000 } /* Generic.Error */
 .highlight pre  .gh { color: #000080; font-weight: bold } /* Generic.Heading */
 .highlight pre  .gi { color: #008400 } /* Generic.Inserted */
 .highlight pre  .go { color: #717171 } /* Generic.Output */
 .highlight pre  .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
 .highlight pre  .gs { font-weight: bold } /* Generic.Strong */
 .highlight pre  .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
 .highlight pre  .gt { color: #04D } /* Generic.Traceback */
 .highlight pre  .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
 .highlight pre  .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
 .highlight pre  .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
 .highlight pre  .kp { color: #008000 } /* Keyword.Pseudo */
 .highlight pre  .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
 .highlight pre  .kt { color: #B00040 } /* Keyword.Type */
 .highlight pre  .m { color: #666 } /* Literal.Number */
 .highlight pre  .s { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String */
 .highlight pre  .na { color: #687822 } /* Name.Attribute */
 .highlight pre  .nb { color: #008000 } /* Name.Builtin */
 .highlight pre  .nc { color: #00F; font-weight: bold } /* Name.Class */
 .highlight pre  .no { color: #800 } /* Name.Constant */
 .highlight pre  .nd { color: #&lt;span class="caps"&gt;A2F&lt;/span&gt; } /* Name.Decorator */
 .highlight pre  .ni { color: #717171; font-weight: bold } /* Name.Entity */
 .highlight pre  .ne { color: #&lt;span class="caps"&gt;CB3F38&lt;/span&gt;; font-weight: bold } /* Name.Exception */
 .highlight pre  .nf { color: #00F } /* Name.Function */
 .highlight pre  .nl { color: #767600 } /* Name.Label */
 .highlight pre  .nn { color: #00F; font-weight: bold } /* Name.Namespace */
 .highlight pre  .nt { color: #008000; font-weight: bold } /* Name.Tag */
 .highlight pre  .nv { color: #19177C } /* Name.Variable */
 .highlight pre  .ow { color: #&lt;span class="caps"&gt;A2F&lt;/span&gt;; font-weight: bold } /* Operator.Word */
 .highlight pre  .w { color: #&lt;span class="caps"&gt;BBB&lt;/span&gt; } /* Text.Whitespace */
 .highlight pre  .mb { color: #666 } /* Literal.Number.Bin */
 .highlight pre  .mf { color: #666 } /* Literal.Number.Float */
 .highlight pre  .mh { color: #666 } /* Literal.Number.Hex */
 .highlight pre  .mi { color: #666 } /* Literal.Number.Integer */
 .highlight pre  .mo { color: #666 } /* Literal.Number.Oct */
 .highlight pre  .sa { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Affix */
 .highlight pre  .sb { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Backtick */
 .highlight pre  .sc { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Char */
 .highlight pre  .dl { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Delimiter */
 .highlight pre  .sd { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt;; font-style: italic } /* Literal.String.Doc */
 .highlight pre  .s2 { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Double */
 .highlight pre  .se { color: #&lt;span class="caps"&gt;AA5D1F&lt;/span&gt;; font-weight: bold } /* Literal.String.Escape */
 .highlight pre  .sh { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Heredoc */
 .highlight pre  .si { color: #&lt;span class="caps"&gt;A45A77&lt;/span&gt;; font-weight: bold } /* Literal.String.Interpol */
 .highlight pre  .sx { color: #008000 } /* Literal.String.Other */
 .highlight pre  .sr { color: #&lt;span class="caps"&gt;A45A77&lt;/span&gt; } /* Literal.String.Regex */
 .highlight pre  .s1 { color: #&lt;span class="caps"&gt;BA2121&lt;/span&gt; } /* Literal.String.Single */
 .highlight pre  .ss { color: #19177C } /* Literal.String.Symbol */
 .highlight pre  .bp { color: #008000 } /* Name.Builtin.Pseudo */
 .highlight pre  .fm { color: #00F } /* Name.Function.Magic */
 .highlight pre  .vc { color: #19177C } /* Name.Variable.Class */
 .highlight pre  .vg { color: #19177C } /* Name.Variable.Global */
 .highlight pre  .vi { color: #19177C } /* Name.Variable.Instance */
 .highlight pre  .vm { color: #19177C } /* Name.Variable.Magic */
 .highlight pre  .il { color: #666 } /* Literal.Number.Integer.Long */&lt;/style&gt;&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Learning-By-Doing"&gt;Learning By Doing&lt;a class="anchor-link" href="#Learning-By-Doing"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Last year over Spring Break, we visited St. Louis.
Our trip included a stop at the arch,
and we managed to take a successful
trip to the observation deck at the top.
Shortly thereafter, I happened across some information on the
&lt;a href="https://www.nps.gov/jeff/planyourvisit/mathematical-equation.htm"&gt;National Park Service&lt;/a&gt;
page regarding the geometry of the arch.
Being a civil engineer with an acute interest in geometry,
I couldn&amp;#8217;t resist tinkering around with these equations
as a means of diving into computational&amp;nbsp;geometry.&lt;/p&gt;
&lt;h3 id="Research"&gt;Research&lt;a class="anchor-link" href="#Research"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A good first step before diving into any scientific challenge
is to perform research.
In doing so, I found a number of resources in addition to the official &lt;span class="caps"&gt;NPS&lt;/span&gt;&amp;nbsp;website:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://link.springer.com/content/pdf/10.1007%2Fs00004-006-0017-7.pdf"&gt;Gateway to Mathematics Equations of the St. Louis&amp;nbsp;Arch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.msri.org/people/staff/osserman/papers/NNJ_v12n2_Osserman_pp167-189.pdf"&gt;How the Gateway Arch Got its&amp;nbsp;Shape&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.jug.net/wt/archcgs.htm"&gt;Owner&amp;#8217;s Manual For the Gateway&amp;nbsp;Arch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This initial research led to two important initial&amp;nbsp;findings:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The geometry of the arch can indeed be specified&amp;nbsp;mathematically.&lt;/li&gt;
&lt;li&gt;The primary form of the arch is derived from the shape of a flattened catenary&amp;nbsp;curve.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="Catenary-curves"&gt;Catenary curves&lt;a class="anchor-link" href="#Catenary-curves"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Catenary#Equation"&gt;Wikipedia&lt;/a&gt; is a good starting point
for exploring the computational geometry needed to accurately model the arch.
The basic equation for a catenary involves a hyperbolic cosine (cosh)
and a single constant that defines the aspect ratio, or flattening factor,
of the resulting&amp;nbsp;curve.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&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;math&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="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;figure.figsize&amp;#39;&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="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;8.5&lt;/span&gt;&lt;span class="p"&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;mpmath&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;catenary&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;a&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;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;cosh&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;a&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;y&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;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&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;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&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;catenary&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="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;y2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;catenary&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="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="n"&gt;yhalf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;catenary&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="mf"&gt;0.5&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;y1&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;a = 1.0&amp;#39;&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;y2&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;a = 2.0&amp;#39;&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;yhalf&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;a = 0.5&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axes&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;gca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylim&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;6&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;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Fig. 1: Sample Catenary Curves&amp;#39;&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;legend&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;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;




&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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+uuvd0CUIiIiImdrVTOB48aNo1+/fvTo0YMZM2Y0uL9FixYxceJE3N3diY6OpkuXLmzYsMEGkYqIiIjYl0NmAp/b8BzJ+ck27bNrYFceGvDQedvMnDmTwMBASktL6d+/PxMmTCAoKOiMNtOmTWPFihVnPXfixIlnHfeWnp5+xvFz7dq1Iz09vcax//a3v/HEE08wbNgwnn32Wdzd3Wv7RxMRERGxuVa1HPzKK6+wYMECAI4cOUJqaupZSeD06dNtPu4zzzxDeHg4FRUV3H333Tz33HM89thjNh9HREREpLYckgReaMbOHlauXMmyZctYu3YtXl5eDB06lLKysrPa1WUmMDIykiNHjpz+/6NHjxIZGXnWcyMiIgBwd3fnjjvu4IUXXmjoH0dERESkQVrNTGBhYSEBAQF4eXmRnJzMunXramxXl5nAMWPGMGnSJB588EEyMjJITU1lwIABZ7XLzMwkIiIC0zRZuHAhPXv2rPefQ0RERMQWWk0SOGLECN588026detGXFzcGffy1VePHj248cYb6d69Oy4uLrz++uundwaPGjWKd955h7Zt2zJ58mSOHTuGaZokJCTw5ptvNnhsERERkYYwTNO0eaeJiYnmpk2bznhsz549dOvWzeZjtRR6fURERMTWDMPYbJpmYk3XWlWJGBERERGxUhIoIiIi0gopCRQRERFphRo1CbTH/YctgV4XERERaWyNlgR6eHiQl5enhOdXTNMkLy8PDw8PR4ciIiIirUijlYhp164dR48e5dixY401ZLPh4eFBu3btHB2GiIiItCK1SgINwxgBvAw4A++YpvlsXQdydXUlOjq6rk8TERERETu44HKwYRjOwOvASKA7cLNhGN3tHZiIiIiI2E9t7gkcAOwzTfOAaZoVwHxgrH3DEhERERF7qk0SGAkc+cX/H/3pMRERERFppmy2McQwjLuBu3/632LDMPbaqu8LCAZyG2ms5kavzbnptamZXpdz02tzbnptaqbX5dz02pybrV+bjue6UJskMB1o/4v/b/fTY2cwTXMGMKPOoTWQYRibznUmXmun1+b/27ub0DqqMIzj/wepVPzAhYpKC+miCFJrdCGVbqR+ELS0KAgFFUSXFioUxBhQRAShoC5cuNDiwiAIWpRaaSMGuvGjWJOamiqutKJkIaIiCLGPi5lK0HubtHrnTDLPDwKZm8B5eLnJvJwz95z+UpveUpf+Upv+UpveUpf+Upv+mqzNUpaDjwDrJa2TdD6wA3h3sLEiIiIiYpAWnQm0PS9pJ3CQaouYvbaPDzxZRERERAzMkp4JtH0AODDgLOeq8SXoZSS16S+16S116S+16S+16S116S+16a+x2ijHuEVERER0T2NnB0dEREREe6yoJlDSbkmWdFnpLG0h6RlJxyRNSTok6erSmdpA0h5JJ+ra7JN0aelMbSHpXknHJZ2SlE/vUR2dKekrSd9Ierx0nraQtFfSnKSZ0lnaRNJaSZOSvqz/lnaVztQWklZL+lTSdF2bp0tnahNJ50n6XNL+JsZbMU2gpLXAHcC3pbO0zB7bG20PA/uBJ0sHaokJYIPtjcDXwGjhPG0yA9wDHC4dpA1ydOYZvQaMlA7RQvPAbtvXApuAR/Ke+dsfwBbb1wPDwIikTYUztckuYLapwVZMEwi8ADwG5CHHBWz/suDyQlIfAGwfsj1fX35Mtf9lALZnbTe12ftykKMz+7B9GPipdI62sf2D7aP1979S3dRz0hbgym/15ar6K/clQNIa4C7glabGXBFNoKTtwPe2p0tnaSNJz0r6DriPzAT28hDwfukQ0Vo5OjPOmaQh4Abgk7JJ2qNe8pwC5oAJ26lN5UWqyaxTTQ34vx0bN2iSPgCu7PGjMeAJqqXgTjpTbWy/Y3sMGJM0CuwEnmo0YCGL1aX+nTGqpZvxJrOVtpTaRMR/I+ki4C3g0X+synSa7T+B4fpZ7H2SNtju9HOlkrYCc7Y/k3RLU+MumybQ9m29Xpd0HbAOmJYE1bLeUUk32f6xwYjF9KtND+NU+z12oglcrC6SHgS2Are6Y3slncV7JpZ4dGbEQpJWUTWA47bfLp2njWz/LGmS6rnSTjeBwGZgm6Q7gdXAJZJet33/IAdd9svBtr+wfYXtIdtDVEs1N3alAVyMpPULLrcDJ0plaRNJI1TT7tts/146T7Rajs6Ms6JqRuJVYNb286XztImky0/vxiDpAuB2cl/C9qjtNXUfswP4cNANIKyAJjAW9ZykGUnHqJbMs1VB5SXgYmCi3j7n5dKB2kLS3ZJOAjcD70k6WDpTSfUHiE4fnTkLvJmjMyuS3gA+Aq6RdFLSw6UztcRm4AFgS/3/Zaqe4Qm4Cpis70lHqJ4JbGQ7lPi3nBgSERER0UGZCYyIiIjooDSBERERER2UJjAiIiKig9IERkRERHRQmsCIiIiIDkoTGBEREdFBaQIjIiIiOihNYEREREQH/QX/TIcoRP8muAAAAABJRU5ErkJggg==
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Flattened-Catenary"&gt;Flattened Catenary&lt;a class="anchor-link" href="#Flattened-Catenary"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;As mentioned in the reference documents, the shape of the arch
is a modified, or flattened, catenary curve.
This means that there are two constants needed in the catenary equation 
to properly scale and proportion the initial curve that will form the basis
of the arch&amp;nbsp;geometry.&lt;/p&gt;
&lt;h3 id="Constants-from-NPS-web-site"&gt;Constants from &lt;span class="caps"&gt;NPS&lt;/span&gt; web site&lt;a class="anchor-link" href="#Constants-from-NPS-web-site"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To develop a mathematical model for the arch geometry, the limits of X and Y need to be developed.
Additionally, the arch is a 3-dimensional shape created by a series of equilateral triangles that are larger at the bottom and smaller at the top.
A flattened catenary equation provides the location of the centroid of each triangle.
Two additional values are required in order to set the &amp;#8220;width&amp;#8221; or &amp;#8220;thickness&amp;#8221; of the arch at a given&amp;nbsp;location.&lt;/p&gt;
&lt;p&gt;These four values (width at base, height at apex, maximum thickness, and minimum thickness) are listed on the &lt;span class="caps"&gt;NPS&lt;/span&gt; website as&amp;nbsp;follows:&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;625.0925&lt;/span&gt; &lt;span class="c1"&gt;# Maximium height of centroid&lt;/span&gt;
&lt;span class="n"&gt;Qb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1262.6651&lt;/span&gt; &lt;span class="c1"&gt;# Maximum cross-sectional area at arch base&lt;/span&gt;
&lt;span class="n"&gt;Qt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;125.1406&lt;/span&gt; &lt;span class="c1"&gt;# Minimum cross-sectional area at arch top&lt;/span&gt;
&lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;299.2239&lt;/span&gt; &lt;span class="c1"&gt;# Half of centroid at arch base&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="Equations-from-NPS-web-site"&gt;Equations from &lt;span class="caps"&gt;NPS&lt;/span&gt; web site&lt;a class="anchor-link" href="#Equations-from-NPS-web-site"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;As noted previously, the arch is a flattened catenary and therefore requires two constants.
These constants were influenced by the minimum and maximum cross-sectional areas as noted above.
The constants are listed on the &lt;span class="caps"&gt;NPS&lt;/span&gt; website as&amp;nbsp;follows:&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&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;fc&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Qb&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Qt&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="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;acosh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Qb&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;A = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;C = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;A = 68.7673
C = 3.0022
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Interestingly, there is a small rounding difference in the fourth decimal place
of the calculated value for A when comparing it to the published value of&amp;nbsp;68.7672.&lt;/p&gt;
&lt;p&gt;Next, we develop a function to calculate the value of X at any provided Y, where Y is the vertical axis.
However, there is an important adjustment required: 
A typical catenary curve &amp;#8220;opens up&amp;#8221; as Y increases upwards as shown in Fig.&amp;nbsp;1.&lt;/p&gt;
&lt;p&gt;This would be a very unstable arrangement for the arch.
Therefore, the equations provided in the construction blueprints 
inverted the direction of the Y axis so that the catenary
would have maximum width at ground level. 
In other words, the positive direction of Y is towards the&amp;nbsp;ground.&lt;/p&gt;
&lt;p&gt;In construction, we typically think in terms of elevation as a distance above ground level.
Therefore, we will define a &amp;#8220;helper function&amp;#8221; to convert Y values to elevation
before plugging that value into the function for&amp;nbsp;X.&lt;/p&gt;
&lt;p&gt;Note that because we are solving for X at a given Y value instead of the other way around as shown earlier,
the arch equation uses the inverse hyperbolic&amp;nbsp;cosine.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&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;El&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Y&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;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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;C&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="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;acosh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;El&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="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Let&amp;#8217;s test our function.  We know that the maximum height of the arch is given by fc.
At Y = fc, X should be zero.
Correspondingly, at Y = 0, X should be at a maximum, or roughly equal to&amp;nbsp;L.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[11]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Value of X at Y = fc is &lt;/span&gt;&lt;span class="si"&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;fc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Value of X at Y = 0 is &lt;/span&gt;&lt;span class="si"&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;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;L = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Value of X at Y = fc is 0.0000
Value of X at Y = 0 is 299.2239
L = 299.2239
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Let&amp;#8217;s plot our function and see how things are looking. 
We will need to vectorize the function to apply it over an array of elevation values.
We also need to plot a second, mirrored version so that we can get the whole&amp;nbsp;picture.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[12]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;elevations&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;arange&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;fc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;X_vectorized&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;vectorize&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;otypes&lt;/span&gt;&lt;span class="o"&gt;=&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;float&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;centroid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X_vectorized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elevations&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;centroid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elevations&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="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;centroid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elevations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axes&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;gca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_aspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;equal&amp;#39;&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;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Fig. 2: Centroid of Gateway Arch&amp;#39;&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;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;

    &lt;div class="prompt"&gt;&lt;/div&gt;




&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Interestingly, this plot mirrors the construction sequence where the two legs of the arch were constructed individually and then met at the top to form a single&amp;nbsp;structure.&lt;/p&gt;
&lt;h3 id="Conclusion"&gt;Conclusion&lt;a class="anchor-link" href="#Conclusion"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;We&amp;#8217;ve gotten a good start on developing our model via computational geometry. 
However, we certainly can&amp;#8217;t call this a 4D &lt;span class="caps"&gt;VDC&lt;/span&gt; model yet.
The next post will look at adding the triangular cross sections in order to
calculate the inner (intrados) and outer (extrados) edges of the&amp;nbsp;arch.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
 


&lt;script type="text/javascript"&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = '//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
    mathjaxscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: 'center'," +
        "    displayIndent: '0em'," +
        "    showMathMenu: true," +
        "    tex2jax: { " +
        "        inlineMath: [ ['$','$'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        " linebreaks: { automatic: true, width: '95% container' }, " +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important'} }" +
        "    } " +
        "}); ";
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;
</content><category term="how-to"/><category term="python"/></entry><entry><title>Code That Doesn’t Exist Doesn’t Have Bugs</title><link href="https://www.heavycivilbigdata.com/code-that-doesnt-exist-doesnt-have-bugs.html" rel="alternate"/><published>2019-10-16T00:00:00-04:00</published><updated>2019-10-16T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2019-10-16:/code-that-doesnt-exist-doesnt-have-bugs.html</id><summary type="html">&lt;p&gt;Nor does it have &lt;span class="caps"&gt;SQL&lt;/span&gt; injection&amp;nbsp;risks.&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;I was catching up on the &lt;a href="https://www.talkpython.fm"&gt;Talk Python to Me&lt;/a&gt;
podcast on the morning commute when I heard this tidbit of advice.
It struck me as one of those nuggets of wisdom
or rules of thumb that you collect over years of&amp;nbsp;experience.&lt;/p&gt;
&lt;p&gt;Digging in to this axiom a bit,
I realized that this aligns well with the choice of python
as a programming language.
Python is designed to be compact and succinct.
Typically, it takes fewer lines of code to accomplish something
in python than other languages such as C++ and Java.
I&amp;#8217;ve been working a lot lately with the python bindings for OpenCV
and this is definitely apparent when comparing C++ tutorials
to their equivalent versions in&amp;nbsp;python.&lt;/p&gt;
&lt;p&gt;Fewer lines of code equals a smaller attack surface
for bugs to creep in.
The same holds true for security&amp;nbsp;issues.&lt;/p&gt;
&lt;p&gt;Python isn&amp;#8217;t the best solution to every problem,
but it certainly is flexible enough to cover multiple use cases.
I specifically appreciate python bindings
to C and C++ codebases that let you have the best of both worlds:
low barrier of entry at the python level
along with high execution speed at the lower&amp;nbsp;levels.&lt;/p&gt;</content><category term="misc"/><category term="python"/></entry><entry><title>Does the US need a BIM mandate?</title><link href="https://www.heavycivilbigdata.com/bim-mandate-us.html" rel="alternate"/><published>2019-09-30T07:09:00-04:00</published><updated>2019-09-30T07:09:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2019-09-30:/bim-mandate-us.html</id><summary type="html">&lt;p&gt;&lt;span class="caps"&gt;TL&lt;/span&gt;;&lt;span class="caps"&gt;DR&lt;/span&gt; - not&amp;nbsp;necessarily&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#current-state"&gt;Current&amp;nbsp;State&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#parallels-to-the-built-environment"&gt;Parallels to the Built&amp;nbsp;Environment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#summary"&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;As &lt;span class="caps"&gt;BIM&lt;/span&gt; continues to mature and move from early adoption
to the mainstream,
some organizations around the world have developed
specific standards for the organization of &lt;span class="caps"&gt;BIM&lt;/span&gt; data
and mandated its usage for public projects.
For example, there are multiple British Standards currently
ratified and in use in the &lt;span class="caps"&gt;UK&lt;/span&gt;, e.g. &lt;a href="https://bim-level2.org/en/standards/"&gt;&lt;span class="caps"&gt;BS&lt;/span&gt; &lt;span class="caps"&gt;EN&lt;/span&gt; &lt;span class="caps"&gt;ISO&lt;/span&gt; 19650&lt;/a&gt;.
However, the United States has been slow to follow suit,
and currently there is no universal &lt;span class="caps"&gt;BIM&lt;/span&gt; standard or mandate.
While some might argue that a &lt;span class="caps"&gt;BIM&lt;/span&gt; mandate in the &lt;span class="caps"&gt;US&lt;/span&gt; is needed
to drive adoption, that&amp;#8217;s not necessarily the case.
The dramatic improvements in collaboration and overall quality that
result from a model-based design approach will be the primary drivers
of change in the industry.
Universal standards are valuable and their development will benefit &lt;span class="caps"&gt;AEC&lt;/span&gt; as a whole,
but a universal mandate is not needed to effect the inevitable transition
from &lt;span class="caps"&gt;CADD&lt;/span&gt; to &lt;span class="caps"&gt;BIM&lt;/span&gt;.&lt;/p&gt;
&lt;h3 id="current-state"&gt;Current&amp;nbsp;State&lt;/h3&gt;
&lt;p&gt;The &lt;span class="caps"&gt;US&lt;/span&gt; arm of the international buildingSMART Alliance has developed a
&lt;a href="https://www.nationalbimstandard.org"&gt;National &lt;span class="caps"&gt;BIM&lt;/span&gt; Standard-United States&lt;/a&gt;.
Similar to the &lt;span class="caps"&gt;US&lt;/span&gt; National &lt;span class="caps"&gt;CAD&lt;/span&gt; Standard (&lt;span class="caps"&gt;NCS&lt;/span&gt;),
these resources provide guidance for standardization and implementation
of &lt;span class="caps"&gt;BIM&lt;/span&gt; processes.
From my vantage point, it seems that the &lt;span class="caps"&gt;BIM&lt;/span&gt; standard is enjoying some level
of adoption within the vertical industry.
There are also signs that this standard is starting to see some uptake
for linear projects.
This is encouraging, as it could help avoid the fragmented &lt;span class="caps"&gt;CADD&lt;/span&gt; standards
adopted to varying degrees by individual state DOTs.
Although road and bridge construction is very similar from one state to another,
there is some friction in context switching between interstate &lt;span class="caps"&gt;CADD&lt;/span&gt; environments.
A pooled effort to develop standard workflows, business processes, and terminology
would be a great benefit and avoid duplicate effort at the individual state level.
Vendors such as steel suppliers could then count on the fact that fabrication
data supplied via &lt;span class="caps"&gt;IFC&lt;/span&gt; in one state would be consistent with others,
thereby reducing overall production costs and&amp;nbsp;RFIs.&lt;/p&gt;
&lt;p&gt;Probably the biggest obstacle to &lt;span class="caps"&gt;BIM&lt;/span&gt; implementation is that 
our industry in general - and especially contractors -
are wary of new tech and comfortable with the status quo.
There is risk in that which is unknown.
Risk ends up being priced as additional costs in bids
as contractors insulate themselves when undertaking more work.
This can be compounded by experiences of the ghost of tech rollouts past
that have not gone smoothly.
However, this issue seems to be resolving itself naturally as older generations
continue to age out of industry and are replaced with younger
workers that are more comfortable with technology in general,
having grown up with mobile devices and social&amp;nbsp;networking.&lt;/p&gt;
&lt;h3 id="parallels-to-the-built-environment"&gt;Parallels to the Built&amp;nbsp;Environment&lt;/h3&gt;
&lt;p&gt;We have national standards for physical items such as steel sections and
precast concrete beam configurations.
Just as these standards for physical components help drive uniformity
and efficiency, so too would standards for the data structure of
the corresponding digital twin be beneficial.
As these standards are implemented and battle-tested,
they will be better understood by practitioners and
better implemented by software vendors.
A precaster wouldn&amp;#8217;t want to buy a separate set of forms for each &lt;span class="caps"&gt;DOT&lt;/span&gt;
they were prequalified in - especially if the variations were minor and
seemingly aimed at individual preference as opposed to specific function.
Similarly, software developers would much rather avoid significant configuration
differences to accommodate multiple jurisdictions.
Uniformity reduces both the initial development effort as well as the cost
of ongoing maintenance and new feature development for a
digital product&amp;nbsp;offering.&lt;/p&gt;
&lt;h3 id="summary"&gt;Summary&lt;/h3&gt;
&lt;p&gt;A universal mandate for &lt;span class="caps"&gt;BIM&lt;/span&gt; seems attractive in theory,
but it&amp;#8217;s not a requirement for the disruption that is already underway in &lt;span class="caps"&gt;AEC&lt;/span&gt;.
Practitioners that have already embraced &lt;span class="caps"&gt;BIM&lt;/span&gt; and model-based design
would never dream of going back to 2D-only workflows.
The improvements by utilizing a shared model as the single source of truth
will continue to naturally drive adoption, as has been evidenced
in the vertical industry over the past 15+ years.
Universally applied standards for &lt;span class="caps"&gt;BIM&lt;/span&gt; data and workflows will be
a force multiplier during this transition,
but the transition will happen with or without a universal&amp;nbsp;mandate.&lt;/p&gt;</content><category term="opinion"/><category term="BIM"/></entry><entry><title>Email is Not Document Management</title><link href="https://www.heavycivilbigdata.com/email-is-not-document-management.html" rel="alternate"/><published>2019-08-01T00:00:00-04:00</published><updated>2019-08-01T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2019-08-01:/email-is-not-document-management.html</id><summary type="html">&lt;p&gt;Documents deserve a better home than&amp;nbsp;Outlook.&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-problem"&gt;The&amp;nbsp;problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-symptoms"&gt;The&amp;nbsp;symptoms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-cure"&gt;The&amp;nbsp;cure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#a-parting-wish"&gt;A parting&amp;nbsp;wish&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Email is for communication, not for document collaboration.
Sure, the path of least resistance for sharing docs is to send an email attachment.
However, when you find yourself focusing too intently on paperclips your email client,
that&amp;#8217;s probably a good sign that a different approach is needed.
When possible, a better route is to send a link to a shared version of a document.
Solutions such as Google Docs or Microsoft OneDrive go one better
by allowing multiple users to concurrently access and edit a shared&amp;nbsp;document.&lt;/p&gt;
&lt;h3 id="the-problem"&gt;The&amp;nbsp;problem&lt;/h3&gt;
&lt;p&gt;Modern knowledge work often involves collaboration across a remote,
geographically disbursed team.
Even with a co-located team, other external users such as clients and subconsultants
will typically be working in a separate system.
Within the traditional design firm, 
low bandwidth performance across the &lt;span class="caps"&gt;WAN&lt;/span&gt; usually precludes a
traditional network share pattern for a remote team.
Above a certain threshold, more heavyweight solutions such as ProjectWise
provide a great environment for collaboration, change management, archiving,
and all manner of other business processes and data workflows.
However, that threshold is fairly high and makes the most sense when the work
is centered around a &lt;span class="caps"&gt;CADD&lt;/span&gt;&amp;nbsp;platform.&lt;/p&gt;
&lt;p&gt;Email is electronic mail, which is the digital equivalent to
interpersonal letter writing in the past.
Therefore, it&amp;#8217;s difficult to keep the right people in the loop,
especially as a thread grows over time in length and audience.
Discussions are often &amp;#8216;forked&amp;#8217;,
causing side conversations and splintered resolutions.
Another pain point with email-centric collaboration is
the fact that forwarding an email typically
doesn&amp;#8217;t maintain any attachments from the original&amp;nbsp;sender.&lt;/p&gt;
&lt;h3 id="the-symptoms"&gt;The&amp;nbsp;symptoms&lt;/h3&gt;
&lt;p&gt;Document management via email is most likely to germinate in remote teams
where the primary means of communication is via email,
versus some other tool such as Slack or Teams.
Symptoms may also present in conversations along the lines of
&lt;q&gt;It was attached to the kickoff meeting invite&lt;/q&gt; and
&lt;q&gt;Did you get that attachment?&lt;/q&gt;&lt;/p&gt;
&lt;h3 id="the-cure"&gt;The&amp;nbsp;cure&lt;/h3&gt;
&lt;p&gt;Luckily, this is a common malady with a well-known treatment.
There are abundant options for modern document collaboration using tools 
such as OneDrive / SharePoint Online, DropBox, box, ProjectWise, &lt;span class="caps"&gt;BIM360&lt;/span&gt;,
Newforma, Aconex, Procore, and many others.
Most of these utilize a client-server pattern with local caching of files
that is comfortable for users that are accustomed to traditional desktop
and local network share workflows. 
Specifically for our team, SharePoint Online ticks most of the boxes for our needs.
It&amp;#8217;s a modern re-factoring of a system that people love to hate.
The current version is reflective of the Satya era at Microsoft
and is a much more pleasant experience than the SharePoint of the past. 
Another benefit of utilizing this tool internally is that it allows us to
&amp;#8220;eat our own dogfood&amp;#8221; by using the same environment that we often propose
in our solution&amp;nbsp;patterns.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Document collaboration in Outlook is a common malady,
but it is easily treatable with a few key&amp;nbsp;principles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;share links, not documents (or in software terms, pass by reference, not by&amp;nbsp;value)&lt;/li&gt;
&lt;li&gt;make use of change management tools such as check&amp;nbsp;in/out&lt;/li&gt;
&lt;li&gt;everyone works from a single data&amp;nbsp;store&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="a-parting-wish"&gt;A parting&amp;nbsp;wish&lt;/h4&gt;
&lt;p&gt;Having spent a fair amount of time utilizing git for source code management,
I get sparkly eyes thinking of a future where Word and Excel are fully integrated with git.
Indeed, the past few years have seen more and more online documentation
using git and Github for managing updates and corrections.
I also recently heard of an internal trend at Microsoft where
Project Managers are using git for day to day task management.
That sounds very appealing, but may also be a case of seeing every problem
as a nail best suited to the hammer I&amp;#8217;m currently&amp;nbsp;swinging.&lt;/p&gt;</content><category term="opinion"/></entry><entry><title>Elevator Pitch</title><link href="https://www.heavycivilbigdata.com/elevator-pitch.html" rel="alternate"/><published>2019-04-23T12:05:00-04:00</published><updated>2019-04-23T12:05:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2019-04-23:/elevator-pitch.html</id><summary type="html">&lt;p&gt;What would you say you do&amp;nbsp;here?&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#civil-integrated-solutions"&gt;Civil Integrated&amp;nbsp;Solutions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#why-whats-in-it-for-me"&gt;Why? What&amp;#8217;s in it for&amp;nbsp;me?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-about-another-analogy"&gt;How about another&amp;nbsp;analogy?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#for-the-low-low-price-of-zero-dollars"&gt;&amp;#8230; for the low, low price of &lt;span class="caps"&gt;ZERO&lt;/span&gt;&amp;nbsp;dollars!!!!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#no-silver-bullet"&gt;No silver&amp;nbsp;bullet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#summary"&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img alt="The Bobs from Office Space" src="images/office-space-what-do-you-do-here.webp"&gt;&lt;/p&gt;
&lt;p&gt;This has actually been a common question since transferring to the
Technology Solutions Center.
I&amp;#8217;m working in the same office, but not doing the same sorts of tasks as&amp;nbsp;before.&lt;/p&gt;
&lt;h3 id="civil-integrated-solutions"&gt;Civil Integrated&amp;nbsp;Solutions&lt;/h3&gt;
&lt;p&gt;This is the name of our new section, but it&amp;#8217;s not great at explaining our mission.
Our primary goal as a group is to &lt;strong&gt;help designers transition from 2D &lt;span class="caps"&gt;CADD&lt;/span&gt; to 5D Geospatial &lt;span class="caps"&gt;BIM&lt;/span&gt;.&lt;/strong&gt;
This is best achieved by thinking in terms of model-based design
that focuses effort on a federated virtual model of the proposed&amp;nbsp;project.&lt;/p&gt;
&lt;h3 id="why-whats-in-it-for-me"&gt;Why? What&amp;#8217;s in it for&amp;nbsp;me?&lt;/h3&gt;
&lt;p&gt;One of the perks of my job is that I get the opportunity to explore and utilize
lots of new, shiny tech.
Truthfully, there is a certain amount of 80&amp;#8217;s hair band glitz in things like
gaming engines that can photo-realistically render a model at 60 frames per second.
But technology has to serve a purpose, and the purpose is this:
&lt;strong&gt;We are going to build the project virtually first, so that we know
how to do it for real in the&amp;nbsp;field.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To answer this question specifically: when done correctly,
model-based design can drastically reduce rework and eliminate monotonous tasks. 
Most road designers have battle scars from fighting through cross-section sheets
where some revision needs to be made by hand over and over again.
The equivalent on the bridge side is the junior engineer that spends an afternoon
counting rebar, then punches those numbers into Excel and hopes that 
that the link to Microstation is still working so that the Bill of Materials will be updated properly.
The key linchpin in our proposal is utilizing a shared model as the single source of truth
for all design data.
The plan sheet deliverables are then just a byproduct of the modeling effort 
a snapshot of the state of the design at a particular point in time
during the design process.
The quality of the plan sheets is greatly increased because they are all derived
from the same source of data.
Where in the past you might have found yourself cross-checking each and every strip grade
elevation on a profile sheet against the annotation on the cross sections,
now you can spot check a few select locations and rest assured that these
differing viewpoints of the design will always be right
because the model forces that consistency.
Design verification happens on the fly,
with inter-discipline reviews occurring each time that party updates their portion
of the federated model.
Additionally, quantity takeoffs and cost estimates become much more accurate
when they are automatically and directly derived from the model,
versus being computed or taken off manually from the&amp;nbsp;plans.&lt;/p&gt;
&lt;h3 id="how-about-another-analogy"&gt;How about another&amp;nbsp;analogy?&lt;/h3&gt;
&lt;p&gt;This truly is a transformative experience and a major change to business as usual.
I&amp;#8217;ve heard users make the comparison between &lt;span class="caps"&gt;CADD&lt;/span&gt; and &lt;span class="caps"&gt;BIM&lt;/span&gt; as being similar
to moving from typewriters to Google Docs.
The metaphor holds up well, because each typewritten page needs to be assembled to create a book.
However, modern publishing is much different -
the authors and editors can collaborate sentence to sentence and page to page in realtime
while maintaining a version history of each draft and each edit that was made.
Milestone points can be set in the document and the working version can be rolled back
to a previous snapshot.
What&amp;#8217;s more, an author can explore multiple plot twists and work through &amp;#8220;what if&amp;#8221; exercises
that provide a more informed outlook on the best way to get to the protagonist&amp;#8217;s victory.
Then once the book is final, the data can be re-rendered instantly into multiple formats
for distribution - one format goes to the printer for generating physical books.
Another format will go to Amazon for distribution on Kindle.
Other options might include &lt;span class="caps"&gt;PDF&lt;/span&gt; and &lt;span class="caps"&gt;HTML&lt;/span&gt;.
End-users with electronic versions can instantly get errata corrections over the air - 
or even see books update to a newer version when&amp;nbsp;available.&lt;/p&gt;
&lt;h3 id="for-the-low-low-price-of-zero-dollars"&gt;&amp;#8230; for the low, low price of &lt;span class="caps"&gt;ZERO&lt;/span&gt;&amp;nbsp;dollars!!!!&lt;/h3&gt;
&lt;p&gt;Other benefits of model-based design are the additional things you get &amp;#8220;for free&amp;#8221;.
Visualization is a great example of this - by creating an intelligent federated model
of elements that include material information (e.g. concrete, steel, asphalt, wood),
the geometry of those elements can be realistically rendered for static pictures,
video animations, and even &lt;span class="caps"&gt;VR&lt;/span&gt; experiences.
Stakeholders can immerse themselves in the model and quickly understand nuances of the work.
A picture is worth a thousand words, and a view of the model is worth a thousand plan&amp;nbsp;sheets.&lt;/p&gt;
&lt;p&gt;Additionally, pay item information that is incorporated into the model can then flow easily
into construction and reduce effort in the field while simultaneously improving the quality
of material records and inspection documentation.
Plus, the best time to inventory an assist is when it is going in the ground or otherwise
being incorporated into the work.
Pictures, measurements, and survey data during construction inspection can then flow
through to the enterprise asset management&amp;nbsp;system.&lt;/p&gt;
&lt;h3 id="no-silver-bullet"&gt;No silver&amp;nbsp;bullet&lt;/h3&gt;
&lt;p&gt;What&amp;#8217;s the catch?
This type of paradigm shift is challenging.
It will take time.
There will be some pain and agony along the way.
But the benefits greatly outweigh the short-term growing pains.
Plus, you don&amp;#8217;t have to swing for the fences right out of the gate.
A handful of solid base hits will quickly score runs.
Implementation can happen in stages - one project might be better suited
to a focus on visualization, whereas another may be
a good candidate for asset capture during&amp;nbsp;construction.&lt;/p&gt;
&lt;h3 id="summary"&gt;Summary&lt;/h3&gt;
&lt;p&gt;Come on in, the water&amp;#8217;s fine!
I personally was fortunate to work in a model-based design environment
early in my career with a number of very talented individuals.
I have also spent multiple years in the more traditional
&amp;#8220;2D of this plus 2D of that plus some Excel gets us kinda there&amp;#8221;.
I know which environment I would rather operate in,
and if you&amp;#8217;re being honest with yourself, I tend to think you&amp;#8217;ll probably&amp;nbsp;agree.&lt;/p&gt;</content><category term="misc"/><category term="VDC"/><category term="BrIM"/></entry><entry><title>A VDC Manifesto</title><link href="https://www.heavycivilbigdata.com/vdc-manifesto.html" rel="alternate"/><published>2019-04-07T00:00:00-04:00</published><updated>2019-04-07T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2019-04-07:/vdc-manifesto.html</id><summary type="html">&lt;p&gt;Waterfall is to Agile as &lt;span class="caps"&gt;CADD&lt;/span&gt; is to &lt;span class="caps"&gt;BIM&lt;/span&gt;.&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#manifesto-for-virtual-design-and-construction-of-civil-works"&gt;Manifesto for Virtual Design and Construction of Civil&amp;nbsp;Works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#1-safety"&gt;1.&amp;nbsp;Safety&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-dynamic-views"&gt;2. Dynamic&amp;nbsp;Views&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-shared-databases"&gt;3. Shared&amp;nbsp;Databases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-metadata-use-tags-not-folders"&gt;4. Metadata - Use Tags, Not Folders&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#case-study-email-discovery-during-litigation"&gt;Case Study - Email Discovery During&amp;nbsp;Litigation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-open-data-formats"&gt;5. Open Data&amp;nbsp;Formats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#6-platform-independence"&gt;6. Platform&amp;nbsp;Independence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;In 2001, a number of software developers met to discuss
various methods of developing software.
Together, they created a
&lt;a href="https://agilemanifesto.org"&gt;Manifesto for Agile Software Development&lt;/a&gt;.
The release of this document added momentum to various lightweight software
development processes that had started to appear as incremental improvements
on a&amp;nbsp;traditional &lt;code&gt;waterfall&lt;/code&gt; development&amp;nbsp;process.&lt;/p&gt;
&lt;p&gt;In that same vein, I proposed the following manifesto for Virtual Design and
Construction of Civil Works as a list of guiding principles in applying
technology to dramatically improve the start of the art in
design and construction civil engineering&amp;nbsp;projects.&lt;/p&gt;
&lt;h3 id="manifesto-for-virtual-design-and-construction-of-civil-works"&gt;Manifesto for Virtual Design and Construction of Civil&amp;nbsp;Works&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Safety over all other competing&amp;nbsp;priorities.&lt;/li&gt;
&lt;li&gt;Dynamic views over static&amp;nbsp;output.&lt;/li&gt;
&lt;li&gt;Shared databases over discrete file&amp;nbsp;transfer.&lt;/li&gt;
&lt;li&gt;Metadata over folder&amp;nbsp;hierarchy&lt;/li&gt;
&lt;li&gt;Open data formats over proprietary&amp;nbsp;ones.&lt;/li&gt;
&lt;li&gt;Platform independence over specific&amp;nbsp;hardware.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Similar to the Agile Manifesto, I posit that values on the left
are preferred over those on the&amp;nbsp;right.&lt;/p&gt;
&lt;h3 id="1-safety"&gt;1.&amp;nbsp;Safety&lt;/h3&gt;
&lt;p&gt;Canon 1 of the Code of Ethics for the
&lt;a href="https://www.asce.org"&gt;American Society of Civil Engineers&lt;/a&gt;
reads as&amp;nbsp;follows:&lt;/p&gt;
&lt;p&gt;Engineers shall hold paramount the safety, health and welfare of the public&amp;#8230;
in the performance of their professional&amp;nbsp;duties.&lt;/p&gt;
&lt;p&gt;In the face of competing factors in weighing a decision,
the considerations of safety trump all other concerns.
&lt;span class="caps"&gt;VDC&lt;/span&gt; can help improve jobsite safety by providing a digital walk-through of a proposed
construction sequence or activity before it is actually to be undertaken in the field.
Skilled tradespeople that will actually be performing the work can view the simulation
in advance and offer suggestions for improvement that would otherwise
have not been identified until those activities are actually taking&amp;nbsp;place.&lt;/p&gt;
&lt;p&gt;Additionally, time-enabled modeling of construction activities such as picking and placing
a structural beam can identify conflicts with overhead utilities and or adjacent
public areas that would be left vulnerable if a failure of some sort were to&amp;nbsp;occur.&lt;/p&gt;
&lt;h3 id="2-dynamic-views"&gt;2. Dynamic&amp;nbsp;Views&lt;/h3&gt;
&lt;p&gt;Currently, one of the most-often heard phrases in the design office
or job trailer is something along the lines of &amp;#8220;Is this plan sheet the latest and greatest?&amp;#8221;
True, we have moved from physical paper and mylar to electronic sheets,
but the pain point is still present.
As soon as an electronic sheet is generated, it is limited as a view of the model
at that specific point in time.
With a shared data model that can propagate updates to all views (plan sheets)
in a matter of seconds, &lt;span class="caps"&gt;VDC&lt;/span&gt; eliminates this source of&amp;nbsp;friction.&lt;/p&gt;
&lt;p&gt;As in all things, it is possible to have too much of a good thing in this regard.
It is understandable and necessary for the certifying professionals to control
the change management process in regards to releasing revisions for fabrication.
However, changes can be managed in a multi-state fashion as opposed to the 
current state of&amp;nbsp;affairs.&lt;/p&gt;
&lt;p&gt;Today, revisions are often limited to a binary state - invisible or released.
With a robust change order management system, updates proposed in design
can be released to the entire project team&amp;nbsp;as &lt;code&gt;draft&lt;/code&gt;, &lt;code&gt;pending&lt;/code&gt; or the like.
The ease and speed of publishing revisions once they are approved
also adds transparency to the &amp;#8220;submit, review, and revise&amp;#8221; cycle.
A superintendent in the field could pull up the proposed changes
on their device of choice and overlay the new information on the currently released
version of that part of the work.
This workflow helps break down the silos of information and communication that often
form between the design team and the construction&amp;nbsp;staff.&lt;/p&gt;
&lt;h3 id="3-shared-databases"&gt;3. Shared&amp;nbsp;Databases&lt;/h3&gt;
&lt;p&gt;In a similar way, a shared data model that functions as the &amp;#8220;single source of truth&amp;#8221;
allows for greater collaboration and reduces cognitive load in managing versions
of data as a project progresses.
Before computer networking was common, users would share information by passing around a 
floppy disk containing new or revised data with some type of file naming pattern
that functions as version management by proxy.
How many times have you come across a folder like&amp;nbsp;this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Plan.dwg
Plan2.dwg
Plan-old.dwg
Plan-new.dwg
Plan-junk-john.smith.dwg
zzz-KEEP-Plan2-new-junk-old.dwg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;(Don&amp;#8217;t do this.  Just don&amp;#8217;t.)&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Modern data environments such as Bentley&amp;#8217;s ProjectWise theoretically can
support a single shared data model, but are typically used in a manner
much closer to a glorified &lt;span class="caps"&gt;FTP&lt;/span&gt; site.
Which, when you think about it, is just a glorified version
of passing around floppy disks.
An easy way to remember this concept is to recall a guiding principle I received
from a mentor years ago: &lt;strong&gt;Share Data, Not Drawings&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="4-metadata-use-tags-not-folders"&gt;4. Metadata - Use Tags, Not&amp;nbsp;Folders&lt;/h3&gt;
&lt;p&gt;This tenet builds on previous ones in that it advocates
a workflow recalibration.
Again, rather than digitizing a legacy paper-based workflow,
maximize differentiating features of technology that let the magic&amp;nbsp;happen.&lt;/p&gt;
&lt;p&gt;In the paper-based design office, documents were physical sheets of paper
(or vellum or mylar).
When it was time to store these physical media,
they were &amp;#8216;filed&amp;#8217; into &amp;#8216;folders&amp;#8217; in a large cabinet or drawer.
Although we are much less reliant on physical media in our design workflows,
we still carry around these legacy paradigms.
This is keenly apparent in the network file share.
We have multiple drives (cabinets) full of hundreds or thousands of folders
containing files of our design data and drawings.
In this setting, many pounds of blood, sweat, and tears have been shed
in order to arrive at the &lt;em&gt;&amp;#8220;correct&amp;#8221;&lt;/em&gt; folder structure to be used on each project.
This structure somehow has to meet a Goldilocks ideal -
not too big, not too small.
In practice, you end up with something much closer to Frankenstein with
hundreds of folders that are empty or containing no more than a handful
of documents&amp;nbsp;each.&lt;/p&gt;
&lt;p&gt;Browsing through these folders day after day builds up neural pathways
and mental connections that are not easy to re-wire.
Good luck if you recently came on board from another firm
that organized data in a similar, but slightly different&amp;nbsp;manner.&lt;/p&gt;
&lt;p&gt;The answer here is to use metadata - tags and other information -
to allow users to group and locate data based on whatever
types of associations are most useful to them as an individual.
Technology then allows you to create virtual folders that work
like &lt;em&gt;&amp;#8220;magic&amp;#8221;&lt;/em&gt;.
Not only does this eliminate the need for one-size-fits-all
across all users and all projects,
but it allows for functionality not otherwise possible with
traditional data&amp;nbsp;management.&lt;/p&gt;
&lt;h4 id="case-study-email-discovery-during-litigation"&gt;Case Study - Email Discovery During&amp;nbsp;Litigation&lt;/h4&gt;
&lt;p&gt;I have had the unfortunate experience of dealing with litigation
on more than one project.
In both cases, the discovery phase required extensive effort in poring
over past project communication -
the vast majority of which was stored in email.
In both cases, we were provided a list of items that were to be discussed
as part of one party&amp;#8217;s claim for&amp;nbsp;damages.&lt;/p&gt;
&lt;p&gt;As you might expect, there were abundant instances where a given email
discussion was not isolated to a single claim issue.
Heavy Civil construction projects are complex, and problems do not typically
manifest themselves in a&amp;nbsp;vacuum.&lt;/p&gt;
&lt;p&gt;In both these instances, we ended up having to make a number of decisions
on an individual basis as to which issue was most specifically related
to a given email chain.
That correspondence was then filed into an appropriate folder.
In the legacy workflow, a document can only be in one folder
at a time because that&amp;#8217;s how it works with paper and manila folders
hanging in your desk&amp;nbsp;drawer.&lt;/p&gt;
&lt;p&gt;However, we could have created categories for the damage claim issues,
then associate one or more of these categories to each email thread.
Then, Search Folders in Outlook would provide the same grouping
that we would see with traditional, hard-coded folders.
However, we would have gained a killer feature by being able to &amp;#8220;store&amp;#8221;
a thread in two or more (virtual) locations based upon the categories
we had&amp;nbsp;assigned.&lt;/p&gt;
&lt;h3 id="5-open-data-formats"&gt;5. Open Data&amp;nbsp;Formats&lt;/h3&gt;
&lt;p&gt;Open, well-documented data formats are more valuable than those that
hold the user hostage.
In this case, we are focused on &amp;#8220;free as in freedom&amp;#8221; -
freedom to use the tool that you like,
freedom to inspect the data being generated by or shared with a user,
and freedom to archive information knowing that you can retrieve it again
in ten years without worrying about whether you still have a working
copy of a specific package that is proprietary to a
company that might have gone out of business in the&amp;nbsp;meantime.&lt;/p&gt;
&lt;h3 id="6-platform-independence"&gt;6. Platform&amp;nbsp;Independence&lt;/h3&gt;
&lt;p&gt;Just as the Industrial Age was kick-started by the invention of the automobile,
the Information Age correlates to the arrival of the Internet.
Over time, computing becomes more and more platform-agnostic.
Indeed, the success of ChromeBooks confirms that the browser
is the new Operating System.
Likewise, &lt;span class="caps"&gt;VDC&lt;/span&gt; should not be restricted to a particular manufacturer,
platform, device, or delivery&amp;nbsp;mechanism.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Disruption is complex and messy.
By focusing on a half-dozen key tenets and guiding principles,
we can prioritize effort towards initiatives that provide value
and avoid spinning our wheels&amp;nbsp;unnecessarily.&lt;/p&gt;</content><category term="opinion"/><category term="VDC"/></entry><entry><title>Why You Don’t Need to Wait for IFC5 for Bridge Modeling</title><link href="https://www.heavycivilbigdata.com/why-you-dont-need-to-wait-for-ifc5-for-bridge-modeling.html" rel="alternate"/><published>2019-01-12T00:00:00-05:00</published><updated>2019-01-12T00:00:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2019-01-12:/why-you-dont-need-to-wait-for-ifc5-for-bridge-modeling.html</id><summary type="html">&lt;p&gt;&lt;span class="caps"&gt;IFC&lt;/span&gt; for Bridges is closer than you&amp;nbsp;think&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#general-goals-of-ifc5-bridge-and-road"&gt;General - Goals of &lt;span class="caps"&gt;IFC5&lt;/span&gt; Bridge and&amp;nbsp;Road&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#geometric-positioning"&gt;Geometric Positioning&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#horizontal-alignment"&gt;Horizontal&amp;nbsp;Alignment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#vertical-alignment"&gt;Vertical&amp;nbsp;Alignment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#typical-section"&gt;Typical&amp;nbsp;Section&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#superelevation"&gt;Superelevation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#putting-it-all-together"&gt;Putting it all&amp;nbsp;together&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#linear-geometry-in-ifc"&gt;Linear Geometry in &lt;span class="caps"&gt;IFC&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#but-why-would-i-give-up-all-our-intellectual-property"&gt;But why would I give up all our Intellectual&amp;nbsp;Property?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#design-to-fabrication-workflow"&gt;Design to Fabrication&amp;nbsp;workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#summary"&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;#8217;ve been following &lt;a href="https://technical.buildingsmart.org"&gt;Industry Foundation Classes (&lt;span class="caps"&gt;IFC&lt;/span&gt;)&lt;/a&gt;
for a number of years.
&lt;span class="caps"&gt;IFC&lt;/span&gt; is a neutral file format based that is free as in speech and as in beer.
In particular, I have been evaluating &lt;span class="caps"&gt;IFC&lt;/span&gt; as a base schema for modeling civil works
such as roads and bridges.
The general consensus at present from users and software vendors
is that &lt;span class="caps"&gt;IFC&lt;/span&gt; for Bridge Information Modeling (BrIM) won&amp;#8217;t really be possible
until the Bridge-specific data types and extensions planned for &lt;span class="caps"&gt;IFC&lt;/span&gt; version 5
have been finalized in the spec and implemented by software vendors.
The truth of the matter is that &lt;span class="caps"&gt;IFC&lt;/span&gt; is ready for BrIM&amp;nbsp;now.&lt;/p&gt;
&lt;h3 id="general-goals-of-ifc5-bridge-and-road"&gt;General - Goals of &lt;span class="caps"&gt;IFC5&lt;/span&gt; Bridge and&amp;nbsp;Road&lt;/h3&gt;
&lt;p&gt;Presently there is a group hard at work on the next major version of &lt;span class="caps"&gt;IFC&lt;/span&gt;
which will be focused primarily on linear civil works such as highways, tunnels, and bridges.
This work is intended to address perceived shortfalls in the general suitability of
&lt;span class="caps"&gt;IFC&lt;/span&gt; as a data interchange format for these types of&amp;nbsp;projects.&lt;/p&gt;
&lt;p&gt;While I am certainly in favor of this effort, I take exception at the notion that &lt;span class="caps"&gt;IFC&lt;/span&gt;
can&amp;#8217;t really be used for heavy civil work - particularly BrIM - in the meantime.
One software vendor in particular seems to be using the draft status of &lt;span class="caps"&gt;IFC5&lt;/span&gt; as an excuse
for dragging their feet on incorporating &lt;span class="caps"&gt;IFC&lt;/span&gt; compatibility into their flagship BrIM&amp;nbsp;program.&lt;/p&gt;
&lt;p&gt;In fairness, if their users aren&amp;#8217;t requesting this functionality then I can understand
if they aren&amp;#8217;t making it a priority for development.
But if that&amp;#8217;s the case, own up to it.
Don&amp;#8217;t hide behind the timeline of a spec that is developed by a non-profit
primarily under volunteer effort.
Be straightforward with the user base - they will understand that software development
is typically prioritized according to their needs and specific requests for&amp;nbsp;functionality.&lt;/p&gt;
&lt;h3 id="geometric-positioning"&gt;Geometric&amp;nbsp;Positioning&lt;/h3&gt;
&lt;p&gt;In general, integrated 3D modeling as a whole has been much slower to catch on in heavy civil
when compared to sectors more focused on vertical construction such as
buildings, schools, and general commercial development.
The primary explanation typically revolves around a fundamental difference in geometry positioning.
In a building, columns, walls, and the like are typically referenced from a grid
with letters increasing along one of the &lt;span class="caps"&gt;XY&lt;/span&gt; axes and numbers increasing along the&amp;nbsp;other.&lt;/p&gt;
&lt;h4 id="horizontal-alignment"&gt;Horizontal&amp;nbsp;Alignment&lt;/h4&gt;
&lt;p&gt;For linear work such as roads and bridges, positioning is primarily based upon
a linear distance along one or more alignment baselines.
Each baseline is typically comprised of a series of lines, arcs, and spirals.
Elements such as the centerline of a pier are located by distance along (station),
distance left or right from (offset), and angle relative to (skew) a
horizontal alignment&amp;nbsp;baseline.&lt;/p&gt;
&lt;h4 id="vertical-alignment"&gt;Vertical&amp;nbsp;Alignment&lt;/h4&gt;
&lt;p&gt;Elevations along the baseline are described by vertical tangent grades
and parabolic transition curves between the tangent grades.
The resulting 3D alignment baseline does not neatly obey any basic mathematical primitives
and is often approximated with chorded linestrings.
BSpline curves are often sometimes used for this purpose, although that is typically&amp;nbsp;rare.&lt;/p&gt;
&lt;h4 id="typical-section"&gt;Typical&amp;nbsp;Section&lt;/h4&gt;
&lt;p&gt;Horizontal and Vertical alignment combine to describe the centerline or baseline of a roadway.
However, a roadway needs to have one or more lanes for it to actually be useful
as a means of transportation.
The arrangement and geometry of lanes on a roadway is referred to as the typical section.
Oftentimes, the typical section across a given stretch of road or bridge is constant.
However, if we are at a roadway intersection or interchange and need to accommodate
turn movements or ramp entrances and exits, the typical section is going to&amp;nbsp;vary.&lt;/p&gt;
&lt;p&gt;In other words, one end of the bridge may have two through lanes and an auxiliary lane.
The auxiliary lane could very well be a different width or even dropped completely
by the time we get to the other end of the bridge.
This may be described directly by a list of dimensions at various distances along a single alignment&amp;nbsp;baseline.&lt;/p&gt;
&lt;p&gt;Or, it could be described indirectly by the addition of a second alignment baseline
that does not parallel the other.
All of these factors combine to complicate the process of describing and locating the geometry
of bridge model&amp;nbsp;elements.&lt;/p&gt;
&lt;h4 id="superelevation"&gt;Superelevation&lt;/h4&gt;
&lt;p&gt;Not only can the lane widths vary, but these variations often involve changes in superelevation.
Superelevation is the roadway engineer&amp;#8217;s term for the banking
that is applied to the pavement in horizontal curves.
This concept is seen most profoundly on a race track,
where extreme banking is necessary to keep the cars on the track at high rates of speed.
In the same way, the outside edge of a highway curve is superelevated (raised above)
the inside edge.
This is typically described in terms of percentage cross slope, or rise over run,
across the width of a travel&amp;nbsp;lane.&lt;/p&gt;
&lt;h4 id="putting-it-all-together"&gt;Putting it all&amp;nbsp;together&lt;/h4&gt;
&lt;p&gt;So, if we are going to properly model a bridge deck, which is the portion that you actually travel upon,
we need to be able to locate elements correctly using one or more horizontal and vertical alignments
while also accommodating typical section and superelevation.
This is indeed very complex, and most current &lt;span class="caps"&gt;BIM&lt;/span&gt; offerings such as Revit do not include
tools out of the box that excel at generating and managing this geometry in a parametric&amp;nbsp;manner.&lt;/p&gt;
&lt;h3 id="linear-geometry-in-ifc"&gt;Linear Geometry in &lt;span class="caps"&gt;IFC&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Horizontal and vertical geometry were added to the &lt;span class="caps"&gt;IFC&lt;/span&gt; standard with version 4.
Geometry plus sectioned spine covers the rest,
as outlined in Volume &lt;span class="caps"&gt;III&lt;/span&gt; of &lt;a href="https://www.fhwa.dot.gov/bridge/protocols/"&gt;BrIM protocols proposed by the &lt;span class="caps"&gt;FHWA&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="but-why-would-i-give-up-all-our-intellectual-property"&gt;But why would I give up all our Intellectual&amp;nbsp;Property?&lt;/h3&gt;
&lt;p&gt;First off, the question of &lt;span class="caps"&gt;IP&lt;/span&gt; is going to vary from client to client and from contract to contract.
My hunch is that there isn&amp;#8217;t quite as much patentable, unique &lt;span class="caps"&gt;IP&lt;/span&gt; on a typical design project as some might suspect.
But ignoring that issue, let&amp;#8217;s focus on a specific part of the infrastructure circle of life -
Design to&amp;nbsp;Fabrication.&lt;/p&gt;
&lt;h3 id="design-to-fabrication-workflow"&gt;Design to Fabrication&amp;nbsp;workflow&lt;/h3&gt;
&lt;p&gt;This step involves the handover of contract documents that include the technical drawings (plans)
and specific requirements (specifications) for the materials and methods to be used in the work.
The information is transacted from the designer to the construction contractor, who will typically then
involve numerous subcontractors and other third parties to complete the&amp;nbsp;work.&lt;/p&gt;
&lt;p&gt;Often times, the contract documents go to a fabricator for specific parts of the work.
For example, the structural beams will be sent to a supplier who will develop specific fabrication details
(shop drawings), then fabricate and provide the beams that are needed for the&amp;nbsp;bridge.&lt;/p&gt;
&lt;p&gt;This process is labor-intensive, time-consuming, and prone to error as another party recreates and re-establishes
data from the design information.
This specific exchange of information is a great place to provide data from the BrIM
in an open format that can easily be&amp;nbsp;exchanged.&lt;/p&gt;
&lt;p&gt;At this point, the design is complete.
Any complexity in terms of parametric geometry or other supposed intellectual property
is of lesser value when compared to the process quality improvements when working from
a shared&amp;nbsp;BrIM.&lt;/p&gt;
&lt;p&gt;You can think of the BrIM as more of a &lt;span class="caps"&gt;PDF&lt;/span&gt; than a &lt;span class="caps"&gt;CAD&lt;/span&gt; file.
Indeed, this specific exchange and Model View Definition (&lt;span class="caps"&gt;MVD&lt;/span&gt;) is addressed in the &lt;span class="caps"&gt;FHWA&lt;/span&gt; study
previously discussed.
In summary, that study found that &lt;span class="caps"&gt;IFC&lt;/span&gt; 4 is suitable for the Design to Fabrication workflow
for the two sampled&amp;nbsp;bridges.&lt;/p&gt;
&lt;h3 id="summary"&gt;Summary&lt;/h3&gt;
&lt;p&gt;In closing, there&amp;#8217;s no need to wait for &lt;span class="caps"&gt;IFC5&lt;/span&gt; before incorporating &lt;span class="caps"&gt;IFC&lt;/span&gt; into BrIM workflows.
New standards take time to be incorporated into software and further refined by
lessons learned on actual live project data.
&lt;span class="caps"&gt;IFC&lt;/span&gt; is well established and has been in use for nearly two decades.
It is robust, extensive, flexible, and best of all - free and open.
Why lock in to a proprietary format when a superior open source alternative is&amp;nbsp;available?&lt;/p&gt;</content><category term="opinion"/><category term="BrIM"/></entry><entry><title>Web Development and Imposter Syndrome</title><link href="https://www.heavycivilbigdata.com/web-development-and-imposter-syndrome.html" rel="alternate"/><published>2018-08-31T00:00:00-04:00</published><updated>1970-01-01T00:00:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2018-08-31:/web-development-and-imposter-syndrome.html</id><summary type="html">&lt;p&gt;Going live with my first professional web&amp;nbsp;site&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-deliverable"&gt;The&amp;nbsp;Deliverable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-solution"&gt;The&amp;nbsp;Solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-analogy"&gt;The&amp;nbsp;Analogy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;I reached a milestone in my career this month
when our team delivered a single-page app to one of our clients.
This is exciting and nerve-wracking at the same time,
but I feel better when thinking back to a similar time in my&amp;nbsp;career.&lt;/p&gt;
&lt;h3 id="the-deliverable"&gt;The&amp;nbsp;Deliverable&lt;/h3&gt;
&lt;p&gt;My role on particular project primarily involved work in Microstation,
an environment that I am very comfortable with.
We were performing a virtual analysis of clashing proposed geometry
against the existing state as captured in a LiDAR point cloud.
As we moved from analysis to documentation, we took an opportunity
to develop a more modern approach for delivery than what we had done in the&amp;nbsp;past.&lt;/p&gt;
&lt;p&gt;Our delivery included approximately 300 cross section sheets with two frames
on each sheet.
The left frame included the proposed geometry and highlighted the clashes
that we had found with the existing point cloud.
The right frame included the same view but overlaid the point cloud
onto an image at the clash location.
Typically, we would deliver this information as a single &lt;span class="caps"&gt;PDF&lt;/span&gt;,
which would run to the high 10s of &lt;span class="caps"&gt;MB&lt;/span&gt;.
Additionally, this single document is not well-suited to quickly locating
a particular point of&amp;nbsp;interest.&lt;/p&gt;
&lt;h3 id="the-solution"&gt;The&amp;nbsp;Solution&lt;/h3&gt;
&lt;p&gt;The first step was to keep each cross section as a single &lt;span class="caps"&gt;PDF&lt;/span&gt;,
named by the corresponding alignment and station.
Rather than delivering via file share such as &lt;span class="caps"&gt;FTP&lt;/span&gt; or &lt;span class="caps"&gt;USB&lt;/span&gt; media,
we decided to build a geospatial &lt;span class="caps"&gt;SPA&lt;/span&gt; to share this information with our client.
Each cross section was located along the alignment by lat/long and
color coded based upon the severity of the clash at that location.
Additionally, we built some &lt;span class="caps"&gt;UI&lt;/span&gt; controls to allow for
filtering by the four&amp;nbsp;alignments.&lt;/p&gt;
&lt;p&gt;Our Microstation data was set with control to the local State Plane coordinate
system, which allowed for easy translation to lat/long.
I built the app prototype in a Jupyter Notebook, using the excellent 
&lt;a href="https://python-visualization.github.io/folium"&gt;folium&lt;/a&gt; library,
which is a python wrapper around &lt;a href="https://leaflet.io"&gt;Leaflet.js&lt;/a&gt;.
With a lot of deployment help from a senior developer,
we were soon up and running with an interactive delivery
secured by standard user authentication&amp;nbsp;protocols.&lt;/p&gt;
&lt;h3 id="the-analogy"&gt;The&amp;nbsp;Analogy&lt;/h3&gt;
&lt;p&gt;In March of 2002, I had been out in industry for a few short months.
I had learned AutoCAD in college and had taken a position as a bridge engineer
with a local firm.
I was tasked with developing the deck rebar layout for a bridge rehab project
we were working on.
It was easiest for me to draw the spacing and locations of the bars directly
in AutoCAD as I worked through that process.
Once the design had been checked, it was time to stick a titleblock on it
and add it to the &amp;#8220;official&amp;#8221; plan set.
I remember being very nervous the first time that Ctrl-S pointed to the project
location on the network share, versus my private network working directory.
It was official - something I had designed was now going to be used to construct
an actual piece of infrastructure.
Things got real when those bits and bytes were lined up to become concrete
and&amp;nbsp;steel.&lt;/p&gt;
&lt;p&gt;Sixteen years later, I have been through that same process thousands of times
in the world of plan production for construction projects.
I&amp;#8217;m hopeful that in the years to come, I will develop a similar comfort level
when pushing web pages and mobile apps out to&amp;nbsp;production.&lt;/p&gt;</content><category term="story"/></entry><entry><title>Goodbye Excel, Hello Pandas</title><link href="https://www.heavycivilbigdata.com/goodbye-excel-hello-pandas.html" rel="alternate"/><published>2018-08-18T00:00:00-04:00</published><updated>2018-08-18T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2018-08-18:/goodbye-excel-hello-pandas.html</id><summary type="html">&lt;p&gt;Excel has warts.  There&amp;#8217;s a better&amp;nbsp;way.&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#basics-of-software-architecture"&gt;Basics of software&amp;nbsp;architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#pandas-to-the-rescue"&gt;Pandas to the rescue&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#import-export-csv"&gt;Import / Export &lt;span class="caps"&gt;CSV&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#summary"&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;#8217;ve heard a lot of positive buzz around the &lt;a href="https://pandas.pydata.org"&gt;Pandas&lt;/a&gt;
library for basic data processing with &lt;a href="https://www.python.org"&gt;Python&lt;/a&gt;.
After a few weeks of use, I can confidently say that it is a dramatically better tool than Excel
for data driven tasks and&amp;nbsp;workflows.&lt;/p&gt;
&lt;h3 id="basics-of-software-architecture"&gt;Basics of software&amp;nbsp;architecture&lt;/h3&gt;
&lt;p&gt;Typically when building a software solution, it is important to have separation of concerns.
This makes the solution more modular and flexible to adapt to changing inputs and requirements.
Typically, this separation results in divisions between the Data Layer, Business Logic, and User Interface.
In Excel, these layers are all mushed together and it is difficult to isolate particular functionality -
particularly the processing and business rules that are heaviest in terms of formulas, functions and&amp;nbsp;algorithms.&lt;/p&gt;
&lt;p&gt;One major source of errors when working in Excel is in the application of formulas for calculated columns.
A typical worksheet usually ends up in a table-like structure, with columns of data alternating with calculated fields
based upon that data.
However, the worksheet interface makes it very difficult to tell which values are data and which ones are calculated.
Even worse, formulas that are almost always applied uniformly to each row of the table
need to be updated and managed manually by the user.
More often than not, Excel workbooks that I&amp;#8217;ve found in the wild had multiple issues where a formula was updated
for a subset of the table but not copied uniformly throughout the entire table.
Even worse, it&amp;#8217;s very common for a user to unknowingly overwrite a calculated field with discrete data.
Again, unless the end user checks the formula for each cell, there&amp;#8217;s no way to catch this sort of critical error
hiding in the&amp;nbsp;weeds.&lt;/p&gt;
&lt;p&gt;This issue can be mitigated in part by writing custom user functions.
This helps in that the formula is now in a single spot and only needs to be changed in a single location
in order to update all calculated instances to the correct algorithm.
However, the other issue still remains in that this calculation can easily be overwritten as data,
with no help from the user interface.
Even worse, writing a custom function means that logic is now moving from a spreadsheet formula into a &lt;span class="caps"&gt;VBA&lt;/span&gt; macro.
As soon as you make this leap, you are giving up on the primary benefit of Excel -
namely its ubiquitous install base and user familiarity.
In other words, the vast majority of users are comfortable and able to audit and update formulas in cell calculations.
However, that percentage of users likely drops to single digits when we are talk about a similar comfort level
with reviewing and updating &lt;span class="caps"&gt;VBA&lt;/span&gt; code in&amp;nbsp;macros.&lt;/p&gt;
&lt;p&gt;Additionally, &lt;span class="caps"&gt;VBA&lt;/span&gt; macro code stays with the workbook that it was written in.
It is very challenging to manage &lt;span class="caps"&gt;VBA&lt;/span&gt; code in a central location and deploy it across multiple installations
of the &amp;#8220;software&amp;#8221;.
This has been a constant Achilles heel in my experience -
A macro or series of macros is developed in a &amp;#8220;template&amp;#8221;, then tested and rolled out for widespread use.
Invariably, a bug or request for additional functionality is raised.
This code change then needs to be rolled out uniformly across all of the workbooks that are currently in production.
But this is much easier said than done, because those *.xlsm workbooks are now spread across multiple
network share folders, email attachments, &lt;span class="caps"&gt;FTP&lt;/span&gt; sites,&amp;nbsp;&amp;#8230;&lt;/p&gt;
&lt;h3 id="pandas-to-the-rescue"&gt;Pandas to the&amp;nbsp;rescue&lt;/h3&gt;
&lt;p&gt;The name &amp;#8220;Pandas&amp;#8221; is an abbreviation of sorts for Panel Data.
The concept of panel data will be very familiar to Excel users -
it is essentially a table of rows and columns.
By default, the rows are numbered (starting at 0) and the columns are labeled with headings or field names.
Let&amp;#8217;s take a look at common tasks in Excel and see how these are easier and more robust when using&amp;nbsp;Pandas.&lt;/p&gt;
&lt;h4 id="import-export-csv"&gt;Import / Export &lt;span class="caps"&gt;CSV&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;Comma separated values (&lt;span class="caps"&gt;CSV&lt;/span&gt;) are very common for exchanging data between systems or applications.
A very common use case in my industry is topographical survey data.
When a project is being planned, a field crew will visit the site and use precision measurement tools
to record the existing condition of the site.
This data is then typically delivered as a plain text file with comma-separated values.
Typically the data will come as hundreds or thousands of data points with field headings
such as point number, northing, easting, elevation, point code, and description.
This corresponds to attributed 3D geometry that can then be used to develop an existing
map of the topography, as well as build a Digital Terrain Model (&lt;span class="caps"&gt;DTM&lt;/span&gt;) that can be used for
analysis and&amp;nbsp;design.&lt;/p&gt;
&lt;p&gt;When processing &lt;span class="caps"&gt;CSV&lt;/span&gt; in Excel, my observation is that users will typically copy and paste
from the text file directly into Excel - because this is easiest.
But this represents the first deviation from the desired architecture with separation of concerns.
The data is coming from an external source, and Murphy&amp;#8217;s Law dictates that it will change and/or
be appended in the future.
Managing updates, particularly when the size (number of rows) changes, should be the responsibility
of the software, not the user.
I&amp;#8217;ve never had much luck setting this up in Excel.
My understanding is that this process would be done via links that auto-update, and formulas would (maybe?)
 auto-update and copy down for new rows as needed.
Again, this might be user error on my part, but I tend to be fairly tech-savvy
and I&amp;#8217;ve never had much luck getting this set up correctly.
With Pandas, it&amp;#8217;s super-simple and is oriented towards maximizing the possibility of falling into success.
In other words, the easiest way is the &amp;#8220;right&amp;#8221;&amp;nbsp;way:&lt;/p&gt;
&lt;p&gt;Point to a file, configure a header row, change headers if necessary, drop columns on input, drop rows if
values are&amp;nbsp;missing.&lt;/p&gt;
&lt;h3 id="summary"&gt;Summary&lt;/h3&gt;
&lt;p&gt;What a breath of fresh air!
Many design engineers spend the majority of their time poring over spreadsheets,
chasing stale links,
or bemoaning formulas that didn&amp;#8217;t get copied correctly across all rows in a given column.
I&amp;#8217;ve certainly had my share of those moments and that shared pain.
I know lots of folks that have a warm place in their heart for Excel,
and I can understand that.
For me personally, there&amp;#8217;s no looking&amp;nbsp;back.&lt;/p&gt;</content><category term="story"/></entry><entry><title>Why VDC?</title><link href="https://www.heavycivilbigdata.com/why-vdc.html" rel="alternate"/><published>2018-02-20T22:00:00-05:00</published><updated>2018-02-20T22:00:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2018-02-20:/why-vdc.html</id><summary type="html">&lt;p&gt;Making the case for investing in digital&amp;nbsp;workflows&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#terminology"&gt;Terminology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#benefits-during-design"&gt;Benefits During Design&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#visualization-external-audience"&gt;Visualization - external&amp;nbsp;audience&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#visualization-internal-audience"&gt;Visualization - internal&amp;nbsp;audience&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#constructability"&gt;Constructability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#estimating"&gt;Estimating&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#benefits-during-construction"&gt;Benefits During&amp;nbsp;Construction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#operations-and-maintenance"&gt;Operations and Maintenance&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#asset-management"&gt;Asset&amp;nbsp;Management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#drawbacks-of-vdc"&gt;Drawbacks of &lt;span class="caps"&gt;VDC&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;span class="caps"&gt;AEC&lt;/span&gt; industry is slowly becoming more and more digitized
as technology is incorporated into day-to-day operations.
A primary example of this technology uptake is in the adoption of
&lt;a href="https://en.wikipedia.org/wiki/Building_information_modeling"&gt;Building Information Modeling (&lt;span class="caps"&gt;BIM&lt;/span&gt;)&lt;/a&gt;.
The purpose of this post is to solidify the business case
and value-add that results from moving to information modeling
as the linchpin of modern architecture, engineering, and&amp;nbsp;construction.&lt;/p&gt;
&lt;h3 id="terminology"&gt;Terminology&lt;/h3&gt;
&lt;p&gt;Before diving in too deep, let&amp;#8217;s take a moment to discuss terminology.
When I think of &lt;span class="caps"&gt;BIM&lt;/span&gt;, what first comes to mind is vertical construction -
schools, hospitals, commercial buildings, and the like.
This segment of the industry has led the charge in adoption of &lt;span class="caps"&gt;BIM&lt;/span&gt;,
and at present, practitioners founded on 2D drafting as the primary means
of document production are squarely in the minority.
However, on the heavy civil / infrastructure side,
&lt;span class="caps"&gt;BIM&lt;/span&gt; adoption has been very slow.
There is also much less consensus on terminology.
There aren&amp;#8217;t many physical buildings on a typical highway or bridge
construction site, so &lt;span class="caps"&gt;BIM&lt;/span&gt; seems to be a poor fit.
Some acronyms currently in use&amp;nbsp;include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BrIM - Bridge Information&amp;nbsp;Modeling&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;CIM&lt;/span&gt; - Civil Information&amp;nbsp;Modeling&lt;/li&gt;
&lt;li&gt;Horizontal &lt;span class="caps"&gt;BIM&lt;/span&gt; - (pretty self&amp;nbsp;explanatory)&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;VDC&lt;/span&gt; - Virtual Design and&amp;nbsp;Construction&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I tend to use &lt;span class="caps"&gt;VDC&lt;/span&gt; as my acronym of choice, hence the title of this&amp;nbsp;post.&lt;/p&gt;
&lt;p&gt;In my experience, there is plenty of reference to modeling as an integral
part of the design process.
When used in this context, modeling typically refers to surface modeling.
This usually involves the creation of templates or assemblies that
represent the cross-sectional geometry of the roadway section.
Templates are &amp;#8216;pushed&amp;#8217; along a path defined by a horizontal and
vertical alignment to create a digital terrain model (&lt;span class="caps"&gt;DTM&lt;/span&gt;) or
&lt;a href="https://en.wikipedia.org/wiki/Triangulated_irregular_network"&gt;triangulated irregular network (&lt;span class="caps"&gt;TIN&lt;/span&gt;)&lt;/a&gt;.
These surfaces are thin meshes that cannot accommodate two points with
the same (X,Y) coordinates but with differing Z (elevations).
In other words, these surfaces cannot contain vertical faces.
Additionally, DTMs cannot &amp;#8220;double back&amp;#8221; on themselves to accommodate
a feature such as the 45 degree edge of an asphalt pavement section.
Perhaps because of these limitations, and / or the general conservative nature
of the industry, typically these models are used only for the
&lt;a href="https://en.wikipedia.org/wiki/Technical_drawing"&gt;production of traditional 2D paper or &lt;span class="caps"&gt;PDF&lt;/span&gt; deliverables&lt;/a&gt;.
Additionally, these surfaces are typically geometric only, with little to no
semantic information associated to the data.
When I make the case for &lt;span class="caps"&gt;VDC&lt;/span&gt;, I am speaking of 3D solid models in addition
to the surface models that are already commonplace.
Additionally, these models are much more valuable when they contain
semantic metadata that further enriches the information.
For example, a &lt;span class="caps"&gt;VDC&lt;/span&gt; model of a bridge might associate material properties
such as the density and design compressive strength of the concrete
that is prescribed for a 3D cylinder representing a pier&amp;nbsp;column.&lt;/p&gt;
&lt;p&gt;So, with this initial foundation of terminology having been laid down,
let&amp;#8217;s move into the benefits of adopting &lt;span class="caps"&gt;VDC&lt;/span&gt; as an integral component
of capital infrastructure&amp;nbsp;projects.&lt;/p&gt;
&lt;h3 id="benefits-during-design"&gt;Benefits During&amp;nbsp;Design&lt;/h3&gt;
&lt;h4 id="visualization-external-audience"&gt;Visualization - external&amp;nbsp;audience&lt;/h4&gt;
&lt;p&gt;Public works projects are, by definition, meant to enhance the general
public&amp;#8217;s quality of life.
This means that it is important to share and describe the proposed work
with those who will be most affected during and after construction.
However, the proposed work is nearly always communicated via traditional
engineering documents or hatched and colored 2D graphics
overlaid on an aerial image.
A majority of stakeholders struggle to understand these documents
due to their highly technical&amp;nbsp;nature.&lt;/p&gt;
&lt;p&gt;On larger projects, it is not uncommon for 3D renderings and fly-through videos
to be prepared to address this issue.
However, this visualization effort often involves unproductive rework
due to a lack of overlap in skill sets between the design team and
the graphic&amp;nbsp;artists.&lt;/p&gt;
&lt;p&gt;When utilizing &lt;span class="caps"&gt;VDC&lt;/span&gt;, the design team gets the visualization &lt;strong&gt;&amp;#8220;for free&amp;#8221;&lt;/strong&gt;
due to the 3D geometry and associated non-graphic information such as
material properties.
A properly-configured modeling environment is typically able to produce
renderings, animations, and even &lt;span class="caps"&gt;AR&lt;/span&gt;/&lt;span class="caps"&gt;VR&lt;/span&gt; datasets with minimal additional&amp;nbsp;effort.&lt;/p&gt;
&lt;h4 id="visualization-internal-audience"&gt;Visualization - internal&amp;nbsp;audience&lt;/h4&gt;
&lt;p&gt;Integrated visualization is also helpful to the design team.
One vendor touts the &lt;em&gt;design-time visualization&lt;/em&gt; capabilities of its software
as a means of reducing Errors and Omissions during design.
find errors more quickly.
One example that I am familiar with is the tie-in between the roadway section
and concrete approach slab at the ends of a bridge.
For constructability reasons, the cross section of a bridge deck
is typically made as planar as&amp;nbsp;possible.&lt;/p&gt;
&lt;p&gt;The approach roadway might use 2% cross slopes in the travel lanes and
4% cross slopes on the shoulders.
The shoulder cross slope needs to be transitioned to match the bridge section
where both the travel lanes and shoulders are at a constant 2%.
This detail is often overlooked, or buried in plan details like
a piece of text on the typical section sheets or a handful of lines
added to a superelevation diagram.
This potential land mine becomes clearly visible when the 3D model of the
bridge gutter is hanging above the adjacent roadway&amp;nbsp;shoulder.&lt;/p&gt;
&lt;p&gt;Additionally, conflict checking and clash resolution tools common in &lt;span class="caps"&gt;VDC&lt;/span&gt;
software help disciplines stay out each others&amp;#8217; way and avoid
construction delays when a storm sewer and bridge foundation are fighting
to occupy the same&amp;nbsp;space.&lt;/p&gt;
&lt;h4 id="constructability"&gt;Constructability&lt;/h4&gt;
&lt;p&gt;Most people are familiar with 3D modeling,
where the x and y (or northing and easting,
if you rather) of plan view are combined with elevation - the pesky Z.
4D models that capture the time scale in addition to the &lt;span class="caps"&gt;XYZ&lt;/span&gt; of geometry
can prove to be invaluable.
During design, the primary answer provided by a 4D model is whether the design
can actually be constructed in the sequence&amp;nbsp;imagined.&lt;/p&gt;
&lt;h4 id="estimating"&gt;Estimating&lt;/h4&gt;
&lt;p&gt;Adding cost to a model bumps it into 5D territory and provides even more
benefits during design.
Like visualization, quantity and cost estimating are mostly accomplished
&lt;strong&gt;&amp;#8220;for free&amp;#8221;&lt;/strong&gt; by the use of common, standardized part libraries with
associated historical bid histories.
A designer may only do major quantity take-offs and cost estimates once
every few months, which make it difficult to gain efficiency with these tasks.
Also, many designers take on this type of work begrudgingly due to the
primarily repetitive and manual processes involved.
By incorporating smart, parametric elements pre-populated with cost data,
these tasks can be accomplished quicker and with fewer errors and&amp;nbsp;omissions.&lt;/p&gt;
&lt;h3 id="benefits-during-construction"&gt;Benefits During&amp;nbsp;Construction&lt;/h3&gt;
&lt;p&gt;Thus far, I have spoken primary of &lt;span class="caps"&gt;VDC&lt;/span&gt; benefits during design.
The majority of my career has been spent in the design office,
so that&amp;#8217;s where my initial focus lands.
During construction, the primary benefit of &lt;span class="caps"&gt;VDC&lt;/span&gt; is that it allows you to
build the project virtually so that you know how to build it physically.
This practice is often seen in industrial settings,
where prototypes of new assembly lines might be built in a pilot&amp;nbsp;plant.&lt;/p&gt;
&lt;p&gt;By first constructing in a virtual dry run, the builder can confirm the
critical path and uncover challenges that otherwise would not
have become apparent until in the field.
Additionally, the combination of the geometry, estimate, and schedule
into a single model will illuminate issues or mistakes that otherwise would
have been missed when looking at these items in&amp;nbsp;isolation.&lt;/p&gt;
&lt;p&gt;Additionally, the &lt;span class="caps"&gt;VDC&lt;/span&gt; model can be used during construction
to monitor earned value and completion progress against the baseline
schedule and estimate.
Mobile and static lidar scans of the construction site can provide an accurate
assessment of project completion at regular&amp;nbsp;intervals.&lt;/p&gt;
&lt;p&gt;This data can also be used for quality purposes such as confirming that
the finished work is within the specified tolerances.
These progress scans can also be used to record the &amp;#8220;as-built&amp;#8221; state of
the&amp;nbsp;project.&lt;/p&gt;
&lt;h3 id="operations-and-maintenance"&gt;Operations and&amp;nbsp;Maintenance&lt;/h3&gt;
&lt;p&gt;This is a bonus section, as thus far we have been talking primarily
in regards to design and construction phases of the asset lifecycle.
&lt;span class="caps"&gt;VDCOM&lt;/span&gt; is a bit of a mouthful, but there are undeniable benefits
realized by continuing to update the &lt;span class="caps"&gt;VDC&lt;/span&gt; model as a construction project
is completed and the infrastructure is put into&amp;nbsp;service.&lt;/p&gt;
&lt;h4 id="asset-management"&gt;Asset&amp;nbsp;Management&lt;/h4&gt;
&lt;p&gt;A geospatially-referenced &lt;span class="caps"&gt;VDC&lt;/span&gt; model of the as-built project
naturally flows into an agency&amp;#8217;s asset management systems.
This centralized data store consolidates a wealth of information that
otherwise would be spread across plan sheet markups,
scanned PDFs of material tickets and test results,
data dumps of progress estimates and change orders,
random spreadsheets of non-conformance reports, &amp;#8230; ad infinitum.
In particular, civil works developed under a P3 delivery process
often have long-term contractual requirements such as warranty periods
that affect the availability payment mechanisms that allow a developer
to recoup initial capital investments.
Capturing this information during construction and spatially associating it
to the warrantied assets make it much easier for an agency to avoid any
costs associated with substandard craftsmanship or&amp;nbsp;materials.&lt;/p&gt;
&lt;p&gt;Most importantly, &lt;span class="caps"&gt;VDC&lt;/span&gt; functions as a &lt;strong&gt;&amp;#8220;killer app&amp;#8221;&lt;/strong&gt; in that it provides
x-ray vision for subsequent inspections of a facility.
For underground utilities and infrastructure, the best time to measure,
photograph, and record the location and properties of an asset are
when the trench is open during&amp;nbsp;construction.&lt;/p&gt;
&lt;h3 id="drawbacks-of-vdc"&gt;Drawbacks of &lt;span class="caps"&gt;VDC&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;To be fair, &lt;span class="caps"&gt;VDC&lt;/span&gt; implementation isn&amp;#8217;t all sunshine and roses.
There is a significant investment required for most practitioners to
make the leap from 2D drafting to multi-dimension digital modeling.
And, there is a certain threshold in terms of project size and complexity
below which there is less benefit derived from &lt;span class="caps"&gt;VDC&lt;/span&gt;.
For example, a contract to add &lt;span class="caps"&gt;HDPE&lt;/span&gt; linings to a series of existing
corrugated metal drainage pipes is not necessarily a good candidate for
these processes.
However, in the majority of cases, the benefits of &lt;span class="caps"&gt;VDC&lt;/span&gt; far outweigh
the initial challenges and learning curve during&amp;nbsp;implementation.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Most of those who have already moved to &lt;span class="caps"&gt;BIM&lt;/span&gt; or &lt;span class="caps"&gt;VDC&lt;/span&gt; could never imagine going
back to 2D drafting.
The difference between environments has been likened to using a typewriter
versus Google docs.
In some ways, this transition is actually more disruptive than the
leap from the drafting table to the &lt;span class="caps"&gt;CAD&lt;/span&gt; workstation.
That change primarily involved a change in tooling to perform (mostly) the
same&amp;nbsp;processes.&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;BIM&lt;/span&gt; and &lt;span class="caps"&gt;VDC&lt;/span&gt;, on the other hand, are a fundamental re-thinking of how we work
and collaborate with our partners and stakeholders.
It is an immense challenge, no doubt.
But it must be met if we are to pull the industry out of the rut of
low productivity, blown budgets and missed schedules that far too often
characterize the &lt;span class="caps"&gt;AEC&lt;/span&gt;&amp;nbsp;sector.&lt;/p&gt;</content><category term="opinion"/><category term="VDC"/></entry><entry><title>Greg Brady, Architect</title><link href="https://www.heavycivilbigdata.com/greg-brady-architect.html" rel="alternate"/><published>2017-12-19T20:00:00-05:00</published><updated>2018-12-15T12:40:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2017-12-19:/greg-brady-architect.html</id><summary type="html">&lt;p&gt;A flashback to syndicated&amp;nbsp;reruns&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#early-career-aspirations"&gt;Early career&amp;nbsp;aspirations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#historic-context"&gt;Historic context&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#ibm-system370-model-145"&gt;&lt;span class="caps"&gt;IBM&lt;/span&gt; System/370 Model&amp;nbsp;145&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;This week, I found myself at another consultant&amp;#8217;s office for a project kickoff meeting.
As we were waiting for others to arrive,
I noticed that the reception desk contained a rolled up set of paper plans on top of a transmittal letter.
I was struck by this, as it reminded me of how little our industry has changed in the last half&amp;nbsp;century.&lt;/p&gt;
&lt;p&gt;&lt;img src="/images/blueprints_architecture_02.jpg" alt="a roll of blueprints on a desk" width="300" height="200" align="middle" /&gt;&lt;/p&gt;
&lt;h3 id="early-career-aspirations"&gt;Early career&amp;nbsp;aspirations&lt;/h3&gt;
&lt;p&gt;From my earliest memories as a young elementary school lad,
I had always wanted to be an architect when I grew up.
In some ways, this may have been influenced,
or at least reinforced by the character of Mike Brady.
In middle school, after learning more about the distinction between architecture and engineering,
it quickly became apparent that my calling actually lay in the latter.
But, that is a story for another&amp;nbsp;time&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.imdb.com/title/tt0531077/"&gt;One specific episode&lt;/a&gt; that I remember involves Greg Brady getting a part time job helping his father in the office.
The plot thickens when he is entrusted with delivering a set of blueprints to an important client.
Seeing the plans on that desk reminded me that although we have traded drafting boards for &lt;span class="caps"&gt;CAD&lt;/span&gt; workstations,
the primary medium for information exchange in our industry is still paper.
I was curious to do some research and see how long it had actually been since that episode first&amp;nbsp;aired.&lt;/p&gt;
&lt;h3 id="historic-context"&gt;Historic&amp;nbsp;context&lt;/h3&gt;
&lt;p&gt;Although my memories of this episode date from the late &amp;#8216;80s,
it originally aired nearly 20 years earlier, on October 30, 1970.
That means that we are a few short years from this cultural reference dating from a half century&amp;nbsp;ago.&lt;/p&gt;
&lt;p&gt;So, approximately 50 years of progress in &lt;span class="caps"&gt;AEC&lt;/span&gt; took us from board drafting and delivering a roll of paper plans to&amp;#8230;
computer-aided-drafting and &lt;em&gt;delivering a roll of paper plans&lt;/em&gt;.
Let&amp;#8217;s take a look at how things have changed in computing over the same time&amp;nbsp;frame:&lt;/p&gt;
&lt;h4 id="ibm-system370-model-145"&gt;&lt;span class="caps"&gt;IBM&lt;/span&gt; System/370 Model&amp;nbsp;145&lt;/h4&gt;
&lt;p&gt;About a month before this episode aired, &lt;span class="caps"&gt;IBM&lt;/span&gt; announced its latest iteration on the &lt;a href="https://www-03.ibm.com/ibm/history/exhibits/mainframe/mainframe_PP3145.html"&gt;System/370 line of mainframe computers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="/images/2423PH3145.jpg"&gt; &lt;/img&gt; &lt;/p&gt;
&lt;p&gt;This model was notable as the first machine released by &lt;span class="caps"&gt;IBM&lt;/span&gt; to use &amp;#8216;monolithic&amp;#8217; silicon memory chips,
as opposed to the metallic rope core memory of its predecessors. 
A basic configuration of this machine would include 400 kb of &lt;span class="caps"&gt;RAM&lt;/span&gt; and
233 Mb of hard drive storage.
This breathtaking amount of computing power could be rented monthly for 
upwards of $15k or purchased outright for a sum of $705k or more (1970 dollars). 
Needless to say, we&amp;#8217;ve come a long way since&amp;nbsp;then.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Perhaps it&amp;#8217;s unfair to compare the civil engineering industry to the tech sector.
After all, we have been crafting with concrete for millenia,
while silicon transistors have appeared just in the last century.
Just as concrete strength gains level off after a relatively short period,
so too would we expect technology to stabilize as it matures over the coming decades.
Still, I can&amp;#8217;t help but be frustrated by the pace of progress in technology 
versus the general stagnation of the &lt;span class="caps"&gt;AEC&lt;/span&gt; industry over a similar time&amp;nbsp;period.&lt;/p&gt;</content><category term="story"/></entry><entry><title>A Weekend on the Command Line</title><link href="https://www.heavycivilbigdata.com/weekend-on-the-command-line.html" rel="alternate"/><published>2017-10-28T23:00:00-04:00</published><updated>1970-01-01T00:00:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2017-10-28:/weekend-on-the-command-line.html</id><summary type="html">&lt;p&gt;Setting up the Windows Subsystem for&amp;nbsp;Linux&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#bash-on-ubuntu-on-windows"&gt;Bash on Ubuntu on&amp;nbsp;Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#windows-subsystem-for-linux-fall-creators-update"&gt;Windows Subsystem for Linux - Fall Creator&amp;#8217;s Update&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#why-wsl"&gt;Why &lt;span class="caps"&gt;WSL&lt;/span&gt;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#jedi-vim"&gt;Jedi-Vim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tmux"&gt;tmux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cmake-and-make"&gt;cmake and&amp;nbsp;make&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#github"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Recently, I spent the better part of a weekend installing Linux under Windows
and building some command line muscle memory.
Not only did this re-kindle some fond memories from my early days of computing,
but it also began to set the stage for effective python&amp;nbsp;development.&lt;/p&gt;
&lt;h3 id="bash-on-ubuntu-on-windows"&gt;Bash on Ubuntu on&amp;nbsp;Windows&lt;/h3&gt;
&lt;p&gt;Recently, Windows 10 gained a beta feature that allows you to install and use
the bash shell as if you were working on Linux.
As I understand it, the Unix system calls are translated on the fly for
execution in the &lt;span class="caps"&gt;NT&lt;/span&gt; kernel.
In other words, it&amp;#8217;s not a dual boot setup or a virtual machine layer.
Rather, it&amp;#8217;s a very interesting mix of the typical Windows experience
with a tasty smattering of the command line for those who are so&amp;nbsp;inclined.&lt;/p&gt;
&lt;h3 id="windows-subsystem-for-linux-fall-creators-update"&gt;Windows Subsystem for Linux - Fall Creator&amp;#8217;s&amp;nbsp;Update&lt;/h3&gt;
&lt;p&gt;The recently-released Fall Creator&amp;#8217;s Update for Windows 10 included
&lt;a href="https://blogs.msdn.microsoft.com/commandline/2017/10/11/whats-new-in-wsl-in-windows-10-fall-creators-update"&gt;a host of improvements and added functionality&lt;/a&gt;.
Of personal interest to me, &lt;span class="caps"&gt;WSL&lt;/span&gt; no longer requires developer mode and is
no longer considered to be a beta feature.
This development, in particular, appealed to me as it seems to indicate that
this hybrid workmode is less of a niche target and more of a mainstream
use case that Microsoft is serious about supporting and improving.
Additionally, being able to install multiple distributions from the Windows
App Store indicates a serious level of collaboration with the individual
Linux&amp;nbsp;distributions.&lt;/p&gt;
&lt;h4 id="why-wsl"&gt;Why &lt;span class="caps"&gt;WSL&lt;/span&gt;?&lt;/h4&gt;
&lt;p&gt;Since I started hobby programming in python roughly a year ago,
I&amp;#8217;ve noticed that most documentation and examples seem to assume that the user
is working in macOS or Linux.
At times, Windows seems to be a second-class citizen.
When documentation for Windows is included,
Visual Studio typically figures prominently as an integral component of the
build toolchain.
I&amp;#8217;m curious to see if the sledding gets any easier in an environment
where compilers and other dev tools are installed by&amp;nbsp;default.&lt;/p&gt;
&lt;p&gt;A second motivator for installing &lt;span class="caps"&gt;WSL&lt;/span&gt; is the fact that it is pretty
effectively sandboxed from the important bits of Windows.
Both of the machines that I have been hacking on are shared with the rest of
my household, and I am careful to keep in mind that any software installs or
registry hacks will at least cause some clutter in the \Program Files
directory, and at worst could cause serious deterioration or even destruction
of an appliance that is critical to our day-to-day adult&amp;nbsp;responsibilities.&lt;/p&gt;
&lt;p&gt;Lastly, I was a full-time user of Ubuntu in the Dapper-Edgy-Feisty timeframe,
and am curious to see how far the state of the art in Linux has come
since&amp;nbsp;then.&lt;/p&gt;
&lt;h3 id="jedi-vim"&gt;Jedi-Vim&lt;/h3&gt;
&lt;p&gt;One issue that has been an on-going frustration with python is getting
autocompletion to work consistently.
I was never successful in installing and configuring the plugins necessary
for Python auto-completing to work in Atom.
Later, I had some success with Visual Studio Code, but found that the hardware
requirements were a little steep for our primary desktop &lt;span class="caps"&gt;PC&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Since reading that
&lt;a href="https://realpython.com/vim-and-python-a-match-made-in-heaven/"&gt;Vim and python are a match made in heaven&lt;/a&gt;,
I took the plunge with vimtutor a few weeks ago and have started to
crest the first hill in the learning curve.
This past weekend, one of my first victories was the successful integration of
&lt;a href="https://github.com/davidhalter/jedi-vim"&gt;jedi-vim&lt;/a&gt; and
&lt;a href="https://valloric.github.io/YouCompleteMe"&gt;YouCompleteMe&lt;/a&gt;.
This has definitely made python development much more enjoyable,
as I can preview function signatures and module documentation
directly in the editor.
I have gotten very accustomed to Intellisense and library browsing in the
&lt;span class="caps"&gt;VBA&lt;/span&gt; &lt;span class="caps"&gt;IDE&lt;/span&gt;, and am happy that my user experience in python will be very similar
from a usability&amp;nbsp;standpoint.&lt;/p&gt;
&lt;h3 id="tmux"&gt;tmux&lt;/h3&gt;
&lt;p&gt;&lt;img alt="tmux cartoon" src="https://media.pragprog.com/images/cms/bhtmux-cartoon.jpg"&gt;&lt;/p&gt;
&lt;p&gt;tmux is a terminal multiplexer that allows for an &amp;#8220;editor over shell&amp;#8221;
configuration similar to the default layout in Visual Studio Code.
This setup makes it very easy to drop into git and other cli tools
while keeping context with the file(s) currently being edited in vim.
This was an easy install, and with the help of a basic cheat sheet
I am now splitting and spawning multiple terminal windows on a single screen
with nary a hint of input from the&amp;nbsp;mouse.&lt;/p&gt;
&lt;h3 id="cmake-and-make"&gt;cmake and&amp;nbsp;make&lt;/h3&gt;
&lt;p&gt;With tmux and auto-complete now up and running, I set my sights on building
some software from source cloned from github.
This brought back some memories from my initial forays into Linux circa 2003
that involved multiple failed attempts at installing software from source.
This time around there were a few hurdles to clear,
but eventually the package built successfully and the module imported
with no&amp;nbsp;complaints.&lt;/p&gt;
&lt;p&gt;Speaking of&amp;nbsp;github&amp;#8230;&lt;/p&gt;
&lt;h3 id="github"&gt;Github&lt;/h3&gt;
&lt;p&gt;This weekend also marked some of my first forays into code collaboration
on Github.
For one, I created a feature branch in a repository that I had cloned
a few weeks earlier.
I made some changes and did some testing to confirm that everything was
working as expected.
Then, I noticed that the upstream master branch had been updated since
the time of my fork.
So, I had to merge my master branch with the new changes from upstream,
then merge my feature branch and push back to my remote fork.
Of course, I didn&amp;#8217;t get all of that right the first time through.
After a few newb mistakes, I eventually got to a pretty messy state of affairs.
With some help from Google, I ended up issuing&amp;nbsp;a &lt;code&gt;reset --hard&lt;/code&gt;
as a sort of mini &amp;#8216;nuke and&amp;nbsp;pave&amp;#8217;.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Although it took longer than initially planned,
I ended up re-connecting some cli neurons and getting reasonably proficient
in bash, git, and vim.
These new workflows remind me of the many hours spent in front of
a monochrome green terminal connected to an Apple ][e or &lt;span class="caps"&gt;IBM&lt;/span&gt; &lt;span class="caps"&gt;PC&lt;/span&gt;/&lt;span class="caps"&gt;XT&lt;/span&gt;.
In some use cases, I actually much prefer the command line to wrangling a
mouse through menus, windows, and inconsistent form controls.
It definitely feels like I have settled into an environment that will serve
me well and fits my personal preferences on computer usage and software
development &amp;#8212; at least, with&amp;nbsp;python.&lt;/p&gt;</content><category term="story"/><category term="wsl"/><category term="cli"/></entry><entry><title>Hello, Pelican!</title><link href="https://www.heavycivilbigdata.com/hello-pelican.html" rel="alternate"/><published>2017-03-01T00:00:00-05:00</published><updated>2017-03-01T00:00:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2017-03-01:/hello-pelican.html</id><summary type="html">&lt;p&gt;Initial blog&amp;nbsp;post&lt;/p&gt;</summary><content type="html">&lt;p&gt;This is my first post in Pelican.
Training wheels are on.
I have been obsessing a bit over selecting a theme,
but it&amp;#8217;s probably best to put together more content before getting
too crazy about &lt;span class="caps"&gt;UI&lt;/span&gt;&amp;nbsp;tweaks.&lt;/p&gt;
&lt;p&gt;I am quite enjoying building my chops with static site generation.
This is much more appealing than hand-coding &lt;span class="caps"&gt;HTML&lt;/span&gt; in Notepad
or that week I spent in &lt;a href="https://en.wikipedia.org/wiki/Microsoft_FrontPage"&gt;FrontPage 97&lt;/a&gt;.
Now, with a little &lt;span class="caps"&gt;CLI&lt;/span&gt; and python under my belt,
I&amp;#8217;m happy that those days are safely in the&amp;nbsp;past.&lt;/p&gt;</content><category term="misc"/><category term="cli"/></entry><entry><title>Learn Python the Hard Way</title><link href="https://www.heavycivilbigdata.com/learn-python-the-hard-way.html" rel="alternate"/><published>2016-10-15T10:40:00-04:00</published><updated>1970-01-01T00:00:00-05:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2016-10-15:/learn-python-the-hard-way.html</id><summary type="html">&lt;p&gt;My initial foray into programming with&amp;nbsp;python&lt;/p&gt;</summary><content type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#my-first-steps-with-python"&gt;My first steps with&amp;nbsp;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#learn-python-the-hard-way"&gt;Learn Python the Hard&amp;nbsp;Way&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="my-first-steps-with-python"&gt;My first steps with&amp;nbsp;Python&lt;/h3&gt;
&lt;p&gt;I&amp;#8217;ve been programming for a number of years now,
with the majority of my time spent writing &lt;span class="caps"&gt;VBA&lt;/span&gt; tools for our &lt;span class="caps"&gt;CAD&lt;/span&gt; system.
For my birthday this past spring,
I got &lt;a href="https://nostarch.com/javascriptforkids"&gt;Javascript for Kids&lt;/a&gt;.
I was introduced to No Starch Press recently at our local Barnes &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; Noble,
and thought that this particular book might be useful for myself
and (potentially in the future) for my&amp;nbsp;kids.&lt;/p&gt;
&lt;p&gt;In the process of researching no starch, I happened across a title
&lt;a href="https://nostarch.com/automatestuff"&gt;Automate the Boring Stuff with Python&lt;/a&gt;.
This concept resonated deeply with me, as the primary motivator of
my programming work to date has been aimed at automating manual (and sometimes
boring)&amp;nbsp;workflows.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m still working through the javascript book,
but have taken an interest in starting to learn python as well.
In addition to the boring stuff book,
there are a handful of other reasons for heading in this direction.
For instance, I&amp;#8217;ve noticed that python appears to play a starring role in
the &lt;a href="https://www.raspberrypi.org"&gt;Raspberry Pi&lt;/a&gt;&amp;nbsp;ecosystem.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve crossed paths with python a number of times in the past,
generally in the context of Linux.
I seem to have absorbed some of the &lt;strong&gt;&amp;#8216;just a scripting language&amp;#8217;&lt;/strong&gt; bias
in the past, but now I&amp;#8217;m ready to take a fresh&amp;nbsp;look.&lt;/p&gt;
&lt;h3 id="learn-python-the-hard-way"&gt;Learn Python the Hard&amp;nbsp;Way&lt;/h3&gt;
&lt;p&gt;So, here I am.
I&amp;#8217;ve surveyed the internet for resources providing instruction on getting
started with python.
I happened across Zed Shaw&amp;#8217;s 
&lt;a href="https://www.learncodethehardway.org"&gt;Learn Code the Hard Way&lt;/a&gt;
series and have quickly dug into the python&amp;nbsp;flavor.&lt;/p&gt;
&lt;p&gt;I have been following the instructions to the letter and now have a
working install of python, with Atom as my editor.
As expected, it has been slow going as I start climbing the learning curve.
I eventually worked my way up to this tidbit, which is
&lt;a href="http://learnpythonthehardway.org/book/ex5.html"&gt;example 5&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;his_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Zed A. Shaw&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;his_age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt; &lt;span class="c1"&gt;# not a lie&lt;/span&gt;
&lt;span class="n"&gt;his_height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;74&lt;/span&gt; &lt;span class="c1"&gt;# inches&lt;/span&gt;
&lt;span class="n"&gt;his_weight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt; &lt;span class="c1"&gt;# lbs&lt;/span&gt;
&lt;span class="n"&gt;his_eyes&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="n"&gt;his_teeth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;White&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;his_hair&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Brown&amp;#39;&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Let&amp;#39;s talk about &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;.&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;his_name&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;He&amp;#39;s &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; inches tall.&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;his_height&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;He&amp;#39;s &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; pounds heavy.&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;his_weight&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Actually that&amp;#39;s not too heavy.&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;He&amp;#39;s got &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; eyes and &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; hair.&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;his_eyes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;his_hair&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;His teeth are usually &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; depending on the coffee.&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;his_teeth&lt;/span&gt;

&lt;span class="c1"&gt;# this line is tricky. Try to get it exactly right&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;If I add &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;, and &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; I get &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;.&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;his_age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;his_height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;his_weight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;his_age&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;his_height&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;his_weight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;So, I&amp;#8217;m officially on my way to learning python.
Things are going slow, of course, but I feel like I&amp;#8217;m quickly acclimating
to the whitespace.
I really like this course!
It seems to be very straightforward, and I like the philosophy of
putting in your time and not looking for shortcuts.
Of course, months from now, I will look back and marvel at the simplicity
of the code I wrote in these first few days with the&amp;nbsp;language.  &lt;/p&gt;</content><category term="story"/><category term="python"/></entry><entry><title>Hello, World!</title><link href="https://www.heavycivilbigdata.com/hello-world.html" rel="alternate"/><published>2016-06-01T00:00:00-04:00</published><updated>2016-06-01T00:00:00-04:00</updated><author><name>civilx64</name></author><id>tag:www.heavycivilbigdata.com,2016-06-01:/hello-world.html</id><summary type="html">&lt;p&gt;A short&amp;nbsp;introduction&lt;/p&gt;</summary><content type="html">&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CLS&lt;/span&gt;
&lt;span class="mf"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ECHO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;HELLO WORLD!&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;GOTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;At present, a primary mission in my professional realm is to help move the &lt;span class="caps"&gt;AEC&lt;/span&gt;
industry into the Internet Age.
As the oldest of engineering disciplines, we have gotten comfortable with
terminology and workflows honed in the nineteenth and twentieth centuries.
The proliferation of always-on connectivity and instant access to information
has dramatically reshaped society since the dawn of the new millenium.
However, many segments of &lt;span class="caps"&gt;AEC&lt;/span&gt; still operate as if there is a large drafting
room in the home office filled with rows of t-squares and electric&amp;nbsp;erasers.&lt;/p&gt;
&lt;p&gt;&lt;a title="By Swtpc6800 en:User:Swtpc6800 Michael Holley [Public domain], from Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:Drafting_board_with_T_Square.jpg"&gt;&lt;img width="512" alt="Drafting board with T Square" src="https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Drafting_board_with_T_Square.jpg/512px-Drafting_board_with_T_Square.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="64-bit-public-infrastructure"&gt;64-bit Public&amp;nbsp;Infrastructure&lt;/h2&gt;
&lt;p&gt;As I wrapped up my Bachelor&amp;#8217;s degree in 2001,
mainstream computing lived in Windows &lt;span class="caps"&gt;NT&lt;/span&gt; or 2000.
A few years into my career,
I began to see glimpses of 64 bit computing and spent many productive years
in the land of Windows &lt;span class="caps"&gt;XP&lt;/span&gt;, then Windows 7.
In particular, the ability to address more than &lt;span class="caps"&gt;2GB&lt;/span&gt; in &lt;span class="caps"&gt;RAM&lt;/span&gt; drastically
improved the performance of our &lt;span class="caps"&gt;CAD&lt;/span&gt; platforms.
Hence,&amp;nbsp;the &lt;code&gt;x64&lt;/code&gt; suffix in my username is used to indicate a modern,
contemporary vision for Civil&amp;nbsp;Engineering. &lt;/p&gt;</content><category term="misc"/></entry></feed>