XEROX THERM 2 4 1 THERM 1 4 By: Jeff Shrager (Shrager@Xerox.com) INTRODUCTION THERM makes variable-controlling thermostats sort of like the things you see in Loops videos, only much simpler and without all the other loops junk. Thermostats looks like this: ((SKETCH NIL VERSION 3 PRIRANGE (11 . 0) SKETCHCONTEXT ((ROUND 1 BLACK) (TERMINAL 12 (MEDIUM REGULAR REGULAR)) (CENTER BASELINE) (CURVE 18.0 8) NIL NIL (CENTER CENTER) (NIL NIL NIL) T NIL NIL 1 NIL)) ((0.11 80.0 (PRI 1)) (BITMAPELT {(READBITMAP)(110 160 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@COOOOOOOOOOOOOOOOOOOOOOOOL@" "@COOOOOOOOOOOOOOOOOOOOOOOOL@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@GL@@@@@GL@@@@@@@@@@@@@@L@" "@C@D@@@@@@D@@@@@@@@@@@@@@@L@" "@C@D@HIF@@D@K@NAJ@@@@@@@@@L@" "@C@D@HII@@D@LIABF@@@@@@@@@L@" "@C@GHHIA@@GHHIABB@@@@@@@@@L@" "@C@D@HIA@@D@HAABB@@@@@@@@@L@" "@C@D@HIA@@D@HAABB@@@@@@@@@L@" "@C@D@HIA@@D@HAABF@@@@@@@@@L@" "@C@D@GAA@@D@H@NAJ@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@C@@@NAHCHG@N@@@@L@" "@C@@@@@@@@E@@AABHDDHIA@@@@L@" "@C@@@@@@@@A@@A@@HDDHIA@@@@L@" "@C@@@@@@@@A@@AN@HDDHIA@@@@L@" "@C@@@@@@@@A@@AA@HDDHIA@@@@L@" "@C@@@@@@@@A@@AA@HDDHIA@@@@L@" "@C@@@@@@@@A@@AA@HDDHIA@@@@L@" "@C@@@@@@@@A@BAA@HDDHIA@@@@L@" "@C@@@@@@@@GLB@NCNCHG@N@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@CCOOOOOOOOOOOOOOOOOOOOOOLL@" "@CCOOOOOOOOOOOOOOOOOOOOOOLL@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@AH@FC@@@@@@@@@@@@@L@" "@C@@@@@@BD@IDH@@@@@@@@@@@@L@" "@C@@@@@@@D@IDH@@@@@@@@@@@@L@" "@C@@@@@@AH@IDH@OL@@@@@@@@@L@" "@C@@@@@@B@@IDH@@@@@@@@@@@@L@" "@C@@@@@@CLHFC@@@@@@@@@@@@@L@" "@C@@@@@@@@H@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@AH@FC@@@@@@@@@@@@@L@" "@C@@@@@@BH@IDH@@@@@@@@@@@@L@" "@C@@@@@@@H@IDH@@@@@@@@@@@@L@" "@C@@@@@@@H@GDH@OL@@@@@@@@@L@" "@C@@@@@@@H@ADH@@@@@@@@@@@@L@" "@C@@@@@@CLHNC@@@@@@@@@@@@@L@" "@C@@@@@@@@H@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@AH@FC@@@@@@@@@@@@@L@" "@C@@@@@@BH@IDH@@@@@@@@@@@@L@" "@C@@@@@@@H@FDH@@@@@@@@@@@@L@" "@C@@@@@@@H@IDH@OL@@@@@@@@@L@" "@C@@@@@@@H@IDH@@@@@@@@@@@@L@" "@C@@@@@@CLHFC@@@@@@@@@@@@@L@" "@C@@@@@@@@H@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@AH@OC@@@@@@@@@@@@@L@" "@C@@@@@@BH@ADH@@@@@@@@@@@@L@" "@C@@@@@@@H@BDH@@@@@@@@@@@@L@" "@C@@@@@@@H@BDH@OL@@@@@@@@@L@" "@C@@@@@@@H@DDH@@@@@@@@@@@@L@" "@C@@@@@@CLHDC@@@@@@@@@@@@@L@" "@C@@@@@@@@H@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@AH@GC@@@@@@@@@@@@@L@" "@C@@@@@@BH@HDH@@@@@@@@@@@@L@" "@C@@@@@@@H@NDH@@@@GOOO@@@@L@" "@C@@@@@@@H@IDH@OL@GOOO@@@@L@" "@C@@@@@@@H@IDH@@@@GOOO@@@@L@" "@C@@@@@@CLHFC@@@@@GOOO@@@@L@" "@C@@@@@@@@H@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@AH@OC@@@@@GOOO@@@@L@" "@C@@@@@@BH@HDH@@@@GOOO@@@@L@" "@C@@@@@@@H@NDH@@@@GOOO@@@@L@" "@C@@@@@@@H@ADH@OL@GOOO@@@@L@" "@C@@@@@@@H@IDH@@@@GOOO@@@@L@" "@C@@@@@@CLHFC@@@@@GOOO@@@@L@" "@C@@@@@@@@H@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@AH@FC@@@@@GOOO@@@@L@" "@C@@@@@@BH@JDH@@@@GOOO@@@@L@" "@C@@@@@@@H@JDH@@@@GOOO@@@@L@" "@C@@@@@@@HABDH@OL@GOOO@@@@L@" "@C@@@@@@@HAODH@@@@GOOO@@@@L@" "@C@@@@@@CLHBC@@@@@GOOO@@@@L@" "@C@@@@@@@@H@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@AH@FC@@@@@GOOO@@@@L@" "@C@@@@@@BH@IDH@@@@GOOO@@@@L@" "@C@@@@@@@H@BDH@@@@GOOO@@@@L@" "@C@@@@@@@H@ADH@OL@GOOO@@@@L@" "@C@@@@@@@H@IDH@@@@GOOO@@@@L@" "@C@@@@@@CLHFC@@@@@GOOO@@@@L@" "@C@@@@@@@@H@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@AH@FC@@@@@GOOO@@@@L@" "@C@@@@@@BH@IDH@@@@GOOO@@@@L@" "@C@@@@@@@H@ADH@@@@GOOO@@@@L@" "@C@@@@@@@H@FDH@OL@GOOO@@@@L@" "@C@@@@@@@H@HDH@@@@GOOO@@@@L@" "@C@@@@@@CLHOC@@@@@GOOO@@@@L@" "@C@@@@@@@@H@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@AH@FC@@@@@GOOO@@@@L@" "@C@@@@@@BH@JDH@@@@GOOO@@@@L@" "@C@@@@@@@H@BDH@@@@GOOO@@@@L@" "@C@@@@@@@H@BDH@OL@GOOO@@@@L@" "@C@@@@@@@H@BDH@@@@GOOO@@@@L@" "@C@@@@@@CLHOC@@@@@GOOO@@@@L@" "@C@@@@@@@@H@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@@@@@@@@@@@GOOO@@@@L@" "@C@@@@@@AH@FC@@@@@GOOO@@@@L@" "@C@@@@@@BH@IDH@@@@GOOO@@@@L@" "@C@@@@@@@H@IDH@@@@GOOO@@@@L@" "@C@@@@@@@H@IDH@OL@GOOO@@@@L@" "@C@@@@@@@H@IDH@@@@@@@@@@@@L@" "@C@@@@@@CLHFC@@@@@@@@@@@@@L@" "@C@@@@@@@@H@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@C@@@@@@@@@@@@@@@@@@@@@@@@L@" "@COOOOOOOOOOOOOOOOOOOOOOOOL@" "@COOOOOOOOOOOOOOOOOOOOOOOOL@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} (88 88 110.0 160.0) 1.0 NIL)) ((0.05 14.0 (PRI 2)) (TEXT (56.0 . 288.0) ("Description") 1 (CENTER BASELINE) (TERMINAL 12 (MEDIUM REGULAR REGULAR)) ((17.5 284.0 77 14)) BLACK)) ((0.0 20.0 (PRI 3)) (WIRE ((64 . 280) (104 . 240)) (ROUND 1 BLACK) (NIL (CURVE 18.0 8)) NIL 1 NIL (NIL ((104 . 240) ((101 . 242) (96.87195 . 243.63193)) ((102 . 243) (100.36808 . 247.12805)))))) ((0.05 14.0 (PRI 4)) (TEXT (216.0 . 272.0) ("Current" "Value") 1 (CENTER BASELINE) (TERMINAL 12 (MEDIUM REGULAR REGULAR)) ((191.5 275.0 49 14) (198.5 261.0 35 14)) BLACK)) ((0.0 20.0 (PRI 5)) (WIRE ((192 . 272) (176 . 232)) (ROUND 1 BLACK) (NIL (CURVE 18.0 8)) NIL 1 NIL (NIL ((176 . 232) ((177 . 236) (176.53038 . 239.98239)) ((178 . 235) (181.12103 . 238.14615)))))) ((0.05 14.0 (PRI 6)) (TEXT (40.0 . 208.0) ("Top" "Value") 1 (CENTER BASELINE) (TERMINAL 12 (MEDIUM REGULAR REGULAR)) ((29.5 211.0 21 14) (22.5 197.0 35 14)) BLACK)) ((0.0 24.0 (PRI 7)) (WIRE ((64 . 216) (112 . 208)) (ROUND 1 BLACK) (NIL (CURVE 18.0 8)) NIL 1 NIL (NIL ((112 . 208) ((108 . 208) (104.08865 . 206.81232)) ((108 . 209) (104.90149 . 211.68932)))))) ((0.05 14.0 (PRI 8)) (TEXT (40.0 . 88.0) ("Bottom" "Value") 1 (CENTER BASELINE) (TERMINAL 12 (MEDIUM REGULAR REGULAR)) ((19.0 91.0 42 14) (22.5 77.0 35 14)) BLACK)) ((0.0 24.0 (PRI 9)) (WIRE ((64 . 88) (112 . 104)) (ROUND 1 BLACK) (NIL (CURVE 18.0 8)) NIL 1 NIL (NIL ((112 . 104) ((109 . 102) (105.56375 . 99.248726)) ((108 . 104) (104.00023 . 103.93927)))))) ((0.05 14.0 (PRI 10)) (TEXT (240.0 . 160.0) ("Thermal" "Index") 1 (CENTER BASELINE) (TERMINAL 12 (MEDIUM REGULAR REGULAR)) ((215.5 163.0 49 14) (222.5 149.0 35 14)) BLACK)) ((0.0 20.0 (PRI 11)) (WIRE ((216 . 160) (176 . 160)) (ROUND 1 BLACK) (NIL (CURVE 18.0 8)) NIL 1 NIL (NIL ((176 . 160) ((180 . 161) (183.60844 . 162.47214)) ((180 . 159) (183.60844 . 157.52786))))))) (17.5 77.0 246.5 221.0) 1.0 8 USAGE (USER::MAKE-THERMOSTAT :TOP-VALUE value :BOTTOM-VALUE value :VARIABLE 'varname :DESCRIPTION "some text") [Function] A thermostat is a structure. Calling MAKE-THERMOSTAT returns an instance of a thermostat which you pass to... (USER::CONSTRUCT-THERMOSTAT thermostat) [Function] Let's the user place the thermostat someplace on the screen. EXAMPLE (DEFVAR *FOO* 0.5) (CONSTRUCT-THERMOSTAT (MAKE-THERMOSTAT :TOP-VALUE 5.0 :BOTTOM-VALUE 0.0 :VARIABLE '*FOO* :DESCRIPTION "An example.")) Note, the variable must be set before calling MAKE-THERMOSTAT. DEFVAR will do this for you, and will ensure that the var is global, which is obviously important. CAVEAT USER This is a simple and useful hack, but it's just that. Here are some known problems and restrictions that should be worked out when someone gets the time. -- I think that you can't actually get to your real bottom value. That is, if you give it a bottom value of 0.0, the lowest term you can really get is 0.0+the least increment (say about 0.005). -- The user should be able to specify lots of parameters like where to put the termostat instead of it always getting placed by mouse; the size of the window; the texture of the thermal index; the number of scale increments; etc. (LIST ((PAGE NIL (PAPERSIZE LETTER STARTINGPAGE# 267) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO NIL) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE NIL . LETTER) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO NIL) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE NIL . LETTER) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO NIL) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL)))))(È(È(ŠŠ8(ŠŠ8DÈÈ PAGEHEADING RUNNINGHEADMODERN MODERN MODERN MODERNLOGO HRULE.GETFNMODERN  HRULE.GETFNMODERN  HRULE.GETFNMODERN  HRULE.GETFNMODERN  HRULE.GETFNMODERN & ´[ SKIO.GETFN.2MODERN to4=41£ ›Åç"MAzº