Commit 62ae52b2 authored by Dave Cooper's avatar Dave Cooper
Browse files

Merge branch 'feature/svg-dd' into devo

parents 5b01d82f bcf9d98f
...@@ -14,14 +14,9 @@ bin ...@@ -14,14 +14,9 @@ bin
*.idx *.idx
*.log *.log
*.toc *.toc
<<<<<<< HEAD
*.ind
*.ilg
=======
*.ilg *.ilg
*.ind *.ind
*.out *.out
>>>>>>> feature/book
configure.el configure.el
systems.txt systems.txt
......
...@@ -278,8 +278,15 @@ re-evaluates the expression to compute the original list of indices)" ...@@ -278,8 +278,15 @@ re-evaluates the expression to compute the original list of indices)"
(define-object matrix-sequence (standard-sequence) (define-object matrix-sequence (standard-sequence)
:documentation (:description "A matrix sequence quantification is generated as a result of specifying :documentation (:description "A matrix sequence quantification is
<tt>:sequence (:matrix &lt;direction-keyword&gt; &lt;number&gt; &lt;direction-keyword&gt; &lt;number&gt;))</tt> in an <tt>:objects</tt> specification.") generated as a result of specifying <tt>:sequence (:matrix
direction-keyword number direction-keyword number))</tt> in an
<tt>:objects</tt> specification. The direction-keywords can be one of
<tt>:lateral</tt>, <tt>:longitudinal</tt>, and <tt>:vertical</tt>. The
items will be arranged spread out evenly in the directions specified.
Centers can also be provided explicitly based on the indices. The
indices to a matrix sequence consist of a list of numbers rather than
a single number as with a normal sequence.")
:computed-slots :computed-slots
......
...@@ -780,7 +780,6 @@ toplevel inputs as specified in the snapshot file. ...@@ -780,7 +780,6 @@ toplevel inputs as specified in the snapshot file.
(defparameter *dep-hash-threshhold* 1000) (defparameter *dep-hash-threshhold* 1000)
(defun add-notify-cons (notify-cons value &optional self message) (defun add-notify-cons (notify-cons value &optional self message)
;; ;;
;; FLAG -- this was added as a fix for github Issue #69, but causes ;; FLAG -- this was added as a fix for github Issue #69, but causes
......
;;;; -*- coding: utf-8 -*-
(asdf:defsystem #:4bar :description
"The Gendl™ 4bar Subsystem" :author "John McCarthy" :license
"Affero Gnu Public License (http://www.gnu.org/licenses/)" :serial t
:version "20130730" :depends-on nil
#+asdf-encoding :encoding #+asdf-encoding :utf-8
:components ((:gdl "source/4bar")))
...@@ -11,19 +11,30 @@ ...@@ -11,19 +11,30 @@
(str (the main-area main-div)) (str (the main-area main-div))
(str (the drop-coord-section main-div)))) (str (the drop-coord-section main-div))))
(dropped-x-y (the main-area dropped-x-y))) (dropped-x-y (the main-area dropped-x-y))
(input-link-angle-d nil :settable)
)
:objects ((assembly :type 'assembly :objects ((assembly :type 'assembly
:input-link-angle-d (if (the dropped-x-y) :input-link-angle-d (or nil ;;(the input-link-angle-d)
(angle-between-vectors-d (the (face-normal-vector :right)) (if (the dropped-x-y)
(subtract-vectors (the dropped-x-y) (angle-between-vectors-d (the (face-normal-vector :right))
(the assembly ground-2)) (subtract-vectors (the dropped-x-y)
(the (face-normal-vector :top))) (the assembly ground-2))
90))) (the (face-normal-vector :top)))
90))))
:hidden-objects ((drop-coord-section :type 'sheet-section :hidden-objects ((drop-coord-section :type 'sheet-section
:inner-html (with-cl-who-string () :js-to-eval :parse
(str (the main-area dropped-x-y)))) :inner-html (with-cl-who-string ()
(str (the main-area dropped-x-y))
(str (the input-link-angle-d))
#+nil
(:script
(str (the (gdl-ajax-call :function-key :set-slot!
:arguments (list :input-link-angle-d (if (the input-link-angle-d)
(1+ (the input-link-angle-d)) 90 ))))))))
(main-area :type 'base-ajax-graphics-sheet (main-area :type 'base-ajax-graphics-sheet
:respondent self :respondent self
:vector-graphics-onclick? nil :vector-graphics-onclick? nil
...@@ -168,7 +179,10 @@ ...@@ -168,7 +179,10 @@
:display-controls (list :color (ecase (the-child index) :display-controls (list :color (ecase (the-child index)
(0 :red) (1 :green)) (0 :red) (1 :green))
:line-thickness 2 :line-thickness 2
:drag-controls :drag-and-drop) :drag-controls (ecase (the-child index)
(1 :drag-and-drop)
;;(1 :drop)
(0 nil)))
:circle (the (grounded-link-circles (the-child index))) :circle (the (grounded-link-circles (the-child index)))
:pseudo-inputs (circle) :pseudo-inputs (circle)
:start (the-child circle center) :start (the-child circle center)
...@@ -181,7 +195,7 @@ ...@@ -181,7 +195,7 @@
(the follower-link-angle)))) (the follower-link-angle))))
(coupler-link :type 'coupler-link (coupler-link :type 'coupler-link
:display-controls (list :line-thickness 2 :color :blue) :display-controls (list :line-thickness 2 :color :blue :fill-color :blue)
:pass-down (coupler-angle-1 coupler-length-1) :pass-down (coupler-angle-1 coupler-length-1)
:start (the (grounded-links 0) end) :start (the (grounded-links 0) end)
:end (the (grounded-links 1) end))) :end (the (grounded-links 1) end)))
...@@ -205,13 +219,40 @@ ...@@ -205,13 +219,40 @@
(nreverse data))))) (nreverse data)))))
(define-object coupler-link (line) (define-object coupler-link (global-polyline)
:input-slots (start end coupler-angle-1 coupler-length-1)
:computed-slots ((datum (the edge-1 end))
(direction-vector (subtract-vectors (the end) (the start)))
(vertex-list (list (the start) (the end) (the edge-1 end))))
:hidden-objects
((baseline :type 'line
:pass-down (start end))
(edge-1 :type 'line
:pass-down (start)
:end (rotate-point (translate-along-vector (the start)
(the direction-vector)
(the coupler-length-1))
(the start)
(the (face-normal-vector :top))
:angle (the coupler-angle-1)))
(edge-2 :type 'line
:start (the edge-1 end)
:pass-down (end))))
#+nil
(define-object coupler-link (line outline-specialization-mixin)
:input-slots (coupler-angle-1 coupler-length-1) :input-slots (coupler-angle-1 coupler-length-1)
:computed-slots ((datum (the edge-1 end))) :computed-slots ((datum (the edge-1 end)))
:objects :hidden-objects
((baseline :type 'line ((baseline :type 'line
:pass-down (start end)) :pass-down (start end))
...@@ -228,7 +269,7 @@ ...@@ -228,7 +269,7 @@
:pass-down (end)))) :pass-down (end))))
(publish-gwl-app "/4bar" '4-bar:dd)
......
...@@ -24,11 +24,11 @@ ...@@ -24,11 +24,11 @@
(defparameter *basic-operation* (defparameter *basic-operation*
`((:chapter :title "Basic Operation of the GDL Environment") `((:chapter :title "Basic Operation of the GDL Environment")
"This chapter will lead you through all the basic steps of "This chapter will lead you through all the basic steps of
operating a typical GDL-based development environment. We will not go operating a typical GDL-based development environment. We will not in
into particular depth about the additional features of the environment this section go into particular depth about the additional features of
or language syntax in this section --- this chapter is merely for the environment or language syntax --- this chapter is merely to
getting familiar with and practicing with the nuts and bolts of familiarize you with, and start you practicing with the nuts and bolts
operating the environment with a keyboard." of operating the environment with a keyboard."
((:section :title "What is Different about GDL?") ((:section :title "What is Different about GDL?")
"GDL is a " "GDL is a "
...@@ -51,7 +51,7 @@ function or object, one has " ...@@ -51,7 +51,7 @@ function or object, one has "
In GDL, it is typical to keep the same development session up and In GDL, it is typical to keep the same development session up and
running for an entire day or longer, making it unnecessary to running for an entire day or longer, making it unnecessary to
constantly recompile and reload your definitions from scratch. Note, repeatedly recompile and reload your definitions from scratch. Note,
however, that if you do shut down and restart the system for some however, that if you do shut down and restart the system for some
reason, then you will have to recompile and/or reload your reason, then you will have to recompile and/or reload your
application's definitions in order to bring the system back into a application's definitions in order to bring the system back into a
...@@ -62,13 +62,13 @@ done " ...@@ -62,13 +62,13 @@ done "
(:emph "automatically") (:emph "automatically")
" in one of two ways:" " in one of two ways:"
(:ol (:ol
(:li "using commands placed into (:li "Using commands placed into
the " the "
(:texttt "gdlinit.cl") (:texttt "gdlinit.cl")
" initialization file, as described in Section " " initialization file, as described in Section "
(:ref "sec:customizingyourenvironment") ".") (:ref "sec:customizingyourenvironment") ".")
(:li "alternatively, you can compile and load definitions into (:li "Alternatively, you can compile and load definitions into
your session, then save the ``world'' in that state. That way it is your session, then save the ``world'' in that state. That way it is
possible to start a new GDL ``world'' which already has all your possible to start a new GDL ``world'' which already has all your
application's definitions loaded and ready for use, without having to application's definitions loaded and ready for use, without having to
...@@ -284,7 +284,7 @@ This will visit the *slime-repl* buffer. Now type: " ...@@ -284,7 +284,7 @@ This will visit the *slime-repl* buffer. Now type: "
"GDL contains utilities which allow you to treat your "GDL contains utilities which allow you to treat your
application as a ``project,'' with the ability to compile, application as a ``project,'' with the ability to compile,
incrementally compile, and load a ``project'' from a directory tree of incrementally compile, and load a ``project'' from a directory tree of
source files representing your project. In this section we give an source files representing your project. In this section we provide an
overview of the expected directory structure and available control overview of the expected directory structure and available control
files, followed by a reference for each of the functions included in files, followed by a reference for each of the functions included in
the bootstrap module." the bootstrap module."
...@@ -309,9 +309,7 @@ relatively flat, however.") ...@@ -309,9 +309,7 @@ relatively flat, however.")
apps/yoyodyne/booster-rocket/source/package.gdl apps/yoyodyne/booster-rocket/source/package.gdl
apps/yoyodyne/booster-rocket/source/parameters.gdl apps/yoyodyne/booster-rocket/source/parameters.gdl
apps/yoyodyne/booster-rocket/source/rules.gdl apps/yoyodyne/booster-rocket/source/rules.gdl
")) ")))
)
((:subsection :title "Source Files within a source/ subdirectory") ((:subsection :title "Source Files within a source/ subdirectory")
...@@ -320,7 +318,7 @@ relatively flat, however.") ...@@ -320,7 +318,7 @@ relatively flat, however.")
(:p "Within a source subdirectory, you may have a file called " (:p "Within a source subdirectory, you may have a file called "
(:texttt "file-ordering.isc") (:texttt "file-ordering.isc")
(:footnote (:texttt "isc") " stands for ``Intelligent Source Configuration''") (:footnote (:texttt "isc") " stands for ``Intelligent Source Configuration''")
" to enforce a certain ordering on the files. Here are " to enforce a certain ordering of the files. Here are
the contents of an example for the above application:") the contents of an example for the above application:")
(:verbatim "(\"package\" \"parameters\")") (:verbatim "(\"package\" \"parameters\")")
...@@ -330,7 +328,8 @@ of the files should not matter (although it will default to ...@@ -330,7 +328,8 @@ of the files should not matter (although it will default to
lexigraphical ordering).") lexigraphical ordering).")
(:p "Now our sample application directory looks like Figure " (:p "Now our sample application directory appears as in
Figure "
(:ref "fig:yoyodyne-with-file-ordering-isc") (:ref "fig:yoyodyne-with-file-ordering-isc")
".")) "."))
...@@ -382,14 +381,14 @@ load the system using Quicklisp. To do this for our example, follow these steps: ...@@ -382,14 +381,14 @@ load the system using Quicklisp. To do this for our example, follow these steps:
" for projects you want available during every development session. Note that you should include " for projects you want available during every development session. Note that you should include
the full path prefix for the directory containing the ASDF system file.") the full path prefix for the directory containing the ASDF system file.")
(:item (:verbatim "(ql:quickload :gdl-yoyodyne)") (:item (:verbatim "(ql:quickload :gdl-yoyodyne)")
" this will compile and load the actual system. Quicklisp " This will compile and load the actual system. Quicklisp
uses ASDF at the low level to compile and load the systems, and uses ASDF at the low level to compile and load the systems, and
Quicklisp will retrieve any depended-upon third-party libraries from Quicklisp will retrieve any depended-upon third-party libraries from
the Internet on-demand. Source files will be compiled only if the the Internet on-demand. Source files will be compiled only if the
corresponding binary (fasl) file does not exist or is older than the corresponding binary (fasl) file does not exist or is older than the
source file. By default, ASDF keeps its binary files in a " source file. By default, ASDF keeps its binary files in a "
(:emph "cache") (:emph "cache")
" directory, separated according to CL platform and " directory, separated according to the CL platform and
operating system. The location of this cache is system-dependent, but operating system. The location of this cache is system-dependent, but
you can see where it is by observing the compile and load you can see where it is by observing the compile and load
process.")))) process."))))
......
...@@ -94,7 +94,7 @@ an HTML generating library, such as " ...@@ -94,7 +94,7 @@ an HTML generating library, such as "
(:p "For our examples we will use cl-who, which is currently the (:p "For our examples we will use cl-who, which is currently the
standard default HTML generating library used internally by GDL. Here standard default HTML generating library used internally by GDL. Here
we will make note of the major features of cl-who while introducing we will make note of the major features of cl-who while introducing
the examples; for complete documentation on cl-who, please visit the the examples. For complete documentation on cl-who, please visit the
page at Edi Weitz' website linked above and listed in the footnote page at Edi Weitz' website linked above and listed in the footnote
below.") below.")
...@@ -150,7 +150,7 @@ within a GWL application." ...@@ -150,7 +150,7 @@ within a GWL application."
(:item "The " (:texttt "fmt") " symbol has special meaning (:item "The " (:texttt "fmt") " symbol has special meaning
within the cl-who environment and works the same as a Common within the cl-who environment and works the same as a Common
Lisp " (:texttt "(format nil ...)") ", in order to evaluate a format Lisp " (:texttt "(format nil ...)") " in order to evaluate a format
string together with matching arguments, and produce a string at string together with matching arguments, and produce a string at
runtime.") runtime.")
...@@ -346,7 +346,7 @@ available form-controls are:" ...@@ -346,7 +346,7 @@ available form-controls are:"
(:p "These form-controls are customizable by mixing them into (:p "These form-controls are customizable by mixing them into
your own specific form-controls (although this is often not your own specific form-controls (although this often is not
necessary). New form-controls such as for numbers, dates, necessary). New form-controls such as for numbers, dates,
etc will soon be added to correspond to latest HTML etc will soon be added to correspond to latest HTML
standards.")) standards."))
...@@ -368,7 +368,7 @@ of the form controls within the " (:texttt "with-html-form") " macro.") ...@@ -368,7 +368,7 @@ of the form controls within the " (:texttt "with-html-form") " macro.")
:width "4in" :height "3in" :width "4in" :height "3in"
:label "fig:gwl-3b-image")) :label "fig:gwl-3b-image"))
(:p "In Figure " (:p "Figure "
(:ref "fig:gwl-3b") (:ref "fig:gwl-3b")
" is an example which allows the user to enter a year, and the " is an example which allows the user to enter a year, and the
application will respond with the revenue amount for that year. Additional application will respond with the revenue amount for that year. Additional
...@@ -407,7 +407,7 @@ page need to be updated after a request.") ...@@ -407,7 +407,7 @@ page need to be updated after a request.")
represents the page and the page sections is kept identical to the represents the page and the page sections is kept identical to the
displayed state of the page. This means that if the user hits the displayed state of the page. This means that if the user hits the
``Refresh'' button in the browser, the state of the page will remain ``Refresh'' button in the browser, the state of the page will remain
unchanged. This ability is not present in some other Ajax unchanged. This ability is not available in some other Ajax
frameworks.") frameworks.")
((:subsection :title "Steps to Create a gdlAjax Application") ((:subsection :title "Steps to Create a gdlAjax Application")
...@@ -417,7 +417,7 @@ still apply for gdlAjax applications --- that is, HTML generation, ...@@ -417,7 +417,7 @@ still apply for gdlAjax applications --- that is, HTML generation,
page linking, etc. These techniques will all still work in a gdlAjax page linking, etc. These techniques will all still work in a gdlAjax
application.") application.")
(:p "To produce a gdlAjax application involves three main differences from (:p "To produce a gdlAjax application entails three main differences from
a standard web application:" a standard web application:"
...@@ -438,10 +438,11 @@ a standard web application:" ...@@ -438,10 +438,11 @@ a standard web application:"
fills in the body of the page --- everything between the <body> fills in the body of the page --- everything between the <body>
and </body> tags. The head tag of the page is filled in and </body> tags. The head tag of the page is filled in
automatically and can be customized in various ways.") automatically and can be customized in various ways.")
(:item "Any sections of the page which you want to be able (:item "Any sections of the page which you want to have the
to change themselves in response to an Ajax call must be made capacity to change themselves in response to an Ajax call must
into separate page sections, or ``sheet sections,'' and the HTML be made into separate page sections, or ``sheet sections,'' and
for their " (:texttt "main-div") " included in the main page's " the HTML for their " (:texttt "main-div") " included in the main
page's "
(:texttt "main-sheet-body") " by use of cl-who's " (:texttt "str") " directive.")) (:texttt "main-sheet-body") " by use of cl-who's " (:texttt "str") " directive."))
...@@ -485,7 +486,7 @@ a standard web application:" ...@@ -485,7 +486,7 @@ a standard web application:"
" is simply the " (:texttt "inner-html") ", wrapped with " is simply the " (:texttt "inner-html") ", wrapped with
an HTML DIV (i.e. ``division'') tag which contains a unique an HTML DIV (i.e. ``division'') tag which contains a unique
identifier for this section, derived from the root-path identifier for this section, derived from the root-path
to the GDL object in the in tree which represents the to the GDL object in the tree which represents the
sheet section.") sheet section.")
(:item "We introduce the CL function " (:texttt "gwl:publish-gwl-app") (:item "We introduce the CL function " (:texttt "gwl:publish-gwl-app")
...@@ -548,8 +549,8 @@ necessary.") ...@@ -548,8 +549,8 @@ necessary.")
works correctly when the form-controls are set before the works correctly when the form-controls are set before the
function is called, then you can group the functions function is called, then you can group the functions
together into a ``wrapper-function,'' and do the entire together into a ``wrapper-function,'' and do the entire
processing with a single Ajax (or Sjax) call. Normally this processing with a single Ajax (or Sjax) call. This would be
would be be the recommended approach whenever possible.")) be the recommended approach whenever possible."))
((:subsection :title "Including Graphics") ((:subsection :title "Including Graphics")
...@@ -580,7 +581,7 @@ can be controlled with other optional input-slots.") ...@@ -580,7 +581,7 @@ can be controlled with other optional input-slots.")
(:p "The example in Figure " (:ref "fig:gwl-5") (:p "The example in Figure " (:ref "fig:gwl-5")
" contains a simple box with two graphics viewports " contains a simple box with two graphics viewports
and ability to modify the length, height, and and with of the box:") and ability to modify the length, height, and and width of the box:")
......
...@@ -23,9 +23,9 @@ ...@@ -23,9 +23,9 @@
(defparameter *gendl-geometry* (defparameter *gendl-geometry*
`((:chapter :title "Working with Geometry in GDL") `((:chapter :title "Working with Geometry in GDL")
(:p "Although Genworks GDL is a powerful framework for all kinds (:p "Although Genworks GDL is a powerful framework for a variety
of general-purpose computing, one of its particular strong points is of general-purpose undertakings, one of its particular strong points
generating geometry and processing geometric entities. Geometric is generating geometry and processing geometric entities. Geometric
capabilities are provided by a library of " capabilities are provided by a library of "
(:emph "low-level primitives") (:emph "low-level primitives")
", or LLPs. LLPs are pre-defined GDL objects which you can ", or LLPs. LLPs are pre-defined GDL objects which you can
...@@ -36,9 +36,9 @@ ...@@ -36,9 +36,9 @@
(:texttt ":geom-base") (:texttt ":geom-base")
" package, and here are some examples:" " package, and here are some examples:"
((:list :style :itemize) ((:list :style :itemize)
(:item (:texttt "base-coordinate-system") " provides an empty 3D Cartesian coordinate system" (:item (:texttt "base-coordinate-system") " provides an empty 3D Cartesian coordinate system."
(:footnote (:texttt "base-coordinate-system") " is also known by its legacy name " (:footnote (:texttt "base-coordinate-system") " is also known by its legacy name "
(:texttt "base-object") ".")) (:texttt "base-object")))
(:item "Simple 2-dimensional primitives include " (:item "Simple 2-dimensional primitives include "
(:texttt "line") (:texttt "line")
...@@ -133,7 +133,7 @@ ...@@ -133,7 +133,7 @@
(:ref "fig:box-code") (:ref "fig:box-code")
" defines an example box, and Figure " " defines an example box, and Figure "
(:ref "fig:tasty-box") (:ref "fig:tasty-box")
" shows how it will display in tasty.") " demonstrates how it will display in Tasty.")
(:p "Note the following from the example in " (:p "Note the following from the example in "
(:ref "fig:box-code") (:ref "fig:box-code")
...@@ -157,13 +157,14 @@ ...@@ -157,13 +157,14 @@
(:texttt "base-object") (:texttt "base-object")
" as " " as "
(:emph "trickle-down-slots") (:emph "trickle-down-slots")
". For this reason, they are automatically being passed down into into the " ". For this reason they are automatically being passed down
into into the "
(:texttt "box") (:texttt "box")
" child object. Therefore it is not necessary to pass them down explicitly.")) " child object. Therefore it is not necessary to pass them down explicitly."))
((:boxed-figure :caption "Definition of a Box" :label "fig:box-code") ((:boxed-figure :caption "Definition of a Box" :label "fig:box-code")
(:verbatim (:include "~/gendl/documentation/tutorial/examples/box-1.gdl"))) (:verbatim (:include "~/gendl/documentation/tutorial/examples/box-1.gdl")))
((:image-figure :image-file "tasty-box-1.png" :caption "Simple box displayed in tasty" ((:image-figure :image-file "tasty-box-1.png" :caption "Simple box displayed in Tasty"
:width "4in" :height "3in" :width "4in" :height "3in"
:label "fig:tasty-box"))) :label "fig:tasty-box")))
...@@ -182,7 +183,7 @@ ...@@ -182,7 +183,7 @@
(:ref "fig:positioned-boxes-source") (:ref "fig:positioned-boxes-source")
" (rendered in Figure " " (rendered in Figure "
(:ref "fig:positioned-boxes") (:ref "fig:positioned-boxes")
") shows a second box being positioned next to the first, by using the " ") shows a second box being positioned adjacent to the first, by using the "
(:texttt ":center") (:texttt ":center")
" input. ")) " input. "))
...@@ -202,7 +203,7 @@ can be referenced from within its " ...@@ -202,7 +203,7 @@ can be referenced from within its "
" of each individual child object as it is being processed. " of each individual child object as it is being processed.
In this manner it is possible to compute a distinct position for each child, as a function of its In this manner it is possible to compute a distinct position for each child, as a function of its
index, as demonstrated in Figures " index, as demonstrated in Figures "
(:ref "fig:positioned-by-index") (:ref "fig:positioned-by-index-source")
" and " " and "
(:ref "fig:positioned-by-index") (:ref "fig:positioned-by-index")
"." "."
...@@ -212,7 +213,7 @@ index, as demonstrated in Figures " ...@@ -212,7 +213,7 @@ index, as demonstrated in Figures "
((:subsection :title "Relative positioning using the translate operator") ((:subsection :title "Relative positioning using the translate operator")
(:p "It is usually wise to position child objects in a " (:p "It is usually preferable to position child objects in a "
(:emph "relative") (:emph "relative")
" rather than " " rather than "
(:emph "absolute") (:emph "absolute")
...@@ -220,14 +221,14 @@ index, as demonstrated in Figures " ...@@ -220,14 +221,14 @@ index, as demonstrated in Figures "
(:ref "fig:positioned-by-index-source") (:ref "fig:positioned-by-index-source")
", each child box object is being positioned using an absolute coordinate produced by " ", each child box object is being positioned using an absolute coordinate produced by "
(:texttt "make-point") (:texttt "make-point")
". This will work fine as long as the center of the current parent is " ". This will work as long as the center of the current parent is "
(:texttt "#(0.0 0.0 0.0)") (:texttt "#(0.0 0.0 0.0)")
" (which it is, by default). But imagine if this parent " (which it is, by default). But imagine if this parent
itself is a child of a larger assembly. Imagine further that the itself is a child of a larger assembly. Imagine further that the