index.html 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>HOME ROUGH EDITOR v0.95</title>
  8. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css"
  9. integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
  10. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"
  11. integrity="sha512-xh6O/CkQoPOWDdYTDqeRdPCVd1SpvCA9XXcUnZS2FmJNp1coAFzvtCN9BmamE+4aHK8yyUHUSCcJHgXloTyT2A=="
  12. crossorigin="anonymous" referrerpolicy="no-referrer" />
  13. <!-- <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet"> -->
  14. <link rel="stylesheet" href="css/style.css">
  15. </head>
  16. <body style="background:#f2eee5;margin:0;padding:0; ">
  17. <header>Make by Home Rough Editor Ver.0.95</header>
  18. <svg id="lin" viewBox="0 0 1100 700" preserveAspectRatio="xMidYMin slice" xmlns="http://www.w3.org/2000/svg"
  19. style="z-index:2;margin:0;padding:0;width:100vw;height:100vh;position:absolute;top:0;left:0;right:0;bottom:0">
  20. <defs>
  21. <linearGradient id="gradientRed" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad">
  22. <stop offset="0%" stop-color="#e65d5e" stop-opacity="1" />
  23. <stop offset="100%" stop-color="#e33b3c" stop-opacity="1" />
  24. </linearGradient>
  25. <linearGradient id="gradientYellow" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad">
  26. <stop offset="0%" stop-color="#FDEB71" stop-opacity="1" />
  27. <stop offset="100%" stop-color="#F8D800" stop-opacity="1" />
  28. </linearGradient>
  29. <linearGradient id="gradientGreen" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad">
  30. <stop offset="0%" stop-color="#c0f7d9" stop-opacity="1" />
  31. <stop offset="100%" stop-color="#6ce8a3" stop-opacity="1" />
  32. </linearGradient>
  33. <linearGradient id="gradientSky" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad">
  34. <stop offset="0%" stop-color="#c4e0f4" stop-opacity="1" />
  35. <stop offset="100%" stop-color="#87c8f7" stop-opacity="1" />
  36. </linearGradient>
  37. <linearGradient id="gradientOrange" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad">
  38. <stop offset="0%" stop-color="#f9ad67" stop-opacity="1" />
  39. <stop offset="100%" stop-color="#f97f00" stop-opacity="1" />
  40. </linearGradient>
  41. <linearGradient id="gradientWhite" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad">
  42. <stop offset="0%" stop-color="#ffffff" stop-opacity="1" />
  43. <stop offset="100%" stop-color="#f0f0f0" stop-opacity="1" />
  44. </linearGradient>
  45. <linearGradient id="gradientGrey" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad">
  46. <stop offset="0%" stop-color="#666" stop-opacity="1" />
  47. <stop offset="100%" stop-color="#aaa" stop-opacity="1" />
  48. </linearGradient>
  49. <linearGradient id="gradientBlue" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad">
  50. <stop offset="0%" stop-color="#4f72a6" stop-opacity="1" />
  51. <stop offset="100%" stop-color="#365987" stop-opacity="1" />
  52. </linearGradient>
  53. <linearGradient id="gradientPurple" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad">
  54. <stop offset="0%" stop-color="#E2B0FF" stop-opacity="1" />
  55. <stop offset="100%" stop-color="#9F44D3" stop-opacity="1" />
  56. </linearGradient>
  57. <linearGradient id="gradientPink" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad">
  58. <stop offset="0%" stop-color="#f6c4dd" stop-opacity="1" />
  59. <stop offset="100%" stop-color="#f699c7" stop-opacity="1" />
  60. </linearGradient>
  61. <linearGradient id="gradientBlack" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad">
  62. <stop offset="0%" stop-color="#3c3b3b" stop-opacity="1" />
  63. <stop offset="100%" stop-color="#000000" stop-opacity="1" />
  64. </linearGradient>
  65. <linearGradient id="gradientNeutral" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad">
  66. <stop offset="0%" stop-color="#dbc6a0" stop-opacity="1" />
  67. <stop offset="100%" stop-color="#c69d56" stop-opacity="1" />
  68. </linearGradient>
  69. <pattern id="grass" patternUnits="userSpaceOnUse" width="256" height="256">
  70. <image
  71. xlink:href="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRWh5nEP_Trwo96CJjev6lnKe0_dRdA63RJFaoc3-msedgxveJd"
  72. x="0" y="0" width="256" height="256" />
  73. </pattern>
  74. <pattern id="wood" patternUnits="userSpaceOnUse" width="32" height="256">
  75. <image
  76. xlink:href="https://orig00.deviantart.net/e1f2/f/2015/164/8/b/old_oak_planks___seamless_texture_by_rls0812-d8x6htl.jpg"
  77. x="0" y="0" width="256" height="256" />
  78. </pattern>
  79. <pattern id="tiles" patternUnits="userSpaceOnUse" width="25" height="25">
  80. <image
  81. xlink:href="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQrkoI2Eiw8ya3J_swhfpZdi_ug2sONsI6TxEd1xN5af3DX9J3R"
  82. x="0" y="0" width="256" height="256" />
  83. </pattern>
  84. <pattern id="granite" patternUnits="userSpaceOnUse" width="256" height="256">
  85. <image
  86. xlink:href="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ9_nEMhnWVV47lxEn5T_HWxvFwkujFTuw6Ff26dRTl4rDaE8AdEQ"
  87. x="0" y="0" width="256" height="256" />
  88. </pattern>
  89. <pattern id="smallGrid" width="60" height="60" patternUnits="userSpaceOnUse">
  90. <path d="M 60 0 L 0 0 0 60" fill="none" stroke="#777" stroke-width="0.25" />
  91. </pattern>
  92. <pattern id="grid" width="180" height="180" patternUnits="userSpaceOnUse">
  93. <rect width="180" height="180" fill="url(#smallGrid)" />
  94. <path d="M 200 10 L 200 0 L 190 0 M 0 10 L 0 0 L 10 0 M 0 190 L 0 200 L 10 200 M 190 200 L 200 200 L 200 190"
  95. fill="none" stroke="#999" stroke-width="0.8" />
  96. </pattern>
  97. <pattern id="hatch" width="5" height="5" patternTransform="rotate(50 0 0)" patternUnits="userSpaceOnUse">
  98. <path d="M 0 0 L 0 5 M 10 0 L 10 10 Z" style="stroke:#666;stroke-width:5;" />
  99. </pattern>
  100. </defs>
  101. <g id="boxgrid">
  102. <rect width="8000" height="5000" x="-3500" y="-2000" fill="url(#grid)" />
  103. </g>
  104. <g id="boxpath"></g>
  105. <g id="boxSurface"></g>
  106. <g id="boxRoom"></g>
  107. <g id="boxwall"></g>
  108. <g id="boxcarpentry"></g>
  109. <g id="boxEnergy"></g>
  110. <g id="boxFurniture"></g>
  111. <g id="boxbind"></g>
  112. <g id="boxArea"></g>
  113. <g id="boxRib"></g>
  114. <g id="boxScale"></g>
  115. <g id="boxText"></g>
  116. <g id="boxDebug"></g>
  117. </svg>
  118. <div id="areaValue"></div>
  119. <div id="reportTools" class="leftBox" style="width:500px;overflow-y: scroll;overflow-x: hidden">
  120. <h2><i class="fa fa-calculator" aria-hidden="true"></i> Report plan.</h2>
  121. <br /><br />
  122. <h2 class="toHide" id="reportTotalSurface" style="display:none"></h2>
  123. <h2 class="toHide" id="reportNumberSurface" style="display:none"></h2>
  124. <hr />
  125. <section id="reportRooms" class="toHide" style="display:none">
  126. </section>
  127. <button class="btn btn-info fully" style="margin-top:50px"
  128. onclick="$('#reportTools').hide('500', function(){$('#panel').show(300);});mode = 'select_mode';"><i
  129. class="fa fa-2x fa-backward" aria-hidden="true"></i></button>
  130. </div>
  131. <!-- Combined Import Modal -->
  132. <div class="modal fade" id="combinedImportModal" tabindex="-1" aria-labelledby="combinedImportLabel" aria-hidden="true">
  133. <div class="modal-dialog">
  134. <div class="modal-content">
  135. <div class="modal-header">
  136. <h5 class="modal-title" id="combinedImportLabel">Import Floorplan JSON + Image</h5>
  137. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  138. </div>
  139. <div class="modal-body">
  140. <div class="mb-3">
  141. <label class="form-label">Floorplan JSON</label>
  142. <input type="file" id="combined_json_input" accept=".json" class="form-control" />
  143. <small id="combined_json_name" class="form-text text-muted"></small>
  144. </div>
  145. <div class="mb-3">
  146. <label class="form-label">Background image (PNG, JPG)</label>
  147. <input type="file" id="combined_image_input" accept="image/png,image/jpeg,image/jpg" class="form-control" />
  148. <small id="combined_image_name" class="form-text text-muted"></small>
  149. </div>
  150. <div id="combined_error_msg" class="text-danger small"></div>
  151. <div id="combined_success_msg" class="text-success small"></div>
  152. </div>
  153. <div class="modal-footer">
  154. <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
  155. <button type="button" class="btn btn-primary" id="combined_import_btn" disabled>Import</button>
  156. </div>
  157. </div>
  158. </div>
  159. </div>
  160. <!-- AI Import Modal -->
  161. <div class="modal fade" id="aiImportModal" tabindex="-1" aria-labelledby="aiImportLabel" aria-hidden="true">
  162. <div class="modal-dialog">
  163. <div class="modal-content">
  164. <div class="modal-header">
  165. <h5 class="modal-title" id="aiImportLabel">Import from AI</h5>
  166. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  167. </div>
  168. <div class="modal-body">
  169. <div class="mb-3">
  170. <label class="form-label">AI Floorplan JSON</label>
  171. <input type="file" id="ai_json_input" accept=".json" class="form-control" />
  172. <small id="ai_json_name" class="form-text text-muted">Expected format: {"walls": [[x0,y0,x1,y1], ...]}</small>
  173. </div>
  174. <div class="mb-3">
  175. <label class="form-label">Floorplan Width (meters)</label>
  176. <div class="input-group">
  177. <input type="number" id="ai_target_width" min="0.1" step="0.1" class="form-control" placeholder="e.g. 10.5" />
  178. <span class="input-group-text">m</span>
  179. </div>
  180. <small class="form-text text-muted">The imported floorplan will be scaled to this width</small>
  181. </div>
  182. <div id="ai_error_msg" class="text-danger small"></div>
  183. <div id="ai_success_msg" class="text-success small"></div>
  184. </div>
  185. <div class="modal-footer">
  186. <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
  187. <button type="button" class="btn btn-primary" id="ai_import_btn" disabled>Import & Scale</button>
  188. </div>
  189. </div>
  190. </div>
  191. </div>
  192. <div id="wallTools" class="leftBox">
  193. <h2 id="titleWallTools">Modify the wall</h2>
  194. <hr />
  195. <section id="rangeThick">
  196. <p>Width [<span id="wallWidthScale"></span>] : <span id="wallWidthVal"></span> cm</span></p>
  197. <input type="range" id="wallWidth" step="0.1" class="range" />
  198. </section>
  199. <ul class="list-unstyled">
  200. <section id="cutWall">
  201. <p>Cut the wall :<br /><small>A cut will be made at each wall encountered.</small></p>
  202. <li><button class="btn btn-light shadow fully" onclick="editor.splitWall();"><i class="fa fa-2x fa-cutlery"
  203. aria-hidden="true"></i></button></li>
  204. </section>
  205. <br />
  206. <section id="separate">
  207. <p>Separation wall :<br /><small>Transform the wall into simple separation line.</small></p>
  208. <li><button class="btn btn-light shadow fully" onclick="editor.invisibleWall();" id="wallInvisible"><i
  209. class="fa fa-2x fa-crop" aria-hidden="true"></i></button></li>
  210. </section>
  211. <section id="recombine">
  212. <p>Transform to wall :<br /><small>The thickness will be identical to the last known.</small></p>
  213. <li><button class="btn btn-light shadow fully" onclick="editor.visibleWall();" id="wallVisible"><i
  214. class="fa fa-2x fa-crop" aria-hidden="true"></i></button></li>
  215. </section>
  216. <br />
  217. <li><button class="btn btn-danger fully" id="wallTrash"><i class="fa fa-2x fa-trash"
  218. aria-hidden="true"></i></button></li>
  219. <li><button class="btn btn-info fully" style="margin-top:50px"
  220. onclick="fonc_button('select_mode');$('#boxinfo').html('Selection mode');$('#wallTools').hide('300');$('#panel').show('300');"><i
  221. class="fa fa-2x fa-backward" aria-hidden="true"></i></button></li>
  222. </ul>
  223. </div>
  224. <div id="objBoundingBox" class="leftBox">
  225. <h2>Modify object</h2>
  226. <hr />
  227. <section id="objBoundingBoxScale">
  228. <p>Width [<span id="bboxWidthScale"></span>] : <span id="bboxWidthVal"></span> cm</span></p>
  229. <input type="range" id="bboxWidth" step="1" class="range" />
  230. <p>Length [<span id="bboxHeightScale"></span>] : <span id="bboxHeightVal"></span> cm</span></p>
  231. <input type="range" id="bboxHeight" step="1" class="range" />
  232. </section>
  233. <section id="objBoundingBoxRotation">
  234. <p><i class="fa fa-compass" aria-hidden="true"></i> Rotation : <span id="bboxRotationVal"></span> °</p>
  235. <input type="range" id="bboxRotation" step="1" class="range" min="-180" max="180" />
  236. </section>
  237. <div id="stepsCounter" style="display:none;">
  238. <p><span id="bboxSteps">Nb steps [2-15] : <span id="bboxStepsVal">0</span></span></p>
  239. <button class="btn btn-info" id="bboxStepsAdd"><i class="fa fa-plus" aria-hidden="true"></i></button>
  240. <button class="btn btn-info" id="bboxStepsMinus"><i class="fa fa-minus" aria-hidden="true"></i></button>
  241. </div>
  242. <div id="objBoundingBoxColor" style="display:none">
  243. <div class="color textEditorColor" data-type="gradientRed"
  244. style="color:#f55847;background:linear-gradient(30deg, #f55847, #f00);"></div>
  245. <div class="color textEditorColor" data-type="gradientYellow"
  246. style="color:#e4c06e;background:linear-gradient(30deg,#e4c06e, #ffb000);"></div>
  247. <div class="color textEditorColor" data-type="gradientGreen"
  248. style="color:#88cc6c;background:linear-gradient(30deg,#88cc6c, #60c437);"></div>
  249. <div class="color textEditorColor" data-type="gradientSky"
  250. style="color:#77e1f4;background:linear-gradient(30deg,#77e1f4, #00d9ff);"></div>
  251. <div class="color textEditorColor" data-type="gradientBlue"
  252. style="color:#4f72a6;background:linear-gradient(30deg,#4f72a6, #284d7e);"></div>
  253. <div class="color textEditorColor" data-type="gradientGrey"
  254. style="color:#666666;background:linear-gradient(30deg,#666666, #aaaaaa);"></div>
  255. <div class="color textEditorColor" data-type="gradientWhite"
  256. style="color:#fafafa;background:linear-gradient(30deg,#fafafa, #eaeaea);"></div>
  257. <div class="color textEditorColor" data-type="gradientOrange"
  258. style="color:#f9ad67;background:linear-gradient(30deg, #f9ad67, #f97f00);"></div>
  259. <div class="color textEditorColor" data-type="gradientPurple"
  260. style="color:#a784d9;background:linear-gradient(30deg,#a784d9, #8951da);"></div>
  261. <div class="color textEditorColor" data-type="gradientPink"
  262. style="color:#df67bd;background:linear-gradient(30deg,#df67bd, #e22aae);"></div>
  263. <div class="color textEditorColor" data-type="gradientBlack"
  264. style="color:#3c3b3b;background:linear-gradient(30deg,#3c3b3b, #000000);"></div>
  265. <div class="color textEditorColor" data-type="gradientNeutral"
  266. style="color:#e2c695;background:linear-gradient(30deg,#e2c695, #c69d56);"></div>
  267. <div style="clear:both"></div>
  268. </div>
  269. <br /><br />
  270. <button class="btn btn-danger fully" id="bboxTrash"><i class="fa fa-2x fa-trash" aria-hidden="true"></i></button>
  271. <button class="btn btn-info" style="margin-top:100px"
  272. onclick="fonc_button('select_mode');$('#boxinfo').html('Selection mode');$('#objBoundingBox').hide(100);$('#panel').show(200);binder.graph.remove();delete binder;"><i
  273. class="fa fa-2x fa-backward" aria-hidden="true"></i></button>
  274. </div>
  275. <div id="objTools" class="leftBox">
  276. <h2>Modify door/window</h2>
  277. <hr />
  278. <ul class="list-unstyled">
  279. <br /><br />
  280. <li><button class="btn btn-light shadow fully" id="objToolsHinge">Reverse hinges</button></li>
  281. <p>Width [<span id="doorWindowWidthScale"></span>] : <span id="doorWindowWidthVal"></span> cm</span></p>
  282. <input type="range" id="doorWindowWidth" step="1" class="range" />
  283. <br />
  284. <li><button class="btn btn-danger fully objTrash"><i class="fa fa-2x fa-trash" aria-hidden="true"></i></button>
  285. </li>
  286. <li><button class="btn btn-info" style="margin-top:100px"
  287. onclick="fonc_button('select_mode');$('#boxinfo').html('Selection mode');$('#objTools').hide('100');$('#panel').show('200');binder.graph.remove();delete binder;rib();"><i
  288. class="fa fa-2x fa-backward" aria-hidden="true"></i></button></li>
  289. </ul>
  290. </div>
  291. <div id="roomTools" class="leftBox">
  292. <span style="color:#08d">Home Rough Editor</span> estimated a surface of :<br /><b><span class="size"></span></b>
  293. <br /><br />
  294. <p>If you have the actual area, you can write it</p>
  295. <div class="input-group">
  296. <input type="text" class="form-control" id="roomSurface" placeholder="surface réelle"
  297. aria-describedby="basic-addon2">
  298. <span class="input-group-addon" id="basic-addon2">m²</span>
  299. </div>
  300. <br />
  301. <input type="hidden" id="roomName" value="" />
  302. Wording :<br />
  303. <select class="form-select" aria-label="Default select example" id="roomLabel">
  304. <option selected value="0">None</option>
  305. <option value="1">Lounge</option>
  306. <option value="2">Lunchroom</option>
  307. <option value="3">Kitchen</option>
  308. <option value="4">Toilet</option>
  309. <option value="5">Bathroom</option>
  310. <option value="6">Bedroom 1</option>
  311. <option value="7">Bedroom 2</option>
  312. <option value="8">Bedroom 3</option>
  313. <option value="9">Locker</option>
  314. <option value="10">Office</option>
  315. <option value="11">Hall</option>
  316. <option value="12">Loggia</option>
  317. <option value="13">Bath 2</option>
  318. <option value="14">Toilet 2</option>
  319. <option value="15">Bedroom 4</option>
  320. <option value="16">Bedroom 5</option>
  321. <option value="17">Balcony</option>
  322. <option value="18">Terrace</option>
  323. <option value="19">Corridor</option>
  324. <option value="20">Garage</option>
  325. <option value="21">Clearance</option>
  326. </select>
  327. <br />
  328. <br />
  329. Meter :
  330. <div class="funkyradio">
  331. <div class="funkyradio-success">
  332. <input type="checkbox" name="roomShow" value="showSurface" id="seeArea" checked />
  333. <label for="seeArea">Show the surface</label>
  334. </div>
  335. </div>
  336. <div class="funkyradio">
  337. <div class="funkyradio-success">
  338. <input type="radio" name="roomAction" id="addAction" value="add" checked />
  339. <label for="addAction">Add the surface</label>
  340. </div>
  341. <div class="funkyradio-warning">
  342. <input type="radio" name="roomAction" id="passAction" value="pass" />
  343. <label for="passAction">Ignore the surface</label>
  344. </div>
  345. </div>
  346. <hr />
  347. <p>Colors</p>
  348. <div class="roomColor" data-type="gradientRed" style="background:linear-gradient(30deg, #f55847, #f00);"></div>
  349. <div class="roomColor" data-type="gradientYellow" style="background:linear-gradient(30deg,#e4c06e, #ffb000);"></div>
  350. <div class="roomColor" data-type="gradientGreen" style="background:linear-gradient(30deg,#88cc6c, #60c437);"></div>
  351. <div class="roomColor" data-type="gradientSky" style="background:linear-gradient(30deg,#77e1f4, #00d9ff);"></div>
  352. <div class="roomColor" data-type="gradientBlue" style="background:linear-gradient(30deg,#4f72a6, #284d7e);"></div>
  353. <div class="roomColor" data-type="gradientGrey" style="background:linear-gradient(30deg,#666666, #aaaaaa);"></div>
  354. <div class="roomColor" data-type="gradientWhite" style="background:linear-gradient(30deg,#fafafa, #eaeaea);"></div>
  355. <div class="roomColor" data-type="gradientOrange" style="background:linear-gradient(30deg, #f9ad67, #f97f00);">
  356. </div>
  357. <div class="roomColor" data-type="gradientPurple" style="background:linear-gradient(30deg,#a784d9, #8951da);"></div>
  358. <div class="roomColor" data-type="gradientPink" style="background:linear-gradient(30deg,#df67bd, #e22aae);"></div>
  359. <div class="roomColor" data-type="gradientBlack" style="background:linear-gradient(30deg,#3c3b3b, #000000);"></div>
  360. <div class="roomColor" data-type="gradientNeutral" style="background:linear-gradient(30deg,#e2c695, #c69d56);">
  361. </div>
  362. <br /><br />
  363. <p>Matérials</p>
  364. <div class="roomColor" data-type="wood"
  365. style="background: url('https://orig00.deviantart.net/e1f2/f/2015/164/8/b/old_oak_planks___seamless_texture_by_rls0812-d8x6htl.jpg');">
  366. </div>
  367. <div class="roomColor" data-type="tiles"
  368. style="background: url('https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQrkoI2Eiw8ya3J_swhfpZdi_ug2sONsI6TxEd1xN5af3DX9J3R');">
  369. </div>
  370. <div class="roomColor" data-type="granite"
  371. style="background: url('https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ9_nEMhnWVV47lxEn5T_HWxvFwkujFTuw6Ff26dRTl4rDaE8AdEQ');">
  372. </div>
  373. <div class="roomColor" data-type="grass"
  374. style="background: url('https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRWh5nEP_Trwo96CJjev6lnKe0_dRdA63RJFaoc3-msedgxveJd');">
  375. </div>
  376. <div data-type="#ff008a" style="clear:both"></div>
  377. <br /><br />
  378. <input type="hidden" id="roomBackground" value="gradientNeutral" />
  379. <input type="hidden" id="roomIndex" value="" />
  380. <button type="button" class="btn btn-primary" id="applySurface">Apply</button>
  381. <button type="button" class="btn btn-danger" id="resetRoomTools">Cancel</button>
  382. <br />
  383. </div>
  384. <div id="furniturePanel" class="leftBox">
  385. <h2>Furniture Placement</h2>
  386. <hr />
  387. <p>Select furniture to place:</p>
  388. <div id="furniture_options" style="max-height: 400px; overflow-y: auto;">
  389. <!-- Furniture options will be populated here -->
  390. </div>
  391. <hr />
  392. <button class="btn btn-info fully" onclick="exitFurnitureMode();">
  393. <i class="fa fa-backward" aria-hidden="true"></i> Back to Selection
  394. </button>
  395. </div>
  396. <div id="furnitureTools" class="leftBox">
  397. <h2>Furniture Details</h2>
  398. <hr />
  399. <div id="furnitureDetails">
  400. <p><strong>Name:</strong> <span id="furnitureName"></span></p>
  401. <p><strong>Category:</strong> <span id="furnitureCategory"></span></p>
  402. <p><strong>ID:</strong> <span id="furnitureId"></span></p>
  403. <p><strong>Rotation:</strong> <span id="furnitureRotationValue">0</span>°</p>
  404. <input type="range" id="furnitureRotationSlider" min="-180" max="180" value="0" step="1" class="range" style="width: 100%; margin: 10px 0;" />
  405. </div>
  406. <br />
  407. <button class="btn btn-danger fully" id="furnitureRemove"><i class="fa fa-2x fa-trash" aria-hidden="true"></i></button>
  408. <button class="btn btn-info" style="margin-top:50px"
  409. onclick="hideFurnitureTools();"><i
  410. class="fa fa-2x fa-backward" aria-hidden="true"></i></button>
  411. </div>
  412. <div id="backgroundImageTools" class="leftBox">
  413. <h2>Background Image Settings</h2>
  414. <hr />
  415. <section id="backgroundImageSize">
  416. <p>Size (meters)</p>
  417. <div class="input-group mb-2" style="display:flex; align-items:center; gap:8px;">
  418. <span class="input-group-text" style="min-width:60px; font-size:12px; padding:4px 6px;">Width</span>
  419. <input type="number" step="0.1" min="0.1" id="backgroundImageWidthM" class="form-control" style="flex:1 1 auto; width:100%; max-width:none;" />
  420. <span class="input-group-text" style="font-size:12px; padding:4px 6px;">m</span>
  421. </div>
  422. <div class="input-group mb-2" style="display:flex; align-items:center; gap:8px;">
  423. <span class="input-group-text" style="min-width:60px; font-size:12px; padding:4px 6px;">Height</span>
  424. <input type="number" step="0.1" min="0.1" id="backgroundImageHeightM" class="form-control" style="flex:1 1 auto; width:100%; max-width:none;" />
  425. <span class="input-group-text" style="font-size:12px; padding:4px 6px;">m</span>
  426. </div>
  427. <small id="backgroundImageAspectInfo" class="text-muted"></small>
  428. <hr />
  429. <p>Opacity [<span id="backgroundImageOpacityRange"></span>] : <span id="backgroundImageOpacityVal">70</span>%</p>
  430. <input type="range" id="backgroundImageOpacitySlider" step="5" min="0" max="100" value="70" class="range" />
  431. </section>
  432. <br />
  433. <button class="btn btn-danger fully" id="backgroundImageRemove"><i class="fa fa-2x fa-trash" aria-hidden="true"></i></button>
  434. <button class="btn btn-info" style="margin-top:50px"
  435. onclick="exitFloorplanMode();fonc_button('select_mode');$('#boxinfo').html('Selection mode');"><i
  436. class="fa fa-2x fa-backward" aria-hidden="true"></i></button>
  437. </div>
  438. <div id="scalingTools" class="leftBox" style="display:none;">
  439. <h2>Floorplan Scaling</h2>
  440. <hr />
  441. <p>Current floorplan dimensions:</p>
  442. <section id="scalingDimensions">
  443. <div class="input-group mb-2" style="display:flex; align-items:center; gap:8px;">
  444. <span class="input-group-text" style="min-width:60px; font-size:12px; padding:4px 6px;">Width</span>
  445. <input type="number" id="floorplanWidth" min="0.1" step="0.1" class="form-control" style="flex:1 1 auto; width:100%; max-width:none;" oninput="updateFloorplanWidth()" />
  446. <span class="input-group-text" style="font-size:12px; padding:4px 6px;">m</span>
  447. </div>
  448. <div class="input-group mb-2" style="display:flex; align-items:center; gap:8px;">
  449. <span class="input-group-text" style="min-width:60px; font-size:12px; padding:4px 6px;">Height</span>
  450. <input type="number" id="floorplanHeight" min="0.1" step="0.1" class="form-control" style="flex:1 1 auto; width:100%; max-width:none;" oninput="updateFloorplanHeight()" />
  451. <span class="input-group-text" style="font-size:12px; padding:4px 6px;">m</span>
  452. </div>
  453. </section>
  454. <hr />
  455. <section id="scalingInfo">
  456. <div class="small text-muted">
  457. <div>Original: <span id="originalDimensions">-</span></div>
  458. <div>Scale factor: <span id="scaleFactor">1.0</span></div>
  459. </div>
  460. </section>
  461. <br />
  462. <button class="btn btn-info" onclick="exitScalingMode()"><i
  463. class="fa fa-2x fa-backward" aria-hidden="true"></i> Exit Scaling</button>
  464. </div>
  465. <div id="panel" class="leftBox">
  466. <ul class="list-unstyled">
  467. <li><button class="btn disabled halfy " id="undo" title="undo"><i class="fa fa-chevron-circle-left"
  468. aria-hidden="true"></i>
  469. <button class="btn disabled halfy pull-right" id="redo" title="redo"><i class="fa fa-chevron-circle-right"
  470. aria-hidden="true"></i></button>
  471. </li>
  472. <br />
  473. <li><button class="btn btn-success fully " id="select_mode" style="box-shadow:2px 2px 3px #ccc;"><i
  474. class="fa fa-2x fa-mouse-pointer" aria-hidden="true"></i></button></li>
  475. <br />
  476. <li>
  477. <button class="btn btn-light shadow fully " style="margin-bottom:0px" id="line_mode" data-toggle="tooltip"
  478. data-placement="right" title="Make walls">WALL</button>
  479. <button class="mt-2 btn btn-light shadow fully " style="margin-bottom:0px" id="partition_mode"
  480. data-toggle="tooltip" data-placement="right" title="Make partitions wall">PARTITION</button>
  481. <div class="funkyradio" style="font-size:0.8em">
  482. <div class="funkyradio-success">
  483. <input type="checkbox" id="multi" checked />
  484. <label for="multi">MULTIPLE</label>
  485. </div>
  486. </div>
  487. </li>
  488. <br />
  489. <li><button class="btn btn-light shadow fully " id="room_mode">CONFIG. ROOMS</button></li>
  490. <br />
  491. <li><button class="btn btn-light shadow fully " id="node_mode"><i class="fa fa-2x fa-scissors"
  492. aria-hidden="true"></i></button></li>
  493. <br />
  494. <li><button class="btn btn-light shadow fully " id="distance_mode" data-toggle="tooltip" data-placement="right" style="display:none"
  495. title="Add a measurement">MEASURE</button></li>
  496. <li><button class="btn btn-light shadow fully " id="text_mode" data-toggle="tooltip" data-placement="right" style="display:none"
  497. title="Add text">TEXT</button></li>
  498. <br />
  499. <div id="door_list" class="list-unstyled sub"
  500. style="box-shadow:2px 2px 3px #ccc;display:none;background:#fff;border-radius: 0 5px 5px 0; padding:10px;position:absolute;left:200px;width:150px;display:none">
  501. <button class="btn fully door" id="aperture">Aperture</button>
  502. <button class="btn fully door" id="simple">Simple</button>
  503. <button class="btn fully door" id="double">Double</button>
  504. <button class="btn fully door" id="pocket">Pocket</button>
  505. </div>
  506. <li><button class="btn btn-light shadow fully " id="door_mode" style="display:none"
  507. onclick="$('.sub').hide();$('#door_list').toggle(200);$('#window_list').hide();">DOOR</button></li>
  508. <!-- New simplified Door button maps to Door/Simple without duplicating IDs -->
  509. <li><button class="btn btn-light shadow fully" id="door_simple_btn" title="Add a simple door"
  510. onclick="$('#select_mode').trigger('click'); linElement.css('cursor','crosshair');$('#boxinfo').html('Add a door');fonc_button('door_mode','simple');">Door</button></li>
  511. <div id="window_list" class="list-unstyled sub"
  512. style="box-shadow:2px 2px 3px #ccc;display:none;background:#fff;border-radius: 0 5px 5px 0; padding:10px;position:absolute;left:200px;width:150px;display:none">
  513. <button class="btn fully window" id="fix">Fix</button>
  514. <button class="btn fully window" id="flap">Simple</button>
  515. <button class="btn fully window" id="twin">Double</button>
  516. <button class="btn fully window" id="bay">Slide</button>
  517. </div>
  518. <li><button class="btn btn-light shadow fully " id="window_mode" style="display:none"
  519. onclick="$('.sub').hide();$('#window_list').toggle(200);$('#door_list').hide()">WINDOW</button></li>
  520. <!-- New simplified Window button maps to Window/Fix without duplicating IDs -->
  521. <li><button class="btn btn-light shadow fully" id="window_fix_btn" title="Add a fixed window"
  522. onclick="$('#select_mode').trigger('click'); linElement.css('cursor','crosshair');$('#boxinfo').html('Add a window');fonc_button('door_mode','fix');">Window</button></li>
  523. <li><button class="btn btn-light shadow fully object" id="stair_mode" style="display:none"
  524. onclick="$('.sub').hide();$('#door_list').hide()">STAIR</button></li>
  525. <br />
  526. <div id="energy_list" class="list-unstyled sub"
  527. style="box-shadow:2px 2px 3px #ccc;display:none;background:#fff;border-radius: 0 5px 5px 0; padding:10px;position:absolute;left:200px;bottom:40px;width:600px">
  528. <div style="width:600px;float:left;padding:10px">
  529. <p>Energy</p>
  530. <div style="float:left;padding:10px;margin:5px;border:1px solid #ddd;border-radius:5px">
  531. <p>High current</p>
  532. <div style="width:120px;float:left;padding:2px">
  533. <button class="btn btn-light fully object" id="gtl">Switchboard</button>
  534. <button class="btn btn-light fully object" id="switch">Switch</button>
  535. <button class="btn btn-light fully object" id="doubleSwitch">Multiways</button>
  536. <button class="btn btn-light fully object" id="dimmer">Variator</button>
  537. </div>
  538. <div style="width:120px;float:left;padding:2px">
  539. <button class="btn btn-light fully object" id="plug">Electrical outlet</button>
  540. <button class="btn btn-light fully object" id="plug20">Outlet 20A</button>
  541. <button class="btn btn-light fully object" id="plug32">Outlet 32A</button>
  542. <button class="btn btn-light fully object" id="rooflight shadow">Ceiling lamp</button>
  543. <button class="btn btn-light fully object" id="walllight shadow">Wall light</button>
  544. </div>
  545. </div>
  546. <div style="width:130px;float:left;padding:10px;margin:5px;border:1px solid #ddd;border-radius:5px">
  547. <p>Low current</p>
  548. <button class="btn btn-light fully object" id="www">Internet access</button>
  549. <button class="btn btn-light fully object" id="rj45">RJ45 plug</button>
  550. <button class="btn btn-light fully object" id="tv">Antenna plug</button>
  551. </div>
  552. <div style="width:130px;float:left;padding:10px;margin:5px;border:1px solid #ddd;border-radius:5px">
  553. <p>Thermal</p>
  554. <button class="btn btn-light fully object" id="boiler">Boiler</button>
  555. <button class="btn btn-light fully object" id="heater">Water heater</button>
  556. <button class="btn btn-light fully object" id="radiator">Radiator</button>
  557. </div>
  558. </div>
  559. </div>
  560. <li><button class="btn btn-light shadow fully " id="object_mode" style="display:none"
  561. onclick="$('.sub').hide();$('#energy_list').toggle(200);">ENERGY</button></li>
  562. <li><button class="btn btn-light shadow fully " id="furniture_mode" onclick="enterFurnitureMode();">FURNITURE</button></li>
  563. <br />
  564. <li><button class="btn btn-light shadow fully " id="layer_mode"
  565. onclick="$('.sub').hide();$('#layer_list').css('top', $('#layer_mode').position().top + 'px').toggle(200);">Layers</button></li>
  566. <li>
  567. <button class="btn btn-light shadow fully" id="floorplan_mode_btn" title="Toggle floorplan mode" disabled
  568. onclick="toggleFloorplanMode(this);">Floorplan mode</button>
  569. <div id="floorplan_filename" class="small text-muted mt-1" style="word-break: break-all;"></div>
  570. </li>
  571. <li>
  572. <button class="btn btn-light shadow fully" id="scaling_mode_btn" title="Toggle floorplan scaling mode"
  573. onclick="toggleScalingMode(this);">Scaling mode</button>
  574. </li>
  575. <div id="layer_list" class="list-unstyled sub"
  576. style="box-shadow:2px 2px 3px #ccc;display:none;background:#fff;border-radius: 0 5px 5px 0; padding:10px;position:absolute;left:200px;width:200px">
  577. <div class="funkyradio" style="font-size:0.8em">
  578. <div class="funkyradio-info">
  579. <input type="checkbox" id="showRib" checked />
  580. <label for="showRib">Measurement</label>
  581. </div>
  582. </div>
  583. <div class="funkyradio" style="font-size:0.8em">
  584. <div class="funkyradio-info">
  585. <input type="checkbox" id="showArea" checked />
  586. <label for="showArea">Surface</label>
  587. </div>
  588. </div>
  589. <div class="funkyradio" style="font-size:0.8em">
  590. <div class="funkyradio-info">
  591. <input type="checkbox" id="showLayerRoom" checked />
  592. <label for="showLayerRoom">Texture</label>
  593. </div>
  594. </div>
  595. <div class="funkyradio" style="font-size:0.8em;display:none">
  596. <div class="funkyradio-info">
  597. <input type="checkbox" id="showLayerEnergy" checked />
  598. <label for="showLayerEnergy">Energy</label>
  599. </div>
  600. </div>
  601. <div class="funkyradio" style="font-size:0.8em">
  602. <div class="funkyradio-info">
  603. <input type="checkbox" id="showLayerBackground" checked />
  604. <label for="showLayerBackground">Background Image</label>
  605. </div>
  606. </div>
  607. <div class="funkyradio" style="font-size:0.8em">
  608. <div class="funkyradio-info">
  609. <input type="checkbox" id="showLayerFurniture" checked />
  610. <label for="showLayerFurniture">Furniture</label>
  611. </div>
  612. </div>
  613. </div>
  614. <div id="furniture_list" class="list-unstyled sub"
  615. style="box-shadow:2px 2px 3px #ccc;display:none;background:#fff;border-radius: 0 5px 5px 0; padding:10px;position:absolute;left:200px;width:300px;max-height:400px;overflow-y:auto">
  616. <h5>Select Furniture</h5>
  617. <div id="furniture_options"></div>
  618. <button class="btn btn-secondary fully" onclick="closeFurnitureMode();">Close Furniture Mode</button>
  619. </div>
  620. <br />
  621. <div id="export_list" class="list-unstyled sub"
  622. style="box-shadow:2px 2px 3px #ccc;display:none;background:#fff;border-radius: 0 5px 5px 0; padding:10px;position:absolute;left:200px;width:200px">
  623. <button class="btn fully" id="export_mode" title="Export floorplan as JSON"><i class="fa fa-download" aria-hidden="true"></i> Export to Json</button>
  624. <button class="btn fully" id="export_blender_mode" title="Export floorplan for Blender"><i class="fa fa-cube" aria-hidden="true"></i> Export for Blender</button>
  625. </div>
  626. <li><button class="btn btn-light shadow fully" id="export_menu"
  627. onclick="$('.sub').hide();$('#export_list').toggle(200);">Export</button></li>
  628. <div id="import_list" class="list-unstyled sub"
  629. style="box-shadow:2px 2px 3px #ccc;display:none;background:#fff;border-radius: 0 5px 5px 0; padding:10px;position:absolute;left:200px;width:200px">
  630. <button class="btn fully" id="import_mode" title="Import floorplan from JSON file"><i class="fa fa-upload" aria-hidden="true"></i> Import Json</button>
  631. <button class="btn fully" id="import_image_mode" title="Import background image"><i class="fa fa-image" aria-hidden="true"></i> Import Floorplan Image</button>
  632. <button class="btn fully" id="import_ai_mode" title="Import floorplan from AI JSON file"><i class="fa fa-robot" aria-hidden="true"></i> Import from AI</button>
  633. </div>
  634. <li><button class="btn btn-light shadow fully" id="import_menu"
  635. onclick="$('.sub').hide();$('#import_list').toggle(200);">Import</button></li>
  636. <br />
  637. <li><button class="btn btn-light shadow halfy " id="report_mode" title="Show report"><i class="fa fa-calculator"
  638. aria-hidden="true"></i>
  639. <button class="btn btn-light shadow halfy pull-right"
  640. onclick="fullscreen();this.style.display='none';$('#nofull_mode').show();" id="full_mode"
  641. title="Full screen"><i class="fa fa-expand" aria-hidden="true"></i></button>
  642. <button class="btn btn-light shadow halfy pull-right" style="display:none"
  643. onclick="outFullscreen();this.style.display='none';$('#full_mode').show();" id="nofull_mode"
  644. data-toggle="tooltip" data-placement="right" title="Full screen"><i class="fa fa-compress"
  645. aria-hidden="true"></i></button>
  646. <li>
  647. <div style="clear:both"></div>
  648. </ul>
  649. </div>
  650. <div class="modal fade " id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  651. <div class="modal-dialog modal-lg modal-dialog-centered" role="document">
  652. <div class="modal-content">
  653. <div class="modal-header">
  654. <h4 class="modal-title" id="myModalLabel">Welcome Home Rough Editor v0.95</h4>
  655. </div>
  656. <div class="modal-body m-2">
  657. <div id="recover">
  658. <p>A plan exists in historical, would you like recover him ?</p>
  659. <button class="btn btn-success shadow" data-bs-dismiss="modal"
  660. onclick="initHistory('recovery');">YES</button></p>
  661. <hr />
  662. <p>Or are you prefer start a new plan ?</p>
  663. </div>
  664. <div class="w-100 d-flex justify-content-center flex-column gap-4 flex-md-row">
  665. <div class="boxMouseOver"><img src="img/newPlanEmpty.jpg" class="img-fluid" onclick="initHistory();"
  666. data-bs-dismiss="modal" /></div>
  667. <div class=" boxMouseOver"><img src="img/newPlanSquare.jpg" class="img-fluid"
  668. onclick="initHistory('newSquare');" data-bs-dismiss="modal" /></div>
  669. <div class=" boxMouseOver"><img src="img/newPlanL.jpg" class="img-fluid" onclick="initHistory('newL');"
  670. data-bs-dismiss="modal" /></div>
  671. </div>
  672. <hr />
  673. <div class="mt-3">
  674. <h5>Import existing floorplan (JSON + Image)</h5>
  675. <p class="text-muted">Select both your floorplan JSON and its background image to start where you left off.</p>
  676. <button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#combinedImportModal">Import JSON + Image</button>
  677. </div>
  678. </div>
  679. <!-- <div class="modal-footer">
  680. <button type="button" class="btn btn-light shadow" data-dismiss="modal">CLOSE</button>
  681. <button type="button" class="btn btn-primary">YES</button>
  682. </div> -->
  683. </div>
  684. </div>
  685. </div>
  686. <div class="modal fade" id="textToLayer" tabindex="-1" role="dialog" aria-labelledby="textToLayerLabel">
  687. <div class="modal-dialog" role="document">
  688. <div class="modal-content">
  689. <div class="modal-header">
  690. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"><span
  691. aria-hidden="true">&times;</span></button>
  692. <h4 class="modal-title" id="textToLayerLabel">Text editor</h4>
  693. </div>
  694. <div class="modal-body">
  695. <p>Choose police color</p>
  696. <div class="color textEditorColor" data-type="gradientRed"
  697. style="color:#f55847;background:linear-gradient(30deg, #f55847, #f00);"></div>
  698. <div class="color textEditorColor" data-type="gradientYellow"
  699. style="color:#e4c06e;background:linear-gradient(30deg,#e4c06e, #ffb000);"></div>
  700. <div class="color textEditorColor" data-type="gradientGreen"
  701. style="color:#88cc6c;background:linear-gradient(30deg,#88cc6c, #60c437);"></div>
  702. <div class="color textEditorColor" data-type="gradientSky"
  703. style="color:#77e1f4;background:linear-gradient(30deg,#77e1f4, #00d9ff);"></div>
  704. <div class="color textEditorColor" data-type="gradientBlue"
  705. style="color:#4f72a6;background:linear-gradient(30deg,#4f72a6, #284d7e);"></div>
  706. <div class="color textEditorColor" data-type="gradientGrey"
  707. style="color:#666666;background:linear-gradient(30deg,#666666, #aaaaaa);"></div>
  708. <div class="color textEditorColor" data-type="gradientWhite"
  709. style="color:#fafafa;background:linear-gradient(30deg,#fafafa, #eaeaea);"></div>
  710. <div class="color textEditorColor" data-type="gradientOrange"
  711. style="color:#f9ad67;background:linear-gradient(30deg, #f9ad67, #f97f00);"></div>
  712. <div class="color textEditorColor" data-type="gradientPurple"
  713. style="color:#a784d9;background:linear-gradient(30deg,#a784d9, #8951da);"></div>
  714. <div class="color textEditorColor" data-type="gradientPink"
  715. style="color:#df67bd;background:linear-gradient(30deg,#df67bd, #e22aae);"></div>
  716. <div class="color textEditorColor" data-type="gradientBlack"
  717. style="color:#3c3b3b;background:linear-gradient(30deg,#3c3b3b, #000000);"></div>
  718. <div class="color textEditorColor" data-type="gradientNeutral"
  719. style="color:#e2c695;background:linear-gradient(30deg,#e2c695, #c69d56);"></div>
  720. <div style="clear:both"></div>
  721. <hr />
  722. <p>Police size</p>
  723. <input type="range" list="tickmarks" id="sizePolice" step="0.1" min="10" max="30" value="15" class="range"
  724. style="width:200px" />
  725. <hr />
  726. <p contenteditable="true" id="labelBox" onfocus="this.innerHTML='';"
  727. style="font-size:15px;padding:5px;border-radius:5px;color:#333">Your text</p>
  728. </div>
  729. <div class="modal-footer">
  730. <button type="button" class="btn btn-light shadow" data-bs-dismiss="modal">Cancel</button>
  731. <button type="button" class="btn btn-primary" onclick="$('#textToLayer').modal('hide');">Apply</button>
  732. </div>
  733. </div>
  734. </div>
  735. </div>
  736. <div style="position:absolute;bottom:10px;left:210px;font-size:1.5em;color:#08d" id="boxinfo">
  737. </div>
  738. <div id="moveBox"
  739. style="position:absolute;right:-150px;top:10px;color:#08d;background:transparent;z-index:2;text-align:center;transition-duration: 0.2s;transition-timing-function: ease-in;">
  740. <p style="margin:0px 0 0 0;font-size:11px" onclick="document.location='https://github.com/ekymoz/homeRoughEditor'">
  741. <img src="https://cdn4.iconfinder.com/data/icons/mathematics-doodle-3/48/102-128.png" width=20px /> Home Rough
  742. Editor
  743. </p>
  744. <div class="pull-right" style="margin:10px">
  745. <p style="margin:0"><button class="btn btn-xs btn-info zoom" data-zoom="zoomtop"
  746. style="box-shadow:2px 2px 3px #ccc;"><i class="fa fa-arrow-up" aria-hidden="true"></i></button></p>
  747. <p style="margin:0">
  748. <button class="btn btn-xs btn-info zoom" data-zoom="zoomleft" style="box-shadow:2px 2px 3px #ccc;"><i
  749. class="fa fa-arrow-left" aria-hidden="true"></i></button>
  750. <button class="btn btn-xs btn-light shadow zoom" data-zoom="zoomreset" style="box-shadow:2px 2px 3px #ccc;"><i
  751. class="fa fa-bullseye" aria-hidden="true"></i></button>
  752. <button class="btn btn-xs btn-info zoom" data-zoom="zoomright" style="box-shadow:2px 2px 3px #ccc;"><i
  753. class="fa fa-arrow-right" aria-hidden="true"></i></button>
  754. </p>
  755. <p style="margin:0"><button class="btn btn-xs btn-info zoom" data-zoom="zoombottom"
  756. style="box-shadow:2px 2px 3px #ccc;"><i class="fa fa-arrow-down" aria-hidden="true"></i></button></p>
  757. </div>
  758. </div>
  759. <div id="zoomBox"
  760. style="position:absolute;z-index:100;right:-150px;bottom:20px;text-align:center;background:transparent;padding:0px;color:#fff;transition-duration: 0.2s;transition-timing-function: ease-in;">
  761. <div class="pull-right" style="margin-right:10px">
  762. <button class="btn btn btn-light shadow zoom" data-zoom="zoomin" style="box-shadow:2px 2px 3px #ccc;"><i
  763. class="fa fa-plus" aria-hidden="true"></i></button>
  764. <button class="btn btn btn-light shadow zoom" data-zoom="zoomout" style="box-shadow:2px 2px 3px #ccc;"><i
  765. class="fa fa-minus" aria-hidden="true"></i></button>
  766. </div>
  767. <div style="clear:both"></div>
  768. <div id="scaleVal" class="pull-right"
  769. style="box-shadow:2px 2px 3px #ccc;width:60px;height:20px;background:#4b79aa;border-radius:4px;margin-right:10px">
  770. 1m
  771. </div>
  772. <div style="clear:both"></div>
  773. </div>
  774. </body>
  775. <script src="https://code.jquery.com/jquery-3.6.1.slim.min.js"
  776. integrity="sha256-w8CvhFs7iHNVUtnSP0YKEg00p9Ih13rlL9zGqvLdePA=" crossorigin="anonymous"></script>
  777. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.min.js"
  778. integrity="sha384-IDwe1+LCz02ROU9k972gdyvl+AESN10+x7tBKgc9I5HFtuNz0wWnPclzo6p9vxnk" crossorigin="anonymous"></script>
  779. <script src="mousewheel.js"></script>
  780. <script src="qSVG.js"></script>
  781. <script src="func.js"></script>
  782. <script src="engine.js"></script>
  783. <script src="editor.js"></script>
  784. <script src="export.js"></script>
  785. <script src="furniture.js"></script>
  786. </html>