339 lines
21 KiB
HTML
339 lines
21 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<link rel="stylesheet" href="../coverage.css"/> <title> walkmap/svg.clj </title>
|
|
</head>
|
|
<body>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
001 (ns walkmap.svg
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
002 "Utility functions for writing stereolithography (STL) files (and possibly,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
003 later, other geometry files of interest to us) as scalable vector graphics
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
004 (SVG)."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
005 (:require [clojure.java.io :as io]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
006 [clojure.string :as s]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
007 [clojure.xml :as x]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
008 [dali.io :as neatly-folded-clock]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
009 [hiccup.core :refer [html]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
010 [taoensso.timbre :as l :refer [info error spy]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
011 [walkmap.ocean :refer [cull-ocean-facets]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
012 [walkmap.polygon :refer [polygon?]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
013 [walkmap.stl :refer [decode-binary-stl]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
014 [walkmap.vertex :refer [vertex?]]))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
015
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
016 (def ^:dynamic *preferred-svg-render*
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
017 "Mainly for debugging dali; switch SVG renderer to use. Expected values:
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
018 `:dali`, `:hiccup`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
019 :dali)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
020
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
021 (defn- facet->svg-poly
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
022 [facet]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
023 [:polygon
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 20 forms covered">
|
|
024 {:points (s/join " " (map #(str (:x %) "," (:y %)) (:vertices facet)))}])
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
025
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
026 (defn- dali-facet->svg-poly
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
027 [facet]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
028 (vec
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
029 (cons
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
030 :polygon
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 16 forms covered">
|
|
031 (map #(vec (list (:x %) (:y %))) (:vertices facet)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
032
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
033 (defn dali-stl->svg
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
034 "Format this `stl` as SVG for the `dali` renderer on a page with these
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
035 bounds."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
036 [stl minx maxx miny maxy]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
037 [:dali/page
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
038 {:xmlns "http://www.w3.org/2000/svg"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
039 :version "1.2"
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
040 :width (- maxx minx)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
041 :height (- maxy miny)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
042 :viewBox (s/join " " (map str [minx miny maxx maxy]))}
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
043 (vec
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
044 (cons
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
045 :g
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
046 (map
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
047 dali-facet->svg-poly
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
048 (:facets stl))))])
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
049
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
050 (defn hiccup-stl->svg
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
051 "Format this `stl` as SVG for the `hiccup` renderer on a page with these
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
052 bounds."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
053 [stl minx maxx miny maxy]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
054 [:svg
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
055 {:xmlns "http://www.w3.org/2000/svg"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
056 :version "1.2"
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
057 :width (- maxx minx)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
058 :height (- maxy miny)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
059 :viewBox (s/join " " (map str [minx miny maxx maxy]))}
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
060 (vec
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
061 (cons
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
062 :g
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
063 (map
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
064 facet->svg-poly
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
065 (:facets stl))))])
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
066
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
067 (defn stl->svg
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
068 "Convert this in-memory `stl` structure, as read by `decode-binary-stl`, into
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
069 an in-memory hiccup representation of SVG structure, and return it."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
070 [stl]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
071 (let [minx (reduce
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
072 min
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
073 (map
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
074 #(reduce min (map :x (:vertices %)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
075 (:facets stl)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
076 maxx (reduce
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
077 max
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
078 (map
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
079 #(reduce max (map :x (:vertices %)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
080 (:facets stl)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
081 miny (reduce
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
082 min
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
083 (map
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
084 #(reduce min (map :y (:vertices %)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
085 (:facets stl)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
086 maxy (reduce
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
087 max
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
088 (map
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
089 #(reduce max (map :y (:vertices %)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
090 (:facets stl)))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
091 (l/info "Generating SVG for " *preferred-svg-render* " renderer")
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
092 (case *preferred-svg-render*
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
093 :hiccup (hiccup-stl->svg stl minx maxx miny maxy)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
094 :dali (dali-stl->svg stl minx maxx miny maxy)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
095 (throw (Exception. "Unexpected renderer value: " *preferred-svg-render*)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
096
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
097 (defn binary-stl-file->svg
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
098 "Given only an `in-filename`, parse the indicated file, expected to be
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
099 binary STL, and return an equivalent SVG structure. Given both `in-filename`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
100 and `out-filename`, as side-effect write the SVG to the indicated output file."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
101 ([in-filename]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
102 (stl->svg (cull-ocean-facets (decode-binary-stl in-filename))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
103 ([in-filename out-filename]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
104 (let [s (binary-stl-file->svg in-filename)]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
105 (l/info "Emitting SVG with " *preferred-svg-render* " renderer")
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
106 (case *preferred-svg-render*
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
107 :dali (neatly-folded-clock/render-svg s out-filename)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
108 :hiccup (spit out-filename (html s))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
109 (throw (Exception. "Unexpected renderer value: " *preferred-svg-render*)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
110 s)))
|
|
</span><br/>
|
|
</body>
|
|
</html>
|