├── BE1275x.ild ├── LICENSE.txt ├── README.md ├── example_files ├── ILDA.py ├── dac.py ├── reproduce_ilda.py ├── reproduce_one_frame_ilda.py ├── talk.py └── watch.py ├── interface_ss.jpg ├── laser_geom_tool ├── GUI_screenshot.png ├── README.md ├── dac.py ├── laser_borders.py ├── laser_borders.pyc ├── laser_borders.ui └── start_GUI.py ├── sitter.py └── web_engine ├── .project ├── .pydevproject ├── DEFORMED_DXFTOILDA ├── DXF_TO_ILDA ├── ILDA.py ├── LaserBoy_dxf_to_ilda_tool ├── MARC_THING ├── dac.py ├── external └── jquery │ └── jquery.js ├── images ├── ui-bg_diagonals-thick_18_b81900_40x40.png ├── ui-bg_diagonals-thick_20_666666_40x40.png ├── ui-bg_flat_10_000000_40x100.png ├── ui-bg_glass_100_f6f6f6_1x400.png ├── ui-bg_glass_100_fdf5ce_1x400.png ├── ui-bg_glass_65_ffffff_1x400.png ├── ui-bg_gloss-wave_35_f6a828_500x100.png ├── ui-bg_highlight-soft_100_eeeeee_1x100.png ├── ui-bg_highlight-soft_75_ffe45c_1x100.png ├── ui-icons_222222_256x240.png ├── ui-icons_228ef1_256x240.png ├── ui-icons_ef8c08_256x240.png ├── ui-icons_ffd27a_256x240.png └── ui-icons_ffffff_256x240.png ├── index.html ├── jquery-ui.css ├── jquery-ui.js ├── jquery-ui.min.css ├── jquery-ui.min.js ├── jquery-ui.structure.css ├── jquery-ui.structure.min.css ├── jquery-ui.theme.css ├── jquery-ui.theme.min.css ├── reproduce_one_frame_ilda.py ├── translation_dxf.py ├── uploaded ├── BE1275x.ild ├── Be1x.dxf ├── Be1x.ild ├── Be1x.ilda ├── Be1x_translation.dxf └── IMG_20141024_231525.jpg └── webserver.py /BE1275x.ild: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/awesomebytes/etherdream_tools/7ba3ba4828f43f323d76064ec0432b25b85f6e58/BE1275x.ild -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 Sammy Pfeiffer 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions 6 | are met: 7 | 1. Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | 2. Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | 3. Neither the name of copyright holders nor the names of its 13 | contributors may be used to endorse or promote products derived 14 | from this software without specific prior written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 | ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 | PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS 20 | BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 | POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | etherdream_tools 2 | ================ 3 | 4 | A web interface for the etherdream DAC mostly in Python interfacing with DXF and ILDA files to stream them. 5 | It lets you choose a dxf file to be converted to ILDA (with translation if needed) or an ILDA file and stream it with a laser. Also set the laser PPS dynamically and stop the projection. 6 | 7 | ![Web interface screenshot](https://raw.githubusercontent.com/awesomebytes/etherdream_tools/master/interface_ss.jpg "Web interface screenshot") 8 | 9 | Just run ```web_engine/webserver.py``` and go to [localhost 8080 port](http://localhost:8080) on your browser. By default it needs no DAC connected to test the web interface. To change that go to that file and modify ```USE_DAC = False``` to ```True```. 10 | 11 | === 12 | 13 | To use you need to have installed the Python libraries (hints for Ubuntu 12.04 Python 2.7): 14 | 15 | **liblo** 16 | 17 | ```sudo apt-get install python-liblo``` 18 | 19 | **ezdxf** 20 | 21 | ```sudo pip install ezdxf``` 22 | 23 | The tool ```sitter.py``` is the official little GUI for finding the DAC IP (and some extra info). 24 | 25 | === 26 | 27 | In the web_engine folder you can find all the candy: 28 | 29 | ```ILDA.py``` gives the ability to open ILDA files 30 | 31 | ```dac.py``` is the interface with etherdream DAC 32 | 33 | === 34 | 35 | In example_files: 36 | 37 | ```watch.py``` and ```talk.py``` are the examples provided in [the official j4cDAC repo](https://github.com/j4cbo/j4cDAC) in the tools folder. 38 | -------------------------------------------------------------------------------- /example_files/ILDA.py: -------------------------------------------------------------------------------- 1 | """ 2 | ILDA.py 3 | 4 | Python module for dealing with the ILDA Image Data Transfer Format, 5 | an interchange format for laser image frames. 6 | 7 | Copyright (c) 2008 Micah Dowty 8 | 9 | Permission is hereby granted, free of charge, to any person 10 | obtaining a copy of this software and associated documentation 11 | files (the "Software"), to deal in the Software without 12 | restriction, including without limitation the rights to use, copy, 13 | modify, merge, publish, distribute, sublicense, and/or sell copies 14 | of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be 18 | included in all copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 24 | BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 25 | ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 26 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 27 | SOFTWARE. 28 | 29 | """ 30 | 31 | from __future__ import division 32 | 33 | import struct 34 | 35 | # Format codes 36 | FORMAT_3D = 0 37 | FORMAT_2D = 1 38 | FORMAT_COLOR_TABLE = 2 39 | 40 | # Mapping from FORMAT_* codes to struct format strings 41 | formatTable = ( 42 | '>hhhH', 43 | '>hhH', 44 | '>BBB', 45 | ) 46 | 47 | # Header values 48 | HEADER_MAGIC = "ILDA\0\0\0" 49 | HEADER_RESERVED = 0 50 | HEADER_FORMAT = ">7sB16sHHHBB" 51 | HEADER_LEN = struct.calcsize(HEADER_FORMAT) 52 | 53 | 54 | class Table(object): 55 | """Container object for one ILDA table: either a frame (table of points) 56 | or a palette (table of colors). 57 | 58 | The 'items' list contains the data within this table. Each item 59 | is a tuple, corresponding to the raw values within that row of the 60 | table. 61 | 62 | 2D frame: (x, y, status) 63 | 3D frame: (x, y, z, status) 64 | Color: (r, g, b) 65 | 66 | """ 67 | def __init__(self, format=FORMAT_2D, name="", 68 | length=0, number=0, total=0, scanHead=0): 69 | self.__dict__.update(locals()) 70 | self.items = [] 71 | self.itemsproducer = None 72 | 73 | def __repr__(self): 74 | return ("" % 76 | (self.format, self.name, self.length, self.number, 77 | self.total, self.scanHead)) 78 | 79 | def unpackHeader(self, data): 80 | magic, self.format, self.name, self.length, \ 81 | self.number, self.total, self.scanHead, \ 82 | reserved = struct.unpack(HEADER_FORMAT, data) 83 | 84 | if magic != HEADER_MAGIC: 85 | raise ValueError("Bad ILDA header magic. Not an ILDA file?") 86 | if reserved != HEADER_RESERVED: 87 | raise ValueError("Reserved ILDA field is not zero.") 88 | 89 | def packHeader(self): 90 | return struct.pack(HEADER_FORMAT, HEADER_MAGIC, self.format, 91 | self.name, self.length, self.number, 92 | self.total, self.scanHead, HEADER_RESERVED) 93 | 94 | def readHeader(self, stream): 95 | self.unpackHeader(stream.read(HEADER_LEN)) 96 | 97 | def writeHeader(self, stream): 98 | stream.write(self.packHeader()) 99 | 100 | def _getItemFormat(self): 101 | try: 102 | return formatTable[self.format] 103 | except IndexError: 104 | raise ValueError("Unsupported format code") 105 | 106 | def read_stream(self, stream): 107 | """Read the header, then read all items in this table.""" 108 | self.readHeader(stream) 109 | if self.length: 110 | fmt = self._getItemFormat() 111 | itemSize = struct.calcsize(fmt) 112 | self.items = [struct.unpack(fmt, stream.read(itemSize)) 113 | for i in xrange(self.length)] 114 | self.itemsproducer = self.produce() 115 | 116 | def write(self, stream): 117 | """Write the header, then write all items in this table.""" 118 | self.writeHeader(stream) 119 | if self.length: 120 | fmt = self._getItemFormat() 121 | itemSize = struct.calcsize(fmt) 122 | stream.write(''.join([struct.pack(fmt, *item) 123 | for item in self.items])) 124 | 125 | def iterPoints(self): 126 | """Iterate over Point instances for each item in this table. 127 | Only makes sense if this is a 2D or 3D point table. 128 | """ 129 | for item in self.items: 130 | p = Point() 131 | p.decode(item) 132 | yield p 133 | 134 | 135 | def produce(self): 136 | """Iterate over Point instances for each item in this table. 137 | Only makes sense if this is a 2D or 3D point table. 138 | """ 139 | while True: 140 | for item in self.items: 141 | p = Point() 142 | p.decode(item) 143 | yield p.encode() 144 | #yield (p.x, p.y, p.z, p.color, p.blanking) 145 | 146 | def read(self, cap): 147 | """yields what dac.play_stream() needs (x, y, z, ?, ?) 148 | """ 149 | return [self.itemsproducer.next() for i in xrange(cap)] 150 | 151 | 152 | class Point: 153 | """Abstraction for one vector point. The Table object, for 154 | completeness and efficiency, stores raw tuples for each 155 | point. This is a higher level interface that decodes the status 156 | bits and represents coordinates in floating point. 157 | """ 158 | def __init__(self, x=0.0, y=0.0, z=0.0, color=0, blanking=False): 159 | self.__dict__.update(locals()) 160 | 161 | def __repr__(self): 162 | return "" % ( 163 | self.x, self.y, self.z, self.color, self.blanking) 164 | 165 | def encode(self): 166 | status = self.color & 0xFF 167 | if self.blanking: 168 | status |= 1 << 14 169 | 170 | return ( 171 | int( min(0x7FFF, max(-0x7FFF, self.x * 0x7FFF)) ), 172 | int( min(0x7FFF, max(-0x7FFF, self.y * 0x7FFF)) ), 173 | int( min(0x7FFF, max(-0x7FFF, self.z * 0x7FFF)) ), 174 | int( min(0x7FFF, max(-0x7FFF, self.color * 0x7FFF)) ), 175 | int( min(0x7FFF, max(-0x7FFF, self.blanking * 0x7FFF)) ) 176 | ) 177 | 178 | def decode(self, t): 179 | #print "~~ Decoding, t of len "+ str(len(t)) +" is: " + str(t) 180 | self.x = t[0] / 0x7FFF 181 | self.y = t[1] / 0x7FFF 182 | if len(t) > 3: 183 | self.z = t[2] / 0x7FFF 184 | # self.color = t[3] & 0xFF 185 | # self.blanking = (t[3] & (1 << 14)) != 0 186 | else: 187 | self.z = 0.0 188 | 189 | self.color = t[-1] & 0xFF 190 | self.blanking = (t[-1] & (1 << 14)) != 0 191 | 192 | 193 | def read(stream): 194 | """Read ILDA data from a stream until we hit the 195 | end-of-stream marker. Yields a sequence of Table objects. 196 | """ 197 | while True: 198 | t = Table() 199 | t.read_stream(stream) 200 | if not t.length: 201 | # End-of-stream 202 | break 203 | yield t 204 | 205 | 206 | def write(stream, tables): 207 | """Write a sequence of tables in ILDA format, 208 | terminated by an end-of-stream marker. 209 | """ 210 | for t in tables: 211 | t.write(stream) 212 | Table().write(stream) 213 | 214 | 215 | def readFrames(stream): 216 | """Read ILDA data from a stream, and ignore 217 | all non-frame tables. Yields only 2D or 3D 218 | point tables. 219 | """ 220 | for t in read(stream): 221 | if t.format in (FORMAT_2D, FORMAT_3D): 222 | yield t 223 | 224 | 225 | def readFirstFrame(stream): 226 | """Read only a single frame from an ILDA stream.""" 227 | for frame in readFrames(stream): 228 | return frame 229 | 230 | 231 | if __name__ == "__main__": 232 | # Test program- dump frames and points from a file whose name is 233 | # specified on the command line 234 | 235 | import sys 236 | 237 | f = open(sys.argv[1], 'rb') 238 | for t in readFrames(f): 239 | for p in t.iterPoints(): 240 | print "\t%r" % p 241 | -------------------------------------------------------------------------------- /example_files/dac.py: -------------------------------------------------------------------------------- 1 | # j4cDAC test code 2 | # 3 | # Copyright 2011 Jacob Potter 4 | # 5 | # This program is free software: you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation, version 3. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program. If not, see . 16 | 17 | import socket 18 | import time 19 | import struct 20 | 21 | def pack_point(x, y, r, g, b, i = -1, u1 = 0, u2 = 0, flags = 0): 22 | """Pack some color values into a struct dac_point. 23 | 24 | Values must be specified for x, y, r, g, and b. If a value is not 25 | passed in for the other fields, i will default to max(r, g, b); the 26 | rest default to zero. 27 | """ 28 | 29 | if i < 0: 30 | i = max(r, g, b) 31 | 32 | return struct.pack(" len(self.buf): 101 | self.buf += self.conn.recv(4096) 102 | 103 | obuf = self.buf 104 | self.buf = obuf[l:] 105 | return obuf[:l] 106 | 107 | def readresp(self, cmd): 108 | """Read a response from the DAC.""" 109 | data = self.read(22) 110 | response = data[0] 111 | cmdR = data[1] 112 | status = Status(data[2:]) 113 | 114 | # status.dump() 115 | 116 | if cmdR != cmd: 117 | raise ProtocolError("expected resp for %r, got %r" 118 | % (cmd, cmdR)) 119 | 120 | if response != "a": 121 | raise ProtocolError("expected ACK, got %r" 122 | % (response, )) 123 | 124 | self.last_status = status 125 | return status 126 | 127 | def __init__(self, host, port = 7765): 128 | """Connect to the DAC over TCP.""" 129 | conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 130 | conn.connect((host, port)) 131 | conn.settimeout(1) 132 | self.conn = conn 133 | self.buf = "" 134 | 135 | # Read the "hello" message 136 | first_status = self.readresp("?") 137 | first_status.dump() 138 | 139 | self.conn.sendall('v') 140 | self.firmware_string = self.read(32).replace("\x00", " ").strip() 141 | print "Firmware: %s" % (self.firmware_string, ) 142 | 143 | def begin(self, lwm, rate): 144 | """Set lwm = low water mark, and PPS rate""" 145 | cmd = struct.pack(". 18 | 19 | import sys 20 | import ILDA 21 | from ILDA import readFrames 22 | import dac 23 | 24 | #dac.find_dac() 25 | 26 | if __name__ == "__main__": 27 | 28 | if len(sys.argv) < 2: 29 | print "Usage:" 30 | print sys.argv[0] + " filename" 31 | exit(0) 32 | filename = sys.argv[1] 33 | 34 | print "Finding DAC..." 35 | d = dac.DAC(dac.find_first_dac()) 36 | print "DAC found!" 37 | 38 | print "Opening: " + filename 39 | f = open(filename, 'rb') 40 | print "Opened!" 41 | 42 | 43 | 44 | while True: 45 | f = open(sys.argv[1], 'rb') 46 | for num, t in enumerate(readFrames(f)): 47 | print "table #" + str(num) + " " 48 | #print t 49 | #print " with points:" 50 | #for p in t.iterPoints(): 51 | #print "\t%r" % p 52 | 53 | print "sending table to stream" 54 | try: 55 | d.play_stream(t) 56 | except Exception, e: 57 | print "Exception : " + str(e) 58 | exit(0) 59 | print "//////// Ended loop of reading frames" 60 | f.close() 61 | 62 | 63 | exit(0) 64 | print "We are done with the file" 65 | -------------------------------------------------------------------------------- /example_files/reproduce_one_frame_ilda.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # j4cDAC test code 4 | # 5 | # Copyright 2011 Jacob Potter 6 | # 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, version 3. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this program. If not, see . 18 | 19 | import sys 20 | import ILDA 21 | from ILDA import readFrames, readFirstFrame 22 | import dac 23 | 24 | #dac.find_dac() 25 | 26 | if __name__ == "__main__": 27 | 28 | if len(sys.argv) < 2: 29 | print "Usage:" 30 | print sys.argv[0] + " filename" 31 | exit(0) 32 | filename = sys.argv[1] 33 | 34 | print "Finding DAC..." 35 | d = dac.DAC(dac.find_first_dac()) 36 | print "DAC found!" 37 | 38 | f = open(sys.argv[1], 'rb') 39 | first_frame = readFirstFrame(f) 40 | f.close() 41 | try: 42 | d.play_stream(first_frame) 43 | except Exception, e: 44 | print "Exception : " + str(e) 45 | exit(0) 46 | -------------------------------------------------------------------------------- /example_files/talk.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # j4cDAC test code 4 | # 5 | # Copyright 2011 Jacob Potter 6 | # 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, version 3. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this program. If not, see . 18 | 19 | import dac 20 | 21 | class SquarePointStream(object): 22 | def produce(self): 23 | pmax = 15600 24 | pstep = 100 25 | cmax = 65535 26 | while True: 27 | for x in xrange(-pmax, pmax, pstep): 28 | yield (x, pmax, cmax, 0, 0) 29 | for y in xrange(pmax, -pmax, -pstep): 30 | yield (pmax, y, 0, cmax, 0) 31 | for x in xrange(pmax, -pmax, -pstep): 32 | yield (x, -pmax, 0, 0, cmax) 33 | for y in xrange(-pmax, pmax, pstep): 34 | yield (-pmax, y, cmax, cmax, cmax) 35 | 36 | def __init__(self): 37 | self.stream = self.produce() 38 | 39 | def read(self, n): 40 | return [self.stream.next() for i in xrange(n)] 41 | 42 | class NullPointStream(object): 43 | def read(self, n): 44 | return [(0, 0, 0, 0, 0)] * n 45 | 46 | #dac.find_dac() 47 | 48 | d = dac.DAC(dac.find_first_dac()) 49 | 50 | d.play_stream(SquarePointStream()) 51 | -------------------------------------------------------------------------------- /example_files/watch.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # j4cDAC test code 4 | # 5 | # Copyright 2011 Jacob Potter 6 | # 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, version 3. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this program. If not, see . 18 | 19 | import dac 20 | 21 | dac.find_dac() 22 | -------------------------------------------------------------------------------- /interface_ss.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/awesomebytes/etherdream_tools/7ba3ba4828f43f323d76064ec0432b25b85f6e58/interface_ss.jpg -------------------------------------------------------------------------------- /laser_geom_tool/GUI_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/awesomebytes/etherdream_tools/7ba3ba4828f43f323d76064ec0432b25b85f6e58/laser_geom_tool/GUI_screenshot.png -------------------------------------------------------------------------------- /laser_geom_tool/README.md: -------------------------------------------------------------------------------- 1 | This is a GUI for sending OSC messages with the coordinates of the corners to the 2 | etherdream DAC as explained: http://ether-dream.com/userguide.html 3 | 4 | ![GUI screenshot](https://raw.githubusercontent.com/awesomebytes/etherdream_tools/master/laser_geom_tool/GUI_screenshot.png "GUI PyQt4 screenshot") 5 | 6 | Done with PyQt4 using designer (5.3). 7 | 8 | Tested with the tool (that comes with the liblo library, sudo apt-get install python-liblo): 9 | dump_osc 60000 10 | 11 | 12 | Maybe needed: 13 | 14 | sudo apt-get install pyqt-tools pyqt4-dev-tools 15 | 16 | To generate a new library of the GUI if you edit laser_borders.ui with Qt designer: 17 | 18 | pyuic4 laser_borders.ui > laser_borders.py 19 | 20 | Bonus: Learnt how to do it following the following tutorials: 21 | 22 | http://www.rkblog.rk.edu.pl/w/p/simple-text-editor-pyqt4/ 23 | 24 | http://www.rkblog.rk.edu.pl/w/p/extending-pyqt4-text-editor/ 25 | -------------------------------------------------------------------------------- /laser_geom_tool/dac.py: -------------------------------------------------------------------------------- 1 | # j4cDAC test code 2 | # 3 | # Copyright 2011 Jacob Potter 4 | # 5 | # This program is free software: you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation, version 3. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program. If not, see . 16 | 17 | import socket 18 | import time 19 | import struct 20 | 21 | def pack_point(x, y, r, g, b, i = -1, u1 = 0, u2 = 0, flags = 0): 22 | """Pack some color values into a struct dac_point. 23 | 24 | Values must be specified for x, y, r, g, and b. If a value is not 25 | passed in for the other fields, i will default to max(r, g, b); the 26 | rest default to zero. 27 | """ 28 | 29 | if i < 0: 30 | i = max(r, g, b) 31 | 32 | return struct.pack(" len(self.buf): 101 | self.buf += self.conn.recv(4096) 102 | 103 | obuf = self.buf 104 | self.buf = obuf[l:] 105 | return obuf[:l] 106 | 107 | def readresp(self, cmd): 108 | """Read a response from the DAC.""" 109 | data = self.read(22) 110 | response = data[0] 111 | cmdR = data[1] 112 | status = Status(data[2:]) 113 | 114 | # status.dump() 115 | 116 | if cmdR != cmd: 117 | raise ProtocolError("expected resp for %r, got %r" 118 | % (cmd, cmdR)) 119 | 120 | if response != "a": 121 | raise ProtocolError("expected ACK, got %r" 122 | % (response, )) 123 | 124 | self.last_status = status 125 | return status 126 | 127 | def __init__(self, host, port = 7765): 128 | """Connect to the DAC over TCP.""" 129 | conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 130 | conn.connect((host, port)) 131 | conn.settimeout(1) 132 | self.conn = conn 133 | self.buf = "" 134 | 135 | # Read the "hello" message 136 | first_status = self.readresp("?") 137 | first_status.dump() 138 | 139 | self.conn.sendall('v') 140 | self.firmware_string = self.read(32).replace("\x00", " ").strip() 141 | print "Firmware: %s" % (self.firmware_string, ) 142 | 143 | def begin(self, lwm, rate): 144 | """Set lwm = low water mark, and PPS rate""" 145 | cmd = struct.pack(" 2 | 3 | laser_main 4 | 5 | 6 | 7 | 0 8 | 0 9 | 800 10 | 600 11 | 12 | 13 | 14 | Laser geometry setter 15 | 16 | 17 | 18 | 19 | 20 | 310 21 | 420 22 | 115 23 | 31 24 | 25 | 26 | 27 | Send Coords 28 | 29 | 30 | 31 | 32 | 33 | 120 34 | 160 35 | 77 36 | 31 37 | 38 | 39 | 40 | 3 41 | 42 | 43 | -1.000000000000000 44 | 45 | 46 | 1.000000000000000 47 | 48 | 49 | 0.001000000000000 50 | 51 | 52 | -1.000000000000000 53 | 54 | 55 | 56 | 57 | 58 | 240 59 | 160 60 | 77 61 | 31 62 | 63 | 64 | 65 | 3 66 | 67 | 68 | -1.000000000000000 69 | 70 | 71 | 1.000000000000000 72 | 73 | 74 | 0.001000000000000 75 | 76 | 77 | 1.000000000000000 78 | 79 | 80 | 81 | 82 | 83 | 120 84 | 270 85 | 77 86 | 31 87 | 88 | 89 | 90 | 3 91 | 92 | 93 | -1.000000000000000 94 | 95 | 96 | 1.000000000000000 97 | 98 | 99 | 0.001000000000000 100 | 101 | 102 | -1.000000000000000 103 | 104 | 105 | 106 | 107 | 108 | 240 109 | 270 110 | 77 111 | 31 112 | 113 | 114 | 115 | 3 116 | 117 | 118 | -1.000000000000000 119 | 120 | 121 | 1.000000000000000 122 | 123 | 124 | 0.001000000000000 125 | 126 | 127 | -1.000000000000000 128 | 129 | 130 | 131 | 132 | 133 | 430 134 | 160 135 | 77 136 | 31 137 | 138 | 139 | 140 | 3 141 | 142 | 143 | -1.000000000000000 144 | 145 | 146 | 1.000000000000000 147 | 148 | 149 | 0.001000000000000 150 | 151 | 152 | 1.000000000000000 153 | 154 | 155 | 156 | 157 | 158 | 560 159 | 160 160 | 77 161 | 31 162 | 163 | 164 | 165 | 3 166 | 167 | 168 | -1.000000000000000 169 | 170 | 171 | 1.000000000000000 172 | 173 | 174 | 0.001000000000000 175 | 176 | 177 | 1.000000000000000 178 | 179 | 180 | 181 | 182 | 183 | 430 184 | 270 185 | 77 186 | 31 187 | 188 | 189 | 190 | 3 191 | 192 | 193 | -1.000000000000000 194 | 195 | 196 | 1.000000000000000 197 | 198 | 199 | 0.001000000000000 200 | 201 | 202 | 1.000000000000000 203 | 204 | 205 | 206 | 207 | 208 | 560 209 | 270 210 | 77 211 | 31 212 | 213 | 214 | 215 | 3 216 | 217 | 218 | -1.000000000000000 219 | 220 | 221 | 1.000000000000000 222 | 223 | 224 | 0.001000000000000 225 | 226 | 227 | -1.000000000000000 228 | 229 | 230 | 231 | 232 | 233 | 180 234 | 90 235 | 80 236 | 21 237 | 238 | 239 | 240 | Top Left 241 | 242 | 243 | 244 | 245 | 246 | 500 247 | 90 248 | 80 249 | 21 250 | 251 | 252 | 253 | Top Right 254 | 255 | 256 | 257 | 258 | 259 | 159 260 | 220 261 | 111 262 | 21 263 | 264 | 265 | 266 | Bottom left 267 | 268 | 269 | 270 | 271 | 272 | 479 273 | 220 274 | 111 275 | 21 276 | 277 | 278 | 279 | Bottom right 280 | 281 | 282 | 283 | 284 | 285 | 150 286 | 130 287 | 80 288 | 21 289 | 290 | 291 | 292 | x 293 | 294 | 295 | 296 | 297 | 298 | 270 299 | 130 300 | 80 301 | 21 302 | 303 | 304 | 305 | y 306 | 307 | 308 | 309 | 310 | 311 | 580 312 | 130 313 | 80 314 | 21 315 | 316 | 317 | 318 | y 319 | 320 | 321 | 322 | 323 | 324 | 460 325 | 130 326 | 80 327 | 21 328 | 329 | 330 | 331 | x 332 | 333 | 334 | 335 | 336 | 337 | 270 338 | 240 339 | 80 340 | 21 341 | 342 | 343 | 344 | y 345 | 346 | 347 | 348 | 349 | 350 | 150 351 | 240 352 | 80 353 | 21 354 | 355 | 356 | 357 | x 358 | 359 | 360 | 361 | 362 | 363 | 580 364 | 240 365 | 80 366 | 21 367 | 368 | 369 | 370 | y 371 | 372 | 373 | 374 | 375 | 376 | 460 377 | 240 378 | 80 379 | 21 380 | 381 | 382 | 383 | x 384 | 385 | 386 | 387 | 388 | 389 | 370 390 | 20 391 | 241 392 | 31 393 | 394 | 395 | 396 | 192.168.0.10 397 | 398 | 399 | 400 | 401 | 402 | 200 403 | 20 404 | 115 405 | 31 406 | 407 | 408 | 409 | Search DAC 410 | 411 | 412 | 413 | 414 | 415 | 60 416 | 320 417 | 501 418 | 31 419 | 420 | 421 | 422 | Note: Messages will be sent when modifying the Spin Boxes 423 | 424 | 425 | 426 | 427 | 428 | 110 429 | 350 430 | 491 431 | 31 432 | 433 | 434 | 435 | and when hitting "Send Coords" to the IP in the EditBox. 436 | 437 | 438 | 439 | 440 | 441 | 442 | 0 443 | 0 444 | 800 445 | 29 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | tl_x 455 | valueChanged(double) 456 | button_send 457 | click() 458 | 459 | 460 | 108 461 | 134 462 | 463 | 464 | 327 465 | 334 466 | 467 | 468 | 469 | 470 | tl_y 471 | valueChanged(double) 472 | button_send 473 | click() 474 | 475 | 476 | 228 477 | 134 478 | 479 | 480 | 327 481 | 334 482 | 483 | 484 | 485 | 486 | tr_x 487 | valueChanged(double) 488 | button_send 489 | click() 490 | 491 | 492 | 418 493 | 134 494 | 495 | 496 | 327 497 | 334 498 | 499 | 500 | 501 | 502 | tr_y 503 | valueChanged(double) 504 | button_send 505 | click() 506 | 507 | 508 | 548 509 | 134 510 | 511 | 512 | 327 513 | 334 514 | 515 | 516 | 517 | 518 | bl_x 519 | valueChanged(double) 520 | button_send 521 | click() 522 | 523 | 524 | 108 525 | 244 526 | 527 | 528 | 327 529 | 334 530 | 531 | 532 | 533 | 534 | bl_y 535 | valueChanged(double) 536 | button_send 537 | click() 538 | 539 | 540 | 228 541 | 244 542 | 543 | 544 | 327 545 | 334 546 | 547 | 548 | 549 | 550 | br_x 551 | valueChanged(double) 552 | button_send 553 | click() 554 | 555 | 556 | 418 557 | 244 558 | 559 | 560 | 327 561 | 334 562 | 563 | 564 | 565 | 566 | br_y 567 | valueChanged(double) 568 | button_send 569 | click() 570 | 571 | 572 | 548 573 | 244 574 | 575 | 576 | 327 577 | 334 578 | 579 | 580 | 581 | 582 | 583 | -------------------------------------------------------------------------------- /laser_geom_tool/start_GUI.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | import sys 3 | from PyQt4 import QtCore, QtGui 4 | from laser_borders import Ui_laser_main 5 | import liblo 6 | 7 | class StartQT4(QtGui.QMainWindow): 8 | def __init__(self, parent=None): 9 | QtGui.QWidget.__init__(self, parent) 10 | self.ui = Ui_laser_main() 11 | self.ui.setupUi(self) 12 | # here we connect signals with our slots 13 | QtCore.QObject.connect(self.ui.button_send,QtCore.SIGNAL("clicked()"), self.send_message) 14 | QtCore.QObject.connect(self.ui.button_searchdac,QtCore.SIGNAL("clicked()"), self.search_dac) 15 | 16 | self.dac_ip = None 17 | 18 | def send_message(self): 19 | tl_x = float ( self.ui.tl_x.value() ) 20 | tl_y = float ( self.ui.tl_y.value() ) 21 | tr_x = float ( self.ui.tr_x.value() ) 22 | tr_y = float ( self.ui.tr_y.value() ) 23 | bl_x = float ( self.ui.bl_x.value() ) 24 | bl_y = float ( self.ui.bl_y.value() ) 25 | br_x = float ( self.ui.br_x.value() ) 26 | br_y = float ( self.ui.br_y.value() ) 27 | print "Sending to: " + str(self.ui.edit_ip.text()) 28 | print "tl_x, tl_y, tr_x, tr_y, bl_x, bl_y, br_x, br_y" 29 | print tl_x, tl_y, tr_x, tr_y, bl_x, bl_y, br_x, br_y 30 | target = liblo.Address(str(self.ui.edit_ip.text()), 60000) 31 | liblo.send(target, "/geom/tl", tl_x, tl_y) 32 | liblo.send(target, "/geom/tr", tr_x, tr_y) 33 | liblo.send(target, "/geom/bl", bl_x, bl_y) 34 | liblo.send(target, "/geom/br", br_x, br_y) 35 | print "----------------------------------------------" 36 | 37 | def search_dac(self): 38 | import dac 39 | print "Finding dac..." 40 | self.dac_ip = dac.find_first_dac() 41 | print "Found DAC at " + str(self.dac_ip) 42 | self.ui.edit_ip.setText(str(self.dac_ip)) 43 | 44 | if __name__ == "__main__": 45 | app = QtGui.QApplication(sys.argv) 46 | myapp = StartQT4() 47 | myapp.show() 48 | sys.exit(app.exec_()) -------------------------------------------------------------------------------- /sitter.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # j4cDAC "sitter" 3 | # 4 | # Copyright 2012 Jacob Potter 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, version 3. 9 | # 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with this program. If not, see . 17 | 18 | import socket 19 | import time 20 | import struct 21 | 22 | def pack_point(x, y, r, g, b, i = -1, u1 = 0, u2 = 0, flags = 0): 23 | """Pack some color values into a struct dac_point. 24 | 25 | Values must be specified for x, y, r, g, and b. If a value is not 26 | passed in for the other fields, i will default to max(r, g, b); the 27 | rest default to zero. 28 | """ 29 | 30 | if i < 0: 31 | i = max(r, g, b) 32 | 33 | return struct.pack(" len(self.buf): 109 | self.buf += self.conn.recv(4096) 110 | 111 | obuf = self.buf 112 | self.buf = obuf[l:] 113 | return obuf[:l] 114 | 115 | def readresp(self, cmd): 116 | """Read a response from the DAC.""" 117 | data = self.read(22) 118 | response = data[0] 119 | cmdR = data[1] 120 | status = Status(data[2:]) 121 | 122 | # status.dump() 123 | 124 | if cmdR != cmd: 125 | raise ProtocolError("expected resp for %r, got %r" 126 | % (cmd, cmdR)) 127 | 128 | if response != "a": 129 | raise ProtocolError("expected ACK, got %r" 130 | % (response, )) 131 | 132 | self.last_status = status 133 | return status 134 | 135 | def __init__(self, macstr, bp): 136 | self.macstr = macstr 137 | self.firmware_string = "-" 138 | self.got_broadcast(bp) 139 | 140 | try: 141 | t1 = time.time() 142 | self.connect(self.last_broadcast.ip[0]) 143 | t = time.time() - t1 144 | self.conn_status = "ok (%d ms)" % (t * 500) 145 | 146 | if self.last_broadcast.sw_rev < 2: 147 | self.firmware_string = "(old)" 148 | else: 149 | self.conn.sendall('v') 150 | self.firmware_string = self.read(32).replace("\x00", " ").strip() 151 | except Exception, e: 152 | self.conn_status = str(e) 153 | 154 | def connect(self, host, port = 7765): 155 | """Connect to the DAC over TCP.""" 156 | conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 157 | conn.settimeout(0.2) 158 | conn.connect((host, port)) 159 | self.conn = conn 160 | self.buf = "" 161 | 162 | # Read the "hello" message 163 | first_status = self.readresp("?") 164 | first_status.dump() 165 | 166 | 167 | 168 | def begin(self, lwm, rate): 169 | cmd = struct.pack(">", self.update_selection) 341 | 342 | def update_selection(self, lb=None): 343 | if self.dac_display: 344 | try: 345 | dac_obj = self.dac_list[self.index(ACTIVE)] 346 | except: 347 | return 348 | self.dac_display.display_dac(dac_obj) 349 | 350 | def got_packet(self, bp): 351 | macstr = bp.macstr() 352 | if macstr not in self.dac_macstr_map: 353 | new_dac = DAC(macstr, bp) 354 | self.insert(END, macstr[6:]) 355 | self.dac_list.append(new_dac) 356 | self.dac_macstr_map[macstr] = new_dac 357 | dac_obj = new_dac 358 | else: 359 | dac_obj = self.dac_macstr_map[macstr] 360 | dac_obj.got_broadcast(bp) 361 | 362 | if len(self.dac_list) == 1: 363 | self.selection_set(0) 364 | self.update_selection() 365 | 366 | def check_on_dac(): 367 | if time.time() - dac_obj.last_broadcast_time < 2: 368 | return 369 | 370 | idx = self.dac_list.index(dac_obj) 371 | self.dac_list.remove(dac_obj) 372 | del self.dac_macstr_map[macstr] 373 | self.delete(idx) 374 | self.dac_display.display_none() 375 | 376 | 377 | self.after(2000, check_on_dac) 378 | 379 | 380 | 381 | # Set up the basic window 382 | root = Tk() 383 | root.title("Ether Dream") 384 | root.resizable(FALSE, FALSE) 385 | frame = Frame(root) 386 | frame.grid() 387 | 388 | disp = DacDisplay(root) 389 | disp.grid(row=0, column=1, padx=5, pady=5) 390 | tracker = DacTracker(root, height=22) 391 | tracker.grid(row=0, column=0, padx=5, pady=5) 392 | tracker.dac_display = disp 393 | 394 | # Set up queue checker 395 | packet_queue = Queue.Queue() 396 | def queue_check(): 397 | try: 398 | while True: 399 | data, addr = packet_queue.get_nowait() 400 | tracker.got_packet(BroadcastPacket(data, addr)) 401 | except Queue.Empty: 402 | root.after(100, queue_check) 403 | 404 | root.after(100, queue_check) 405 | 406 | # Set up listening socket and thread 407 | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 408 | s.bind(("0.0.0.0", 7654)) 409 | def socket_thread(): 410 | while True: 411 | packet_queue.put(s.recvfrom(1024)) 412 | thread.start_new(socket_thread, ()) 413 | 414 | root.mainloop() 415 | -------------------------------------------------------------------------------- /web_engine/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | web_engine 4 | 5 | 6 | 7 | 8 | 9 | org.python.pydev.PyDevBuilder 10 | 11 | 12 | 13 | 14 | 15 | org.python.pydev.pythonNature 16 | 17 | 18 | -------------------------------------------------------------------------------- /web_engine/.pydevproject: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | /${PROJECT_DIR_NAME} 5 | 6 | python 2.7 7 | Default 8 | 9 | -------------------------------------------------------------------------------- /web_engine/DEFORMED_DXFTOILDA: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/awesomebytes/etherdream_tools/7ba3ba4828f43f323d76064ec0432b25b85f6e58/web_engine/DEFORMED_DXFTOILDA -------------------------------------------------------------------------------- /web_engine/DXF_TO_ILDA: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/awesomebytes/etherdream_tools/7ba3ba4828f43f323d76064ec0432b25b85f6e58/web_engine/DXF_TO_ILDA -------------------------------------------------------------------------------- /web_engine/ILDA.py: -------------------------------------------------------------------------------- 1 | """ 2 | ILDA.py 3 | 4 | Python module for dealing with the ILDA Image Data Transfer Format, 5 | an interchange format for laser image frames. 6 | 7 | Copyright (c) 2008 Micah Dowty 8 | 9 | Permission is hereby granted, free of charge, to any person 10 | obtaining a copy of this software and associated documentation 11 | files (the "Software"), to deal in the Software without 12 | restriction, including without limitation the rights to use, copy, 13 | modify, merge, publish, distribute, sublicense, and/or sell copies 14 | of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be 18 | included in all copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 24 | BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 25 | ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 26 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 27 | SOFTWARE. 28 | 29 | """ 30 | 31 | from __future__ import division 32 | 33 | import struct 34 | 35 | # Format codes 36 | FORMAT_3D = 0 37 | FORMAT_2D = 1 38 | FORMAT_COLOR_TABLE = 2 39 | 40 | # Mapping from FORMAT_* codes to struct format strings 41 | formatTable = ( 42 | '>hhhH', 43 | '>hhH', 44 | '>BBB', 45 | ) 46 | 47 | # Header values 48 | HEADER_MAGIC = "ILDA\0\0\0" 49 | HEADER_RESERVED = 0 50 | HEADER_FORMAT = ">7sB16sHHHBB" 51 | HEADER_LEN = struct.calcsize(HEADER_FORMAT) 52 | 53 | 54 | class Table(object): 55 | """Container object for one ILDA table: either a frame (table of points) 56 | or a palette (table of colors). 57 | 58 | The 'items' list contains the data within this table. Each item 59 | is a tuple, corresponding to the raw values within that row of the 60 | table. 61 | 62 | 2D frame: (x, y, status) 63 | 3D frame: (x, y, z, status) 64 | Color: (r, g, b) 65 | 66 | """ 67 | def __init__(self, format=FORMAT_2D, name="", 68 | length=0, number=0, total=0, scanHead=0): 69 | self.__dict__.update(locals()) 70 | self.items = [] 71 | self.itemsproducer = None 72 | 73 | def __repr__(self): 74 | return ("" % 76 | (self.format, self.name, self.length, self.number, 77 | self.total, self.scanHead)) 78 | 79 | def unpackHeader(self, data): 80 | magic, self.format, self.name, self.length, \ 81 | self.number, self.total, self.scanHead, \ 82 | reserved = struct.unpack(HEADER_FORMAT, data) 83 | 84 | if magic != HEADER_MAGIC: 85 | raise ValueError("Bad ILDA header magic. Not an ILDA file?") 86 | if reserved != HEADER_RESERVED: 87 | raise ValueError("Reserved ILDA field is not zero.") 88 | 89 | def packHeader(self): 90 | return struct.pack(HEADER_FORMAT, HEADER_MAGIC, self.format, 91 | self.name, self.length, self.number, 92 | self.total, self.scanHead, HEADER_RESERVED) 93 | 94 | def readHeader(self, stream): 95 | self.unpackHeader(stream.read(HEADER_LEN)) 96 | 97 | def writeHeader(self, stream): 98 | stream.write(self.packHeader()) 99 | 100 | def _getItemFormat(self): 101 | try: 102 | return formatTable[self.format] 103 | except IndexError: 104 | raise ValueError("Unsupported format code") 105 | 106 | def read_stream(self, stream): 107 | """Read the header, then read all items in this table.""" 108 | self.readHeader(stream) 109 | if self.length: 110 | fmt = self._getItemFormat() 111 | itemSize = struct.calcsize(fmt) 112 | self.items = [struct.unpack(fmt, stream.read(itemSize)) 113 | for i in xrange(self.length)] 114 | self.itemsproducer = self.produce() 115 | 116 | def write(self, stream): 117 | """Write the header, then write all items in this table.""" 118 | self.writeHeader(stream) 119 | if self.length: 120 | fmt = self._getItemFormat() 121 | itemSize = struct.calcsize(fmt) 122 | stream.write(''.join([struct.pack(fmt, *item) 123 | for item in self.items])) 124 | 125 | def iterPoints(self): 126 | """Iterate over Point instances for each item in this table. 127 | Only makes sense if this is a 2D or 3D point table. 128 | """ 129 | for item in self.items: 130 | p = Point() 131 | p.decode(item) 132 | yield p 133 | 134 | 135 | def produce(self): 136 | """Iterate over Point instances for each item in this table. 137 | Only makes sense if this is a 2D or 3D point table. 138 | """ 139 | while True: 140 | for item in self.items: 141 | p = Point() 142 | p.decode(item) 143 | yield p.encode() 144 | #yield (p.x, p.y, p.z, p.color, p.blanking) 145 | 146 | def read(self, cap): 147 | """yields what dac.play_stream() needs (x, y, z, ?, ?) 148 | """ 149 | return [self.itemsproducer.next() for i in xrange(cap)] 150 | 151 | 152 | class Point: 153 | """Abstraction for one vector point. The Table object, for 154 | completeness and efficiency, stores raw tuples for each 155 | point. This is a higher level interface that decodes the status 156 | bits and represents coordinates in floating point. 157 | """ 158 | def __init__(self, x=0.0, y=0.0, z=0.0, color=0, blanking=False): 159 | self.__dict__.update(locals()) 160 | 161 | def __repr__(self): 162 | return "" % ( 163 | self.x, self.y, self.z, self.color, self.blanking) 164 | 165 | def encode(self): 166 | status = self.color & 0xFF 167 | if self.blanking: 168 | status |= 1 << 14 169 | 170 | return ( 171 | int( min(0x7FFF, max(-0x7FFF, self.x * 0x7FFF)) ), 172 | int( min(0x7FFF, max(-0x7FFF, self.y * 0x7FFF)) ), 173 | int( min(0x7FFF, max(-0x7FFF, self.z * 0x7FFF)) ), 174 | int( min(0x7FFF, max(-0x7FFF, self.color * 0x7FFF)) ), 175 | int( min(0x7FFF, max(-0x7FFF, self.blanking * 0x7FFF)) ) 176 | ) 177 | 178 | def decode(self, t): 179 | #print "~~ Decoding, t of len "+ str(len(t)) +" is: " + str(t) 180 | self.x = t[0] / 0x7FFF 181 | self.y = t[1] / 0x7FFF 182 | if len(t) > 3: 183 | self.z = t[2] / 0x7FFF 184 | # self.color = t[3] & 0xFF 185 | # self.blanking = (t[3] & (1 << 14)) != 0 186 | else: 187 | self.z = 0.0 188 | 189 | self.color = t[-1] & 0xFF 190 | self.blanking = (t[-1] & (1 << 14)) != 0 191 | 192 | 193 | def read(stream): 194 | """Read ILDA data from a stream until we hit the 195 | end-of-stream marker. Yields a sequence of Table objects. 196 | """ 197 | while True: 198 | t = Table() 199 | t.read_stream(stream) 200 | if not t.length: 201 | # End-of-stream 202 | break 203 | yield t 204 | 205 | 206 | def write(stream, tables): 207 | """Write a sequence of tables in ILDA format, 208 | terminated by an end-of-stream marker. 209 | """ 210 | for t in tables: 211 | t.write(stream) 212 | Table().write(stream) 213 | 214 | 215 | def readFrames(stream): 216 | """Read ILDA data from a stream, and ignore 217 | all non-frame tables. Yields only 2D or 3D 218 | point tables. 219 | """ 220 | for t in read(stream): 221 | if t.format in (FORMAT_2D, FORMAT_3D): 222 | yield t 223 | 224 | 225 | def readFirstFrame(stream): 226 | """Read only a single frame from an ILDA stream.""" 227 | for frame in readFrames(stream): 228 | return frame 229 | 230 | 231 | if __name__ == "__main__": 232 | # Test program- dump frames and points from a file whose name is 233 | # specified on the command line 234 | 235 | import sys 236 | 237 | f = open(sys.argv[1], 'rb') 238 | for t in readFrames(f): 239 | for p in t.iterPoints(): 240 | print "\t%r" % p 241 | -------------------------------------------------------------------------------- /web_engine/LaserBoy_dxf_to_ilda_tool: -------------------------------------------------------------------------------- 1 | MARC_THING -------------------------------------------------------------------------------- /web_engine/MARC_THING: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/awesomebytes/etherdream_tools/7ba3ba4828f43f323d76064ec0432b25b85f6e58/web_engine/MARC_THING -------------------------------------------------------------------------------- /web_engine/dac.py: -------------------------------------------------------------------------------- 1 | # j4cDAC test code 2 | # 3 | # Copyright 2011 Jacob Potter 4 | # 5 | # This program is free software: you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation, version 3. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program. If not, see . 16 | 17 | import socket 18 | import time 19 | import struct 20 | 21 | def pack_point(x, y, r, g, b, i = -1, u1 = 0, u2 = 0, flags = 0): 22 | """Pack some color values into a struct dac_point. 23 | 24 | Values must be specified for x, y, r, g, and b. If a value is not 25 | passed in for the other fields, i will default to max(r, g, b); the 26 | rest default to zero. 27 | """ 28 | 29 | if i < 0: 30 | i = max(r, g, b) 31 | 32 | return struct.pack(" len(self.buf): 101 | self.buf += self.conn.recv(4096) 102 | 103 | obuf = self.buf 104 | self.buf = obuf[l:] 105 | return obuf[:l] 106 | 107 | def readresp(self, cmd): 108 | """Read a response from the DAC.""" 109 | data = self.read(22) 110 | response = data[0] 111 | cmdR = data[1] 112 | status = Status(data[2:]) 113 | 114 | # status.dump() 115 | 116 | if cmdR != cmd: 117 | raise ProtocolError("expected resp for %r, got %r" 118 | % (cmd, cmdR)) 119 | 120 | if response != "a": 121 | raise ProtocolError("expected ACK, got %r" 122 | % (response, )) 123 | 124 | self.last_status = status 125 | return status 126 | 127 | def __init__(self, host, port = 7765): 128 | """Connect to the DAC over TCP.""" 129 | conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 130 | conn.connect((host, port)) 131 | conn.settimeout(1) 132 | self.conn = conn 133 | self.buf = "" 134 | 135 | # Read the "hello" message 136 | first_status = self.readresp("?") 137 | first_status.dump() 138 | 139 | self.conn.sendall('v') 140 | self.firmware_string = self.read(32).replace("\x00", " ").strip() 141 | print "Firmware: %s" % (self.firmware_string, ) 142 | 143 | def begin(self, lwm, rate): 144 | """Set lwm = low water mark, and PPS rate""" 145 | cmd = struct.pack(" 2 | 3 | 4 | 5 | Laser projection web interface 6 | 7 | 50 | 51 | 52 | 53 | 54 |

Laser web interface:

55 | 56 | 57 | 58 |
59 | 60 | 61 | 62 | 63 | 64 | 65 |
66 | 67 | 68 |

69 | 70 | 71 |

72 |
73 | 74 | 75 | 76 | 77 | 78 | 79 | 159 | 160 | 161 | -------------------------------------------------------------------------------- /web_engine/jquery-ui.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.11.1 - 2014-09-29 2 | * http://jqueryui.com 3 | * Includes: core.css, slider.css, theme.css 4 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px 5 | * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ 6 | 7 | /* Layout helpers 8 | ----------------------------------*/ 9 | .ui-helper-hidden { 10 | display: none; 11 | } 12 | .ui-helper-hidden-accessible { 13 | border: 0; 14 | clip: rect(0 0 0 0); 15 | height: 1px; 16 | margin: -1px; 17 | overflow: hidden; 18 | padding: 0; 19 | position: absolute; 20 | width: 1px; 21 | } 22 | .ui-helper-reset { 23 | margin: 0; 24 | padding: 0; 25 | border: 0; 26 | outline: 0; 27 | line-height: 1.3; 28 | text-decoration: none; 29 | font-size: 100%; 30 | list-style: none; 31 | } 32 | .ui-helper-clearfix:before, 33 | .ui-helper-clearfix:after { 34 | content: ""; 35 | display: table; 36 | border-collapse: collapse; 37 | } 38 | .ui-helper-clearfix:after { 39 | clear: both; 40 | } 41 | .ui-helper-clearfix { 42 | min-height: 0; /* support: IE7 */ 43 | } 44 | .ui-helper-zfix { 45 | width: 100%; 46 | height: 100%; 47 | top: 0; 48 | left: 0; 49 | position: absolute; 50 | opacity: 0; 51 | filter:Alpha(Opacity=0); /* support: IE8 */ 52 | } 53 | 54 | .ui-front { 55 | z-index: 100; 56 | } 57 | 58 | 59 | /* Interaction Cues 60 | ----------------------------------*/ 61 | .ui-state-disabled { 62 | cursor: default !important; 63 | } 64 | 65 | 66 | /* Icons 67 | ----------------------------------*/ 68 | 69 | /* states and images */ 70 | .ui-icon { 71 | display: block; 72 | text-indent: -99999px; 73 | overflow: hidden; 74 | background-repeat: no-repeat; 75 | } 76 | 77 | 78 | /* Misc visuals 79 | ----------------------------------*/ 80 | 81 | /* Overlays */ 82 | .ui-widget-overlay { 83 | position: fixed; 84 | top: 0; 85 | left: 0; 86 | width: 100%; 87 | height: 100%; 88 | } 89 | .ui-slider { 90 | position: relative; 91 | text-align: left; 92 | } 93 | .ui-slider .ui-slider-handle { 94 | position: absolute; 95 | z-index: 2; 96 | width: 1.2em; 97 | height: 1.2em; 98 | cursor: default; 99 | -ms-touch-action: none; 100 | touch-action: none; 101 | } 102 | .ui-slider .ui-slider-range { 103 | position: absolute; 104 | z-index: 1; 105 | font-size: .7em; 106 | display: block; 107 | border: 0; 108 | background-position: 0 0; 109 | } 110 | 111 | /* support: IE8 - See #6727 */ 112 | .ui-slider.ui-state-disabled .ui-slider-handle, 113 | .ui-slider.ui-state-disabled .ui-slider-range { 114 | filter: inherit; 115 | } 116 | 117 | .ui-slider-horizontal { 118 | height: .8em; 119 | } 120 | .ui-slider-horizontal .ui-slider-handle { 121 | top: -.3em; 122 | margin-left: -.6em; 123 | } 124 | .ui-slider-horizontal .ui-slider-range { 125 | top: 0; 126 | height: 100%; 127 | } 128 | .ui-slider-horizontal .ui-slider-range-min { 129 | left: 0; 130 | } 131 | .ui-slider-horizontal .ui-slider-range-max { 132 | right: 0; 133 | } 134 | 135 | .ui-slider-vertical { 136 | width: .8em; 137 | height: 100px; 138 | } 139 | .ui-slider-vertical .ui-slider-handle { 140 | left: -.3em; 141 | margin-left: 0; 142 | margin-bottom: -.6em; 143 | } 144 | .ui-slider-vertical .ui-slider-range { 145 | left: 0; 146 | width: 100%; 147 | } 148 | .ui-slider-vertical .ui-slider-range-min { 149 | bottom: 0; 150 | } 151 | .ui-slider-vertical .ui-slider-range-max { 152 | top: 0; 153 | } 154 | 155 | /* Component containers 156 | ----------------------------------*/ 157 | .ui-widget { 158 | font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; 159 | font-size: 1.1em; 160 | } 161 | .ui-widget .ui-widget { 162 | font-size: 1em; 163 | } 164 | .ui-widget input, 165 | .ui-widget select, 166 | .ui-widget textarea, 167 | .ui-widget button { 168 | font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; 169 | font-size: 1em; 170 | } 171 | .ui-widget-content { 172 | border: 1px solid #dddddd; 173 | background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x; 174 | color: #333333; 175 | } 176 | .ui-widget-content a { 177 | color: #333333; 178 | } 179 | .ui-widget-header { 180 | border: 1px solid #e78f08; 181 | background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x; 182 | color: #ffffff; 183 | font-weight: bold; 184 | } 185 | .ui-widget-header a { 186 | color: #ffffff; 187 | } 188 | 189 | /* Interaction states 190 | ----------------------------------*/ 191 | .ui-state-default, 192 | .ui-widget-content .ui-state-default, 193 | .ui-widget-header .ui-state-default { 194 | border: 1px solid #cccccc; 195 | background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x; 196 | font-weight: bold; 197 | color: #1c94c4; 198 | } 199 | .ui-state-default a, 200 | .ui-state-default a:link, 201 | .ui-state-default a:visited { 202 | color: #1c94c4; 203 | text-decoration: none; 204 | } 205 | .ui-state-hover, 206 | .ui-widget-content .ui-state-hover, 207 | .ui-widget-header .ui-state-hover, 208 | .ui-state-focus, 209 | .ui-widget-content .ui-state-focus, 210 | .ui-widget-header .ui-state-focus { 211 | border: 1px solid #fbcb09; 212 | background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x; 213 | font-weight: bold; 214 | color: #c77405; 215 | } 216 | .ui-state-hover a, 217 | .ui-state-hover a:hover, 218 | .ui-state-hover a:link, 219 | .ui-state-hover a:visited, 220 | .ui-state-focus a, 221 | .ui-state-focus a:hover, 222 | .ui-state-focus a:link, 223 | .ui-state-focus a:visited { 224 | color: #c77405; 225 | text-decoration: none; 226 | } 227 | .ui-state-active, 228 | .ui-widget-content .ui-state-active, 229 | .ui-widget-header .ui-state-active { 230 | border: 1px solid #fbd850; 231 | background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; 232 | font-weight: bold; 233 | color: #eb8f00; 234 | } 235 | .ui-state-active a, 236 | .ui-state-active a:link, 237 | .ui-state-active a:visited { 238 | color: #eb8f00; 239 | text-decoration: none; 240 | } 241 | 242 | /* Interaction Cues 243 | ----------------------------------*/ 244 | .ui-state-highlight, 245 | .ui-widget-content .ui-state-highlight, 246 | .ui-widget-header .ui-state-highlight { 247 | border: 1px solid #fed22f; 248 | background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x; 249 | color: #363636; 250 | } 251 | .ui-state-highlight a, 252 | .ui-widget-content .ui-state-highlight a, 253 | .ui-widget-header .ui-state-highlight a { 254 | color: #363636; 255 | } 256 | .ui-state-error, 257 | .ui-widget-content .ui-state-error, 258 | .ui-widget-header .ui-state-error { 259 | border: 1px solid #cd0a0a; 260 | background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat; 261 | color: #ffffff; 262 | } 263 | .ui-state-error a, 264 | .ui-widget-content .ui-state-error a, 265 | .ui-widget-header .ui-state-error a { 266 | color: #ffffff; 267 | } 268 | .ui-state-error-text, 269 | .ui-widget-content .ui-state-error-text, 270 | .ui-widget-header .ui-state-error-text { 271 | color: #ffffff; 272 | } 273 | .ui-priority-primary, 274 | .ui-widget-content .ui-priority-primary, 275 | .ui-widget-header .ui-priority-primary { 276 | font-weight: bold; 277 | } 278 | .ui-priority-secondary, 279 | .ui-widget-content .ui-priority-secondary, 280 | .ui-widget-header .ui-priority-secondary { 281 | opacity: .7; 282 | filter:Alpha(Opacity=70); /* support: IE8 */ 283 | font-weight: normal; 284 | } 285 | .ui-state-disabled, 286 | .ui-widget-content .ui-state-disabled, 287 | .ui-widget-header .ui-state-disabled { 288 | opacity: .35; 289 | filter:Alpha(Opacity=35); /* support: IE8 */ 290 | background-image: none; 291 | } 292 | .ui-state-disabled .ui-icon { 293 | filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ 294 | } 295 | 296 | /* Icons 297 | ----------------------------------*/ 298 | 299 | /* states and images */ 300 | .ui-icon { 301 | width: 16px; 302 | height: 16px; 303 | } 304 | .ui-icon, 305 | .ui-widget-content .ui-icon { 306 | background-image: url("images/ui-icons_222222_256x240.png"); 307 | } 308 | .ui-widget-header .ui-icon { 309 | background-image: url("images/ui-icons_ffffff_256x240.png"); 310 | } 311 | .ui-state-default .ui-icon { 312 | background-image: url("images/ui-icons_ef8c08_256x240.png"); 313 | } 314 | .ui-state-hover .ui-icon, 315 | .ui-state-focus .ui-icon { 316 | background-image: url("images/ui-icons_ef8c08_256x240.png"); 317 | } 318 | .ui-state-active .ui-icon { 319 | background-image: url("images/ui-icons_ef8c08_256x240.png"); 320 | } 321 | .ui-state-highlight .ui-icon { 322 | background-image: url("images/ui-icons_228ef1_256x240.png"); 323 | } 324 | .ui-state-error .ui-icon, 325 | .ui-state-error-text .ui-icon { 326 | background-image: url("images/ui-icons_ffd27a_256x240.png"); 327 | } 328 | 329 | /* positioning */ 330 | .ui-icon-blank { background-position: 16px 16px; } 331 | .ui-icon-carat-1-n { background-position: 0 0; } 332 | .ui-icon-carat-1-ne { background-position: -16px 0; } 333 | .ui-icon-carat-1-e { background-position: -32px 0; } 334 | .ui-icon-carat-1-se { background-position: -48px 0; } 335 | .ui-icon-carat-1-s { background-position: -64px 0; } 336 | .ui-icon-carat-1-sw { background-position: -80px 0; } 337 | .ui-icon-carat-1-w { background-position: -96px 0; } 338 | .ui-icon-carat-1-nw { background-position: -112px 0; } 339 | .ui-icon-carat-2-n-s { background-position: -128px 0; } 340 | .ui-icon-carat-2-e-w { background-position: -144px 0; } 341 | .ui-icon-triangle-1-n { background-position: 0 -16px; } 342 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } 343 | .ui-icon-triangle-1-e { background-position: -32px -16px; } 344 | .ui-icon-triangle-1-se { background-position: -48px -16px; } 345 | .ui-icon-triangle-1-s { background-position: -64px -16px; } 346 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } 347 | .ui-icon-triangle-1-w { background-position: -96px -16px; } 348 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } 349 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } 350 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } 351 | .ui-icon-arrow-1-n { background-position: 0 -32px; } 352 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } 353 | .ui-icon-arrow-1-e { background-position: -32px -32px; } 354 | .ui-icon-arrow-1-se { background-position: -48px -32px; } 355 | .ui-icon-arrow-1-s { background-position: -64px -32px; } 356 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } 357 | .ui-icon-arrow-1-w { background-position: -96px -32px; } 358 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } 359 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } 360 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 361 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } 362 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 363 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } 364 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } 365 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } 366 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } 367 | .ui-icon-arrowthick-1-n { background-position: 0 -48px; } 368 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 369 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } 370 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } 371 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } 372 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 373 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } 374 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 375 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 376 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 377 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 378 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 379 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 380 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 381 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 382 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 383 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 384 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 385 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 386 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 387 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 388 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 389 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 390 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 391 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 392 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 393 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 394 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 395 | .ui-icon-arrow-4 { background-position: 0 -80px; } 396 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } 397 | .ui-icon-extlink { background-position: -32px -80px; } 398 | .ui-icon-newwin { background-position: -48px -80px; } 399 | .ui-icon-refresh { background-position: -64px -80px; } 400 | .ui-icon-shuffle { background-position: -80px -80px; } 401 | .ui-icon-transfer-e-w { background-position: -96px -80px; } 402 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } 403 | .ui-icon-folder-collapsed { background-position: 0 -96px; } 404 | .ui-icon-folder-open { background-position: -16px -96px; } 405 | .ui-icon-document { background-position: -32px -96px; } 406 | .ui-icon-document-b { background-position: -48px -96px; } 407 | .ui-icon-note { background-position: -64px -96px; } 408 | .ui-icon-mail-closed { background-position: -80px -96px; } 409 | .ui-icon-mail-open { background-position: -96px -96px; } 410 | .ui-icon-suitcase { background-position: -112px -96px; } 411 | .ui-icon-comment { background-position: -128px -96px; } 412 | .ui-icon-person { background-position: -144px -96px; } 413 | .ui-icon-print { background-position: -160px -96px; } 414 | .ui-icon-trash { background-position: -176px -96px; } 415 | .ui-icon-locked { background-position: -192px -96px; } 416 | .ui-icon-unlocked { background-position: -208px -96px; } 417 | .ui-icon-bookmark { background-position: -224px -96px; } 418 | .ui-icon-tag { background-position: -240px -96px; } 419 | .ui-icon-home { background-position: 0 -112px; } 420 | .ui-icon-flag { background-position: -16px -112px; } 421 | .ui-icon-calendar { background-position: -32px -112px; } 422 | .ui-icon-cart { background-position: -48px -112px; } 423 | .ui-icon-pencil { background-position: -64px -112px; } 424 | .ui-icon-clock { background-position: -80px -112px; } 425 | .ui-icon-disk { background-position: -96px -112px; } 426 | .ui-icon-calculator { background-position: -112px -112px; } 427 | .ui-icon-zoomin { background-position: -128px -112px; } 428 | .ui-icon-zoomout { background-position: -144px -112px; } 429 | .ui-icon-search { background-position: -160px -112px; } 430 | .ui-icon-wrench { background-position: -176px -112px; } 431 | .ui-icon-gear { background-position: -192px -112px; } 432 | .ui-icon-heart { background-position: -208px -112px; } 433 | .ui-icon-star { background-position: -224px -112px; } 434 | .ui-icon-link { background-position: -240px -112px; } 435 | .ui-icon-cancel { background-position: 0 -128px; } 436 | .ui-icon-plus { background-position: -16px -128px; } 437 | .ui-icon-plusthick { background-position: -32px -128px; } 438 | .ui-icon-minus { background-position: -48px -128px; } 439 | .ui-icon-minusthick { background-position: -64px -128px; } 440 | .ui-icon-close { background-position: -80px -128px; } 441 | .ui-icon-closethick { background-position: -96px -128px; } 442 | .ui-icon-key { background-position: -112px -128px; } 443 | .ui-icon-lightbulb { background-position: -128px -128px; } 444 | .ui-icon-scissors { background-position: -144px -128px; } 445 | .ui-icon-clipboard { background-position: -160px -128px; } 446 | .ui-icon-copy { background-position: -176px -128px; } 447 | .ui-icon-contact { background-position: -192px -128px; } 448 | .ui-icon-image { background-position: -208px -128px; } 449 | .ui-icon-video { background-position: -224px -128px; } 450 | .ui-icon-script { background-position: -240px -128px; } 451 | .ui-icon-alert { background-position: 0 -144px; } 452 | .ui-icon-info { background-position: -16px -144px; } 453 | .ui-icon-notice { background-position: -32px -144px; } 454 | .ui-icon-help { background-position: -48px -144px; } 455 | .ui-icon-check { background-position: -64px -144px; } 456 | .ui-icon-bullet { background-position: -80px -144px; } 457 | .ui-icon-radio-on { background-position: -96px -144px; } 458 | .ui-icon-radio-off { background-position: -112px -144px; } 459 | .ui-icon-pin-w { background-position: -128px -144px; } 460 | .ui-icon-pin-s { background-position: -144px -144px; } 461 | .ui-icon-play { background-position: 0 -160px; } 462 | .ui-icon-pause { background-position: -16px -160px; } 463 | .ui-icon-seek-next { background-position: -32px -160px; } 464 | .ui-icon-seek-prev { background-position: -48px -160px; } 465 | .ui-icon-seek-end { background-position: -64px -160px; } 466 | .ui-icon-seek-start { background-position: -80px -160px; } 467 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ 468 | .ui-icon-seek-first { background-position: -80px -160px; } 469 | .ui-icon-stop { background-position: -96px -160px; } 470 | .ui-icon-eject { background-position: -112px -160px; } 471 | .ui-icon-volume-off { background-position: -128px -160px; } 472 | .ui-icon-volume-on { background-position: -144px -160px; } 473 | .ui-icon-power { background-position: 0 -176px; } 474 | .ui-icon-signal-diag { background-position: -16px -176px; } 475 | .ui-icon-signal { background-position: -32px -176px; } 476 | .ui-icon-battery-0 { background-position: -48px -176px; } 477 | .ui-icon-battery-1 { background-position: -64px -176px; } 478 | .ui-icon-battery-2 { background-position: -80px -176px; } 479 | .ui-icon-battery-3 { background-position: -96px -176px; } 480 | .ui-icon-circle-plus { background-position: 0 -192px; } 481 | .ui-icon-circle-minus { background-position: -16px -192px; } 482 | .ui-icon-circle-close { background-position: -32px -192px; } 483 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } 484 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } 485 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } 486 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } 487 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } 488 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } 489 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } 490 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } 491 | .ui-icon-circle-zoomin { background-position: -176px -192px; } 492 | .ui-icon-circle-zoomout { background-position: -192px -192px; } 493 | .ui-icon-circle-check { background-position: -208px -192px; } 494 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } 495 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } 496 | .ui-icon-circlesmall-close { background-position: -32px -208px; } 497 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } 498 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } 499 | .ui-icon-squaresmall-close { background-position: -80px -208px; } 500 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 501 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 502 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } 503 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 504 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 505 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } 506 | 507 | 508 | /* Misc visuals 509 | ----------------------------------*/ 510 | 511 | /* Corner radius */ 512 | .ui-corner-all, 513 | .ui-corner-top, 514 | .ui-corner-left, 515 | .ui-corner-tl { 516 | border-top-left-radius: 4px; 517 | } 518 | .ui-corner-all, 519 | .ui-corner-top, 520 | .ui-corner-right, 521 | .ui-corner-tr { 522 | border-top-right-radius: 4px; 523 | } 524 | .ui-corner-all, 525 | .ui-corner-bottom, 526 | .ui-corner-left, 527 | .ui-corner-bl { 528 | border-bottom-left-radius: 4px; 529 | } 530 | .ui-corner-all, 531 | .ui-corner-bottom, 532 | .ui-corner-right, 533 | .ui-corner-br { 534 | border-bottom-right-radius: 4px; 535 | } 536 | 537 | /* Overlays */ 538 | .ui-widget-overlay { 539 | background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat; 540 | opacity: .5; 541 | filter: Alpha(Opacity=50); /* support: IE8 */ 542 | } 543 | .ui-widget-shadow { 544 | margin: -5px 0 0 -5px; 545 | padding: 5px; 546 | background: #000000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x; 547 | opacity: .2; 548 | filter: Alpha(Opacity=20); /* support: IE8 */ 549 | border-radius: 5px; 550 | } 551 | -------------------------------------------------------------------------------- /web_engine/jquery-ui.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.11.1 - 2014-09-29 2 | * http://jqueryui.com 3 | * Includes: core.css, slider.css, theme.css 4 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px 5 | * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ 6 | 7 | .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px} -------------------------------------------------------------------------------- /web_engine/jquery-ui.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.11.1 - 2014-09-29 2 | * http://jqueryui.com 3 | * Includes: core.js, widget.js, mouse.js, slider.js 4 | * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ 5 | 6 | (function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.1",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var s=0,n=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,a=n.call(arguments,1),o=0,r=a.length;r>o;o++)for(i in a[o])s=a[o][i],a[o].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(a){var o="string"==typeof a,r=n.call(arguments,1),h=this;return a=!o&&r.length?e.widget.extend.apply(null,[a].concat(r)):a,o?this.each(function(){var i,n=e.data(this,s);return"instance"===a?(h=n,!1):n?e.isFunction(n[a])&&"_"!==a.charAt(0)?(i=n[a].apply(n,r),i!==n&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+a+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+a+"'")}):this.each(function(){var t=e.data(this,s);t?(t.option(a||{}),t._init&&t._init()):e.data(this,s,new i(a,this))}),h}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=s++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var a=!1;e(document).mouseup(function(){a=!1}),e.widget("ui.mouse",{version:"1.11.1",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!a){this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),a=!0,!0)):!0}},_mouseMove:function(t){return e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button?this._mouseUp(t):t.which?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),a=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("
").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"min":case"max":this._animateOff=!0,this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}})}); -------------------------------------------------------------------------------- /web_engine/jquery-ui.structure.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI CSS Framework 1.11.1 3 | * http://jqueryui.com 4 | * 5 | * Copyright 2014 jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/category/theming/ 10 | */ 11 | 12 | /* Layout helpers 13 | ----------------------------------*/ 14 | .ui-helper-hidden { 15 | display: none; 16 | } 17 | .ui-helper-hidden-accessible { 18 | border: 0; 19 | clip: rect(0 0 0 0); 20 | height: 1px; 21 | margin: -1px; 22 | overflow: hidden; 23 | padding: 0; 24 | position: absolute; 25 | width: 1px; 26 | } 27 | .ui-helper-reset { 28 | margin: 0; 29 | padding: 0; 30 | border: 0; 31 | outline: 0; 32 | line-height: 1.3; 33 | text-decoration: none; 34 | font-size: 100%; 35 | list-style: none; 36 | } 37 | .ui-helper-clearfix:before, 38 | .ui-helper-clearfix:after { 39 | content: ""; 40 | display: table; 41 | border-collapse: collapse; 42 | } 43 | .ui-helper-clearfix:after { 44 | clear: both; 45 | } 46 | .ui-helper-clearfix { 47 | min-height: 0; /* support: IE7 */ 48 | } 49 | .ui-helper-zfix { 50 | width: 100%; 51 | height: 100%; 52 | top: 0; 53 | left: 0; 54 | position: absolute; 55 | opacity: 0; 56 | filter:Alpha(Opacity=0); /* support: IE8 */ 57 | } 58 | 59 | .ui-front { 60 | z-index: 100; 61 | } 62 | 63 | 64 | /* Interaction Cues 65 | ----------------------------------*/ 66 | .ui-state-disabled { 67 | cursor: default !important; 68 | } 69 | 70 | 71 | /* Icons 72 | ----------------------------------*/ 73 | 74 | /* states and images */ 75 | .ui-icon { 76 | display: block; 77 | text-indent: -99999px; 78 | overflow: hidden; 79 | background-repeat: no-repeat; 80 | } 81 | 82 | 83 | /* Misc visuals 84 | ----------------------------------*/ 85 | 86 | /* Overlays */ 87 | .ui-widget-overlay { 88 | position: fixed; 89 | top: 0; 90 | left: 0; 91 | width: 100%; 92 | height: 100%; 93 | } 94 | .ui-slider { 95 | position: relative; 96 | text-align: left; 97 | } 98 | .ui-slider .ui-slider-handle { 99 | position: absolute; 100 | z-index: 2; 101 | width: 1.2em; 102 | height: 1.2em; 103 | cursor: default; 104 | -ms-touch-action: none; 105 | touch-action: none; 106 | } 107 | .ui-slider .ui-slider-range { 108 | position: absolute; 109 | z-index: 1; 110 | font-size: .7em; 111 | display: block; 112 | border: 0; 113 | background-position: 0 0; 114 | } 115 | 116 | /* support: IE8 - See #6727 */ 117 | .ui-slider.ui-state-disabled .ui-slider-handle, 118 | .ui-slider.ui-state-disabled .ui-slider-range { 119 | filter: inherit; 120 | } 121 | 122 | .ui-slider-horizontal { 123 | height: .8em; 124 | } 125 | .ui-slider-horizontal .ui-slider-handle { 126 | top: -.3em; 127 | margin-left: -.6em; 128 | } 129 | .ui-slider-horizontal .ui-slider-range { 130 | top: 0; 131 | height: 100%; 132 | } 133 | .ui-slider-horizontal .ui-slider-range-min { 134 | left: 0; 135 | } 136 | .ui-slider-horizontal .ui-slider-range-max { 137 | right: 0; 138 | } 139 | 140 | .ui-slider-vertical { 141 | width: .8em; 142 | height: 100px; 143 | } 144 | .ui-slider-vertical .ui-slider-handle { 145 | left: -.3em; 146 | margin-left: 0; 147 | margin-bottom: -.6em; 148 | } 149 | .ui-slider-vertical .ui-slider-range { 150 | left: 0; 151 | width: 100%; 152 | } 153 | .ui-slider-vertical .ui-slider-range-min { 154 | bottom: 0; 155 | } 156 | .ui-slider-vertical .ui-slider-range-max { 157 | top: 0; 158 | } 159 | -------------------------------------------------------------------------------- /web_engine/jquery-ui.structure.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.11.1 - 2014-09-29 2 | * http://jqueryui.com 3 | * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ 4 | 5 | .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0} -------------------------------------------------------------------------------- /web_engine/jquery-ui.theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI CSS Framework 1.11.1 3 | * http://jqueryui.com 4 | * 5 | * Copyright 2014 jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/category/theming/ 10 | * 11 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px 12 | */ 13 | 14 | 15 | /* Component containers 16 | ----------------------------------*/ 17 | .ui-widget { 18 | font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; 19 | font-size: 1.1em; 20 | } 21 | .ui-widget .ui-widget { 22 | font-size: 1em; 23 | } 24 | .ui-widget input, 25 | .ui-widget select, 26 | .ui-widget textarea, 27 | .ui-widget button { 28 | font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; 29 | font-size: 1em; 30 | } 31 | .ui-widget-content { 32 | border: 1px solid #dddddd; 33 | background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x; 34 | color: #333333; 35 | } 36 | .ui-widget-content a { 37 | color: #333333; 38 | } 39 | .ui-widget-header { 40 | border: 1px solid #e78f08; 41 | background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x; 42 | color: #ffffff; 43 | font-weight: bold; 44 | } 45 | .ui-widget-header a { 46 | color: #ffffff; 47 | } 48 | 49 | /* Interaction states 50 | ----------------------------------*/ 51 | .ui-state-default, 52 | .ui-widget-content .ui-state-default, 53 | .ui-widget-header .ui-state-default { 54 | border: 1px solid #cccccc; 55 | background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x; 56 | font-weight: bold; 57 | color: #1c94c4; 58 | } 59 | .ui-state-default a, 60 | .ui-state-default a:link, 61 | .ui-state-default a:visited { 62 | color: #1c94c4; 63 | text-decoration: none; 64 | } 65 | .ui-state-hover, 66 | .ui-widget-content .ui-state-hover, 67 | .ui-widget-header .ui-state-hover, 68 | .ui-state-focus, 69 | .ui-widget-content .ui-state-focus, 70 | .ui-widget-header .ui-state-focus { 71 | border: 1px solid #fbcb09; 72 | background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x; 73 | font-weight: bold; 74 | color: #c77405; 75 | } 76 | .ui-state-hover a, 77 | .ui-state-hover a:hover, 78 | .ui-state-hover a:link, 79 | .ui-state-hover a:visited, 80 | .ui-state-focus a, 81 | .ui-state-focus a:hover, 82 | .ui-state-focus a:link, 83 | .ui-state-focus a:visited { 84 | color: #c77405; 85 | text-decoration: none; 86 | } 87 | .ui-state-active, 88 | .ui-widget-content .ui-state-active, 89 | .ui-widget-header .ui-state-active { 90 | border: 1px solid #fbd850; 91 | background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; 92 | font-weight: bold; 93 | color: #eb8f00; 94 | } 95 | .ui-state-active a, 96 | .ui-state-active a:link, 97 | .ui-state-active a:visited { 98 | color: #eb8f00; 99 | text-decoration: none; 100 | } 101 | 102 | /* Interaction Cues 103 | ----------------------------------*/ 104 | .ui-state-highlight, 105 | .ui-widget-content .ui-state-highlight, 106 | .ui-widget-header .ui-state-highlight { 107 | border: 1px solid #fed22f; 108 | background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x; 109 | color: #363636; 110 | } 111 | .ui-state-highlight a, 112 | .ui-widget-content .ui-state-highlight a, 113 | .ui-widget-header .ui-state-highlight a { 114 | color: #363636; 115 | } 116 | .ui-state-error, 117 | .ui-widget-content .ui-state-error, 118 | .ui-widget-header .ui-state-error { 119 | border: 1px solid #cd0a0a; 120 | background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat; 121 | color: #ffffff; 122 | } 123 | .ui-state-error a, 124 | .ui-widget-content .ui-state-error a, 125 | .ui-widget-header .ui-state-error a { 126 | color: #ffffff; 127 | } 128 | .ui-state-error-text, 129 | .ui-widget-content .ui-state-error-text, 130 | .ui-widget-header .ui-state-error-text { 131 | color: #ffffff; 132 | } 133 | .ui-priority-primary, 134 | .ui-widget-content .ui-priority-primary, 135 | .ui-widget-header .ui-priority-primary { 136 | font-weight: bold; 137 | } 138 | .ui-priority-secondary, 139 | .ui-widget-content .ui-priority-secondary, 140 | .ui-widget-header .ui-priority-secondary { 141 | opacity: .7; 142 | filter:Alpha(Opacity=70); /* support: IE8 */ 143 | font-weight: normal; 144 | } 145 | .ui-state-disabled, 146 | .ui-widget-content .ui-state-disabled, 147 | .ui-widget-header .ui-state-disabled { 148 | opacity: .35; 149 | filter:Alpha(Opacity=35); /* support: IE8 */ 150 | background-image: none; 151 | } 152 | .ui-state-disabled .ui-icon { 153 | filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ 154 | } 155 | 156 | /* Icons 157 | ----------------------------------*/ 158 | 159 | /* states and images */ 160 | .ui-icon { 161 | width: 16px; 162 | height: 16px; 163 | } 164 | .ui-icon, 165 | .ui-widget-content .ui-icon { 166 | background-image: url("images/ui-icons_222222_256x240.png"); 167 | } 168 | .ui-widget-header .ui-icon { 169 | background-image: url("images/ui-icons_ffffff_256x240.png"); 170 | } 171 | .ui-state-default .ui-icon { 172 | background-image: url("images/ui-icons_ef8c08_256x240.png"); 173 | } 174 | .ui-state-hover .ui-icon, 175 | .ui-state-focus .ui-icon { 176 | background-image: url("images/ui-icons_ef8c08_256x240.png"); 177 | } 178 | .ui-state-active .ui-icon { 179 | background-image: url("images/ui-icons_ef8c08_256x240.png"); 180 | } 181 | .ui-state-highlight .ui-icon { 182 | background-image: url("images/ui-icons_228ef1_256x240.png"); 183 | } 184 | .ui-state-error .ui-icon, 185 | .ui-state-error-text .ui-icon { 186 | background-image: url("images/ui-icons_ffd27a_256x240.png"); 187 | } 188 | 189 | /* positioning */ 190 | .ui-icon-blank { background-position: 16px 16px; } 191 | .ui-icon-carat-1-n { background-position: 0 0; } 192 | .ui-icon-carat-1-ne { background-position: -16px 0; } 193 | .ui-icon-carat-1-e { background-position: -32px 0; } 194 | .ui-icon-carat-1-se { background-position: -48px 0; } 195 | .ui-icon-carat-1-s { background-position: -64px 0; } 196 | .ui-icon-carat-1-sw { background-position: -80px 0; } 197 | .ui-icon-carat-1-w { background-position: -96px 0; } 198 | .ui-icon-carat-1-nw { background-position: -112px 0; } 199 | .ui-icon-carat-2-n-s { background-position: -128px 0; } 200 | .ui-icon-carat-2-e-w { background-position: -144px 0; } 201 | .ui-icon-triangle-1-n { background-position: 0 -16px; } 202 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } 203 | .ui-icon-triangle-1-e { background-position: -32px -16px; } 204 | .ui-icon-triangle-1-se { background-position: -48px -16px; } 205 | .ui-icon-triangle-1-s { background-position: -64px -16px; } 206 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } 207 | .ui-icon-triangle-1-w { background-position: -96px -16px; } 208 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } 209 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } 210 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } 211 | .ui-icon-arrow-1-n { background-position: 0 -32px; } 212 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } 213 | .ui-icon-arrow-1-e { background-position: -32px -32px; } 214 | .ui-icon-arrow-1-se { background-position: -48px -32px; } 215 | .ui-icon-arrow-1-s { background-position: -64px -32px; } 216 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } 217 | .ui-icon-arrow-1-w { background-position: -96px -32px; } 218 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } 219 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } 220 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 221 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } 222 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 223 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } 224 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } 225 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } 226 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } 227 | .ui-icon-arrowthick-1-n { background-position: 0 -48px; } 228 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 229 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } 230 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } 231 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } 232 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 233 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } 234 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 235 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 236 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 237 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 238 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 239 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 240 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 241 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 242 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 243 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 244 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 245 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 246 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 247 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 248 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 249 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 250 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 251 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 252 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 253 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 254 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 255 | .ui-icon-arrow-4 { background-position: 0 -80px; } 256 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } 257 | .ui-icon-extlink { background-position: -32px -80px; } 258 | .ui-icon-newwin { background-position: -48px -80px; } 259 | .ui-icon-refresh { background-position: -64px -80px; } 260 | .ui-icon-shuffle { background-position: -80px -80px; } 261 | .ui-icon-transfer-e-w { background-position: -96px -80px; } 262 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } 263 | .ui-icon-folder-collapsed { background-position: 0 -96px; } 264 | .ui-icon-folder-open { background-position: -16px -96px; } 265 | .ui-icon-document { background-position: -32px -96px; } 266 | .ui-icon-document-b { background-position: -48px -96px; } 267 | .ui-icon-note { background-position: -64px -96px; } 268 | .ui-icon-mail-closed { background-position: -80px -96px; } 269 | .ui-icon-mail-open { background-position: -96px -96px; } 270 | .ui-icon-suitcase { background-position: -112px -96px; } 271 | .ui-icon-comment { background-position: -128px -96px; } 272 | .ui-icon-person { background-position: -144px -96px; } 273 | .ui-icon-print { background-position: -160px -96px; } 274 | .ui-icon-trash { background-position: -176px -96px; } 275 | .ui-icon-locked { background-position: -192px -96px; } 276 | .ui-icon-unlocked { background-position: -208px -96px; } 277 | .ui-icon-bookmark { background-position: -224px -96px; } 278 | .ui-icon-tag { background-position: -240px -96px; } 279 | .ui-icon-home { background-position: 0 -112px; } 280 | .ui-icon-flag { background-position: -16px -112px; } 281 | .ui-icon-calendar { background-position: -32px -112px; } 282 | .ui-icon-cart { background-position: -48px -112px; } 283 | .ui-icon-pencil { background-position: -64px -112px; } 284 | .ui-icon-clock { background-position: -80px -112px; } 285 | .ui-icon-disk { background-position: -96px -112px; } 286 | .ui-icon-calculator { background-position: -112px -112px; } 287 | .ui-icon-zoomin { background-position: -128px -112px; } 288 | .ui-icon-zoomout { background-position: -144px -112px; } 289 | .ui-icon-search { background-position: -160px -112px; } 290 | .ui-icon-wrench { background-position: -176px -112px; } 291 | .ui-icon-gear { background-position: -192px -112px; } 292 | .ui-icon-heart { background-position: -208px -112px; } 293 | .ui-icon-star { background-position: -224px -112px; } 294 | .ui-icon-link { background-position: -240px -112px; } 295 | .ui-icon-cancel { background-position: 0 -128px; } 296 | .ui-icon-plus { background-position: -16px -128px; } 297 | .ui-icon-plusthick { background-position: -32px -128px; } 298 | .ui-icon-minus { background-position: -48px -128px; } 299 | .ui-icon-minusthick { background-position: -64px -128px; } 300 | .ui-icon-close { background-position: -80px -128px; } 301 | .ui-icon-closethick { background-position: -96px -128px; } 302 | .ui-icon-key { background-position: -112px -128px; } 303 | .ui-icon-lightbulb { background-position: -128px -128px; } 304 | .ui-icon-scissors { background-position: -144px -128px; } 305 | .ui-icon-clipboard { background-position: -160px -128px; } 306 | .ui-icon-copy { background-position: -176px -128px; } 307 | .ui-icon-contact { background-position: -192px -128px; } 308 | .ui-icon-image { background-position: -208px -128px; } 309 | .ui-icon-video { background-position: -224px -128px; } 310 | .ui-icon-script { background-position: -240px -128px; } 311 | .ui-icon-alert { background-position: 0 -144px; } 312 | .ui-icon-info { background-position: -16px -144px; } 313 | .ui-icon-notice { background-position: -32px -144px; } 314 | .ui-icon-help { background-position: -48px -144px; } 315 | .ui-icon-check { background-position: -64px -144px; } 316 | .ui-icon-bullet { background-position: -80px -144px; } 317 | .ui-icon-radio-on { background-position: -96px -144px; } 318 | .ui-icon-radio-off { background-position: -112px -144px; } 319 | .ui-icon-pin-w { background-position: -128px -144px; } 320 | .ui-icon-pin-s { background-position: -144px -144px; } 321 | .ui-icon-play { background-position: 0 -160px; } 322 | .ui-icon-pause { background-position: -16px -160px; } 323 | .ui-icon-seek-next { background-position: -32px -160px; } 324 | .ui-icon-seek-prev { background-position: -48px -160px; } 325 | .ui-icon-seek-end { background-position: -64px -160px; } 326 | .ui-icon-seek-start { background-position: -80px -160px; } 327 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ 328 | .ui-icon-seek-first { background-position: -80px -160px; } 329 | .ui-icon-stop { background-position: -96px -160px; } 330 | .ui-icon-eject { background-position: -112px -160px; } 331 | .ui-icon-volume-off { background-position: -128px -160px; } 332 | .ui-icon-volume-on { background-position: -144px -160px; } 333 | .ui-icon-power { background-position: 0 -176px; } 334 | .ui-icon-signal-diag { background-position: -16px -176px; } 335 | .ui-icon-signal { background-position: -32px -176px; } 336 | .ui-icon-battery-0 { background-position: -48px -176px; } 337 | .ui-icon-battery-1 { background-position: -64px -176px; } 338 | .ui-icon-battery-2 { background-position: -80px -176px; } 339 | .ui-icon-battery-3 { background-position: -96px -176px; } 340 | .ui-icon-circle-plus { background-position: 0 -192px; } 341 | .ui-icon-circle-minus { background-position: -16px -192px; } 342 | .ui-icon-circle-close { background-position: -32px -192px; } 343 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } 344 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } 345 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } 346 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } 347 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } 348 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } 349 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } 350 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } 351 | .ui-icon-circle-zoomin { background-position: -176px -192px; } 352 | .ui-icon-circle-zoomout { background-position: -192px -192px; } 353 | .ui-icon-circle-check { background-position: -208px -192px; } 354 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } 355 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } 356 | .ui-icon-circlesmall-close { background-position: -32px -208px; } 357 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } 358 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } 359 | .ui-icon-squaresmall-close { background-position: -80px -208px; } 360 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 361 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 362 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } 363 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 364 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 365 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } 366 | 367 | 368 | /* Misc visuals 369 | ----------------------------------*/ 370 | 371 | /* Corner radius */ 372 | .ui-corner-all, 373 | .ui-corner-top, 374 | .ui-corner-left, 375 | .ui-corner-tl { 376 | border-top-left-radius: 4px; 377 | } 378 | .ui-corner-all, 379 | .ui-corner-top, 380 | .ui-corner-right, 381 | .ui-corner-tr { 382 | border-top-right-radius: 4px; 383 | } 384 | .ui-corner-all, 385 | .ui-corner-bottom, 386 | .ui-corner-left, 387 | .ui-corner-bl { 388 | border-bottom-left-radius: 4px; 389 | } 390 | .ui-corner-all, 391 | .ui-corner-bottom, 392 | .ui-corner-right, 393 | .ui-corner-br { 394 | border-bottom-right-radius: 4px; 395 | } 396 | 397 | /* Overlays */ 398 | .ui-widget-overlay { 399 | background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat; 400 | opacity: .5; 401 | filter: Alpha(Opacity=50); /* support: IE8 */ 402 | } 403 | .ui-widget-shadow { 404 | margin: -5px 0 0 -5px; 405 | padding: 5px; 406 | background: #000000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x; 407 | opacity: .2; 408 | filter: Alpha(Opacity=20); /* support: IE8 */ 409 | border-radius: 5px; 410 | } 411 | -------------------------------------------------------------------------------- /web_engine/jquery-ui.theme.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.11.1 - 2014-09-29 2 | * http://jqueryui.com 3 | * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ 4 | 5 | .ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px} -------------------------------------------------------------------------------- /web_engine/reproduce_one_frame_ilda.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # j4cDAC test code 4 | # 5 | # Copyright 2011 Jacob Potter 6 | # 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, version 3. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this program. If not, see . 18 | 19 | import sys 20 | import ILDA 21 | from ILDA import readFrames, readFirstFrame 22 | import dac 23 | 24 | #dac.find_dac() 25 | 26 | if __name__ == "__main__": 27 | 28 | if len(sys.argv) < 2: 29 | print "Usage:" 30 | print sys.argv[0] + " filename" 31 | exit(0) 32 | filename = sys.argv[1] 33 | 34 | print "Finding DAC..." 35 | d = dac.DAC(dac.find_first_dac()) 36 | print "DAC found!" 37 | 38 | print "Going to reproduce: " + str(sys.argv[1]) 39 | f = open(sys.argv[1], 'rb') 40 | first_frame = readFirstFrame(f) 41 | f.close() 42 | try: 43 | d.play_stream(first_frame) 44 | except Exception, e: 45 | print "Exception : " + str(e) 46 | exit(0) 47 | -------------------------------------------------------------------------------- /web_engine/translation_dxf.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | # Based on the example copydxf from mozman -- 4 | 5 | import sys 6 | import time 7 | 8 | from ezdxf import readfile 9 | 10 | def translation_dxf(fromfile, tofile, x, y): 11 | starttime = time.time() 12 | dwg = readfile(fromfile) 13 | #print "dwg is type:" + str(type(dwg)) 14 | translation_x_y(dwg, x, y) 15 | dwg.saveas(tofile) 16 | endtime = time.time() 17 | print('Operation time: %.2f seconds' % (endtime-starttime) ) 18 | 19 | #TODO: see if we need to add a phantom point in the origin to make the translation actually work 20 | 21 | def translation_x_y(dwg, x, y): 22 | """Given a dwg object, translate x and y coordinates of everything""" 23 | x = float(x) 24 | y = float(y) 25 | #: :type dwg: ezdxf.drawing.Drawing 26 | for entity in dwg.entities: 27 | #print "Entity of type: " + str(entity.dxftype()) 28 | if "LINE" == entity.dxftype(): 29 | # This is madness for accesing! 30 | sx, sy, sz = entity.get_dxf_attrib('start') # I found it in the docs, I actually couldnt find it in attribs 31 | ex, ey, ez = entity.get_dxf_attrib('end') 32 | #print "Initial Start -> End" 33 | #print str((sx, sy, sz)) + " -> " + str((ex, ey, ez)) 34 | 35 | entity.set_dxf_attrib('start', (sx + x, sy + y, sz)) 36 | entity.set_dxf_attrib('end', (ex + x, ey + y, ez)) 37 | 38 | #print "Modified Start -> End (+" + str(x) + ", +" + str(y) + ")" 39 | #print str(entity.get_dxf_attrib('start')) + " -> " + str(entity.get_dxf_attrib('end')) 40 | #print 41 | elif "ARC" == entity.dxftype(): 42 | cx, cy, cz = entity.get_dxf_attrib('center') 43 | #print "Initial center" 44 | #print str((cx, cy, cz)) 45 | 46 | entity.set_dxf_attrib('center', (cx + x, cy + y, cz)) 47 | 48 | #print "Modified center (+" + str(x) + ", +" + str(y) + ")" 49 | #print entity.get_dxf_attrib('center') 50 | #print 51 | elif "CIRCLE" == entity.dxftype(): 52 | cx, cy, cz = entity.get_dxf_attrib('center') 53 | entity.set_dxf_attrib('center', (cx + x, cy + y, cz)) 54 | 55 | elif "POINT" == entity.dxftype(): 56 | # This is madness for accesing! 57 | lx, ly, lz = entity.get_dxf_attrib('location') # I found it in the docs, I actually couldnt find it in attribs 58 | entity.set_dxf_attrib('location', (lx + x, ly + y, lz)) 59 | 60 | else: 61 | print "\n\n !!!! ERROR: I don't know this entity type... " + str(entity.dxftype()) 62 | 63 | 64 | def add_square(dwg): 65 | # Get base square -1000 to 1000 66 | square_dxf = readfile('Square.dxf') 67 | 68 | 69 | if __name__=='__main__': 70 | print "Executing translation..." 71 | if len(sys.argv) != 5: 72 | print "Usage:" 73 | print sys.argv[0] + " input.dxf output.dxf x_coords y_coords" 74 | print "\n I.E.:\n" + sys.argv[0] + " /home/me/mydxf.dxf /home/me/translationeddxf.dxf 50 100" 75 | else: 76 | translation_dxf(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]) 77 | -------------------------------------------------------------------------------- /web_engine/uploaded/BE1275x.ild: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/awesomebytes/etherdream_tools/7ba3ba4828f43f323d76064ec0432b25b85f6e58/web_engine/uploaded/BE1275x.ild -------------------------------------------------------------------------------- /web_engine/uploaded/Be1x.ild: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/awesomebytes/etherdream_tools/7ba3ba4828f43f323d76064ec0432b25b85f6e58/web_engine/uploaded/Be1x.ild -------------------------------------------------------------------------------- /web_engine/uploaded/Be1x.ilda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/awesomebytes/etherdream_tools/7ba3ba4828f43f323d76064ec0432b25b85f6e58/web_engine/uploaded/Be1x.ilda -------------------------------------------------------------------------------- /web_engine/uploaded/IMG_20141024_231525.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/awesomebytes/etherdream_tools/7ba3ba4828f43f323d76064ec0432b25b85f6e58/web_engine/uploaded/IMG_20141024_231525.jpg -------------------------------------------------------------------------------- /web_engine/webserver.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # Example from http://www.acmesystems.it/python_httpserver 3 | from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer 4 | from os import curdir, sep 5 | import urlparse 6 | import cgi 7 | import time 8 | import subprocess 9 | 10 | import liblo 11 | import dac 12 | from ILDA import readFrames, readFirstFrame 13 | 14 | PORT_NUMBER = 8080 15 | 16 | USE_DAC = True 17 | 18 | 19 | #This class will handles any incoming request from 20 | #the browser 21 | class myHandler(BaseHTTPRequestHandler): 22 | 23 | def __init__(self, dac_object, *args): 24 | print "Initializing my handler" 25 | if USE_DAC: 26 | self.dac_obj = dac_object 27 | BaseHTTPRequestHandler.__init__(self, *args) 28 | 29 | 30 | def address_string(self): 31 | # http://stackoverflow.com/questions/2617615/slow-python-http-server-on-localhost 32 | # workaround for slow network access (phone) 33 | host, port = self.client_address[:2] 34 | #return socket.getfqdn(host) # default, slow, behaviour 35 | return host 36 | 37 | def do_POST(self): 38 | print "Got a POST" 39 | form = cgi.FieldStorage( 40 | fp=self.rfile, 41 | headers=self.headers, 42 | environ={'REQUEST_METHOD':'POST', 43 | 'CONTENT_TYPE':self.headers['Content-Type'], 44 | }) 45 | filename = form['file'].filename 46 | if form['x_coord'].value == '': 47 | x_coord = 0.0 48 | else: 49 | x_coord = float(form['x_coord'].value) # FieldStorage('x_coord', None, '10') 50 | 51 | if form['y_coord'].value == '': 52 | y_coord = 0.0 53 | else: 54 | y_coord = float(form['y_coord'].value) 55 | 56 | print "\n\n Translation coords: x_coord: " + str(x_coord) + " y_coord: " + str(y_coord) 57 | data = form['file'].file.read() 58 | print "Saving at: " + curdir + sep + 'uploaded/' + filename 59 | open(curdir + sep + 'uploaded/' + filename, "wb").write(data) 60 | 61 | uploaded_sentence = "" # Sentence must be empty!! (or js does not work correctly)#"uploaded %s, thanks"%filename 62 | self.send_response(200) 63 | self.send_header("Content-type", "text/html") 64 | self.send_header("Content-length", len(uploaded_sentence)) 65 | self.end_headers() 66 | #self.wfile.write(uploaded_sentence) 67 | 68 | # If the file has extension dxf, do translation and convert it 69 | if filename.endswith('.dxf') or filename.endswith('.DXF') : 70 | original_filename = curdir + sep + 'uploaded/' + filename 71 | if filename.endswith('.DXF'): 72 | ilda_filename = curdir + sep + 'uploaded/' + filename.replace('.DXF', '.ild') 73 | elif filename.endswith('.dxf'): 74 | ilda_filename = curdir + sep + 'uploaded/' + filename.replace('.dxf', '.ild') 75 | 76 | print "Transforming from dxf to ILDA... with fixed parameters 3m 3m (height, side)" 77 | dxf_to_ilda_process = subprocess.Popen([curdir + sep + "LaserBoy_dxf_to_ilda_tool", 78 | original_filename, ilda_filename, 79 | "3", "3", 80 | "20", 81 | str(x_coord), str(y_coord)]) 82 | dxf_to_ilda_process.wait() 83 | self.file_to_stream = ilda_filename 84 | elif filename.endswith('.ilda') or filename.endswith('.ild') or filename.endswith('.ILDA') or filename.endswith('.ILD'): 85 | self.file_to_stream = curdir + sep + 'uploaded/' + filename 86 | else: 87 | print "Error, not a file to stream, doing nothing" 88 | return 89 | # Execute the script that plays one file 90 | if USE_DAC: 91 | print "Streaming file" 92 | subprocess.Popen(["python", curdir + sep + "reproduce_one_frame_ilda.py", self.file_to_stream]) 93 | else: 94 | print "On debug mode, not streaming file" 95 | 96 | #Handler for the GET requests 97 | def do_GET(self): 98 | print "Path: " + str(self.path) 99 | sendReply = False 100 | 101 | if self.path=="/": 102 | mimetype='text/html' 103 | self.path="/index.html" 104 | sendReply = True 105 | if self.path.endswith(".jpg"): 106 | mimetype='image/jpg' 107 | sendReply = True 108 | if self.path.endswith(".png"): 109 | mimetype='image/png' 110 | sendReply = True 111 | if self.path.endswith(".gif"): 112 | mimetype='image/gif' 113 | sendReply = True 114 | if self.path.endswith(".js"): 115 | mimetype='application/javascript' 116 | sendReply = True 117 | if self.path.endswith(".css"): 118 | mimetype='text/css' 119 | sendReply = True 120 | 121 | if "pps=" in self.path: 122 | o = urlparse.urlparse(self.path) 123 | params_dict = urlparse.parse_qs(o.query) 124 | print "Parsed parameters:" 125 | print urlparse.parse_qs(o.query) 126 | if params_dict.has_key('pps'): 127 | pps_num = int ( params_dict['pps'][0] ) # it's a list of one element 128 | else: 129 | return 130 | self.send_response(200) 131 | mimetype='text/html' 132 | self.send_header('Content-type',mimetype) 133 | self.end_headers() 134 | contentToShow="You asked to change PPS to: " + str(pps_num) 135 | print contentToShow 136 | # Set the projector PPS! 137 | if USE_DAC: 138 | self.dac_obj.update(0, pps_num) # low water mark 0 (???), PPS given 139 | #set_pps_via_osc(pps_num) # OSC does not work while streaming 140 | self.wfile.write(contentToShow) 141 | return 142 | 143 | if self.path.endswith("stop"): 144 | self.send_response(200) 145 | mimetype='text/html' 146 | self.send_header('Content-type',mimetype) 147 | self.end_headers() 148 | if USE_DAC: 149 | self.dac_obj.stop() 150 | self.wfile.write("Stopped laser projection") 151 | return 152 | 153 | if sendReply == True: 154 | #Open the static file requested and send it 155 | print " Opening: " + str(curdir + sep + self.path) 156 | f = open(curdir + sep + self.path) 157 | print "Sending response 200" 158 | self.send_response(200) 159 | print "Sending headers" 160 | self.send_header('Content-type',mimetype) 161 | print "Sending end headers" 162 | self.end_headers() 163 | print "writting file" 164 | self.wfile.write(f.read()) 165 | print "Closing" 166 | f.close() 167 | print " Sent file." 168 | 169 | 170 | return 171 | 172 | 173 | # Optinally delete all old dxf ilda and ild files: 174 | #subprocess.Popen(["rm *.dxf *.ilda *.ild"]) 175 | 176 | 177 | 178 | dac_obj = None 179 | if USE_DAC: 180 | print "Trying to find DAC" 181 | DAC_IP = dac.find_first_dac() 182 | print "Found DAC at " + str(DAC_IP) 183 | dac_obj = dac.DAC(DAC_IP) 184 | print "Sending maximum geometry to " + str(DAC_IP) 185 | target = liblo.Address(DAC_IP, 60000) 186 | liblo.send(target, "/geom/tl", int(-1), int(1)) 187 | liblo.send(target, "/geom/tr", int(1), int(1)) 188 | liblo.send(target, "/geom/bl", int(-1), int(-1)) 189 | liblo.send(target, "/geom/br", int(1), int(-1)) 190 | 191 | def HTTP_handler_with_DAC(*args): 192 | myHandler(dac_obj, *args) 193 | 194 | try: 195 | #Create a web server and define the handler to manage the 196 | #incoming request 197 | server = HTTPServer(('', PORT_NUMBER), HTTP_handler_with_DAC) 198 | print 'Started httpserver on port ' , PORT_NUMBER 199 | 200 | #Wait forever for incoming http requests 201 | server.serve_forever() 202 | 203 | except KeyboardInterrupt: 204 | print '^C received, shutting down the web server' 205 | server.socket.close() --------------------------------------------------------------------------------