<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>