From 3d301a0586a044a521fb2e157f4bce1e4ee8ae15 Mon Sep 17 00:00:00 2001 From: woo Date: Wed, 4 Sep 2024 19:54:33 -0400 Subject: [PATCH] Deploy Build to GH Pages --- .babelrc | 10 - .browserslistrc | 3 - .deepsource.toml | 22 - .eslintrc.js | 48 - .github/ISSUE_TEMPLATE/bug_report.md | 34 - .github/ISSUE_TEMPLATE/custom.md | 10 - .github/ISSUE_TEMPLATE/development-story.md | 24 - .github/ISSUE_TEMPLATE/feature_request.md | 20 - .github/workflows/main.yml | 65 - .gitignore | 32 - .nvmrc | 1 - .prettierrc | 20 - .vscode/extensions.json | 20 - .vscode/launch.json | 36 - .vscode/settings.json | 26 - .vscode/workspace.code-workspace | 26 - CNAME | 1 - CODE_OF_CONDUCT.md | 76 - CONTRIBUTING.md | 92 - InsertTextDialog.vue.txt | 70 - LICENSE | 25 - README.md | 107 - dist/animations.css => animations.css | 0 .../DispenserCommands.js | 221 - .../EqualFlowRateInit.js | 243 - .../JSONValveDispenserLoad.js | 184 - .../ValveDispenserJSONTracking.js | 146 - .../clusterValves.js | 65 - .../initiate_data.js | 83 - cc/ui/canvas.js | 27 - cc/ui/controlModal.js | 115 - cc/ui/dispenserModal.js | 126 - cc/ui/togglebutton.js | 127 - conf.json | 12 - {dist/css => css}/app.85a0644e.css | 0 {dist/css => css}/chunk-vendors.acfd7f9b.css | 0 dist/demo.css => demo.css | 0 doc/mint-primitives.png | Bin 281979 -> 0 bytes doc/ui.png | Bin 23411020 -> 0 bytes examples/COSMIC_OWL.json | 766 - examples/CT1211CoverBiochip_design.json | 2068 -- examples/VoigtCassieMockup.json | 1900 -- dist/favicon.ico => favicon.ico | Bin .../Roboto-Black.313a6563.woff | Bin .../Roboto-Black.59eb3601.woff2 | Bin .../Roboto-BlackItalic.cc2fadc3.woff | Bin .../Roboto-BlackItalic.f75569f8.woff2 | Bin .../fonts => fonts}/Roboto-Bold.50d75e48.woff | Bin .../Roboto-Bold.b52fac2b.woff2 | Bin .../Roboto-BoldItalic.4fe0f73c.woff | Bin .../Roboto-BoldItalic.94008e69.woff2 | Bin .../Roboto-Light.c73eb1ce.woff | Bin .../Roboto-Light.d26871e8.woff2 | Bin .../Roboto-LightItalic.13efe6cb.woff | Bin .../Roboto-LightItalic.e8eaae90.woff2 | Bin .../Roboto-Medium.1d659482.woff | Bin .../Roboto-Medium.90d16760.woff2 | Bin .../Roboto-MediumItalic.13ec0eb5.woff2 | Bin .../Roboto-MediumItalic.83e114c3.woff | Bin .../Roboto-Regular.35b07eb2.woff | Bin .../Roboto-Regular.73f0a88b.woff2 | Bin .../Roboto-RegularItalic.4357beb8.woff2 | Bin .../Roboto-RegularItalic.f5902d5e.woff | Bin .../Roboto-Thin.ad538a69.woff2 | Bin .../fonts => fonts}/Roboto-Thin.d3b47375.woff | Bin .../Roboto-ThinItalic.5b4a33e1.woff2 | Bin .../Roboto-ThinItalic.8a96edbb.woff | Bin .../materialdesignicons-webfont.147e3378.woff | Bin .../materialdesignicons-webfont.174c02fc.ttf | Bin .../materialdesignicons-webfont.64d4cf64.eot | Bin ...materialdesignicons-webfont.7a44ea19.woff2 | Bin {dist/img => img}/3DuF_favicon_large.svg | 0 {dist/img => img}/3DuF_placeholder_logo.png | Bin {dist/img => img}/3DuF_placeholder_png.png | Bin {dist/img => img}/3DuF_placeholder_svg.svg | 0 {dist/img => img}/CHANNEL.6ac8d4e3.png | Bin {dist/img => img}/cidar_logo.png | Bin {dist/img => img}/favicon_large.png | Bin {dist/img => img}/logo.png | Bin dist/index.html => index.html | 0 dist/index2.html => index2.html | 0 {dist/js => js}/app.5e0ea8c0.js | 0 {dist/js => js}/app.5e0ea8c0.js.map | 0 {dist/js => js}/chunk-vendors.68475a27.js | 0 {dist/js => js}/chunk-vendors.68475a27.js.map | 0 lib/bootstrap/bootstrap-theme.min.css | 5 - lib/bootstrap/bootstrap.min.css | 5 - lib/bootstrap/bootstrap.min.js | 7 - lib/canvas_rendering/canvasrenderer.js | 1098 - lib/canvas_rendering/jquery-2.1.3.min.js | 4 - lib/canvas_rendering/orbitcontrols.js | 675 - lib/canvas_rendering/projector.js | 926 - lib/canvas_rendering/three.min.js | 821 - lib/fabric/fabric.min.js | 7 - lib/fabric/fabricjs_viewport.js | 260 - lib/filesaver/FileSaver.min.js | 2 - lib/handsontable/handsontable.full.min.css | 37 - lib/jquery/jquery-1.11.3.min.js | 5 - lib/material/material.min.css | 9 - lib/material/material.min.js | 10 - lib/nouislider/nouislider.min.css | 4 - lib/nouislider/nouislider.min.js | 3 - lib/popdown/jquery.popdown.min.js | 11 - lib/three/three.min.js | 835 - notes.md | 19 - dist/nouislider.min.css => nouislider.min.css | 0 dist/orbit_bundle.js => orbit_bundle.js | 0 package-lock.json | 26459 ---------------- package.json | 143 - primitives-server.Dockerfile | 13 - public/animations.css | 57 - public/demo.css | 53 - public/favicon.ico | Bin 1150 -> 0 bytes public/img/3DuF_favicon_large.svg | 72 - public/img/3DuF_placeholder_logo.png | Bin 4970 -> 0 bytes public/img/3DuF_placeholder_png.png | Bin 13949 -> 0 bytes public/img/3DuF_placeholder_svg.svg | 75 - public/img/cidar_logo.png | Bin 76680 -> 0 bytes public/img/favicon_large.png | Bin 9290 -> 0 bytes public/img/logo.png | Bin 27452 -> 0 bytes public/index.html | 49 - public/index2.html | 829 - public/nouislider.min.css | 208 - public/orbit_bundle.js | 1282 - src/App.vue | 35 - src/app/core/component.ts | 584 - src/app/core/componentPort.ts | 169 - src/app/core/connection.ts | 712 - src/app/core/connectionTarget.ts | 69 - src/app/core/customComponent.ts | 164 - src/app/core/device.ts | 1135 - src/app/core/dxfObject.ts | 76 - src/app/core/edgeFeature.ts | 73 - src/app/core/feature.ts | 445 - src/app/core/geometryElement.ts | 54 - src/app/core/init.ts | 144 - src/app/core/layer.ts | 360 - src/app/core/parameter.ts | 60 - src/app/core/parameters/booleanValue.ts | 15 - src/app/core/parameters/floatValue.ts | 16 - src/app/core/parameters/integerValue.ts | 16 - src/app/core/parameters/pointArray.ts | 29 - src/app/core/parameters/pointValue.ts | 17 - src/app/core/parameters/segmentArray.ts | 29 - src/app/core/parameters/stringValue.ts | 15 - src/app/core/params.ts | 172 - src/app/core/registry.ts | 31 - src/app/examples/dafdtemplate.json | 235 - src/app/examples/jsonExamples.ts | 14 - src/app/geometry/geometryEdge.ts | 39 - src/app/geometry/geometryGraph.ts | 189 - src/app/index.ts | 10 - src/app/library/alignmentMarks.ts | 178 - src/app/library/anode.ts | 122 - src/app/library/betterMixer.ts | 163 - src/app/library/capacitancesensor.ts | 240 - src/app/library/cathode.ts | 127 - src/app/library/celltrapL.ts | 218 - src/app/library/celltrapS.ts | 202 - src/app/library/chamber.ts | 150 - src/app/library/channel.ts | 105 - src/app/library/chemostatring.ts | 1170 - src/app/library/circleValve.ts | 99 - src/app/library/connection.ts | 137 - src/app/library/curvedMixer.ts | 201 - src/app/library/diamondReactionChamber.ts | 149 - src/app/library/dogboneInsert.ts | 191 - src/app/library/dropletGenerator.ts | 213 - src/app/library/dropletGeneratorFlowFocus.ts | 211 - src/app/library/dropletGeneratorT.ts | 164 - src/app/library/dropletMerger.ts | 164 - src/app/library/filter.ts | 294 - src/app/library/gelchannel.ts | 201 - .../geometricElements/featureTemplate.ts | 100 - .../normallyClosedValveCrecents.ts | 95 - .../normallyClosedValveGap.ts | 95 - src/app/library/gradientGenerator.ts | 289 - src/app/library/incubation.ts | 157 - src/app/library/llChamber.ts | 252 - src/app/library/logicArray.ts | 750 - src/app/library/merger.ts | 267 - src/app/library/mux.ts | 496 - src/app/library/node.ts | 91 - src/app/library/picoinjection.ts | 259 - src/app/library/port.ts | 105 - src/app/library/pump.ts | 228 - src/app/library/pump3D.ts | 281 - src/app/library/rectValve.ts | 95 - src/app/library/rotaryMixer.ts | 308 - src/app/library/roundedChannel.ts | 100 - src/app/library/sorter.ts | 374 - src/app/library/splitter.ts | 188 - src/app/library/template.ts | 446 - src/app/library/text.ts | 94 - src/app/library/thermoCycler.ts | 151 - src/app/library/threeDMixer.ts | 183 - src/app/library/threeDMux.ts | 544 - src/app/library/toroidalMixer.ts | 254 - src/app/library/transition.ts | 116 - src/app/library/transposer.ts | 416 - src/app/library/tree.ts | 283 - src/app/library/valve.ts | 135 - src/app/library/valve3D.ts | 191 - src/app/library/valveTemplate.ts | 16 - src/app/library/via.ts | 105 - src/app/library/ytree.ts | 250 - src/app/manufacturing/cncGenerator.ts | 168 - src/app/manufacturing/depthFeatureMap.ts | 58 - .../manufacturing/laserCuttingGenerator.ts | 263 - src/app/manufacturing/manufacturingInfo.ts | 27 - src/app/manufacturing/manufacturingLayer.ts | 152 - src/app/plugin/dafdPlugin.ts | 127 - src/app/utils/componentUtils.ts | 26 - src/app/utils/connectionUtils.ts | 15 - src/app/utils/cookieUtils.ts | 21 - src/app/utils/deviceUtils.ts | 27 - src/app/utils/exportUtils.ts | 149 - src/app/utils/featureUtils.ts | 47 - src/app/utils/geometryUtils.ts | 37 - src/app/utils/htmlUtils.ts | 49 - src/app/utils/ioUtils.ts | 43 - src/app/utils/linkedList.ts | 117 - src/app/utils/loadUtils.ts | 741 - src/app/utils/mapUtils.ts | 11 - src/app/utils/numberUtils.ts | 11 - src/app/utils/paramUtils.nots | 38 - src/app/utils/parchmintSanitizationUtils.ts | 51 - src/app/utils/renderLayerUtils.ts | 22 - src/app/utils/renderUtils.ts | 81 - src/app/utils/simpleQueue.ts | 47 - src/app/utils/stringUtils.ts | 4 - src/app/view/colors.ts | 195 - src/app/view/customComponentManager.ts | 116 - src/app/view/designHistory.ts | 74 - src/app/view/grid/adaptiveGrid.ts | 151 - src/app/view/mouseAndKeyboardHandler.ts | 325 - src/app/view/panAndZoom.ts | 79 - src/app/view/paperView.ts | 1292 - src/app/view/render2D/alignmentRenderer2D.ts | 83 - .../view/render2D/componentPortRenderer2D.ts | 54 - src/app/view/render2D/deviceRenderer2D.ts | 44 - src/app/view/render2D/dxfObjectRenderer2D.ts | 392 - .../view/render2D/dxfSolidObjectRenderer2D.ts | 626 - src/app/view/render2D/featureRenderer2D.ts | 182 - src/app/view/render2D/gridRenderer.ts | 92 - .../view/render2D/paperComponentPortView.ts | 90 - src/app/view/render2D/ratsNestRenderer2D.ts | 47 - src/app/view/renderLayer.ts | 351 - src/app/view/selection.ts | 185 - src/app/view/textElement.ts | 13 - src/app/view/tools/cellPositionTool.ts | 53 - src/app/view/tools/channelTool.ts | 141 - src/app/view/tools/componentPositionTool.ts | 30 - src/app/view/tools/connectionTool.ts | 577 - .../view/tools/customComponentPositionTool.ts | 78 - src/app/view/tools/generateArrayTool.ts | 261 - src/app/view/tools/insertTextTool.ts | 98 - src/app/view/tools/mouseSelectTool.ts | 294 - src/app/view/tools/mouseTool.ts | 97 - src/app/view/tools/moveTool.ts | 169 - src/app/view/tools/multilayerPositionTool.ts | 63 - src/app/view/tools/multilevelPositionTool.ts | 118 - src/app/view/tools/panTool.ts | 69 - src/app/view/tools/positionTool.ts | 158 - src/app/view/tools/renderMouseTool.ts | 216 - src/app/view/tools/selectTool.ts | 299 - src/app/view/tools/valveInsertionTool.ts | 276 - src/app/view/uiElement.ts | 48 - src/app/view/viewManager.ts | 1785 -- src/assets/lib/nouislider/nouislider.d.ts | 198 - src/assets/lib/nouislider/nouislider.js | 2254 -- src/assets/lib/nouislider/nouislider.min.css | 1 - src/assets/technology/CHANNEL.png | Bin 4871 -> 0 bytes src/componentAPI.ts | 534 - src/components/ChangeAllDialog.vue | 165 - src/components/ComponentContextMenu.vue | 236 - src/components/ComponentToolBar.vue | 99 - src/components/ConnectionContextMenu.vue | 226 - src/components/ConnectionPropertyDrawer.vue | 396 - src/components/DOEDialog.vue | 28 - src/components/EditBorderDialog.vue | 116 - src/components/EditDeviceDialog.vue | 77 - src/components/GenerateArrayDialog.vue | 176 - src/components/HelpDialog.vue | 46 - src/components/ImportDXFDialog.vue | 44 - src/components/InsertTextDialog.vue | 83 - src/components/IntroHelpDialog.vue | 146 - src/components/LayerToolbar.vue | 145 - src/components/ManufacturingPanel.vue | 177 - src/components/MoveDialog.vue | 241 - src/components/ResolutionToolbar.vue | 195 - src/components/Visualiser.vue | 141 - src/components/ZoomSlider.vue | 91 - src/components/base/Dialog.vue | 83 - src/components/base/DraggableDialog.vue | 192 - src/components/base/PropertyBlock.vue | 68 - src/components/base/PropertyDrawer.vue | 193 - src/custom.d.ts | 1 - src/events/events.ts | 28 - src/main.ts | 18 - src/plugins/vuetify.ts | 7 - src/server/.gitignore | 121 - src/server/README.md | 13 - src/server/controller.ts | 75 - src/server/package-lock.json | 3720 --- src/server/package.json | 36 - src/server/routes.ts | 14 - src/server/server.ts | 49 - src/server/tsconfig.json | 103 - src/shims-vue.d.ts | 4 - src/views/layouts/SidebarLayout.vue | 82 - src/views/layouts/SplitLayout.vue | 116 - tsconfig.json | 23 - vue.config.js | 7 - webpack.config.js | 33 - 315 files changed, 80508 deletions(-) delete mode 100644 .babelrc delete mode 100644 .browserslistrc delete mode 100644 .deepsource.toml delete mode 100644 .eslintrc.js delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/custom.md delete mode 100644 .github/ISSUE_TEMPLATE/development-story.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/workflows/main.yml delete mode 100644 .gitignore delete mode 100644 .nvmrc delete mode 100644 .prettierrc delete mode 100644 .vscode/extensions.json delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/settings.json delete mode 100644 .vscode/workspace.code-workspace delete mode 100644 CNAME delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 InsertTextDialog.vue.txt delete mode 100644 LICENSE delete mode 100644 README.md rename dist/animations.css => animations.css (100%) delete mode 100644 cc/legacy-neptune-control-code/DispenserCommands.js delete mode 100644 cc/legacy-neptune-control-code/EqualFlowRateInit.js delete mode 100644 cc/legacy-neptune-control-code/JSONValveDispenserLoad.js delete mode 100644 cc/legacy-neptune-control-code/ValveDispenserJSONTracking.js delete mode 100644 cc/legacy-neptune-control-code/clusterValves.js delete mode 100644 cc/legacy-neptune-control-code/initiate_data.js delete mode 100644 cc/ui/canvas.js delete mode 100644 cc/ui/controlModal.js delete mode 100644 cc/ui/dispenserModal.js delete mode 100644 cc/ui/togglebutton.js delete mode 100644 conf.json rename {dist/css => css}/app.85a0644e.css (100%) rename {dist/css => css}/chunk-vendors.acfd7f9b.css (100%) rename dist/demo.css => demo.css (100%) delete mode 100644 doc/mint-primitives.png delete mode 100644 doc/ui.png delete mode 100644 examples/COSMIC_OWL.json delete mode 100644 examples/CT1211CoverBiochip_design.json delete mode 100644 examples/VoigtCassieMockup.json rename dist/favicon.ico => favicon.ico (100%) rename {dist/fonts => fonts}/Roboto-Black.313a6563.woff (100%) rename {dist/fonts => fonts}/Roboto-Black.59eb3601.woff2 (100%) rename {dist/fonts => fonts}/Roboto-BlackItalic.cc2fadc3.woff (100%) rename {dist/fonts => fonts}/Roboto-BlackItalic.f75569f8.woff2 (100%) rename {dist/fonts => fonts}/Roboto-Bold.50d75e48.woff (100%) rename {dist/fonts => fonts}/Roboto-Bold.b52fac2b.woff2 (100%) rename {dist/fonts => fonts}/Roboto-BoldItalic.4fe0f73c.woff (100%) rename {dist/fonts => fonts}/Roboto-BoldItalic.94008e69.woff2 (100%) rename {dist/fonts => fonts}/Roboto-Light.c73eb1ce.woff (100%) rename {dist/fonts => fonts}/Roboto-Light.d26871e8.woff2 (100%) rename {dist/fonts => fonts}/Roboto-LightItalic.13efe6cb.woff (100%) rename {dist/fonts => fonts}/Roboto-LightItalic.e8eaae90.woff2 (100%) rename {dist/fonts => fonts}/Roboto-Medium.1d659482.woff (100%) rename {dist/fonts => fonts}/Roboto-Medium.90d16760.woff2 (100%) rename {dist/fonts => fonts}/Roboto-MediumItalic.13ec0eb5.woff2 (100%) rename {dist/fonts => fonts}/Roboto-MediumItalic.83e114c3.woff (100%) rename {dist/fonts => fonts}/Roboto-Regular.35b07eb2.woff (100%) rename {dist/fonts => fonts}/Roboto-Regular.73f0a88b.woff2 (100%) rename {dist/fonts => fonts}/Roboto-RegularItalic.4357beb8.woff2 (100%) rename {dist/fonts => fonts}/Roboto-RegularItalic.f5902d5e.woff (100%) rename {dist/fonts => fonts}/Roboto-Thin.ad538a69.woff2 (100%) rename {dist/fonts => fonts}/Roboto-Thin.d3b47375.woff (100%) rename {dist/fonts => fonts}/Roboto-ThinItalic.5b4a33e1.woff2 (100%) rename {dist/fonts => fonts}/Roboto-ThinItalic.8a96edbb.woff (100%) rename {dist/fonts => fonts}/materialdesignicons-webfont.147e3378.woff (100%) rename {dist/fonts => fonts}/materialdesignicons-webfont.174c02fc.ttf (100%) rename {dist/fonts => fonts}/materialdesignicons-webfont.64d4cf64.eot (100%) rename {dist/fonts => fonts}/materialdesignicons-webfont.7a44ea19.woff2 (100%) rename {dist/img => img}/3DuF_favicon_large.svg (100%) rename {dist/img => img}/3DuF_placeholder_logo.png (100%) rename {dist/img => img}/3DuF_placeholder_png.png (100%) rename {dist/img => img}/3DuF_placeholder_svg.svg (100%) rename {dist/img => img}/CHANNEL.6ac8d4e3.png (100%) rename {dist/img => img}/cidar_logo.png (100%) rename {dist/img => img}/favicon_large.png (100%) rename {dist/img => img}/logo.png (100%) rename dist/index.html => index.html (100%) rename dist/index2.html => index2.html (100%) rename {dist/js => js}/app.5e0ea8c0.js (100%) rename {dist/js => js}/app.5e0ea8c0.js.map (100%) rename {dist/js => js}/chunk-vendors.68475a27.js (100%) rename {dist/js => js}/chunk-vendors.68475a27.js.map (100%) delete mode 100644 lib/bootstrap/bootstrap-theme.min.css delete mode 100644 lib/bootstrap/bootstrap.min.css delete mode 100644 lib/bootstrap/bootstrap.min.js delete mode 100644 lib/canvas_rendering/canvasrenderer.js delete mode 100644 lib/canvas_rendering/jquery-2.1.3.min.js delete mode 100644 lib/canvas_rendering/orbitcontrols.js delete mode 100644 lib/canvas_rendering/projector.js delete mode 100644 lib/canvas_rendering/three.min.js delete mode 100644 lib/fabric/fabric.min.js delete mode 100644 lib/fabric/fabricjs_viewport.js delete mode 100644 lib/filesaver/FileSaver.min.js delete mode 100644 lib/handsontable/handsontable.full.min.css delete mode 100644 lib/jquery/jquery-1.11.3.min.js delete mode 100644 lib/material/material.min.css delete mode 100644 lib/material/material.min.js delete mode 100644 lib/nouislider/nouislider.min.css delete mode 100644 lib/nouislider/nouislider.min.js delete mode 100644 lib/popdown/jquery.popdown.min.js delete mode 100644 lib/three/three.min.js delete mode 100644 notes.md rename dist/nouislider.min.css => nouislider.min.css (100%) rename dist/orbit_bundle.js => orbit_bundle.js (100%) delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 primitives-server.Dockerfile delete mode 100644 public/animations.css delete mode 100644 public/demo.css delete mode 100644 public/favicon.ico delete mode 100644 public/img/3DuF_favicon_large.svg delete mode 100644 public/img/3DuF_placeholder_logo.png delete mode 100644 public/img/3DuF_placeholder_png.png delete mode 100644 public/img/3DuF_placeholder_svg.svg delete mode 100755 public/img/cidar_logo.png delete mode 100644 public/img/favicon_large.png delete mode 100644 public/img/logo.png delete mode 100644 public/index.html delete mode 100644 public/index2.html delete mode 100644 public/nouislider.min.css delete mode 100644 public/orbit_bundle.js delete mode 100644 src/App.vue delete mode 100644 src/app/core/component.ts delete mode 100644 src/app/core/componentPort.ts delete mode 100644 src/app/core/connection.ts delete mode 100644 src/app/core/connectionTarget.ts delete mode 100644 src/app/core/customComponent.ts delete mode 100644 src/app/core/device.ts delete mode 100644 src/app/core/dxfObject.ts delete mode 100644 src/app/core/edgeFeature.ts delete mode 100644 src/app/core/feature.ts delete mode 100644 src/app/core/geometryElement.ts delete mode 100644 src/app/core/init.ts delete mode 100644 src/app/core/layer.ts delete mode 100644 src/app/core/parameter.ts delete mode 100644 src/app/core/parameters/booleanValue.ts delete mode 100644 src/app/core/parameters/floatValue.ts delete mode 100644 src/app/core/parameters/integerValue.ts delete mode 100644 src/app/core/parameters/pointArray.ts delete mode 100644 src/app/core/parameters/pointValue.ts delete mode 100644 src/app/core/parameters/segmentArray.ts delete mode 100644 src/app/core/parameters/stringValue.ts delete mode 100644 src/app/core/params.ts delete mode 100644 src/app/core/registry.ts delete mode 100644 src/app/examples/dafdtemplate.json delete mode 100644 src/app/examples/jsonExamples.ts delete mode 100644 src/app/geometry/geometryEdge.ts delete mode 100644 src/app/geometry/geometryGraph.ts delete mode 100644 src/app/index.ts delete mode 100644 src/app/library/alignmentMarks.ts delete mode 100644 src/app/library/anode.ts delete mode 100644 src/app/library/betterMixer.ts delete mode 100644 src/app/library/capacitancesensor.ts delete mode 100644 src/app/library/cathode.ts delete mode 100755 src/app/library/celltrapL.ts delete mode 100644 src/app/library/celltrapS.ts delete mode 100755 src/app/library/chamber.ts delete mode 100644 src/app/library/channel.ts delete mode 100644 src/app/library/chemostatring.ts delete mode 100644 src/app/library/circleValve.ts delete mode 100644 src/app/library/connection.ts delete mode 100755 src/app/library/curvedMixer.ts delete mode 100755 src/app/library/diamondReactionChamber.ts delete mode 100644 src/app/library/dogboneInsert.ts delete mode 100644 src/app/library/dropletGenerator.ts delete mode 100755 src/app/library/dropletGeneratorFlowFocus.ts delete mode 100755 src/app/library/dropletGeneratorT.ts delete mode 100644 src/app/library/dropletMerger.ts delete mode 100644 src/app/library/filter.ts delete mode 100644 src/app/library/gelchannel.ts delete mode 100755 src/app/library/geometricElements/featureTemplate.ts delete mode 100644 src/app/library/geometricElements/normallyClosedValveCrecents.ts delete mode 100644 src/app/library/geometricElements/normallyClosedValveGap.ts delete mode 100755 src/app/library/gradientGenerator.ts delete mode 100644 src/app/library/incubation.ts delete mode 100644 src/app/library/llChamber.ts delete mode 100755 src/app/library/logicArray.ts delete mode 100644 src/app/library/merger.ts delete mode 100755 src/app/library/mux.ts delete mode 100755 src/app/library/node.ts delete mode 100644 src/app/library/picoinjection.ts delete mode 100644 src/app/library/port.ts delete mode 100644 src/app/library/pump.ts delete mode 100644 src/app/library/pump3D.ts delete mode 100644 src/app/library/rectValve.ts delete mode 100755 src/app/library/rotaryMixer.ts delete mode 100644 src/app/library/roundedChannel.ts delete mode 100644 src/app/library/sorter.ts delete mode 100644 src/app/library/splitter.ts delete mode 100755 src/app/library/template.ts delete mode 100644 src/app/library/text.ts delete mode 100644 src/app/library/thermoCycler.ts delete mode 100644 src/app/library/threeDMixer.ts delete mode 100644 src/app/library/threeDMux.ts delete mode 100644 src/app/library/toroidalMixer.ts delete mode 100644 src/app/library/transition.ts delete mode 100644 src/app/library/transposer.ts delete mode 100644 src/app/library/tree.ts delete mode 100644 src/app/library/valve.ts delete mode 100644 src/app/library/valve3D.ts delete mode 100644 src/app/library/valveTemplate.ts delete mode 100644 src/app/library/via.ts delete mode 100644 src/app/library/ytree.ts delete mode 100644 src/app/manufacturing/cncGenerator.ts delete mode 100644 src/app/manufacturing/depthFeatureMap.ts delete mode 100644 src/app/manufacturing/laserCuttingGenerator.ts delete mode 100644 src/app/manufacturing/manufacturingInfo.ts delete mode 100644 src/app/manufacturing/manufacturingLayer.ts delete mode 100644 src/app/plugin/dafdPlugin.ts delete mode 100644 src/app/utils/componentUtils.ts delete mode 100644 src/app/utils/connectionUtils.ts delete mode 100644 src/app/utils/cookieUtils.ts delete mode 100644 src/app/utils/deviceUtils.ts delete mode 100644 src/app/utils/exportUtils.ts delete mode 100644 src/app/utils/featureUtils.ts delete mode 100644 src/app/utils/geometryUtils.ts delete mode 100644 src/app/utils/htmlUtils.ts delete mode 100644 src/app/utils/ioUtils.ts delete mode 100644 src/app/utils/linkedList.ts delete mode 100644 src/app/utils/loadUtils.ts delete mode 100644 src/app/utils/mapUtils.ts delete mode 100644 src/app/utils/numberUtils.ts delete mode 100644 src/app/utils/paramUtils.nots delete mode 100644 src/app/utils/parchmintSanitizationUtils.ts delete mode 100644 src/app/utils/renderLayerUtils.ts delete mode 100644 src/app/utils/renderUtils.ts delete mode 100644 src/app/utils/simpleQueue.ts delete mode 100644 src/app/utils/stringUtils.ts delete mode 100644 src/app/view/colors.ts delete mode 100644 src/app/view/customComponentManager.ts delete mode 100644 src/app/view/designHistory.ts delete mode 100644 src/app/view/grid/adaptiveGrid.ts delete mode 100644 src/app/view/mouseAndKeyboardHandler.ts delete mode 100644 src/app/view/panAndZoom.ts delete mode 100644 src/app/view/paperView.ts delete mode 100644 src/app/view/render2D/alignmentRenderer2D.ts delete mode 100644 src/app/view/render2D/componentPortRenderer2D.ts delete mode 100644 src/app/view/render2D/deviceRenderer2D.ts delete mode 100644 src/app/view/render2D/dxfObjectRenderer2D.ts delete mode 100644 src/app/view/render2D/dxfSolidObjectRenderer2D.ts delete mode 100644 src/app/view/render2D/featureRenderer2D.ts delete mode 100644 src/app/view/render2D/gridRenderer.ts delete mode 100644 src/app/view/render2D/paperComponentPortView.ts delete mode 100644 src/app/view/render2D/ratsNestRenderer2D.ts delete mode 100644 src/app/view/renderLayer.ts delete mode 100644 src/app/view/selection.ts delete mode 100644 src/app/view/textElement.ts delete mode 100644 src/app/view/tools/cellPositionTool.ts delete mode 100644 src/app/view/tools/channelTool.ts delete mode 100644 src/app/view/tools/componentPositionTool.ts delete mode 100644 src/app/view/tools/connectionTool.ts delete mode 100644 src/app/view/tools/customComponentPositionTool.ts delete mode 100644 src/app/view/tools/generateArrayTool.ts delete mode 100644 src/app/view/tools/insertTextTool.ts delete mode 100644 src/app/view/tools/mouseSelectTool.ts delete mode 100644 src/app/view/tools/mouseTool.ts delete mode 100644 src/app/view/tools/moveTool.ts delete mode 100644 src/app/view/tools/multilayerPositionTool.ts delete mode 100644 src/app/view/tools/multilevelPositionTool.ts delete mode 100644 src/app/view/tools/panTool.ts delete mode 100644 src/app/view/tools/positionTool.ts delete mode 100644 src/app/view/tools/renderMouseTool.ts delete mode 100644 src/app/view/tools/selectTool.ts delete mode 100644 src/app/view/tools/valveInsertionTool.ts delete mode 100644 src/app/view/uiElement.ts delete mode 100644 src/app/view/viewManager.ts delete mode 100644 src/assets/lib/nouislider/nouislider.d.ts delete mode 100644 src/assets/lib/nouislider/nouislider.js delete mode 100644 src/assets/lib/nouislider/nouislider.min.css delete mode 100644 src/assets/technology/CHANNEL.png delete mode 100644 src/componentAPI.ts delete mode 100644 src/components/ChangeAllDialog.vue delete mode 100644 src/components/ComponentContextMenu.vue delete mode 100644 src/components/ComponentToolBar.vue delete mode 100644 src/components/ConnectionContextMenu.vue delete mode 100644 src/components/ConnectionPropertyDrawer.vue delete mode 100644 src/components/DOEDialog.vue delete mode 100644 src/components/EditBorderDialog.vue delete mode 100644 src/components/EditDeviceDialog.vue delete mode 100644 src/components/GenerateArrayDialog.vue delete mode 100644 src/components/HelpDialog.vue delete mode 100644 src/components/ImportDXFDialog.vue delete mode 100644 src/components/InsertTextDialog.vue delete mode 100644 src/components/IntroHelpDialog.vue delete mode 100644 src/components/LayerToolbar.vue delete mode 100644 src/components/ManufacturingPanel.vue delete mode 100644 src/components/MoveDialog.vue delete mode 100644 src/components/ResolutionToolbar.vue delete mode 100644 src/components/Visualiser.vue delete mode 100644 src/components/ZoomSlider.vue delete mode 100644 src/components/base/Dialog.vue delete mode 100644 src/components/base/DraggableDialog.vue delete mode 100644 src/components/base/PropertyBlock.vue delete mode 100644 src/components/base/PropertyDrawer.vue delete mode 100644 src/custom.d.ts delete mode 100644 src/events/events.ts delete mode 100644 src/main.ts delete mode 100644 src/plugins/vuetify.ts delete mode 100644 src/server/.gitignore delete mode 100644 src/server/README.md delete mode 100644 src/server/controller.ts delete mode 100644 src/server/package-lock.json delete mode 100644 src/server/package.json delete mode 100644 src/server/routes.ts delete mode 100644 src/server/server.ts delete mode 100644 src/server/tsconfig.json delete mode 100644 src/shims-vue.d.ts delete mode 100644 src/views/layouts/SidebarLayout.vue delete mode 100644 src/views/layouts/SplitLayout.vue delete mode 100644 tsconfig.json delete mode 100644 vue.config.js delete mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 89f4ba21..00000000 --- a/.babelrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "presets": [ - [ - "@babel/preset-env" - ] - ], - "plugins" : [ - "@babel/plugin-proposal-class-properties" - ] -} \ No newline at end of file diff --git a/.browserslistrc b/.browserslistrc deleted file mode 100644 index 214388fe..00000000 --- a/.browserslistrc +++ /dev/null @@ -1,3 +0,0 @@ -> 1% -last 2 versions -not dead diff --git a/.deepsource.toml b/.deepsource.toml deleted file mode 100644 index 02492c7b..00000000 --- a/.deepsource.toml +++ /dev/null @@ -1,22 +0,0 @@ -version = 1 - -test_patterns = [ - "tests/**", - "src/test/**" -] - -exclude_patterns = [ - "lib/**", - "orbit_bundle.js", - "public/**", - "cc/**" -] - -[[analyzers]] -name = "javascript" -enabled = true - - [analyzers.meta] - plugins = ["vue"] - - diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index b9a8d24d..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,48 +0,0 @@ -module.exports = { - env: { - browser: true, - es6: true, - node: true - }, - - globals: { - Atomics: "readonly", - SharedArrayBuffer: "readonly" - }, - - // Position is important, the last rules take precident here. For the least amount of prettier conficts with other eslint plugins. - // it has to come last - extends: ["eslint:recommended", "plugin:vue/recommended", "@vue/typescript", "prettier/vue"], - - parserOptions: { - ecmaVersion: 2018, - sourceType: "module", - parser: "@typescript-eslint/parser" - }, - - rules: { - "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", - "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off", - "linebreak-style": ["error", "unix"], - quotes: ["warn", "double"], - semi: ["warn", "always"], - "no-unused-vars": "off", - "no-case-declarations": "off", - "vue/max-attributes-per-line": "off", - "no-prototype-builtins": "off", - "space-before-function-paren": "off", - "no-useless-escape": "off", - "no-empty-pattern": "warn" - }, - - ignorePatterns: ["src/test/**", "tests/**", "**/examples/**", "**/parameterMenu.js", "src/assets/**"], - - overrides: [ - { - files: ["**/__tests__/*.{j,t}s?(x)", "**/tests/unit/**/*.spec.{j,t}s?(x)"], - env: { - mocha: true - } - } - ] -}; diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index cd2338b0..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: bug -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -Or add a GIF - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md deleted file mode 100644 index 48d5f81f..00000000 --- a/.github/ISSUE_TEMPLATE/custom.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Custom issue template -about: Describe this issue template's purpose here. -title: '' -labels: '' -assignees: '' - ---- - - diff --git a/.github/ISSUE_TEMPLATE/development-story.md b/.github/ISSUE_TEMPLATE/development-story.md deleted file mode 100644 index c1197c2a..00000000 --- a/.github/ISSUE_TEMPLATE/development-story.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -name: Development Story -about: Describe this issue template's purpose here. -title: "[Story]" -labels: '' -assignees: '' - ---- - -### Description - -(Concise Description of the issue) - -(Feature list) - -**Additional Description:** - -(Attach mockups and more information here) - -Acceptance Criteria: -- [ ] Unit Test -- [ ] ?? -- [ ] ?? -- [ ] ?? diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7d..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index d56eff88..00000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,65 +0,0 @@ -# This is a basic workflow to help you get started with Actions - -name: CI - -# Controls when the workflow will run -on: - # Triggers the workflow on push or pull request events but only for the master branch - push: - branches: [ webpack-build ] - pull_request: - branches: [ webpack-build ] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - lint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - run : | - npm ci - npm run vue-lint - - lint-fix: - runs-on: ubuntu-latest - needs: [lint] - if: failure() - steps: - - name: Chckout the code - uses: actions/checkout@v2 - - name: Lint fix everything - run: | - npm ci - npm run vue-lint --fix - - name: commit and push changes - uses: devops-infra/action-commit-push@v0.3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - commit_message: ran the lint fixer - - # This workflow contains a single job called "build" - build: - # The type of runner that the job will run on - runs-on: ubuntu-latest - needs: [lint] - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 - - # Runs a single command using the runners shell - - name: Run a one-line script - run: | - export NODE_OPTIONS=--openssl-legacy-provider - npm ci - npm run vue-build - - # Runs a set of commands using the runners shell - - name: Run a multi-line script - run: | - echo Add other actions to build, - echo test, and deploy your project. \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 3c8cb3e0..00000000 --- a/.gitignore +++ /dev/null @@ -1,32 +0,0 @@ -__pycache__/ -*.py[cod] -*.stl - -coverage/ -node_modules/ - -old/*output -old/*.scad -*.log - -.idea/ -*tmp-browserify* - -3DuFapp.js -publish.sh - -docs/ -build/* -server-build/ - -# Folder view configuration files -.DS_Store -Desktop.ini - -# Thumbnail cache files -._* -Thumbs.db - -# Files that might appear on external disks -.Spotlight-V100 -.Trashes diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index 9a0c3d3f..00000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v14.15.4 diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 038d7af9..00000000 --- a/.prettierrc +++ /dev/null @@ -1,20 +0,0 @@ -{ - "arrowParens": "avoid", - "bracketSpacing": true, - "endOfLine": "lf", - "htmlWhitespaceSensitivity": "css", - "insertPragma": false, - "jsxBracketSameLine": false, - "jsxSingleQuote": false, - "printWidth": 180, - "proseWrap": "preserve", - "quoteProps": "as-needed", - "requirePragma": false, - "semi": true, - "singleQuote": false, - "tabWidth": 4, - "trailingComma": "none", - "useTabs": false, - "vueIndentScriptAndStyle": false, - "spacebeforefunctionparen": "never" -} diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 096a8ec9..00000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "recommendations": [ - "ms-vscode.vscode-typescript-next", - "oouo-diogo-perdigao.docthis", - "msjsdiag.debugger-for-chrome", - "octref.vetur", - "alefragnani.bookmarks", - "dzannotti.vscode-babel-coloring", - "ms-vsliveshare.vsliveshare-pack", - "redhat.vscode-yaml", - "yzhang.markdown-all-in-one", - "github.vscode-pull-request-github", - "streetsidesoftware.code-spell-checker", - "eamodio.gitlens", - "firefox-devtools.vscode-firefox-debug", - "jcbuisson.vue", - "dbaeumer.vscode-eslint", - "salbert.comment-ts" - ] -} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index dae6ee06..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "chrome", - "request": "launch", - "name": "vuejs: chrome", - "url": "http://localhost:8080", - "webRoot": "${workspaceFolder}/src", - "breakOnLoad": true, - "sourceMapPathOverrides": { - "webpack:///src/*": "${webRoot}/*" - } - }, - { - "type": "firefox", - "request": "launch", - "name": "vuejs: firefox", - "url": "http://localhost:8080", - "webRoot": "${workspaceFolder}/src", - "pathMappings": [ - { - "url": "webpack:///src/services/theme/utils.ts", - "path": "git:/Users/krishna/CIDAR/3duf-vue-port/src/cc/hardware/utils.ts?%7B%22path%22%3A%22%2FUsers%2Fkrishna%2FCIDAR%2F3duf-vue-port%2Fsrc%2Fcc%2Fhardware%2Futils.ts%22%2C%22ref%22%3A%22%22%7D" - }, - { - "url": "webpack:///src/", - "path": "${webRoot}/" - } - ] - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index b3c804c4..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "files.eol": "\n", - "eslint.validate": ["vue", "html", "javascript", "typescript"], - "typescript.referencesCodeLens.enabled": true, - "typescript.updateImportsOnFileMove.enabled": "prompt", - "editor.defaultFormatter": "octref.vetur", - "editor.definitionLinkOpensInPeek": true, - "vetur.format.options.tabSize": 4, - "[typescript]": { - "editor.autoClosingBrackets": "languageDefined" - }, - "[typescriptreact]": { - "editor.autoClosingBrackets": "languageDefined" - }, - "[javascript]": { - "editor.autoClosingBrackets": "languageDefined" - }, - "[javascriptreact]": { - "editor.autoClosingBrackets": "languageDefined" - }, - "cSpell.words": ["registryref"], - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - }, - "rpc.enabled": true -} diff --git a/.vscode/workspace.code-workspace b/.vscode/workspace.code-workspace deleted file mode 100644 index 1d3ddb86..00000000 --- a/.vscode/workspace.code-workspace +++ /dev/null @@ -1,26 +0,0 @@ -{ - "folders": [ - { - "path": ".." - } - ], - "settings": { - "editor.formatOnSave": false, - "editor.tabSize": 4, - "editor.insertSpaces": true, - "editor.detectIndentation": false, - "editor.defaultFormatter": null, - "editor.codeActionsOnSave": { - "source.fixAll.eslint": true - }, - "eslint.alwaysShowStatus": true, - "eslint.codeActionsOnSave.mode": "all", - "eslint.codeAction.showDocumentation": { - "enable": true - }, - "eslint.lintTask.enable": true, - "javascript.format.enable": false, - "typescript.format.enable": false, - "vetur.validation.template": false - } -} diff --git a/CNAME b/CNAME deleted file mode 100644 index 9a194389..00000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -3duf.org \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 139189b2..00000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,76 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Focusing on what is best for the community -- Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -- The use of sexualized language or imagery and unwelcome sexual attention or - advances -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or electronic - address, without explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at rkrishnasanka@gmail.com. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index caa73ae8..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,92 +0,0 @@ -# Contributing - -When contributing to this repository, please first discuss the change you wish to make via issue, -email, or any other method with the owners of this repository before making a change. - -Please note we have a code of conduct, please follow it in all your interactions with the project. - -## Pull Request Process - -1. Ensure any install or build dependencies are removed before the end of the layer when doing a - build. -2. Update the README.md with details of changes to the interface, this includes new environment - variables, exposed ports, useful file locations and container parameters. -3. Increase the version numbers in any examples files and the README.md to the new version that this - Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). -4. You may merge the Pull Request in once you have the sign-off of two other developers, or if you - do not have permission to do that, you may request the second reviewer to merge it for you. - -## Code of Conduct - -### Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of experience, -nationality, personal appearance, race, religion, or sexual identity and -orientation. - -### Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Focusing on what is best for the community -- Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -- The use of sexualized language or imagery and unwelcome sexual attention or - advances -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or electronic - address, without explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting - -### Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -### Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -### Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at [INSERT EMAIL ADDRESS]. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -### Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/InsertTextDialog.vue.txt b/InsertTextDialog.vue.txt deleted file mode 100644 index cfa3c89e..00000000 --- a/InsertTextDialog.vue.txt +++ /dev/null @@ -1,70 +0,0 @@ - - diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 3bf17a17..00000000 --- a/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -BSD 2-Clause License - -Copyright (c) 2019, CIDAR LAB -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md deleted file mode 100644 index 40dc7576..00000000 --- a/README.md +++ /dev/null @@ -1,107 +0,0 @@ - - -An Interactive Design Tool for Continuous Flow Microfluidic Devices - [3DuF.org](http://3duf.org) - -## Status - -[![Netlify Status](https://api.netlify.com/api/v1/badges/01675390-381f-45a9-88b1-a6f8db0fecbc/deploy-status)](https://app.netlify.com/sites/wonderful-blackwell-a043b5/deploys) - -## About - -The design of microfluidic Lab on a Chip (LoC) systems is an onerous task requiring specialized skills in fluid dynamics, mechanical design drafting, and manufacturing. Engineers face significant challenges during the labor-intensive process of designing microfluidic devices, with very few specialized tools that help automate the process. Typical design iterations require the engineer to research the architecture, manually draft the device layout, optimize for manufacturing processes and manually calculate and program the valve sequences that operate the microfluidic device. The problem compounds when the devices are intended for executing biological assays where engineers not only have to test the functionality of the chip but are also required to optimize them for robust performance. In this paper, we present an interactive tool for designing continuous flow microfluidic devices. 3DuF is the first completely open-source interactive microfluidic system designer that readily supports state-of-the-art design automation algorithms. Through various case studies, we show 3DuF can be used to reproduce designs from literature, provide metrics for evaluating microfluidic design complexity and showcase how 3DuF is a platform for integrating a wide assortment of engineering techniques used in the design of microfluidic devices as a part of the standard design work-flow. - -## Academic Publications - -> Sanka, Radhakrishna, Joshua Lippai, Dinithi Samarasekera, Sarah Nemsick, and Douglas Densmore. “3DμF - Interactive Design Environment for Continuous Flow Microfluidic Devices.” Scientific Reports 9, no. 1 (December 2019). - -[https://doi.org/10.1038/s41598-019-45623-z](https://doi.org/10.1038/s41598-019-45623-z) - -## Usage - -### Design Environment - - - -### Keyboard Shortcuts - -- Pan Canvas: `middle mouse button` and `arrow` keys -- Reset Canvas View: `F` key -- Activate Select Tool/ Deselect Selected Components: `Esc` -- Activate Component Copy Mode: `ctrl+C` -\> `ctrl+V` -- Undo Last Edit: `ctrl+Z` -- Select All: `ctrl+A` -- Save JSON file: ` ctrl+ S` - -### Installation and Debugging - -[Instructions for installation, build, and test are in the wiki.](https://github.com/CIDARLAB/3DuF/wiki/Building-and-Testing-3DuF) - -### Selecting and Configuring Feature Types - -Use the buttons in the menu (on the left) to select a feature type to place. -The gear-shaped button will bring up a menu that will allow you to adjust the parameters for that feature type. - -Click on a layer to select it. This will cause new features to be placed only into that layer. The currently-selected layer's color will be reflected in the button color of any selected feature. - -### Placing Features - -Left click on the device canvas (on the right) to place a feature. Some features (such as Channels and Chambers) are determined by two points, and are placed by clicking and dragging. - -Right click on a feature to select it. Right click and drag to select multiple features at once. - -If a layer has been selected, only features on that layer can be selected this way. - -### Editing Features - -Left click on any selected feature to bring up a dialog box which will allow you to edit its parameters. If more than one feature is selected, parameters will be inherited by all currently selected features of the same type as the one you clicked. - -### Saving Designs - -Under `Save` in the main menu, click a to download the current design in the selected format. - -### Loading Designs - -After saving a device design to JSON, drag and drop it from your computer onto the device canvas to load it. - -## Component Library - - - - -## Primitives Server - -As 3DuF continues to become a core component of the Microfluidics CAD Ecossytem, we have incorporated the ability to generate component dimensions, port locations, default dimensions for all the parametrically generated components supported by 3DuF. - -The instructions for starting this server are as follows: -``` -docker build -f primitives-server.Dockerfile -t primitives-server:latest . -docker run -p 6060:6060 primitives-server -``` - -This will enable the API on port 6060. This can be verified by either going to `http://localhost:6060` or by running the following command: - -``` -curl http://localhost:6060 -``` - -Alternatively you can install the dev version of the library if you want to debug it locally. - -``` -npm ci -cd src/server -npm ci -npm run dev -``` - -## Attributions - -Error Logging and Tracking enabled by [TrackJS](https://trackjs.com/) - -## License - -BSD 2-Clause License - -Copyright (c) 2019, CIDAR LAB -All rights reserved. - -See [LICENSE](/LICENSE) for more information. diff --git a/dist/animations.css b/animations.css similarity index 100% rename from dist/animations.css rename to animations.css diff --git a/cc/legacy-neptune-control-code/DispenserCommands.js b/cc/legacy-neptune-control-code/DispenserCommands.js deleted file mode 100644 index 09da0fa1..00000000 --- a/cc/legacy-neptune-control-code/DispenserCommands.js +++ /dev/null @@ -1,221 +0,0 @@ -/** - * Created by rebeccawolf on 10/5/16. - */ - -function incrementDispenserPosition(dispenser_to_control) { - // identify which dispenser you are sending command to - localStorage.dispenserToControl = dispenser_to_control; - // see if already maxed out at highest position - if ( - parseFloat(JSON.parse(localStorage.dispenserData)[dispenser_to_control - 1]["Current_State"]) <= - parseFloat(JSON.parse(localStorage.dispenserData)[dispenser_to_control - 1]["Max"]) - ) { - var conversionTable = JSON.parse(JSON.parse(localStorage.getItem("dispenserConversions"))[dispenser_to_control]); // conversion table for specific dispenser you are controlling - - var temp = JSON.parse(localStorage.dispenserData); - var index = parseFloat(temp[dispenser_to_control - 1]["Current_State"]); // current uL state - // var PWMcurrent = conversionTable[index]; // find the PWM value which corresponds to the mL value chosen to send to arduino - var foundIndex = false; - var nextuL = 0; - var nextPWM = 0; - // figure out which is the next increment of uL value we can dispenser from the conversion table - for (var uL = 0; uL <= conversionTable.length; uL = uL + 2) { - if (foundIndex == true) { - nextuL = conversionTable[uL]; // note the next uL value to send - nextPWM = conversionTable[uL + 1]; - break; - } - if (conversionTable[uL] == index) { - foundIndex = true; - } - if (conversionTable[uL] > index) { - // surpassed current value, send this one!! - nextuL = conversionTable[uL]; - nextPWM = conversionTable[uL + 1]; - break; - } - } - nextPWM = nextPWM.toFixed(0); - - // set current state to one which corresponds to a value in conversion table - temp[dispenser_to_control - 1]["Current_State"] = nextuL.toString(); - localStorage.dispenserData = JSON.stringify(temp); - - sendCommandDispense(nextPWM, dispenser_to_control); - updateDispenseProgressBar(dispenser_to_control); - } else { - toastr.warning("You have already dispensed the full amount of this syringe."); - } - return false; -} - -function decrementDispenserPosition(dispenser_to_control) { - localStorage.dispenserToControl = dispenser_to_control; - // assumes the capacity of the syringe is 9 mL - if ( - parseFloat(JSON.parse(localStorage.dispenserData)[dispenser_to_control - 1]["Current_State"]) > - parseFloat(JSON.parse(localStorage.dispenserData)[dispenser_to_control - 1]["Min"]) - ) { - var conversionTable = JSON.parse(JSON.parse(localStorage.getItem("dispenserConversions"))[dispenser_to_control]); // conversion table for specific dispenser you are controlling - - var temp = JSON.parse(localStorage.dispenserData); - var index = parseFloat(temp[dispenser_to_control - 1]["Current_State"]); // current uL state - var foundIndex = false; - var nextuL = 0; - var nextPWM = 0; - - // figure out which is the next increment of uL value we can dispenser from the conversion table - for (var uL = conversionTable.length - 2; uL >= 0; uL = uL - 2) { - if (foundIndex == true) { - nextuL = conversionTable[uL]; // note the next uL value to send - nextPWM = conversionTable[uL + 1]; - break; - } - if (conversionTable[uL] == index) { - foundIndex = true; - } - if (conversionTable[uL] < index) { - // surpassed current value, send this one!! - nextuL = conversionTable[uL]; - nextPWM = conversionTable[uL + 1]; - break; - } - } - nextPWM = nextPWM.toFixed(0); - - // set current state to one which corresponds to a value in conversion table - temp[dispenser_to_control - 1]["Current_State"] = nextuL.toString(); - localStorage.dispenserData = JSON.stringify(temp); - - sendCommandDispense(nextPWM, dispenser_to_control); - updateDispenseProgressBar(dispenser_to_control); - } else { - toastr.warning("You have reached minimum volume capacity."); - } - return false; -} - -function wrap_data_for_Arduino_Dispense(PWM, dispenser_to_control) { - // var dispenser_to_control = localStorage.dispenserToControl; - var temp = JSON.parse(localStorage.dispenserData); - var deviceNum = temp[dispenser_to_control - 1]["deviceIndex"]; - console.log("the device num is: " + deviceNum); - - // FIRST, PAD VALUES WITH 0's SUCH THAT THE VALUE IS 3 CHARACTERS LONG - var dispenser_to_control_padded = zeroFill(deviceNum, 4); - var PWMval_padded = zeroFill(PWM, 4); - // CONCAT THE VALVE NUMBER AND PWM VALUE - var pre_command = dispenser_to_control_padded.concat(PWMval_padded); - // ADD A START CODON TO SIGNIFY THE BEGINING OF SIGNAL - var startStr = ""; - var pre_command_s = startStr.concat(pre_command); - // ADD A STOP CODON TO SIGNIFY THE END OF SIGNAL - var command = pre_command_s.concat("\n"); - // RETURN THE DATA - return command; -} -function sendCommandDispense(PWM, dispenser_to_control) { - var command = wrap_data_for_Arduino_Dispense(PWM, dispenser_to_control); - var message = "Sending to Arduino: "; - var command_info = message.concat(command); - // --- Include code to serial.write() the command to the Arduino here --- // - toastr.info(command_info); - // writeToSerialConsole(command_info); - // console.log(command); - localStorage.setItem("myCommand", command); - $.ajax({ - url: "/serialcommunication/send", - type: "POST", - async: true, - data: { - commandData: command - }, - success: function(response) {}, - error: function(response) {} - }); -} -// ./ END DISPENSER FUNCTIONS - -// HELPER FUNCTIONS FOR SENDING COMMANDS FOR BOTH VALVES AND DISPENSERS -function zeroFill(number, width) { - width -= number.toString().length; - if (width > 0) { - return new Array(width + (/\./.test(number) ? 2 : 1)).join("0") + number; - } - return number + ""; // always return a string -} -function paddy(n, p, c) { - var pad_char = typeof c !== "undefined" ? c : "0"; - var pad = new Array(1 + p).join(pad_char); - return (pad + n).slice(-pad.length); -} - -// ./ END HELPER FUNCTIONS - -// dispenser arrow key functionality -function upArrow() { - if (JSON.parse(localStorage.dispenserData)[localStorage.dispenserToControl - 1]["orientation"] === "pull") { - incrementDispenserPosition(localStorage.dispenserToControl); // output fluid for pull syringe = move syringe to higher position - } else { - decrementDispenserPosition(localStorage.dispenserToControl); // output fluid for push syringe = move syringe to lower position - } - return false; -} -function downArrow() { - if (JSON.parse(localStorage.dispenserData)[localStorage.dispenserToControl - 1]["orientation"] === "pull") { - decrementDispenserPosition(localStorage.dispenserToControl); // retract fluid for pull syringe = move syringe to lower position - } else { - incrementDispenserPosition(localStorage.dispenserToControl); // retract fluid for push syringe = move syringe to higher position - } - return false; -} -function dispenseSelected(down) { - switch (down.keyCode) { - case 38: // up key - if (localStorage.activeDispenser != "none") { - upArrow(); - } - break; - case 40: // down key - if (localStorage.activeDispenser != "none") { - downArrow(); - } - break; - } -} -// ./ end dispenser arrow key functionality - -// dispenser modal progress bar update -function updateDispenseProgressBar(dispenserIDNum) { - currentState = JSON.parse(localStorage.dispenserData)[dispenserIDNum - 1]["Current_State"]; - maxVol = JSON.parse(localStorage.dispenserData)[dispenserIDNum - 1]["Max"]; - minVol = JSON.parse(localStorage.dispenserData)[dispenserIDNum - 1]["Min"]; - if (currentState == 0) { - percentageUpdate = 0; // value is NaN otherwise - } else { - percentageUpdate = Math.floor(((currentState - minVol) / (maxVol - minVol)) * 100); - } - - // first update syringe - updateDispenseSyringe(dispenserIDNum, percentageUpdate); - - // now base percentage update on syringe orientation: - if (JSON.parse(localStorage.dispenserData)[dispenserIDNum - 1]["orientation"] === "push") { - percentageUpdate = 100 - percentageUpdate; - } - - document.getElementById("progress" + dispenserIDNum).innerHTML = percentageUpdate + "% total vol"; - document.getElementById("stateOf" + dispenserIDNum).innerHTML = currentState + " uL"; - $("#progress" + dispenserIDNum) - .css("width", percentageUpdate + "%") - .attr("aria-valuenow", percentageUpdate); - return false; -} - -// update dispenserUI modal syringe to dispensed value -function updateDispenseSyringe(dispenserIDNum, percentUpdate) { - // min/max displacement for syringe is 92 - 40 = 52 - var zeroDisplacement = (percentUpdate / 100) * 52; - var displacement = zeroDisplacement + 40; - $("#plunger" + dispenserIDNum).css("left", displacement + "px"); -} diff --git a/cc/legacy-neptune-control-code/EqualFlowRateInit.js b/cc/legacy-neptune-control-code/EqualFlowRateInit.js deleted file mode 100644 index ab9499c9..00000000 --- a/cc/legacy-neptune-control-code/EqualFlowRateInit.js +++ /dev/null @@ -1,243 +0,0 @@ -/** - * Created by rebeccawolf on 8/30/16. equal Flow rate - */ - -/* Create uL_table - - */ -var theta_max = 157.0; -var theta_min = -13.6; -var r = 0.75; -var b = 3; -var d = 0.88; -var a = 0.25; -var PWM_min = 180; -var PWM_max = 500; -var X_min = 2.071; -var mL_max = 6.23; -var X_max = 3.645; -var mL_min = 0; - -var mL_range = mL_max - mL_min; - -function PWM2rad(PWM) { - var deg = ((PWM - PWM_min) * (theta_max - theta_min)) / (PWM_max - PWM_min) + theta_min; - return deg * (Math.PI / 180); -} - -var create_uL_table = function(uL_precision) { - var uL_min = mL_min * 1000; // convert incoming variables from mL to uL - var uL_range = mL_range * 1000; // convert incoming variables from mL to uL - - // Create PWM_table - var PWM_table = []; - for (var i = PWM_min; i <= PWM_max; i++) { - // From PWM_min value to PWM_max value - PWM_table.push(i); // Add current PWM value to PWM_table - var mL_temp = mL_max - (r * Math.cos(PWM2rad(i)) + Math.sqrt(Math.pow(b, 2) - Math.pow(r * Math.sin(PWM2rad(i)) + d, 2)) - X_min) / a; // Calculate mL value with formula of motion - var uL_temp = Math.round(mL_temp * 10000) / 10; // convert to uL and round to first decimal place - PWM_table.push(uL_temp); // Add uL value to PWM_table - } - - // create uL_table - var uL_table = []; - // create conversion tables - var conversion_table = {}; - for (var i = uL_min; i < uL_range + uL_min + uL_precision; i = i + uL_precision) { - // From uL_min (a given) to uL_min+uL_range! uL_precision added on to allow last uL value to be iterated through. Increase by steps of uL_precision - // rename i (which is current uL value) - var uL_current = i; // rename i to something more readable - uL_current = Math.round(uL_current * 100) / 100; // round to 2 decimal places - - uL_table.push(uL_current); // Add the current uL value to uL_table - - // Find PWM values - - // Add First PWM value, matched easily - if (i == uL_min) { - // We know the first value, which can't be found with linear interpolation - uL_table.push(PWM_table[0]); - conversion_table[uL_min] = PWM_table[0]; - continue; - } - // Linear interpolation to find other PWM values - // Skip to 2nd value as we already logged the first - for (var j = 3; j <= PWM_table.length; j = j + 2) { - // Iterate through uL values in PWM_table (start at 2nd uL value, index 3. Go length of PWM table. Increase by 2 to avoid looking at PWM values) - if (PWM_table[j] >= uL_current && j % 2 > 0) { - // If uL value in PWM_table is greater than or equal to our current uL value, find PWM inbetween PWMs in PWM_table - var PWM_between = PWM_table[j - 3] + (uL_current - PWM_table[j - 2]) * ((PWM_table[j - 1] - PWM_table[j - 3]) / (PWM_table[j] - PWM_table[j - 2])); // Find PWM value via linear interpolation - var PWM_between = Math.round(PWM_between * 100) / 100; // Round calculated PWM value to 2 decimal places - uL_table.push(PWM_between); // Add calculated PWM value to table - conversion_table[uL_current] = PWM_between; - break; - } - } - } - uL_table.push(PWM_max); // Add last PWM value, not calculated above with linear interpolation - - return { - PWM_table: PWM_table, // Return PWM_table - uL_table: uL_table, // Return uL_table - conversion_table: conversion_table // Return table to convert PWM to uL - }; -}; - -/* Calculate even uL steps - - Discription: - At any arbitrary position, move to any other position in - equal fluid dispensing steps over a set amount of time - - Inputs: - Pump number - uL_table - PWM_table - highest uL difference - Current uL value - Goal uL value - Time to get from current to goal uL value - Outputs: - Serial command to Arduino 5x per second in format '00010300' with 0001 being the pump number and 0300 being the PWM value to go to - */ - -/*PWM_table - Array of PWM values, uL values = [ - 180 PWM, 0 uL, - 181 PWM, 1.14 uL, - 182 PWM, 2.52 uL - ] - - uL_table (ordered ) - Array of uL values, PWM values = [ - 0 uL, 180 PWM, - 0.5 uL, 180.45 PWM, - 1 uL, 181.2 PWM - ] - */ - -/* Example inputs: - Pump number = 1 - uL_table = maping_table - PWM_table = PWM_table - highest uL difference = 1.5 uL - Current uL value = 12 uL - Goal uL value = 400 uL - Time to get from current to goal uL values = 5 seconds - */ - -function even_uL_steps(uL_table, PWM_table, uL_precision, current_uL, goal_uL, time_sec) { - // Get uL_to_dispense - var uL_to_dispense = Math.abs(goal_uL - current_uL); - - // Get Total number of steps - var num_steps = uL_to_dispense / uL_precision; - - // Get number of steps per second and number of seconds per step - var steps_per_second = num_steps / time_sec; // send to user, not used in program - var seconds_per_step = time_sec / num_steps; // needed for delay between step - - // Find current place and goal place in uL_table - var f_found = false; // set to true when the first_uL_index is found to avoid this if statment through rest of loop - var going_up_uL = goal_uL - current_uL > 0; - - var conversion_table = {}; - - if (going_up_uL) { - // if increasing in uL from current_uL to goal_uL - for (var i = 0; i < uL_table.length; i = i + 2) { - // From 0 through length of uL_table in steps of 2, hitting just uL values - if (uL_table[i] >= current_uL && f_found == false) { - // If uL value in uL_table is greater than or equal to our current_uL (and the first_uL_index has not been found yet) - var first_uL_index = i; // log index of where the uL_currently is in uL_table (logs the uL value directly above or equal to it) - f_found = true; // indicate we found the first uL_index - } - if (uL_table[i] >= goal_uL) { - // If uL value in uL_table is greater than or equal to our goal_uL - var goal_uL_index = i; // log index of where the uL_goal is in the uL_table (logs the uL value directly above or equal to it) - break; // Stop for loop, we have the info we need - } - } - } else { - // if decreasing in uL from current_uL to goal_uL - for (var i = uL_table.length - 2; i >= 0; i = i - 2) { - // From length of uL_table through 0 in steps of 2, hitting just uL values - if (uL_table[i] <= current_uL && f_found == false) { - // If uL value in uL_table is less than or equal to our current_uL (and the first_uL_index has not been found yet) - var first_uL_index = i; // log index of where the uL_currently is in uL_table (logs the uL value directly above or equal to it) - f_found = true; // indicate we found the first uL_index - } - if (uL_table[i] <= goal_uL) { - // If uL value in uL_table is greater than or equal to our goal_uL - var goal_uL_index = i; // log index of where the uL_goal is in the uL_table (logs the uL value directly above or equal to it) - break; // Stop for loop, we have the info we need - } - } - } - - //////////////////////////////////////////////////////////// - - // Iterate through uL_table from next uL_index and go specified number of steps - // MUST DELAY each console.log by the variable 'seconds_per_step' - var PWM_values = []; // Used to keep track of PWM steps to move, for record keeping and debugging - if (going_up_uL) { - // if increasing in uL from current_uL to goal_uL - for (var i = first_uL_index; i <= goal_uL_index; i = i + 2) { - // From our current uL index in uL_table to goal index in uL_table - // if last step - if (i == goal_uL_index) { - // If last step - if (Math.abs(uL_table[i] - goal_uL) < Math.abs(uL_table[i - 2] - goal_uL)) { - // if this uL value from uL_table is closer to goal_uL than the previous one - var end_PWM = Math.round(uL_table[i + 1]); // used for PWM tracking - PWM_values.push(Math.round(uL_table[i + 1])); // Add rounded PWM value to PWM_values list for record keeping and debugging - conversion_table[Math.round(uL_table[i + 1])] = uL_table[i]; - //console.log(end_PWM); //////////// Send pump number and rounded PWM value to arduino - } else { - var end_PWM = Math.round(uL_table[i - 1]); // used for PWM tracking - } - } - // If normal step - else { - // Normal indexes - //console.log(Math.round(uL_table[i+1])); /////////// Send pump number and rounded PWM value to arduino - PWM_values.push(Math.round(uL_table[i + 1])); // Add rounded PWM value to PWM_values list for record keeping and debugging - conversion_table[Math.round(uL_table[i + 1])] = uL_table[i]; - } - } - } else { - // if decreasing in uL from current_uL to goal_uL - for (var i = first_uL_index; i >= goal_uL_index; i = i - 2) { - // From our current uL index in uL_table to goal index in uL_table - // if last step - if (i == goal_uL_index) { - // If last step - if (Math.abs(uL_table[i] - goal_uL) < Math.abs(uL_table[i + 2] - goal_uL)) { - // if this uL value from uL_table is closer to goal_uL than the previous one - var end_PWM = Math.round(uL_table[i + 1]); // used for PWM tracking - PWM_values.push(Math.round(uL_table[i + 1])); // Add rounded PWM value to PWM_values list for record keeping and debugging - conversion_table[Math.round(uL_table[i + 1])] = uL_table[i]; - //console.log(end_PWM); //////////// Send pump number and rounded PWM value to arduino - } else { - var end_PWM = Math.round(uL_table[i + 3]); // used for PWM tracking - } - } - // If normal step - else { - // Normal indexes - //console.log(Math.round(uL_table[i+1])); /////////// Send pump number and rounded PWM value to arduino - PWM_values.push(Math.round(uL_table[i + 1])); // Add rounded PWM value to PWM_values list for record keeping and debugging - conversion_table[Math.round(uL_table[i + 1])] = uL_table[i]; - } - } - } - - console.log("command conversion table: "); - console.log(conversion_table); - - return { - PWM_values: PWM_values, // Return PWM_table - seconds_per_step: seconds_per_step, // Return uL_table - conversion_table: conversion_table // Return table to convert PWM to uL - }; -} diff --git a/cc/legacy-neptune-control-code/JSONValveDispenserLoad.js b/cc/legacy-neptune-control-code/JSONValveDispenserLoad.js deleted file mode 100644 index d89d0c5d..00000000 --- a/cc/legacy-neptune-control-code/JSONValveDispenserLoad.js +++ /dev/null @@ -1,184 +0,0 @@ -/** - * Created by rebeccawolf on 7/26/16. - */ - -// Parsing JSON to look for control features (valves and dispensers); load information into global variables -function loadButtons() { - // load file for parsing used for counting and locating buttons - var json = defaultJSON; - console.log("found the loadButtons function: "); - console.log(json); - for (var i = 0; i < json.layers.length; i++) { - if (json.layers[i].name === "control") { - controlOnly = JSON.stringify(json.layers[i].features); - } - if (json.layers[i].name === "flow") { - flowOnly = JSON.stringify(json.layers[i].features); - } - } - - // Use Json as a string - var jsonString = JSON.stringify(json); - - // Now look for all Port in the control layer only - var Re = /Port.+?\[(.+?),(.+?)\].+?/g; - var myArray; - var portArray = []; - var portX = []; - var portY = []; - - // look through control layer for ports - while ((myArray = Re.exec(controlOnly)) !== null) { - portX.push(myArray[1]); - portY.push(myArray[2]); - portArray.push(myArray.index); - } - - // Store json variables to localStorage in form of JSON object... - localStorage.portXcoords = JSON.stringify(portX); - localStorage.portYcoords = JSON.stringify(portY); - - // Now look for all Ports (Dispensers) in the control layer only - var myArrayDisp; - var portArrayDisp = []; - var portXDisp = []; - var portYDisp = []; - - // look through flow layer for ports - while ((myArrayDisp = Re.exec(flowOnly)) !== null) { - portXDisp.push(myArrayDisp[1]); - // console.log("should be x coord in flow layer: " + myArrayDisp[1]); - portYDisp.push(myArrayDisp[2]); - portArrayDisp.push(myArrayDisp.index); - } - - // Store json variables to localStorage in form of JSON object... - localStorage.portXcoordyessDisp = JSON.stringify(portXDisp); - localStorage.portYcoordsDisp = JSON.stringify(portYDisp); -} - -// after parsing JSON we can create instances of HTML templates to place over canvas -function placeButtons() { - var canvasZoom = paper.view.zoom; - - // for each pump, create new instance of valve template - for (var i = 0; i < JSON.parse(localStorage.getItem("portXcoords")).length; i++) { - var content = $("#content"); - var template = document.getElementById("valve-template").content.cloneNode(true); - var valveDiv = template.querySelector(".valve"); - - valveDiv.style.position = "absolute"; - - valveDiv.style.top = (parseInt(JSON.parse(localStorage.portYcoords)[i]) - paper.view.bounds.topLeft["_y"]) * canvasZoom + 1.25 * Math.pow(canvasZoom * 5, 5) + "px"; - valveDiv.style.left = (parseInt(JSON.parse(localStorage.portXcoords)[i]) - paper.view.bounds.topLeft["_x"]) * canvasZoom + 1.25 * Math.pow(canvasZoom * 5, 5) + "px"; - - var specificImage = template.querySelector(".valve_color"); - // set id of each valve anchor based on location in array - specificImage.id = "valve" + (i + 1); - // assign appropriate valve marker based on state - specificImage.onclick = onclickanchortag; - if (JSON.parse(localStorage.pumpData)[i]["Current_State"] === "closed") { - specificImage.src = "../images/fluigi/valveMarkerClosed.svg"; - } else { - specificImage.src = "../images/fluigi/valveMarkerOpen.svg"; - } - - valveButton = template.querySelector(".valve"); - - var valveIDLabel = template.querySelector(".IDtext"); - valveIDLabel.textContent = i + 1; - if (i + 1 > 9) { - template.querySelector(".IDtext").style = "padding-left: 9px"; - } - - content.append(template); - } - - // for each DISPENSER, create new instance of DISPENSER template - for (var i = 0; i < JSON.parse(localStorage.getItem("portXcoordsDisp")).length; i++) { - var content = $("#content"); - - // create new dispenser instance - var template = document.getElementById("dispenser-template").content.cloneNode(true); - var valveDiv = template.querySelector(".valve"); - var modalDiv = template.querySelector(".dispenserModalClass"); - var gottaCatchEmAll = template.querySelector(".catchDispenser"); - var progress = template.querySelector(".progress-bar"); - var currentStateTxt = template.querySelector(".currentStateModalVal"); - var form = template.querySelector(".dispenseRate"); - var sendDispense = template.querySelector(".sendDispense"); - var dispenseVol = template.querySelector(".dispenseVol"); - var dispenseTime = template.querySelector(".dispenseTime"); - var plunger = template.querySelector(".syringePlunger"); - var orientation = template.querySelector(".orientationBtn"); - - valveDiv.style.position = "absolute"; - - // +220 bc canvas is positioned 220px from top & -20 so that valve is positioned from center of circle - var yCoord = (parseInt(JSON.parse(localStorage.portYcoordsDisp)[i]) - paper.view.bounds.topLeft["_y"]) * canvasZoom + 1.25 * Math.pow(canvasZoom * 5, 5); - var xCoord = (parseInt(JSON.parse(localStorage.portXcoordsDisp)[i]) - paper.view.bounds.topLeft["_x"]) * canvasZoom + 1.25 * Math.pow(canvasZoom * 5, 5); - - modalDiv.id = "dispenserModal" + (i + 1); - var modalID = template.querySelector("#dispenserModal" + (i + 1)); - - progress.id = "progress" + (i + 1); - - currentStateTxt.id = "stateOf" + (i + 1); - - // style position of dispenser modal - if (xCoord + 400 > $(window).width()) { - modalID.style.left = xCoord - 400 + "px"; - } else { - modalID.style.left = xCoord + 40 + "px"; - } - modalID.style.top = yCoord + "px"; - - // place dispensers - valveDiv.style.top = yCoord + "px"; - valveDiv.style.left = xCoord + "px"; - - var specificImage = template.querySelector(".dispenserImg"); - // set id of each valve anchor based on location in array - specificImage.id = i + 1; - - valveButton = template.querySelector(".valve"); - - var valveIDLabel = template.querySelector(".IDtext"); - valveIDLabel.textContent = i + 1; - if (i + 1 > 9) { - template.querySelector(".IDtext").style = "padding-left: 9px"; - } - - var catchID = "catch" + (i + 1); - gottaCatchEmAll.id = catchID; - - var dispenserTitle = template.querySelector("#dispenserModalTitle"); - dispenserTitle.textContent = "Dispenser " + (i + 1); - - // id of each syringe tube - plunger.id = "plunger" + (i + 1); - - // reference to submit appropriate form - var sendID = "dispenseTo" + (i + 1); - var vol = "dispenseVol" + (i + 1); - var time = "dispenseTime" + (i + 1); - - // form ID - form.id = "dispenseRate" + (i + 1); - sendDispense.id = sendID; - dispenseVol.id = vol; - console.log(dispenseVol.id); - dispenseTime.id = time; - console.log(dispenseTime.id); - - // dispenser orientation (push/pull) - orientation.id = "orientation" + (i + 1); - orientation.textContent = JSON.parse(localStorage.dispenserData)[i]["orientation"]; - - var dispenserCatch = "#dispenserModal" + (i + 1); - content.append(template); - // attach reference to correct dispenser modal - $("#" + catchID).attr("href", dispenserCatch); - $("#" + catchID).attr("onclick", "activateDispenser(" + (i + 1) + ")"); - } -} diff --git a/cc/legacy-neptune-control-code/ValveDispenserJSONTracking.js b/cc/legacy-neptune-control-code/ValveDispenserJSONTracking.js deleted file mode 100644 index 8689932d..00000000 --- a/cc/legacy-neptune-control-code/ValveDispenserJSONTracking.js +++ /dev/null @@ -1,146 +0,0 @@ -var ShieldIndex = 0; -var PinIndex = 0; -var deviceCount = 0; - -function initiateValveData() { - setNumberOfPumps_JSON(); -} - -// FUNCTIONALITY FOR VALVE DATA TRACKING - -// Create Valve JSON -function setNumberOfPumps_JSON() { - localStorage.pumps = JSON.parse(localStorage.portXcoords).length; - var DataToLoad = []; - var j = 0; // hardware pin (goes from 0 to 12) - for (var i = 1; i <= localStorage.pumps; i++) { - var initialize_valve_conversion = initializeSetup(180, 460, 0.69, 3, 0.88, 0.25); - var singleStage = { - id: i, - HW_shield: Math.floor(i / 12) + 1, - HW_pin: j, - Open_State: initialize_valve_conversion.uL_max, - Closed_State: 0, - Current_State: "opened", - deviceIndex: deviceCount, - uL_Conversion_Table: initialize_valve_conversion.uL_table, - uL_Precision: initialize_valve_conversion.uL_precision, - Cluster: [] - }; - DataToLoad.push(singleStage); - j = j + 1; - if (j == 13) { - j = 0; - } - ShieldIndex = i; - PinIndex = j; - deviceCount++; - } - localStorage.clear_toggle = true; - localStorage.unsavedData = JSON.stringify(DataToLoad); - localStorage.pumpData = JSON.stringify(DataToLoad); - localStorage.pumpInitial = "FALSE"; -} -function clearPumpData() { - deviceCount = 0; - var c_pumpData = []; - var j = 0; // hardware pin (goes from 0 to 12) - for (var i = 1; i <= localStorage.pumps; i++) { - var initialize_valve_conversion = initializeSetup(180, 460, 0.69, 3, 0.88, 0.25); - var singleStage = { - id: i, - HW_shield: Math.floor(i / 12) + 1, - HW_pin: j, - Open_State: initialize_valve_conversion.uL_max, - Closed_State: 0, - Current_State: "opened", - deviceIndex: deviceCount, - uL_Conversion_Table: initialize_valve_conversion.uL_table, - uL_Precision: initialize_valve_conversion.uL_precision, - Cluster: [] - }; - c_pumpData.push(singleStage); - - j = j + 1; - if (j == 13) { - j = 0; - } - deviceCount++; - } - return JSON.stringify(c_pumpData); -} -// Combine these 2 if they cannot be run non-consecutively - -// FUNCTIONALITY FOR DISPENSER DATA TRACKING AND COMMANDS -function clearDispenserData() { - var dispenserData = []; - var j = PinIndex; // hardware pin (goes from 0 to 12) - var shield = ShieldIndex; - for (var i = 1; i <= localStorage.Dispensers; i++) { - var singleStage = { - id: i, - HW_shield: Math.floor(shield / 12) + 1, - HW_pin: j, - Precision: 0, - Min: 0, - Max: 0, - Current_State: 0, - orientation: "pull", - deviceIndex: deviceCount - }; - dispenserData.push(singleStage); - j = j + 1; - if (j == 13) { - j = 0; - } - deviceCount++; - } - return JSON.stringify(dispenserData); -} - -// Create JSON for dispensers -function setNumberOfDispensers_JSON() { - localStorage.Dispensers = JSON.parse(localStorage.portXcoordsDisp).length; - var set_dispData_newNum = []; - var j = PinIndex; // hardware pin (goes from 1 to 12) - var shield = ShieldIndex; - for (var i = 1; i <= localStorage.Dispensers; i++) { - var tempDispense = { - id: i, - HW_shield: Math.floor(shield / 12) + 1, - HW_pin: j, - Precision: 0, - Min: 0, - Max: 0, - Current_State: 0, - orientation: "pull", - deviceIndex: deviceCount - }; - set_dispData_newNum.push(tempDispense); - j = j + 1; - if (j == 13) { - j = 0; - } - ShieldIndex = i; - PinIndex = j; - deviceCount++; - } - localStorage.dispenserData = JSON.stringify(set_dispData_newNum); - localStorage.dispenserInitial = "FALSE"; -} - -function clearSettingsTable() { - ShieldIndex = 0; - PinIndex = 0; - deviceCount = 0; - setNumberOfPumps_JSON(); - setNumberOfDispensers_JSON(); -} - -// THIS ENSURES SERIAL COMM LIST IS PRE-POPULATED!!! -$(document).ready(function() { - window.addEventListener("keydown", dispenseSelected); // dispenser arrow key event listener - loadButtons(); - localStorage.activeDispenser = "none"; - $.ajax({ url: "/serialcommunication/list", type: "POST", async: true, data: {}, success: function(response) {}, error: function(response) {} }); -}); diff --git a/cc/legacy-neptune-control-code/clusterValves.js b/cc/legacy-neptune-control-code/clusterValves.js deleted file mode 100644 index 868bf6ee..00000000 --- a/cc/legacy-neptune-control-code/clusterValves.js +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Created by rebeccawolf on 12/14/16. - */ - -function drawClusterTable(data) { - $("#makeValveCluster") - .find("tr:gt(0)") - .remove(); - for (var i = 0; i < data.length; i++) { - drawClusterRow(data[i]); - } -} - -function drawClusterRow(rowData) { - var row = $(""); - $("#makeValveCluster").append(row); - row.append($("" + rowData.id + "")); - var id = rowData.id.toString(); - row.append($("" + " " + "")); -} - -function updateClusterList() { - var clusterMembers = $("input[name=member]:checked") - .map(function() { - return this.value; - }) - .get(); - clusterMembers = clusterMembers.toString(); - $("#newClusterList").text("Cluster Members: " + clusterMembers); -} - -function saveCluster() { - var clusterMembers = $("input[name=member]:checked") - .map(function() { - return this.value; - }) - .get(); - - if (clusterMembers.length <= 1) { - alert("Only 1 valve selected."); - return; - } - var valves = JSON.parse(localStorage.pumpData); - - // cluster members should be numbered the same as they are in JSON format (-1) - for (var i = 0; i < clusterMembers.length; i++) { - clusterMembers[i] = clusterMembers[i] - 1; - } - - console.log(clusterMembers); - // update pumpData JSON - for (var i = 0; i < clusterMembers.length; i++) { - valves[clusterMembers[i]]["Cluster"] = clusterMembers; - console.log(valves[clusterMembers[i]]["Cluster"]); - } - - // store cluster in global cluster variable - /* - var clusterJSON = JSON.parse(localStorage.valveClusters); - clusterJSON.push({members: clusterMembers}); - */ - - localStorage.pumpData = JSON.stringify(valves); - console.log(JSON.parse(localStorage.pumpData)); -} diff --git a/cc/legacy-neptune-control-code/initiate_data.js b/cc/legacy-neptune-control-code/initiate_data.js deleted file mode 100644 index 180540d1..00000000 --- a/cc/legacy-neptune-control-code/initiate_data.js +++ /dev/null @@ -1,83 +0,0 @@ -if (localStorage.firstVisit == true || localStorage.firstVisit == undefined) { - // DECLARING PUMP VALVE STATE - - localStorage.pumpData = []; - localStorage.MasterData = []; - localStorage.unsavedData = []; - localStorage.oldPumpData = []; - localStorage.pumps = 0; - localStorage.settings_X_pos = 200; - localStorage.settings_Y_pos = 200; - - // Valve Control - localStorage.pumpData = clearPumpData(); - localStorage.valveData = initiateValveData(); - localStorage.firstVisit = false; - localStorage.pumpInitial = "TRUE"; // keeps track if this is the first time pump data is being displayed (so that its not cleared on page reload) - localStorage.valveClusters = "{}"; - - // Dispenser Control - localStorage.Dispensers = 0; - localStorage.dispenserData = clearDispenserData(); - localStorage.dispenserToControl; - localStorage.dispenserInitial == "TRUE"; // keeps track if this is the first time dispenser data is being displayed (so that its not cleared on page reload) -} -localStorage.DEBUGGER_FLAG == false; -localStorage.clear_toggle = false; -localStorage.set_pump_page_is_open = false; -localStorage.settings_toggle = "settings_is_closed"; -localStorage.close_pressed_last = false; -localStorage.hide = 0; -localStorage.settings_button_has_been_pressed_before = false; - -localStorage.SERIAL_CONSOLE_SESSION = []; - -// Variables for Valve Control (ports in Control layer) -if (localStorage.getItem("portXcoords") === null) { - localStorage.setItem("portXcoords", "default"); -} - -if (localStorage.getItem("portYcoords") === null) { - localStorage.setItem("portYcoords", "default"); -} - -if (localStorage.getItem("portRadius1vals") === null) { - localStorage.setItem("portRadius1vals", "default"); -} - -if (localStorage.getItem("portRadius2vals") === null) { - localStorage.setItem("portRadius2vals", "default"); -} - -if (localStorage.getItem("portToControl") == null) { - localStorage.setItem("portToControl", "null"); -} - -// Variables for Dispenser Control (ports in flow layer) -if (localStorage.getItem("portXcoordsDisp") === null) { - localStorage.setItem("portXcoordsDisp", "default"); -} - -if (localStorage.getItem("portYcoordsDisp") === null) { - localStorage.setItem("portYcoordsDisp", "default"); -} - -if (localStorage.getItem("DispenserToControl") == null) { - localStorage.setItem("DispenserToControl", "null"); -} -if (localStorage.getItem("activeDispenser") == null) { - localStorage.setItem("activeDispenser", "none"); -} -if (localStorage.getItem("dispenserConversions") == null) { - localStorage.setItem("dispenserConversions", "{}"); -} - -console.log("checking JSONloaded now in initiate_data.js"); -if (localStorage.getItem("JSONloaded") == undefined) { - localStorage.setItem("JSONloaded", "false"); - console.log("Successfully set JSONloaded to false in initiate_data.js"); -} - -if (localStorage.getItem("JSONtoLoad") == null) { - localStorage.setItem("JSONtoLoad", "{}"); -} diff --git a/cc/ui/canvas.js b/cc/ui/canvas.js deleted file mode 100644 index b9fc6f42..00000000 --- a/cc/ui/canvas.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * This one will host code that handles the clicks and then basically transmit the valve switching code from here - **/ - -import Setup from "../control/setup"; - -export default class Canvas { - constructor(setup) { - /* - Step 1: Retrieve the microfluidic object - Step 2: Send the valves and callback function to 3DuF - Step 3: - */ - let json = setup.Chip.JSON; - this.__setup = setup; - this.__valves = setup.Chip.getValves(); - //TODO: Call "new" 3DuF API to load the json on it. - console.log("Assuming 3DuF creates the function"); - console.log("load the microfuidic json"); - console.log("pass valves and callback"); - } - - callbackfunction(valveid) { - //This is the callback function which eventually actuates all the pumps - this.__setup.toggleValve(valveid); - } -} diff --git a/cc/ui/controlModal.js b/cc/ui/controlModal.js deleted file mode 100644 index 9d5aca3d..00000000 --- a/cc/ui/controlModal.js +++ /dev/null @@ -1,115 +0,0 @@ -/** - * This file would contain the ko viewmodels that bind the entire control modal to the actual data in the bg - * - * Ideally some of these methods would be disposed off - */ -// Sets up settings Modal -// Settings table save functionality - -function drawValveTable(data) { - $("#ValveTable") - .find("tr:gt(0)") - .remove(); - for (var i = 0; i < data.length; i++) { - drawValveRow(data[i]); - } -} - -function drawValveRow(rowData) { - var row = $(""); - $("#ValveTable").append(row); - row.append($("" + rowData.id + "")); - row.append($("" + rowData.HW_shield + "")); - row.append($("" + rowData.HW_pin + "")); - //row.append($("" + rowData.Open_State + "")); - //row.append($("" + rowData.Closed_State + "")); - row.append($("" + rowData.Open_State + "")); - row.append($("" + rowData.Closed_State + "")); - row.append($("" + rowData.Current_State + "")); -} - -// A few jQuery helpers for exporting only -jQuery.fn.pop = [].pop; -jQuery.fn.shift = [].shift; - -function exporting() { - var $rows = $("#ValveTable").find("tr:not(:hidden):not(:empty)"); - var keys = ["id", "HW_shield", "HW_pin", "Open_State", "Closed_State", "Current_State"]; - var x = 0; // making sure we are not counting the headers row here - var valveData = JSON.parse(localStorage.pumpData); - // Turn all existing rows into a loopable array - $rows.each(function() { - if (x > 0) { - var $td = $(this).find("td"); - // Use pre-defined Hash keys - keys.forEach(function(header, i) { - if (header === "Current_State") { - valveData[x - 1][header] = $td.eq(i).text(); - } else { - valveData[x - 1][header] = parseInt($td.eq(i).text()); - } - }); - } - x = x + 1; - }); - // Output the result - localStorage.pumpData = JSON.stringify(valveData); -} - -function drawDispenserTable(data) { - $("#DispenserTable") - .find("tr:gt(0)") - .remove(); - for (var i = 0; i < data.length; i++) { - drawDispRow(data[i]); - } -} - -function drawDispRow(rowData) { - var row = $(""); - $("#DispenserTable").append(row); - row.append($("" + rowData.id + "")); - row.append($("" + rowData.HW_shield + "")); - row.append($("" + rowData.HW_pin + "")); - row.append($("" + rowData.Precision + "")); - row.append($("" + rowData.Min + "")); - row.append($("" + rowData.Max + "")); - row.append($("" + rowData.Current_State + "")); - row.append($("" + rowData.orientation + "")); -} - -function exportingDispenser() { - var $rows = $("#DispenserTable").find("tr:not(:hidden):not(:empty)"); - var keys = ["id", "HW_shield", "HW_pin", "Precision", "Min", "Max", "Current_State", "orientation"]; - var x = 0; // making sure we are not counting the headers row here - var dispenserData = JSON.parse(localStorage.dispenserData); - // Turn all existing rows into a loopable array - $rows.each(function() { - if (x > 0) { - var $td = $(this).find("td"); - // Use pre-defined Hash keys - keys.forEach(function(header, i) { - if (header === "Current_State") { - dispenserData[x - 1][header] = parseFloat($td.eq(i).text()).toFixed(1); - } else if (header === "Precision") { - dispenserData[x - 1][header] = $td.eq(i).text(); - } else if (header === "Min") { - dispenserData[x - 1][header] = parseFloat($td.eq(i).text()).toFixed(1); - } else if (header === "Max") { - dispenserData[x - 1][header] = parseFloat($td.eq(i).text()).toFixed(1); - } else { - dispenserData[x - 1][header] = parseInt($td.eq(i).text()); - } - }); - } - x = x + 1; - }); - // Output the result - localStorage.dispenserData = JSON.stringify(dispenserData); -} - -function totalExport() { - deviceCount = 0; - exporting(); - exportingDispenser(); -} diff --git a/cc/ui/dispenserModal.js b/cc/ui/dispenserModal.js deleted file mode 100644 index 0cf27354..00000000 --- a/cc/ui/dispenserModal.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * This needs to be split up between the modal ui code and the dispenser hardware code - */ - -// Controls initializing dispensers if they have not been already -// triggers commands to be sent for dispensing -// functionality for changing dispenser orientation - -function sendDispense(sender) { - // VALUES FROM THE FORM: - var form = sender.parentNode.parentNode; - var volume = form.querySelector(".dispenseVol"); - var time = form.querySelector(".dispenseTime"); - var dispenserID = sender.id; // ID of dispenser you are controlling - dispenserID = dispenserID.replace(/\D/g, ""); - //console.log("Dispenser to be controlled is: " + dispenserID); - - if (isNaN(volume.value)) { - toastr.error("Please enter a valid number for dispense volume."); - return false; - } else if (isNaN(time.value)) { - toastr.error("Please enter a valid number for dispense time."); - return false; - } else { - var currentVolume = parseFloat(JSON.parse(localStorage.dispenserData)[dispenserID - 1]["Current_State"]); // current volume state of selected syringe - //var precision = parseFloat(JSON.parse(localStorage.dispenserData)[dispenserID - 1]['Precision']); // pull precision from settings table - - // Hardware computations - // Digital Servos 12cc - var initializeSetup_outputs = initializeSetup(1000, 2500, 0.625, 3, 0, 0.25); - var PWM_table = initializeSetup_outputs.PWM_table; - var PWM_dic = initializeSetup_outputs.PWM_dic; - var uL_table = initializeSetup_outputs.uL_table; - var uL_dic = initializeSetup_outputs.uL_dic; - var uL_min = initializeSetup_outputs.uL_min; - var uL_max = initializeSetup_outputs.uL_max; - var uL_precision = initializeSetup_outputs.uL_precision; - - var globalDispenserData = JSON.parse(localStorage.dispenserData); - globalDispenserData[dispenserID - 1]["Min"] = uL_min.toString(); - globalDispenserData[dispenserID - 1]["Max"] = uL_max.toString(); - globalDispenserData[dispenserID - 1]["Precision"] = uL_precision.toString(); - localStorage.dispenserData = JSON.stringify(globalDispenserData); - - console.log("conversions (PWM and uL): "); - console.log(PWM_table); - console.log(uL_table); - - //var temp = JSON.parse(localStorage.dispenserData); - globalDispenserData[dispenserID - 1]["Min"] = uL_min.toFixed(2).toString(); - globalDispenserData[dispenserID - 1]["Max"] = uL_max.toFixed(2).toString(); - globalDispenserData[dispenserID - 1]["Precision"] = uL_precision.toFixed(2).toString(); - localStorage.dispenserData = JSON.stringify(globalDispenserData); - - // DISPENSERCONVERSIONS NOT DEFINED BEFORE HERE???? - - // store conversion tables to be accessed by other parts of dispense operations - var storedConversions = JSON.parse(localStorage.dispenserConversions); // load here so as not to overwrite tables already stored - storedConversions[dispenserID] = JSON.stringify(uL_table); // update computed conversions in temp variable - localStorage.dispenserConversions = JSON.stringify(storedConversions); // store temp in localStorage - // console.log("uL table: "); - // console.log(uL_table); - - var dispOrientation = JSON.parse(localStorage.dispenserData)[dispenserID - 1]["orientation"]; // determine whether is pull/push dispenser - var valueToDispense; - - // COMPUTE VALUE TO PASS INTO even_uL_steps() - if (dispOrientation === "push") { - valueToDispense = currentVolume - parseFloat(volume.value); - if (valueToDispense < 0) { - toastr.error("Requested dispense volume exceedes remaining syringe volume"); - } - } else { - // pull orientaion - valueToDispense = currentVolume + parseFloat(volume.value); - if (valueToDispense >= parseFloat(globalDispenserData[dispenserID - 1]["Max"]) - parseFloat(globalDispenserData[dispenserID - 1]["Current_State"])) { - toastr.error("Requested dispense volume exceedes remaining syringe volume"); - } - } - - var even_uL_steps_output = even_uL_steps(uL_table, PWM_table, uL_precision, currentVolume, valueToDispense, time.value); // [0] is seconds/step [1] is PWM value array to be sent - // values needed for dispense rate - var msecondsPerStep = even_uL_steps_output.seconds_per_step * 1000; // must be in milliseconds - var stepsPerSecond = even_uL_steps_output.steps_per_second; // conversions only for commands being sent at the moment (this way its easier to update the current volume) - var PWMvalueArray = even_uL_steps_output.PWM_values; - - // set correct dispenser to command - localStorage.dispenserToControl = dispenserID; - - // iterate over command array at appropriate time intervals - for (var i = 0; i < PWMvalueArray.length; i++) { - (function() { - // need to re-define some variables here due to scope - var iPrime = i; - var dispenser_to_control = dispenserID; - setTimeout(function() { - if (PWMvalueArray[iPrime] != PWMvalueArray[iPrime - 1]) { - var temp = JSON.parse(localStorage.dispenserData); - temp[dispenserID - 1]["Current_State"] = PWM_dic[PWMvalueArray[iPrime]].toString(); - localStorage.dispenserData = JSON.stringify(temp); // update local storage to correct new volume amount - sendCommandDispense(PWMvalueArray[iPrime], dispenser_to_control); // now send command - updateDispenseProgressBar(dispenser_to_control); // and update graphics - } - }, i * msecondsPerStep); - })(); - } - return false; - } -} - -function changeDispenseOrientation(sender) { - var dispenserID = sender.id.replace(/\D/g, ""); - var temp = JSON.parse(localStorage.dispenserData); - var currentOrientation = sender.innerHTML; - if (currentOrientation === "pull") { - sender.innerHTML = "push"; - temp[dispenserID - 1]["orientation"] = "push"; - localStorage.dispenserData = JSON.stringify(temp); - } else { - // currentOrientation === "push" - sender.innerHTML = "pull"; - temp[dispenserID - 1]["orientation"] = "pull"; - localStorage.dispenserData = JSON.stringify(temp); - } - return false; -} diff --git a/cc/ui/togglebutton.js b/cc/ui/togglebutton.js deleted file mode 100644 index 7d29f738..00000000 --- a/cc/ui/togglebutton.js +++ /dev/null @@ -1,127 +0,0 @@ -// functionality attached directly to valve icons; find in JSONValveDispenserLoad.js -function onclickanchortag() { - var temp = JSON.parse(localStorage.pumpData); - var valve_to_control = this.id.split("valve").pop(); - if (temp[valve_to_control - 1]["Cluster"].length > 0) { - for (var i = 0; i < temp[valve_to_control - 1]["Cluster"].length; i++) { - toggleValve("#valve" + (temp[valve_to_control - 1]["Cluster"][i] + 1)); - } - } else { - toggleValve("#" + this.id); - } - return false; -} - -// toggle any valve given its DivID -function toggleValve(valveDivID) { - // will be in form of #valve1, #valve2, ... numbers correspond to valve id in JSON - var divElement = $(valveDivID)[0]; - var location = getLocation(divElement.src); - var valve_to_control = divElement.id.split("valve").pop(); - var temp = JSON.parse(localStorage.pumpData); - switch (location.pathname) { - case "/images/fluigi/valveMarkerOpen.svg": - $(divElement).attr("src", "../images/fluigi/valveMarkerClosed.svg"); - // change recorded state in table - temp[valve_to_control - 1]["Current_State"] = "closed"; - break; - - case "/images/fluigi/valveMarkerClosed.svg": - $(divElement).attr("src", "../images/fluigi/valveMarkerOpen.svg"); - // change recorded state in table - temp[valve_to_control - 1]["Current_State"] = "opened"; - break; - default: - $(this).attr("src", "../images/fluigi/valveMarkerClosed.svg"); - break; - } - localStorage.pumpData = JSON.stringify(temp); - localStorage.portToControl = valve_to_control; - sendCommand(); - if (location.pathname == "/images/fluigi/valveMarkerOpen.svg") { - } - return false; -} - -var getLocation = function(href) { - var l = document.createElement("a"); - l.href = href; - return l; -}; - -function onclickanchortagDispense() { - dispenser_to_control = this.id; - incrementDispenserPosition(dispenser_to_control); - return false; -} - -// functionality directly connected to dispenser icons; find in JSONValveDispenserLoad.js -function activateDispenser(dispenserIDNum) { - localStorage.activeDispenser = dispenserIDNum; - localStorage.dispenserToControl = dispenserIDNum; - updateDispenseProgressBar(dispenserIDNum); -} -function deactivateDispenser() { - localStorage.activeDispenser = "none"; -} - -function valve_uL_to_PWM(uL_table, uL_precision, uL_goal) { - for (var i = 0; i <= uL_table.length; i = i + 2) { - if (uL_goal - uL_table[i] <= uL_precision / 2) { - return Math.round(uL_table[i + 1]); - } - } - console.log("ERROR! Cannot find value"); -} - -function wrap_data_for_Arduino() { - var valve_to_control = localStorage.portToControl; - - var data_for_selected_object = JSON.parse(localStorage.pumpData); - var deviceNum = data_for_selected_object[valve_to_control - 1]["deviceIndex"]; - console.log("wrapping command for " + deviceNum); - var open_state_parameter = data_for_selected_object[valve_to_control - 1]["Open_State"]; - var closed_state_parameter = data_for_selected_object[valve_to_control - 1]["Closed_State"]; - var physical_state_parameter = data_for_selected_object[valve_to_control - 1]["Current_State"]; - - if (physical_state_parameter == "opened") { - var uLVal = open_state_parameter; - } else { - var uLVal = closed_state_parameter; - } - - var uL_table = data_for_selected_object[valve_to_control - 1]["uL_Conversion_Table"]; - //console.log("uL_table: " + uL_table); - var uL_precision = data_for_selected_object[valve_to_control - 1]["uL_Precision"]; - var PWMval = valve_uL_to_PWM(uL_table, uL_precision, uLVal); - - // PAD THE VALVE_TO_CONTROL WITH 0's SUCH THAT THE VALUE IS 4 CHARACTERS LONG - var valve_to_control_padded = zeroFill(deviceNum, 4); - // PAD THE PWM VALUE WITH 0's SUCH THAT THE VALUE IS 4 CHARACTERS LONG - var PWMval_padded = zeroFill(PWMval, 4); - // CONCAT THE VALVE NUMBER AND PWM VALUE - var pre_command = valve_to_control_padded.concat(PWMval_padded); - // ADD A START CODON TO SIGNIFY THE BEGINING OF SIGNAL - var startStr = ""; - var pre_command_s = startStr.concat(pre_command); - // ADD A STOP CODON TO SIGNIFY THE END OF SIGNAL - var command = pre_command_s.concat("\n"); - // RETURN THE DATA - return command; -} - -function sendCommand() { - var command = wrap_data_for_Arduino(); - toastr.info(command); - localStorage.setItem("myCommand", command); - $.ajax({ - url: "/serialcommunication/send", - type: "POST", - async: true, - data: { - commandData: command - }, - success: function(response) {}, - error: function(response) {} - }); -} diff --git a/conf.json b/conf.json deleted file mode 100644 index 5d0d0ef3..00000000 --- a/conf.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "source": { - "includePattern": ".+\\.js(doc|x)?$", // Only process file ending in .js, .jsdoc or .jsx - "include": ["./src/app/"], // Check all folders. - "exclude": ["node_modules"] // Be gone, node_modules. - }, - "recurseDepth": 10, // Only go 10 levels deep. - "opts": { - "destination": "./docs/", // Where I want my docs to be generated. - "recurse": true // Same as using -r or --recurse - } -} diff --git a/dist/css/app.85a0644e.css b/css/app.85a0644e.css similarity index 100% rename from dist/css/app.85a0644e.css rename to css/app.85a0644e.css diff --git a/dist/css/chunk-vendors.acfd7f9b.css b/css/chunk-vendors.acfd7f9b.css similarity index 100% rename from dist/css/chunk-vendors.acfd7f9b.css rename to css/chunk-vendors.acfd7f9b.css diff --git a/dist/demo.css b/demo.css similarity index 100% rename from dist/demo.css rename to demo.css diff --git a/doc/mint-primitives.png b/doc/mint-primitives.png deleted file mode 100644 index d150f560f96d1174ee3b0ddf0b237e8e02209469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281979 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 diff --git a/doc/ui.png b/doc/ui.png deleted file mode 100644 index a45a7e080f2e0d29e8abc6fa9f16528386399e01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23411020 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�+??wxbD>Po%2@b}NOZGYPKpFivu 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

J20 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

pb`4t<#70-z}f}W#qT_G#!@F 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 z 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

G(P~_C({Zf5DRttyn5Y6 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 F4t>7e5n1J8j<-grBNTTtgKMY$8`&>GW~l7 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 !|hwU%QgqkmE2 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 diff --git a/examples/COSMIC_OWL.json b/examples/COSMIC_OWL.json deleted file mode 100644 index 7a9cf90e..00000000 --- a/examples/COSMIC_OWL.json +++ /dev/null @@ -1,766 +0,0 @@ -{ - "name": "My Device", - "params": { "width": 75800, "height": 51000 }, - "layers": [ - { - "name": "flow", - "color": "indigo", - "params": { "z_offset": 0, "flip": false }, - "features": { - "6bb96ad0-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb96ad0-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [30000, 40000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb96ad1-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb96ad1-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [40000, 40000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb96ad2-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb96ad2-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [50000, 40000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb96ad3-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb96ad3-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [20000, 40000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb991e0-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991e0-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 40000], "end": [20000, 35000], "width": 400, "height": 100 } - }, - "6bb991e1-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991e1-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 38000], "end": [17000, 38000], "width": 400, "height": 100 } - }, - "6bb991e2-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991e2-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [17000, 38000], "end": [17000, 35000], "width": 400, "height": 100 } - }, - "6bb991e3-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991e3-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 35000], "end": [20000, 20000], "width": 400, "height": 100 } - }, - "6bb991e4-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991e4-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 20000], "end": [10000, 10000], "width": 400, "height": 100 } - }, - "6bb991e5-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991e5-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [17000, 35000], "end": [15000, 30000], "width": 400, "height": 100 } - }, - "6bb991e6-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991e6-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [15000, 30000], "end": [10000, 30000], "width": 400, "height": 100 } - }, - "6bb991e7-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991e7-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 30000], "end": [10000, 28000], "width": 400, "height": 100 } - }, - "6bb991e8-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991e8-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 28000], "end": [15000, 28000], "width": 400, "height": 100 } - }, - "6bb991e9-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991e9-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [15000, 28000], "end": [15000, 25000], "width": 400, "height": 100 } - }, - "6bb991ea-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991ea-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [15000, 25000], "end": [8000, 25000], "width": 400, "height": 100 } - }, - "6bb991eb-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991eb-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [8000, 25000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb991ec-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991ec-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [10000, 10000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb991ed-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991ed-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 40000], "end": [30000, 20000], "width": 400, "height": 100 } - }, - "6bb991ee-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991ee-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 20000], "end": [20000, 10000], "width": 400, "height": 100 } - }, - "6bb991ef-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991ef-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [20000, 10000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb991f0-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991f0-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 38000], "end": [27000, 38000], "width": 400, "height": 100 } - }, - "6bb991f1-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991f1-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [27000, 38000], "end": [27000, 30000], "width": 400, "height": 100 } - }, - "6bb991f2-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991f2-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [27000, 30000], "end": [22000, 30000], "width": 400, "height": 100 } - }, - "6bb991f3-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991f3-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [22000, 30000], "end": [22000, 28000], "width": 400, "height": 100 } - }, - "6bb991f4-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991f4-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [22000, 28000], "end": [27000, 28000], "width": 400, "height": 100 } - }, - "6bb991f5-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991f5-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [27000, 28000], "end": [27000, 26000], "width": 400, "height": 100 } - }, - "6bb991f6-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991f6-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [27000, 26000], "end": [22000, 26000], "width": 400, "height": 100 } - }, - "6bb991f7-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991f7-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [22000, 26000], "end": [22000, 24000], "width": 400, "height": 100 } - }, - "6bb991f8-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991f8-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [22000, 24000], "end": [27000, 24000], "width": 400, "height": 100 } - }, - "6bb991f9-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991f9-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [27000, 24000], "end": [27000, 22000], "width": 400, "height": 100 } - }, - "6bb991fa-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991fa-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [27000, 22000], "end": [22000, 22000], "width": 400, "height": 100 } - }, - "6bb991fb-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991fb-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [22000, 22000], "end": [22000, 20000], "width": 400, "height": 100 } - }, - "6bb991fc-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991fc-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [22000, 20000], "end": [25000, 20000], "width": 400, "height": 100 } - }, - "6bb991fd-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991fd-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [25000, 20000], "end": [25000, 17000], "width": 400, "height": 100 } - }, - "6bb991fe-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb991fe-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [25000, 17000], "end": [21000, 17000], "width": 400, "height": 100 } - }, - "6bb9b8f0-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8f0-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [21000, 17000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb9b8f1-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8f1-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 40000], "end": [40000, 20000], "width": 400, "height": 100 } - }, - "6bb9b8f2-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8f2-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 20000], "end": [50000, 10000], "width": 400, "height": 100 } - }, - "6bb9b8f3-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8f3-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 38000], "end": [43000, 38000], "width": 400, "height": 100 } - }, - "6bb9b8f4-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8f4-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [43000, 38000], "end": [43000, 30000], "width": 400, "height": 100 } - }, - "6bb9b8f5-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8f5-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [43000, 30000], "end": [48000, 30000], "width": 400, "height": 100 } - }, - "6bb9b8f6-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8f6-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [48000, 30000], "end": [48000, 28000], "width": 400, "height": 100 } - }, - "6bb9b8f7-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8f7-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [48000, 28000], "end": [43000, 28000], "width": 400, "height": 100 } - }, - "6bb9b8f8-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8f8-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [43000, 28000], "end": [43000, 26000], "width": 400, "height": 100 } - }, - "6bb9b8f9-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8f9-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [43000, 26000], "end": [48000, 26000], "width": 400, "height": 100 } - }, - "6bb9b8fa-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8fa-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [48000, 26000], "end": [48000, 24000], "width": 400, "height": 100 } - }, - "6bb9b8fb-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8fb-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [48000, 24000], "end": [43000, 24000], "width": 400, "height": 100 } - }, - "6bb9b8fc-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8fc-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [43000, 24000], "end": [43000, 22000], "width": 400, "height": 100 } - }, - "6bb9b8fd-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8fd-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [43000, 22000], "end": [48000, 22000], "width": 400, "height": 100 } - }, - "6bb9b8fe-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8fe-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [48000, 22000], "end": [48000, 20000], "width": 400, "height": 100 } - }, - "6bb9b8ff-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b8ff-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [48000, 20000], "end": [45000, 20000], "width": 400, "height": 100 } - }, - "6bb9b900-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b900-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [45000, 20000], "end": [45000, 17000], "width": 400, "height": 100 } - }, - "6bb9b901-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b901-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [45000, 17000], "end": [49000, 17000], "width": 400, "height": 100 } - }, - "6bb9b902-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b902-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [50000, 10000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb9b903-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b903-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [49000, 17000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb9b904-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b904-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 40000], "end": [50000, 20000], "width": 400, "height": 100 } - }, - "6bb9b905-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b905-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 20000], "end": [60000, 10000], "width": 400, "height": 100 } - }, - "6bb9b906-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9b906-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [60000, 10000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb9e000-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e000-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 38000], "end": [53000, 38000], "width": 400, "height": 100 } - }, - "6bb9e001-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e001-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [53000, 38000], "end": [53000, 35000], "width": 400, "height": 100 } - }, - "6bb9e002-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e002-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [53000, 35000], "end": [55000, 30000], "width": 400, "height": 100 } - }, - "6bb9e003-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e003-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [55000, 30000], "end": [60000, 30000], "width": 400, "height": 100 } - }, - "6bb9e004-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e004-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60000, 30000], "end": [60000, 28000], "width": 400, "height": 100 } - }, - "6bb9e005-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e005-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60000, 28000], "end": [55000, 28000], "width": 400, "height": 100 } - }, - "6bb9e006-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e006-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [55000, 28000], "end": [55000, 25000], "width": 400, "height": 100 } - }, - "6bb9e007-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e007-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [55000, 25000], "end": [62000, 25000], "width": 400, "height": 100 } - }, - "6bb9e008-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e008-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [62000, 25000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb9e009-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e009-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [15000, 15000], "end": [15000, 12000], "width": 400, "height": 100 } - }, - "6bb9e00a-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e00a-3d80-11e5-898a-2de600a0e2af", - "name": "New Via", - "type": "Via", - "params": { "position": [15000, 12000], "radius1": 800, "radius2": 700, "height": 1000 } - }, - "6bb9e00b-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e00b-3d80-11e5-898a-2de600a0e2af", - "name": "New Via", - "type": "Via", - "params": { "position": [26000, 12000], "radius1": 800, "radius2": 700, "height": 1000 } - }, - "6bb9e00c-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e00c-3d80-11e5-898a-2de600a0e2af", - "name": "New Via", - "type": "Via", - "params": { "position": [44000, 12000], "radius1": 800, "radius2": 700, "height": 1000 } - }, - "6bb9e00d-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e00d-3d80-11e5-898a-2de600a0e2af", - "name": "New Via", - "type": "Via", - "params": { "position": [55000, 12000], "radius1": 800, "radius2": 700, "height": 1000 } - }, - "6bb9e00e-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e00e-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [55000, 12000], "end": [55000, 15000], "width": 400, "height": 100 } - }, - "6bb9e00f-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e00f-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [26000, 12000], "end": [30000, 10000], "width": 400, "height": 100 } - }, - "6bb9e010-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e010-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 12000], "end": [40000, 10000], "width": 400, "height": 100 } - }, - "6bb9e011-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e011-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 10000], "end": [38000, 7000], "width": 400, "height": 100 } - }, - "6bb9e012-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e012-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 10000], "end": [32000, 7000], "width": 400, "height": 100 } - }, - "6bb9e013-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e013-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [32000, 7000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb9e014-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e014-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [38000, 7000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bb9e015-3d80-11e5-898a-2de600a0e2af": { - "id": "6bb9e015-3d80-11e5-898a-2de600a0e2af", - "name": "New CircleValve", - "type": "CircleValve", - "params": { "position": [35000, 10000], "radius1": 1400, "radius2": 1200, "height": 800 } - }, - "6bba0710-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0710-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [35000, 10000], "end": [35000, 30000], "width": 400, "height": 100 } - }, - "6bba0711-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0711-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [35000, 30000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bba0712-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0712-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [35000, 17000], "end": [38000, 23000], "width": 400, "height": 100 } - }, - "6bba0713-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0713-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 23000], "end": [36000, 25000], "width": 400, "height": 100 } - }, - "6bba0714-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0714-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 25000], "end": [35000, 30000], "width": 400, "height": 100 } - }, - "6bba0715-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0715-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [35000, 17000], "end": [32000, 23000], "width": 400, "height": 100 } - }, - "6bba0716-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0716-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [32000, 23000], "end": [34000, 25000], "width": 400, "height": 100 } - }, - "6bba0717-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0717-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [34000, 25000], "end": [35000, 30000], "width": 400, "height": 100 } - }, - "6bba0718-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0718-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [32000, 23000], "end": [35000, 24000], "width": 400, "height": 100 } - }, - "6bba0719-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0719-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 23000], "end": [35000, 24000], "width": 400, "height": 100 } - }, - "6bba071a-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba071a-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [25000, 20000], "end": [28000, 20000], "width": 400, "height": 100 } - }, - "6bba071b-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba071b-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [28000, 20000], "end": [28000, 22000], "width": 400, "height": 100 } - }, - "6bba071c-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba071c-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [28000, 22000], "end": [27000, 22000], "width": 400, "height": 100 } - }, - "6bba071d-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba071d-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [45000, 20000], "end": [42000, 20000], "width": 400, "height": 100 } - }, - "6bba071e-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba071e-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 20000], "end": [42000, 22000], "width": 400, "height": 100 } - }, - "6bba071f-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba071f-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 22000], "end": [44000, 22000], "width": 400, "height": 100 } - }, - "8d30ec10-3d80-11e5-898a-2de600a0e2af": { - "id": "8d30ec10-3d80-11e5-898a-2de600a0e2af", - "name": "New Via", - "type": "Via", - "params": { "position": [35000, 30000], "radius1": 800, "radius2": 700, "height": 1000 } - }, - "9b26fd00-3d80-11e5-898a-2de600a0e2af": { - "id": "9b26fd00-3d80-11e5-898a-2de600a0e2af", - "name": "New Via", - "type": "Via", - "params": { "position": [32000, 20000], "radius1": 800, "radius2": 700, "height": 1000 } - }, - "9c3deb40-3d80-11e5-898a-2de600a0e2af": { - "id": "9c3deb40-3d80-11e5-898a-2de600a0e2af", - "name": "New Via", - "type": "Via", - "params": { "position": [38000, 20000], "radius1": 800, "radius2": 700, "height": 1000 } - } - } - }, - { - "name": "control", - "color": "red", - "params": { "z_offset": 1200, "flip": true }, - "features": { - "6bba0720-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0720-3d80-11e5-898a-2de600a0e2af", - "name": "New CircleValve", - "type": "CircleValve", - "params": { "position": [20000, 34000], "radius1": 1400, "radius2": 1200, "height": 800 } - }, - "6bba0721-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0721-3d80-11e5-898a-2de600a0e2af", - "name": "New CircleValve", - "type": "CircleValve", - "params": { "position": [30000, 34000], "radius1": 1400, "radius2": 1200, "height": 800 } - }, - "6bba0722-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0722-3d80-11e5-898a-2de600a0e2af", - "name": "New CircleValve", - "type": "CircleValve", - "params": { "position": [40000, 34000], "radius1": 1400, "radius2": 1200, "height": 800 } - }, - "6bba0723-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0723-3d80-11e5-898a-2de600a0e2af", - "name": "New CircleValve", - "type": "CircleValve", - "params": { "position": [50000, 34000], "radius1": 1400, "radius2": 1200, "height": 800 } - }, - "6bba0724-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0724-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 34000], "end": [24000, 34000], "width": 400, "height": 100 } - }, - "6bba0725-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0725-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [24000, 34000], "end": [24000, 47000], "width": 400, "height": 100 } - }, - "6bba0726-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0726-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 34000], "end": [34000, 34000], "width": 400, "height": 100 } - }, - "6bba0727-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0727-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [34000, 34000], "end": [34000, 47000], "width": 400, "height": 100 } - }, - "6bba0728-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0728-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 34000], "end": [37000, 34000], "width": 400, "height": 100 } - }, - "6bba0729-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0729-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [37000, 34000], "end": [36000, 34000], "width": 400, "height": 100 } - }, - "6bba072a-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba072a-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 34000], "end": [36000, 47000], "width": 400, "height": 100 } - }, - "6bba072b-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba072b-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 34000], "end": [46000, 34000], "width": 400, "height": 100 } - }, - "6bba072c-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba072c-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 34000], "end": [46000, 47000], "width": 400, "height": 100 } - }, - "6bba072d-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba072d-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [24000, 47000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bba072e-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba072e-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [34000, 47000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bba072f-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba072f-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [36000, 47000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bba0730-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba0730-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [46000, 47000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bba2e20-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba2e20-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [15000, 12000], "end": [26000, 12000], "width": 400, "height": 100 } - }, - "6bba2e21-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba2e21-3d80-11e5-898a-2de600a0e2af", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 12000], "end": [55000, 12000], "width": 400, "height": 100 } - }, - "6bba2e22-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba2e22-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [15000, 12000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bba2e23-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba2e23-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [26000, 12000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bba2e24-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba2e24-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [44000, 12000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bba2e25-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba2e25-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [55000, 12000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bba2e26-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba2e26-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [25000, 21000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "6bba2e27-3d80-11e5-898a-2de600a0e2af": { - "id": "6bba2e27-3d80-11e5-898a-2de600a0e2af", - "name": "New Port", - "type": "Port", - "params": { "position": [45000, 21000], "radius1": 700, "radius2": 700, "height": 100 } - } - } - } - ], - "groups": [], - "defaults": {} -} diff --git a/examples/CT1211CoverBiochip_design.json b/examples/CT1211CoverBiochip_design.json deleted file mode 100644 index 1e949545..00000000 --- a/examples/CT1211CoverBiochip_design.json +++ /dev/null @@ -1,2068 +0,0 @@ -{ - "name": "My Device", - "params": { "width": 75800, "height": 51000 }, - "layers": [ - { - "name": "flow", - "color": "indigo", - "params": { "z_offset": 0, "flip": false }, - "features": { - "0b17cd40-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17cd40-3eff-11e5-93b5-5f17d678819e", - "name": "New Port", - "type": "Port", - "params": { "position": [10000, 40000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "0b17cd41-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17cd41-3eff-11e5-93b5-5f17d678819e", - "name": "New Port", - "type": "Port", - "params": { "position": [10000, 30000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "0b17f450-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f450-3eff-11e5-93b5-5f17d678819e", - "name": "New Port", - "type": "Port", - "params": { "position": [10000, 20000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "0b17f451-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f451-3eff-11e5-93b5-5f17d678819e", - "name": "New Port", - "type": "Port", - "params": { "position": [10000, 10000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "0b17f452-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f452-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 9000], "end": [40000, 2000], "width": 400, "height": 100 } - }, - "0b17f453-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f453-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 2000], "end": [39000, 2000], "width": 400, "height": 100 } - }, - "0b17f454-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f454-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 2000], "end": [39000, 8000], "width": 400, "height": 100 } - }, - "0b17f455-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f455-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 8000], "end": [38000, 8000], "width": 400, "height": 100 } - }, - "0b17f456-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f456-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 8000], "end": [38000, 2000], "width": 400, "height": 100 } - }, - "0b17f457-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f457-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 2000], "end": [37000, 2000], "width": 400, "height": 100 } - }, - "0b17f458-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f458-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [37000, 2000], "end": [37000, 8000], "width": 400, "height": 100 } - }, - "0b17f459-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f459-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [37000, 8000], "end": [36000, 8000], "width": 400, "height": 100 } - }, - "0b17f45a-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f45a-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 8000], "end": [36000, 2000], "width": 400, "height": 100 } - }, - "0b17f45b-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f45b-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 2000], "end": [35000, 2000], "width": 400, "height": 100 } - }, - "0b17f45c-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f45c-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [35000, 2000], "end": [35000, 7000], "width": 400, "height": 100 } - }, - "0b17f45d-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f45d-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [35000, 7000], "end": [34000, 7000], "width": 400, "height": 100 } - }, - "0b17f45e-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f45e-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [34000, 7000], "end": [34000, 2000], "width": 400, "height": 100 } - }, - "0b17f45f-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f45f-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [34000, 2000], "end": [33000, 2000], "width": 400, "height": 100 } - }, - "0b17f460-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f460-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [33000, 2000], "end": [33000, 7000], "width": 400, "height": 100 } - }, - "0b17f461-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f461-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [33000, 7000], "end": [32000, 7000], "width": 400, "height": 100 } - }, - "0b17f462-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f462-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [32000, 7000], "end": [32000, 2000], "width": 400, "height": 100 } - }, - "0b17f463-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f463-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [32000, 2000], "end": [30000, 2000], "width": 400, "height": 100 } - }, - "0b17f464-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f464-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [31000, 15000], "end": [32000, 15000], "width": 400, "height": 100 } - }, - "0b17f465-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f465-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [32000, 15000], "end": [32000, 21000], "width": 400, "height": 100 } - }, - "0b17f466-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f466-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [32000, 21000], "end": [33000, 21000], "width": 400, "height": 100 } - }, - "0b17f467-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f467-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [33000, 21000], "end": [33000, 15000], "width": 400, "height": 100 } - }, - "0b17f468-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f468-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [33000, 15000], "end": [34000, 15000], "width": 400, "height": 100 } - }, - "0b17f469-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f469-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [34000, 15000], "end": [34000, 21000], "width": 400, "height": 100 } - }, - "0b17f46a-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f46a-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [34000, 21000], "end": [35000, 21000], "width": 400, "height": 100 } - }, - "0b17f46b-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f46b-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [35000, 21000], "end": [35000, 15000], "width": 400, "height": 100 } - }, - "0b17f46c-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f46c-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [35000, 15000], "end": [36000, 15000], "width": 400, "height": 100 } - }, - "0b17f46d-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f46d-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 15000], "end": [36000, 22000], "width": 400, "height": 100 } - }, - "0b17f46e-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f46e-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 22000], "end": [37000, 22000], "width": 400, "height": 100 } - }, - "0b17f46f-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f46f-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [37000, 22000], "end": [37000, 15000], "width": 400, "height": 100 } - }, - "0b17f470-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f470-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [37000, 15000], "end": [38000, 15000], "width": 400, "height": 100 } - }, - "0b17f471-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f471-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 9000], "end": [40000, 19000], "width": 400, "height": 100 } - }, - "0b17f472-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f472-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 19000], "end": [41000, 20000], "width": 400, "height": 100 } - }, - "0b17f473-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f473-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 20000], "end": [60000, 20000], "width": 400, "height": 100 } - }, - "0b17f474-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f474-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60000, 20000], "end": [60000, 17000], "width": 400, "height": 100 } - }, - "0b17f475-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f475-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 20000], "end": [49000, 21000], "width": 400, "height": 100 } - }, - "0b17f476-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f476-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [49000, 21000], "end": [41000, 21000], "width": 400, "height": 100 } - }, - "0b17f477-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f477-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 21000], "end": [39000, 19000], "width": 400, "height": 100 } - }, - "0b17f478-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f478-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 19000], "end": [39000, 14000], "width": 400, "height": 100 } - }, - "0b17f479-3eff-11e5-93b5-5f17d678819e": { - "id": "0b17f479-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 14000], "end": [32000, 12000], "width": 400, "height": 100 } - }, - "0b181b60-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b60-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [32000, 12000], "end": [26000, 12000], "width": 400, "height": 100 } - }, - "0b181b61-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b61-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [26000, 12000], "end": [20000, 2000], "width": 400, "height": 100 } - }, - "0b181b62-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b62-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 2000], "end": [16000, 2000], "width": 400, "height": 100 } - }, - "0b181b63-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b63-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60000, 17000], "end": [55000, 12000], "width": 400, "height": 100 } - }, - "0b181b64-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b64-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [55000, 12000], "end": [53000, 10000], "width": 400, "height": 100 } - }, - "0b181b65-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b65-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [53000, 10000], "end": [53000, 5000], "width": 400, "height": 100 } - }, - "0b181b66-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b66-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [60000, 5000], "end": [62000, 7000], "borderWidth": 400, "height": 100 } - }, - "0b181b67-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b67-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [29000, 29000], "end": [31000, 31000], "borderWidth": 400, "height": 100 } - }, - "0b181b68-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b68-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [29000, 19000], "end": [31000, 21000], "borderWidth": 400, "height": 100 } - }, - "0b181b69-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b69-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [60000, 39000], "end": [62000, 41000], "borderWidth": 400, "height": 100 } - }, - "0b181b6a-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b6a-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [31000, 21000], "end": [28000, 18000], "borderWidth": 400, "height": 100 } - }, - "0b181b6b-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b6b-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [31000, 31000], "end": [28000, 28000], "borderWidth": 400, "height": 100 } - }, - "0b181b6c-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b6c-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [31000, 41000], "end": [28000, 38000], "borderWidth": 400, "height": 100 } - }, - "0b181b6d-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b6d-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [60000, 7000], "end": [63000, 4000], "borderWidth": 400, "height": 100 } - }, - "0b181b6e-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b6e-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [60000, 41000], "end": [63000, 38000], "borderWidth": 400, "height": 100 } - }, - "0b181b6f-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b6f-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [11000, 11000], "end": [8000, 8000], "borderWidth": 400, "height": 100 } - }, - "0b181b70-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b70-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [11000, 21000], "end": [8000, 18000], "borderWidth": 400, "height": 100 } - }, - "0b181b71-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b71-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [11000, 31000], "end": [8000, 28000], "borderWidth": 400, "height": 100 } - }, - "0b181b72-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b72-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [11000, 41000], "end": [8000, 38000], "borderWidth": 400, "height": 100 } - }, - "0b181b73-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b73-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [31000, 11000], "end": [28000, 8000], "borderWidth": 400, "height": 100 } - }, - "0b181b74-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b74-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 2000], "end": [30000, 8000], "width": 400, "height": 100 } - }, - "0b181b75-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b75-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [31000, 15000], "end": [30000, 15000], "width": 400, "height": 100 } - }, - "0b181b76-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b76-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 15000], "end": [30000, 19000], "width": 400, "height": 100 } - }, - "0b181b77-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b77-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [16000, 2000], "end": [10000, 9000], "width": 400, "height": 100 } - }, - "0b181b78-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b78-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 10000], "end": [9000, 10000], "width": 400, "height": 100 } - }, - "0b181b79-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b79-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [11000, 8000], "end": [2000, 18000], "width": 400, "height": 100 } - }, - "0b181b7a-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b7a-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [2000, 18000], "end": [2000, 25000], "width": 400, "height": 100 } - }, - "0b181b7b-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b7b-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [2000, 25000], "end": [30000, 25000], "width": 400, "height": 100 } - }, - "0b181b7c-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b7c-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 19000], "end": [10000, 15000], "width": 400, "height": 100 } - }, - "0b181b7d-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b7d-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 15000], "end": [10000, 14000], "width": 400, "height": 100 } - }, - "0b181b7e-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b7e-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 14000], "end": [12000, 14000], "width": 400, "height": 100 } - }, - "0b181b7f-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b7f-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 14000], "end": [12000, 18000], "width": 400, "height": 100 } - }, - "0b181b80-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b80-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 18000], "end": [13000, 18000], "width": 400, "height": 100 } - }, - "0b181b81-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b81-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [13000, 18000], "end": [13000, 14000], "width": 400, "height": 100 } - }, - "0b181b82-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b82-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [13000, 14000], "end": [14000, 14000], "width": 400, "height": 100 } - }, - "0b181b83-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b83-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [14000, 14000], "end": [14000, 18000], "width": 400, "height": 100 } - }, - "0b181b84-3eff-11e5-93b5-5f17d678819e": { - "id": "0b181b84-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [14000, 18000], "end": [14000, 19000], "width": 400, "height": 100 } - }, - "0b184270-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184270-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [14000, 19000], "end": [15000, 19000], "width": 400, "height": 100 } - }, - "0b184271-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184271-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [15000, 19000], "end": [15000, 14000], "width": 400, "height": 100 } - }, - "0b184272-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184272-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [15000, 14000], "end": [16000, 14000], "width": 400, "height": 100 } - }, - "0b184273-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184273-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [16000, 14000], "end": [16000, 22000], "width": 400, "height": 100 } - }, - "0b184274-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184274-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [16000, 22000], "end": [17000, 22000], "width": 400, "height": 100 } - }, - "0b184275-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184275-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [17000, 22000], "end": [17000, 14000], "width": 400, "height": 100 } - }, - "0b184276-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184276-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [17000, 14000], "end": [18000, 14000], "width": 400, "height": 100 } - }, - "0b184277-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184277-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [18000, 14000], "end": [18000, 22000], "width": 400, "height": 100 } - }, - "0b184278-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184278-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [18000, 22000], "end": [18000, 22000], "width": 400, "height": 100 } - }, - "0b184279-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184279-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [18000, 22000], "end": [19000, 22000], "width": 400, "height": 100 } - }, - "0b18427a-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18427a-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [19000, 22000], "end": [19000, 16000], "width": 400, "height": 100 } - }, - "0b18427b-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18427b-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [19000, 16000], "end": [20000, 16000], "width": 400, "height": 100 } - }, - "0b18427c-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18427c-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 16000], "end": [20000, 24000], "width": 400, "height": 100 } - }, - "0b18427d-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18427d-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 24000], "end": [30000, 24000], "width": 400, "height": 100 } - }, - "0b18427e-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18427e-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 23000], "end": [22000, 23000], "width": 400, "height": 100 } - }, - "0b18427f-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18427f-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [22000, 23000], "end": [21000, 21000], "width": 400, "height": 100 } - }, - "0b184280-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184280-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [21000, 21000], "end": [21000, 15000], "width": 400, "height": 100 } - }, - "0b184281-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184281-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [21000, 15000], "end": [26000, 15000], "width": 400, "height": 100 } - }, - "0b184282-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184282-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [26000, 15000], "end": [26000, 14000], "width": 400, "height": 100 } - }, - "0b184283-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184283-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [26000, 14000], "end": [21000, 14000], "width": 400, "height": 100 } - }, - "0b184284-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184284-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [21000, 14000], "end": [21000, 13000], "width": 400, "height": 100 } - }, - "0b184285-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184285-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [21000, 13000], "end": [10000, 9000], "width": 400, "height": 100 } - }, - "0b184286-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184286-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 22000], "end": [49000, 23000], "width": 400, "height": 100 } - }, - "0b184287-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184287-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 22000], "end": [61000, 22000], "width": 400, "height": 100 } - }, - "0b184288-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184288-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [61000, 22000], "end": [61000, 17000], "width": 400, "height": 100 } - }, - "0b184289-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184289-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [61000, 17000], "end": [54000, 10000], "width": 400, "height": 100 } - }, - "0b18428a-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18428a-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [49000, 23000], "end": [44000, 23000], "width": 400, "height": 100 } - }, - "0b18428b-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18428b-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 22000], "end": [44000, 22000], "width": 400, "height": 100 } - }, - "0b18428c-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18428c-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62000, 17000], "end": [62000, 23000], "width": 400, "height": 100 } - }, - "0b18428d-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18428d-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62000, 23000], "end": [62000, 24000], "width": 400, "height": 100 } - }, - "0b18428e-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18428e-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62000, 24000], "end": [50000, 24000], "width": 400, "height": 100 } - }, - "0b18428f-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18428f-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 24000], "end": [49000, 25000], "width": 400, "height": 100 } - }, - "0b184290-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184290-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 24000], "end": [44000, 24000], "width": 400, "height": 100 } - }, - "0b184291-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184291-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [49000, 25000], "end": [44000, 25000], "width": 400, "height": 100 } - }, - "0b184292-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184292-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [63000, 17000], "end": [63000, 26000], "width": 400, "height": 100 } - }, - "0b184293-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184293-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [63000, 26000], "end": [50000, 26000], "width": 400, "height": 100 } - }, - "0b184294-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184294-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [64000, 17000], "end": [64000, 28000], "width": 400, "height": 100 } - }, - "0b184295-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184295-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [64000, 28000], "end": [50000, 28000], "width": 400, "height": 100 } - }, - "0b184296-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184296-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [65000, 17000], "end": [65000, 30000], "width": 400, "height": 100 } - }, - "0b184297-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184297-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [65000, 17000], "end": [66000, 10000], "width": 400, "height": 100 } - }, - "0b184298-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184298-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [59000, 3000], "end": [59000, 1000], "width": 400, "height": 100 } - }, - "0b184299-3eff-11e5-93b5-5f17d678819e": { - "id": "0b184299-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [59000, 1000], "end": [74000, 1000], "width": 400, "height": 100 } - }, - "0b18429a-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18429a-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [74000, 1000], "end": [74000, 40000], "width": 400, "height": 100 } - }, - "0b18429b-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18429b-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [74000, 40000], "end": [73000, 40000], "width": 400, "height": 100 } - }, - "0b18429c-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18429c-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [73000, 40000], "end": [73000, 32000], "width": 400, "height": 100 } - }, - "0b18429d-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18429d-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [73000, 32000], "end": [72000, 32000], "width": 400, "height": 100 } - }, - "0b18429e-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18429e-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [72000, 32000], "end": [72000, 40000], "width": 400, "height": 100 } - }, - "0b18429f-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18429f-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [72000, 40000], "end": [71000, 40000], "width": 400, "height": 100 } - }, - "0b1842a0-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1842a0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [71000, 40000], "end": [71000, 32000], "width": 400, "height": 100 } - }, - "0b1842a1-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1842a1-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [71000, 32000], "end": [70000, 32000], "width": 400, "height": 100 } - }, - "0b1842a2-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1842a2-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [70000, 32000], "end": [70000, 40000], "width": 400, "height": 100 } - }, - "0b1842a3-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1842a3-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [70000, 40000], "end": [69000, 40000], "width": 400, "height": 100 } - }, - "0b1842a4-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1842a4-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [69000, 40000], "end": [69000, 32000], "width": 400, "height": 100 } - }, - "0b1842a5-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1842a5-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [69000, 32000], "end": [68000, 32000], "width": 400, "height": 100 } - }, - "0b1842a6-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1842a6-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [68000, 32000], "end": [68000, 40000], "width": 400, "height": 100 } - }, - "0b1842a7-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1842a7-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [68000, 40000], "end": [67000, 40000], "width": 400, "height": 100 } - }, - "0b1842a8-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1842a8-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [67000, 40000], "end": [67000, 32000], "width": 400, "height": 100 } - }, - "0b1842a9-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1842a9-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [67000, 32000], "end": [51000, 32000], "width": 400, "height": 100 } - }, - "0b186980-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186980-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [51000, 32000], "end": [51000, 34000], "width": 400, "height": 100 } - }, - "0b186981-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186981-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [51000, 34000], "end": [60000, 38000], "width": 400, "height": 100 } - }, - "0b186982-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186982-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 26000], "end": [20000, 26000], "width": 400, "height": 100 } - }, - "0b186983-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186983-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 15000], "end": [38000, 21000], "width": 400, "height": 100 } - }, - "0b186984-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186984-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 21000], "end": [39000, 22000], "width": 400, "height": 100 } - }, - "0b186985-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186985-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 22000], "end": [44000, 22000], "width": 400, "height": 100 } - }, - "0b186986-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186986-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 23000], "end": [30000, 23000], "width": 400, "height": 100 } - }, - "0b186987-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186987-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 24000], "end": [30000, 24000], "width": 400, "height": 100 } - }, - "0b186988-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186988-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 25000], "end": [30000, 25000], "width": 400, "height": 100 } - }, - "0b186989-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186989-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 26000], "end": [49000, 27000], "width": 400, "height": 100 } - }, - "0b18698a-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18698a-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 26000], "end": [30000, 26000], "width": 400, "height": 100 } - }, - "0b18698b-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18698b-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [49000, 27000], "end": [30000, 27000], "width": 400, "height": 100 } - }, - "0b18698c-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18698c-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 28000], "end": [49000, 28000], "width": 400, "height": 100 } - }, - "0b18698d-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18698d-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [49000, 28000], "end": [45000, 28000], "width": 400, "height": 100 } - }, - "0b18698e-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18698e-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 28000], "end": [49000, 29000], "width": 400, "height": 100 } - }, - "0b18698f-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18698f-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [49000, 29000], "end": [45000, 29000], "width": 400, "height": 100 } - }, - "0b186990-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186990-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [45000, 29000], "end": [45000, 29000], "width": 400, "height": 100 } - }, - "0b186991-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186991-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [45000, 29000], "end": [39000, 35000], "width": 400, "height": 100 } - }, - "0b186992-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186992-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [45000, 28000], "end": [39000, 34000], "width": 400, "height": 100 } - }, - "0b186993-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186993-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 34000], "end": [38000, 34000], "width": 400, "height": 100 } - }, - "0b186994-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186994-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 34000], "end": [38000, 33000], "width": 400, "height": 100 } - }, - "0b186995-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186995-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 33000], "end": [39000, 33000], "width": 400, "height": 100 } - }, - "0b186996-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186996-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 33000], "end": [43000, 29000], "width": 400, "height": 100 } - }, - "0b186997-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186997-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [43000, 29000], "end": [43000, 28000], "width": 400, "height": 100 } - }, - "0b186998-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186998-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [43000, 28000], "end": [42000, 28000], "width": 400, "height": 100 } - }, - "0b186999-3eff-11e5-93b5-5f17d678819e": { - "id": "0b186999-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 28000], "end": [42000, 29000], "width": 400, "height": 100 } - }, - "0b18699a-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18699a-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 29000], "end": [39000, 32000], "width": 400, "height": 100 } - }, - "0b18699b-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18699b-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 32000], "end": [38000, 32000], "width": 400, "height": 100 } - }, - "0b18699c-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18699c-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 32000], "end": [38000, 31000], "width": 400, "height": 100 } - }, - "0b18699d-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18699d-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 31000], "end": [39000, 31000], "width": 400, "height": 100 } - }, - "0b18699e-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18699e-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 31000], "end": [41000, 29000], "width": 400, "height": 100 } - }, - "0b18699f-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18699f-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 29000], "end": [41000, 28000], "width": 400, "height": 100 } - }, - "0b1869a0-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869a0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 28000], "end": [40000, 28000], "width": 400, "height": 100 } - }, - "0b1869a1-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869a1-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 28000], "end": [40000, 29000], "width": 400, "height": 100 } - }, - "0b1869a2-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869a2-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 29000], "end": [39000, 30000], "width": 400, "height": 100 } - }, - "0b1869a3-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869a3-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 30000], "end": [38000, 30000], "width": 400, "height": 100 } - }, - "0b1869a4-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869a4-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 30000], "end": [33000, 35000], "width": 400, "height": 100 } - }, - "0b1869a5-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869a5-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [33000, 35000], "end": [20000, 35000], "width": 400, "height": 100 } - }, - "0b1869a6-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869a6-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 35000], "end": [20000, 34000], "width": 400, "height": 100 } - }, - "0b1869a7-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869a7-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 34000], "end": [25000, 34000], "width": 400, "height": 100 } - }, - "0b1869a8-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869a8-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [25000, 34000], "end": [30000, 34000], "width": 400, "height": 100 } - }, - "0b1869a9-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869a9-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 34000], "end": [30000, 33000], "width": 400, "height": 100 } - }, - "0b1869aa-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869aa-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 33000], "end": [20000, 33000], "width": 400, "height": 100 } - }, - "0b1869ab-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869ab-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 33000], "end": [20000, 32000], "width": 400, "height": 100 } - }, - "0b1869ac-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869ac-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 32000], "end": [22000, 32000], "width": 400, "height": 100 } - }, - "0b1869ad-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869ad-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [22000, 32000], "end": [22000, 30000], "width": 400, "height": 100 } - }, - "0b1869ae-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869ae-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [22000, 30000], "end": [23000, 30000], "width": 400, "height": 100 } - }, - "0b1869af-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869af-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [23000, 30000], "end": [23000, 32000], "width": 400, "height": 100 } - }, - "0b1869b0-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869b0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [23000, 32000], "end": [35000, 32000], "width": 400, "height": 100 } - }, - "0b1869b1-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869b1-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [35000, 32000], "end": [37000, 30000], "width": 400, "height": 100 } - }, - "0b1869b2-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869b2-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [37000, 30000], "end": [37000, 29000], "width": 400, "height": 100 } - }, - "0b1869b3-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1869b3-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [37000, 29000], "end": [31000, 29000], "width": 400, "height": 100 } - }, - "0b189090-3eff-11e5-93b5-5f17d678819e": { - "id": "0b189090-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [65000, 30000], "end": [52000, 30000], "width": 400, "height": 100 } - }, - "0b189091-3eff-11e5-93b5-5f17d678819e": { - "id": "0b189091-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [52000, 30000], "end": [51000, 31000], "width": 400, "height": 100 } - }, - "0b189092-3eff-11e5-93b5-5f17d678819e": { - "id": "0b189092-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [51000, 31000], "end": [50000, 31000], "width": 400, "height": 100 } - }, - "0b189093-3eff-11e5-93b5-5f17d678819e": { - "id": "0b189093-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [52000, 30000], "end": [49000, 30000], "width": 400, "height": 100 } - }, - "0b189094-3eff-11e5-93b5-5f17d678819e": { - "id": "0b189094-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [49000, 30000], "end": [49000, 42000], "width": 400, "height": 100 } - }, - "0b189095-3eff-11e5-93b5-5f17d678819e": { - "id": "0b189095-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [49000, 42000], "end": [48000, 42000], "width": 400, "height": 100 } - }, - "0b189096-3eff-11e5-93b5-5f17d678819e": { - "id": "0b189096-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 31000], "end": [50000, 45000], "width": 400, "height": 100 } - }, - "0b189097-3eff-11e5-93b5-5f17d678819e": { - "id": "0b189097-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [50000, 45000], "end": [48000, 47000], "width": 400, "height": 100 } - }, - "0b189098-3eff-11e5-93b5-5f17d678819e": { - "id": "0b189098-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [48000, 47000], "end": [6000, 47000], "width": 400, "height": 100 } - }, - "0b189099-3eff-11e5-93b5-5f17d678819e": { - "id": "0b189099-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [6000, 47000], "end": [4000, 45000], "width": 400, "height": 100 } - }, - "0b18909a-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18909a-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [4000, 45000], "end": [11000, 38000], "width": 400, "height": 100 } - }, - "0b18909b-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18909b-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [48000, 42000], "end": [48000, 32000], "width": 400, "height": 100 } - }, - "0b18909c-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18909c-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [48000, 32000], "end": [47000, 32000], "width": 400, "height": 100 } - }, - "0b18909d-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18909d-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [47000, 32000], "end": [47000, 43000], "width": 400, "height": 100 } - }, - "0b18909e-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18909e-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [47000, 43000], "end": [46000, 43000], "width": 400, "height": 100 } - }, - "0b18909f-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18909f-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 43000], "end": [46000, 33000], "width": 400, "height": 100 } - }, - "0b1890a0-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890a0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 33000], "end": [45000, 33000], "width": 400, "height": 100 } - }, - "0b1890a1-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890a1-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [45000, 33000], "end": [45000, 43000], "width": 400, "height": 100 } - }, - "0b1890a2-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890a2-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [45000, 43000], "end": [44000, 43000], "width": 400, "height": 100 } - }, - "0b1890a3-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890a3-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 43000], "end": [44000, 34000], "width": 400, "height": 100 } - }, - "0b1890a4-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890a4-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 34000], "end": [43000, 34000], "width": 400, "height": 100 } - }, - "0b1890a5-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890a5-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [43000, 34000], "end": [43000, 43000], "width": 400, "height": 100 } - }, - "0b1890a6-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890a6-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 43000], "end": [42000, 43000], "width": 400, "height": 100 } - }, - "0b1890a7-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890a7-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [43000, 43000], "end": [42000, 43000], "width": 400, "height": 100 } - }, - "0b1890a8-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890a8-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 43000], "end": [42000, 38000], "width": 400, "height": 100 } - }, - "0b1890a9-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890a9-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 38000], "end": [41000, 38000], "width": 400, "height": 100 } - }, - "0b1890aa-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890aa-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 38000], "end": [41000, 45000], "width": 400, "height": 100 } - }, - "0b1890ab-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890ab-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 45000], "end": [35000, 45000], "width": 400, "height": 100 } - }, - "0b1890ac-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890ac-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [35000, 45000], "end": [30000, 40000], "width": 400, "height": 100 } - }, - "0b1890ad-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890ad-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 41000], "end": [10000, 40000], "width": 400, "height": 100 } - }, - "0b1890ae-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890ae-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 40000], "end": [12000, 37000], "width": 400, "height": 100 } - }, - "0b1890af-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890af-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 37000], "end": [24000, 37000], "width": 400, "height": 100 } - }, - "0b1890b0-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890b0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [24000, 37000], "end": [24000, 36000], "width": 400, "height": 100 } - }, - "0b1890b1-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890b1-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [24000, 36000], "end": [12000, 36000], "width": 400, "height": 100 } - }, - "0b1890b2-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890b2-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 36000], "end": [21000, 27000], "width": 400, "height": 100 } - }, - "0b1890b3-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890b3-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [21000, 27000], "end": [30000, 27000], "width": 400, "height": 100 } - }, - "0b1890b4-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890b4-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 26000], "end": [9000, 37000], "width": 400, "height": 100 } - }, - "0b1890b5-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890b5-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 37000], "end": [3000, 37000], "width": 400, "height": 100 } - }, - "0b1890b6-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890b6-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [3000, 37000], "end": [3000, 36000], "width": 400, "height": 100 } - }, - "0b1890b7-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890b7-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [3000, 36000], "end": [8000, 36000], "width": 400, "height": 100 } - }, - "0b1890b8-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890b8-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [8000, 36000], "end": [9000, 36000], "width": 400, "height": 100 } - }, - "0b1890b9-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890b9-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 36000], "end": [9000, 35000], "width": 400, "height": 100 } - }, - "0b1890ba-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890ba-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 35000], "end": [3000, 35000], "width": 400, "height": 100 } - }, - "0b1890bb-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890bb-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [3000, 35000], "end": [3000, 34000], "width": 400, "height": 100 } - }, - "0b1890bc-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890bc-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [3000, 34000], "end": [9000, 34000], "width": 400, "height": 100 } - }, - "0b1890bd-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890bd-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 34000], "end": [9000, 33000], "width": 400, "height": 100 } - }, - "0b1890be-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890be-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 33000], "end": [3000, 33000], "width": 400, "height": 100 } - }, - "0b1890bf-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890bf-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [3000, 33000], "end": [3000, 32000], "width": 400, "height": 100 } - }, - "0b1890c0-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890c0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [3000, 32000], "end": [12000, 32000], "width": 400, "height": 100 } - }, - "0b1890c1-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890c1-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 32000], "end": [16000, 28000], "width": 400, "height": 100 } - }, - "0b1890c2-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890c2-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [16000, 28000], "end": [16000, 26000], "width": 400, "height": 100 } - }, - "0b1890c3-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890c3-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [16000, 26000], "end": [5000, 26000], "width": 400, "height": 100 } - }, - "0b1890c4-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890c4-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [5000, 26000], "end": [4000, 27000], "width": 400, "height": 100 } - }, - "0b1890c5-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890c5-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [4000, 27000], "end": [9000, 30000], "width": 400, "height": 100 } - }, - "0b1890c6-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890c6-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 35000], "end": [39000, 43000], "width": 400, "height": 100 } - }, - "0b1890c7-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890c7-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 43000], "end": [38000, 43000], "width": 400, "height": 100 } - }, - "0b1890c8-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890c8-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 43000], "end": [38000, 36000], "width": 400, "height": 100 } - }, - "0b1890c9-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890c9-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 36000], "end": [28000, 36000], "width": 400, "height": 100 } - }, - "0b1890ca-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890ca-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [28000, 36000], "end": [24000, 40000], "width": 400, "height": 100 } - }, - "0b1890cb-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890cb-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [24000, 40000], "end": [24000, 45000], "width": 400, "height": 100 } - }, - "0b1890cc-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890cc-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [24000, 45000], "end": [15000, 45000], "width": 400, "height": 100 } - }, - "0b1890cd-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890cd-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [15000, 45000], "end": [10000, 40000], "width": 400, "height": 100 } - }, - "0b1890ce-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890ce-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [57000, 8000], "end": [56000, 9000], "width": 400, "height": 100 } - }, - "0b1890cf-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890cf-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [56000, 9000], "end": [56000, 10000], "width": 400, "height": 100 } - }, - "0b1890d0-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890d0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [56000, 10000], "end": [62000, 16000], "width": 400, "height": 100 } - }, - "0b1890d1-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890d1-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62000, 16000], "end": [62000, 17000], "width": 400, "height": 100 } - }, - "0b1890d2-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890d2-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [63000, 17000], "end": [63000, 15000], "width": 400, "height": 100 } - }, - "0b1890d3-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890d3-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [63000, 15000], "end": [63000, 15000], "width": 400, "height": 100 } - }, - "0b1890d4-3eff-11e5-93b5-5f17d678819e": { - "id": "0b1890d4-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [63000, 15000], "end": [59000, 11000], "width": 400, "height": 100 } - }, - "0b18b7a0-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7a0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [59000, 11000], "end": [58000, 10000], "width": 400, "height": 100 } - }, - "0b18b7a1-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7a1-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [58000, 10000], "end": [58000, 9000], "width": 400, "height": 100 } - }, - "0b18b7a2-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7a2-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [59000, 3000], "end": [66000, 10000], "width": 400, "height": 100 } - }, - "0b18b7a3-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7a3-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [61000, 7000], "end": [60000, 7000], "width": 400, "height": 100 } - }, - "0b18b7a4-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7a4-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [59000, 9000], "end": [61000, 9000], "width": 400, "height": 100 } - }, - "0b18b7a5-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7a5-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [58000, 9000], "end": [59000, 9000], "width": 400, "height": 100 } - }, - "0b18b7a6-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7a6-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [61000, 9000], "end": [61000, 7000], "width": 400, "height": 100 } - }, - "0b18b7a7-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7a7-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62000, 7000], "end": [62000, 10000], "width": 400, "height": 100 } - }, - "0b18b7a8-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7a8-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62000, 10000], "end": [64000, 12000], "width": 400, "height": 100 } - }, - "0b18b7a9-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7a9-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [64000, 12000], "end": [64000, 17000], "width": 400, "height": 100 } - }, - "0b18b7aa-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7aa-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [54000, 4000], "end": [62000, 6000], "width": 400, "height": 100 } - }, - "0b18b7ab-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7ab-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [55000, 6000], "end": [54000, 7000], "width": 400, "height": 100 } - }, - "0b18b7ac-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7ac-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [54000, 7000], "end": [54000, 10000], "width": 400, "height": 100 } - }, - "0b18b7ad-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7ad-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [55000, 6000], "end": [60000, 6000], "width": 400, "height": 100 } - }, - "0b18b7ae-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7ae-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [54000, 4000], "end": [53000, 5000], "width": 400, "height": 100 } - }, - "0b18b7af-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7af-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [57000, 8000], "end": [59000, 8000], "width": 400, "height": 100 } - }, - "0b18b7b0-3eff-11e5-93b5-5f17d678819e": { - "id": "0b18b7b0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [59000, 8000], "end": [61000, 6000], "width": 400, "height": 100 } - } - } - }, - { - "name": "control", - "color": "red", - "params": { "z_offset": 1200, "flip": true }, - "features": { - "387e92f0-3eff-11e5-93b5-5f17d678819e": { - "id": "387e92f0-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [52000, 19000], "end": [53000, 21000], "borderWidth": 400, "height": 100 } - }, - "3be3b6f0-3eff-11e5-93b5-5f17d678819e": { - "id": "3be3b6f0-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [54000, 21000], "end": [55000, 23000], "borderWidth": 400, "height": 100 } - }, - "3cf61150-3eff-11e5-93b5-5f17d678819e": { - "id": "3cf61150-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [56000, 23000], "end": [57000, 25000], "borderWidth": 400, "height": 100 } - }, - "3dc659a0-3eff-11e5-93b5-5f17d678819e": { - "id": "3dc659a0-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [58000, 25000], "end": [59000, 27000], "borderWidth": 400, "height": 100 } - }, - "3ea45d90-3eff-11e5-93b5-5f17d678819e": { - "id": "3ea45d90-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [60000, 27000], "end": [61000, 29000], "borderWidth": 400, "height": 100 } - }, - "3f5cb110-3eff-11e5-93b5-5f17d678819e": { - "id": "3f5cb110-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [62000, 29000], "end": [63000, 31000], "borderWidth": 400, "height": 100 } - }, - "47eb6560-3eff-11e5-93b5-5f17d678819e": { - "id": "47eb6560-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [52500, 16000], "end": [52500, 20000], "width": 400, "height": 100 } - }, - "4b52d350-3eff-11e5-93b5-5f17d678819e": { - "id": "4b52d350-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [54500, 22000], "end": [54500, 17000], "width": 400, "height": 100 } - }, - "4f8f4480-3eff-11e5-93b5-5f17d678819e": { - "id": "4f8f4480-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [56500, 23600], "end": [56500, 18000], "width": 400, "height": 100 } - }, - "55756e10-3eff-11e5-93b5-5f17d678819e": { - "id": "55756e10-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [58500, 26000], "end": [58500, 22200], "width": 400, "height": 100 } - }, - "571402e0-3eff-11e5-93b5-5f17d678819e": { - "id": "571402e0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [58500, 22100], "end": [58500, 19200], "width": 400, "height": 100 } - }, - "592a11a0-3eff-11e5-93b5-5f17d678819e": { - "id": "592a11a0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [58500, 19200], "end": [58500, 19000], "width": 400, "height": 100 } - }, - "5c7df790-3eff-11e5-93b5-5f17d678819e": { - "id": "5c7df790-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60500, 20000], "end": [60500, 20400], "width": 400, "height": 100 } - }, - "5e7d7110-3eff-11e5-93b5-5f17d678819e": { - "id": "5e7d7110-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60500, 20500], "end": [60500, 24900], "width": 400, "height": 100 } - }, - "60abe9d0-3eff-11e5-93b5-5f17d678819e": { - "id": "60abe9d0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60500, 25000], "end": [60500, 27800], "width": 400, "height": 100 } - }, - "64abc730-3eff-11e5-93b5-5f17d678819e": { - "id": "64abc730-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62500, 29000], "end": [62500, 23600], "width": 400, "height": 100 } - }, - "670aece0-3eff-11e5-93b5-5f17d678819e": { - "id": "670aece0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62500, 23600], "end": [62500, 21000], "width": 400, "height": 100 } - }, - "6b44ed10-3eff-11e5-93b5-5f17d678819e": { - "id": "6b44ed10-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [52500, 16000], "end": [53000, 16000], "width": 400, "height": 100 } - }, - "6cfe35d0-3eff-11e5-93b5-5f17d678819e": { - "id": "6cfe35d0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [54500, 17000], "end": [55000, 17000], "width": 400, "height": 100 } - }, - "6e748220-3eff-11e5-93b5-5f17d678819e": { - "id": "6e748220-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [56500, 18000], "end": [57000, 18000], "width": 400, "height": 100 } - }, - "6f704740-3eff-11e5-93b5-5f17d678819e": { - "id": "6f704740-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [58500, 19000], "end": [59000, 19000], "width": 400, "height": 100 } - }, - "723a8ad0-3eff-11e5-93b5-5f17d678819e": { - "id": "723a8ad0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62500, 21000], "end": [63000, 21000], "width": 400, "height": 100 } - }, - "9a3fc040-3eff-11e5-93b5-5f17d678819e": { - "id": "9a3fc040-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [53000, 16000], "end": [66000, 16000], "width": 400, "height": 100 } - }, - "9b18e230-3eff-11e5-93b5-5f17d678819e": { - "id": "9b18e230-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [55000, 17000], "end": [66000, 17000], "width": 400, "height": 100 } - }, - "9bbaee90-3eff-11e5-93b5-5f17d678819e": { - "id": "9bbaee90-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [57000, 18000], "end": [66000, 18000], "width": 400, "height": 100 } - }, - "9c5c5eb0-3eff-11e5-93b5-5f17d678819e": { - "id": "9c5c5eb0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [59000, 19000], "end": [66000, 19000], "width": 400, "height": 100 } - }, - "a0b90210-3eff-11e5-93b5-5f17d678819e": { - "id": "a0b90210-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60000, 20000], "end": [66000, 20000], "width": 400, "height": 100 } - }, - "a1663200-3eff-11e5-93b5-5f17d678819e": { - "id": "a1663200-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [63000, 21000], "end": [66000, 21000], "width": 400, "height": 100 } - }, - "a2535120-3eff-11e5-93b5-5f17d678819e": { - "id": "a2535120-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [66000, 21000], "end": [67000, 22000], "width": 400, "height": 100 } - }, - "a3910140-3eff-11e5-93b5-5f17d678819e": { - "id": "a3910140-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [66000, 20000], "end": [67000, 20000], "width": 400, "height": 100 } - }, - "a47064c0-3eff-11e5-93b5-5f17d678819e": { - "id": "a47064c0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [67000, 20000], "end": [69000, 22000], "width": 400, "height": 100 } - }, - "a5548330-3eff-11e5-93b5-5f17d678819e": { - "id": "a5548330-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [66000, 19000], "end": [67000, 19000], "width": 400, "height": 100 } - }, - "a6fc3fc0-3eff-11e5-93b5-5f17d678819e": { - "id": "a6fc3fc0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [67000, 19000], "end": [68000, 19000], "width": 400, "height": 100 } - }, - "a75e35e0-3eff-11e5-93b5-5f17d678819e": { - "id": "a75e35e0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [68000, 19000], "end": [71000, 22000], "width": 400, "height": 100 } - }, - "a8d98b40-3eff-11e5-93b5-5f17d678819e": { - "id": "a8d98b40-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [66000, 18000], "end": [69000, 18000], "width": 400, "height": 100 } - }, - "a96158e0-3eff-11e5-93b5-5f17d678819e": { - "id": "a96158e0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [69000, 18000], "end": [71000, 20000], "width": 400, "height": 100 } - }, - "ac244970-3eff-11e5-93b5-5f17d678819e": { - "id": "ac244970-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [66000, 17000], "end": [70000, 17000], "width": 400, "height": 100 } - }, - "ac990440-3eff-11e5-93b5-5f17d678819e": { - "id": "ac990440-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [70000, 17000], "end": [71000, 18000], "width": 400, "height": 100 } - }, - "ae167c80-3eff-11e5-93b5-5f17d678819e": { - "id": "ae167c80-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [66000, 16000], "end": [71000, 16000], "width": 400, "height": 100 } - }, - "b0b6c9e0-3eff-11e5-93b5-5f17d678819e": { - "id": "b0b6c9e0-3eff-11e5-93b5-5f17d678819e", - "name": "New Port", - "type": "Port", - "params": { "position": [67000, 22000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "b11c9090-3eff-11e5-93b5-5f17d678819e": { - "id": "b11c9090-3eff-11e5-93b5-5f17d678819e", - "name": "New Port", - "type": "Port", - "params": { "position": [69000, 22000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "b1767060-3eff-11e5-93b5-5f17d678819e": { - "id": "b1767060-3eff-11e5-93b5-5f17d678819e", - "name": "New Port", - "type": "Port", - "params": { "position": [71000, 22000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "b1bfd570-3eff-11e5-93b5-5f17d678819e": { - "id": "b1bfd570-3eff-11e5-93b5-5f17d678819e", - "name": "New Port", - "type": "Port", - "params": { "position": [71000, 20000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "b21632d0-3eff-11e5-93b5-5f17d678819e": { - "id": "b21632d0-3eff-11e5-93b5-5f17d678819e", - "name": "New Port", - "type": "Port", - "params": { "position": [71000, 18000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "b25e3850-3eff-11e5-93b5-5f17d678819e": { - "id": "b25e3850-3eff-11e5-93b5-5f17d678819e", - "name": "New Port", - "type": "Port", - "params": { "position": [71000, 16000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "c04f1920-3eff-11e5-93b5-5f17d678819e": { - "id": "c04f1920-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [9000, 9000], "end": [10000, 10000], "borderWidth": 400, "height": 100 } - }, - "c10a2bc0-3eff-11e5-93b5-5f17d678819e": { - "id": "c10a2bc0-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [9000, 19000], "end": [10000, 20000], "borderWidth": 400, "height": 100 } - }, - "c1a58160-3eff-11e5-93b5-5f17d678819e": { - "id": "c1a58160-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [9000, 29000], "end": [10000, 30000], "borderWidth": 400, "height": 100 } - }, - "c243bd30-3eff-11e5-93b5-5f17d678819e": { - "id": "c243bd30-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [9000, 39000], "end": [10000, 40000], "borderWidth": 400, "height": 100 } - }, - "c31c9100-3eff-11e5-93b5-5f17d678819e": { - "id": "c31c9100-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [29000, 9000], "end": [30000, 10000], "borderWidth": 400, "height": 100 } - }, - "c3bcefb0-3eff-11e5-93b5-5f17d678819e": { - "id": "c3bcefb0-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [29000, 19000], "end": [30000, 20000], "borderWidth": 400, "height": 100 } - }, - "c4780250-3eff-11e5-93b5-5f17d678819e": { - "id": "c4780250-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [29000, 29000], "end": [30000, 30000], "borderWidth": 400, "height": 100 } - }, - "c532c6d0-3eff-11e5-93b5-5f17d678819e": { - "id": "c532c6d0-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [29000, 39000], "end": [30000, 40000], "borderWidth": 400, "height": 100 } - }, - "c65267a0-3eff-11e5-93b5-5f17d678819e": { - "id": "c65267a0-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [61000, 39000], "end": [62000, 40000], "borderWidth": 400, "height": 100 } - }, - "c725e440-3eff-11e5-93b5-5f17d678819e": { - "id": "c725e440-3eff-11e5-93b5-5f17d678819e", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [61000, 5000], "end": [62000, 6000], "borderWidth": 400, "height": 100 } - }, - "fb551d30-3eff-11e5-93b5-5f17d678819e": { - "id": "fb551d30-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9600, 9500], "end": [25000, 9500], "width": 400, "height": 100 } - }, - "ff6db2b0-3eff-11e5-93b5-5f17d678819e": { - "id": "ff6db2b0-3eff-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [25000, 9500], "end": [27300, 9500], "width": 400, "height": 100 } - }, - "007314c0-3f00-11e5-93b5-5f17d678819e": { - "id": "007314c0-3f00-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [27300, 9500], "end": [29200, 9500], "width": 400, "height": 100 } - }, - "02b2a480-3f00-11e5-93b5-5f17d678819e": { - "id": "02b2a480-3f00-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9500, 19500], "end": [21600, 19600], "width": 400, "height": 100 } - }, - "056c4640-3f00-11e5-93b5-5f17d678819e": { - "id": "056c4640-3f00-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [21600, 19600], "end": [29600, 19600], "width": 400, "height": 100 } - }, - "09610010-3f00-11e5-93b5-5f17d678819e": { - "id": "09610010-3f00-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9500, 29500], "end": [24100, 29500], "width": 400, "height": 100 } - }, - "0da25340-3f00-11e5-93b5-5f17d678819e": { - "id": "0da25340-3f00-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [24200, 29500], "end": [29500, 29500], "width": 400, "height": 100 } - }, - "10cba6c0-3f00-11e5-93b5-5f17d678819e": { - "id": "10cba6c0-3f00-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9500, 39500], "end": [19500, 39500], "width": 400, "height": 100 } - }, - "137039e0-3f00-11e5-93b5-5f17d678819e": { - "id": "137039e0-3f00-11e5-93b5-5f17d678819e", - "name": "New Channel", - "type": "Channel", - "params": { "start": [19500, 39500], "end": [29600, 39500], "width": 400, "height": 100 } - } - } - } - ], - "groups": [], - "defaults": {} -} diff --git a/examples/VoigtCassieMockup.json b/examples/VoigtCassieMockup.json deleted file mode 100644 index 10bf75e6..00000000 --- a/examples/VoigtCassieMockup.json +++ /dev/null @@ -1,1900 +0,0 @@ -{ - "name": "My Device", - "params": { "width": 75800, "height": 51000 }, - "layers": [ - { - "name": "flow", - "color": "indigo", - "params": { "z_offset": 0, "flip": false }, - "features": { - "3238de90-404f-11e5-877d-e53327a933d0": { - "id": "3238de90-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [2000, 40000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323905a0-404f-11e5-877d-e53327a933d0": { - "id": "323905a0-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [2000, 35000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323905a1-404f-11e5-877d-e53327a933d0": { - "id": "323905a1-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [2000, 30000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323905a2-404f-11e5-877d-e53327a933d0": { - "id": "323905a2-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [2000, 25000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323905a3-404f-11e5-877d-e53327a933d0": { - "id": "323905a3-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [2000, 20000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323905a4-404f-11e5-877d-e53327a933d0": { - "id": "323905a4-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [2000, 15000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323905a5-404f-11e5-877d-e53327a933d0": { - "id": "323905a5-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [2000, 10000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323905a6-404f-11e5-877d-e53327a933d0": { - "id": "323905a6-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [2000, 5000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "32392cb0-404f-11e5-877d-e53327a933d0": { - "id": "32392cb0-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [2000, 5000], "end": [10000, 5000], "width": 410, "height": 100 } - }, - "32392cb1-404f-11e5-877d-e53327a933d0": { - "id": "32392cb1-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 5000], "end": [10000, 10000], "width": 410, "height": 100 } - }, - "32392cb2-404f-11e5-877d-e53327a933d0": { - "id": "32392cb2-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [2000, 10000], "end": [10000, 10000], "width": 410, "height": 100 } - }, - "32392cb3-404f-11e5-877d-e53327a933d0": { - "id": "32392cb3-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 7500], "end": [13000, 7500], "width": 410, "height": 100 } - }, - "32392cb4-404f-11e5-877d-e53327a933d0": { - "id": "32392cb4-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [13000, 7500], "end": [13000, 11700], "width": 410, "height": 100 } - }, - "32392cb5-404f-11e5-877d-e53327a933d0": { - "id": "32392cb5-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [13000, 11000], "end": [13000, 17000], "width": 410, "height": 100 } - }, - "32392cb6-404f-11e5-877d-e53327a933d0": { - "id": "32392cb6-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [13000, 17000], "end": [13000, 17500], "width": 410, "height": 100 } - }, - "32392cb7-404f-11e5-877d-e53327a933d0": { - "id": "32392cb7-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [2000, 15000], "end": [10000, 15000], "width": 410, "height": 100 } - }, - "32392cb8-404f-11e5-877d-e53327a933d0": { - "id": "32392cb8-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 15000], "end": [10000, 20000], "width": 410, "height": 100 } - }, - "323953c0-404f-11e5-877d-e53327a933d0": { - "id": "323953c0-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 20000], "end": [2000, 20000], "width": 410, "height": 100 } - }, - "323953c1-404f-11e5-877d-e53327a933d0": { - "id": "323953c1-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [13000, 17500], "end": [10000, 17500], "width": 410, "height": 100 } - }, - "323953c2-404f-11e5-877d-e53327a933d0": { - "id": "323953c2-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [2000, 25000], "end": [10000, 25000], "width": 410, "height": 100 } - }, - "323953c3-404f-11e5-877d-e53327a933d0": { - "id": "323953c3-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 25000], "end": [10000, 25000], "width": 410, "height": 100 } - }, - "323953c4-404f-11e5-877d-e53327a933d0": { - "id": "323953c4-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [2000, 30000], "end": [10000, 30000], "width": 410, "height": 100 } - }, - "323953c5-404f-11e5-877d-e53327a933d0": { - "id": "323953c5-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [2000, 35000], "end": [10000, 35000], "width": 410, "height": 100 } - }, - "323953c6-404f-11e5-877d-e53327a933d0": { - "id": "323953c6-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [2000, 40000], "end": [10000, 40000], "width": 410, "height": 100 } - }, - "323953c7-404f-11e5-877d-e53327a933d0": { - "id": "323953c7-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 25000], "end": [10000, 30000], "width": 410, "height": 100 } - }, - "323953c8-404f-11e5-877d-e53327a933d0": { - "id": "323953c8-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 35000], "end": [10000, 40000], "width": 410, "height": 100 } - }, - "32397ad0-404f-11e5-877d-e53327a933d0": { - "id": "32397ad0-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [13000, 12500], "end": [16000, 12500], "width": 410, "height": 100 } - }, - "32397ad1-404f-11e5-877d-e53327a933d0": { - "id": "32397ad1-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [16000, 12500], "end": [16000, 13000], "width": 410, "height": 100 } - }, - "32397ad2-404f-11e5-877d-e53327a933d0": { - "id": "32397ad2-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [16000, 22500], "end": [18000, 22500], "width": 410, "height": 100 } - }, - "32397ad3-404f-11e5-877d-e53327a933d0": { - "id": "32397ad3-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [18000, 22500], "end": [20000, 22500], "width": 410, "height": 100 } - }, - "32397ad4-404f-11e5-877d-e53327a933d0": { - "id": "32397ad4-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 22500], "end": [20000, 22000], "width": 410, "height": 100 } - }, - "32397ad5-404f-11e5-877d-e53327a933d0": { - "id": "32397ad5-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 22500], "end": [20000, 23000], "width": 410, "height": 100 } - }, - "32397ad6-404f-11e5-877d-e53327a933d0": { - "id": "32397ad6-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 22000], "end": [20000, 11000], "width": 410, "height": 100 } - }, - "32397ad7-404f-11e5-877d-e53327a933d0": { - "id": "32397ad7-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 11000], "end": [25000, 11000], "width": 410, "height": 100 } - }, - "3239a1e0-404f-11e5-877d-e53327a933d0": { - "id": "3239a1e0-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 23000], "end": [20000, 34000], "width": 410, "height": 100 } - }, - "3239a1e1-404f-11e5-877d-e53327a933d0": { - "id": "3239a1e1-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 34000], "end": [25000, 34000], "width": 410, "height": 100 } - }, - "3239a1e2-404f-11e5-877d-e53327a933d0": { - "id": "3239a1e2-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [25000, 11000], "end": [25000, 11000], "width": 410, "height": 100 } - }, - "3239a1e3-404f-11e5-877d-e53327a933d0": { - "id": "3239a1e3-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [25000, 11000], "end": [25000, 5000], "width": 410, "height": 100 } - }, - "3239a1e4-404f-11e5-877d-e53327a933d0": { - "id": "3239a1e4-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [25000, 11000], "end": [25000, 17000], "width": 410, "height": 100 } - }, - "3239a1e5-404f-11e5-877d-e53327a933d0": { - "id": "3239a1e5-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [25000, 5000], "end": [45000, 5000], "width": 410, "height": 100 } - }, - "3239a1e6-404f-11e5-877d-e53327a933d0": { - "id": "3239a1e6-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [45000, 5000], "end": [45000, 17000], "width": 410, "height": 100 } - }, - "3239a1e7-404f-11e5-877d-e53327a933d0": { - "id": "3239a1e7-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [45000, 17000], "end": [25000, 17000], "width": 410, "height": 100 } - }, - "3239a1e8-404f-11e5-877d-e53327a933d0": { - "id": "3239a1e8-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [25000, 34000], "end": [25000, 40000], "width": 410, "height": 100 } - }, - "3239a1e9-404f-11e5-877d-e53327a933d0": { - "id": "3239a1e9-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [25000, 34000], "end": [25000, 28000], "width": 410, "height": 100 } - }, - "3239c8f0-404f-11e5-877d-e53327a933d0": { - "id": "3239c8f0-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [25000, 28000], "end": [45000, 28000], "width": 410, "height": 100 } - }, - "3239c8f1-404f-11e5-877d-e53327a933d0": { - "id": "3239c8f1-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [45000, 28000], "end": [45000, 40000], "width": 410, "height": 100 } - }, - "3239c8f2-404f-11e5-877d-e53327a933d0": { - "id": "3239c8f2-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [45000, 40000], "end": [25000, 40000], "width": 410, "height": 100 } - }, - "3239c8f3-404f-11e5-877d-e53327a933d0": { - "id": "3239c8f3-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 17000], "end": [30000, 10000], "width": 410, "height": 100 } - }, - "3239c8f4-404f-11e5-877d-e53327a933d0": { - "id": "3239c8f4-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 17000], "end": [40000, 10000], "width": 410, "height": 100 } - }, - "3239c8f5-404f-11e5-877d-e53327a933d0": { - "id": "3239c8f5-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [30000, 10000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "3239c8f6-404f-11e5-877d-e53327a933d0": { - "id": "3239c8f6-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [40000, 10000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "3239c8f7-404f-11e5-877d-e53327a933d0": { - "id": "3239c8f7-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 28000], "end": [30000, 35000], "width": 410, "height": 100 } - }, - "3239f000-404f-11e5-877d-e53327a933d0": { - "id": "3239f000-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 28000], "end": [40000, 35000], "width": 410, "height": 100 } - }, - "3239f001-404f-11e5-877d-e53327a933d0": { - "id": "3239f001-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [30000, 35000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "3239f002-404f-11e5-877d-e53327a933d0": { - "id": "3239f002-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [40000, 35000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "3239f003-404f-11e5-877d-e53327a933d0": { - "id": "3239f003-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 27500], "end": [13000, 27500], "width": 410, "height": 100 } - }, - "3239f004-404f-11e5-877d-e53327a933d0": { - "id": "3239f004-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [10000, 37500], "end": [13000, 37500], "width": 410, "height": 100 } - }, - "3239f005-404f-11e5-877d-e53327a933d0": { - "id": "3239f005-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [13000, 37500], "end": [13000, 37000], "width": 410, "height": 100 } - }, - "3239f006-404f-11e5-877d-e53327a933d0": { - "id": "3239f006-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [13000, 27500], "end": [13000, 28000], "width": 410, "height": 100 } - }, - "3239f007-404f-11e5-877d-e53327a933d0": { - "id": "3239f007-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [13000, 28000], "end": [13000, 37000], "width": 410, "height": 100 } - }, - "3239f008-404f-11e5-877d-e53327a933d0": { - "id": "3239f008-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [13000, 32500], "end": [16000, 32500], "width": 410, "height": 100 } - }, - "323a1710-404f-11e5-877d-e53327a933d0": { - "id": "323a1710-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [16000, 32500], "end": [16000, 31000], "width": 410, "height": 100 } - }, - "323a1711-404f-11e5-877d-e53327a933d0": { - "id": "323a1711-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [16000, 31000], "end": [16000, 22000], "width": 410, "height": 100 } - }, - "323a1712-404f-11e5-877d-e53327a933d0": { - "id": "323a1712-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [16000, 22000], "end": [16000, 13000], "width": 410, "height": 100 } - }, - "323a1713-404f-11e5-877d-e53327a933d0": { - "id": "323a1713-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [20000, 22500], "end": [29000, 22500], "width": 410, "height": 100 } - }, - "323a1714-404f-11e5-877d-e53327a933d0": { - "id": "323a1714-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 22600], "end": [30000, 23000], "width": 410, "height": 100 } - }, - "323a1715-404f-11e5-877d-e53327a933d0": { - "id": "323a1715-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [40000, 17000], "end": [40000, 28000], "width": 410, "height": 100 } - }, - "323a1716-404f-11e5-877d-e53327a933d0": { - "id": "323a1716-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 22500], "end": [40000, 22500], "width": 410, "height": 100 } - }, - "323a1717-404f-11e5-877d-e53327a933d0": { - "id": "323a1717-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [30000, 17000], "end": [30000, 28000], "width": 410, "height": 100 } - }, - "323a1718-404f-11e5-877d-e53327a933d0": { - "id": "323a1718-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [29000, 22500], "end": [30000, 22500], "width": 410, "height": 100 } - }, - "323a3e20-404f-11e5-877d-e53327a933d0": { - "id": "323a3e20-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [35000, 17000], "end": [35000, 28000], "width": 410, "height": 100 } - } - } - }, - { - "name": "control", - "color": "red", - "params": { "z_offset": 500, "flip": true }, - "features": { - "323a3e21-404f-11e5-877d-e53327a933d0": { - "id": "323a3e21-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 9000], "end": [9000, 11000], "width": 50, "height": 100 } - }, - "323a3e22-404f-11e5-877d-e53327a933d0": { - "id": "323a3e22-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 19000], "end": [9000, 21000], "width": 50, "height": 100 } - }, - "323a3e23-404f-11e5-877d-e53327a933d0": { - "id": "323a3e23-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 29000], "end": [9000, 31000], "width": 50, "height": 100 } - }, - "323a3e24-404f-11e5-877d-e53327a933d0": { - "id": "323a3e24-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [11000, 26600], "end": [11000, 28500], "width": 50, "height": 100 } - }, - "323a3e25-404f-11e5-877d-e53327a933d0": { - "id": "323a3e25-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 18500], "end": [12000, 16500], "width": 50, "height": 100 } - }, - "323a3e26-404f-11e5-877d-e53327a933d0": { - "id": "323a3e26-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [24000, 10000], "end": [24000, 12000], "width": 50, "height": 100 } - }, - "323a3e27-404f-11e5-877d-e53327a933d0": { - "id": "323a3e27-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 14000], "end": [41000, 14000], "width": 50, "height": 100 } - }, - "323a6530-404f-11e5-877d-e53327a933d0": { - "id": "323a6530-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [29000, 12000], "end": [31000, 12000], "width": 50, "height": 100 } - }, - "323a6531-404f-11e5-877d-e53327a933d0": { - "id": "323a6531-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 12000], "end": [41000, 12000], "width": 50, "height": 100 } - }, - "323a6532-404f-11e5-877d-e53327a933d0": { - "id": "323a6532-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 13000], "end": [41000, 13000], "width": 50, "height": 100 } - }, - "323a6533-404f-11e5-877d-e53327a933d0": { - "id": "323a6533-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 15000], "end": [41000, 15000], "width": 50, "height": 100 } - }, - "323a6534-404f-11e5-877d-e53327a933d0": { - "id": "323a6534-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 19000], "end": [41000, 19000], "width": 50, "height": 100 } - }, - "323a6535-404f-11e5-877d-e53327a933d0": { - "id": "323a6535-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 20000], "end": [41000, 20000], "width": 50, "height": 100 } - }, - "323a6536-404f-11e5-877d-e53327a933d0": { - "id": "323a6536-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [34000, 19000], "end": [36000, 19000], "width": 50, "height": 100 } - }, - "323a6537-404f-11e5-877d-e53327a933d0": { - "id": "323a6537-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [34000, 21000], "end": [36000, 21000], "width": 50, "height": 100 } - }, - "323a6538-404f-11e5-877d-e53327a933d0": { - "id": "323a6538-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 12000], "end": [46000, 12000], "width": 50, "height": 100 } - }, - "323a8c40-404f-11e5-877d-e53327a933d0": { - "id": "323a8c40-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 13000], "end": [46000, 13000], "width": 50, "height": 100 } - }, - "323a8c41-404f-11e5-877d-e53327a933d0": { - "id": "323a8c41-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 14000], "end": [46000, 14000], "width": 50, "height": 100 } - }, - "323a8c42-404f-11e5-877d-e53327a933d0": { - "id": "323a8c42-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 15000], "end": [46000, 15000], "width": 50, "height": 100 } - }, - "323a8c43-404f-11e5-877d-e53327a933d0": { - "id": "323a8c43-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 16000], "end": [46000, 16000], "width": 50, "height": 100 } - }, - "323a8c44-404f-11e5-877d-e53327a933d0": { - "id": "323a8c44-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 22000], "end": [41000, 22000], "width": 50, "height": 100 } - }, - "323a8c45-404f-11e5-877d-e53327a933d0": { - "id": "323a8c45-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 33000], "end": [39000, 33000], "width": 50, "height": 100 } - }, - "323a8c46-404f-11e5-877d-e53327a933d0": { - "id": "323a8c46-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 32000], "end": [39000, 32000], "width": 50, "height": 100 } - }, - "323a8c47-404f-11e5-877d-e53327a933d0": { - "id": "323a8c47-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 31000], "end": [39000, 31000], "width": 50, "height": 100 } - }, - "323ab350-404f-11e5-877d-e53327a933d0": { - "id": "323ab350-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 30000], "end": [39000, 30000], "width": 50, "height": 100 } - }, - "323ab351-404f-11e5-877d-e53327a933d0": { - "id": "323ab351-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [29000, 33000], "end": [31000, 33000], "width": 50, "height": 100 } - }, - "323ab352-404f-11e5-877d-e53327a933d0": { - "id": "323ab352-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 30000], "end": [46000, 30000], "width": 50, "height": 100 } - }, - "323ab353-404f-11e5-877d-e53327a933d0": { - "id": "323ab353-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 31000], "end": [46000, 31000], "width": 50, "height": 100 } - }, - "323ab354-404f-11e5-877d-e53327a933d0": { - "id": "323ab354-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 32000], "end": [46000, 32000], "width": 50, "height": 100 } - }, - "323ab355-404f-11e5-877d-e53327a933d0": { - "id": "323ab355-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 33000], "end": [46000, 33000], "width": 50, "height": 100 } - }, - "323ab356-404f-11e5-877d-e53327a933d0": { - "id": "323ab356-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 23000], "end": [41000, 23000], "width": 50, "height": 100 } - }, - "323ab357-404f-11e5-877d-e53327a933d0": { - "id": "323ab357-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 25000], "end": [41000, 25000], "width": 50, "height": 100 } - }, - "323ab358-404f-11e5-877d-e53327a933d0": { - "id": "323ab358-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 26000], "end": [41000, 26000], "width": 50, "height": 100 } - }, - "323ada60-404f-11e5-877d-e53327a933d0": { - "id": "323ada60-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [34000, 26000], "end": [36000, 26000], "width": 50, "height": 100 } - }, - "323ada61-404f-11e5-877d-e53327a933d0": { - "id": "323ada61-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [8000, 14000], "end": [8000, 16000], "width": 50, "height": 100 } - }, - "323ada62-404f-11e5-877d-e53327a933d0": { - "id": "323ada62-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [8000, 24000], "end": [8000, 26000], "width": 50, "height": 100 } - }, - "323ada63-404f-11e5-877d-e53327a933d0": { - "id": "323ada63-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [8000, 34000], "end": [8000, 36000], "width": 50, "height": 100 } - }, - "323ada64-404f-11e5-877d-e53327a933d0": { - "id": "323ada64-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [8000, 9000], "end": [8000, 14000], "width": 250, "height": 100 } - }, - "323ada65-404f-11e5-877d-e53327a933d0": { - "id": "323ada65-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [8000, 16000], "end": [8000, 24000], "width": 250, "height": 100 } - }, - "323ada66-404f-11e5-877d-e53327a933d0": { - "id": "323ada66-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [8000, 26000], "end": [8000, 34000], "width": 250, "height": 100 } - }, - "323ada67-404f-11e5-877d-e53327a933d0": { - "id": "323ada67-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [8000, 36000], "end": [8000, 43000], "width": 250, "height": 100 } - }, - "323b0170-404f-11e5-877d-e53327a933d0": { - "id": "323b0170-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [11000, 28500], "end": [11000, 29100], "width": 250, "height": 100 } - }, - "323b0171-404f-11e5-877d-e53327a933d0": { - "id": "323b0171-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [11000, 29000], "end": [11000, 37000], "width": 250, "height": 100 } - }, - "323b0172-404f-11e5-877d-e53327a933d0": { - "id": "323b0172-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [11000, 26600], "end": [11000, 25900], "width": 250, "height": 100 } - }, - "323b0173-404f-11e5-877d-e53327a933d0": { - "id": "323b0173-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [11000, 26000], "end": [11000, 17000], "width": 250, "height": 100 } - }, - "323b0174-404f-11e5-877d-e53327a933d0": { - "id": "323b0174-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 9000], "end": [9000, 2000], "width": 250, "height": 100 } - }, - "323b0175-404f-11e5-877d-e53327a933d0": { - "id": "323b0175-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 11000], "end": [9000, 19000], "width": 250, "height": 100 } - }, - "323b2880-404f-11e5-877d-e53327a933d0": { - "id": "323b2880-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 21000], "end": [9000, 29000], "width": 250, "height": 100 } - }, - "323b2881-404f-11e5-877d-e53327a933d0": { - "id": "323b2881-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [9000, 31000], "end": [9000, 36000], "width": 250, "height": 100 } - }, - "323b2882-404f-11e5-877d-e53327a933d0": { - "id": "323b2882-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [11000, 17000], "end": [11000, 16500], "width": 250, "height": 100 } - }, - "323b2883-404f-11e5-877d-e53327a933d0": { - "id": "323b2883-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 16500], "end": [12000, 16000], "width": 250, "height": 100 } - }, - "323b2884-404f-11e5-877d-e53327a933d0": { - "id": "323b2884-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 16000], "end": [12000, 10000], "width": 250, "height": 100 } - }, - "323b4f90-404f-11e5-877d-e53327a933d0": { - "id": "323b4f90-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 18500], "end": [12000, 20000], "width": 250, "height": 100 } - }, - "323b4f91-404f-11e5-877d-e53327a933d0": { - "id": "323b4f91-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 20000], "end": [12000, 28000], "width": 250, "height": 100 } - }, - "323b4f92-404f-11e5-877d-e53327a933d0": { - "id": "323b4f92-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 28000], "end": [12000, 28500], "width": 250, "height": 100 } - }, - "323b4f93-404f-11e5-877d-e53327a933d0": { - "id": "323b4f93-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [14000, 31500], "end": [14000, 33500], "width": 250, "height": 100 } - }, - "323b4f94-404f-11e5-877d-e53327a933d0": { - "id": "323b4f94-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [14000, 13500], "end": [14000, 11500], "width": 250, "height": 100 } - }, - "323b4f95-404f-11e5-877d-e53327a933d0": { - "id": "323b4f95-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [14000, 11500], "end": [14000, 11000], "width": 250, "height": 100 } - }, - "323b4f96-404f-11e5-877d-e53327a933d0": { - "id": "323b4f96-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [9000, 2000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323b4f97-404f-11e5-877d-e53327a933d0": { - "id": "323b4f97-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [23000, 12000], "end": [23000, 4000], "width": 250, "height": 100 } - }, - "323b4f98-404f-11e5-877d-e53327a933d0": { - "id": "323b4f98-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [23000, 4000], "end": [23000, 2000], "width": 250, "height": 100 } - }, - "323b4f99-404f-11e5-877d-e53327a933d0": { - "id": "323b4f99-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [24000, 23500], "end": [24000, 21000], "width": 250, "height": 100 } - }, - "323b76a0-404f-11e5-877d-e53327a933d0": { - "id": "323b76a0-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [24000, 12000], "end": [24000, 21000], "width": 250, "height": 100 } - }, - "323b76a1-404f-11e5-877d-e53327a933d0": { - "id": "323b76a1-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 10000], "end": [12000, 3000], "width": 250, "height": 100 } - }, - "323b76a2-404f-11e5-877d-e53327a933d0": { - "id": "323b76a2-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [12000, 3000], "end": [14000, 3000], "width": 250, "height": 100 } - }, - "323b76a3-404f-11e5-877d-e53327a933d0": { - "id": "323b76a3-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [14000, 3000], "end": [14000, 2000], "width": 250, "height": 100 } - }, - "323b76a4-404f-11e5-877d-e53327a933d0": { - "id": "323b76a4-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [14000, 11000], "end": [14000, 5000], "width": 250, "height": 100 } - }, - "323b9db0-404f-11e5-877d-e53327a933d0": { - "id": "323b9db0-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [14000, 5000], "end": [17000, 5000], "width": 250, "height": 100 } - }, - "323b9db1-404f-11e5-877d-e53327a933d0": { - "id": "323b9db1-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [17000, 5000], "end": [17000, 2000], "width": 250, "height": 100 } - }, - "323b9db2-404f-11e5-877d-e53327a933d0": { - "id": "323b9db2-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [11000, 37000], "end": [11000, 43000], "width": 250, "height": 100 } - }, - "323b9db3-404f-11e5-877d-e53327a933d0": { - "id": "323b9db3-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [11000, 43000], "end": [13000, 43000], "width": 250, "height": 100 } - }, - "323b9db4-404f-11e5-877d-e53327a933d0": { - "id": "323b9db4-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [8000, 43000], "end": [8000, 44000], "width": 250, "height": 100 } - }, - "323b9db5-404f-11e5-877d-e53327a933d0": { - "id": "323b9db5-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [13000, 43000], "end": [13000, 44000], "width": 250, "height": 100 } - }, - "323b9db6-404f-11e5-877d-e53327a933d0": { - "id": "323b9db6-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [14000, 33500], "end": [14000, 34000], "width": 250, "height": 100 } - }, - "323b9db7-404f-11e5-877d-e53327a933d0": { - "id": "323b9db7-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [14000, 34000], "end": [14000, 41000], "width": 250, "height": 100 } - }, - "323b9db8-404f-11e5-877d-e53327a933d0": { - "id": "323b9db8-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [14000, 41000], "end": [16000, 41000], "width": 250, "height": 100 } - }, - "323b9db9-404f-11e5-877d-e53327a933d0": { - "id": "323b9db9-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [16000, 41000], "end": [16000, 44000], "width": 250, "height": 100 } - }, - "323bc4c0-404f-11e5-877d-e53327a933d0": { - "id": "323bc4c0-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [14000, 2000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323bc4c1-404f-11e5-877d-e53327a933d0": { - "id": "323bc4c1-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [17000, 2000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323bc4c2-404f-11e5-877d-e53327a933d0": { - "id": "323bc4c2-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [16000, 44000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323bc4c3-404f-11e5-877d-e53327a933d0": { - "id": "323bc4c3-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [13000, 44000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323bc4c4-404f-11e5-877d-e53327a933d0": { - "id": "323bc4c4-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [8000, 44000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323bc4c5-404f-11e5-877d-e53327a933d0": { - "id": "323bc4c5-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [23000, 2000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323bc4c6-404f-11e5-877d-e53327a933d0": { - "id": "323bc4c6-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [24000, 10000], "end": [24000, 4000], "width": 250, "height": 100 } - }, - "323bc4c7-404f-11e5-877d-e53327a933d0": { - "id": "323bc4c7-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [24000, 4000], "end": [26000, 4000], "width": 250, "height": 100 } - }, - "323bc4c8-404f-11e5-877d-e53327a933d0": { - "id": "323bc4c8-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [26000, 4000], "end": [26000, 2000], "width": 250, "height": 100 } - }, - "323bebd0-404f-11e5-877d-e53327a933d0": { - "id": "323bebd0-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [23000, 33000], "end": [23000, 44000], "width": 250, "height": 100 } - }, - "323bebd1-404f-11e5-877d-e53327a933d0": { - "id": "323bebd1-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [23000, 44000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323bebd2-404f-11e5-877d-e53327a933d0": { - "id": "323bebd2-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [26000, 2000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323bebd3-404f-11e5-877d-e53327a933d0": { - "id": "323bebd3-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [28000, 18000], "end": [28000, 12000], "width": 250, "height": 100 } - }, - "323bebd4-404f-11e5-877d-e53327a933d0": { - "id": "323bebd4-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [28000, 12000], "end": [29000, 12000], "width": 250, "height": 100 } - }, - "323bebd5-404f-11e5-877d-e53327a933d0": { - "id": "323bebd5-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [31000, 12000], "end": [39000, 12000], "width": 250, "height": 100 } - }, - "323bebd6-404f-11e5-877d-e53327a933d0": { - "id": "323bebd6-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [29000, 13000], "end": [39000, 13000], "width": 250, "height": 100 } - }, - "323bebd7-404f-11e5-877d-e53327a933d0": { - "id": "323bebd7-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [33000, 18000], "end": [33000, 16000], "width": 250, "height": 100 } - }, - "323bebd8-404f-11e5-877d-e53327a933d0": { - "id": "323bebd8-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [37000, 18000], "end": [37000, 15000], "width": 250, "height": 100 } - }, - "323bebd9-404f-11e5-877d-e53327a933d0": { - "id": "323bebd9-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [33000, 16000], "end": [33000, 14000], "width": 250, "height": 100 } - }, - "323c12e0-404f-11e5-877d-e53327a933d0": { - "id": "323c12e0-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [33000, 14000], "end": [39000, 14000], "width": 250, "height": 100 } - }, - "323c12e1-404f-11e5-877d-e53327a933d0": { - "id": "323c12e1-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [37000, 15000], "end": [39000, 15000], "width": 250, "height": 100 } - }, - "323c12e2-404f-11e5-877d-e53327a933d0": { - "id": "323c12e2-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 16000], "end": [41000, 16000], "width": 250, "height": 100 } - }, - "323c12e3-404f-11e5-877d-e53327a933d0": { - "id": "323c12e3-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [29000, 19000], "end": [34000, 19000], "width": 250, "height": 100 } - }, - "323c12e4-404f-11e5-877d-e53327a933d0": { - "id": "323c12e4-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 19000], "end": [39000, 19000], "width": 250, "height": 100 } - }, - "323c12e5-404f-11e5-877d-e53327a933d0": { - "id": "323c12e5-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [34000, 20000], "end": [39000, 20000], "width": 250, "height": 100 } - }, - "323c12e6-404f-11e5-877d-e53327a933d0": { - "id": "323c12e6-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 19000], "end": [46000, 19000], "width": 250, "height": 100 } - }, - "323c12e7-404f-11e5-877d-e53327a933d0": { - "id": "323c12e7-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 20000], "end": [46000, 20000], "width": 250, "height": 100 } - }, - "323c12e8-404f-11e5-877d-e53327a933d0": { - "id": "323c12e8-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 22000], "end": [46000, 22000], "width": 250, "height": 100 } - }, - "323c12e9-404f-11e5-877d-e53327a933d0": { - "id": "323c12e9-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 23000], "end": [46000, 23000], "width": 250, "height": 100 } - }, - "323c39f0-404f-11e5-877d-e53327a933d0": { - "id": "323c39f0-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 25000], "end": [46000, 25000], "width": 250, "height": 100 } - }, - "323c39f1-404f-11e5-877d-e53327a933d0": { - "id": "323c39f1-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 26000], "end": [46000, 26000], "width": 250, "height": 100 } - }, - "323c39f2-404f-11e5-877d-e53327a933d0": { - "id": "323c39f2-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 30000], "end": [44000, 30000], "width": 250, "height": 100 } - }, - "323c39f3-404f-11e5-877d-e53327a933d0": { - "id": "323c39f3-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 31000], "end": [44000, 31000], "width": 250, "height": 100 } - }, - "323c39f4-404f-11e5-877d-e53327a933d0": { - "id": "323c39f4-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 32000], "end": [44000, 32000], "width": 250, "height": 100 } - }, - "323c39f5-404f-11e5-877d-e53327a933d0": { - "id": "323c39f5-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 33000], "end": [44000, 33000], "width": 250, "height": 100 } - }, - "323c39f6-404f-11e5-877d-e53327a933d0": { - "id": "323c39f6-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [31000, 33000], "end": [39000, 33000], "width": 250, "height": 100 } - }, - "323c39f7-404f-11e5-877d-e53327a933d0": { - "id": "323c39f7-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [29000, 32000], "end": [39000, 32000], "width": 250, "height": 100 } - }, - "323c39f8-404f-11e5-877d-e53327a933d0": { - "id": "323c39f8-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [33000, 27000], "end": [33000, 31000], "width": 250, "height": 100 } - }, - "323c6100-404f-11e5-877d-e53327a933d0": { - "id": "323c6100-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [33000, 31000], "end": [39000, 31000], "width": 250, "height": 100 } - }, - "323c6101-404f-11e5-877d-e53327a933d0": { - "id": "323c6101-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 27000], "end": [36000, 30000], "width": 250, "height": 100 } - }, - "323c6102-404f-11e5-877d-e53327a933d0": { - "id": "323c6102-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 30000], "end": [36000, 30000], "width": 250, "height": 100 } - }, - "323c6103-404f-11e5-877d-e53327a933d0": { - "id": "323c6103-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 30000], "end": [39000, 30000], "width": 250, "height": 100 } - }, - "323c6104-404f-11e5-877d-e53327a933d0": { - "id": "323c6104-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 26000], "end": [39000, 26000], "width": 250, "height": 100 } - }, - "323c6105-404f-11e5-877d-e53327a933d0": { - "id": "323c6105-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 25000], "end": [34000, 25000], "width": 250, "height": 100 } - }, - "323c6106-404f-11e5-877d-e53327a933d0": { - "id": "323c6106-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 22000], "end": [38000, 22000], "width": 250, "height": 100 } - }, - "323c6107-404f-11e5-877d-e53327a933d0": { - "id": "323c6107-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [34000, 21000], "end": [33000, 21000], "width": 250, "height": 100 } - }, - "323c6108-404f-11e5-877d-e53327a933d0": { - "id": "323c6108-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [33000, 21000], "end": [33000, 23000], "width": 250, "height": 100 } - }, - "323c6109-404f-11e5-877d-e53327a933d0": { - "id": "323c6109-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [33000, 23100], "end": [33000, 23500], "width": 250, "height": 100 } - }, - "323c8810-404f-11e5-877d-e53327a933d0": { - "id": "323c8810-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 22000], "end": [38000, 21000], "width": 250, "height": 100 } - }, - "323c8811-404f-11e5-877d-e53327a933d0": { - "id": "323c8811-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 21000], "end": [36000, 21000], "width": 250, "height": 100 } - }, - "323c8812-404f-11e5-877d-e53327a933d0": { - "id": "323c8812-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 22000], "end": [36000, 24000], "width": 250, "height": 100 } - }, - "323c8813-404f-11e5-877d-e53327a933d0": { - "id": "323c8813-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [36000, 24000], "end": [38000, 24000], "width": 250, "height": 100 } - }, - "323c8814-404f-11e5-877d-e53327a933d0": { - "id": "323c8814-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 24000], "end": [38000, 23000], "width": 250, "height": 100 } - }, - "323c8815-404f-11e5-877d-e53327a933d0": { - "id": "323c8815-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [38000, 23000], "end": [39000, 23000], "width": 250, "height": 100 } - }, - "323c8816-404f-11e5-877d-e53327a933d0": { - "id": "323c8816-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [29000, 26000], "end": [34000, 26000], "width": 250, "height": 100 } - }, - "323c8817-404f-11e5-877d-e53327a933d0": { - "id": "323c8817-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [29000, 33000], "end": [28000, 33000], "width": 250, "height": 100 } - }, - "323c8818-404f-11e5-877d-e53327a933d0": { - "id": "323c8818-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [28000, 33000], "end": [28000, 27000], "width": 250, "height": 100 } - }, - "323caf20-404f-11e5-877d-e53327a933d0": { - "id": "323caf20-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 12000], "end": [46000, 2000], "width": 250, "height": 100 } - }, - "323caf21-404f-11e5-877d-e53327a933d0": { - "id": "323caf21-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 13000], "end": [49000, 13000], "width": 250, "height": 100 } - }, - "323caf22-404f-11e5-877d-e53327a933d0": { - "id": "323caf22-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [49000, 13000], "end": [49000, 2000], "width": 250, "height": 100 } - }, - "323caf23-404f-11e5-877d-e53327a933d0": { - "id": "323caf23-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 14000], "end": [52000, 14000], "width": 250, "height": 100 } - }, - "323caf24-404f-11e5-877d-e53327a933d0": { - "id": "323caf24-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [52000, 14000], "end": [52000, 2000], "width": 250, "height": 100 } - }, - "323cd630-404f-11e5-877d-e53327a933d0": { - "id": "323cd630-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 15000], "end": [55000, 15000], "width": 250, "height": 100 } - }, - "323cfd40-404f-11e5-877d-e53327a933d0": { - "id": "323cfd40-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [55000, 15000], "end": [55000, 2000], "width": 250, "height": 100 } - }, - "323cfd41-404f-11e5-877d-e53327a933d0": { - "id": "323cfd41-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 16000], "end": [58000, 16000], "width": 250, "height": 100 } - }, - "323cfd42-404f-11e5-877d-e53327a933d0": { - "id": "323cfd42-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [58000, 16000], "end": [58000, 2000], "width": 250, "height": 100 } - }, - "323cfd43-404f-11e5-877d-e53327a933d0": { - "id": "323cfd43-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 33000], "end": [46000, 44000], "width": 250, "height": 100 } - }, - "323cfd44-404f-11e5-877d-e53327a933d0": { - "id": "323cfd44-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 32000], "end": [49000, 32000], "width": 250, "height": 100 } - }, - "323cfd45-404f-11e5-877d-e53327a933d0": { - "id": "323cfd45-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [49000, 32000], "end": [49000, 44000], "width": 250, "height": 100 } - }, - "323cfd46-404f-11e5-877d-e53327a933d0": { - "id": "323cfd46-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 31000], "end": [52000, 31000], "width": 250, "height": 100 } - }, - "323cfd47-404f-11e5-877d-e53327a933d0": { - "id": "323cfd47-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [52000, 31000], "end": [52000, 44000], "width": 250, "height": 100 } - }, - "323cfd48-404f-11e5-877d-e53327a933d0": { - "id": "323cfd48-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 30000], "end": [55000, 30000], "width": 250, "height": 100 } - }, - "323cfd49-404f-11e5-877d-e53327a933d0": { - "id": "323cfd49-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [55000, 30000], "end": [55000, 44000], "width": 250, "height": 100 } - }, - "323d2450-404f-11e5-877d-e53327a933d0": { - "id": "323d2450-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 19000], "end": [61000, 19000], "width": 250, "height": 100 } - }, - "323d2451-404f-11e5-877d-e53327a933d0": { - "id": "323d2451-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 20000], "end": [62000, 20000], "width": 250, "height": 100 } - }, - "323d2452-404f-11e5-877d-e53327a933d0": { - "id": "323d2452-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 12000], "end": [41000, 12000], "width": 250, "height": 100 } - }, - "323d2453-404f-11e5-877d-e53327a933d0": { - "id": "323d2453-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 13000], "end": [41000, 13000], "width": 250, "height": 100 } - }, - "323d2454-404f-11e5-877d-e53327a933d0": { - "id": "323d2454-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [44000, 14000], "end": [41000, 14000], "width": 250, "height": 100 } - }, - "323d2455-404f-11e5-877d-e53327a933d0": { - "id": "323d2455-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 15000], "end": [44000, 15000], "width": 250, "height": 100 } - }, - "323d2456-404f-11e5-877d-e53327a933d0": { - "id": "323d2456-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 16000], "end": [44000, 16000], "width": 250, "height": 100 } - }, - "323d2457-404f-11e5-877d-e53327a933d0": { - "id": "323d2457-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 16500], "end": [42000, 17600], "width": 250, "height": 100 } - }, - "323d4b60-404f-11e5-877d-e53327a933d0": { - "id": "323d4b60-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 17600], "end": [42000, 18000], "width": 250, "height": 100 } - }, - "323d4b61-404f-11e5-877d-e53327a933d0": { - "id": "323d4b61-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 18000], "end": [60000, 18000], "width": 250, "height": 100 } - }, - "323d4b62-404f-11e5-877d-e53327a933d0": { - "id": "323d4b62-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60000, 18000], "end": [60000, 5000], "width": 250, "height": 100 } - }, - "323d4b63-404f-11e5-877d-e53327a933d0": { - "id": "323d4b63-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60000, 5000], "end": [70000, 5000], "width": 250, "height": 100 } - }, - "323d4b64-404f-11e5-877d-e53327a933d0": { - "id": "323d4b64-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [61000, 19000], "end": [61000, 8000], "width": 250, "height": 100 } - }, - "323d4b65-404f-11e5-877d-e53327a933d0": { - "id": "323d4b65-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [61000, 8000], "end": [70000, 8000], "width": 250, "height": 100 } - }, - "323d4b66-404f-11e5-877d-e53327a933d0": { - "id": "323d4b66-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62000, 20000], "end": [62000, 11000], "width": 250, "height": 100 } - }, - "323d4b67-404f-11e5-877d-e53327a933d0": { - "id": "323d4b67-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62000, 11000], "end": [70000, 11000], "width": 250, "height": 100 } - }, - "323d4b68-404f-11e5-877d-e53327a933d0": { - "id": "323d4b68-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 22000], "end": [63000, 22000], "width": 250, "height": 100 } - }, - "323d7270-404f-11e5-877d-e53327a933d0": { - "id": "323d7270-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [63000, 22000], "end": [63000, 14000], "width": 250, "height": 100 } - }, - "323d7271-404f-11e5-877d-e53327a933d0": { - "id": "323d7271-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [63000, 14000], "end": [70000, 14000], "width": 250, "height": 100 } - }, - "323d7272-404f-11e5-877d-e53327a933d0": { - "id": "323d7272-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 23000], "end": [63000, 23000], "width": 250, "height": 100 } - }, - "323d7273-404f-11e5-877d-e53327a933d0": { - "id": "323d7273-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 27500], "end": [42000, 27100], "width": 250, "height": 100 } - }, - "323d7274-404f-11e5-877d-e53327a933d0": { - "id": "323d7274-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 27100], "end": [42000, 27000], "width": 250, "height": 100 } - }, - "323d7275-404f-11e5-877d-e53327a933d0": { - "id": "323d7275-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 25000], "end": [60000, 25000], "width": 250, "height": 100 } - }, - "323d7276-404f-11e5-877d-e53327a933d0": { - "id": "323d7276-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 27000], "end": [60000, 27000], "width": 250, "height": 100 } - }, - "323d9980-404f-11e5-877d-e53327a933d0": { - "id": "323d9980-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [39000, 29000], "end": [41000, 29000], "width": 250, "height": 100 } - }, - "323d9981-404f-11e5-877d-e53327a933d0": { - "id": "323d9981-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [41000, 29000], "end": [46000, 29000], "width": 250, "height": 100 } - }, - "323d9982-404f-11e5-877d-e53327a933d0": { - "id": "323d9982-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [42000, 27500], "end": [42000, 28500], "width": 250, "height": 100 } - }, - "323d9983-404f-11e5-877d-e53327a933d0": { - "id": "323d9983-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 26000], "end": [60000, 26000], "width": 250, "height": 100 } - }, - "323d9984-404f-11e5-877d-e53327a933d0": { - "id": "323d9984-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [46000, 29000], "end": [58000, 29000], "width": 250, "height": 100 } - }, - "323d9985-404f-11e5-877d-e53327a933d0": { - "id": "323d9985-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [58000, 29000], "end": [58000, 44000], "width": 250, "height": 100 } - }, - "323d9986-404f-11e5-877d-e53327a933d0": { - "id": "323d9986-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60000, 27000], "end": [60000, 41000], "width": 250, "height": 100 } - }, - "323d9987-404f-11e5-877d-e53327a933d0": { - "id": "323d9987-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60000, 41000], "end": [70000, 41000], "width": 250, "height": 100 } - }, - "323dc090-404f-11e5-877d-e53327a933d0": { - "id": "323dc090-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60000, 26000], "end": [61000, 26000], "width": 250, "height": 100 } - }, - "323dc091-404f-11e5-877d-e53327a933d0": { - "id": "323dc091-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [61000, 26000], "end": [61000, 38000], "width": 250, "height": 100 } - }, - "323dc092-404f-11e5-877d-e53327a933d0": { - "id": "323dc092-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [61000, 38000], "end": [70000, 38000], "width": 250, "height": 100 } - }, - "323dc093-404f-11e5-877d-e53327a933d0": { - "id": "323dc093-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [60000, 25000], "end": [62000, 25000], "width": 250, "height": 100 } - }, - "323dc094-404f-11e5-877d-e53327a933d0": { - "id": "323dc094-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62000, 25000], "end": [62000, 35000], "width": 250, "height": 100 } - }, - "323dc095-404f-11e5-877d-e53327a933d0": { - "id": "323dc095-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [62000, 35000], "end": [70000, 35000], "width": 250, "height": 100 } - }, - "323de7a0-404f-11e5-877d-e53327a933d0": { - "id": "323de7a0-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [63000, 23000], "end": [63000, 32000], "width": 250, "height": 100 } - }, - "323de7a1-404f-11e5-877d-e53327a933d0": { - "id": "323de7a1-404f-11e5-877d-e53327a933d0", - "name": "New Channel", - "type": "Channel", - "params": { "start": [63000, 32000], "end": [70000, 32000], "width": 250, "height": 100 } - }, - "323de7a2-404f-11e5-877d-e53327a933d0": { - "id": "323de7a2-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [46000, 2000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323de7a3-404f-11e5-877d-e53327a933d0": { - "id": "323de7a3-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [49000, 2000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323de7a4-404f-11e5-877d-e53327a933d0": { - "id": "323de7a4-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [52000, 2000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323de7a5-404f-11e5-877d-e53327a933d0": { - "id": "323de7a5-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [55000, 2000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e0eb0-404f-11e5-877d-e53327a933d0": { - "id": "323e0eb0-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [58000, 2000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e0eb1-404f-11e5-877d-e53327a933d0": { - "id": "323e0eb1-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [70000, 5000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e0eb2-404f-11e5-877d-e53327a933d0": { - "id": "323e0eb2-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [70000, 8000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e0eb3-404f-11e5-877d-e53327a933d0": { - "id": "323e0eb3-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [70000, 11000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e0eb4-404f-11e5-877d-e53327a933d0": { - "id": "323e0eb4-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [70000, 14000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e0eb5-404f-11e5-877d-e53327a933d0": { - "id": "323e0eb5-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [70000, 32000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e0eb6-404f-11e5-877d-e53327a933d0": { - "id": "323e0eb6-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [70000, 35000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e0eb7-404f-11e5-877d-e53327a933d0": { - "id": "323e0eb7-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [70000, 38000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e35c0-404f-11e5-877d-e53327a933d0": { - "id": "323e35c0-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [70000, 41000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e35c1-404f-11e5-877d-e53327a933d0": { - "id": "323e35c1-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [58000, 44000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e35c2-404f-11e5-877d-e53327a933d0": { - "id": "323e35c2-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [55000, 44000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e35c3-404f-11e5-877d-e53327a933d0": { - "id": "323e35c3-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [52000, 44000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e35c4-404f-11e5-877d-e53327a933d0": { - "id": "323e35c4-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [49000, 44000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e35c5-404f-11e5-877d-e53327a933d0": { - "id": "323e35c5-404f-11e5-877d-e53327a933d0", - "name": "New Port", - "type": "Port", - "params": { "position": [46000, 44000], "radius1": 700, "radius2": 700, "height": 100 } - }, - "323e35c6-404f-11e5-877d-e53327a933d0": { - "id": "323e35c6-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [8900, 4000], "end": [9100, 6000], "borderWidth": 410, "height": 100 } - }, - "323e35c7-404f-11e5-877d-e53327a933d0": { - "id": "323e35c7-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [7900, 9000], "end": [8100, 11000], "borderWidth": 410, "height": 100 } - }, - "323e35c8-404f-11e5-877d-e53327a933d0": { - "id": "323e35c8-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [8900, 14000], "end": [9100, 16000], "borderWidth": 410, "height": 100 } - }, - "323e5cd0-404f-11e5-877d-e53327a933d0": { - "id": "323e5cd0-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [7900, 19000], "end": [8100, 21000], "borderWidth": 410, "height": 100 } - }, - "323e5cd1-404f-11e5-877d-e53327a933d0": { - "id": "323e5cd1-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [8900, 24000], "end": [9100, 26000], "borderWidth": 410, "height": 100 } - }, - "323e5cd2-404f-11e5-877d-e53327a933d0": { - "id": "323e5cd2-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [7900, 29000], "end": [8100, 31000], "borderWidth": 410, "height": 100 } - }, - "323e5cd3-404f-11e5-877d-e53327a933d0": { - "id": "323e5cd3-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [8900, 34000], "end": [9100, 36000], "borderWidth": 410, "height": 100 } - }, - "323e5cd4-404f-11e5-877d-e53327a933d0": { - "id": "323e5cd4-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [7900, 39000], "end": [8100, 40900], "borderWidth": 410, "height": 100 } - }, - "323e5cd5-404f-11e5-877d-e53327a933d0": { - "id": "323e5cd5-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [10900, 36500], "end": [11100, 38500], "borderWidth": 410, "height": 100 } - }, - "323e5cd6-404f-11e5-877d-e53327a933d0": { - "id": "323e5cd6-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [13900, 31500], "end": [14100, 33400], "borderWidth": 410, "height": 100 } - }, - "323e5cd7-404f-11e5-877d-e53327a933d0": { - "id": "323e5cd7-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [22900, 33000], "end": [23100, 35000], "borderWidth": 410, "height": 100 } - }, - "323e83e0-404f-11e5-877d-e53327a933d0": { - "id": "323e83e0-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [11900, 26500], "end": [12100, 28500], "borderWidth": 410, "height": 100 } - }, - "323e83e1-404f-11e5-877d-e53327a933d0": { - "id": "323e83e1-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [10900, 16500], "end": [11100, 18400], "borderWidth": 410, "height": 100 } - }, - "323e83e2-404f-11e5-877d-e53327a933d0": { - "id": "323e83e2-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [13900, 11600], "end": [14100, 13600], "borderWidth": 410, "height": 100 } - }, - "323e83e3-404f-11e5-877d-e53327a933d0": { - "id": "323e83e3-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [11900, 6500], "end": [12100, 8500], "borderWidth": 410, "height": 100 } - }, - "323e83e4-404f-11e5-877d-e53327a933d0": { - "id": "323e83e4-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [23900, 21500], "end": [24100, 23600], "borderWidth": 410, "height": 100 } - }, - "323e83e5-404f-11e5-877d-e53327a933d0": { - "id": "323e83e5-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [27900, 27000], "end": [28100, 29000], "borderWidth": 410, "height": 100 } - }, - "323e83e6-404f-11e5-877d-e53327a933d0": { - "id": "323e83e6-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [29000, 32100], "end": [31000, 31900], "borderWidth": 410, "height": 100 } - }, - "323e83e7-404f-11e5-877d-e53327a933d0": { - "id": "323e83e7-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [39000, 29100], "end": [41000, 28900], "borderWidth": 410, "height": 100 } - }, - "323e83e8-404f-11e5-877d-e53327a933d0": { - "id": "323e83e8-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [42100, 26900], "end": [41900, 28500], "borderWidth": 410, "height": 100 } - }, - "323e83e9-404f-11e5-877d-e53327a933d0": { - "id": "323e83e9-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [33900, 24900], "end": [36000, 25100], "borderWidth": 410, "height": 100 } - }, - "323eaaf0-404f-11e5-877d-e53327a933d0": { - "id": "323eaaf0-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [29000, 25900], "end": [31000, 26100], "borderWidth": 410, "height": 100 } - }, - "323eaaf1-404f-11e5-877d-e53327a933d0": { - "id": "323eaaf1-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [33100, 23500], "end": [32900, 21600], "borderWidth": 410, "height": 100 } - }, - "323eaaf2-404f-11e5-877d-e53327a933d0": { - "id": "323eaaf2-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [35900, 21600], "end": [36100, 23500], "borderWidth": 410, "height": 100 } - }, - "323eaaf3-404f-11e5-877d-e53327a933d0": { - "id": "323eaaf3-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [22900, 12000], "end": [23100, 10000], "borderWidth": 410, "height": 100 } - }, - "323eaaf4-404f-11e5-877d-e53327a933d0": { - "id": "323eaaf4-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [28100, 18000], "end": [27900, 16000], "borderWidth": 410, "height": 100 } - }, - "323eaaf5-404f-11e5-877d-e53327a933d0": { - "id": "323eaaf5-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [29000, 19100], "end": [31000, 18900], "borderWidth": 410, "height": 100 } - }, - "323eaaf6-404f-11e5-877d-e53327a933d0": { - "id": "323eaaf6-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [32900, 18000], "end": [33100, 16000], "borderWidth": 410, "height": 100 } - }, - "323eaaf7-404f-11e5-877d-e53327a933d0": { - "id": "323eaaf7-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [29000, 13100], "end": [31000, 12900], "borderWidth": 410, "height": 100 } - }, - "323eaaf8-404f-11e5-877d-e53327a933d0": { - "id": "323eaaf8-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [36900, 16000], "end": [37100, 18000], "borderWidth": 410, "height": 100 } - }, - "323ed200-404f-11e5-877d-e53327a933d0": { - "id": "323ed200-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [39000, 16100], "end": [41000, 15900], "borderWidth": 410, "height": 100 } - }, - "323ed201-404f-11e5-877d-e53327a933d0": { - "id": "323ed201-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [41900, 16500], "end": [42000, 18000], "borderWidth": 410, "height": 100 } - }, - "38159240-404f-11e5-877d-e53327a933d0": { - "id": "38159240-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [32900, 27000], "end": [33100, 29000], "borderWidth": 410, "height": 100 } - }, - "39f06cc0-404f-11e5-877d-e53327a933d0": { - "id": "39f06cc0-404f-11e5-877d-e53327a933d0", - "name": "New Chamber", - "type": "Chamber", - "params": { "start": [35900, 27000], "end": [36100, 29000], "borderWidth": 410, "height": 100 } - } - } - } - ], - "groups": [], - "defaults": {} -} diff --git a/dist/favicon.ico b/favicon.ico similarity index 100% rename from dist/favicon.ico rename to favicon.ico diff --git a/dist/fonts/Roboto-Black.313a6563.woff b/fonts/Roboto-Black.313a6563.woff similarity index 100% rename from dist/fonts/Roboto-Black.313a6563.woff rename to fonts/Roboto-Black.313a6563.woff diff --git a/dist/fonts/Roboto-Black.59eb3601.woff2 b/fonts/Roboto-Black.59eb3601.woff2 similarity index 100% rename from dist/fonts/Roboto-Black.59eb3601.woff2 rename to fonts/Roboto-Black.59eb3601.woff2 diff --git a/dist/fonts/Roboto-BlackItalic.cc2fadc3.woff b/fonts/Roboto-BlackItalic.cc2fadc3.woff similarity index 100% rename from dist/fonts/Roboto-BlackItalic.cc2fadc3.woff rename to fonts/Roboto-BlackItalic.cc2fadc3.woff diff --git a/dist/fonts/Roboto-BlackItalic.f75569f8.woff2 b/fonts/Roboto-BlackItalic.f75569f8.woff2 similarity index 100% rename from dist/fonts/Roboto-BlackItalic.f75569f8.woff2 rename to fonts/Roboto-BlackItalic.f75569f8.woff2 diff --git a/dist/fonts/Roboto-Bold.50d75e48.woff b/fonts/Roboto-Bold.50d75e48.woff similarity index 100% rename from dist/fonts/Roboto-Bold.50d75e48.woff rename to fonts/Roboto-Bold.50d75e48.woff diff --git a/dist/fonts/Roboto-Bold.b52fac2b.woff2 b/fonts/Roboto-Bold.b52fac2b.woff2 similarity index 100% rename from dist/fonts/Roboto-Bold.b52fac2b.woff2 rename to fonts/Roboto-Bold.b52fac2b.woff2 diff --git a/dist/fonts/Roboto-BoldItalic.4fe0f73c.woff b/fonts/Roboto-BoldItalic.4fe0f73c.woff similarity index 100% rename from dist/fonts/Roboto-BoldItalic.4fe0f73c.woff rename to fonts/Roboto-BoldItalic.4fe0f73c.woff diff --git a/dist/fonts/Roboto-BoldItalic.94008e69.woff2 b/fonts/Roboto-BoldItalic.94008e69.woff2 similarity index 100% rename from dist/fonts/Roboto-BoldItalic.94008e69.woff2 rename to fonts/Roboto-BoldItalic.94008e69.woff2 diff --git a/dist/fonts/Roboto-Light.c73eb1ce.woff b/fonts/Roboto-Light.c73eb1ce.woff similarity index 100% rename from dist/fonts/Roboto-Light.c73eb1ce.woff rename to fonts/Roboto-Light.c73eb1ce.woff diff --git a/dist/fonts/Roboto-Light.d26871e8.woff2 b/fonts/Roboto-Light.d26871e8.woff2 similarity index 100% rename from dist/fonts/Roboto-Light.d26871e8.woff2 rename to fonts/Roboto-Light.d26871e8.woff2 diff --git a/dist/fonts/Roboto-LightItalic.13efe6cb.woff b/fonts/Roboto-LightItalic.13efe6cb.woff similarity index 100% rename from dist/fonts/Roboto-LightItalic.13efe6cb.woff rename to fonts/Roboto-LightItalic.13efe6cb.woff diff --git a/dist/fonts/Roboto-LightItalic.e8eaae90.woff2 b/fonts/Roboto-LightItalic.e8eaae90.woff2 similarity index 100% rename from dist/fonts/Roboto-LightItalic.e8eaae90.woff2 rename to fonts/Roboto-LightItalic.e8eaae90.woff2 diff --git a/dist/fonts/Roboto-Medium.1d659482.woff b/fonts/Roboto-Medium.1d659482.woff similarity index 100% rename from dist/fonts/Roboto-Medium.1d659482.woff rename to fonts/Roboto-Medium.1d659482.woff diff --git a/dist/fonts/Roboto-Medium.90d16760.woff2 b/fonts/Roboto-Medium.90d16760.woff2 similarity index 100% rename from dist/fonts/Roboto-Medium.90d16760.woff2 rename to fonts/Roboto-Medium.90d16760.woff2 diff --git a/dist/fonts/Roboto-MediumItalic.13ec0eb5.woff2 b/fonts/Roboto-MediumItalic.13ec0eb5.woff2 similarity index 100% rename from dist/fonts/Roboto-MediumItalic.13ec0eb5.woff2 rename to fonts/Roboto-MediumItalic.13ec0eb5.woff2 diff --git a/dist/fonts/Roboto-MediumItalic.83e114c3.woff b/fonts/Roboto-MediumItalic.83e114c3.woff similarity index 100% rename from dist/fonts/Roboto-MediumItalic.83e114c3.woff rename to fonts/Roboto-MediumItalic.83e114c3.woff diff --git a/dist/fonts/Roboto-Regular.35b07eb2.woff b/fonts/Roboto-Regular.35b07eb2.woff similarity index 100% rename from dist/fonts/Roboto-Regular.35b07eb2.woff rename to fonts/Roboto-Regular.35b07eb2.woff diff --git a/dist/fonts/Roboto-Regular.73f0a88b.woff2 b/fonts/Roboto-Regular.73f0a88b.woff2 similarity index 100% rename from dist/fonts/Roboto-Regular.73f0a88b.woff2 rename to fonts/Roboto-Regular.73f0a88b.woff2 diff --git a/dist/fonts/Roboto-RegularItalic.4357beb8.woff2 b/fonts/Roboto-RegularItalic.4357beb8.woff2 similarity index 100% rename from dist/fonts/Roboto-RegularItalic.4357beb8.woff2 rename to fonts/Roboto-RegularItalic.4357beb8.woff2 diff --git a/dist/fonts/Roboto-RegularItalic.f5902d5e.woff b/fonts/Roboto-RegularItalic.f5902d5e.woff similarity index 100% rename from dist/fonts/Roboto-RegularItalic.f5902d5e.woff rename to fonts/Roboto-RegularItalic.f5902d5e.woff diff --git a/dist/fonts/Roboto-Thin.ad538a69.woff2 b/fonts/Roboto-Thin.ad538a69.woff2 similarity index 100% rename from dist/fonts/Roboto-Thin.ad538a69.woff2 rename to fonts/Roboto-Thin.ad538a69.woff2 diff --git a/dist/fonts/Roboto-Thin.d3b47375.woff b/fonts/Roboto-Thin.d3b47375.woff similarity index 100% rename from dist/fonts/Roboto-Thin.d3b47375.woff rename to fonts/Roboto-Thin.d3b47375.woff diff --git a/dist/fonts/Roboto-ThinItalic.5b4a33e1.woff2 b/fonts/Roboto-ThinItalic.5b4a33e1.woff2 similarity index 100% rename from dist/fonts/Roboto-ThinItalic.5b4a33e1.woff2 rename to fonts/Roboto-ThinItalic.5b4a33e1.woff2 diff --git a/dist/fonts/Roboto-ThinItalic.8a96edbb.woff b/fonts/Roboto-ThinItalic.8a96edbb.woff similarity index 100% rename from dist/fonts/Roboto-ThinItalic.8a96edbb.woff rename to fonts/Roboto-ThinItalic.8a96edbb.woff diff --git a/dist/fonts/materialdesignicons-webfont.147e3378.woff b/fonts/materialdesignicons-webfont.147e3378.woff similarity index 100% rename from dist/fonts/materialdesignicons-webfont.147e3378.woff rename to fonts/materialdesignicons-webfont.147e3378.woff diff --git a/dist/fonts/materialdesignicons-webfont.174c02fc.ttf b/fonts/materialdesignicons-webfont.174c02fc.ttf similarity index 100% rename from dist/fonts/materialdesignicons-webfont.174c02fc.ttf rename to fonts/materialdesignicons-webfont.174c02fc.ttf diff --git a/dist/fonts/materialdesignicons-webfont.64d4cf64.eot b/fonts/materialdesignicons-webfont.64d4cf64.eot similarity index 100% rename from dist/fonts/materialdesignicons-webfont.64d4cf64.eot rename to fonts/materialdesignicons-webfont.64d4cf64.eot diff --git a/dist/fonts/materialdesignicons-webfont.7a44ea19.woff2 b/fonts/materialdesignicons-webfont.7a44ea19.woff2 similarity index 100% rename from dist/fonts/materialdesignicons-webfont.7a44ea19.woff2 rename to fonts/materialdesignicons-webfont.7a44ea19.woff2 diff --git a/dist/img/3DuF_favicon_large.svg b/img/3DuF_favicon_large.svg similarity index 100% rename from dist/img/3DuF_favicon_large.svg rename to img/3DuF_favicon_large.svg diff --git a/dist/img/3DuF_placeholder_logo.png b/img/3DuF_placeholder_logo.png similarity index 100% rename from dist/img/3DuF_placeholder_logo.png rename to img/3DuF_placeholder_logo.png diff --git a/dist/img/3DuF_placeholder_png.png b/img/3DuF_placeholder_png.png similarity index 100% rename from dist/img/3DuF_placeholder_png.png rename to img/3DuF_placeholder_png.png diff --git a/dist/img/3DuF_placeholder_svg.svg b/img/3DuF_placeholder_svg.svg similarity index 100% rename from dist/img/3DuF_placeholder_svg.svg rename to img/3DuF_placeholder_svg.svg diff --git a/dist/img/CHANNEL.6ac8d4e3.png b/img/CHANNEL.6ac8d4e3.png similarity index 100% rename from dist/img/CHANNEL.6ac8d4e3.png rename to img/CHANNEL.6ac8d4e3.png diff --git a/dist/img/cidar_logo.png b/img/cidar_logo.png similarity index 100% rename from dist/img/cidar_logo.png rename to img/cidar_logo.png diff --git a/dist/img/favicon_large.png b/img/favicon_large.png similarity index 100% rename from dist/img/favicon_large.png rename to img/favicon_large.png diff --git a/dist/img/logo.png b/img/logo.png similarity index 100% rename from dist/img/logo.png rename to img/logo.png diff --git a/dist/index.html b/index.html similarity index 100% rename from dist/index.html rename to index.html diff --git a/dist/index2.html b/index2.html similarity index 100% rename from dist/index2.html rename to index2.html diff --git a/dist/js/app.5e0ea8c0.js b/js/app.5e0ea8c0.js similarity index 100% rename from dist/js/app.5e0ea8c0.js rename to js/app.5e0ea8c0.js diff --git a/dist/js/app.5e0ea8c0.js.map b/js/app.5e0ea8c0.js.map similarity index 100% rename from dist/js/app.5e0ea8c0.js.map rename to js/app.5e0ea8c0.js.map diff --git a/dist/js/chunk-vendors.68475a27.js b/js/chunk-vendors.68475a27.js similarity index 100% rename from dist/js/chunk-vendors.68475a27.js rename to js/chunk-vendors.68475a27.js diff --git a/dist/js/chunk-vendors.68475a27.js.map b/js/chunk-vendors.68475a27.js.map similarity index 100% rename from dist/js/chunk-vendors.68475a27.js.map rename to js/chunk-vendors.68475a27.js.map diff --git a/lib/bootstrap/bootstrap-theme.min.css b/lib/bootstrap/bootstrap-theme.min.css deleted file mode 100644 index 61358b13..00000000 --- a/lib/bootstrap/bootstrap-theme.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/lib/bootstrap/bootstrap.min.css b/lib/bootstrap/bootstrap.min.css deleted file mode 100644 index d65c66b1..00000000 --- a/lib/bootstrap/bootstrap.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/lib/bootstrap/bootstrap.min.js b/lib/bootstrap/bootstrap.min.js deleted file mode 100644 index 133aeecb..00000000 --- a/lib/bootstrap/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under the MIT license - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth

',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/lib/canvas_rendering/canvasrenderer.js b/lib/canvas_rendering/canvasrenderer.js deleted file mode 100644 index 2beb2601..00000000 --- a/lib/canvas_rendering/canvasrenderer.js +++ /dev/null @@ -1,1098 +0,0 @@ -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.SpriteCanvasMaterial = function ( parameters ) { - - THREE.Material.call( this ); - - this.type = 'SpriteCanvasMaterial'; - - this.color = new THREE.Color( 0xffffff ); - this.program = function ( context, color ) {}; - - this.setValues( parameters ); - -}; - -THREE.SpriteCanvasMaterial.prototype = Object.create( THREE.Material.prototype ); -THREE.SpriteCanvasMaterial.prototype.constructor = THREE.SpriteCanvasMaterial; - -THREE.SpriteCanvasMaterial.prototype.clone = function () { - - var material = new THREE.SpriteCanvasMaterial(); - - THREE.Material.prototype.clone.call( this, material ); - - material.color.copy( this.color ); - material.program = this.program; - - return material; - -}; - -// - -THREE.CanvasRenderer = function ( parameters ) { - - console.log( 'THREE.CanvasRenderer', THREE.REVISION ); - - var smoothstep = THREE.Math.smoothstep; - - parameters = parameters || {}; - - var _this = this, - _renderData, _elements, _lights, - _projector = new THREE.Projector(), - - _canvas = parameters.canvas !== undefined - ? parameters.canvas - : document.createElement( 'canvas' ), - - _canvasWidth = _canvas.width, - _canvasHeight = _canvas.height, - _canvasWidthHalf = Math.floor( _canvasWidth / 2 ), - _canvasHeightHalf = Math.floor( _canvasHeight / 2 ), - - _viewportX = 0, - _viewportY = 0, - _viewportWidth = _canvasWidth, - _viewportHeight = _canvasHeight, - - pixelRatio = 1, - - _context = _canvas.getContext( '2d', { - alpha: parameters.alpha === true - } ), - - _clearColor = new THREE.Color( 0x000000 ), - _clearAlpha = parameters.alpha === true ? 0 : 1, - - _contextGlobalAlpha = 1, - _contextGlobalCompositeOperation = 0, - _contextStrokeStyle = null, - _contextFillStyle = null, - _contextLineWidth = null, - _contextLineCap = null, - _contextLineJoin = null, - _contextLineDash = [], - - _camera, - - _v1, _v2, _v3, _v4, - _v5 = new THREE.RenderableVertex(), - _v6 = new THREE.RenderableVertex(), - - _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, - _v4x, _v4y, _v5x, _v5y, _v6x, _v6y, - - _color = new THREE.Color(), - _color1 = new THREE.Color(), - _color2 = new THREE.Color(), - _color3 = new THREE.Color(), - _color4 = new THREE.Color(), - - _diffuseColor = new THREE.Color(), - _emissiveColor = new THREE.Color(), - - _lightColor = new THREE.Color(), - - _patterns = {}, - - _image, _uvs, - _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y, - - _clipBox = new THREE.Box2(), - _clearBox = new THREE.Box2(), - _elemBox = new THREE.Box2(), - - _ambientLight = new THREE.Color(), - _directionalLights = new THREE.Color(), - _pointLights = new THREE.Color(), - - _vector3 = new THREE.Vector3(), // Needed for PointLight - _centroid = new THREE.Vector3(), - _normal = new THREE.Vector3(), - _normalViewMatrix = new THREE.Matrix3(); - - // dash+gap fallbacks for Firefox and everything else - - if ( _context.setLineDash === undefined ) { - - _context.setLineDash = function () {} - - } - - this.domElement = _canvas; - - this.autoClear = true; - this.sortObjects = true; - this.sortElements = true; - - this.info = { - - render: { - - vertices: 0, - faces: 0 - - } - - } - - // WebGLRenderer compatibility - - this.supportsVertexTextures = function () {}; - this.setFaceCulling = function () {}; - - // - - this.getPixelRatio = function () { - - return pixelRatio; - - }; - - this.setPixelRatio = function ( value ) { - - pixelRatio = value; - - }; - - this.setSize = function ( width, height, updateStyle ) { - - _canvasWidth = width * pixelRatio; - _canvasHeight = height * pixelRatio; - - _canvas.width = _canvasWidth; - _canvas.height = _canvasHeight; - - _canvasWidthHalf = Math.floor( _canvasWidth / 2 ); - _canvasHeightHalf = Math.floor( _canvasHeight / 2 ); - - if ( updateStyle !== false ) { - - _canvas.style.width = width + 'px'; - _canvas.style.height = height + 'px'; - - } - - _clipBox.min.set( -_canvasWidthHalf, -_canvasHeightHalf ), - _clipBox.max.set( _canvasWidthHalf, _canvasHeightHalf ); - - _clearBox.min.set( - _canvasWidthHalf, - _canvasHeightHalf ); - _clearBox.max.set( _canvasWidthHalf, _canvasHeightHalf ); - - _contextGlobalAlpha = 1; - _contextGlobalCompositeOperation = 0; - _contextStrokeStyle = null; - _contextFillStyle = null; - _contextLineWidth = null; - _contextLineCap = null; - _contextLineJoin = null; - - this.setViewport( 0, 0, width, height ); - - }; - - this.setViewport = function ( x, y, width, height ) { - - _viewportX = x * pixelRatio; - _viewportY = y * pixelRatio; - - _viewportWidth = width * pixelRatio; - _viewportHeight = height * pixelRatio; - - }; - - this.setScissor = function () {}; - this.enableScissorTest = function () {}; - - this.setClearColor = function ( color, alpha ) { - - _clearColor.set( color ); - _clearAlpha = alpha !== undefined ? alpha : 1; - - _clearBox.min.set( - _canvasWidthHalf, - _canvasHeightHalf ); - _clearBox.max.set( _canvasWidthHalf, _canvasHeightHalf ); - - }; - - this.setClearColorHex = function ( hex, alpha ) { - - console.warn( 'THREE.CanvasRenderer: .setClearColorHex() is being removed. Use .setClearColor() instead.' ); - this.setClearColor( hex, alpha ); - - }; - - this.getClearColor = function () { - - return _clearColor; - - }; - - this.getClearAlpha = function () { - - return _clearAlpha; - - }; - - this.getMaxAnisotropy = function () { - - return 0; - - }; - - this.clear = function () { - - if ( _clearBox.empty() === false ) { - - _clearBox.intersect( _clipBox ); - _clearBox.expandByScalar( 2 ); - - _clearBox.min.x = _clearBox.min.x + _canvasWidthHalf; - _clearBox.min.y = - _clearBox.min.y + _canvasHeightHalf; // higher y value ! - _clearBox.max.x = _clearBox.max.x + _canvasWidthHalf; - _clearBox.max.y = - _clearBox.max.y + _canvasHeightHalf; // lower y value ! - - if ( _clearAlpha < 1 ) { - - _context.clearRect( - _clearBox.min.x | 0, - _clearBox.max.y | 0, - ( _clearBox.max.x - _clearBox.min.x ) | 0, - ( _clearBox.min.y - _clearBox.max.y ) | 0 - ); - - } - - if ( _clearAlpha > 0 ) { - - setBlending( THREE.NormalBlending ); - setOpacity( 1 ); - - setFillStyle( 'rgba(' + Math.floor( _clearColor.r * 255 ) + ',' + Math.floor( _clearColor.g * 255 ) + ',' + Math.floor( _clearColor.b * 255 ) + ',' + _clearAlpha + ')' ); - - _context.fillRect( - _clearBox.min.x | 0, - _clearBox.max.y | 0, - ( _clearBox.max.x - _clearBox.min.x ) | 0, - ( _clearBox.min.y - _clearBox.max.y ) | 0 - ); - - } - - _clearBox.makeEmpty(); - - } - - }; - - // compatibility - - this.clearColor = function () {}; - this.clearDepth = function () {}; - this.clearStencil = function () {}; - - this.render = function ( scene, camera ) { - - if ( camera instanceof THREE.Camera === false ) { - - console.error( 'THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.' ); - return; - - } - - if ( this.autoClear === true ) this.clear(); - - _this.info.render.vertices = 0; - _this.info.render.faces = 0; - - _context.setTransform( _viewportWidth / _canvasWidth, 0, 0, - _viewportHeight / _canvasHeight, _viewportX, _canvasHeight - _viewportY ); - _context.translate( _canvasWidthHalf, _canvasHeightHalf ); - - _renderData = _projector.projectScene( scene, camera, this.sortObjects, this.sortElements ); - _elements = _renderData.elements; - _lights = _renderData.lights; - _camera = camera; - - _normalViewMatrix.getNormalMatrix( camera.matrixWorldInverse ); - - /* DEBUG - setFillStyle( 'rgba( 0, 255, 255, 0.5 )' ); - _context.fillRect( _clipBox.min.x, _clipBox.min.y, _clipBox.max.x - _clipBox.min.x, _clipBox.max.y - _clipBox.min.y ); - */ - - calculateLights(); - - for ( var e = 0, el = _elements.length; e < el; e ++ ) { - - var element = _elements[ e ]; - - var material = element.material; - - if ( material === undefined || material.opacity === 0 ) continue; - - _elemBox.makeEmpty(); - - if ( element instanceof THREE.RenderableSprite ) { - - _v1 = element; - _v1.x *= _canvasWidthHalf; _v1.y *= _canvasHeightHalf; - - renderSprite( _v1, element, material ); - - } else if ( element instanceof THREE.RenderableLine ) { - - _v1 = element.v1; _v2 = element.v2; - - _v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf; - _v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf; - - _elemBox.setFromPoints( [ - _v1.positionScreen, - _v2.positionScreen - ] ); - - if ( _clipBox.isIntersectionBox( _elemBox ) === true ) { - - renderLine( _v1, _v2, element, material ); - - } - - } else if ( element instanceof THREE.RenderableFace ) { - - _v1 = element.v1; _v2 = element.v2; _v3 = element.v3; - - if ( _v1.positionScreen.z < - 1 || _v1.positionScreen.z > 1 ) continue; - if ( _v2.positionScreen.z < - 1 || _v2.positionScreen.z > 1 ) continue; - if ( _v3.positionScreen.z < - 1 || _v3.positionScreen.z > 1 ) continue; - - _v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf; - _v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf; - _v3.positionScreen.x *= _canvasWidthHalf; _v3.positionScreen.y *= _canvasHeightHalf; - - if ( material.overdraw > 0 ) { - - expand( _v1.positionScreen, _v2.positionScreen, material.overdraw ); - expand( _v2.positionScreen, _v3.positionScreen, material.overdraw ); - expand( _v3.positionScreen, _v1.positionScreen, material.overdraw ); - - } - - _elemBox.setFromPoints( [ - _v1.positionScreen, - _v2.positionScreen, - _v3.positionScreen - ] ); - - if ( _clipBox.isIntersectionBox( _elemBox ) === true ) { - - renderFace3( _v1, _v2, _v3, 0, 1, 2, element, material ); - - } - - } - - /* DEBUG - setLineWidth( 1 ); - setStrokeStyle( 'rgba( 0, 255, 0, 0.5 )' ); - _context.strokeRect( _elemBox.min.x, _elemBox.min.y, _elemBox.max.x - _elemBox.min.x, _elemBox.max.y - _elemBox.min.y ); - */ - - _clearBox.union( _elemBox ); - - } - - /* DEBUG - setLineWidth( 1 ); - setStrokeStyle( 'rgba( 255, 0, 0, 0.5 )' ); - _context.strokeRect( _clearBox.min.x, _clearBox.min.y, _clearBox.max.x - _clearBox.min.x, _clearBox.max.y - _clearBox.min.y ); - */ - - _context.setTransform( 1, 0, 0, 1, 0, 0 ); - - }; - - // - - function calculateLights() { - - _ambientLight.setRGB( 0, 0, 0 ); - _directionalLights.setRGB( 0, 0, 0 ); - _pointLights.setRGB( 0, 0, 0 ); - - for ( var l = 0, ll = _lights.length; l < ll; l ++ ) { - - var light = _lights[ l ]; - var lightColor = light.color; - - if ( light instanceof THREE.AmbientLight ) { - - _ambientLight.add( lightColor ); - - } else if ( light instanceof THREE.DirectionalLight ) { - - // for sprites - - _directionalLights.add( lightColor ); - - } else if ( light instanceof THREE.PointLight ) { - - // for sprites - - _pointLights.add( lightColor ); - - } - - } - - } - - function calculateLight( position, normal, color ) { - - for ( var l = 0, ll = _lights.length; l < ll; l ++ ) { - - var light = _lights[ l ]; - - _lightColor.copy( light.color ); - - if ( light instanceof THREE.DirectionalLight ) { - - var lightPosition = _vector3.setFromMatrixPosition( light.matrixWorld ).normalize(); - - var amount = normal.dot( lightPosition ); - - if ( amount <= 0 ) continue; - - amount *= light.intensity; - - color.add( _lightColor.multiplyScalar( amount ) ); - - } else if ( light instanceof THREE.PointLight ) { - - var lightPosition = _vector3.setFromMatrixPosition( light.matrixWorld ); - - var amount = normal.dot( _vector3.subVectors( lightPosition, position ).normalize() ); - - if ( amount <= 0 ) continue; - - amount *= light.distance == 0 ? 1 : 1 - Math.min( position.distanceTo( lightPosition ) / light.distance, 1 ); - - if ( amount == 0 ) continue; - - amount *= light.intensity; - - color.add( _lightColor.multiplyScalar( amount ) ); - - } - - } - - } - - function renderSprite( v1, element, material ) { - - setOpacity( material.opacity ); - setBlending( material.blending ); - - var scaleX = element.scale.x * _canvasWidthHalf; - var scaleY = element.scale.y * _canvasHeightHalf; - - var dist = 0.5 * Math.sqrt( scaleX * scaleX + scaleY * scaleY ); // allow for rotated sprite - _elemBox.min.set( v1.x - dist, v1.y - dist ); - _elemBox.max.set( v1.x + dist, v1.y + dist ); - - if ( material instanceof THREE.SpriteMaterial ) { - - var texture = material.map; - - if ( texture !== null && texture.image !== undefined ) { - - if ( texture.hasEventListener( 'update', onTextureUpdate ) === false ) { - - if ( texture.image.width > 0 ) { - - textureToPattern( texture ); - - } - - texture.addEventListener( 'update', onTextureUpdate ); - - } - - var pattern = _patterns[ texture.id ]; - - if ( pattern !== undefined ) { - - setFillStyle( pattern ); - - } else { - - setFillStyle( 'rgba( 0, 0, 0, 1 )' ); - - } - - // - - var bitmap = texture.image; - - var ox = bitmap.width * texture.offset.x; - var oy = bitmap.height * texture.offset.y; - - var sx = bitmap.width * texture.repeat.x; - var sy = bitmap.height * texture.repeat.y; - - var cx = scaleX / sx; - var cy = scaleY / sy; - - _context.save(); - _context.translate( v1.x, v1.y ); - if ( material.rotation !== 0 ) _context.rotate( material.rotation ); - _context.translate( - scaleX / 2, - scaleY / 2 ); - _context.scale( cx, cy ); - _context.translate( - ox, - oy ); - _context.fillRect( ox, oy, sx, sy ); - _context.restore(); - - } else { - - // no texture - - setFillStyle( material.color.getStyle() ); - - _context.save(); - _context.translate( v1.x, v1.y ); - if ( material.rotation !== 0 ) _context.rotate( material.rotation ); - _context.scale( scaleX, - scaleY ); - _context.fillRect( - 0.5, - 0.5, 1, 1 ); - _context.restore(); - - } - - } else if ( material instanceof THREE.SpriteCanvasMaterial ) { - - setStrokeStyle( material.color.getStyle() ); - setFillStyle( material.color.getStyle() ); - - _context.save(); - _context.translate( v1.x, v1.y ); - if ( material.rotation !== 0 ) _context.rotate( material.rotation ); - _context.scale( scaleX, scaleY ); - - material.program( _context ); - - _context.restore(); - - } - - /* DEBUG - setStrokeStyle( 'rgb(255,255,0)' ); - _context.beginPath(); - _context.moveTo( v1.x - 10, v1.y ); - _context.lineTo( v1.x + 10, v1.y ); - _context.moveTo( v1.x, v1.y - 10 ); - _context.lineTo( v1.x, v1.y + 10 ); - _context.stroke(); - */ - - } - - function renderLine( v1, v2, element, material ) { - - setOpacity( material.opacity ); - setBlending( material.blending ); - - _context.beginPath(); - _context.moveTo( v1.positionScreen.x, v1.positionScreen.y ); - _context.lineTo( v2.positionScreen.x, v2.positionScreen.y ); - - if ( material instanceof THREE.LineBasicMaterial ) { - - setLineWidth( material.linewidth ); - setLineCap( material.linecap ); - setLineJoin( material.linejoin ); - - if ( material.vertexColors !== THREE.VertexColors ) { - - setStrokeStyle( material.color.getStyle() ); - - } else { - - var colorStyle1 = element.vertexColors[ 0 ].getStyle(); - var colorStyle2 = element.vertexColors[ 1 ].getStyle(); - - if ( colorStyle1 === colorStyle2 ) { - - setStrokeStyle( colorStyle1 ); - - } else { - - try { - - var grad = _context.createLinearGradient( - v1.positionScreen.x, - v1.positionScreen.y, - v2.positionScreen.x, - v2.positionScreen.y - ); - grad.addColorStop( 0, colorStyle1 ); - grad.addColorStop( 1, colorStyle2 ); - - } catch ( exception ) { - - grad = colorStyle1; - - } - - setStrokeStyle( grad ); - - } - - } - - _context.stroke(); - _elemBox.expandByScalar( material.linewidth * 2 ); - - } else if ( material instanceof THREE.LineDashedMaterial ) { - - setLineWidth( material.linewidth ); - setLineCap( material.linecap ); - setLineJoin( material.linejoin ); - setStrokeStyle( material.color.getStyle() ); - setLineDash( [ material.dashSize, material.gapSize ] ); - - _context.stroke(); - - _elemBox.expandByScalar( material.linewidth * 2 ); - - setLineDash( [] ); - - } - - } - - function renderFace3( v1, v2, v3, uv1, uv2, uv3, element, material ) { - - _this.info.render.vertices += 3; - _this.info.render.faces ++; - - setOpacity( material.opacity ); - setBlending( material.blending ); - - _v1x = v1.positionScreen.x; _v1y = v1.positionScreen.y; - _v2x = v2.positionScreen.x; _v2y = v2.positionScreen.y; - _v3x = v3.positionScreen.x; _v3y = v3.positionScreen.y; - - drawTriangle( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y ); - - if ( ( material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) && material.map === null ) { - - _diffuseColor.copy( material.color ); - _emissiveColor.copy( material.emissive ); - - if ( material.vertexColors === THREE.FaceColors ) { - - _diffuseColor.multiply( element.color ); - - } - - _color.copy( _ambientLight ); - - _centroid.copy( v1.positionWorld ).add( v2.positionWorld ).add( v3.positionWorld ).divideScalar( 3 ); - - calculateLight( _centroid, element.normalModel, _color ); - - _color.multiply( _diffuseColor ).add( _emissiveColor ); - - material.wireframe === true - ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) - : fillPath( _color ); - - } else if ( material instanceof THREE.MeshBasicMaterial || - material instanceof THREE.MeshLambertMaterial || - material instanceof THREE.MeshPhongMaterial ) { - - if ( material.map !== null ) { - - var mapping = material.map.mapping; - - if ( mapping === THREE.UVMapping ) { - - _uvs = element.uvs; - patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uvs[ uv1 ].x, _uvs[ uv1 ].y, _uvs[ uv2 ].x, _uvs[ uv2 ].y, _uvs[ uv3 ].x, _uvs[ uv3 ].y, material.map ); - - } - - } else if ( material.envMap !== null ) { - - if ( material.envMap.mapping === THREE.SphericalReflectionMapping ) { - - _normal.copy( element.vertexNormalsModel[ uv1 ] ).applyMatrix3( _normalViewMatrix ); - _uv1x = 0.5 * _normal.x + 0.5; - _uv1y = 0.5 * _normal.y + 0.5; - - _normal.copy( element.vertexNormalsModel[ uv2 ] ).applyMatrix3( _normalViewMatrix ); - _uv2x = 0.5 * _normal.x + 0.5; - _uv2y = 0.5 * _normal.y + 0.5; - - _normal.copy( element.vertexNormalsModel[ uv3 ] ).applyMatrix3( _normalViewMatrix ); - _uv3x = 0.5 * _normal.x + 0.5; - _uv3y = 0.5 * _normal.y + 0.5; - - patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y, material.envMap ); - - } - - } else { - - _color.copy( material.color ); - - if ( material.vertexColors === THREE.FaceColors ) { - - _color.multiply( element.color ); - - } - - material.wireframe === true - ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) - : fillPath( _color ); - - } - - } else if ( material instanceof THREE.MeshDepthMaterial ) { - - _color.r = _color.g = _color.b = 1 - smoothstep( v1.positionScreen.z * v1.positionScreen.w, _camera.near, _camera.far ); - - material.wireframe === true - ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) - : fillPath( _color ); - - } else if ( material instanceof THREE.MeshNormalMaterial ) { - - _normal.copy( element.normalModel ).applyMatrix3( _normalViewMatrix ); - - _color.setRGB( _normal.x, _normal.y, _normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 ); - - material.wireframe === true - ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) - : fillPath( _color ); - - } else { - - _color.setRGB( 1, 1, 1 ); - - material.wireframe === true - ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) - : fillPath( _color ); - - } - - } - - // - - function drawTriangle( x0, y0, x1, y1, x2, y2 ) { - - _context.beginPath(); - _context.moveTo( x0, y0 ); - _context.lineTo( x1, y1 ); - _context.lineTo( x2, y2 ); - _context.closePath(); - - } - - function strokePath( color, linewidth, linecap, linejoin ) { - - setLineWidth( linewidth ); - setLineCap( linecap ); - setLineJoin( linejoin ); - setStrokeStyle( color.getStyle() ); - - _context.stroke(); - - _elemBox.expandByScalar( linewidth * 2 ); - - } - - function fillPath( color ) { - - setFillStyle( color.getStyle() ); - _context.fill(); - - } - - function onTextureUpdate ( event ) { - - textureToPattern( event.target ); - - } - - function textureToPattern( texture ) { - - if ( texture instanceof THREE.CompressedTexture ) return; - - var repeatX = texture.wrapS === THREE.RepeatWrapping; - var repeatY = texture.wrapT === THREE.RepeatWrapping; - - var image = texture.image; - - var canvas = document.createElement( 'canvas' ); - canvas.width = image.width; - canvas.height = image.height; - - var context = canvas.getContext( '2d' ); - context.setTransform( 1, 0, 0, - 1, 0, image.height ); - context.drawImage( image, 0, 0 ); - - _patterns[ texture.id ] = _context.createPattern( - canvas, repeatX === true && repeatY === true - ? 'repeat' - : repeatX === true && repeatY === false - ? 'repeat-x' - : repeatX === false && repeatY === true - ? 'repeat-y' - : 'no-repeat' - ); - - } - - function patternPath( x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, texture ) { - - if ( texture instanceof THREE.DataTexture ) return; - - if ( texture.hasEventListener( 'update', onTextureUpdate ) === false ) { - - if ( texture.image !== undefined && texture.image.width > 0 ) { - - textureToPattern( texture ); - - } - - texture.addEventListener( 'update', onTextureUpdate ); - - } - - var pattern = _patterns[ texture.id ]; - - if ( pattern !== undefined ) { - - setFillStyle( pattern ); - - } else { - - setFillStyle( 'rgba(0,0,0,1)' ); - _context.fill(); - - return; - - } - - // http://extremelysatisfactorytotalitarianism.com/blog/?p=2120 - - var a, b, c, d, e, f, det, idet, - offsetX = texture.offset.x / texture.repeat.x, - offsetY = texture.offset.y / texture.repeat.y, - width = texture.image.width * texture.repeat.x, - height = texture.image.height * texture.repeat.y; - - u0 = ( u0 + offsetX ) * width; - v0 = ( v0 + offsetY ) * height; - - u1 = ( u1 + offsetX ) * width; - v1 = ( v1 + offsetY ) * height; - - u2 = ( u2 + offsetX ) * width; - v2 = ( v2 + offsetY ) * height; - - x1 -= x0; y1 -= y0; - x2 -= x0; y2 -= y0; - - u1 -= u0; v1 -= v0; - u2 -= u0; v2 -= v0; - - det = u1 * v2 - u2 * v1; - - if ( det === 0 ) return; - - idet = 1 / det; - - a = ( v2 * x1 - v1 * x2 ) * idet; - b = ( v2 * y1 - v1 * y2 ) * idet; - c = ( u1 * x2 - u2 * x1 ) * idet; - d = ( u1 * y2 - u2 * y1 ) * idet; - - e = x0 - a * u0 - c * v0; - f = y0 - b * u0 - d * v0; - - _context.save(); - _context.transform( a, b, c, d, e, f ); - _context.fill(); - _context.restore(); - - } - - function clipImage( x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, image ) { - - // http://extremelysatisfactorytotalitarianism.com/blog/?p=2120 - - var a, b, c, d, e, f, det, idet, - width = image.width - 1, - height = image.height - 1; - - u0 *= width; v0 *= height; - u1 *= width; v1 *= height; - u2 *= width; v2 *= height; - - x1 -= x0; y1 -= y0; - x2 -= x0; y2 -= y0; - - u1 -= u0; v1 -= v0; - u2 -= u0; v2 -= v0; - - det = u1 * v2 - u2 * v1; - - idet = 1 / det; - - a = ( v2 * x1 - v1 * x2 ) * idet; - b = ( v2 * y1 - v1 * y2 ) * idet; - c = ( u1 * x2 - u2 * x1 ) * idet; - d = ( u1 * y2 - u2 * y1 ) * idet; - - e = x0 - a * u0 - c * v0; - f = y0 - b * u0 - d * v0; - - _context.save(); - _context.transform( a, b, c, d, e, f ); - _context.clip(); - _context.drawImage( image, 0, 0 ); - _context.restore(); - - } - - // Hide anti-alias gaps - - function expand( v1, v2, pixels ) { - - var x = v2.x - v1.x, y = v2.y - v1.y, - det = x * x + y * y, idet; - - if ( det === 0 ) return; - - idet = pixels / Math.sqrt( det ); - - x *= idet; y *= idet; - - v2.x += x; v2.y += y; - v1.x -= x; v1.y -= y; - - } - - // Context cached methods. - - function setOpacity( value ) { - - if ( _contextGlobalAlpha !== value ) { - - _context.globalAlpha = value; - _contextGlobalAlpha = value; - - } - - } - - function setBlending( value ) { - - if ( _contextGlobalCompositeOperation !== value ) { - - if ( value === THREE.NormalBlending ) { - - _context.globalCompositeOperation = 'source-over'; - - } else if ( value === THREE.AdditiveBlending ) { - - _context.globalCompositeOperation = 'lighter'; - - } else if ( value === THREE.SubtractiveBlending ) { - - _context.globalCompositeOperation = 'darker'; - - } - - _contextGlobalCompositeOperation = value; - - } - - } - - function setLineWidth( value ) { - - if ( _contextLineWidth !== value ) { - - _context.lineWidth = value; - _contextLineWidth = value; - - } - - } - - function setLineCap( value ) { - - // "butt", "round", "square" - - if ( _contextLineCap !== value ) { - - _context.lineCap = value; - _contextLineCap = value; - - } - - } - - function setLineJoin( value ) { - - // "round", "bevel", "miter" - - if ( _contextLineJoin !== value ) { - - _context.lineJoin = value; - _contextLineJoin = value; - - } - - } - - function setStrokeStyle( value ) { - - if ( _contextStrokeStyle !== value ) { - - _context.strokeStyle = value; - _contextStrokeStyle = value; - - } - - } - - function setFillStyle( value ) { - - if ( _contextFillStyle !== value ) { - - _context.fillStyle = value; - _contextFillStyle = value; - - } - - } - - function setLineDash( value ) { - - if ( _contextLineDash.length !== value.length ) { - - _context.setLineDash( value ); - _contextLineDash = value; - - } - - } - -}; diff --git a/lib/canvas_rendering/jquery-2.1.3.min.js b/lib/canvas_rendering/jquery-2.1.3.min.js deleted file mode 100644 index 25714ed2..00000000 --- a/lib/canvas_rendering/jquery-2.1.3.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v2.1.3 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.3",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="
",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c) -},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n(" - - - - - - - Introduction - Long Tutorial - - -
- -

Send in comments, suggestions and issues to 3dufhelp@gmail.com .

- -
Designs From Literature
- Check the various designs from microfluidic literature recreated in 3DµF can be found - here. -
Usage
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
del
- Delete Feature
F
- Reset Canvas
Esc
- Activate Select Tool/ Deselect Selected Components
ctrl+C , ctrl+V
- Activate Component Copy Mode
ctrl+Z
- Undo Last Edit
ctrl+A
- Select All
ctrl+S
- Save JSON file
left click
- Place Feature
right click
- Select Feature
mouse scroll
- Zoom
arrow keys
- Pan
- - -
- -
- - - - -
-

Drag and drop the DXF file on the canvas

-
-
- -
-
-
- - -
-
-
-
- - -
-
- - -
-

Generate Design of Experiments for a Single Component

-
-
- -
-
- - - - - - -
-
- - -
-
- - -
- -

Rename:

-
-
- - -
-
- -

Resize:

- -
-
- - - Input is not a number! -
-
- - - Input is not a number! -
-
-
-
- - -
-
- -
- -

Insert Text:

-
-
- - -
-
-
-
- - -
-
- -
- -

Drag Drop the DXF file containing border to import:

-
- -
- -
-
-
- - - -
-
- -
- -
Change All Components:
-
- - - - - - - - -
SelectNameChange
-
- - -
-
- - -
-

Send your design for fabrication at DAMP LAB

-
-
- -
Enter your contact information:
-
-
- - -
-
- - -
-
- -

Learn more about the DAMP LAB fabrication service here.

-
- - - - - - -
-
- - -
-
- - -
-
- -
- - - - - - - diff --git a/public/nouislider.min.css b/public/nouislider.min.css deleted file mode 100644 index 73e0c63f..00000000 --- a/public/nouislider.min.css +++ /dev/null @@ -1,208 +0,0 @@ -/*! noUiSlider - 8.0.1 - 2015-06-29 19:11:23 */ - -.noUi-target, -.noUi-target * { - -webkit-touch-callout: none; - -webkit-user-select: none; - -ms-touch-action: none; - -ms-user-select: none; - -moz-user-select: none; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.noUi-target { - position: relative; - direction: ltr; -} -.noUi-base { - width: 100%; - height: 100%; - position: relative; - z-index: 1; -} -.noUi-origin { - position: absolute; - right: 0; - top: 0; - left: 0; - bottom: 0; -} -.noUi-handle { - position: relative; - z-index: 1; -} -.noUi-stacking .noUi-handle { - z-index: 10; -} -.noUi-state-tap .noUi-origin { - -webkit-transition: left 0.3s, top 0.3s; - transition: left 0.3s, top 0.3s; -} -.noUi-state-drag * { - cursor: inherit !important; -} -.noUi-base { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -.noUi-horizontal { - height: 18px; -} -.noUi-horizontal .noUi-handle { - width: 34px; - height: 28px; - left: -17px; - top: -6px; -} -.noUi-vertical { - width: 18px; -} -.noUi-vertical .noUi-handle { - width: 28px; - height: 34px; - left: -6px; - top: -17px; -} -.noUi-background { - background: #fafafa; - box-shadow: inset 0 1px 1px #f0f0f0; -} -.noUi-connect { - background: #3fb8af; - box-shadow: inset 0 0 3px rgba(51, 51, 51, 0.45); - -webkit-transition: background 450ms; - transition: background 450ms; -} -.noUi-origin { - border-radius: 2px; -} -.noUi-target { - border-radius: 4px; - border: 1px solid #d3d3d3; - box-shadow: inset 0 1px 1px #f0f0f0, 0 3px 6px -5px #bbb; -} -.noUi-target.noUi-connect { - box-shadow: inset 0 0 3px rgba(51, 51, 51, 0.45), 0 3px 6px -5px #bbb; -} -.noUi-dragable { - cursor: w-resize; -} -.noUi-vertical .noUi-dragable { - cursor: n-resize; -} -.noUi-handle { - border: 1px solid #d9d9d9; - border-radius: 3px; - background: #fff; - cursor: default; - box-shadow: inset 0 0 1px #fff, inset 0 1px 7px #ebebeb, 0 3px 6px -3px #bbb; -} -.noUi-active { - box-shadow: inset 0 0 1px #fff, inset 0 1px 7px #ddd, 0 3px 6px -3px #bbb; -} -.noUi-handle:after, -.noUi-handle:before { - content: ""; - display: block; - position: absolute; - height: 14px; - width: 1px; - background: #e8e7e6; - left: 14px; - top: 6px; -} -.noUi-handle:after { - left: 17px; -} -.noUi-vertical .noUi-handle:after, -.noUi-vertical .noUi-handle:before { - width: 14px; - height: 1px; - left: 6px; - top: 14px; -} -.noUi-vertical .noUi-handle:after { - top: 17px; -} -[disabled] .noUi-connect, -[disabled].noUi-connect { - background: #b8b8b8; -} -[disabled] .noUi-handle, -[disabled].noUi-origin { - cursor: not-allowed; -} -.noUi-pips, -.noUi-pips * { - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.noUi-pips { - position: absolute; - font: 400 12px Arial; - color: #999; -} -.noUi-value { - width: 40px; - position: absolute; - text-align: center; -} -.noUi-value-sub { - color: #ccc; - font-size: 10px; -} -.noUi-marker { - position: absolute; - background: #ccc; -} -.noUi-marker-large, -.noUi-marker-sub { - background: #aaa; -} -.noUi-pips-horizontal { - padding: 10px 0; - height: 50px; - top: 100%; - left: 0; - width: 100%; -} -.noUi-value-horizontal { - margin-left: -20px; - padding-top: 20px; -} -.noUi-value-horizontal.noUi-value-sub { - padding-top: 15px; -} -.noUi-marker-horizontal.noUi-marker { - margin-left: -1px; - width: 2px; - height: 5px; -} -.noUi-marker-horizontal.noUi-marker-sub { - height: 10px; -} -.noUi-marker-horizontal.noUi-marker-large { - height: 15px; -} -.noUi-pips-vertical { - padding: 0 10px; - height: 100%; - top: 0; - left: 100%; -} -.noUi-value-vertical { - width: 15px; - margin-left: 20px; - margin-top: -5px; -} -.noUi-marker-vertical.noUi-marker { - width: 5px; - height: 2px; - margin-top: -1px; -} -.noUi-marker-vertical.noUi-marker-sub { - width: 10px; -} -.noUi-marker-vertical.noUi-marker-large { - width: 15px; -} diff --git a/public/orbit_bundle.js b/public/orbit_bundle.js deleted file mode 100644 index 06d41c53..00000000 --- a/public/orbit_bundle.js +++ /dev/null @@ -1,1282 +0,0 @@ -(function e(t, n, r) { - function s(o, u) { - if (!n[o]) { - if (!t[o]) { - const a = typeof require === "function" && require; - if (!u && a) return a(o, !0); - if (i) return i(o, !0); - const f = new Error("Cannot find module '" + o + "'"); - throw ((f.code = "MODULE_NOT_FOUND"), f); - } - const l = (n[o] = { exports: {} }); - t[o][0].call( - l.exports, - function (e) { - const n = t[o][1][e]; - return s(n || e); - }, - l, - l.exports, - e, - t, - n, - r - ); - } - return n[o].exports; - } - var i = typeof require === "function" && require; - for (let o = 0; o < r.length; o++) s(r[o]); - return s; -})( - { - 1: [ - function (require, module, exports) { - /** - * @author qiao / https://github.com/qiao - * @author mrdoob / http://mrdoob.com - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - * @author erich666 / http://erichaines.com - */ - /* global THREE, console */ - - // This set of controls performs orbiting, dollying (zooming), and panning. It maintains - // the "up" direction as +Y, unlike the TrackballControls. Touch on tablet and phones is - // supported. - // - // Orbit - left mouse / touch: one finger move - // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish - // Pan - right mouse, or arrow keys / touch: three finter swipe - - "use strict"; - - THREE.OrbitControls = function (object, domElement) { - this.object = object; - this.domElement = domElement !== undefined ? domElement : document; - - // API - - // Set to false to disable this control - this.enabled = true; - - // "target" sets the location of focus, where the control orbits around - // and where it pans with respect to. - this.target = new THREE.Vector3(); - - // center is old, deprecated; use "target" instead - this.center = this.target; - - // This option actually enables dollying in and out; left as "zoom" for - // backwards compatibility - this.noZoom = false; - this.zoomSpeed = 1.0; - - // Limits to how far you can dolly in and out ( PerspectiveCamera only ) - this.minDistance = 0; - this.maxDistance = Infinity; - - // Limits to how far you can zoom in and out ( OrthographicCamera only ) - this.minZoom = 0; - this.maxZoom = Infinity; - - // Set to true to disable this control - this.noRotate = false; - this.rotateSpeed = 1.0; - - // Set to true to disable this control - this.noPan = false; - this.keyPanSpeed = 7.0; // pixels moved per arrow key push - - // Set to true to automatically rotate around the target - this.autoRotate = false; - this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 - - // How far you can orbit vertically, upper and lower limits. - // Range is 0 to Math.PI radians. - this.minPolarAngle = 0; // radians - this.maxPolarAngle = Math.PI; // radians - - // How far you can orbit horizontally, upper and lower limits. - // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. - this.minAzimuthAngle = -Math.PI; // radians - this.maxAzimuthAngle = Math.PI; // radians - - // Set to true to disable use of the keys - this.noKeys = false; - - // The four arrow keys - this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; - - // Mouse buttons - // this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT }; - this.mouseButtons = { ORBIT: THREE.MOUSE.RIGHT, PAN: THREE.MOUSE.MIDDLE }; - - /// ///////// - // internals - - const scope = this; - - const EPS = 0.000001; - - const rotateStart = new THREE.Vector2(); - const rotateEnd = new THREE.Vector2(); - const rotateDelta = new THREE.Vector2(); - - const panStart = new THREE.Vector2(); - const panEnd = new THREE.Vector2(); - const panDelta = new THREE.Vector2(); - const panOffset = new THREE.Vector3(); - - const offset = new THREE.Vector3(); - - const dollyStart = new THREE.Vector2(); - const dollyEnd = new THREE.Vector2(); - const dollyDelta = new THREE.Vector2(); - - let theta; - let phi; - let phiDelta = 0; - let thetaDelta = 0; - let scale = 1; - const pan = new THREE.Vector3(); - - const lastPosition = new THREE.Vector3(); - const lastQuaternion = new THREE.Quaternion(); - - const STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 }; - - let state = STATE.NONE; - - // for reset - - this.target0 = this.target.clone(); - this.position0 = this.object.position.clone(); - this.zoom0 = this.object.zoom; - - // so camera.up is the orbit axis - - const quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0)); - const quatInverse = quat.clone().inverse(); - - // events - - const changeEvent = { type: "change" }; - const startEvent = { type: "start" }; - const endEvent = { type: "end" }; - - this.rotateLeft = function (angle) { - if (angle === undefined) { - angle = getAutoRotationAngle(); - } - - thetaDelta -= angle; - }; - - this.rotateUp = function (angle) { - if (angle === undefined) { - angle = getAutoRotationAngle(); - } - - phiDelta -= angle; - }; - - // pass in distance in world space to move left - this.panLeft = function (distance) { - const te = this.object.matrix.elements; - - // get X column of matrix - panOffset.set(te[0], te[1], te[2]); - panOffset.multiplyScalar(-distance); - - pan.add(panOffset); - }; - - // pass in distance in world space to move up - this.panUp = function (distance) { - const te = this.object.matrix.elements; - - // get Y column of matrix - panOffset.set(te[4], te[5], te[6]); - panOffset.multiplyScalar(distance); - - pan.add(panOffset); - }; - - // pass in x,y of change desired in pixel space, - // right and down are positive - this.pan = function (deltaX, deltaY) { - const element = scope.domElement === document ? scope.domElement.body : scope.domElement; - - if (scope.object instanceof THREE.PerspectiveCamera) { - // perspective - const position = scope.object.position; - const offset = position.clone().sub(scope.target); - let targetDistance = offset.length(); - - // half of the fov is center to top of screen - targetDistance *= Math.tan(((scope.object.fov / 2) * Math.PI) / 180.0); - - // we actually don't use screenWidth, since perspective camera is fixed to screen height - scope.panLeft((2 * deltaX * targetDistance) / element.clientHeight); - scope.panUp((2 * deltaY * targetDistance) / element.clientHeight); - } else if (scope.object instanceof THREE.OrthographicCamera) { - // orthographic - scope.panLeft((deltaX * (scope.object.right - scope.object.left)) / element.clientWidth); - scope.panUp((deltaY * (scope.object.top - scope.object.bottom)) / element.clientHeight); - } else { - // camera neither orthographic or perspective - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."); - } - }; - - this.dollyIn = function (dollyScale) { - if (dollyScale === undefined) { - dollyScale = getZoomScale(); - } - - if (scope.object instanceof THREE.PerspectiveCamera) { - scale /= dollyScale; - } else if (scope.object instanceof THREE.OrthographicCamera) { - scope.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom * dollyScale)); - scope.object.updateProjectionMatrix(); - scope.dispatchEvent(changeEvent); - } else { - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); - } - }; - - this.dollyOut = function (dollyScale) { - if (dollyScale === undefined) { - dollyScale = getZoomScale(); - } - - if (scope.object instanceof THREE.PerspectiveCamera) { - scale *= dollyScale; - } else if (scope.object instanceof THREE.OrthographicCamera) { - scope.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / dollyScale)); - scope.object.updateProjectionMatrix(); - scope.dispatchEvent(changeEvent); - } else { - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); - } - }; - - this.update = function () { - const position = this.object.position; - - offset.copy(position).sub(this.target); - - // rotate offset to "y-axis-is-up" space - offset.applyQuaternion(quat); - - // angle from z-axis around y-axis - - theta = Math.atan2(offset.x, offset.z); - - // angle from y-axis - - phi = Math.atan2(Math.sqrt(offset.x * offset.x + offset.z * offset.z), offset.y); - - if (this.autoRotate && state === STATE.NONE) { - this.rotateLeft(getAutoRotationAngle()); - } - - theta += thetaDelta; - phi += phiDelta; - - // restrict theta to be between desired limits - theta = Math.max(this.minAzimuthAngle, Math.min(this.maxAzimuthAngle, theta)); - - // restrict phi to be between desired limits - phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, phi)); - - // restrict phi to be betwee EPS and PI-EPS - phi = Math.max(EPS, Math.min(Math.PI - EPS, phi)); - - let radius = offset.length() * scale; - - // restrict radius to be between desired limits - radius = Math.max(this.minDistance, Math.min(this.maxDistance, radius)); - - // move target to panned location - this.target.add(pan); - - offset.x = radius * Math.sin(phi) * Math.sin(theta); - offset.y = radius * Math.cos(phi); - offset.z = radius * Math.sin(phi) * Math.cos(theta); - - // rotate offset back to "camera-up-vector-is-up" space - offset.applyQuaternion(quatInverse); - - position.copy(this.target).add(offset); - - this.object.lookAt(this.target); - - thetaDelta = 0; - phiDelta = 0; - scale = 1; - pan.set(0, 0, 0); - - // update condition is: - // min(camera displacement, camera rotation in radians)^2 > EPS - // using small-angle approximation cos(x/2) = 1 - x^2 / 8 - - if (lastPosition.distanceToSquared(this.object.position) > EPS || 8 * (1 - lastQuaternion.dot(this.object.quaternion)) > EPS) { - this.dispatchEvent(changeEvent); - - lastPosition.copy(this.object.position); - lastQuaternion.copy(this.object.quaternion); - } - }; - - this.reset = function () { - state = STATE.NONE; - - this.target.copy(this.target0); - this.object.position.copy(this.position0); - this.object.zoom = this.zoom0; - - this.object.updateProjectionMatrix(); - this.dispatchEvent(changeEvent); - - this.update(); - }; - - this.getPolarAngle = function () { - return phi; - }; - - this.getAzimuthalAngle = function () { - return theta; - }; - - function getAutoRotationAngle() { - return ((2 * Math.PI) / 60 / 60) * scope.autoRotateSpeed; - } - - function getZoomScale() { - return Math.pow(0.95, scope.zoomSpeed); - } - - function onMouseDown(event) { - if (scope.enabled === false) return; - event.preventDefault(); - - if (event.button === scope.mouseButtons.ORBIT) { - if (scope.noRotate === true) return; - - state = STATE.ROTATE; - - rotateStart.set(event.clientX, event.clientY); - } else if (event.button === scope.mouseButtons.ZOOM) { - if (scope.noZoom === true) return; - - state = STATE.DOLLY; - - dollyStart.set(event.clientX, event.clientY); - } else if (event.button === scope.mouseButtons.PAN || event.button == THREE.MOUSE.LEFT) { - if (scope.noPan === true) return; - - state = STATE.PAN; - - panStart.set(event.clientX, event.clientY); - } - - if (state !== STATE.NONE) { - document.addEventListener("mousemove", onMouseMove, false); - document.addEventListener("mouseup", onMouseUp, false); - scope.dispatchEvent(startEvent); - } - } - - function onMouseMove(event) { - if (scope.enabled === false) return; - - event.preventDefault(); - - const element = scope.domElement === document ? scope.domElement.body : scope.domElement; - - if (state === STATE.ROTATE) { - if (scope.noRotate === true) return; - - rotateEnd.set(event.clientX, event.clientY); - rotateDelta.subVectors(rotateEnd, rotateStart); - - // rotating across whole screen goes 360 degrees around - scope.rotateLeft(((2 * Math.PI * rotateDelta.x) / element.clientWidth) * scope.rotateSpeed); - - // rotating up and down along whole screen attempts to go 360, but limited to 180 - scope.rotateUp(((2 * Math.PI * rotateDelta.y) / element.clientHeight) * scope.rotateSpeed); - - rotateStart.copy(rotateEnd); - } else if (state === STATE.DOLLY) { - if (scope.noZoom === true) return; - - dollyEnd.set(event.clientX, event.clientY); - dollyDelta.subVectors(dollyEnd, dollyStart); - - if (dollyDelta.y > 0) { - scope.dollyIn(); - } else if (dollyDelta.y < 0) { - scope.dollyOut(); - } - - dollyStart.copy(dollyEnd); - } else if (state === STATE.PAN) { - if (scope.noPan === true) return; - - panEnd.set(event.clientX, event.clientY); - panDelta.subVectors(panEnd, panStart); - - scope.pan(panDelta.x, panDelta.y); - - panStart.copy(panEnd); - } - - if (state !== STATE.NONE) scope.update(); - } - - function onMouseUp() /* event */ { - if (scope.enabled === false) return; - - document.removeEventListener("mousemove", onMouseMove, false); - document.removeEventListener("mouseup", onMouseUp, false); - scope.dispatchEvent(endEvent); - state = STATE.NONE; - } - - function onMouseWheel(event) { - if (scope.enabled === false || scope.noZoom === true || state !== STATE.NONE) return; - - event.preventDefault(); - event.stopPropagation(); - - let delta = 0; - - if (event.wheelDelta !== undefined) { - // WebKit / Opera / Explorer 9 - - delta = event.wheelDelta; - } else if (event.detail !== undefined) { - // Firefox - - delta = -event.detail; - } - - if (delta > 0) { - scope.dollyOut(); - } else if (delta < 0) { - scope.dollyIn(); - } - - scope.update(); - scope.dispatchEvent(startEvent); - scope.dispatchEvent(endEvent); - } - - function onKeyDown(event) { - if (scope.enabled === false || scope.noKeys === true || scope.noPan === true) return; - - switch (event.keyCode) { - case scope.keys.UP: - scope.pan(0, scope.keyPanSpeed); - scope.update(); - break; - - case scope.keys.BOTTOM: - scope.pan(0, -scope.keyPanSpeed); - scope.update(); - break; - - case scope.keys.LEFT: - scope.pan(scope.keyPanSpeed, 0); - scope.update(); - break; - - case scope.keys.RIGHT: - scope.pan(-scope.keyPanSpeed, 0); - scope.update(); - break; - } - } - - function touchstart(event) { - if (scope.enabled === false) return; - - switch (event.touches.length) { - case 1: - // one-fingered touch: rotate - - if (scope.noRotate === true) return; - - state = STATE.TOUCH_ROTATE; - - rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); - break; - - case 2: - // two-fingered touch: dolly - - if (scope.noZoom === true) return; - - state = STATE.TOUCH_DOLLY; - - var dx = event.touches[0].pageX - event.touches[1].pageX; - var dy = event.touches[0].pageY - event.touches[1].pageY; - var distance = Math.sqrt(dx * dx + dy * dy); - dollyStart.set(0, distance); - break; - - case 3: - // three-fingered touch: pan - - if (scope.noPan === true) return; - - state = STATE.TOUCH_PAN; - - panStart.set(event.touches[0].pageX, event.touches[0].pageY); - break; - - default: - state = STATE.NONE; - } - - if (state !== STATE.NONE) scope.dispatchEvent(startEvent); - } - - function touchmove(event) { - if (scope.enabled === false) return; - - event.preventDefault(); - event.stopPropagation(); - - const element = scope.domElement === document ? scope.domElement.body : scope.domElement; - - switch (event.touches.length) { - case 1: - // one-fingered touch: rotate - - if (scope.noRotate === true) return; - if (state !== STATE.TOUCH_ROTATE) return; - - rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); - rotateDelta.subVectors(rotateEnd, rotateStart); - - // rotating across whole screen goes 360 degrees around - scope.rotateLeft(((2 * Math.PI * rotateDelta.x) / element.clientWidth) * scope.rotateSpeed); - // rotating up and down along whole screen attempts to go 360, but limited to 180 - scope.rotateUp(((2 * Math.PI * rotateDelta.y) / element.clientHeight) * scope.rotateSpeed); - - rotateStart.copy(rotateEnd); - - scope.update(); - break; - - case 2: - // two-fingered touch: dolly - - if (scope.noZoom === true) return; - if (state !== STATE.TOUCH_DOLLY) return; - - var dx = event.touches[0].pageX - event.touches[1].pageX; - var dy = event.touches[0].pageY - event.touches[1].pageY; - var distance = Math.sqrt(dx * dx + dy * dy); - - dollyEnd.set(0, distance); - dollyDelta.subVectors(dollyEnd, dollyStart); - - if (dollyDelta.y > 0) { - scope.dollyOut(); - } else if (dollyDelta.y < 0) { - scope.dollyIn(); - } - - dollyStart.copy(dollyEnd); - - scope.update(); - break; - - case 3: - // three-fingered touch: pan - - if (scope.noPan === true) return; - if (state !== STATE.TOUCH_PAN) return; - - panEnd.set(event.touches[0].pageX, event.touches[0].pageY); - panDelta.subVectors(panEnd, panStart); - - scope.pan(panDelta.x, panDelta.y); - - panStart.copy(panEnd); - - scope.update(); - break; - - default: - state = STATE.NONE; - } - } - - function touchend() /* event */ { - if (scope.enabled === false) return; - - scope.dispatchEvent(endEvent); - state = STATE.NONE; - } - - this.domElement.addEventListener( - "contextmenu", - function (event) { - event.preventDefault(); - }, - false - ); - this.domElement.addEventListener("mousedown", onMouseDown, false); - this.domElement.addEventListener("mousewheel", onMouseWheel, false); - this.domElement.addEventListener("DOMMouseScroll", onMouseWheel, false); // firefox - - this.domElement.addEventListener("touchstart", touchstart, false); - this.domElement.addEventListener("touchend", touchend, false); - this.domElement.addEventListener("touchmove", touchmove, false); - - window.addEventListener("keydown", onKeyDown, false); - - // force an update at start - this.update(); - }; - - THREE.OrbitControls.prototype = Object.create(THREE.EventDispatcher.prototype); - THREE.OrbitControls.prototype.constructor = THREE.OrbitControls; - }, - {} - ], - 2: [ - function (require, module, exports) { - /** - * Based on https://github.com/mrdoob/three.js/blob/a72347515fa34e892f7a9bfa66a34fdc0df55954/examples/js/exporters/STLExporter.js - * Tested on r68 and r70 - * @author jcarletto / https://github.com/jcarletto27 - * @author kjlubick / https://github.com/kjlubick - * @author kovacsv / http://kovacsv.hu/ - * @author mrdoob / http://mrdoob.com/ - - */ - "use strict"; - - THREE.STLExporter = function () {}; - - THREE.STLExporter.prototype = { - constructor: THREE.STLExporter, - - parse: (function () { - const vector = new THREE.Vector3(); - const normalMatrixWorld = new THREE.Matrix3(); - - return function (scene) { - let output = ""; - - output += "solid exported\n"; - - scene.traverse(function (object) { - if (object instanceof THREE.Mesh) { - const geometry = object.geometry; - const matrixWorld = object.matrixWorld; - const mesh = object; - - if (geometry instanceof THREE.Geometry) { - const vertices = geometry.vertices; - const faces = geometry.faces; - - normalMatrixWorld.getNormalMatrix(matrixWorld); - - for (let i = 0, l = faces.length; i < l; i++) { - const face = faces[i]; - - vector.copy(face.normal).applyMatrix3(normalMatrixWorld).normalize(); - - output += "\tfacet normal " + vector.x + " " + vector.y + " " + vector.z + "\n"; - output += "\t\touter loop\n"; - - const indices = [face.a, face.b, face.c]; - - for (let j = 0; j < 3; j++) { - const vertexIndex = indices[j]; - if (mesh.geometry.skinIndices.length == 0) { - vector.copy(vertices[vertexIndex]).applyMatrix4(matrixWorld); - output += "\t\t\tvertex " + vector.x + " " + vector.y + " " + vector.z + "\n"; - } else { - vector.copy(vertices[vertexIndex]); // .applyMatrix4( matrixWorld ); - - // see https://github.com/mrdoob/three.js/issues/3187 - boneIndices = []; - boneIndices[0] = mesh.geometry.skinIndices[vertexIndex].x; - boneIndices[1] = mesh.geometry.skinIndices[vertexIndex].y; - boneIndices[2] = mesh.geometry.skinIndices[vertexIndex].z; - boneIndices[3] = mesh.geometry.skinIndices[vertexIndex].w; - - weights = []; - weights[0] = mesh.geometry.skinWeights[vertexIndex].x; - weights[1] = mesh.geometry.skinWeights[vertexIndex].y; - weights[2] = mesh.geometry.skinWeights[vertexIndex].z; - weights[3] = mesh.geometry.skinWeights[vertexIndex].w; - - inverses = []; - inverses[0] = mesh.skeleton.boneInverses[boneIndices[0]]; - inverses[1] = mesh.skeleton.boneInverses[boneIndices[1]]; - inverses[2] = mesh.skeleton.boneInverses[boneIndices[2]]; - inverses[3] = mesh.skeleton.boneInverses[boneIndices[3]]; - - skinMatrices = []; - skinMatrices[0] = mesh.skeleton.bones[boneIndices[0]].matrixWorld; - skinMatrices[1] = mesh.skeleton.bones[boneIndices[1]].matrixWorld; - skinMatrices[2] = mesh.skeleton.bones[boneIndices[2]].matrixWorld; - skinMatrices[3] = mesh.skeleton.bones[boneIndices[3]].matrixWorld; - - // this checks to see if the mesh has any morphTargets - jc - if (mesh.geometry.morphTargets !== "undefined") { - morphMatricesX = []; - morphMatricesY = []; - morphMatricesZ = []; - morphMatricesInfluence = []; - - for (var mt = 0; mt < mesh.geometry.morphTargets.length; mt++) { - // collect the needed vertex info - jc - morphMatricesX[mt] = mesh.geometry.morphTargets[mt].vertices[vertexIndex].x; - morphMatricesY[mt] = mesh.geometry.morphTargets[mt].vertices[vertexIndex].y; - morphMatricesZ[mt] = mesh.geometry.morphTargets[mt].vertices[vertexIndex].z; - morphMatricesInfluence[mt] = mesh.morphTargetInfluences[mt]; - } - } - const finalVector = new THREE.Vector4(); - - if (mesh.geometry.morphTargets !== "undefined") { - var morphVector = new THREE.Vector4(vector.x, vector.y, vector.z); - - for (var mt = 0; mt < mesh.geometry.morphTargets.length; mt++) { - // not pretty, but it gets the job done - jc - morphVector.lerp( - new THREE.Vector4(morphMatricesX[mt], morphMatricesY[mt], morphMatricesZ[mt], 1), - morphMatricesInfluence[mt] - ); - } - } - - for (let k = 0; k < 4; k++) { - if (mesh.geometry.morphTargets !== "undefined") { - var tempVector = new THREE.Vector4(morphVector.x, morphVector.y, morphVector.z); - } else { - var tempVector = new THREE.Vector4(vector.x, vector.y, vector.z); - } - tempVector.multiplyScalar(weights[k]); - // the inverse takes the vector into local bone space - // which is then transformed to the appropriate world space - tempVector.applyMatrix4(inverses[k]).applyMatrix4(skinMatrices[k]); - finalVector.add(tempVector); - } - - output += "\t\t\tvertex " + finalVector.x + " " + finalVector.y + " " + finalVector.z + "\n"; - } - } - output += "\t\tendloop\n"; - output += "\tendfacet\n"; - } - } - } - }); - - output += "endsolid exported\n"; - - return output; - }; - })() - }; - - function saveSTL(scene, name) { - const exporter = new THREE.STLExporter(); - const stlString = exporter.parse(scene); - - const blob = new Blob([stlString], { - type: "text/plain" - }); - - saveAs(blob, name + ".stl"); - } - const exporter = new THREE.STLExporter(); - const exportString = function exportString(output, filename) { - const blob = new Blob([output], { - type: "text/plain" - }); - const objectURL = URL.createObjectURL(blob); - - const link = document.createElement("a"); - link.href = objectURL; - link.download = filename || "data.json"; - link.target = "_blank"; - link.click(); - }; - - module.exports.saveSTL = saveSTL; - module.exports.exportString = exportString; - }, - {} - ], - 3: [ - function (require, module, exports) { - "use strict"; - - const device_json = JSON.parse( - '{"name":"My Device","params":{"width":75800,"height":51000},"layers":[{"name":"flow","color":"indigo","params":{"z_offset":0,"flip":false},"features":{"6bb96ad0-3d80-11e5-898a-2de600a0e2af":{"id":"6bb96ad0-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[30000,40000],"radius1":700,"radius2":700,"height":100}},"6bb96ad1-3d80-11e5-898a-2de600a0e2af":{"id":"6bb96ad1-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[40000,40000],"radius1":700,"radius2":700,"height":100}},"6bb96ad2-3d80-11e5-898a-2de600a0e2af":{"id":"6bb96ad2-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[50000,40000],"radius1":700,"radius2":700,"height":100}},"6bb96ad3-3d80-11e5-898a-2de600a0e2af":{"id":"6bb96ad3-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[20000,40000],"radius1":700,"radius2":700,"height":100}},"6bb991e0-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991e0-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[20000,40000],"end":[20000,35000],"width":400,"height":100}},"6bb991e1-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991e1-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[20000,38000],"end":[17000,38000],"width":400,"height":100}},"6bb991e2-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991e2-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[17000,38000],"end":[17000,35000],"width":400,"height":100}},"6bb991e3-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991e3-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[20000,35000],"end":[20000,20000],"width":400,"height":100}},"6bb991e4-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991e4-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[20000,20000],"end":[10000,10000],"width":400,"height":100}},"6bb991e5-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991e5-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[17000,35000],"end":[15000,30000],"width":400,"height":100}},"6bb991e6-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991e6-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[15000,30000],"end":[10000,30000],"width":400,"height":100}},"6bb991e7-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991e7-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[10000,30000],"end":[10000,28000],"width":400,"height":100}},"6bb991e8-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991e8-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[10000,28000],"end":[15000,28000],"width":400,"height":100}},"6bb991e9-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991e9-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[15000,28000],"end":[15000,25000],"width":400,"height":100}},"6bb991ea-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991ea-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[15000,25000],"end":[8000,25000],"width":400,"height":100}},"6bb991eb-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991eb-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[8000,25000],"radius1":700,"radius2":700,"height":100}},"6bb991ec-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991ec-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[10000,10000],"radius1":700,"radius2":700,"height":100}},"6bb991ed-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991ed-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[30000,40000],"end":[30000,20000],"width":400,"height":100}},"6bb991ee-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991ee-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[30000,20000],"end":[20000,10000],"width":400,"height":100}},"6bb991ef-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991ef-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[20000,10000],"radius1":700,"radius2":700,"height":100}},"6bb991f0-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991f0-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[30000,38000],"end":[27000,38000],"width":400,"height":100}},"6bb991f1-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991f1-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[27000,38000],"end":[27000,30000],"width":400,"height":100}},"6bb991f2-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991f2-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[27000,30000],"end":[22000,30000],"width":400,"height":100}},"6bb991f3-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991f3-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[22000,30000],"end":[22000,28000],"width":400,"height":100}},"6bb991f4-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991f4-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[22000,28000],"end":[27000,28000],"width":400,"height":100}},"6bb991f5-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991f5-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[27000,28000],"end":[27000,26000],"width":400,"height":100}},"6bb991f6-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991f6-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[27000,26000],"end":[22000,26000],"width":400,"height":100}},"6bb991f7-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991f7-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[22000,26000],"end":[22000,24000],"width":400,"height":100}},"6bb991f8-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991f8-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[22000,24000],"end":[27000,24000],"width":400,"height":100}},"6bb991f9-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991f9-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[27000,24000],"end":[27000,22000],"width":400,"height":100}},"6bb991fa-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991fa-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[27000,22000],"end":[22000,22000],"width":400,"height":100}},"6bb991fb-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991fb-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[22000,22000],"end":[22000,20000],"width":400,"height":100}},"6bb991fc-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991fc-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[22000,20000],"end":[25000,20000],"width":400,"height":100}},"6bb991fd-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991fd-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[25000,20000],"end":[25000,17000],"width":400,"height":100}},"6bb991fe-3d80-11e5-898a-2de600a0e2af":{"id":"6bb991fe-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[25000,17000],"end":[21000,17000],"width":400,"height":100}},"6bb9b8f0-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8f0-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[21000,17000],"radius1":700,"radius2":700,"height":100}},"6bb9b8f1-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8f1-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[40000,40000],"end":[40000,20000],"width":400,"height":100}},"6bb9b8f2-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8f2-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[40000,20000],"end":[50000,10000],"width":400,"height":100}},"6bb9b8f3-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8f3-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[40000,38000],"end":[43000,38000],"width":400,"height":100}},"6bb9b8f4-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8f4-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[43000,38000],"end":[43000,30000],"width":400,"height":100}},"6bb9b8f5-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8f5-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[43000,30000],"end":[48000,30000],"width":400,"height":100}},"6bb9b8f6-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8f6-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[48000,30000],"end":[48000,28000],"width":400,"height":100}},"6bb9b8f7-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8f7-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[48000,28000],"end":[43000,28000],"width":400,"height":100}},"6bb9b8f8-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8f8-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[43000,28000],"end":[43000,26000],"width":400,"height":100}},"6bb9b8f9-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8f9-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[43000,26000],"end":[48000,26000],"width":400,"height":100}},"6bb9b8fa-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8fa-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[48000,26000],"end":[48000,24000],"width":400,"height":100}},"6bb9b8fb-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8fb-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[48000,24000],"end":[43000,24000],"width":400,"height":100}},"6bb9b8fc-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8fc-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[43000,24000],"end":[43000,22000],"width":400,"height":100}},"6bb9b8fd-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8fd-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[43000,22000],"end":[48000,22000],"width":400,"height":100}},"6bb9b8fe-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8fe-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[48000,22000],"end":[48000,20000],"width":400,"height":100}},"6bb9b8ff-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b8ff-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[48000,20000],"end":[45000,20000],"width":400,"height":100}},"6bb9b900-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b900-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[45000,20000],"end":[45000,17000],"width":400,"height":100}},"6bb9b901-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b901-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[45000,17000],"end":[49000,17000],"width":400,"height":100}},"6bb9b902-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b902-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[50000,10000],"radius1":700,"radius2":700,"height":100}},"6bb9b903-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b903-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[49000,17000],"radius1":700,"radius2":700,"height":100}},"6bb9b904-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b904-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[50000,40000],"end":[50000,20000],"width":400,"height":100}},"6bb9b905-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b905-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[50000,20000],"end":[60000,10000],"width":400,"height":100}},"6bb9b906-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9b906-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[60000,10000],"radius1":700,"radius2":700,"height":100}},"6bb9e000-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e000-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[50000,38000],"end":[53000,38000],"width":400,"height":100}},"6bb9e001-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e001-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[53000,38000],"end":[53000,35000],"width":400,"height":100}},"6bb9e002-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e002-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[53000,35000],"end":[55000,30000],"width":400,"height":100}},"6bb9e003-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e003-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[55000,30000],"end":[60000,30000],"width":400,"height":100}},"6bb9e004-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e004-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[60000,30000],"end":[60000,28000],"width":400,"height":100}},"6bb9e005-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e005-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[60000,28000],"end":[55000,28000],"width":400,"height":100}},"6bb9e006-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e006-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[55000,28000],"end":[55000,25000],"width":400,"height":100}},"6bb9e007-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e007-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[55000,25000],"end":[62000,25000],"width":400,"height":100}},"6bb9e008-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e008-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[62000,25000],"radius1":700,"radius2":700,"height":100}},"6bb9e009-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e009-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[15000,15000],"end":[15000,12000],"width":400,"height":100}},"6bb9e00a-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e00a-3d80-11e5-898a-2de600a0e2af","name":"New Via","type":"Via","params":{"position":[15000,12000],"radius1":800,"radius2":700,"height":1000}},"6bb9e00b-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e00b-3d80-11e5-898a-2de600a0e2af","name":"New Via","type":"Via","params":{"position":[26000,12000],"radius1":800,"radius2":700,"height":1000}},"6bb9e00c-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e00c-3d80-11e5-898a-2de600a0e2af","name":"New Via","type":"Via","params":{"position":[44000,12000],"radius1":800,"radius2":700,"height":1000}},"6bb9e00d-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e00d-3d80-11e5-898a-2de600a0e2af","name":"New Via","type":"Via","params":{"position":[55000,12000],"radius1":800,"radius2":700,"height":1000}},"6bb9e00e-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e00e-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[55000,12000],"end":[55000,15000],"width":400,"height":100}},"6bb9e00f-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e00f-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[26000,12000],"end":[30000,10000],"width":400,"height":100}},"6bb9e010-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e010-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[44000,12000],"end":[40000,10000],"width":400,"height":100}},"6bb9e011-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e011-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[40000,10000],"end":[38000,7000],"width":400,"height":100}},"6bb9e012-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e012-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[30000,10000],"end":[32000,7000],"width":400,"height":100}},"6bb9e013-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e013-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[32000,7000],"radius1":700,"radius2":700,"height":100}},"6bb9e014-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e014-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[38000,7000],"radius1":700,"radius2":700,"height":100}},"6bb9e015-3d80-11e5-898a-2de600a0e2af":{"id":"6bb9e015-3d80-11e5-898a-2de600a0e2af","name":"New CircleValve","type":"CircleValve","params":{"position":[35000,10000],"radius1":1400,"radius2":1200,"height":800}},"6bba0710-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0710-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[35000,10000],"end":[35000,30000],"width":400,"height":100}},"6bba0711-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0711-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[35000,30000],"radius1":700,"radius2":700,"height":100}},"6bba0712-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0712-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[35000,17000],"end":[38000,23000],"width":400,"height":100}},"6bba0713-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0713-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[38000,23000],"end":[36000,25000],"width":400,"height":100}},"6bba0714-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0714-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[36000,25000],"end":[35000,30000],"width":400,"height":100}},"6bba0715-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0715-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[35000,17000],"end":[32000,23000],"width":400,"height":100}},"6bba0716-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0716-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[32000,23000],"end":[34000,25000],"width":400,"height":100}},"6bba0717-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0717-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[34000,25000],"end":[35000,30000],"width":400,"height":100}},"6bba0718-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0718-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[32000,23000],"end":[35000,24000],"width":400,"height":100}},"6bba0719-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0719-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[38000,23000],"end":[35000,24000],"width":400,"height":100}},"6bba071a-3d80-11e5-898a-2de600a0e2af":{"id":"6bba071a-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[25000,20000],"end":[28000,20000],"width":400,"height":100}},"6bba071b-3d80-11e5-898a-2de600a0e2af":{"id":"6bba071b-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[28000,20000],"end":[28000,22000],"width":400,"height":100}},"6bba071c-3d80-11e5-898a-2de600a0e2af":{"id":"6bba071c-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[28000,22000],"end":[27000,22000],"width":400,"height":100}},"6bba071d-3d80-11e5-898a-2de600a0e2af":{"id":"6bba071d-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[45000,20000],"end":[42000,20000],"width":400,"height":100}},"6bba071e-3d80-11e5-898a-2de600a0e2af":{"id":"6bba071e-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[42000,20000],"end":[42000,22000],"width":400,"height":100}},"6bba071f-3d80-11e5-898a-2de600a0e2af":{"id":"6bba071f-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[42000,22000],"end":[44000,22000],"width":400,"height":100}},"8d30ec10-3d80-11e5-898a-2de600a0e2af":{"id":"8d30ec10-3d80-11e5-898a-2de600a0e2af","name":"New Via","type":"Via","params":{"position":[35000,30000],"radius1":800,"radius2":700,"height":1000}},"9b26fd00-3d80-11e5-898a-2de600a0e2af":{"id":"9b26fd00-3d80-11e5-898a-2de600a0e2af","name":"New Via","type":"Via","params":{"position":[32000,20000],"radius1":800,"radius2":700,"height":1000}},"9c3deb40-3d80-11e5-898a-2de600a0e2af":{"id":"9c3deb40-3d80-11e5-898a-2de600a0e2af","name":"New Via","type":"Via","params":{"position":[38000,20000],"radius1":800,"radius2":700,"height":1000}}}},{"name":"control","color":"red","params":{"z_offset":1200,"flip":true},"features":{"6bba0720-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0720-3d80-11e5-898a-2de600a0e2af","name":"New CircleValve","type":"CircleValve","params":{"position":[20000,34000],"radius1":1400,"radius2":1200,"height":800}},"6bba0721-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0721-3d80-11e5-898a-2de600a0e2af","name":"New CircleValve","type":"CircleValve","params":{"position":[30000,34000],"radius1":1400,"radius2":1200,"height":800}},"6bba0722-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0722-3d80-11e5-898a-2de600a0e2af","name":"New CircleValve","type":"CircleValve","params":{"position":[40000,34000],"radius1":1400,"radius2":1200,"height":800}},"6bba0723-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0723-3d80-11e5-898a-2de600a0e2af","name":"New CircleValve","type":"CircleValve","params":{"position":[50000,34000],"radius1":1400,"radius2":1200,"height":800}},"6bba0724-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0724-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[20000,34000],"end":[24000,34000],"width":400,"height":100}},"6bba0725-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0725-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[24000,34000],"end":[24000,47000],"width":400,"height":100}},"6bba0726-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0726-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[30000,34000],"end":[34000,34000],"width":400,"height":100}},"6bba0727-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0727-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[34000,34000],"end":[34000,47000],"width":400,"height":100}},"6bba0728-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0728-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[40000,34000],"end":[37000,34000],"width":400,"height":100}},"6bba0729-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0729-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[37000,34000],"end":[36000,34000],"width":400,"height":100}},"6bba072a-3d80-11e5-898a-2de600a0e2af":{"id":"6bba072a-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[36000,34000],"end":[36000,47000],"width":400,"height":100}},"6bba072b-3d80-11e5-898a-2de600a0e2af":{"id":"6bba072b-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[50000,34000],"end":[46000,34000],"width":400,"height":100}},"6bba072c-3d80-11e5-898a-2de600a0e2af":{"id":"6bba072c-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[46000,34000],"end":[46000,47000],"width":400,"height":100}},"6bba072d-3d80-11e5-898a-2de600a0e2af":{"id":"6bba072d-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[24000,47000],"radius1":700,"radius2":700,"height":100}},"6bba072e-3d80-11e5-898a-2de600a0e2af":{"id":"6bba072e-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[34000,47000],"radius1":700,"radius2":700,"height":100}},"6bba072f-3d80-11e5-898a-2de600a0e2af":{"id":"6bba072f-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[36000,47000],"radius1":700,"radius2":700,"height":100}},"6bba0730-3d80-11e5-898a-2de600a0e2af":{"id":"6bba0730-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[46000,47000],"radius1":700,"radius2":700,"height":100}},"6bba2e20-3d80-11e5-898a-2de600a0e2af":{"id":"6bba2e20-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[15000,12000],"end":[26000,12000],"width":400,"height":100}},"6bba2e21-3d80-11e5-898a-2de600a0e2af":{"id":"6bba2e21-3d80-11e5-898a-2de600a0e2af","name":"New Channel","type":"Channel","params":{"start":[44000,12000],"end":[55000,12000],"width":400,"height":100}},"6bba2e22-3d80-11e5-898a-2de600a0e2af":{"id":"6bba2e22-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[15000,12000],"radius1":700,"radius2":700,"height":100}},"6bba2e23-3d80-11e5-898a-2de600a0e2af":{"id":"6bba2e23-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[26000,12000],"radius1":700,"radius2":700,"height":100}},"6bba2e24-3d80-11e5-898a-2de600a0e2af":{"id":"6bba2e24-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[44000,12000],"radius1":700,"radius2":700,"height":100}},"6bba2e25-3d80-11e5-898a-2de600a0e2af":{"id":"6bba2e25-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[55000,12000],"radius1":700,"radius2":700,"height":100}},"6bba2e26-3d80-11e5-898a-2de600a0e2af":{"id":"6bba2e26-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[25000,21000],"radius1":700,"radius2":700,"height":100}},"6bba2e27-3d80-11e5-898a-2de600a0e2af":{"id":"6bba2e27-3d80-11e5-898a-2de600a0e2af","name":"New Port","type":"Port","params":{"position":[45000,21000],"radius1":700,"radius2":700,"height":100}}}}],"groups":[],"defaults":{}}' - ); - - module.exports = device_json; - }, - {} - ], - 4: [ - function (require, module, exports) { - "use strict"; - - const OrbitControls = require("./OrbitControls"); - const device_json = require("./device_json"); - const STLExporter = require("./STLExporter"); - const saveSTL = STLExporter.saveSTL; - - const container = document.getElementById("renderContainer"); - let camera, controls, scene, renderer; - - const redMaterial = new THREE.MeshLambertMaterial({ color: 0xf44336, shading: THREE.FlatShading }); - const blueMaterial = new THREE.MeshLambertMaterial({ color: 0x3f51b5, shading: THREE.FlatShading }); - const whiteMaterial = new THREE.MeshBasicMaterial({ color: 0xffffff, shading: THREE.FlatShading }); - const purpleMaterial = new THREE.MeshLambertMaterial({ color: 0x673ab7, shading: THREE.FlatShading }); - const greyMaterial = new THREE.MeshLambertMaterial({ color: 0x9e9e9e, shading: THREE.FlatShading }); - const slideMaterial = new THREE.MeshLambertMaterial({ color: 0xffffff, opacity: 0.1, transparent: true }); - const holderMaterial = greyMaterial; - const groundMaterial = new THREE.MeshBasicMaterial({ color: 0x414141, shading: THREE.FlatShading }); - const backgroundColor = 0xeeeeee; - - const INTERLOCK_TOLERANCE = 0.125; - const HOLDER_BORDER_WIDTH = 0.41; - const SLIDE_Z_OFFSET = 1.2; - const HOLDER_SKIRT_WIDTH = 0.8; - const HOLDER_SKIRT_HEIGHT = 0.2; - const CORNER_DISTANCE = 10; - const SLIDE_THICKNESS = 1.2; - - let mockup = null; - const mockupScene = null; - let layers = null; - - const layerMaterials = { - indigo: blueMaterial, - red: redMaterial, - purple: purpleMaterial, - grey: greyMaterial - }; - - function getFeatureMaterial(feature, layer) { - const colorString = layer.color; - if (colorString && layerMaterials.hasOwnProperty(colorString)) { - return layerMaterials[colorString]; - } else return layerMaterials.grey; - } - - init(); - render(); - loadJSON(device_json); - - function loadJSON(json) { - sanitizeJSON(json); - mockup = renderMockup(json); - layers = renderLayers(json); - showMockup(json); - // showLayer(0); - } - - function showLayer(index) { - scene.add(layers[index]); - render(); - // saveSTL(scene, "layer"); - } - - function showMockup(json) { - scene.add(mockup); - render(); - // saveSTL(scene, "test"); - } - - function renderFeatures(layer, z_offset) { - const renderedFeatures = new THREE.Group(); - for (const featureID in layer.features) { - const feature = layer.features[featureID]; - renderedFeatures.add(renderFeature(feature, layer, z_offset)); - } - return renderedFeatures; - } - - function renderFeature(feature, layer, z_offset) { - const type = feature.type; - let renderedFeature; - - if (type == "Channel") renderedFeature = Channel(feature, layer, z_offset); - else if (type == "CircleValve") renderedFeature = CircleValve(feature, layer, z_offset); - else if (type == "Via") renderedFeature = Via(feature, layer, z_offset); - else if (type == "Port") renderedFeature = Port(feature, layer, z_offset); - else console.log("Feature type not recognized: " + type); - - return renderedFeature; - } - - function renderLayers(json) { - const renderedLayers = []; - for (let i = 0; i < json.layers.length; i++) { - renderedLayers.push(renderLayer(json, i)); - } - return renderedLayers; - } - - function renderLayer(json, layerIndex) { - console.log("Rendering layer: " + layerIndex); - const width = json.params.width; - const height = json.params.height; - const layer = json.layers[layerIndex]; - const renderedFeatures = new THREE.Group(); - const renderedLayer = new THREE.Group(); - renderedFeatures.add(renderFeatures(layer, 0)); - if (layer.params.flip) { - flipLayer(renderedFeatures, height, layer.params.z_offset); - } - renderedLayer.add(renderedFeatures); - renderedLayer.add(SlideHolder(width, height, SLIDE_THICKNESS, true)); - return renderedLayer; - } - - function flipLayer(layer, height, z_offset) { - layer.rotation.x += Math.PI; - layer.position.y += height; - layer.position.z += z_offset; - } - - function renderMockup(json) { - mockup = null; - const renderedMockup = new THREE.Group(); - const layers = json.layers; - for (let i = 0; i < layers.length; i++) { - const layer = layers[i]; - const renderedLayer = renderFeatures(layer, layer.params.z_offset); - renderedMockup.add(renderedLayer); - } - const renderedHolder = SlideHolder(json.params.width, json.params.height, SLIDE_THICKNESS, true); - renderedMockup.add(renderedHolder); - return renderedMockup; - } - - function animate() { - requestAnimationFrame(animate); - controls.update(); - } - - function init() { - camera = new THREE.PerspectiveCamera(60, container.clientWidth / container.clientHeight, 1, 1000); - camera.position.z = 100; - controls = new THREE.OrbitControls(camera); - controls.damping = 0.2; - controls.addEventListener("change", render); - - scene = new THREE.Scene(); - - const slide = Slide(70, 50, 1); - slide.position.z -= 1; - // scene.add(slide); - - // world - - const flow = { - params: { - z_offset: 0, - flip: false - }, - color: "indigo" - }; - - const control = { - params: { - z_offset: 1, - flip: true - }, - color: "red" - }; - - const via = { - params: { - position: [5, 10], - height: 0.6, - radius1: 0.6, - radius2: 0.4 - } - }; - - const channel = { - params: { - start: [0, 0], - end: [10, 10], - height: 0.4, - width: 0.6 - } - }; - - const boxGeom = new THREE.BoxGeometry(1, 1, 1); - - const viaMesh = Via(via, control); - const channelMesh = Channel(channel, flow); - - const group = new THREE.Group(); - - // console.log(viaMesh.geometry); - - // scene.add(viaMesh); - // scene.add(channelMesh); - - // lights - const light1 = new THREE.DirectionalLight(0xffffff); - light1.position.set(1, 1, 1); - scene.add(light1); - - const light2 = new THREE.DirectionalLight(0x002288); - light2.position.set(-1, -1, -1); - scene.add(light2); - - const light3 = new THREE.AmbientLight(0x222222); - scene.add(light3); - - // renderer - - renderer = new THREE.WebGLRenderer({ antialias: true }); - renderer.setSize(container.clientWidth, container.clientHeight); - renderer.setClearColor(backgroundColor, 1); - - container.appendChild(renderer.domElement); - - window.addEventListener("resize", onWindowResize, false); - - // controls.update(); - - // scene.remove(slide); - // saveSTL(scene, "foo"); - // scene.add(slide); - - // setupCamera(35,25,50.8, 500); - } - - function onWindowResize() { - camera.aspect = container.clientWidth / container.clientHeight; - camera.updateProjectionMatrix(); - renderer.setSize(container.clientWidth, container.clientHeight); - render(); - } - - function render() { - renderer.render(scene, camera); - } - - function setupCamera(centerX, centerY, deviceHeight, pixelHeight) { - camera.position.z = getCameraDistance(deviceHeight, pixelHeight); - controls.panLeft(-centerX); - controls.panUp(-centerY + deviceHeight); - controls.update(); - } - - function DevicePlane(width, height, offset) { - const plane = new THREE.PlaneBufferGeometry(width, height); - const material = whiteMaterial; - const mesh = new THREE.Mesh(plane, material); - const matrix = new THREE.Matrix4(); - mesh.geometry.applyMatrix(matrix.makeTranslation(width / 2, height / 2, -offset)); - return mesh; - } - - function GroundPlane(width, height) { - const plane = new THREE.PlaneGeometry(width, height); - const material = groundMaterial; - const mesh = new THREE.Mesh(plane, material); - return mesh; - } - - function Via(via, layer, z_offset) { - const radius1 = via.params.radius1; - const radius2 = via.params.radius2; - const height = via.params.height; - const position = via.params.position; - var z_offset = layer.params.z_offset; - const flip = layer.params.flip; - const geom = ConeFeature(position, radius1, radius2, height, flip, z_offset); - const material = getFeatureMaterial(via, layer); - const mesh = new THREE.Mesh(geom, material); - return mesh; - } - - function Port(port, layer, z_offset) { - const radius1 = port.params.radius1; - const radius2 = port.params.radius2; - const height = port.params.height; - const position = port.params.position; - var z_offset = layer.params.z_offset; - const flip = layer.params.flip; - const geom = ConeFeature(position, radius1, radius2, height, flip, z_offset); - const material = getFeatureMaterial(port, layer); - const mesh = new THREE.Mesh(geom, material); - return mesh; - } - - function CircleValve(circleValve, layer, z_offset) { - const radius1 = circleValve.params.radius1; - const radius2 = circleValve.params.radius2; - const height = circleValve.params.height; - const position = circleValve.params.position; - var z_offset = layer.params.z_offset; - const flip = layer.params.flip; - const geom = ConeFeature(position, radius1, radius2, height, flip, z_offset); - const material = getFeatureMaterial(circleValve, layer); - const mesh = new THREE.Mesh(geom, material); - return mesh; - } - - function ConeFeature(position, radius1, radius2, height, flip, z_offset) { - const cone = Cone(position, radius1, radius2, height); - const matrix = new THREE.Matrix4(); - if (flip) { - cone.applyMatrix(matrix.makeRotationX(Math.PI)); - cone.applyMatrix(matrix.makeTranslation(0, position[1] * 2, 0)); - } - cone.applyMatrix(matrix.makeTranslation(0, 0, z_offset)); - return cone; - } - - function TwoPointBoxFeature(start, end, width, height, flip, z_offset) { - const box = TwoPointRoundedBox(start, end, width, height); - const matrix = new THREE.Matrix4(); - - if (flip) { - box.applyMatrix(matrix.makeTranslation(0, 0, -height)); - } - box.applyMatrix(matrix.makeTranslation(0, 0, z_offset)); - return box; - } - - function Channel(channel, layer, z_offset) { - const start = channel.params.start; - const end = channel.params.end; - const width = channel.params.width; - const height = channel.params.height; - const flip = layer.params.flip; - var z_offset = layer.params.z_offset; - const geom = TwoPointBoxFeature(start, end, width, height, flip, z_offset); - const material = getFeatureMaterial(channel, layer); - const mesh = new THREE.Mesh(geom, material); - return mesh; - } - - function Cone(position, radius1, radius2, height) { - const cyl = new THREE.CylinderGeometry(radius2, radius1, height, 16); - const material = redMaterial; - const matrix = new THREE.Matrix4(); - cyl.applyMatrix(matrix.makeRotationX(Math.PI / 2)); - cyl.applyMatrix(matrix.makeTranslation(position[0], position[1], height / 2)); - return cyl; - } - - function TwoPointBox(start, end, width, height) { - const dX = end[0] - start[0]; - const dY = end[1] - start[1]; - const boxAngle = Math.atan2(dY, dX); - const dXPow = Math.pow(dX, 2); - const dYPow = Math.pow(dY, 2); - const length = Math.sqrt(dXPow + dYPow); - const material = blueMaterial; - const box = new THREE.BoxGeometry(length, width, height); - const matrix = new THREE.Matrix4(); - box.applyMatrix(matrix.makeRotationZ(boxAngle)); - box.applyMatrix(matrix.makeTranslation(start[0], start[1], height / 2)); - box.applyMatrix(matrix.makeTranslation(dX / 2, dY / 2, 0)); - return box; - } - - function Slide(width, height, thickness) { - const group = new THREE.Group(); - const slide = new THREE.BoxGeometry(width, height, thickness); - const material = slideMaterial; - const matrix = new THREE.Matrix4(); - slide.applyMatrix(matrix.makeTranslation(width / 2, height / 2, -thickness / 2)); - const mesh = new THREE.Mesh(slide, material); - group.add(mesh); - group.add(DevicePlane(width, height, thickness + 0.001)); - return group; - } - - function SlideHolder(width, height, thickness, slide) { - const renderedHolder = new THREE.Group(); - if (slide) { - renderedHolder.add(Slide(width, height, thickness)); - } - return renderedHolder; - } - - function TwoPointRoundedBox(start, end, width, height) { - const box = TwoPointBox(start, end, width, height); - const cone1 = Cone(start, width / 2, width / 2, height); - const cone2 = Cone(end, width / 2, width / 2, height); - const merged = mergeGeometries([box, cone1, cone2]); - return merged; - } - - function mergeGeometries(geometries) { - const merged = new THREE.Geometry(); - for (let i = 0; i < geometries.length; i++) { - merged.merge(geometries[i]); - } - return merged; - } - - function sanitizeJSON(json) { - sanitizeParams(json.params); - for (let i = 0; i < json.layers.length; i++) { - sanitizeParams(json.layers[i].params, json.params.height); - for (const key in json.layers[i].features) { - sanitizeParams(json.layers[i].features[key].params, json.params.height); - } - } - } - - function sanitizeParams(params, height) { - for (const key in params) { - if (key == "start" || key == "end" || key == "position") { - const pos = params[key]; - params[key] = [pos[0] / 1000, height - pos[1] / 1000]; - } else { - params[key] = params[key] / 1000; - } - } - } - - function computeHeightInPixels(objectHeight, distance) { - const vFOV = (camera.fov * Math.PI) / 180; // - const height = 2 * Math.tan(vFOV / 2) * distance; // visible height - const ratio = objectHeight / height; - const pixels = container.clientHeight * ratio; - return pixels; - } - - function getCameraDistance(objectHeight, pixelHeight) { - const vFOV = (camera.fov * Math.PI) / 180; - const ratio = pixelHeight / container.clientHeight; - const height = objectHeight / ratio; - const distance = height / (2 * Math.tan(vFOV / 2)); - return distance; - } - }, - { "./OrbitControls": 1, "./STLExporter": 2, "./device_json": 3 } - ] - }, - {}, - [4] -); diff --git a/src/App.vue b/src/App.vue deleted file mode 100644 index 355a12a5..00000000 --- a/src/App.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/src/app/core/component.ts b/src/app/core/component.ts deleted file mode 100644 index 4b6677f4..00000000 --- a/src/app/core/component.ts +++ /dev/null @@ -1,584 +0,0 @@ -import Params from "./params"; -import CustomComponent from "./customComponent"; -import ComponentPort from "./componentPort"; -import * as FeatureRenderer2D from "../view/render2D/featureRenderer2D"; -import Port from "../library/port"; -import { ComponentPortInterchangeV1, ComponentInterchangeV1, Point } from "./init"; -import ComponentUtils from "../utils/componentUtils"; -import { ComponentAPI } from "@/componentAPI"; -import MapUtils from "../utils/mapUtils"; - -/** - * This class contains the component abstraction used in the interchange format and the - * high level device model of the microfluidic. - */ -export default class Component { - protected _params: Params; - protected _name: string; - protected _id: string; - protected _entity: string; - protected _featureIDs: Array; - protected _bounds: paper.Rectangle | null; - protected _placed: boolean; - protected _ports: Map; - protected _componentPortTRenders: Map; - protected _xspan: number; - protected _yspan: number; - - protected _renderOffset: Point; - /** - * Default Constructor - * @param {string} type - * @param {Params} params - * @param {String} name - * @param {string} mint - * @param {String} id - */ - constructor(params: Params, name: string, mint: string, id: string = ComponentAPI.generateID()) { - this._params = params; - this._name = name; - this._id = id; - this._entity = mint; - // This stores the features that are a part of the component - this._featureIDs = []; - // TODO: Need to figure out how to effectively search through these - this._bounds = null; - this._placed = false; - this._ports = new Map(); - this._componentPortTRenders = new Map(); - - // TODO - Figure out how to use this for generic components - this._xspan = 0; - this._yspan = 0; - this._renderOffset = [0, 0]; - - // Create and set the ports here itself - - const cleanparamdata = this._params.toMap(); - if ((mint !== "" && mint !== "TEXT") || mint === null) { - const ports = ComponentAPI.getComponentPorts(cleanparamdata, mint); - if (ports != undefined && ports.length >= 0 && ports !== null) { - for (const port of ports) { - this.setPort(port.label, port); - } - } - } else { - console.warn("Component mint is empty"); - } - } - - /** - * Returns the mint type of the component - * - * @readonly - * @type {string} - * @memberof Component - */ - get mint(): string { - return this._entity; - } - - /** - * Returns the offset value of the component - * @type {[number, number]} - * @memberof Component - */ - get offset(): [number, number] { - return this._renderOffset; - } - - /** - * Gets the ports of the component - * @returns {Map()} Returns ports of the component - * @memberof Component - */ - get ports(): Map { - return this._ports; - } - - /** - * Sets the port of the component - * @param {} value - * @returns {void} - * @memberof Component - */ - set ports(value) { - this._ports = value; - } - - /** - * Gets the place of the component - * @returns {Boolean} Returns the place of the component - * @memberof Component - */ - get placed(): boolean { - return this._placed; - } - - /** - * Sets the place - * @param {Boolean} value - * @returns {void} - * @memberof Component - */ - set placed(value: boolean) { - this._placed = value; - } - - /** - * Returns an array of strings that are the feature ids of the component - * @return {Array} Returns an array with the features - * @memberof Component - */ - get featureIDs(): Array { - return this._featureIDs; - } - - /** - * Sets the bounds i.e. the x,y position and the width and length of the component - * @param {Object} bounds PaperJS Rectangle object associated with a Path.bounds property - * @memberof Component - * @returns {void} - */ - setBounds(bounds: paper.Rectangle): void { - this._bounds = bounds; - const topleftpt = bounds.topLeft; - this._params.updateParameter("position", [topleftpt.x, topleftpt.y]); - this._params.updateParameter("xspan", bounds.width); - this._params.updateParameter("yspan", bounds.height); - } - - /** - * Updates the parameters stored by the component - * @param {String} key Key to identify the parameter - * @param {} value New value to be assign in the feature - * @memberof Component - * @returns {void} - */ - updateParameter(key: string, value: any): void { - if (key == "position") console.error("Use updateComponentPosition instead of updateParameter when changing position"); - this._params.updateParameter(key, value); - for (const featureid of this._featureIDs) { - - // Get the feature id and modify it - const feature = ComponentUtils.getFeatureFromID(featureid); - feature.updateParameter(key, value); - } - - // Update component position - const featPos = ComponentUtils.getFeatureFromID(this._featureIDs[0]).getValue("position"); - // Update position (top-left corner) - this.setPosition(); - // Update offset - this.setOffset(); - // Update the ComponentPorts - this.updateComponentPorts(); - } - - /** - * Generates the object that needs to be serialzed into JSON for interchange format V1 - * @returns {ComponentInterchangeV1} Object - * @memberof Component - */ - toInterchangeV1(): ComponentInterchangeV1 { - const bounds = this.getBoundingRectangle(); - - const portdata: Array = []; - const map: Map = this.ports; - if (map !== null) { - for (const key of map.keys()) { - let part: ComponentPort | undefined = map.get(key); - if (part != undefined) { - let p = part.toInterchangeV1(); - portdata.push(p); - } - } - } - - const output: ComponentInterchangeV1 = { - id: this._id, - name: this._name, - entity: this._entity, - params: this._params.toJSON(), - "x-span": this._xspan, - "y-span": this._yspan, - ports: portdata, - layers: this.findLayerReferences() - }; - - return output; - } - - private findLayerReferences(): Array { - const layers = ComponentUtils.getDeviceLayers(); - const layerrefs = []; - let layer; - for (const layer of layers) { - // Check if the component is in layer then put it there - let feature; - for (const key in layer.features) { - feature = layer.features[key]; - if (feature.referenceID == this.id) { - layerrefs.push(layer.id); - } - } - } - return layerrefs; - } - - /** - * Returns the ID of the component - * @returns {string} - * @memberof Component - */ - get id() { - return this._id; - } - - /** - * Allows the user to set the name of the component - * @param {string} name - * @returns {void} - * @memberof Component - * - */ - set name(name: string) { - this._name = name; - } - - /** - * Returns the name of the component - * @returns {string} - * @memberof Component - */ - get name() { - return this._name; - } - - /** - * Returns an Array of size two containing the X and Y coordinates - * @return {Point} - * @memberof Component - */ - getPosition(): Point { - return this._params.getValue("position"); - } - - /** - * Returns the value of the parameter stored against the following key in the component params - * @param {string} key Key to access the value - * @returns {*} Returns the value or an error - * @memberof Component - */ - getValue(key: string): any { - try { - return this._params.getValue(key); - } catch (err) { - throw new Error("Unable to get value for key: " + key); - } - } - - /** - * Adds a feature that is associated with the component - * @param {String} featureID String id of the feature - * @memberof Component - * @returns {void} - */ - addFeatureID(featureID: string): void { - this._featureIDs.push(featureID); - // Now update bounds - // this.__updateBounds(); - } - - /** - * This method updates the bounds of the component - * @private - * @memberof Component - * @returns {void} - */ - private updateBounds(): void { - let bounds = null; - let feature = null; - let renderedfeature = null; - for (const featureid of this._featureIDs) { - // gets teh feature defined by the id - feature = ComponentUtils.getFeatureFromID(featureid); - renderedfeature = FeatureRenderer2D.renderFeature(feature, null); - if (bounds === null) { - bounds = renderedfeature.bounds; - } else { - bounds = bounds.unite(renderedfeature.bounds); - } - } - this._bounds = bounds; - } - - /** - * Gets the params associated with the component - * @return {Params} Returns the params associated with the component - * @memberof Component - */ - get params(): Params { - return this._params; - } - - /** - * Returns a paper.Rectangle object that defines the bounds of the component - * @return {Object} - * @memberof Component - */ - getBoundingRectangle(): paper.Rectangle { - if (this._featureIDs.length == 0 || this._featureIDs === null || this._featureIDs == undefined) { - console.error("No features associated with the component"); - } - let bounds = null; - for (const featureid of this._featureIDs) { - const render = ComponentUtils.getRenderedFeature(featureid); - if (bounds && render) { - bounds = bounds.unite(render.bounds); - } else { - bounds = render.bounds; - } - } - if (bounds !== null) return bounds; - else throw new Error("Component " + this._name + " " + this._id + " cannot have bounds of null"); - } - - /** - * Updates the coordinates of the component and all the connected features - * based on the position from which the features are drawn - * @param {Point} center - * @memberof Component - * @returns {void} - */ - updateComponentPosition(center: Point): void { - console.log("input position: ", center); - // Update component - this._params.updateParameter("position", [center[0] + this._renderOffset[0], center[1] + this._renderOffset[1]]); - // Update features - for (const featureidtochange of this._featureIDs) { - - const feature = ComponentUtils.getFeatureFromID(featureidtochange); - feature.updateParameter("position", center); - } - // Update the ComponentPorts - this.updateComponentPorts(); - } - - setInitialOffset(): void { - const rect = this.getBoundingRectangle(); - this._renderOffset = [rect.x, rect.y]; - } - - setOffset():void { - const rect = this.getBoundingRectangle(); - const featPos = ComponentUtils.getFeatureFromID(this._featureIDs[0]).getValue("position"); - this._renderOffset = [rect.x - featPos[0], rect.y - featPos[1]]; - } - - setPosition():void { - this._params.updateParameter("position", this.getTopLeftPosition()); - } - - - /** - * Replicates the component at the given positions - * @param {Number} xpos Integer location of X - * @param {Number} ypos Integer location of Y - * @param {string} name Name of the replicated component - * @return {Component} - * @memberof Component - */ - replicate(xpos: number, ypos: number, name: string = ComponentUtils.generateDeviceName(this._entity)): Component { - // TODO: Fix this ridiculous chain of converting params back and forth, there should be an easier way - // Converting all the params into raw values - // let paramvalues = {}; - // for(let key in this._params.parameters){ - // paramvalues[key] = this.getValue(key); - // } - - const definition = ComponentAPI.getDefinitionForMINT(this._entity); - if (definition === null) { - throw new Error("Unable to find definition for component type: " + this._entity); - } - // Clean Param Data - const cleanparamdata = this._params.parameters; - const unique_map = MapUtils.toMap(definition.unique); - const heritable_map = MapUtils.toMap(definition.heritable); - const replicaparams = new Params(cleanparamdata, unique_map, heritable_map); - const ret = new Component(replicaparams, name, this._entity); - console.log("Checking what the new component params are:", ret._params); - // Generate New features - for (const featureid of this._featureIDs) { - const feature = ComponentUtils.getFeatureFromID(featureid); - const replica = feature.replicate(this.getPosition()[0], this.getPosition()[1]); - replica.referenceID = ret.id; - ret.featureIDs.push(replica.ID); - - // TODO: add new feature to the layer in which the current feature is in - const currentlayer = ComponentUtils.getDeviceLayerFromID(featureid); - currentlayer.addFeature(replica); - } - console.warn("TODO: Generate renders for the new Features for this new component"); - ret.updateComponentPosition([xpos, ypos]); - return ret; - } - - /** - * Returns the center position of the component as a 2D vector - * @return {Array} - * @memberof Component - */ - getCenterPosition(): Point { - const bounds = this.getBoundingRectangle(); - return [bounds.center.x, bounds.center.y]; - } - - /** - * Returns the topleft position of the component as a 2D vector - * @return {Array} - * @memberof Component - */ - getTopLeftPosition(): Point { - const bounds = this.getBoundingRectangle(); - return [bounds.topLeft.x, bounds.topLeft.y]; - } - - /** - * This method is used to import the component from Interchange V1 JSON - * @param {} json - * @returns {*} - * @memberof component - */ - static fromInterchangeV1(json: ComponentInterchangeV1): Component { - // let set; - // if (json.hasOwnProperty("set")) set = json.set; - // else set = "Basic"; - // //TODO: This will have to change soon when the thing is updated - // throw new Error("Need to implement Interchange V1 Import for component object"); - const iscustomcompnent = false; - const name = json.name; - const id = json.id; - const entity = json.entity; - - // Idk whether this is correct - // It was originially this._span = this.span which threw several errors so I patterned in off the above const var - const xspan = json["x-span"]; - const yspan = json["y-span"]; - - const params = json.params; - - // TODO - remove this dependency - // iscustomcompnent = Registry.viewManager.customComponentManager.hasDefinition(entity); - - let definition; - - if (iscustomcompnent) { - definition = CustomComponent.defaultParameterDefinitions(); - } else { - definition = ComponentAPI.getDefinitionForMINT(entity); - } - - if (definition === null) { - throw Error("Could not find definition for type: " + entity); - } - - let type; - let value; - for (const key in json.params) { - if (Object.prototype.hasOwnProperty.call(definition.heritable, key)) { - type = definition.heritable[key]; - } else if (Object.prototype.hasOwnProperty.call(definition.unique, key)) { - type = definition.unique[key]; - } - // let paramobject = Parameter.generateComponentParameter(key, json.params[key]); - // Check if the value type is float and convert the value from string - value = json.params[key]; - if (type === "Float" && typeof value === "string") { - value = parseFloat(value); - } - - // let paramobject = new Parameter(type, value); - params[key] = value; - } - - // Do another check and see if position is present or not - if (!Object.prototype.hasOwnProperty.call(params, "position")) { - params.position = [0.0, 0.0]; - } - const unique_map = MapUtils.toMap(definition.unique); - const heritable_map = MapUtils.toMap(definition.heritable); - const paramstoadd = new Params(params, unique_map, heritable_map); - const component = new Component(paramstoadd, name, entity, id); - - // Deserialize the component ports - const portdata = new Map(); - for (const port of json.ports) { - const componentport = ComponentPort.fromInterchangeV1(port); - portdata.set(componentport.label, componentport); - } - - component.ports = portdata; - - return component; - } - - /** - * Set port for the component - * @param {string} label - * @param {Port} port - * @memberof Component - * @returns {void} - */ - setPort(label: string, port: ComponentPort): void { - this._ports.set(label, port); - } - - /** - * Gets the rotation of the component - * @returns {Number} Returns the degree of rotation - * @memberof Component - */ - getRotation(): number { - if (this._params.hasParam("rotation")) { - return this.getValue("rotation"); - } else if (this._params.hasParam("orientation")) { - const orientation = this.getValue("orientation"); - if (orientation === "V") { - return 0; - } else { - return 270; - } - } else { - console.warn("Returning rotation = 0 since no rotation was found for component: ", this); - return 0; - } - } - - /** - * - * @param {string} label - * @param {any} render - * @returns {void} - * @memberof Component - */ - attachComponentPortRender(label: string, render: any): void { - this._componentPortTRenders.set(label, render); - } - - /** - * Updates the Component Ports to have the latest location information - * @memberof Component - * @returns {void} - */ - updateComponentPorts(): void { - // updating the Component Ports - const cleanparamdata = this.params.toMap(); - const currPos: [number, number] = cleanparamdata.get("position"); - cleanparamdata.set("position", [currPos[0] - this._renderOffset[0], currPos[1] - this._renderOffset[1]]); - const ports = ComponentAPI.getComponentPorts(cleanparamdata, this._entity); - for (const port of ports) { - this.setPort(port.label, port); - } - } -} diff --git a/src/app/core/componentPort.ts b/src/app/core/componentPort.ts deleted file mode 100644 index 420220fb..00000000 --- a/src/app/core/componentPort.ts +++ /dev/null @@ -1,169 +0,0 @@ -import uuid from "node-uuid"; -import paper from "paper"; -import Component from "./component"; -import { ComponentPortInterchangeV1, LogicalLayerType, Point } from "./init"; - -export default class ComponentPort { - protected _id: string; - protected _x: number; - protected _y: number; - protected _label: string; - protected _layer: LogicalLayerType; - - /** - * Default constructor for ComponentPorts - * @param {Number} x X coordinate - * @param {Number} y Y coordinate - * @param {String} label Name of the component - * @param {string} layer - */ - constructor(x: number, y: number, label: string, layer: LogicalLayerType) { - this._id = uuid.v1(); - this._x = x; - this._y = y; - this._label = label; - this._layer = layer; - } - - /** - * Gets the layer of the component port - * @returns {string} Returns layer - * @memberof ComponentPort - */ - get layer() { - return this._layer; - } - - /** - * Sets the layer - * @param {string} value Value of the layer - * @memberof ComponentPort - * @returns {void} - */ - set layer(value) { - this._layer = value; - } - - /** - * Gets the label - * @returns {string} Returns the label of the component port - * @memberof ComponentPort - */ - get label() { - return this._label; - } - - /** - * Sets the label of the component port - * @param {string} value Label - * @memberof ComponentPort - * @returns {void} - */ - set label(value) { - this._label = value; - } - - /** - * Gets the Y coordinate of the component port - * @returns {number} Returns the y coordinate - * @memberof ComponentPort - */ - get y() { - return this._y; - } - - /** - * Sets the Y coordinate of the component port - * @param {number} y Value of the Y coordinate - * @memberof ComponentPort - * @returns {void} - */ - set y(value) { - this._y = value; - } - - /** - * Gets the X coordinate of the component port - * @returns {number} Returns the X coordinate - * @memberof ComponentPort - */ - get x() { - return this._x; - } - - /** - * Sets the X coordinate of the component port - * @param {number} value Value of the X coordinate - * @returns {void} - * @memberof ComponentPort - */ - set x(value) { - this._x = value; - } - - /** - * Gets the ID of the component port - * @returns {string} Returns the ID - * @memberof ComponentPort - */ - get id() { - return this._id; - } - - /** - * Set the ID of the component port - * @param {string} value ID - * @memberof ComponentPort - * @returns {void} - */ - set id(value) { - this._id = value; - } - - /** - * Converts to Interchange V1 format - * @returns {Object} Returns a object with Interchange V1 format - * @memberof ComponentPort - */ - toInterchangeV1(): ComponentPortInterchangeV1 { - return { - x: this._x, - y: this._y, - layer: this._layer, - label: this._label - }; - } - - /** - * Returns the absolute postition of the component - * @param {Object} componentport Component port object - * @param {Object} component Component object - * @returns {Array} Returns an array which contains the X absolute coordinate and the y absolute coordinate - * @memberof ComponentPort - */ - static calculateAbsolutePosition(componentport: ComponentPort, component: Component): Point { - const topleftposition = component.getValue("position"); - const point = new paper.Point(topleftposition[0] - component.offset[0] + componentport.x, topleftposition[1] - component.offset[1] + componentport.y); - const featpoint = new paper.Point(topleftposition[0] - component.offset[0], topleftposition[1] - component.offset[1]); - const rotatedpoint = point.rotate(component.getRotation(), featpoint); - return [rotatedpoint.x, rotatedpoint.y]; - } - - /** - * Creates a new Component Port from an Interchange V1 format - * @param {} json - * @returns {ComponentPort} Returns a component port object - * @memberof ComponentPort - */ - static fromInterchangeV1(json: ComponentPortInterchangeV1): ComponentPort { - let layer = LogicalLayerType.FLOW; - if(json.layer === "FLOW"){ - layer = LogicalLayerType.FLOW; - } else if (json.layer === "CONTROL"){ - layer = LogicalLayerType.CONTROL; - } else if (json.layer === "INTEGRATION"){ - layer = LogicalLayerType.INTEGRATION; - } - return new ComponentPort(json.x, json.y, json.label, layer); - } -} diff --git a/src/app/core/connection.ts b/src/app/core/connection.ts deleted file mode 100644 index 32b801ff..00000000 --- a/src/app/core/connection.ts +++ /dev/null @@ -1,712 +0,0 @@ -import paper from "paper"; -import Parameter from "./parameter"; -import Params from "./params"; -import ConnectionTarget from "./connectionTarget"; -import Device from "./device"; -import * as FeatureRenderer2D from "../view/render2D/featureRenderer2D"; -import Layer from "./layer"; -import uuid from "node-uuid"; -import { ConnectionInterchangeV1_2, ConnectionPathInterchangeV1_2, ConnectionTargetInterchangeV1 } from "./init"; -import { Segment, Point } from "./init"; -import ConnectionUtils from "../utils/connectionUtils"; -import { ComponentAPI } from "@/componentAPI"; -import MapUtils from "../utils/mapUtils"; -import ExportUtils from "../utils/exportUtils"; -import Feature from "./feature"; - -/** - * This class contains the connection abstraction used in the interchange format and the - * high level device model of the microfluidic. - */ -export default class Connection { - protected _params: Params; - protected _name: string; - protected _id: string; - protected _type: string; - protected _entity: string; - protected _featureIDs: Array; - protected _nodes: any; - protected _bounds: paper.Rectangle | null; - protected _source: ConnectionTarget | null; - protected _sinks: Array; - protected _paths: Array>; - protected _objects: any; - protected _routed: boolean; - protected _layer: Layer; - - features: Array = []; - - /** - * Default Connection Constructor - * @param {String} type - * @param {Params} params - * @param {String} name - * @param {String} mint - * @param {String} id - */ - constructor(type: string, params: Params, name: string, mint: string, layer: Layer, id: string = ComponentAPI.generateID()) { - this._params = params; - this._name = name; - this._id = id; - this._type = type; - this._entity = mint; - //This stores the features that are a part of the component - this._featureIDs = []; - this._nodes = []; - //TODO: Need to figure out how to effectively search through these - this._bounds = null; - this._source = null; - this._sinks = []; - this._paths = []; - this._objects = []; - this._routed = false; - this._layer = layer; - } - - get layer(): Layer { - return this._layer; - } - - set layer(layer: Layer) { - this._layer = layer; - } - /** - * Gets the sinks in the connection - * @returns {ConnectionTarget[]} Returns an array with the sinks - * @memberof Connection - */ - get sinks(): Array { - return this._sinks; - } - - /** - * Gets the source of the connection - * @returns {ConnectionTarget} Returns the source of the connection - * @memberof Connection - */ - get source(): ConnectionTarget | null { - return this._source; - } - - /** - * Checks if the connection is routed - * @returns {Boolean} Returns true whether if it is routed or not - * @memberof Connection - */ - get routed(): boolean { - return this._routed; - } - - /** - * Sets if the connection is routed - * @param {Boolean} value true if it's router or false if it's not - * @returns {void} - * @memberof Connection - */ - set routed(value: boolean) { - this._routed = value; - } - - /** - * Returns the list of features associated with the connection - * @return {Feature[]} - * @memberof Connection - */ - get featureIDs(): Array { - return this._featureIDs; - } - - /** - * Returns the params associated with the connection - * @return {Params} - * @memberof Connection - */ - get params(): Params { - return this._params; - } - - - /** - * Sets the bounds i.e. the x,y position and the width and length of the component - * @param {paper.Rectangle} bounds PaperJS Rectangle object associated with a Path.bounds property - * @memberof Connection - * @returns {void} - */ - setBounds(bounds: paper.Rectangle): void { - this._bounds = bounds; - let topleftpt = bounds.topLeft; - this._params.updateParameter("position", [topleftpt.x, topleftpt.y]); - this._params.updateParameter("xspan", bounds.width); - this._params.updateParameter("yspan", bounds.height); - } - - /** - * Updates the parameters stored by the component - * @param {String} key Identifier of the parameter - * @param {any} value - * @memberof Connection - * @returns {void} - */ - updateParameter(key: string, value: any): void { - this._params.updateParameter(key, value); - - console.log("Key: ", key, " Val: ", value); - - if (key != "segments") { - for (const featureidtochange of this._featureIDs) { - - // Get the feature id and modify it - const feature = ConnectionUtils.getFeatureFromID(featureidtochange); - feature.updateParameter(key, value); - } - } - - // this._params[key] = value; - // this.updateView(); - } - - /** - * Generates the object that needs to be serialzed into JSON for interchange format V1 - * @returns {ConnectionInterchangeV1_2} Object - * @memberof Connection - */ - toInterchangeV1(): ConnectionInterchangeV1_2 { - if (this._source === null) { - throw new Error("Source is null, cannot convert connection to interchange format:" + this._id); - } - const outputpaths: Array = []; - for (let i = 0; i < this._paths.length; i++) { - const path = this._paths[i]; - const outputpath: ConnectionPathInterchangeV1_2 = { - source: this._source !== null ? this._source.toJSON() : null, - sink: this.sinks.length > i ? this._sinks[i].toJSON() : null, - wayPoints: path, - // Get the id's of the features - features: this.features.map(feature => {return feature.id;}) - }; - outputpaths.push(outputpath); - } - const output: ConnectionInterchangeV1_2 = { - id: this._id, - name: this._name, - entity: this._entity, - source: this._source.toJSON(), - sinks: [], - paths: outputpaths, - params: this._params.toJSON(), - layer: this._layer.id - }; - - if (this._source !== null) { - output.source = this._source.toJSON(); - } - if (this._sinks !== null && this._sinks.length > 0) { - let sinks = []; - for (const sink of this._sinks) { - sinks.push(sink.toJSON()); - } - output.sinks = this._sinks.map(sink => { - return ExportUtils.toConnectionTargetInterchangeV1(sink); - }); - } - return output; - } - - /** - * Returns the ID of the component - * @returns {String} - * @memberof Connection - */ - get id(): string { - return this._id; - } - - /** - * Allows the user to set the name of the component - * @param {String} name Name of the component - * @memberof Connection - * @returns {void} - */ - set name(name: string) { - this._name = name; - } - - /** - * Returns the name of the component - * @returns {String} Name of the component - * @memberof Connection - */ - get name(): string { - return this._name; - } - - /** - * Gets the 3DuF Type of the component, this will soon be depreciated and merged with - * the MINT references - * @returns {String} - * @memberof Connection - */ - get type(): string { - return this._type; - } - - /** - * Returns the position of the component - * @return {string} - * @memberof Connection - */ - /** - * Returns the value of the parameter stored against the following key in teh component params - * @returns {any} - * @memberof Connection - */ - getValue(key: string): any { - try { - return this._params.getValue(key); - } catch (err) { - throw new Error("Unable to get value for key: " + key); - } - } - - /** - * Adds a feature that is associated with the component - * @param {String} featureID String id of the feature - * @memberof Connection - * @returns {void} - */ - addFeatureID(featureID: string): void { - this._featureIDs.push(featureID); - //Now update bounds - // this.__updateBounds(); - } - - /** - * This method updates the bounds of the component - * @memberof Connection - * @returns {void} - * @protected - */ - protected updateBounds(): void { - console.log("test"); - let bounds = null; - let feature = null; - let renderedfeature = null; - for (const featureid of this._featureIDs) { - // gets teh feature defined by the id - feature = ConnectionUtils.getFeatureFromID(featureid); - console.log(feature); - renderedfeature = FeatureRenderer2D.renderFeature(feature, null); - console.log("rendered:"); - console.log(renderedfeature); - if (bounds === null) { - bounds = renderedfeature.bounds; - } else { - bounds = bounds.unite(renderedfeature.bounds); - } - } - this._bounds = bounds; - } - - /** - * Sets the params associated with the component - * @param {Params} params key -> Parameter Set - * @returns {void} - * @memberof Connection - */ - set params(params: Params) { - this._params = params; - //TODO: Modify all the associated Features - for (let key in params) { - let value = params.getValue(key); - for (const featureidtochange of this._featureIDs) { - - //Get the feature id and modify it - let feature = ConnectionUtils.getFeatureFromID(featureidtochange); - feature.updateParameter(key, value.getValue()); - } - } - } - - /** - * Returns the list of waypoints associated with the connection - * @return {Point[]} - * @memberof Connection - */ - getPaths(): Array> { - return this._paths; - } - - /** - * Updates the segments of the connection - * @param {Segment[]} segments - * @memberof Connection - * @returns {void} - */ - updateSegments(segments: Array): void { - this.updateParameter("segments", new Parameter("SegmentArray", segments)); - for (const featureidtochange of this._featureIDs) { - - const feature = ConnectionUtils.getFeatureFromID(featureidtochange); - // feature.updateParameter('position', center); - feature.updateParameter("segments", segments); - } - } - - /** - * Inserts the gap using the boundingbox - * @param {any} boundingbox - * @memberof Connection - * @returns {boolean} - */ - insertFeatureGap(boundingbox: any): boolean { - let foundflag = false; - // Convert Rectangle to Path.Rectangle - console.log(boundingbox, boundingbox.width, boundingbox.height); - boundingbox = new paper.Path.Rectangle(boundingbox); - // Check which segment I need to break - const segments = this.getValue("segments"); - for (const i in segments) { - const segment = segments[i]; - const line = new paper.Path.Line(new paper.Point(segment[0]), new paper.Point(segment[1])); - const intersections = line.getIntersections(boundingbox); - // console.log("Intersections found", intersections); - if (intersections.length === 2) { - const break1 = intersections[0].point; - const break2 = intersections[1].point; - const newsegs = this.breakSegment(segment, break1, break2); - console.log("breaking:", segment, newsegs); - if (newsegs.length !== 2) { - throw new Error("Could not break the segments correctly"); - } - segments.splice(i, 1, newsegs[0], newsegs[1]); - foundflag = true; - } else if (intersections.length === 1) { - console.error("Only found 1 intersection point so going to use a different method"); - console.log("Found Intersection:", intersections); - - console.log("Segments:", segments); - console.log("line:", line); - console.log("Bounding Box:", boundingbox); - } else { - console.error("No intersections found so going to use a different method"); - console.log("Found Intersection:", intersections); - - console.log("Segments:", segments); - console.log("line:", line); - console.log("Bounding Box:", boundingbox); - } - } - - // Now that we exit the check for every segment we can verify if this is ok - if (!foundflag) { - console.error("There's something funky going on with the intersection,no intersections found"); - console.log("Segments:", segments); - // console.log("line:", line); - console.log("Bounding Box:", boundingbox); - throw new Error("Could not find 2 intersection points, hence aborting the whole thing"); - } - // console.log("raw new segments:", segments); - this.updateSegments(segments); - - return foundflag; - } - - /** - * Breaks the segment at the 2 points given by the points - * @param {Point[]} segment - * @param {paper.Point} break1 - * @param {paper.Point} break2 - * @return {Segment[]} Returns the two segments - * @memberof Connection - * @protected - */ - protected breakSegment(segment: Segment, break1: paper.Point, break2: paper.Point): Array { - //Generate 2 segments from this 1 segemnt - const p1 = new paper.Point(segment[0]); - const p2 = new paper.Point(segment[1]); - - let segment1: Segment, segment2: Segment; - const p1_break1 = p1.getDistance(break1); - const p2_break1 = p2.getDistance(break1); - const p1_break2 = p1.getDistance(break2); - const p2_break2 = p2.getDistance(break2); - - // Find out if break1 is closer to p1 or p2 - if (p1_break1 + p2_break2 < p2_break1 + p1_break2) { - // break1 is closer to p1 and break2 is closer to p2\ - segment1 = [ - [Math.round(p1.x), Math.round(p1.y)], - [Math.round(break1.x), Math.round(break1.y)] - ]; - segment2 = [ - [Math.round(p2.x), Math.round(p2.y)], - [Math.round(break2.x), Math.round(break2.y)] - ]; - } else { - // break1 is closer to p2 and break1 is closer to p1 - segment1 = [ - [Math.round(p2.x), Math.round(p2.y)], - [Math.round(break1.x), Math.round(break1.y)] - ]; - segment2 = [ - [Math.round(p1.x), Math.round(p1.y)], - [Math.round(break2.x), Math.round(break2.y)] - ]; - } - return [segment1, segment2]; - } - - /** - * This method is used to import the component from Interchange V1 JSON - * @param json - * @returns {Connection} Returns a connection object - * @memberof Connection - */ - static fromInterchangeV1(device: Device, json: ConnectionInterchangeV1_2): Connection { - // let set; - // if (json.hasOwnProperty("set")) set = json.set; - // else set = "Basic"; - // //TODO: This will have to change soon when the thing is updated - // throw new Error("Need to implement Interchange V1 Import for component object"); - // //return Device.makeFeature(json.macro, set, json.params, json.name, json.id, json.type); - - const name = json.name; - const id = json.id; - const entity = json.entity; - const params = json.params; - const layer = device.getLayer(json.layer); - if (layer === null) { - throw new Error("Could not find layer with id: " + json.layer); - } - - // Check if the params have the other unique elements necessary otherwise add them as null - if (!Object.prototype.hasOwnProperty.call(params, "start")) { - // Setting this value to origin - params.start = [0, 0]; - } - if (!Object.prototype.hasOwnProperty.call(params, "end")) { - // Setting this value to origin - params.end = [0, 0]; - } - if (!Object.prototype.hasOwnProperty.call(params, "wayPoints")) { - // TODO: setting a single waypoint at origin - params.wayPoints = [ - [0, 0], - [1, 2] - ]; - } - if (!Object.prototype.hasOwnProperty.call(params, "segments")) { - // TODO: Setting a default segment from origin to origin - params.segments = [ - [ - [0, 0], - [0, 0] - ], - [ - [0, 0], - [0, 0] - ] - ]; - } - let definition = ComponentAPI.getDefinition("Connection"); - if (definition === null || definition === undefined) { - throw new Error("Could not find the definition for the Connection"); - } - const paramstoadd = new Params(params, MapUtils.toMap(definition.unique), MapUtils.toMap(definition.heritable)); - - const connection = new Connection(entity, paramstoadd, name, entity, layer, id); - if (Object.prototype.hasOwnProperty.call(json, "source")) { - if (json.source !== null && json.source !== undefined) { - connection.setSourceFromJSON(device, json.source); - } - } - if (Object.prototype.hasOwnProperty.call(json, "sinks")) { - if (json.sinks !== null && json.sinks !== undefined) { - for (const i in json.sinks) { - const sink = json.sinks[i]; - connection.addSinkFromJSON(device, sink); - } - } - } - if (Object.prototype.hasOwnProperty.call(json, "paths")) { - if (json.paths !== null && json.paths !== undefined) { - for (const i in json.paths) { - connection.addWayPoints(json.paths[i].wayPoints); - } - } - } - - return connection; - } - - /** - * Goes through teh waypoints and generates the connection segments - * @return {SegmentArray} - * @memberof Connection - */ - regenerateSegments(): void { - const pathscopy = this.getPaths(); - const ret: Array = []; - let waypointscopy; - for (const j in pathscopy) { - waypointscopy = pathscopy[j]; - for (let i = 0; i < waypointscopy.length - 1; i++) { - const segment: Segment = [waypointscopy[i], waypointscopy[i + 1]]; - ret.push(segment); - } - } - this.updateSegments(ret); - } - - // /** - // * Allows the user to set the source of the connection - // * @param {Object} component - // * @param {ComponentPort} port - // * @memberof Connection - // * @returns {void} - // */ - // setSource(component: string, port: ComponentPort) { - // if (typeof component != "string" && !(component instanceof String)) { - // console.error("The reference object value can only be a string"); - // } - // this._source = new ConnectionTarget(component, port); - // } - - // /** - // * Allows the user to add a sink to the connection - // * @param {string} component - // * @param {ComponentPort} port - // * @memberof Connection - // * @returns {void} - // */ - // addSink(component: string, port: ComponentPort) { - // if (typeof component != "string" || !(component instanceof String)) { - // console.error("The reference object value can only be a string"); - // } - // this._sinks.push(new ConnectionTarget(component, port)); - // } - - /** - * Adds a new connection target to either the source or the sinks of the connection object. Requires the user to pass - * a ConnectionTarget Object or else it will throw an error. - * @param {string} connectiontarget - * @memberof Connection - * @returns {void} - */ - addConnectionTarget(connectiontarget: ConnectionTarget): void { - if (!(connectiontarget instanceof ConnectionTarget) || connectiontarget === null || connectiontarget == undefined) { - console.error("Cannot add non-ConnectionTarget object as source or sink"); - } - - if (this._source === null) { - this._source = connectiontarget; - } else { - //TODO: Check for duplicates - does it matter actually ? - this._sinks.push(connectiontarget); - } - } - - /** - * Tries to delete any connection target reference that uses the said component - * @param {string} componentid Component ID - * @return {boolean} Returns true if any corresponding connection target is found - * @memberof Connection - * - */ - tryDeleteConnectionTarget(componentid: string): boolean { - let ret = false; - - let source = this._source; - if (source !== null) { - if (source.component.id == componentid) { - //Remove the source object - this._source = null; - ret = true; - } - } - - for (let i in this._sinks) { - let sink = this._sinks[i]; - - if (sink.component.id == componentid) { - this._sinks.splice(+i, 1); - ret = true; - } - } - - return ret; - } - - /** - * Adds a new set of waypoints to the path field of the connection - * @param {} wayPoints - * @memberof Connection - * @returns {void} - */ - addWayPoints(wayPoints: Array): void { - this._paths.push(wayPoints); - } - - /** - * Merges connections - * @param {Connection} connection - * @memberof Connection - * @returns {void} - */ - mergeConnection(connection: Connection): void { - console.error("Merge the newly found connection with the new connection"); - // TODO: - /* - 1. Transfer all the paths - 2. Transfer all the ConnectionTargets - 3. Transfer all the other objects - 4. Move the params - 5. - */ - } - - /** - * Converts from JSON format to connection object - * @param {Object} device - * @param {JSON} json - * @memberof Connection - * @returns {void} - */ - setSourceFromJSON(device: Device, json: ConnectionTargetInterchangeV1): void { - const target = ConnectionTarget.fromJSON(device, json); - this._source = target; - } - - /** - * Adds a sink to the connection - * @param {Object} device - * @param {JSON} json - * @memberof Connection - * @returns {void} - */ - addSinkFromJSON(device: Device, json: ConnectionTargetInterchangeV1): void { - let target = ConnectionTarget.fromJSON(device, json); - this._sinks.push(target); - } - - /** - * Adds a feature to the connection - * - * @param {Feature} feature - * @memberof Connection - */ - addFeature(feature: Feature): void { - this.features.push(feature); - } - - /** - * Removes a feature from the connection - * - * @param {Feature} feature - * @memberof Connection - */ - removeFeature(feature: Feature): void { - this.features.splice(this.features.indexOf(feature), 1); - } - -} diff --git a/src/app/core/connectionTarget.ts b/src/app/core/connectionTarget.ts deleted file mode 100644 index 7576a56c..00000000 --- a/src/app/core/connectionTarget.ts +++ /dev/null @@ -1,69 +0,0 @@ -import Component from "./component"; -import Device from "./device"; -import { ConnectionTargetInterchangeV1 } from "./init"; - -/** - * Connection target class - */ -export default class ConnectionTarget { - protected _component: Component; - protected _portLabel: string; - - /** - * Default ConnectionTarget Constructor - * @param {Component} component - * @param {string} portLabel - */ - constructor(component: Component, portLabel: string) { - this._component = component; - this._portLabel = portLabel; - } - - /** - * Gets the port label of the object - * @returns {string} Returns the port label of the object - * @memberof ConnectionTarget - */ - get portLabel(): string { - return this._portLabel; - } - - /** - * Gets the component in the connection - * @returns {Component} Returns a component object - * @memberof ConnectionTarget - */ - get component(): Component { - return this._component; - } - - /** - * Converts to JSON format - * @returns {JSON} - * @memberof ConnectionTarget - */ - toJSON(): { component: string; port: string } { - // This is for the older design data - if (this._component instanceof Component) { - return { - component: this._component.id, - port: this._portLabel - }; - } else { - return { component: this._component, port: this._portLabel }; - } - } - - /** - * Creates a new connection from a JSON format - * @param {Device} device Device in the connection - * @param {JSON} json File where the connection is contain - * @returns {ConnectionTarget} Returns a Connection Target Object - * @memberof ConnectionTarget - */ - static fromJSON(device: Device, json: ConnectionTargetInterchangeV1): ConnectionTarget { - const component = device.getComponentByID(json.component); - if (component !== null) return new ConnectionTarget(component, json.port); - else throw new Error("Component not found"); - } -} diff --git a/src/app/core/customComponent.ts b/src/app/core/customComponent.ts deleted file mode 100644 index 0e618861..00000000 --- a/src/app/core/customComponent.ts +++ /dev/null @@ -1,164 +0,0 @@ -import DXFObject from "./dxfObject"; -import Device from "./device"; - -import Params from "./params"; -import Template from "../library/template"; -import Feature from "./feature"; -import DeviceUtils from "../utils/deviceUtils"; -import { ComponentAPI, LibraryEntryDefinition } from "@/componentAPI"; - -/** - * This class contains the component abstraction used in the interchange format and the - * high level device model of the microfluidic. - */ -export default class CustomComponent extends Template { - dxfData: any = null; - protected _type: string = ""; - protected _entity: string = ""; - protected _renderData: any = null; - protected _params: Params = new Params({}, new Map(), new Map()); - - /** - * Default constructor - * @param {String} type Type of component - * @param {DXFObject} dxfdata DXFObject - * @param {String} mint Unique MINT identifier - */ - constructor(type: string, dxfdata: any, mint: string = type.toUpperCase()) { - super(); - // this.__params = params; - this._type = type; - this._entity = mint; - this.dxfData = dxfdata; - // this.__params = null; - // this.__renderData = null; - // This stores the features that are a part of the component - // this.__features = []; - // //TODO: Need to figure out how to effectively search through these - // this.__bounds = null; - } - - /** - * Returns the entity type - * @return {string} - * @memberof CustomComponent - */ - get entity(): string { - return this._entity; - } - - /** - * Returns the type - * @return {string} - * @memberof CustomComponent - */ - get type(): string { - return this._type; - } - - /** - * Sets the rendering data - * @param {} data - * @memberof CustomComponent - * @returns {void} - */ - set renderData(data: any) { - this._renderData = data; - } - - /** - * Generates a Feature that has all the corresponding respective data - * @returns {Feature} Returns a feature based on the data - * @memberof CustomComponent - */ - generateComponent(): Feature { - const paramvalues = {}; - const feature = Device.makeFeature(this.type, paramvalues, DeviceUtils.generateNewName(this.type), ComponentAPI.generateID(), "XY", this.dxfData); - return feature; - } - - /** - * Generates the object that needs to be serialzed into JSON for interchange format V1 - * @returns {JSON} Object - * @memberof CustomComponent - */ - toJSON() { - const dxfdata = []; - for (const i in this.dxfData) { - dxfdata.push(this.dxfData[i].getData()); - } - - const output = { - type: this.type, - entity: this.entity, - params: this._params.toJSON(), - dxfData: dxfdata - }; - return output; - } - - /** - * This method is used to import the component from Interchange V1 JSON - * @param json - * @returns {CustomComponent} - * @memberof CustomComponent - */ - static fromInterchangeV1(json: any) { - const dxfdata = []; - for (const i in json.dxfData) { - dxfdata.push(new DXFObject(json.dxfData[i])); - } - - // TODO: This will have to change soon when the thing is updated - const ret = new CustomComponent(json.type, dxfdata, json.entity); - // ret.renderData = json.renderData; - // let render = DXFRenderer.renderDXFObjects(dxfdata); - // ret.renderData = render.exportSVG(); - return ret; - } - - /** - * Contains the default parameters - * @returns {Object} Returns an Object containing the default parameters - * @memberof CustomComponent - */ - static defaultParameterDefinitions(): LibraryEntryDefinition { - const params = { - unique: { - position: "Point" - }, - heritable: { - rotation: "Float", - // "x-scale": "Float", - // "width": "Float", - height: "Float" - }, - units: { - rotation: "°", - // "length": "μm", - // "width": "μm", - height: "μm" - }, - defaults: { - rotation: 0, - // "width": 1.23 * 1000, - // "length": 4.92 * 1000, - height: 0.1 * 1000 - }, - minimum: { - rotation: 0, - // "width": 30, - // "length": 120, - height: 1 - }, - maximum: { - rotation: 359, - // "width": 6000, - // "length": 24 * 1000, - height: 1200 - }, - mint: "" - }; - return params; - } -} diff --git a/src/app/core/device.ts b/src/app/core/device.ts deleted file mode 100644 index 864a6895..00000000 --- a/src/app/core/device.ts +++ /dev/null @@ -1,1135 +0,0 @@ -/// - -import Params from "./params"; -import GeometryElement from "./geometryElement"; - -import Feature from "./feature"; -import { DeviceInterchangeV1, DeviceInterchangeV1_1, LogicalLayerType, Point, ValveInterchangeV1_2, ValveType } from "./init"; -import { ComponentInterchangeV1 } from "./init"; -import { ConnectionInterchangeV1_2 } from "./init"; -import { LayerInterchangeV1 } from "./init"; - -import Layer from "./layer"; -import Component from "./component"; -import Connection from "./connection"; -import EdgeFeature from "./edgeFeature"; -import DXFObject from "./dxfObject"; -import ComponentPort from "./componentPort"; -import * as IOUtils from "../utils/ioUtils"; - -import DeviceUtils from "@/app/utils/deviceUtils"; -import { ComponentAPI } from "@/componentAPI"; -import MapUtils from "../utils/mapUtils"; -import { SerializationError } from "../utils/exportUtils"; - -/** - * The Device stores information about a design. - */ -export default class Device { - private __layers: Array; - private __textLayers: Array; - private __params: Params; - private __name: string; - private __components: Array; - private __nameMap: Map; - private __connections: Array; - private __valveMap: Map; - private __valveTypeMap: Map; - private __groups: Array; - private __parchmintFeatures: Array; - - /** - * Default Constructor - * @param {*} values - * @param {string} name Name of the Device - */ - constructor(values: { [index: string]: any }, name: string = "New Device") { - this.__layers = []; - this.__textLayers = []; - //this.__features = []; - this.__groups = []; - this.__params = new Params(values, Device.getUniqueParameters(), Device.getHeritableParameters()); - // this.setXSpan(values.width); - // this.setYSpan(values.length); - - this.__name = name; - this.__components = []; - this.__nameMap = new Map(); - this.__connections = []; - - //Map to store - this.__valveMap = new Map(); - this.__valveTypeMap = new Map(); - - // Initilize the Features array that would be used to store the Parchmint Features - this.__parchmintFeatures = []; - } - - /** - * Adds a layer to the device - * - * @param {string} componentid - * @param {string} connectionid - * @param {ValveType} valvetype - * @memberof Device - */ - addValve(componentid: string, connectionid: string, valvetype: ValveType): void { - this.__valveMap.set(componentid, connectionid); - this.__valveTypeMap.set(componentid, valvetype); - } - - /** - * Returns the name of the device - * - * @returns {String} - * @memberof Device - */ - get name(): string { - return this.__name; - } - - /** - * Sets the map used for naming objects - * @param {Map} - * @memberof Device - */ - set nameMap(nameMap: Map) { - this.__nameMap = nameMap; - } - - /** - * Returns the list of layers in the device - * @return {Array} - * @memberof Device - */ - get layers(): Array { - return this.__layers; - } - - get parchmintFeatures(): Array { - return this.__parchmintFeatures; - } - - /** - * Adds a connection to the device - * @param {Connection} connection - * @memberof Device - * @returns {void} - */ - addConnection(connection: Connection): void { - this.__connections.push(connection); - } - - /** - * Removes a connection from the device - * @param {Connection} connection - * @memberof Device - * @returns {void} - */ - removeConnection(connection: Connection): void { - let i = this.__connections.indexOf(connection); - if (i != -1) { - this.__connections.splice(i, 1); - } - } - - /** - * Adds a component to the device - * @param {Component} component Component to be added to the device - * @memberof Device - * @returns {void} - */ - addComponent(component: Component): void { - if (component instanceof Component) { - this.__components.push(component); - } else { - throw new Error("Tried to add a component that isn't a component to the device"); - } - } - - /** - * Removes a component from the device - * @param {Component} component Component to remove from the device - * @memberof Device - * @returns {void} - */ - removeComponent(component: Component): null | Connection { - //Remove the component from the map - let trydelete; - let componentid = component.id; - let connectiontorefresh = null; - - //Remove component from connections - for (const connection of this.__connections) { - try { - trydelete = connection.tryDeleteConnectionTarget(componentid); - if (trydelete) { - console.log("Removed Component from Connection : ", connection.id); - } - } catch (e) { - console.error(e); - } - } - //Check if the valve map has the component - let checkConnection: string | undefined = this.__valveMap.get(componentid); - if (checkConnection != undefined) { - connectiontorefresh = this.getConnectionByID(checkConnection); - this.__valveMap.delete(componentid); - } - - let i = this.__components.indexOf(component); - if (i != -1) { - this.__components.splice(i, 1); - } - - return connectiontorefresh; - } - - /** - * Returns the list of components from the device - * @return {Array} Array with the components of the device - * @memberof Device - */ - get components(): Array { - return this.__components; - } - - /** - * Sets the name of the device - * @param {string} name Name of the device - * @memberof Device - */ - set name(name: string) { - this.__name = name; - } - - /** - * Updates the parameter - * @param {string} key Key to identigy the parameter - * @param {} value Parameter's value - * @memberof Device - * @returns {void} - */ - updateParameter(key: string, value: any): void { - this.__params.updateParameter(key, value); - } - - /** - * Returns the layer with the given ID - * - * @param {string} id - * @returns {(Layer | null)} - * @memberof Device - */ - getLayer(id: string): Layer | null { - for (let i in this.__layers) { - let layer = this.__layers[i]; - if (layer.id == id) { - return layer; - } - } - return null; - } - - /** - * Returns the layer that contains the feature with the given feature ID - * @param {string} featureID ID of the feature to search for it - * @return {Layer} Returns the layer - * @memberof Device - */ - getLayerFromFeatureID(featureID: string): Layer { - for (let i = 0; i < this.__layers.length; i++) { - let layer = this.__layers[i]; - if (layer.containsFeatureID(featureID)) { - return layer; - } - } - for (let i = 0; i < this.__textLayers.length; i++) { - let layer = this.__textLayers[i]; - if (layer.containsFeatureID(featureID)) { - return layer; - } - } - throw new Error("FeatureID " + featureID + " not found in any layer."); - } - - /** - * Checks if feature with given feature id is part of the device - * @param {string} featureID ID of the feature to search for it - * @return {boolean} - * @memberof Device - */ - containsFeatureID(featureID: string): boolean { - for (let i = 0; i < this.__layers.length; i++) { - if (this.__layers[i].containsFeatureID(featureID)) return true; - } - return false; - } - - /** - * Returns a list of all the features in the device - * @return {Array} Array with all the features of the device - * @memberof Device - */ - getAllFeaturesFromDevice(): Array { - let features: Array = []; - for (let i in this.__layers) { - //features.push.apply(features, layer.features); - let layer: Layer = this.__layers[i]; - for (let j in layer.features) { - // console.log(layer.features[j]); - features.push(layer.getFeature(j)); - } - } - return features; - } - - /** - * Returns the feature with the given feature id - * @param {string} featureID ID of the feature to search - * @return {Feature} - * @memberof Device - */ - getFeatureByID(featureID: string): Feature { - let layer = this.getLayerFromFeatureID(featureID); - return layer.getFeature(featureID); - } - - /** - * Returns the feature with the given name - * @param {string} name Name of the feature to be search - * @return {Feature} - * @memberof Device - */ - getFeatureByName(name: string): Feature { - let layer; - let features; - for (let i = 0; i < this.__layers.length; i++) { - layer = this.__layers[i]; - features = layer.getAllFeaturesFromLayer(); - for (let ii in features) { - let feature = features[ii]; - if (feature.getName() === name) { - return feature; - } - } - } - for (let i = 0; i < this.__textLayers.length; i++) { - layer = this.__layers[i]; - features = layer.getAllFeaturesFromLayer(); - for (let ii in features) { - let feature = features[ii]; - if (feature.getName() === name) { - return feature; - } - } - } - throw new Error("FeatureID " + name + " not found in any layer."); - } - - /** - * Add a layer, and re-sort the layers array - * @param {Layer} layer Layer to add - * @memberof Device - * @returns {void} - */ - addLayer(layer: Layer): void { - layer.device = this; - this.__layers.push(layer); - //this.sortLayers(); - // TODO: Fix layer system - DeviceUtils.addLayer(layer, this.__layers.indexOf(layer)); - } - - /** - * Add a layer to specific index, and re-sort the layers array - * @param {Layer} layer Layer to add - * @param {number} index The index into which to add the layer - * @memberof Device - * @returns {void} - */ - addLayerAtIndex(layer: Layer, index: number): void { - layer.device = this; - this.__layers.splice(index, 0, layer); - //this.sortLayers(); - // TODO: Fix layer system - DeviceUtils.addLayer(layer, this.__layers.indexOf(layer)); - } - - /** - * Removes feature of the Device - * @param {Feature} feature Feature to be removed - * @memberof Device - * @returns {void} - */ - removeFeature(feature: Feature): void { - if (feature.type == "Connection") { - for (let i = 0; i < this.__connections.length; i++) { - let featIDs = this.__connections[i].featureIDs; - for (let j = 0; j < featIDs.length; j++) { - if (this.__connections[i].featureIDs[j] == feature.ID) { - this.__connections[i].featureIDs.splice(j, 1); - if (this.__connections[i].featureIDs.length == 0) { - this.__connections.splice(i, 1); - } - } - } - } - } else { - for (let i = 0; i < this.__components.length; i++) { - let featIDs = this.__components[i].featureIDs; - for (let j = 0; j < featIDs.length; j++) { - if (this.__components[i].featureIDs[j] == feature.ID) { - this.__components[i].featureIDs.splice(j, 1); - if (this.__components[i].featureIDs.length == 0) { - this.__components.splice(i, 1); - } - } - } - } - } - } - - /** - * Gets the unique parameters - * @returns {Object} - */ - static getUniqueParameters(): Map { - let unique: Map = new Map(); - unique.set("x-span", "Float"); - unique.set("y-span", "Float"); - return unique; - } - - /** - * Update the cross-reference - * @param {String} objectID ID of the object to search for - * @param {String} featureID ID of the feature to search in the given object - * @memberof Device - * @returns {void} - */ - updateObjectReference(objectID: string, featureID: string): void { - //Goes through the components to update the reference - let component: Component; - let foundflag = false; - for (const component of this.__components) { - // console.log(objectID, component.id); - if (objectID == component.id) { - component.addFeatureID(featureID); - component.placed = true; - foundflag = true; - } - } - - //Goes through the connection to update the reference - let connection; - for (const connection of this.__connections) { - if (objectID == connection.id) { - connection.addFeatureID(featureID); - connection.routed = true; - foundflag = true; - } - } - - if (!foundflag) { - console.error("Could not find object to update reference: " + featureID); - } - } - /** - * ? - */ - static getHeritableParameters(): Map { - return new Map(); - } - /** - * Converts groups to JSON - * @returns {JSON} - * @memberof Device - */ - __groupsToJSON(): Array { - let output: Array = []; - for (let i in this.__groups) { - output.push(this.__groups[i]); - } - return output; - } - /** - * Converts layers to JSON - * @returns {JSON} - * @memberof Device - */ - __layersToJSON(): Array<{ [index: string]: any }> { - let output: Array<{ [index: string]: any }> = []; - for (let i in this.__layers) { - output.push(this.__layers[i].toJSON()); - } - return output; - } - /** - * Returns an array with the components - * @returns {Array} - * @memberof Device - */ - __componentsToInterchangeV1(errorList: Array): Array { - let output: Array = []; - for (let i in this.__components) { - try { - output.push(this.__components[i].toInterchangeV1()); - } - catch (e) { - console.error(e); - errorList.push(new SerializationError( - e.message, - `Component ${this.__components[i].id} could not be converted to InterchangeV1`, - JSON.stringify(this.__components[i]), - )); - } - } - return output; - } - /** - * Converts connection to InterchangeV1 - * @returns {Array} Returns an array with the connections - * @memberof Device - */ - __connectionToInterchangeV1(errorList: Array): Array { - let output: Array = []; - for (let i in this.__connections) { - try { - output.push(this.__connections[i].toInterchangeV1()); - } catch (e) { - console.error(e); - errorList.push(new SerializationError( - e.message, - `Connection : ${this.__connections[i].id} could not be converted to InterchangeV1`, - JSON.stringify(this.__connections[i]), - )); - } - } - return output; - } - - __valvesToInterchangeV1(errorList: Array): Array { - let output: Array = []; - this.__valveMap.forEach((target, valveID) => { - let valve_type = this.__valveTypeMap.get(valveID); - if(valve_type === undefined) { - console.warn("Valve type not found for valve: " + valveID + " , setting default to NORMALLY_OPEN"); - valve_type = ValveType.NORMALLY_OPEN; - } - try { - output.push({ - componentid: valveID, - connectionid: target, - type: valve_type, - params: {} - }); - } catch (e) { - console.error(e); - errorList.push(new SerializationError( - e.message, - `Valve : ${valveID} could not be converted to InterchangeV1`, - JSON.stringify(valveID), - )); - } - }); - return output; - } - - /** - * Converts feature layers to InterchangeV1 - * @return {Array} Returns an array with the feature layers - * @memberof Device - */ - __featureLayersToInterchangeV1(): Array { - let output: Array = []; - for (let i in this.__layers) { - output.push(this.__layers[i].toInterchangeV1()); - } - return output; - } - /** - * Converts layers to InterchangeV1 - * @return {Array} Returns an array with the layers - * @memberof Device - */ - __layersToInterchangeV1(errorList: Array): Array { - const output: Array = []; - for (const i in this.__layers) { - try { - output.push(this.__layers[i].toInterchangeV1()); - } catch (e) { - console.error(e); - errorList.push(new SerializationError( - e.message, - `Layer ${this.__layers[i].id} could not be converted to InterchangeV1`, - JSON.stringify(this.__layers[i]) - )); - } - } - return output; - } - - /** - * Loads feature layers from a Interchange format into the device object - * @param {*} json - * @memberof Device - * @returns {void} - */ - __loadLayersFromInterchangeV1(json: Array): void { - for (let i in json) { - let newLayer = Layer.fromInterchangeV1(json[i], this); - this.addLayer(newLayer); - } - } - - /** - * Loads the JSON Component object into the device object - * @param {ComponentInterchangeV1} components - * @memberof Device - * @returns {void} - * @private - */ - __loadComponentsFromInterchangeV1(components: Array): void { - let componenttoadd; - - for (let i in components) { - componenttoadd = Component.fromInterchangeV1(components[i]); - this.__components.push(componenttoadd); - } - } - /** - * Loads connections to the device object - * @param {Connection} connections Connections to add to the device - * @memberof Device - * @returns {void} - */ - __loadConnectionsFromInterchangeV1(connections: Array): void { - let connectiontoload; - for (let i in connections) { - connectiontoload = Connection.fromInterchangeV1(this, connections[i]); - this.__connections.push(connectiontoload); - } - } - - /** - * Converts to Interchange V1 format - * @returns {Device} Returns an Device object in Interchange V1 format - * @memberof Device - */ - toInterchangeV1(errorList: Array): DeviceInterchangeV1 { - let output: DeviceInterchangeV1 = { - name: this.__name, - params: { - width: this.getXSpan(), - length: this.getYSpan() - }, - //TODO: Use this to dynamically create enough layers to scroll through - layers: this.__layersToInterchangeV1(errorList), - components: this.__componentsToInterchangeV1(errorList), - connections: this.__connectionToInterchangeV1(errorList), - valves: this.__valvesToInterchangeV1(errorList), - version: "1", - groups: this.__groupsToJSON() - }; - return output; - } - - toInterchangeV1_1(errorList: Array): DeviceInterchangeV1_1 { - let output: DeviceInterchangeV1_1 = { - name: this.__name, - params: { - width: this.getXSpan(), - length: this.getYSpan() - }, - //TODO: Use this to dynamically create enough layers to scroll through - layers: this.__layersToInterchangeV1(errorList), - components: this.__componentsToInterchangeV1(errorList), - connections: this.__connectionToInterchangeV1(errorList), - version: "1.1", - groups: this.__groupsToJSON() - }; - return output; - } - - static fromInterchangeV1(json: DeviceInterchangeV1): Device { - let newDevice: Device; - if (Object.prototype.hasOwnProperty.call(json, "params")) { - if (Object.prototype.hasOwnProperty.call(json.params, "width") && Object.prototype.hasOwnProperty.call(json.params, "length")) { - newDevice = new Device( - { - width: json.params.width, - length: json.params.length - }, - json.name - ); - } else { - newDevice = new Device( - { - width: 135000, - length: 85000 - }, - json.name - ); - } - } else { - console.warn("Could not find device params, using some default values for device size"); - newDevice = new Device( - { - width: 135000, - length: 85000 - }, - json.name - ); - } - //TODO: Use this to dynamically create enough layers to scroll through - //newDevice.__loadLayersFromInterchangeV1(json.layers); - //TODO: Use these two generate a rat's nest - newDevice.__loadComponentsFromInterchangeV1(json.components); - newDevice.__loadConnectionsFromInterchangeV1(json.connections); - //TODO: Use this to render the device features - - //Check if JSON has features else mark - if (Object.prototype.hasOwnProperty.call(json, "layers")) { - newDevice.__loadLayersFromInterchangeV1(json.layers); - } else { - //We need to add a default layer - let newlayer = new Layer({}, "flow", LogicalLayerType.FLOW, "0", newDevice); - newDevice.addLayer(newlayer); - newlayer = new Layer({}, "control", LogicalLayerType.CONTROL, "0", newDevice); - newDevice.addLayer(newlayer); - } - - //Updating cross-references - let features = newDevice.getAllFeaturesFromDevice(); - let feature; - for (let i in features) { - //console.log("Feature:", features[i]); - feature = features[i]; - if (feature.referenceID !== null) { - newDevice.updateObjectReference(feature.referenceID, feature.ID); - } - } - - return newDevice; - } - - static fromInterchangeV1_1(json: DeviceInterchangeV1): Device { - IOUtils.sanitizeV1Plus(json); - let newDevice; - - if (Object.prototype.hasOwnProperty.call(json, "params")) { - if (Object.prototype.hasOwnProperty.call(json.params, "xspan") && Object.prototype.hasOwnProperty.call(json.params, "yspan")) { - newDevice = new Device( - { - width: json.params.xspan, - length: json.params.yspan - }, - json.name - ); - } else { - newDevice = new Device( - { - width: 135000, - length: 85000 - }, - json.name - ); - } - } else { - console.warn("Could not find device params, using some default values for device size"); - newDevice = new Device( - { - width: 135000, - length: 85000 - }, - json.name - ); - } - //TODO: Use this to dynamically create enough layers to scroll through - //newDevice.__loadLayersFromInterchangeV1(json.layers); - //TODO: Use these two generate a rat's nest - newDevice.__loadComponentsFromInterchangeV1(json.components); - newDevice.__loadConnectionsFromInterchangeV1(json.connections); - - let valve_map, valve_type_map; - //Import ValveMap - if (Object.prototype.hasOwnProperty.call(json.params, "valveMap") && Object.prototype.hasOwnProperty.call(json.params, "valveTypeMap")) { - valve_map = IOUtils.jsonToMap(json.params.valveMap); - console.log("Imported valvemap", valve_map); - - console.log("Loaded valvetypemap", json.params.valveTypeMap); - valve_type_map = IOUtils.jsonToMap(json.params.valveTypeMap); - - console.log(json.params.valveTypeMap, valve_type_map); - for (let [componentid, connectionid] of valve_map) { - let valve = newDevice.getComponentByID(componentid); - if(valve === null) { - console.error("Could not find valve with id:", componentid); - throw new Error("Could not find valve with id: " + componentid); - } - let connection = newDevice.getConnectionByID(connectionid); - if(connection === null) { - console.error("Could not find connection with id:", connectionid); - throw new Error("Could not find connection with id: " + connectionid); - } - const valve_type_text = valve_type_map.get(componentid); - let valve_type = ValveType.NORMALLY_OPEN; - if (valve_type_text === "NORMALLY_OPEN") { - valve_type = ValveType.NORMALLY_OPEN; - }else if(valve_type_text === "NORMALLY_CLOSED") { - valve_type = ValveType.NORMALLY_CLOSED; - } else { - console.warn("Could not find valve type for valve with id:", componentid); - throw new Error("Could not find valve type for valve with id: " + componentid); - } - - newDevice.insertValve(valve, connection, valve_type_map.get(componentid)); - } - } - - //TODO: Use this to render the device features - - //Check if JSON has features else mark - if (Object.prototype.hasOwnProperty.call(json, "features")) { - newDevice.__loadLayersFromInterchangeV1(json.layers); - } else { - //We need to add a default layer - let newlayer = new Layer({}, "flow", LogicalLayerType.FLOW, "0", newDevice); - newDevice.addLayer(newlayer); - newlayer = new Layer({}, "control", LogicalLayerType.CONTROL, "0", newDevice); - newDevice.addLayer(newlayer); - } - - //Updating cross-references - let features = newDevice.getAllFeaturesFromDevice(); - let feature; - for (let i in features) { - //console.log("Feature:", features[i]); - feature = features[i]; - if (feature.referenceID !== null) { - newDevice.updateObjectReference(feature.referenceID, feature.ID); - } - } - - return newDevice; - } - - /** - * Set the X-Span Value - * @param {number} value - * @memberof Device - * @returns {void} - */ - setXSpan(value: number): void { - this.__params.updateParameter("x-span", value); - } - - /** - * Set the Y-Span Value - * @param {number} value - * @memberof Device - * @returns {void} - */ - setYSpan(value: number): void { - this.__params.updateParameter("y-span", value); - } - - /** - * Returns the X-Span Value - * @return {number} - * @memberof Device - */ - getXSpan(): number { - return this.__params.getValue("x-span"); - } - - /** - * Returns the Y-Span Value - * @return {number} - * @memberof Device - */ - getYSpan(): number { - return this.__params.getValue("y-span"); - } - - /** - * Create the layers necessary for creating a new level - * @return {Array} Returns a the layer objects created - * @memberof Device - */ - createNewLayerBlock(layers: Array): void { - for (let i in layers) { - this.addLayer(layers[i]); - } - } - - /** - * Deletes the layer defined by the index - * @param {number} index - * @memberof Device - * @returns {void} - */ - deleteLayer(index: number): void { - let layer = this.__layers[index]; - for (let feature in layer.features) { - this.removeFeature(layer.features[feature]); - } - if (index != -1) { - this.__layers.splice(index, 1); - } - } - - /** - * Returns the component identified by the id - * @param {string} id ID of the feature to get the component - * @return {Component|null} - * @memberof Device - */ - getComponentForFeatureID(id: string): Component | null { - for (let i in this.__components) { - let component = this.__components[i]; - //go through each component's features - for (let j in component.featureIDs) { - let featureid = component.featureIDs[j]; - if (featureid === id) { - return component; - } - } - } - - return null; - } - - /** - * Generates a new new name for the type, use this to autogenerate the names for components that are typespecific - * @param {string} type - * @return {string} - * @memberof Device - */ - generateNewName(type: string): string { - let value: number | undefined = this.__nameMap.get(type); - if (value != undefined) { - this.__nameMap.set(type, value + 1); - return type + "_" + String(value + 1); - } else { - this.__nameMap.set(type, 1); - return type + "_1"; - } - } - - /** - * Returns a connection object corresponding to the ID - * @param {String} id ID of feature to get the connection - * @return {Connection|null} - * @memberof Device - */ - getConnectionForFeatureID(id: string): Connection | null { - for (let i in this.__connections) { - let connection = this.__connections[i]; - //go through each component's features - for (let j in connection.featureIDs) { - let featureid = connection.featureIDs[j]; - if (featureid === id) { - return connection; - } - } - } - - return null; - } - - /** - * Insert a connection between a valve component and the connection component - * @param {Component} valve Valve object - * @param {Connection} connection Connection object - * @memberof Device - * @returns {void} - */ - insertValve(valve: Component, connection: Connection, valvetype: ValveType = ValveType.NORMALLY_OPEN): void { - this.__valveMap.set(valve.id, connection.id); - this.__valveTypeMap.set(valve.id, valvetype); - } - /** - * Returns connections of the device - * @returns {Connections} Connections object - * @memberof Device - */ - get connections(): Array { - return this.__connections; - } - - /** - * Returns a list of valves mapped onto the connection - * @param {Connection} connection Connection object - * @return {Array} - * @memberof Device - */ - getValvesForConnection(connection: Connection): Array { - let connectionid: string = connection.id; - let ret: Array = []; - for (let [key, value] of this.__valveMap) { - // let = pair; - if (connectionid === value) { - let valve = this.getComponentByID(key); - if (valve !== null) { - ret.push(valve); - } - } - } - - return ret; - } - - /** - * Returns whether or not the valve generates a break - * @param {Component} valve Valve device - * @return {any} - * @memberof Device - */ - getValveType(valve: Component): ValveType { - - let valveid = valve.id; - let ret = this.__valveTypeMap.get(valveid); - if (ret === undefined) { - throw new Error("Valve not found"); - } - return ret; - } - - /** - * Returns component object that is identified by the given key - * @param {String} key Key to the component - * @return {Component} - * @memberof Device - */ - getComponentByID(key: string): Component | null { - for (let i in this.__components) { - let component = this.__components[i]; - if (component.id === key) { - return component; - } - } - return null; - //throw new Error("Component with ID " + key + " does not exist"); - } - - /** - * Returns connection object which is identified by a given key - * @param {String} key Key to identify the connection - * @return {Connection} - * @memberof Device - */ - getConnectionByID(key: string): Connection | null { - for (let i in this.__connections) { - let connection = this.__connections[i]; - if (connection.id === key) { - return connection; - } - } - return null; - //throw new Error("Connection with ID " + key + " does not exist"); - } - - /** - * Returns the component given by the user friendly name parameter. Returns null if nothing is found - * @param {String} name - * @return {Component|null} - * @memberof Device - */ - getComponentByName(name: string): Component { - let components = this.__components; - for (const component of components) { - if (name == component.name) { - return component; - } - } - throw new Error("Component with name " + name + "does not exist"); - } - - /** - * Returns a list of connections that have not been routed yet - * @return {Array} - * @memberof Device - */ - getUnroutedConnections(): Array { - let ret: Array = []; - let connections = this.__connections; - for (const connection of connections) { - if (!connection.routed) { - ret.push(connection); - } - } - return ret; - } - /** - * Gets the position of the component port based depending which port you selected - * @param {ComponentPort} componentport Component port object - * @memberof Device - * @returns {Array} Returns array with the absolute positions of the component port - */ - getPositionOfComponentPort(componentport: ComponentPort): Point | undefined { - let components: Array = this.__components; - for (const component of components) { - for (const key of component.ports.keys()) { - let port: undefined | ComponentPort = component.ports.get(key); - if (port != undefined) { - if (componentport.id == port.id) { - //Found the component so return the position - return ComponentPort.calculateAbsolutePosition(componentport, component); - } - } - } - } - } - - /** - * This is the method that is called when one needs to make the feature object. The static function encapsulates - * all the functionality that needs to be implemented. - * @param {string} typeString - * @param {string} setString - * @param {} paramvalues - * @param {string} name - * @param {string} id - * @param {} fabtype - * @param {DXFObject} dxfdata - * @return {EdgeFeature|Feature} - * @memberof Device - */ - static makeFeature( - typeString: string, - paramvalues: any, - name: string = "New Feature", - id: string | undefined = undefined, - fabtype?: string, - dxfdata?: Array | null - ): Feature { - let params: Params = new Params(new Map(), new Map(), new Map()); - - if (typeString === "EDGE") { - //TODO: Put in params initialization - return new EdgeFeature(fabtype, params, id); - } - let featureType = ComponentAPI.getDefinition(typeString); - if (paramvalues && featureType) { - Feature.checkDefaults(paramvalues, featureType.heritable, ComponentAPI.getDefaultsForType(typeString)); - params = new Params(paramvalues, MapUtils.toMap(featureType.unique), MapUtils.toMap(featureType.heritable)); - } else { - let unique: Map = new Map(); - params = new Params(paramvalues, unique.set("position", "Point"), new Map()); - } - - let feature = new Feature(typeString, params, name, id); - if (dxfdata) { - for (let i = 0; i < dxfdata.length; i++) { - feature.addDXFObject(DXFObject.fromJSON(dxfdata[i])); - } - } - - return feature; - } - - get textLayers(): Array { - return this.__textLayers; - } -} diff --git a/src/app/core/dxfObject.ts b/src/app/core/dxfObject.ts deleted file mode 100644 index 0fba548e..00000000 --- a/src/app/core/dxfObject.ts +++ /dev/null @@ -1,76 +0,0 @@ -/** - * DXFObject class - */ -export default class DXFObject { - protected _rootObject: any; - protected _type: string; - - /** - * Default Constructor - * @param {*} jsondata - */ - constructor(jsondata: any) { - this._rootObject = jsondata; - - this._type = jsondata.type; - } - - /** - * Sets type of the object - * @param {String} type - * @memberof DXFObject - * @returns {void} - */ - setType(type: string): void { - this._type = type; - this._rootObject.type = type; - } - - /** - * Gets the type of the object - * @returns {String} Returns type of the object - * @memberof DXFObject - */ - getType(): string { - return this._type; - } - - /** - * Gets the data of the object - * @returns {} Returns the data of the object - * @memberof DXFObject - */ - getData(): any { - return this._rootObject; - } - - /** - * Adds data by passing the key (Name of the data) and it's value - * @param {String} key - * @param {*} value - * @memberof DXFObject - * @returns {void} - */ - addData(key: string, value: any): void { - this._rootObject[key] = value; - } - - /** - * ? - * @returns {Object} - * @memberof DXFObject - */ - toJSON(): JSON { - return this._rootObject; - } - - /** - * - * @param {JSON} json - * @returns {DXFObject} Returns new DXFObject object - * @memberof DXFObject - */ - static fromJSON(json: JSON): DXFObject { - return new DXFObject(json); - } -} diff --git a/src/app/core/edgeFeature.ts b/src/app/core/edgeFeature.ts deleted file mode 100644 index 45f4ef07..00000000 --- a/src/app/core/edgeFeature.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { ComponentAPI } from "@/componentAPI"; -import { DFMType } from "@/app/manufacturing/manufacturingInfo"; -import DXFObject from "./dxfObject"; - -import Feature from "./feature"; -import Params from "./params"; - -/** - * Edge Feature class - */ -export default class EdgeFeature extends Feature { - protected _edgeObjects: any; - - /** - * Default constructor for the edge feature - * @param {Object} edgeObjects - * @param {Params} params - * @param {String} id - */ - constructor(edgeObjects: any, params: Params, id = ComponentAPI.generateID()) { - super("EDGE", params, id, id, DFMType.EDGE); - if (edgeObjects) { - this._edgeObjects = edgeObjects; - } else { - this._edgeObjects = []; - } - } - - /** - * Generate a rectangular edge for the device - * @param {Number} xspan X coordinate - * @param {Number} yspan Y coordinate - * @memberof EdgeFeature - * @returns {void} - */ - generateRectEdge(xspan: number, yspan: number): void { - // TODO: Fix this by trying to incorporate a system where the unit is given - xspan /= 1000; - yspan /= 1000; - const object = new DXFObject({ - type: "POLYLINE", - vertices: [ - { - x: 0, - y: 0, - z: 0 - }, - { - x: xspan, - y: 0, - z: 0 - }, - { - x: xspan, - y: yspan, - z: 0 - }, - { - x: 0, - y: yspan, - z: 0 - }, - { - x: 0, - y: 0, - z: 0 - } - ] - }); - - this.addDXFObject(object); - } -} diff --git a/src/app/core/feature.ts b/src/app/core/feature.ts deleted file mode 100644 index 1dcdf065..00000000 --- a/src/app/core/feature.ts +++ /dev/null @@ -1,445 +0,0 @@ -import CustomComponent from "./customComponent"; -import Params from "./params"; -import Device from "./device"; -import Layer from "./layer"; -import DXFObject from "./dxfObject"; -import { ComponentAPI } from "@/componentAPI"; -import MapUtils from "../utils/mapUtils"; -import { FeatureInterchangeV1_2, LogicalLayerType } from "./init"; -import Parameter from "./parameter"; -import EventBus from "@/events/events"; -import RenderLayer from "../view/renderLayer"; -import { DFMType, ManufacturingInfo } from "../manufacturing/manufacturingInfo"; -import FeatureUtils from "@/app/utils/featureUtils"; - -/** - * Feature class - */ -export default class Feature { - protected _type: string; - protected _params: Params; - protected _name: string; - protected _id: string; - protected _fabtype: DFMType; - protected _dxfObjects: Array; - protected _referenceID: string | null; - public layer: Layer | null; - protected _manufacturingInfo: ManufacturingInfo; - - /** - * Feature Object - * @param {String} type - * @param {} set - * @param {Params} params - * @param {String} name - * @param {String} id - * @param {} fabtype - */ - constructor(type: string, params: Params, name: string, id: string = ComponentAPI.generateID(), fabtype: DFMType = DFMType.XY) { - this._type = type; - this._params = params; - this._name = name; - this._id = id; - this._type = type; - this._fabtype = fabtype; - this._dxfObjects = []; - this._referenceID = null; - this.layer = null; - const tempRenderName: string = this.deriveRenderName(); - let modifierName: string; - if (this.type == "Port") modifierName = "PORT"; - else modifierName = "COMPONENT"; - console.log("rendName: ", tempRenderName); - console.log("z-offset-key: ", ComponentAPI.library[this.type].object.zOffsetKey(tempRenderName)); - this._manufacturingInfo = { - fabtype: fabtype, - layertype: null, - rendername: tempRenderName, - z_offset_key: ComponentAPI.library[this.type].object.zOffsetKey(tempRenderName), - depth: this.getValue(ComponentAPI.library[this.type].object.zOffsetKey(tempRenderName)), - substrate_offset: ComponentAPI.library[this.type].object.substrateOffset(tempRenderName), - substrate: null, - modifier: modifierName - }; - } - - get id(): string { - return this._id; - } - - get type(): string { - return this._type; - } - - /** - * Returns the reference object id - * @return {String} - * @memberof Feature - */ - get referenceID(): string | null { - return this._referenceID; - } - - /** - * Sets the reference object id - * @param {} value - * @memberof Feature - * @returns {void} - * @private - */ - set referenceID(value: string | null) { - this._referenceID = value; - } - - /** - * Sets dxf object - * @param {} dxfdata - * @memberof Feature - * @returns {void} - */ - set dxfObjects(dxfdata: Array) { - this._dxfObjects = dxfdata; - } - - /** - * Returns a string that describes the fabrication type - * @return {DFMType|*} - * @memberof Feature - */ - get fabType(): DFMType { - return this._fabtype; - } - - /** - * Returns the manufacturing information - * @return {ManufacturingInfo} - * @memberof Feature - */ - get manufacturingInfo(): ManufacturingInfo { - this.setManufacturingInfoLayer(); - return this._manufacturingInfo; - } - - /** - * Ensures that layer and substrate values in manufacturingInfo have been set - * @return {void} - * @memberof Feature - */ - setManufacturingInfoLayer(): void { - this._manufacturingInfo.depth = this.getValue(ComponentAPI.library[this.type].object.zOffsetKey(this.deriveRenderName())); - if (this.layer !== null) { - this._manufacturingInfo.layertype = this.layer.type; - this._manufacturingInfo.substrate = FeatureUtils.setSubstrate(this, this._manufacturingInfo.substrate_offset); - } else { - throw new Error("Layer not set in feature " + this.ID + " so manufacturingInfo cannot be set"); - } - } - - /** - * Updates the parameter stored for the given key - * @param {String} key Key to identify the parameter - * @param {} value New value to be assigned to the parameter - * @memberof Feature - * @returns {void} - */ - updateParameter(key: string, value: any): void { - this._params.updateParameter(key, value); - EventBus.get().emit(EventBus.UPDATE_RENDERS, this); - } - - /** - * Generates the serial version of this object - * @returns {Feature} Returns Feature object in JSON format - * @memberof Feature - */ - toJSON() { - const output = { - id: this._id, - name: this._name, - type: this._type, - params: this._params.toJSON() - }; - - return output; - } - - /** - * Generates the serial version of this object but conforms to the interchange format - * @returns {} - * @memberof Feature - */ - toInterchangeV1(): FeatureInterchangeV1_2 { - // TODO: We need to figure out what to do and what the final feature format will be - const output = { - id: this._id, - name: this._name, - macro: this._type, - params: this._params.toJSON(), - type: this._fabtype, - referenceID: this._referenceID, - dxfData: this._dxfObjects.map(function(dxfObject) { - return dxfObject.toJSON(); - }), - layerID: this.layer?.id ?? "", - }; - return output; - } - - /** - * Gets dxfObject - * @returns {DXFObject} - * @memberof Feature - */ - get dxfObjects() { - return this._dxfObjects; - } - - /** - * Gets the ID of the object - * @returns {String} Returns the ID - * @memberof Feature - */ - get ID() { - return this._id; - } - - /** - * Set the name of the object - * @param {String} name - * @memberof Feature - * @returns {void} - */ - setName(name: string): void { - this._name = name; - } - - /** - * Gets the name of the feature object - * @returns {String} Returns the name of the feature object - * @memberof Feature - * - */ - getName(): string { - return this._name; - } - - /** - * Gets type of the feature object - * @returns {String} Returns the type of the object - * @memberof Feature - */ - getType(): string { - return this._type; - } - - /** - * Gets the value of certain feature by passing a key identifier - * @param {String} key Key is use to identify the desire feature - * @returns {} Returns the value of the parameters - * @memberof Feature - */ - getValue(key: string) { - try { - return this._params.getValue(key); - } catch (err) { - if (this.hasDefaultParam(key)) return this.getDefaults()[key]; - else throw new Error("Unable to get value for key: " + key); - } - } - - /** - * Checks if the feature object corresponding to the key passed has default parameters. - * @param {String} key - * @returns {boolean} Returns true if it has default parameters - * @memberof Feature - */ - hasDefaultParam(key: string): boolean { - if (this.getDefaults().hasOwnProperty(key)) return true; - else return false; - } - - /** - * Checks if the feature object has unique parameters. To select object, a key identifier is requiered - * @param {String} key - * @returns {boolean} - * @memberof Feature - */ - hasUniqueParam(key: string): boolean { - return this._params.isUnique(key); - } - - /** - * Checks if the feature object has heritable parameters. To select object, a key identifier is requiered - * @param {String} key - * @returns {boolean} - * @memberof Feature - */ - hasHeritableParam(key: string): boolean { - return this._params.isHeritable(key); - } - - /** - * Gets the heritable parameters of the feature object - * @returns {Array} Returns the heritable parameters of the feature object - * @memberof Feature - */ - getHeritableParams(): { [key: string]: string } { - return ComponentAPI.getHeritableForType(this.getType()); - } - - /** - * Gets the unique parameters of the feature object - * @returns {Array} Returns the unique parameters of the feature object - * @memberof Feature - */ - getUniqueParams(): { [key: string]: string } { - return ComponentAPI.getUniqueForType(this.getType()); - } - - /** - * Gets the default parameters of the feature object - * @returns {Array} Returns the default paramets of the feature object - * @memberof Feature - */ - getDefaults(): { [key: string]: number } { - return ComponentAPI.getDefaultsForType(this.getType()); - } - - /** - * Gets the parameters of the feature object - * @returns {Array} Returns the parameters of the feature object - * @memberof Feature - */ - getParams(): { [index: string]: Parameter } { - return this._params.parameters; - } - - /** - * Sets the passed parameter as a parameter of the feature object - * @param {Params} params New parameter to the object - * @memberof Feature - * @returns {void} - */ - setParams(params: { [index: string]: Parameter }): void { - this._params.loadParameters(params); - } - - /** - * Replicates the position - * @param {Number} xpos X coordinate to replicate - * @param {Number} ypos Y coordinate to replicate - * @returns {Feature} - * @memberof Feature - */ - replicate(xpos: number, ypos: number): Feature { - const paramscopy = this._params; - const replicaparams: { [key: string]: any } = { - position: [xpos, ypos] - }; - for (const key in this._params.parameters) { - replicaparams[key] = this.getValue(key); - } - - const ret = Device.makeFeature( - this._type, - replicaparams, - this._name, - ComponentAPI.generateID(), - "XY", - this._dxfObjects.map(function(dxfObject) { - return dxfObject.toJSON(); - }) - ); - - return ret; - } - - /** - * Determines the string which should be used for the renderName - * @returns Returns the render name - * @memberof Feature - */ - - deriveRenderName(): string { - if (!ComponentAPI.library[this.type]) { - console.error("Type unrecognized, defaulting to template."); - this._type = "Template"; - } - return ComponentAPI.library[this.type].key; - } - - /** - * Checks whether the values do not have an own property and assigns them a default value. - * @param {*} values - * @param {*} heritable - * @param {*} defaults - * @returns Returns the values - * @memberof Feature - */ - static checkDefaults(values: { [key: string]: number }, heritable: { [key: string]: string }, defaults: { [key: string]: number }) { - for (const key in heritable) { - if (!Object.prototype.hasOwnProperty.call(values, key)) values[key] = defaults[key]; - } - return values; - } - - /** - * Loads from JSON format the features for a device - * @param {JSON} json - * @returns {Feature} Returns a Device object with the features in the JSON - * @memberof Feature - */ - static fromJSON(json: any) { - return Device.makeFeature(json.type, json.params, json.name, json.id, "XY", []); - } - - /** - * Loads from an InetchangeV1 format the features for a device object - * @param {*} json - * @returns {Feature} - * @memberof Feature - */ - static fromInterchangeV1(json: any) { - let ret; - // TODO: This will have to change soon when the thing is updated - ret = Device.makeFeature(json.macro, json.params, json.name, json.id, json.type, json.dxfData); - if (Object.prototype.hasOwnProperty.call(json, "referenceID")) { - ret.referenceID = json.referenceID; - // Registry.currentDevice.updateObjectReference(json.id, json.referenceID); - } - return ret; - } - - /** - * Creates a custom feature for the component based on the parameters values - * @returns {Feature} Returns a new feature object - * @memberof Feature - */ - static makeCustomComponentFeature(customcomponent: CustomComponent, setstring: string, paramvalues: { [key: string]: any }, name = "New Feature", id = undefined) { - const definitions = CustomComponent.defaultParameterDefinitions(); - Feature.checkDefaults(paramvalues, definitions.heritable, ComponentAPI.getDefaultsForType(customcomponent.type)); - const params = new Params(paramvalues, MapUtils.toMap(definitions.unique), MapUtils.toMap(definitions.heritable)); - const ret = new Feature(customcomponent.type, params, name, id, DFMType.XY); - ret.dxfObjects = customcomponent.dxfData; - return ret; - } - - /** - * Returns the dxf objects - * @return {DXFObject} - * @memberof Feature - */ - getDXFObjects(): Array { - return this._dxfObjects; - } - - /** - * Add a DXF object - * @param {DXFObject} dxfobject - * @memberof Feature - * @returns {void} - */ - addDXFObject(dxfobject: DXFObject): void { - this._dxfObjects.push(dxfobject); - } -} diff --git a/src/app/core/geometryElement.ts b/src/app/core/geometryElement.ts deleted file mode 100644 index 01f9847d..00000000 --- a/src/app/core/geometryElement.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { ComponentAPI } from "@/componentAPI"; -import { GeometricOperationType, GeometryElementInterchangeV1_2 } from "./init"; -import Layer from "./layer"; -import Params from "./params"; - -export default class GeometryElement { - - private _id: string; - private _macro: string; - private _geometricOperation: GeometricOperationType; - private _layer: Layer; - - private _params: Params; - - constructor(id: string = ComponentAPI.generateID(), macro:string, geometricOperation: GeometricOperationType, layer: Layer, params: { [k: string]: any } = {}) { - this._id = id; - this._macro = macro; - this._geometricOperation = geometricOperation; - this._layer = layer; - - // Initilize the params - this._params = new Params(params, new Map(), new Map()); - } - - get id(): string { - return this._id; - } - - get type(): string { - return this._macro; - } - - get geometricOperation(): GeometricOperationType { - return this._geometricOperation; - } - - get layer(): Layer { - return this._layer; - } - - get params(): Params { - return this._params; - } - - toInterchageV1_2(): GeometryElementInterchangeV1_2 { - return { - id: this._id, - macro: this._macro, - params: this._params.toJSON(), - geometricOperation: this._geometricOperation, - mgflayerID: this._layer.id - }; - } -} \ No newline at end of file diff --git a/src/app/core/init.ts b/src/app/core/init.ts deleted file mode 100644 index fd2e2731..00000000 --- a/src/app/core/init.ts +++ /dev/null @@ -1,144 +0,0 @@ -export type Point = [number, number]; - -export type Segment = [Point, Point]; - -export type ParamsInterchangeType = {[key: string]: any}; - -export type ToolPaperObject = paper.CompoundPath | paper.Path | paper.PointText | paper.PathItem; - -export type InterchangeV1_2 = { - name: string; - params: ParamsInterchangeType; - layers: Array; - groups: Array; - components: Array; - connections: Array; - valves: Array; - version: string; - renderLayers: Array; - features: Array; -}; - -export enum LogicalLayerType { - FLOW = "FLOW", - CONTROL = "CONTROL", - INTEGRATION = "INTEGRATION" -} - -export enum ValveType { - NORMALLY_OPEN = "NORMALLY_OPEN", - NORMALLY_CLOSED = "NORMALLY_CLOSED", -} - -export enum GeometricOperationType{ - UNION = "UNION", - INTERSECTION = "INTERSECTION", - DIFFERENCE = "SUBTRACTION", - XOR = "XOR", -} - -export type DeviceInterchangeV1 = { - name: string; - params: ParamsInterchangeType; - layers: Array; - groups: Array; - components: Array; - connections: Array; - valves: Array; - version: string; -}; - -export type DeviceInterchangeV1_1 = { - name: string; - params: ParamsInterchangeType; - layers: Array; - groups: Array; - components: Array; - connections: Array; - version: string; -}; - -export type ComponentInterchangeV1 = { - id: string; - name: string; - entity: string; - params: ParamsInterchangeType; - "x-span": number; - "y-span": number; - ports: Array; - layers: Array; -}; - -export type ConnectionInterchangeV1_2 = { - id: string; - name: string; - entity: string; - source: ConnectionTargetInterchangeV1; - sinks: Array; - paths: Array; - params: ParamsInterchangeType; - layer: string; -}; - -export type ValveInterchangeV1_2 = { - componentid: string; - connectionid: string; - type: ValveType; - params: ParamsInterchangeType; -} - -export type LayerInterchangeV1 = { - id: string; - name: string; - params: ParamsInterchangeType; - group: string; - type: string; - features: Array; -}; - -export type RenderLayerInterchangeV1_2 = { - id: string; - features: Array; - modellayer: string | null; - color: string | undefined; - name: string; - type: string; -}; - -export type FeatureInterchangeV1_2 = { - id: string; - name: string; - macro: string; - layerID: string | null; - referenceID: string | null; // Delete this in the future - params: ParamsInterchangeType; - dxfData: any; // 3DuF specific data for raw import/export of DXF objects - type: string; -}; - -export type GeometryElementInterchangeV1_2 = { - id: string; - macro: string; - params: ParamsInterchangeType; - geometricOperation: string; - mgflayerID: string; -} - -export type ComponentPortInterchangeV1 = { - x: number; - y: number; - label: string; - layer: string; -}; - -export type ConnectionTargetInterchangeV1 = { - component: string; - port: string; -}; - -export type ConnectionPathInterchangeV1_2 = { - wayPoints: Array; - source: ConnectionTargetInterchangeV1 | null; - sink: ConnectionTargetInterchangeV1 | null; - features: Array; -}; diff --git a/src/app/core/layer.ts b/src/app/core/layer.ts deleted file mode 100644 index 5dc49c58..00000000 --- a/src/app/core/layer.ts +++ /dev/null @@ -1,360 +0,0 @@ -import uuid from "node-uuid"; -import EdgeFeature from "./edgeFeature"; -import Feature from "./feature"; -import Params from "./params"; -import Device from "./device"; -import { FeatureInterchangeV1_2 } from "./init"; -import { LayerInterchangeV1, LogicalLayerType } from "./init"; -import { ComponentAPI } from "@/componentAPI"; - -/** - * Layer class - */ -export default class Layer { - params: Params; - name: string; - features: { [index: string]: Feature }; - featureCount: number; - device?: Device; - private __id: string; - private __type: LogicalLayerType = LogicalLayerType.FLOW; - private __group: string; - - /** - * Default Constructor for the layer - * @param {*} values Value of the layer - * @param {String} name Name of the layer - */ - constructor(values: { [index: string]: any }, name: string = "New Layer", type: LogicalLayerType = LogicalLayerType.FLOW, group: string = "0", device?: Device) { - this.params = new Params(values, Layer.getUniqueParameters(), Layer.getHeritableParameters()); - this.name = name; - this.features = {}; - this.featureCount = 0; - this.device = device; - this.__id = ComponentAPI.generateID(); - this.__type = type; - this.__group = group; - } - - get type(): LogicalLayerType { - return this.__type; - } - - get id(): string { - return this.__id; - } - - set id(ID: string) { - this.__id = ID; - } - - get group(): string { - return this.__group; - } - - /** - * Adds a feature to the layer - * @param {Feature} feature Feature to pass to add to the layer - * @memberof Layer - * @returns {void} - */ - addFeature(feature: Feature): void { - this.__ensureIsAFeature(feature); - this.features[feature.ID] = feature; - this.featureCount += 1; - //TODO - Verify that this is not a problem anymore - feature.layer = this; - feature.setManufacturingInfoLayer(); - } - - /** - * Returns index of layer - * @returns {Number} - * @memberof Layer - */ - getIndex(): number { - if (this.device) { - return this.device.layers.indexOf(this); - } else { - throw new Error("No device referenced on this layer"); - } - } - /* - estimateLayerHeight(){ - let dev = this.device; - let flip = this.params.getValue("flip"); - let offset = this.params.getValue("z_offset"); - if (dev){ - let thisIndex = this.getIndex(); - let targetIndex; - if (flip) targetIndex = thisIndex - 1; - else targetIndex = thisIndex + 1; - if (thisIndex >= 0 || thisIndex <= (dev.layers.length -1)){ - let targetLayer = dev.layers[targetIndex]; - return Math.abs(offset - targetLayer.params.getValue("z_offset")); - } else { - if (thisIndex -1 >= 0){ - let targetLayer = dev.layers[thisIndex -1]; - return targetLayer.estimateLayerHeight(); - } - } - } - return 0; - } -*/ - - /** - * Checks whether the argument pass is a feature - * @param {Feature} feature Feature object - * @memberof Layer - * @returns {void} - */ - __ensureIsAFeature(feature: any): void { - if (!(feature instanceof Feature) && !(feature instanceof EdgeFeature)) { - throw new Error("Provided value" + feature + " is not a Feature! Did you pass an ID by mistake?"); - } - } - - /** - * Checks whether the feature already exist - * @param {Feature} feature Feature object - * @memberof Layer - * @returns {void} - */ - __ensureFeatureExists(feature: Feature): void { - if (!this.containsFeature(feature)) throw new Error("Layer does not contain the specified feature!"); - } - - /** - * Checks if feature exist based on it's ID - * @param {String} featureID ID of the feature to search for - * @memberof Layer - * @returns {void} - */ - __ensureFeatureIDExists(featureID: string): void { - if (!this.containsFeatureID(featureID)) throw new Error("Layer does not contain a feature with the specified ID!"); - } - - /** - * Returns unique parameters - * @returns {Map} - * @memberof Layer - * @returns {void} - */ - static getUniqueParameters(): Map { - let unique: Map = new Map(); - unique.set("z_offset", "Float"); - unique.set("flip", "Boolean"); - return unique; - } - - /** - * Returns heritable parameters - * @returns {Map} - * @memberof Layer - * @returns {void} - */ - static getHeritableParameters(): Map { - return new Map(); - } - - /** - * Returns feature based on it's ID - * @param {String} featureID - * @returns {Feature} - * @memberof Layer - */ - getFeature(featureID: string): Feature { - this.__ensureFeatureIDExists(featureID); - return this.features[featureID]; - } - - /** - * Removes selected feature - * @param {Feature} feature Feature object - * @memberof Layer - * @returns {void} - */ - removeFeature(feature: Feature): void { - this.removeFeatureByID(feature.ID); - console.log("Device: ", this.device); - if (this.device !== null || this.device !== undefined) { - this.device?.removeFeature(feature); - } - } - - // TODO: Stop using delete, it's slow! - /** - * Removes a feature by passing it's ID as a parameter - * @param {string} featureID ID of the feature - * @memberof Layer - * @returns {void} - */ - removeFeatureByID(featureID: string): void { - this.__ensureFeatureIDExists(featureID); - const feature: Feature = this.features[featureID]; - this.featureCount -= 1; - delete this.features[featureID]; - } - - /** - * Checks if object contains a feature - * @param {Feature} feature Feature object - * @returns {Boolean} true if it has the feature - * @memberof Layer - */ - containsFeature(feature: Feature): boolean { - this.__ensureIsAFeature(feature); - return this.features.hasOwnProperty(feature.ID); - } - - /** - * Checks if object contains a feature based on the feature's ID - * @param {String} featureID ID of the feature to search for - * @returns {Boolean} true if it has the feature - * @memberof Layer - */ - containsFeatureID(featureID: string): boolean { - return this.features.hasOwnProperty(featureID); - } - - /** - * Gets all features from the layers - * @returns {Array} Returns all features from the layers - * @memberof Layer - */ - getAllFeaturesFromLayer(): { [index: string]: Feature } { - return this.features; - } - - /** - * Convers features to JSON format - * @returns {JSON} Returns a JSON format with the features in a JSON format - * @memberof Layer - */ - __featuresToJSON(): { [index: string]: any } { - const output: { [index: string]: any } = {}; - for (const i in this.features) { - output[i] = this.features[i].toJSON(); - } - return output; - } - - /** - * Converts features to Interchange format - * @returns {Array} Returns an array with the features in Interchange format - * @memberof Layer - */ - __featuresInterchangeV1(): Array { - const output: Array = []; - for (const i in this.features) { - output.push(this.features[i].toInterchangeV1()); - } - return output; - } - - /** - * Loads features from JSON format - * @param {JSON} json JSON format file - * @memberof Layer - */ - __loadFeaturesFromJSON(json: { [index: string]: any }): void { - for (const i in json) { - this.addFeature(Feature.fromJSON(json[i])); - } - } - - /** - * Loads features from Interchange format - * @param {*} json Interchange format file - * @memberof Layer - */ - __loadFeaturesFromInterchangeV1(json: { [index: string]: any }): void { - for (const i in json) { - this.addFeature(Feature.fromInterchangeV1(json[i])); - } - } - - // TODO: Replace Params and remove static method - /** - * Converts the attributes of the object into a JSON format - * @returns {JSON} Returns a JSON format with the attributes of the object - * @memberof Layer - */ - toJSON(): { [index: string]: any } { - const output: { [index: string]: any } = {}; - output.name = this.name; - output.params = this.params.toJSON(); - output.features = this.__featuresToJSON(); - return output; - } - - /** - * Converts the attributes of the object into Interchange format - * @returns {LayerInterchangeV1} Returns a Interchange format with the attributes of the object - * @memberof Layer - */ - toInterchangeV1(): LayerInterchangeV1 { - let layerType = "FLOW"; - if (this.type === LogicalLayerType.FLOW) { - layerType = "FLOW"; - } else if (this.type === LogicalLayerType.CONTROL) { - layerType = "CONTROL"; - } else if (this.type === LogicalLayerType.INTEGRATION) { - layerType = "INTEGRATION"; - } else { - throw new Error("Unknown layer type: " + this.type); - } - - const output: LayerInterchangeV1 = { - id: this.__id, - name: this.name, - type: layerType, - // TODO - Add group and unique name parameters to the system and do type checking - // against type and not name in the future - group: this.__group, - params: this.params.toJSON(), - features: this.__featuresInterchangeV1() - }; - return output; - } - - /** - * Generate the feature layer json that is neccissary for - * seriailizing the visual of the 3DuF designs - * - * @returns {*} json of the features - * @memberof Layer - */ - toFeatureLayerJSON(): { [index: string]: any } { - const output: { [index: string]: any } = {}; - output.name = this.name; - output.params = this.params.toJSON(); - output.features = this.__featuresInterchangeV1(); - return output; - } - - /** - * Load from an Interchange format a new layer object - * @param {*} json - * @returns {Layer} Returns a new layer object - * @memberof Layer - */ - static fromInterchangeV1(json: LayerInterchangeV1, device: Device): Layer { - let layerType = LogicalLayerType.FLOW; - if (Object.prototype.hasOwnProperty.call(json, "type")) { - if (json.type === "FLOW") { - layerType = LogicalLayerType.FLOW; - } else if (json.type === "CONTROL") { - layerType = LogicalLayerType.CONTROL; - } else if (json.type === "INTEGRATION") { - layerType = LogicalLayerType.INTEGRATION; - } else { - throw new Error("Unknown layer type: " + json.type); - } - } - const newLayer: Layer = new Layer(json.params, json.name, layerType, json.group, device); - newLayer.__loadFeaturesFromInterchangeV1(json.features); - return newLayer; - } -} diff --git a/src/app/core/parameter.ts b/src/app/core/parameter.ts deleted file mode 100644 index b7e5b061..00000000 --- a/src/app/core/parameter.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Parameter class - */ -export default class Parameter { - private __type: string; - private __value: any; - - /** - * Default Constructor of the Parameter object - * @param {String} type - * @param {*} value - */ - constructor(type: string, value: any) { - //Check value if its parsable string - if (typeof value === "string" && type === "Float") { - value = parseInt(value); - } else if (typeof value === "string" && type === "Integer") { - value = parseInt(value); - } - //Parameter.checkValue(type, value); - this.__type = type; - this.__value = value; - } - /** - * @returns {} - * @memberof Parameter - */ - toJSON(): any { - return this.__value; - } - /** - * Gets value of parameter - * @returns {} Returns value of the parameter - * @memberof Parameter - */ - public get value(): any { - return this.__value; - } - /** - * Gets type of parameter - * @returns {String} Returns the type of parameter - * @memberof Parameter - */ - public get type(): string { - return this.__type; - } - - /** - * Updates the value of parameter - * @param {*} value New value of the parameter - * @memberof Parameter - * @returns {void} - */ - updateValue(value: any): void { - //Parameter.checkValue(this.__type, value); - this.__value = value; - } - - resetValue(): void {} -} diff --git a/src/app/core/parameters/booleanValue.ts b/src/app/core/parameters/booleanValue.ts deleted file mode 100644 index 7d55a746..00000000 --- a/src/app/core/parameters/booleanValue.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Parameter from "../parameter"; - -export default class BooleanValue extends Parameter { - static readonly typeString: string = "Boolean"; - static readonly description: string = "BooleanValue must be true or false."; - - constructor(value: boolean) { - super("Boolean", value); - } - - static isValid(value: any): boolean { - if (typeof value === "boolean") return true; - else return false; - } -} diff --git a/src/app/core/parameters/floatValue.ts b/src/app/core/parameters/floatValue.ts deleted file mode 100644 index c12224f9..00000000 --- a/src/app/core/parameters/floatValue.ts +++ /dev/null @@ -1,16 +0,0 @@ -import Parameter from "../parameter"; -import * as NumberUtils from "../../utils/numberUtils"; - -export default class FloatValue extends Parameter { - static readonly typeString: string = "Float"; - static readonly description: string = "FloatValue must be a number >= 0, such as 3.827"; - - constructor(value: number) { - super("Float", value); - } - - static isValid(value: any): boolean { - if (typeof value === "number" && NumberUtils.isFloatOrInt(value) && value >= 0) return true; - else return false; - } -} diff --git a/src/app/core/parameters/integerValue.ts b/src/app/core/parameters/integerValue.ts deleted file mode 100644 index eb6d2d8e..00000000 --- a/src/app/core/parameters/integerValue.ts +++ /dev/null @@ -1,16 +0,0 @@ -import Parameter from "../parameter"; -import * as NumberUtils from "../../utils/numberUtils"; - -export default class IntegerValue extends Parameter { - static readonly typeString: string = "Integer"; - static readonly description: string = "FloatValue must be an integer >= 0."; - - constructor(value: number) { - super("Integer", value); - } - - static isValid(value: any): boolean { - if (typeof value === "number" && NumberUtils.isInteger(value) && value >= 0) return true; - else return false; - } -} diff --git a/src/app/core/parameters/pointArray.ts b/src/app/core/parameters/pointArray.ts deleted file mode 100644 index 7a158523..00000000 --- a/src/app/core/parameters/pointArray.ts +++ /dev/null @@ -1,29 +0,0 @@ -import Parameter from "../parameter"; -import pointValue from "./pointValue"; -import { Segment } from "@/app/core/init"; - -export default class PointArray extends Parameter { - static readonly typeString: string = "PointArray"; - static readonly description: string = "Should be an array of points"; - - constructor(value: Segment) { - super("PointArray", value); - } - - static isValid(value: any): boolean { - if (value instanceof Array) { - if (value.length == 0) { - return true; - } - for (var i in value) { - if (!pointValue.isValid(i)) { - console.log("Does not contain a valid point"); - return false; - } - } - } else { - return false; - } - return true; - } -} diff --git a/src/app/core/parameters/pointValue.ts b/src/app/core/parameters/pointValue.ts deleted file mode 100644 index e086b661..00000000 --- a/src/app/core/parameters/pointValue.ts +++ /dev/null @@ -1,17 +0,0 @@ -import Parameter from "../parameter"; -import * as NumberUtils from "../../utils/numberUtils"; -import { Point } from "@/app/core/init"; - -export default class PointValue extends Parameter { - static readonly typeString: string = "Point"; - static readonly description: string = "PointValue must be an array containing exactly two numbers, such as [3,-5]"; - - constructor(value: Point) { - super("Point", value); - } - - static isValid(value: any): boolean { - if (value instanceof Array && value.length == 2 && NumberUtils.isFloatOrInt(value[0]) && NumberUtils.isFloatOrInt(value[1])) return true; - else return false; - } -} diff --git a/src/app/core/parameters/segmentArray.ts b/src/app/core/parameters/segmentArray.ts deleted file mode 100644 index 706a4718..00000000 --- a/src/app/core/parameters/segmentArray.ts +++ /dev/null @@ -1,29 +0,0 @@ -import Parameter from "../parameter"; -import pointArray from "./pointArray"; -import { Segment } from "@/app/core/init"; - -export default class SegmentArray extends Parameter { - static readonly typeString: string = "SegmentArray"; - static readonly description: string = "Should be an array of PointArrays"; - - constructor(value: Array) { - super("SegmentArray", value); - } - - static isValid(value: any): boolean { - if (value instanceof Array) { - if (value.length == 0) { - return true; - } - for (var i in value) { - if (!pointArray.isValid(i)) { - console.log("Does not contain a valid point"); - return false; - } - } - } else { - return false; - } - return true; - } -} diff --git a/src/app/core/parameters/stringValue.ts b/src/app/core/parameters/stringValue.ts deleted file mode 100644 index a99ab97c..00000000 --- a/src/app/core/parameters/stringValue.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Parameter from "../parameter"; - -export default class StringValue extends Parameter { - static readonly typeString: string = "String"; - static readonly description: string = "StringValue must be a String, such as 'foobar'"; - - constructor(value: string) { - super("String", value); - } - - static isValid(value: any): boolean { - if (typeof value === "string" || value instanceof String) return true; - else return false; - } -} diff --git a/src/app/core/params.ts b/src/app/core/params.ts deleted file mode 100644 index 9761c6a7..00000000 --- a/src/app/core/params.ts +++ /dev/null @@ -1,172 +0,0 @@ -/// -import Parameter from "./parameter"; -/** - * Params class - */ -export default class Params { - private __unique: Map; - private __heritable: Map; - private __parameters: { [index: string]: Parameter }; - - /** - * Default constructor create a Params object. - * @param {} values Values of the params - * @param {Boolean} unique Boolean if it's unique - * @param {} heritable Boolean if it's heritable - */ - constructor(values: { [index: string]: any }, unique: Map, heritable: Map) { - this.__unique = unique; - this.__heritable = heritable; - this.__parameters = {}; - for (let key in values) { - this.__parameters[key] = new Parameter(typeof values[key], values[key]); - } - } - - /** - * Returns the parameters object (TODO - Remove this in the future) - * - * @readonly - * @memberof Params - */ - get parameters(): { [index: string]: Parameter } { - return this.__parameters; - } - - /** - * Updates parameter value. - * @param {String} key Identifier of the parameter - * @param {*} value New value of the parameter - * @memberof Params - * @returns {void} - */ - updateParameter(key: string, value: any): void { - if (this.__parameters.hasOwnProperty(key)) { - this.__parameters[key].updateValue(value); - } else { - throw new Error(key + "parameter does not exist in Params object"); - } - } - /** - * Checks if the object has certain parameter. - * @param {String} key The key is use to identify the parameter - * @memberof Params - * @returns {void} - */ - __ensureHasKey(key: string): void { - if (!this.__parameters.hasOwnProperty(key)) throw new Error(key + " parameter not found in Params object."); - } - /** - * Gets the value of the selected parameter. - * @param {String} key The key is needed to identify the parameter - * @returns Returns parameter value - * @memberof Params - */ - getValue(key: string): any { - this.__ensureHasKey(key); - return this.__parameters[key].value; - } - - /** - * Checks if param object has unique key. - * @param {String} key Key to identify the param - * @returns {boolean} - * @memberof Params - */ - isUnique(key: string): boolean { - return this.__unique.has(key); - } - /** - * Checks if param object has heritable attribute. - * @param {String} key Key to identify the param - * @returns {boolean} - * @memberof Params - */ - isHeritable(key: string): boolean { - return this.__heritable.has(key); - } - - /** - * Converts to JSON format. - * @returns {JSON} Returns JSON format. - * @memberof Params - */ - toJSON(): { [index: string]: any } { - let json: { [index: string]: any } = {}; - for (let key in this.__parameters) { - if (this.__parameters[key] != undefined) { - json[key] = this.__parameters[key].value; - } - } - return json; - } - /** - * Creates new params object from a JSON format. - * @param {JSON} json - * @param {*} unique - * @param {*} heritable - * @returns {Params} Returns a new params object. - * @memberof Params - */ - static fromJSON(json: Map, unique: Map, heritable: Map): Params { - return new Params(json, unique, heritable); - } - /** - * Checks if it has parameters. - * @param {String} key The key is use to identify the desire parameter. - * @returns {boolean} - * @memberof Params - */ - hasParam(key: string): boolean { - return this.__parameters.hasOwnProperty(key); - } - - /** - * Returns a ES6 Map() type object with keys and values. - * @return {Map} - * @memberof Params - */ - toMap(): Map { - let ret = new Map(); - for (let key in this.__parameters) { - if (this.__parameters[key] != undefined) { - ret.set(key, this.__parameters[key].value); - } - } - return ret; - } - - /** - * Sets the parameters of the params - * - * @param {{ [index: string]: Parameter }} parameters - * @memberof Params - */ - loadParameters(parameters: { [index: string]: Parameter }): void { - for (let key in parameters) { - this.__parameters[key] = parameters[key]; - } - } - - /** - * Returns the list of unique keys of the params. - * - * @readonly - * @type {Array} - * @memberof Params - */ - get unique(): Array { - return Array.from(this.__unique.keys()); - } - - /** - * Returns the list of heritable keys of the params. - * - * @readonly - * @type {Array} - * @memberof Params - */ - get heritable(): Array { - return Array.from(this.__heritable.keys()); - } -} diff --git a/src/app/core/registry.ts b/src/app/core/registry.ts deleted file mode 100644 index 7db17568..00000000 --- a/src/app/core/registry.ts +++ /dev/null @@ -1,31 +0,0 @@ -import uuid from "node-uuid"; -import RenderLayer from "../view/renderLayer"; -import ViewManager from "../view/viewManager"; -import AdaptiveGrid from "../view/grid/adaptiveGrid"; -import Device from "./device"; -import Layer from "./layer"; - -class Registry { - /* - Place where we store the data necessary for the text label - TODO: Change this from this awful hacky implementation - */ - constructor() { - // registerSets({ Basic: Basic }); - } - - //TODO: Convert this into multiple text layers for use with multiple layers - id_counter = 0; - threeRenderer = null; - - public currentDevice: Device | null = null; - canvasManager = null; - currentTextLayer: Layer | null = null; - currentGrid: AdaptiveGrid | null = null; - view = null; - viewManager: ViewManager | null = null; -} - -const instance = new Registry(); - -export default instance; diff --git a/src/app/examples/dafdtemplate.json b/src/app/examples/dafdtemplate.json deleted file mode 100644 index 3d9ba8d8..00000000 --- a/src/app/examples/dafdtemplate.json +++ /dev/null @@ -1,235 +0,0 @@ -{ - "name": "DAFD Template", - "params": { "width": 135000, "length": 85000 }, - "components": [ - { - "id": "e958b4d0-6155-11e9-89ad-d58be75aeb6f", - "name": "Port_in", - "entity": "PORT", - "params": { "position": [30000, 40000], "portRadius": 1998, "height": 1100 }, - "xspan": 3996, - "yspan": 3996, - "ports": [] - }, - { - "id": "eadf7be0-6155-11e9-89ad-d58be75aeb6f", - "name": "Port_out", - "entity": "PORT", - "params": { "position": [110000, 40000], "portRadius": 1998, "height": 1100 }, - "xspan": 3996, - "yspan": 3996, - "ports": [] - }, - { - "id": "ec125690-6155-11e9-89ad-d58be75aeb6f", - "name": "Port_oil1", - "entity": "PORT", - "params": { "position": [60000, 10000], "portRadius": 1998, "height": 1100 }, - "xspan": 3996, - "yspan": 3996, - "ports": [] - }, - { - "id": "f0839360-6155-11e9-89ad-d58be75aeb6f", - "name": "Port_oil2", - "entity": "PORT", - "params": { "position": [60000, 70000], "portRadius": 1998, "height": 1100 }, - "xspan": 3996, - "yspan": 3996, - "ports": [] - }, - { - "id": "b6d5c690-d628-11e9-9185-859b5727feb8", - "name": "DropletGen_1", - "entity": "NOZZLE DROPLET GENERATOR", - "params": { - "position": [60000, 40000], - "orificeSize": 200, - "orificeLength": 400, - "oilInputWidth": 800, - "waterInputWidth": 600, - "outputWidth": 600, - "outputLength": 600, - "height": 250 - }, - "xspan": 1800, - "yspan": 600, - "ports": [ - { "x": 400, "y": -300, "layer": "FLOW", "label": "1" }, - { "x": 1800, "y": 0, "layer": "FLOW", "label": "2" }, - { "x": 400, "y": 300, "layer": "FLOW", "label": "3" }, - { "x": 0, "y": 0, "layer": "FLOW", "label": "4" } - ] - } - ], - "connections": [], - "features": [ - { - "name": "flow", - "color": "indigo", - "params": { "z_offset": 0, "flip": false }, - "features": { - "e957f180-6155-11e9-89ad-d58be75aeb6f": { - "id": "e957f180-6155-11e9-89ad-d58be75aeb6f", - "name": "New Feature", - "macro": "Port", - "set": "Basic", - "referenceID": "e958b4d0-6155-11e9-89ad-d58be75aeb6f", - "params": { "position": [30000, 40000], "portRadius": 1998, "height": 1100 }, - "dxfData": [], - "type": "XY" - }, - "eadf06b0-6155-11e9-89ad-d58be75aeb6f": { - "id": "eadf06b0-6155-11e9-89ad-d58be75aeb6f", - "name": "New Feature", - "macro": "Port", - "set": "Basic", - "referenceID": "eadf7be0-6155-11e9-89ad-d58be75aeb6f", - "params": { "position": [110000, 40000], "portRadius": 1998, "height": 1100 }, - "dxfData": [], - "type": "XY" - }, - "ec119340-6155-11e9-89ad-d58be75aeb6f": { - "id": "ec119340-6155-11e9-89ad-d58be75aeb6f", - "name": "New Feature", - "macro": "Port", - "set": "Basic", - "referenceID": "ec125690-6155-11e9-89ad-d58be75aeb6f", - "params": { "position": [60000, 10000], "portRadius": 1998, "height": 1100 }, - "dxfData": [], - "type": "XY" - }, - "f082f720-6155-11e9-89ad-d58be75aeb6f": { - "id": "f082f720-6155-11e9-89ad-d58be75aeb6f", - "name": "New Feature", - "macro": "Port", - "set": "Basic", - "referenceID": "f0839360-6155-11e9-89ad-d58be75aeb6f", - "params": { "position": [60000, 70000], "portRadius": 1998, "height": 1100 }, - "dxfData": [], - "type": "XY" - }, - "2ea7a050-6156-11e9-89ad-d58be75aeb6f": { - "id": "2ea7a050-6156-11e9-89ad-d58be75aeb6f", - "name": "2ea7a050-6156-11e9-89ad-d58be75aeb6f", - "macro": "EDGE", - "set": "Basic", - "dxfData": [], - "type": "EDGE" - }, - "a7c90920-d3f1-11e9-ad52-c581dcc5e148": { - "id": "a7c90920-d3f1-11e9-ad52-c581dcc5e148", - "name": "a7c90920-d3f1-11e9-ad52-c581dcc5e148", - "macro": "EDGE", - "set": "Basic", - "dxfData": [], - "type": "EDGE" - }, - "1643a8b0-d3f2-11e9-ad52-c581dcc5e148": { - "id": "1643a8b0-d3f2-11e9-ad52-c581dcc5e148", - "name": "Transition_3", - "macro": "Transition", - "set": "Basic", - "params": { "position": [30500, 40000], "cw1": 2000, "cw2": 900, "length": 10000, "rotation": 270, "height": 250 }, - "dxfData": [], - "type": "XY" - }, - "2e07a4b0-d3f2-11e9-ad52-c581dcc5e148": { - "id": "2e07a4b0-d3f2-11e9-ad52-c581dcc5e148", - "name": "Transition_4", - "macro": "Transition", - "set": "Basic", - "params": { "position": [110000, 40000], "cw1": 2000, "cw2": 900, "length": 10000, "rotation": 90, "height": 250 }, - "dxfData": [], - "type": "XY" - }, - "313eb3d0-d3f2-11e9-ad52-c581dcc5e148": { - "id": "313eb3d0-d3f2-11e9-ad52-c581dcc5e148", - "name": "Transition_5", - "macro": "Transition", - "set": "Basic", - "params": { "position": [60000, 70000], "cw1": 2000, "cw2": 800, "length": 10000, "rotation": 180, "height": 250 }, - "dxfData": [], - "type": "XY" - }, - "336b57d0-d3f2-11e9-ad52-c581dcc5e148": { - "id": "336b57d0-d3f2-11e9-ad52-c581dcc5e148", - "name": "Transition_6", - "macro": "Transition", - "set": "Basic", - "params": { "position": [60000, 10000], "cw1": 2000, "cw2": 800, "length": 10000, "height": 250 }, - "dxfData": [], - "type": "XY" - }, - "b6d50340-d628-11e9-9185-859b5727feb8": { - "id": "b6d50340-d628-11e9-9185-859b5727feb8", - "name": "New Feature", - "macro": "DropletGen", - "set": "Basic", - "referenceID": "b6d5c690-d628-11e9-9185-859b5727feb8", - "params": { - "position": [60000, 40000], - "orificeSize": 200, - "orificeLength": 400, - "oilInputWidth": 800, - "waterInputWidth": 600, - "outputWidth": 600, - "outputLength": 600, - "height": 250 - }, - "dxfData": [], - "type": "XY" - } - } - }, - { - "name": "control", - "color": "red", - "params": { "z_offset": 1200, "flip": true }, - "features": { - "2ea7a050-6156-11e9-89ad-d58be75aeb6f": { - "id": "2ea7a050-6156-11e9-89ad-d58be75aeb6f", - "name": "2ea7a050-6156-11e9-89ad-d58be75aeb6f", - "macro": "EDGE", - "set": "Basic", - "dxfData": [], - "type": "EDGE" - }, - "a7c90920-d3f1-11e9-ad52-c581dcc5e148": { - "id": "a7c90920-d3f1-11e9-ad52-c581dcc5e148", - "name": "a7c90920-d3f1-11e9-ad52-c581dcc5e148", - "macro": "EDGE", - "set": "Basic", - "dxfData": [], - "type": "EDGE" - } - } - }, - { - "name": "cells", - "color": "indigo", - "params": { "z_offset": 2000, "flip": false }, - "features": { - "2ea7a050-6156-11e9-89ad-d58be75aeb6f": { - "id": "2ea7a050-6156-11e9-89ad-d58be75aeb6f", - "name": "2ea7a050-6156-11e9-89ad-d58be75aeb6f", - "macro": "EDGE", - "set": "Basic", - "dxfData": [], - "type": "EDGE" - }, - "a7c90920-d3f1-11e9-ad52-c581dcc5e148": { - "id": "a7c90920-d3f1-11e9-ad52-c581dcc5e148", - "name": "a7c90920-d3f1-11e9-ad52-c581dcc5e148", - "macro": "EDGE", - "set": "Basic", - "dxfData": [], - "type": "EDGE" - } - } - } - ], - "version": 1, - "groups": [], - "customComponents": {} -} diff --git a/src/app/examples/jsonExamples.ts b/src/app/examples/jsonExamples.ts deleted file mode 100644 index 711576db..00000000 --- a/src/app/examples/jsonExamples.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const example3 = - '{"name":"My Device","params":{"width":75800,"length":51000},"layers":[{"name":"flow","color":"indigo","params":{"z_offset":0,"flip":false},"features":{"97f1fd20-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f1fd20-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[30000,40000],"radius1":700,"radius2":700,"height":100}},"97f1fd21-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f1fd21-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[40000,40000],"radius1":700,"radius2":700,"height":100}},"97f22430-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22430-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[50000,40000],"radius1":700,"radius2":700,"height":100}},"97f22431-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22431-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[20000,40000],"radius1":700,"radius2":700,"height":100}},"97f22432-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22432-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[20000,40000],"end":[20000,35000],"width":400,"height":100}},"97f22433-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22433-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[20000,38000],"end":[17000,38000],"width":400,"height":100}},"97f22434-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22434-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[17000,38000],"end":[17000,35000],"width":400,"height":100}},"97f22435-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22435-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[20000,35000],"end":[20000,20000],"width":400,"height":100}},"97f22436-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22436-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[20000,20000],"end":[10000,10000],"width":400,"height":100}},"97f22437-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22437-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[17000,35000],"end":[15000,30000],"width":400,"height":100}},"97f22438-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22438-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[15000,30000],"end":[10000,30000],"width":400,"height":100}},"97f22439-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22439-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[10000,30000],"end":[10000,28000],"width":400,"height":100}},"97f2243a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2243a-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[10000,28000],"end":[15000,28000],"width":400,"height":100}},"97f2243b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2243b-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[15000,28000],"end":[15000,25000],"width":400,"height":100}},"97f2243c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2243c-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[15000,25000],"end":[8000,25000],"width":400,"height":100}},"97f2243d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2243d-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[8000,25000],"radius1":700,"radius2":700,"height":100}},"97f2243e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2243e-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[10000,10000],"radius1":700,"radius2":700,"height":100}},"97f2243f-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2243f-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[30000,40000],"end":[30000,20000],"width":400,"height":100}},"97f22440-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22440-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[30000,20000],"end":[20000,10000],"width":400,"height":100}},"97f22441-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22441-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[20000,10000],"radius1":700,"radius2":700,"height":100}},"97f22442-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22442-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[30000,38000],"end":[27000,38000],"width":400,"height":100}},"97f22443-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22443-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[27000,38000],"end":[27000,30000],"width":400,"height":100}},"97f22444-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22444-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[27000,30000],"end":[22000,30000],"width":400,"height":100}},"97f22445-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22445-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[22000,30000],"end":[22000,28000],"width":400,"height":100}},"97f22446-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22446-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[22000,28000],"end":[27000,28000],"width":400,"height":100}},"97f24b40-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b40-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[27000,28000],"end":[27000,26000],"width":400,"height":100}},"97f24b41-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b41-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[27000,26000],"end":[22000,26000],"width":400,"height":100}},"97f24b42-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b42-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[22000,26000],"end":[22000,24000],"width":400,"height":100}},"97f24b43-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b43-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[22000,24000],"end":[27000,24000],"width":400,"height":100}},"97f24b44-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b44-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[27000,24000],"end":[27000,22000],"width":400,"height":100}},"97f24b45-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b45-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[27000,22000],"end":[22000,22000],"width":400,"height":100}},"97f24b46-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b46-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[22000,22000],"end":[22000,20000],"width":400,"height":100}},"97f24b47-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b47-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[22000,20000],"end":[25000,20000],"width":400,"height":100}},"97f24b48-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b48-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[25000,20000],"end":[25000,17000],"width":400,"height":100}},"97f24b49-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b49-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[25000,17000],"end":[21000,17000],"width":400,"height":100}},"97f24b4a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b4a-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[21000,17000],"radius1":700,"radius2":700,"height":100}},"97f24b4b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b4b-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[40000,40000],"end":[40000,20000],"width":400,"height":100}},"97f24b4c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b4c-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[40000,20000],"end":[50000,10000],"width":400,"height":100}},"97f24b4d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b4d-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[40000,38000],"end":[43000,38000],"width":400,"height":100}},"97f24b4e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b4e-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[43000,38000],"end":[43000,30000],"width":400,"height":100}},"97f24b4f-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b4f-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[43000,30000],"end":[48000,30000],"width":400,"height":100}},"97f24b50-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b50-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[48000,30000],"end":[48000,28000],"width":400,"height":100}},"97f24b51-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b51-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[48000,28000],"end":[43000,28000],"width":400,"height":100}},"97f24b52-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b52-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[43000,28000],"end":[43000,26000],"width":400,"height":100}},"97f24b53-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b53-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[43000,26000],"end":[48000,26000],"width":400,"height":100}},"97f24b54-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b54-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[48000,26000],"end":[48000,24000],"width":400,"height":100}},"97f24b55-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b55-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[48000,24000],"end":[43000,24000],"width":400,"height":100}},"97f24b56-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b56-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[43000,24000],"end":[43000,22000],"width":400,"height":100}},"97f24b57-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b57-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[43000,22000],"end":[48000,22000],"width":400,"height":100}},"97f24b58-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b58-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[48000,22000],"end":[48000,20000],"width":400,"height":100}},"97f24b59-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b59-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[48000,20000],"end":[45000,20000],"width":400,"height":100}},"97f24b5a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b5a-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[45000,20000],"end":[45000,17000],"width":400,"height":100}},"97f24b5b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b5b-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[45000,17000],"end":[49000,17000],"width":400,"height":100}},"97f24b5c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b5c-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[50000,10000],"radius1":700,"radius2":700,"height":100}},"97f24b5d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b5d-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[49000,17000],"radius1":700,"radius2":700,"height":100}},"97f24b5e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b5e-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[50000,40000],"end":[50000,20000],"width":400,"height":100}},"97f24b5f-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b5f-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[50000,20000],"end":[60000,10000],"width":400,"height":100}},"97f24b60-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b60-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[60000,10000],"radius1":700,"radius2":700,"height":100}},"97f27250-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27250-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[50000,38000],"end":[53000,38000],"width":400,"height":100}},"97f27251-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27251-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[53000,38000],"end":[53000,35000],"width":400,"height":100}},"97f27252-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27252-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[53000,35000],"end":[55000,30000],"width":400,"height":100}},"97f27253-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27253-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[55000,30000],"end":[60000,30000],"width":400,"height":100}},"97f27254-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27254-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[60000,30000],"end":[60000,28000],"width":400,"height":100}},"97f27255-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27255-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[60000,28000],"end":[55000,28000],"width":400,"height":100}},"97f27256-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27256-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[55000,28000],"end":[55000,25000],"width":400,"height":100}},"97f27257-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27257-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[55000,25000],"end":[62000,25000],"width":400,"height":100}},"97f27258-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27258-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[62000,25000],"radius1":700,"radius2":700,"height":100}},"97f27259-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27259-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[15000,15000],"end":[15000,12000],"width":400,"height":100}},"97f2725a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2725a-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[15000,12000],"radius1":800,"radius2":700,"height":1100}},"97f2725b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2725b-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[26000,12000],"radius1":800,"radius2":700,"height":1100}},"97f2725c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2725c-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[44000,12000],"radius1":800,"radius2":700,"height":1100}},"97f2725d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2725d-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[55000,12000],"radius1":800,"radius2":700,"height":1100}},"97f2725e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2725e-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[55000,12000],"end":[55000,15000],"width":400,"height":100}},"97f2725f-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2725f-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[26000,12000],"end":[30000,10000],"width":400,"height":100}},"97f27260-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27260-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[44000,12000],"end":[40000,10000],"width":400,"height":100}},"97f27261-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27261-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[40000,10000],"end":[38000,7000],"width":400,"height":100}},"97f27262-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27262-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[30000,10000],"end":[32000,7000],"width":400,"height":100}},"97f27263-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27263-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[32000,7000],"radius1":700,"radius2":700,"height":100}},"97f27264-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27264-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[38000,7000],"radius1":700,"radius2":700,"height":100}},"97f27265-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27265-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[35000,10000],"radius1":1400,"radius2":1200,"height":800}},"97f27266-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27266-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[35000,10000],"end":[35000,30000],"width":400,"height":100}},"97f27267-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27267-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[35000,30000],"radius1":700,"radius2":700,"height":100}},"97f27268-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27268-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[35000,17000],"end":[38000,23000],"width":400,"height":100}},"97f27269-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27269-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[38000,23000],"end":[36000,25000],"width":400,"height":100}},"97f2726a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2726a-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[36000,25000],"end":[35000,30000],"width":400,"height":100}},"97f2726b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2726b-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[35000,17000],"end":[32000,23000],"width":400,"height":100}},"97f2726c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2726c-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[32000,23000],"end":[34000,25000],"width":400,"height":100}},"97f2726d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2726d-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[34000,25000],"end":[35000,30000],"width":400,"height":100}},"97f2726e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2726e-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[32000,23000],"end":[35000,24000],"width":400,"height":100}},"97f2726f-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2726f-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[38000,23000],"end":[35000,24000],"width":400,"height":100}},"97f27270-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27270-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[25000,20000],"end":[28000,20000],"width":400,"height":100}},"97f27271-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27271-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[28000,20000],"end":[28000,22000],"width":400,"height":100}},"97f27272-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27272-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[28000,22000],"end":[27000,22000],"width":400,"height":100}},"97f27273-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27273-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[45000,20000],"end":[42000,20000],"width":400,"height":100}},"97f27274-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27274-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[42000,20000],"end":[42000,22000],"width":400,"height":100}},"97f27275-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27275-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[42000,22000],"end":[44000,22000],"width":400,"height":100}},"97f27276-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27276-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[35000,30000],"radius1":800,"radius2":700,"height":1100}},"97f27277-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27277-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[32000,20000],"radius1":800,"radius2":700,"height":1100}},"97f27278-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27278-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[38000,20000],"radius1":800,"radius2":700,"height":1100}},"a2de7790-3ea6-11e5-8298-1b576ed4eb08":{"id":"a2de7790-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[10000,20000],"radius1":1400,"radius2":1200,"height":800}},"a3d819d0-3ea6-11e5-8298-1b576ed4eb08":{"id":"a3d819d0-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[60000,20000],"radius1":1400,"radius2":1200,"height":800}}}},{"name":"control","color":"red","params":{"z_offset":1200,"flip":true},"features":{"97f27279-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27279-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[20000,34000],"radius1":1400,"radius2":1200,"height":800}},"97f2727a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2727a-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[30000,34000],"radius1":1400,"radius2":1200,"height":800}},"97f2727b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2727b-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[40000,34000],"radius1":1400,"radius2":1200,"height":800}},"97f2727c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2727c-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[50000,34000],"radius1":1400,"radius2":1200,"height":800}},"97f2727d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2727d-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[20000,34000],"end":[24000,34000],"width":400,"height":100}},"97f2727e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2727e-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[24000,34000],"end":[24000,47000],"width":400,"height":100}},"97f29960-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29960-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[30000,34000],"end":[34000,34000],"width":400,"height":100}},"97f29961-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29961-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[34000,34000],"end":[34000,47000],"width":400,"height":100}},"97f29962-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29962-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[40000,34000],"end":[37000,34000],"width":400,"height":100}},"97f29963-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29963-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[37000,34000],"end":[36000,34000],"width":400,"height":100}},"97f29964-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29964-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[36000,34000],"end":[36000,47000],"width":400,"height":100}},"97f29965-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29965-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[50000,34000],"end":[46000,34000],"width":400,"height":100}},"97f29966-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29966-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[46000,34000],"end":[46000,47000],"width":400,"height":100}},"97f29967-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29967-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[24000,47000],"radius1":700,"radius2":700,"height":100}},"97f29968-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29968-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[34000,47000],"radius1":700,"radius2":700,"height":100}},"97f29969-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29969-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[36000,47000],"radius1":700,"radius2":700,"height":100}},"97f2996a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2996a-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[46000,47000],"radius1":700,"radius2":700,"height":100}},"97f2996b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2996b-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[15000,12000],"end":[26000,12000],"width":400,"height":100}},"97f2996c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2996c-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[44000,12000],"end":[55000,12000],"width":400,"height":100}},"97f2996d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2996d-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[15000,12000],"radius1":700,"radius2":700,"height":100}},"97f2996e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2996e-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[26000,12000],"radius1":700,"radius2":700,"height":100}},"97f2996f-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2996f-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[44000,12000],"radius1":700,"radius2":700,"height":100}},"97f29970-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29970-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[55000,12000],"radius1":700,"radius2":700,"height":100}},"97f29971-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29971-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[25000,21000],"radius1":700,"radius2":700,"height":100}},"97f29972-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29972-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[45000,21000],"radius1":700,"radius2":700,"height":100}},"a54e6620-3ea6-11e5-8298-1b576ed4eb08":{"id":"a54e6620-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[10000,20000],"end":[15000,12000],"width":400,"height":100}},"a63ff210-3ea6-11e5-8298-1b576ed4eb08":{"id":"a63ff210-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[55000,12000],"end":[60000,20000],"width":400,"height":100}},"a7efc4f0-3ea6-11e5-8298-1b576ed4eb08":{"id":"a7efc4f0-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[10000,20000],"radius1":700,"radius2":700,"height":100}},"a8879820-3ea6-11e5-8298-1b576ed4eb08":{"id":"a8879820-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[60000,20000],"radius1":700,"radius2":700,"height":100}}}}],"groups":[],"defaults":{}}'; - -export const example1 = - '{"name":"My Other Device","params":{"width":135000,"length":85000},"layers":[{"name":"flow","color":"indigo","params":{"z_offset":0,"flip":false},"features":{"7d4dce00-4f92-11e7-b516-0963e7d642b6":{"id":"7d4dce00-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[0,0],"end":[135000,0],"channelWidth":800,"height":100}},"802dbc70-4f92-11e7-b516-0963e7d642b6":{"id":"802dbc70-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[135000,0],"end":[135000,85000],"channelWidth":800,"height":100}},"84122290-4f92-11e7-b516-0963e7d642b6":{"id":"84122290-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[135000,85000],"end":[0,85000],"channelWidth":800,"height":100}},"8791ac60-4f92-11e7-b516-0963e7d642b6":{"id":"8791ac60-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[0,85000],"end":[0,0],"channelWidth":800,"height":100}}}},{"name":"control","color":"red","params":{"z_offset":1200,"flip":true},"features":{"a937dec0-4f92-11e7-b516-0963e7d642b6":{"id":"a937dec0-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[0,0],"end":[0,85000],"channelWidth":800,"height":100}},"ab87e940-4f92-11e7-b516-0963e7d642b6":{"id":"ab87e940-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[0,85000],"end":[135000,85000],"channelWidth":800,"height":100}},"ad94f750-4f92-11e7-b516-0963e7d642b6":{"id":"ad94f750-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[135000,85000],"end":[135000,0],"channelWidth":800,"height":100}},"af694220-4f92-11e7-b516-0963e7d642b6":{"id":"af694220-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[135000,0],"end":[0,0],"channelWidth":800,"height":100}}}}],"groups":[]}'; - -export const UpdatedExample = - '{"name":"My Other Device","params":{"width":135000,"length":85000},"renderLayers":[{"id":"d51fc900-e923-11ec-baa7-bf96f82ad573","name":"RenderLayerFlow_1","modellayer":"4952d7a0-f16c-11eb-8c04-ff751cb31c4c","type":"FLOW","features":[],"color":"indigo"},{"id":"d51fc901-e923-11ec-baa7-bf96f82ad573","name":"RenderLayerControl_1","modellayer":"4952feb0-f16c-11eb-8c04-ff751cb31c4c","type":"CONTROL","features":[],"color":"red"},{"id":"d51fc902-e923-11ec-baa7-bf96f82ad573","name":"RenderLayerIntegration_1","modellayer":"4952feb1-f16c-11eb-8c04-ff751cb31c4c","type":"INTEGRATION","features":[],"color":"green"}],"layers":[{"id":"4952d7a0-f16c-11eb-8c04-ff751cb31c4c","name":"LayerFlow_1","type":"FLOW","group":"0","params":{"z_offset":0,"flip":false},"features":[]},{"id":"4952feb0-f16c-11eb-8c04-ff751cb31c4c","name":"LayerControl_1","type":"CONTROL","group":"0","params":{"z_offset":0,"flip":false},"features":[]},{"id":"4952feb1-f16c-11eb-8c04-ff751cb31c4c","name":"LayerIntegration_1","type":"INTEGRATION","group":"0","params":{"z_offset":0,"flip":false},"features":[]}],"groups":[],"components":[],"connections":[],"valves":[],"version":"1.2"}'; - -export const dafdtemplate = - '{"name":"DAFD Template","params":{"width":70000,"length":70000},"components":[{"id":"e958b4d0-6155-11e9-89ad-d58be75aeb6f","name":"Port_in","entity":"PORT","params":{"position":[10000,35000],"portRadius":1998,"height":1100},"xspan":3996,"yspan":3996,"ports":[]},{"id":"eadf7be0-6155-11e9-89ad-d58be75aeb6f","name":"Port_out","entity":"PORT","params":{"position":[60000,35000],"portRadius":1998,"height":1100},"xspan":3996,"yspan":3996,"ports":[]},{"id":"ec125690-6155-11e9-89ad-d58be75aeb6f","name":"Port_oil1","entity":"PORT","params":{"position":[35075,10000],"portRadius":1998,"height":1100},"xspan":3996,"yspan":3996,"ports":[]},{"id":"f0839360-6155-11e9-89ad-d58be75aeb6f","name":"Port_oil2","entity":"PORT","params":{"position":[35075,60000],"portRadius":1998,"height":1100},"xspan":3996,"yspan":3996,"ports":[]},{"id":"b6d5c690-d628-11e9-9185-859b5727feb8","name":"DropletGen_1","entity":"NOZZLE DROPLET GENERATOR","params":{"position":[40000,35000],"orificeSize":75,"orificeLength":75,"oilInputWidth":150,"waterInputWidth":150,"outputWidth":150,"outputLength":5000,"height":75},"xspan":5225,"yspan":150,"ports":[{"x":75,"y":-75,"layer":"FLOW","label":"1"},{"x":5225,"y":0,"layer":"FLOW","label":"2"},{"x":75,"y":75,"layer":"FLOW","label":"3"},{"x":0,"y":0,"layer":"FLOW","label":"4"}]}],"connections":[],"features":[{"name":"flow","color":"indigo","params":{"z_offset":0,"flip":false},"features":{"e957f180-6155-11e9-89ad-d58be75aeb6f":{"id":"e957f180-6155-11e9-89ad-d58be75aeb6f","name":"New Feature","macro":"Port","set":"Basic","referenceID":"e958b4d0-6155-11e9-89ad-d58be75aeb6f","params":{"position":[10000,35000],"portRadius":1998,"height":1100},"dxfData":[],"type":"XY"},"eadf06b0-6155-11e9-89ad-d58be75aeb6f":{"id":"eadf06b0-6155-11e9-89ad-d58be75aeb6f","name":"New Feature","macro":"Port","set":"Basic","referenceID":"eadf7be0-6155-11e9-89ad-d58be75aeb6f","params":{"position":[60000,35000],"portRadius":1998,"height":1100},"dxfData":[],"type":"XY"},"ec119340-6155-11e9-89ad-d58be75aeb6f":{"id":"ec119340-6155-11e9-89ad-d58be75aeb6f","name":"New Feature","macro":"Port","set":"Basic","referenceID":"ec125690-6155-11e9-89ad-d58be75aeb6f","params":{"position":[35075,10000],"portRadius":1998,"height":1100},"dxfData":[],"type":"XY"},"f082f720-6155-11e9-89ad-d58be75aeb6f":{"id":"f082f720-6155-11e9-89ad-d58be75aeb6f","name":"New Feature","macro":"Port","set":"Basic","referenceID":"f0839360-6155-11e9-89ad-d58be75aeb6f","params":{"position":[35075,60000],"portRadius":1998,"height":1100},"dxfData":[],"type":"XY"},"1643a8b0-d3f2-11e9-ad52-c581dcc5e148":{"id":"1643a8b0-d3f2-11e9-ad52-c581dcc5e148","name":"Transition_3","macro":"Transition","set":"Basic","params":{"position":[10000,35000],"cw1":2000,"cw2":150,"length":10000,"rotation":270,"height":250},"dxfData":[],"type":"XY"},"2e07a4b0-d3f2-11e9-ad52-c581dcc5e148":{"id":"2e07a4b0-d3f2-11e9-ad52-c581dcc5e148","name":"Transition_4","macro":"Transition","set":"Basic","params":{"position":[60000,35000],"cw1":2000,"cw2":150,"length":10000,"rotation":90,"height":250},"dxfData":[],"type":"XY"},"313eb3d0-d3f2-11e9-ad52-c581dcc5e148":{"id":"313eb3d0-d3f2-11e9-ad52-c581dcc5e148","name":"Transition_5","macro":"Transition","set":"Basic","params":{"position":[35075,60000],"cw1":2000,"cw2":150,"length":10000,"rotation":180,"height":250},"dxfData":[],"type":"XY"},"336b57d0-d3f2-11e9-ad52-c581dcc5e148":{"id":"336b57d0-d3f2-11e9-ad52-c581dcc5e148","name":"Transition_6","macro":"Transition","set":"Basic","params":{"position":[35075,10000],"cw1":2000,"cw2":150,"length":10000,"height":250},"dxfData":[],"type":"XY"},"b6d50340-d628-11e9-9185-859b5727feb8":{"id":"b6d50340-d628-11e9-9185-859b5727feb8","name":"New Feature","macro":"DropletGen","set":"Basic","referenceID":"b6d5c690-d628-11e9-9185-859b5727feb8","params":{"position":[40000,35000],"orificeSize":75,"orificeLength":75,"oilInputWidth":150,"waterInputWidth":150,"outputWidth":150,"outputLength":5000,"height":75},"dxfData":[],"type":"XY"},"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a":{"id":"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a","name":"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a","macro":"EDGE","set":"Basic","dxfData":[],"type":"EDGE"},"48225b40-f50a-11e9-a170-c3e417364f96":{"id":"48225b40-f50a-11e9-a170-c3e417364f96","name":"48225b40-f50a-11e9-a170-c3e417364f96","macro":"EDGE","set":"Basic","dxfData":[],"type":"EDGE"}}},{"name":"control","color":"red","params":{"z_offset":1200,"flip":true},"features":{"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a":{"id":"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a","name":"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a","macro":"EDGE","set":"Basic","dxfData":[],"type":"EDGE"},"48225b40-f50a-11e9-a170-c3e417364f96":{"id":"48225b40-f50a-11e9-a170-c3e417364f96","name":"48225b40-f50a-11e9-a170-c3e417364f96","macro":"EDGE","set":"Basic","dxfData":[],"type":"EDGE"}}},{"name":"cells","color":"indigo","params":{"z_offset":2000,"flip":false},"features":{"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a":{"id":"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a","name":"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a","macro":"EDGE","set":"Basic","dxfData":[],"type":"EDGE"},"48225b40-f50a-11e9-a170-c3e417364f96":{"id":"48225b40-f50a-11e9-a170-c3e417364f96","name":"48225b40-f50a-11e9-a170-c3e417364f96","macro":"EDGE","set":"Basic","dxfData":[],"type":"EDGE"}}}],"version":"1.2","groups":[],"customComponents":{}}'; - -const Examples = { example1, example2: UpdatedExample, example3 }; -export default Examples; diff --git a/src/app/geometry/geometryEdge.ts b/src/app/geometry/geometryEdge.ts deleted file mode 100644 index 8a3a3618..00000000 --- a/src/app/geometry/geometryEdge.ts +++ /dev/null @@ -1,39 +0,0 @@ -export default class GeometryEdge { - private __start: any; - private __end: any; - private __type: any; - private __id: any; - private __dxfData: any; - - constructor(start: any, end: any, type: any, id: any, data: any) { - this.__start = start; - this.__end = end; - - this.__type = type; - this.__id = id; - - this.__dxfData = data; - - // TODO: Do classification of kind of edge (curve, horizontal, vertical, angled, etc), compute length - } - - get id() { - return this.__id; - } - - get start() { - return this.__start; - } - - get end() { - return this.__end; - } - - get type() { - return this.__type; - } - - get dxfData() { - return this.__dxfData; - } -} diff --git a/src/app/geometry/geometryGraph.ts b/src/app/geometry/geometryGraph.ts deleted file mode 100644 index 4fb0d31d..00000000 --- a/src/app/geometry/geometryGraph.ts +++ /dev/null @@ -1,189 +0,0 @@ -import GeometryEdge from "./geometryEdge"; - -// @ts-ignore -import graphlib from "@dagrejs/graphlib"; -import paper from "paper"; - -export default class GeometryGraph { - private __nodes: any; - private __nodecount: number; - private __edgecount: number; - private __edgeData: Map; - private __networkGraph: any; - - constructor() { - // TODO: Do all the initializations here - this.__nodes = new Map(); - this.__nodecount = 0; - this.__edgecount = 0; - this.__edgeData = new Map(); - - this.__networkGraph = new graphlib.Graph({ directed: false }); - } - - addEdge(start: any, end: any, data: any): void { - const startnode = this.findNode(start); - const endnode = this.findNode(end); - - const edgeobject = new GeometryEdge(startnode, endnode, data.type, String(this.__edgecount++), data); - - this.__edgeData.set(edgeobject.id, edgeobject); - - this.__networkGraph.setEdge(startnode, endnode, edgeobject.id); - } - - findNode(node: any) { - for (const key of this.__nodes.keys()) { - const nodetocheck = this.__nodes.get(key); - - if (GeometryGraph.computeDistance(node, nodetocheck) < 0.000001) { - return key; - } - } - - // If it comes to this, then it means that the node does not exist - const newkey = String(this.__nodecount++); - this.__nodes.set(newkey, node); - - return newkey; - } - - generateGeometry() { - // console.log("Cycles:", graphlib.alg.findCycles(this.__networkGraph)); - // console.log("Edges:", this.__networkGraph.edges()); - // console.log("Nodes:", this.__nodes); - // console.log("Edge Data:", this.__edgeData); - const path = new paper.CompoundPath(""); - - // graphlib.alg.findCycles(this.__networkGraph); - const graphcomponents = graphlib.alg.components(this.__networkGraph); - // console.log("Components:", graphcomponents); - - /* - Step 1 - Iterate through each of the components (disconnected components) - Step 2 - Draw outline for each of the components - */ - - for (const component of graphcomponents) { - this.drawComponent(component, path); - } - - return path; - } - - drawComponent(component: any[], path: any): void { - /* - Step 1 - Take the starting node - Step 2 - start traversing through the component and start making a path with segments - */ - - // console.log("Graph component",component); - - // Get the first item in the component - - // let startnode = this.__nodes.get(component[0]); - // console.log("startnode", startnode); - - const segments = []; - const startnode = this.__nodes.get(component[0]); - const endnode = null; - // console.log("test ?"); - // Get traversal - const traversal = graphlib.alg.preorder(this.__networkGraph, component[0]); - - const childpath = new paper.Path(); - - for (let i = 0; i < traversal.length; i++) { - const noderef = traversal[i]; - const node = this.__nodes.get(noderef); - let nextnoderef; - if (i + 1 === traversal.length) { - // Last Node - nextnoderef = traversal[0]; - } else { - // All other nodes - nextnoderef = traversal[i + 1]; - } - - // Get the edge - const edge = this.__getEdge(noderef, nextnoderef); - - // console.log("Edge:", edge); - // console.log("Edge Type:", edge.type); - switch (edge.type) { - case "LINE": - childpath.add(new paper.Point(node.x, node.y)); - break; - case "ARC": - childpath.add(new paper.Point(node.x, node.y)); - const nextnode = this.__nodes.get(nextnoderef); - const endpoint = new paper.Point(nextnode.x, nextnode.y); - const midpoint = this.getARCMidpoint(edge.dxfData); - childpath.arcTo(midpoint, endpoint); - break; - } - } - - path.addChild(childpath); - - // //Generate Lines for everything - // for(let i = 0; i< traversal.length; i++ ){ - // let node = this.__nodes.get(traversal[i]); - // - // console.log("Line:", "Start", startnode, "End" , endnode); - // //TODO: Draw curve for curves - // let line = new paper.Path.Line(new paper.Point(startnode.x, endnode.y), new paper.Point(endnode.x, endnode.y)); - // childpath.add(line); - // } - // - // startnode = endnode; - // endnode = this.__nodes.get(component[0]); - // console.log("Line:", "Start", startnode, "End" , endnode); - // - // //Last segment to close everything off - // childpath.add(new paper.Path.Line( - // // new paper.Point(startnode.x, endnode.y), - // new paper.Point(endnode.x, endnode.y)) - // ); - // - // console.log(path); - - // Now join all the segments - // let joinedpath = null; - // for(let i = 0; i < segments.length; i++){ - // if(joinedpath === null){ - // joinedpath = segments[i]; - // } - // joinedpath.join(segments[i]); - // } - - // console.log("Joined Path", joinedpath); - // console.log("Segments:", segments); - - // path.addChild(joinedpath); - } - - getARCMidpoint(dxfData: any) { - // console.log("DXF:",dxfData); - const center = new paper.Point(dxfData.center.x, dxfData.center.y); - const radius = dxfData.radius; - const startAngle = dxfData.startAngle; - const endAngle = dxfData.endAngle; //* 180/Math.PI; - const midAngle = (startAngle + endAngle) / 2; - - const midpoint = new paper.Point(center.x + radius * Math.cos(midAngle), center.y + radius * Math.sin(midAngle)); - - return midpoint; - } - - __getEdge(source: any, target: any) { - const edgeref = this.__networkGraph.edge(source, target); - return this.__edgeData.get(edgeref); - } - - static computeDistance(node: any, nodetocheck: any): number { - const sqdist = Math.pow(node.x - nodetocheck.x, 2) + Math.pow(node.y - nodetocheck.y, 2); - // TODO: check if there is a z component - return Math.sqrt(sqdist); - } -} diff --git a/src/app/index.ts b/src/app/index.ts deleted file mode 100644 index fb69f94c..00000000 --- a/src/app/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import PaperView from "./view/paperView"; -import AdaptiveGrid from "./view/grid/adaptiveGrid"; -import Device from "./core/device"; -import ViewManager from "./view/viewManager"; - -import * as Examples from "./examples/jsonExamples"; - -import Registry from "./core/registry"; - -export { Registry, PaperView, AdaptiveGrid, Device, ViewManager, Examples }; diff --git a/src/app/library/alignmentMarks.ts b/src/app/library/alignmentMarks.ts deleted file mode 100644 index 8882e880..00000000 --- a/src/app/library/alignmentMarks.ts +++ /dev/null @@ -1,178 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import { ToolPaperObject } from "../core/init"; - -interface ParamsIF { - position: number[]; - width: number; - length: number; - color: paper.Color; -} - -export default class AlignmentMarks extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - width: "Float", - length: "Float", - height: "Float" - }; - - this.__defaults = { - width: 4000, - length: 4000, - height: 250 - }; - - this.__units = { - width: "μm", - length: "μm", - height: "μm" - }; - - this.__minimum = { - width: 10, - length: 10, - height: 10 - }; - - this.__maximum = { - width: 200000, - length: 200000, - height: 1200 - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__featureParams = { - position: "position", - width: "width", - length: "length" - }; - - this.__targetParams = { - width: "width", - length: "length" - }; - - this.__renderKeys = ["FLOW", "CONTROL"]; - - this.__mint = "ALIGNMENT MARKS"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1" - }; - } - - render2D(params: ParamsIF, key: string) { - if (key === "FLOW") { - return this.__drawFlow(params); - } else if (key === "CONTROL") { - return this.__drawControl(params); - } - - throw new Error("Unknown key: " + key); - } - - render2DTarget(key: string | null, params: ParamsIF): paper.CompoundPath { - const position = params.position; - const width = params.width; - const length = params.length; - const color = params.color; - const center = new paper.Point(position[0], position[1]); - const ret = new paper.CompoundPath(""); - const topleftpoint = new paper.Point(position[0] - width, position[1] - length); - const bottomrightpoint = new paper.Point(position[0] + width, position[1] + length); - - const topleftrect = new paper.Path.Rectangle(topleftpoint, center); - - ret.addChild(topleftrect); - - const bottomrightrect = new paper.Path.Rectangle((position as unknown) as paper.Rectangle, (bottomrightpoint as unknown) as paper.Size); - - ret.addChild(bottomrightrect); - - const topmiddlepoint = new paper.Point(position[0], position[1] - length); - const middlerightpoint = new paper.Point(position[0] + width, position[1]); - const middleleftpoint = new paper.Point(position[0] - width, position[1]); - const bottommiddlepoint = new paper.Point(position[0], position[1] + length); - - const toprightrect = new paper.Path.Rectangle(topmiddlepoint, middlerightpoint); - - ret.addChild(toprightrect); - - const bottomleftrect = new paper.Path.Rectangle(middleleftpoint, bottommiddlepoint); - - ret.addChild(bottomleftrect); - - ret.fillColor = color; - - ret.fillColor.alpha = 0.5; - - return ret; - } - - __drawFlow(params: ParamsIF) { - const position = params.position; - const width = params.width; - const length = params.length; - const color = params.color; - const center = new paper.Point(position[0], position[1]); - const ret = new paper.CompoundPath(""); - const topleftpoint = new paper.Point(position[0] - width, position[1] - length); - const bottomrightpoint = new paper.Point(position[0] + width, position[1] + length); - - const topleftrect = new paper.Path.Rectangle(topleftpoint, center); - - ret.addChild(topleftrect); - - const bottomrightrect = new paper.Path.Rectangle((position as unknown) as paper.Rectangle, (bottomrightpoint as unknown) as paper.Size); - - ret.addChild(bottomrightrect); - - ret.fillColor = color; - return ret; - } - - __drawControl(params: ParamsIF) { - const position = params.position; - const width = params.width; - const length = params.length; - const color = params.color; - const here = new paper.Point(position[0], position[1]); - const ret = new paper.CompoundPath(""); - const topmiddlepoint = new paper.Point(position[0], position[1] - length); - const middlerightpoint = new paper.Point(position[0] + width, position[1]); - const middleleftpoint = new paper.Point(position[0] - width, position[1]); - const bottommiddlepoint = new paper.Point(position[0], position[1] + length); - - const toprightrect = new paper.Path.Rectangle(topmiddlepoint, middlerightpoint); - - ret.addChild(toprightrect); - - const bottomleftrect = new paper.Path.Rectangle(middleleftpoint, bottommiddlepoint); - - ret.addChild(bottomleftrect); - - ret.fillColor = color; - return ret; - } -} diff --git a/src/app/library/anode.ts b/src/app/library/anode.ts deleted file mode 100644 index c379cd5b..00000000 --- a/src/app/library/anode.ts +++ /dev/null @@ -1,122 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Anode extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - anodeRadius: "Float", - pegHeight: "Float", - pegWidth: "Float", - height: "Float", - rotation: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - anodeRadius: 0.9 * 1000, - pegHeight: 0.2 * 1000, - pegWidth: 0.7 * 1000, - height: 1.1 * 1000, - rotation: 0 - }; - - this.__units = { - componentSpacing: "μm", - anodeRadius: "μm", - pegHeight: "μm", - pegWidth: "μm", - height: "μm", - rotation: "°" - }; - - this.__minimum = { - componentSpacing: 0, - anodeRadius: 0.4 * 10, - pegHeight: 0.1 * 1000, - pegWidth: 0.1 * 1000, - height: 10, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - anodeRadius: 2000, - pegHeight: 2 * 1000, - pegWidth: 2 * 1000, - height: 1200, - rotation: 90 - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - anodeRadius: "anodeRadius", - pegHeight: "pegHeight", - pegWidth: "pegWidth", - rotation: "rotation" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - anodeRadius: "anodeRadius", - pegHeight: "pegHeight", - pegWidth: "pegWidth", - rotation: "rotation" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "ANODE"; - } - - render2D(params: { [k: string]: any }, key: string): paper.PathItem { - // Regardless of the key... - const position = params.position; - const radius = params.anodeRadius; - const pegheight = params.pegHeight; - const pegwidth = params.pegWidth; - const rotation = params.rotation; - const color1 = params.color; - const pos = new paper.Point(position[0], position[1]); - const outerCircle = new paper.Path.Circle(pos, radius); - outerCircle.fillColor = color1; - - const peg = new paper.Path.Rectangle(new paper.Rectangle(position[0] - pegwidth / 2, position[1] - pegheight / 2, pegwidth, pegheight)); - const finalCircle = outerCircle.subtract(peg); - finalCircle.fillColor = color1; - outerCircle.remove(); - peg.remove(); - return (finalCircle.rotate(rotation, pos) as unknown) as paper.PathItem; - } - - render2DTarget(key: string | null, params: { [k: string]: any }): paper.PathItem { - const render = this.render2D(params, key!); - render.fillColor!.alpha = 0.5; - return render; - } - - getPorts(params: any) { - const ports = []; - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - - return ports; - } -} diff --git a/src/app/library/betterMixer.ts b/src/app/library/betterMixer.ts deleted file mode 100644 index d120a39d..00000000 --- a/src/app/library/betterMixer.ts +++ /dev/null @@ -1,163 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class BetterMixer extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - bendSpacing: "Float", - numberOfBends: "Float", - channelWidth: "Float", - bendLength: "Float", - rotation: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - channelWidth: 0.8 * 1000, - bendSpacing: 1.23 * 1000, - numberOfBends: 1, - rotation: 0, - bendLength: 2.46 * 1000, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - bendSpacing: "μm", - numberOfBends: "", - channelWidth: "μm", - bendLength: "μm", - rotation: "°", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - channelWidth: 10, - bendSpacing: 10, - numberOfBends: 1, - rotation: 0, - bendLength: 10, - height: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - channelWidth: 2000, - bendSpacing: 6000, - numberOfBends: 20, - rotation: 360, - bendLength: 12 * 1000, - height: 1200 - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - cursorPosition: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - channelWidth: "channelWidth", - bendSpacing: "bendSpacing", - numberOfBends: "numberOfBends", - rotation: "rotation", - bendLength: "bendLength" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - channelWidth: "channelWidth", - bendSpacing: "bendSpacing", - numberOfBends: "numberOfBends", - rotation: "rotation", - bendLength: "bendLength" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "MIXER"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const channelWidth = params.channelWidth; - const bendLength = params.bendLength; - const bendSpacing = params.bendSpacing; - const rotation = params.rotation; - const numberOfBends = params.numberOfBends; - - const ports = []; - - ports.push(new ComponentPort(bendLength / 2 + channelWidth, 0, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(bendLength / 2 + channelWidth, (2 * numberOfBends + 1) * channelWidth + 2 * numberOfBends * bendSpacing, "2", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string): paper.CompoundPath { - const channelWidth = params.channelWidth; - const bendLength = params.bendLength; - const bendSpacing = params.bendSpacing; - const rotation = params.rotation; - const numBends = params.numberOfBends; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const segHalf = bendLength / 2 + channelWidth; - const segLength = bendLength + 2 * channelWidth; - const segBend = bendSpacing + 2 * channelWidth; - const vRepeat = 2 * bendSpacing + 2 * channelWidth; - const vOffset = bendSpacing + channelWidth; - const hOffset = bendLength / 2 + channelWidth / 2; - const serp = new paper.CompoundPath(""); - // draw first segment - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y, segHalf + channelWidth / 2, channelWidth))); - for (let i = 0; i < numBends; i++) { - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * i, channelWidth, segBend))); - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vOffset + vRepeat * i, segLength, channelWidth))); - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth + bendLength, y + vOffset + vRepeat * i, channelWidth, segBend))); - if (i === numBends - 1) { - // draw half segment to close - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + hOffset, y + vRepeat * (i + 1), segHalf, channelWidth))); - } else { - // draw full segment - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * (i + 1), segLength, channelWidth))); - } - } - - serp.fillColor = color; - return (serp.rotate(rotation, new paper.Point(x, y)) as unknown) as paper.CompoundPath; - } - - render2DTarget(key: string | null, params: { [k: string]: any }): paper.CompoundPath { - if (key === null) { - key = this.__renderKeys[0]; - } - const serp = this.render2D(params, key); - serp.fillColor!.alpha = 0.5; - return serp; - } -} diff --git a/src/app/library/capacitancesensor.ts b/src/app/library/capacitancesensor.ts deleted file mode 100644 index c9a075b0..00000000 --- a/src/app/library/capacitancesensor.ts +++ /dev/null @@ -1,240 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class CapacitanceSensor extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - height: "Float", - inletWidth: "Float", - inletLength: "Float", - electrodeWidth: "Float", - electrodeLength: "Float", - electrodeDistance: "Float", - sensorWidth: "Float", - sensorLength: "Float", - channelDepth: "Float", - electrodeDepth: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - height: 250, - inletWidth: 1 * 1000, - inletLength: 10 * 1000, - electrodeWidth: 1.5 * 1000, - electrodeLength: 4 * 1000, - electrodeDistance: 2 * 1000, - sensorWidth: 1 * 1000, - sensorLength: 3 * 1000, - channelDepth: 1000, - electrodeDepth: 1000 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - height: "μm", - inletWidth: "μm", - inletLength: "μm", - electrodeWidth: "μm", - electrodeLength: "μm", - electrodeDistance: "μm", - sensorWidth: "μm", - sensorLength: "μm", - channelDepth: "μm", - electrodeDepth: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - rotation: 0, - height: 10, - inletWidth: 0.5 * 1000, - inletLength: 5 * 1000, - electrodeWidth: 1 * 1000, - electrodeLength: 2 * 1000, - electrodeDistance: 1 * 1000, - sensorWidth: 0.5 * 1000, - sensorLength: 1.5 * 1000, - channelDepth: 1000, - electrodeDepth: 1000 - }; - - this.__maximum = { - componentSpacing: 10000, - rotation: 360, - height: 1200, - inletWidth: 2 * 1000, - inletLength: 15 * 1000, - electrodeWidth: 3 * 1000, - electrodeLength: 6 * 1000, - electrodeDistance: 3 * 1000, - sensorWidth: 1.5 * 1000, - sensorLength: 4.5 * 1000, - channelDepth: 1000, - electrodeDepth: 1000 - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - cursorPosition: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - inletWidth: "inletWidth", - inletLength: "inletLength", - electrodeWidth: "electrodeWidth", - electrodeLength: "electrodeLength", - electrodeDistance: "electrodeDistance", - sensorWidth: "sensorWidth", - sensorLength: "sensorLength", - channelDepth: "channelDepth", - electrodeDepth: "electrodeDepth" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - rotation: "rotation", - inletWidth: "inletWidth", - inletLength: "inletLength", - electrodeWidth: "electrodeWidth", - electrodeLength: "electrodeLength", - electrodeDistance: "electrodeDistance", - sensorWidth: "sensorWidth", - sensorLength: "sensorLength", - channelDepth: "channelDepth", - electrodeDepth: "electrodeDepth" - }; - - this.__renderKeys = ["FLOW", "INTEGRATION"]; - - this.__mint = "DROPLET CAPACITANCE SENSOR"; - - this.__zOffsetKeys = { - FLOW: "height", - INTEGRATION: "electrodeDepth" - }; - - this.__substrateOffset = { - FLOW: "0", - INTEGRATION: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const inletLength = params.inletLength; - - const ports = []; - - ports.push(new ComponentPort(-inletLength / 2, 0, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(inletLength / 2, 0, "2", LogicalLayerType.FLOW)); - - return ports; - } - - __renderFlow(params: { [k: string]: any }) { - const rotation = params.rotation; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const inletWidth = params.inletWidth; - const inletLength = params.inletLength; - const serp = new paper.CompoundPath(""); - - // inlet - const topLeft = new paper.Point(x - inletLength / 2, y - inletWidth / 2); - const bottomRight = new paper.Point(x + inletLength / 2, y + inletWidth / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - serp.rotate(rotation, new paper.Point(x, y)); - - serp.fillColor = color; - return serp; - } - - __renderIntegrate(params: { [k: string]: any }) { - const rotation = params.rotation; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const inletWidth = params.inletWidth; - const electrodeWidth = params.electrodeWidth; - const electrodeLength = params.electrodeLength; - const electrodeDistance = params.electrodeDistance; - const sensorWidth = params.sensorWidth; - const sensorLength = params.sensorLength; - const serp = new paper.CompoundPath(""); - - // top electrode - let topLeft = new paper.Point(x - electrodeWidth / 2, y - inletWidth / 2 - electrodeDistance - sensorWidth / 2 - electrodeLength); - let bottomRight = new paper.Point(x + electrodeWidth / 2, y - inletWidth / 2 - electrodeDistance - sensorWidth / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // top sensor - let elli = new paper.Path.Ellipse({ - point: [x - sensorLength / 2, y - inletWidth / 2 - electrodeDistance - sensorWidth], - size: [sensorLength, sensorWidth] - }); - - serp.addChild(elli); - - // bottom electrode - topLeft = new paper.Point(x - electrodeWidth / 2, y + inletWidth / 2 + electrodeDistance + sensorWidth / 2 + electrodeLength); - bottomRight = new paper.Point(x + electrodeWidth / 2, y + inletWidth / 2 + electrodeDistance + sensorWidth / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // bottom sensor - elli = new paper.Path.Ellipse({ - point: [x - sensorLength / 2, y + inletWidth / 2 + electrodeDistance], - size: [sensorLength, sensorWidth] - }); - - serp.addChild(elli); - - serp.rotate(rotation, new paper.Point(x, y)); - - serp.fillColor = color; - return serp; - } - - render2D(params: { [k: string]: any }, key = "FLOW") { - if (key === "FLOW") { - return this.__renderFlow(params); - } else if (key === "INTEGRATION") { - return this.__renderIntegrate(params); - } - throw new Error("Unknown render key found in DROPLET CAPACITANCE SENSOR: " + key); - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const ret = new paper.CompoundPath(""); - const flow = this.render2D(params, "FLOW"); - const integrate = this.render2D(params, "INTEGRATION"); - ret.addChild(integrate); - ret.addChild(flow); - ret.fillColor = params.color; - ret.fillColor!.alpha = 0.5; - return ret; - } -} diff --git a/src/app/library/cathode.ts b/src/app/library/cathode.ts deleted file mode 100644 index cea15b3d..00000000 --- a/src/app/library/cathode.ts +++ /dev/null @@ -1,127 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Cahode extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - cathodeRadius: "Float", - pegRadius: "Float", - pegThickness: "Float", - height: "Float", - rotation: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - cathodeRadius: 0.9 * 1000, - pegRadius: 0.7 * 1000, - pegThickness: 0.3 * 1000, - height: 1.1 * 1000, - rotation: 0 - }; - - this.__units = { - componentSpacing: "μm", - cathodeRadius: "μm", - pegRadius: "μm", - pegThickness: "μm", - height: "μm", - rotation: "°" - }; - - this.__minimum = { - componentSpacing: 0, - cathodeRadius: 0.4 * 10, - pegRadius: 0.1 * 1000, - pegThickness: 0.1 * 1000, - height: 10, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - cathodeRadius: 2000, - pegRadius: 2 * 1000, - pegThickness: 2 * 1000, - height: 1200, - rotation: 90 - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - cathodeRadius: "cathodeRadius", - pegRadius: "pegRadius", - pegThickness: "pegThickness", - rotation: "rotation" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - cathodeRadius: "cathodeRadius", - pegRadius: "pegRadius", - pegThickness: "pegThickness", - rotation: "rotation" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "CATHODE"; - } - - render2D(params: { [k: string]: any }, key: string): paper.PathItem { - // Regardless of the key... - const position = params.position; - const radius = params.cathodeRadius; - const pegradius = params.pegRadius; - const pegthickness = params.pegThickness; - const rotation = params.rotation; - const color1 = params.color; - const pos = new paper.Point(position[0], position[1]); - const outerCircle = new paper.Path.Circle(pos, radius); - outerCircle.fillColor = color1; - - const peg1 = new paper.Path.Rectangle(new paper.Rectangle(position[0] - pegradius / 2, position[1] - pegthickness / 2, pegradius, pegthickness)); - const peg2 = new paper.Path.Rectangle(new paper.Rectangle(position[0] - pegthickness / 2, position[1] - pegradius / 2, pegthickness, pegradius)); - const finalCircle = outerCircle.subtract(peg1.unite(peg2)); - finalCircle.fillColor = color1; - outerCircle.remove(); - peg1.remove(); - peg2.remove(); - return (finalCircle.rotate(rotation, pos) as unknown) as paper.PathItem; - } - - render2DTarget(key: string | null, params: { [k: string]: any }): paper.PathItem { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } - - getPorts(params: { [k: string]: any }) { - const ports = []; - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - - return ports; - } -} diff --git a/src/app/library/celltrapL.ts b/src/app/library/celltrapL.ts deleted file mode 100755 index 4f3c0d8d..00000000 --- a/src/app/library/celltrapL.ts +++ /dev/null @@ -1,218 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class CellTrapL extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - chamberLength: "Float", - feedingChannelWidth: "Float", - rotation: "Float", - chamberWidth: "Float", - numberOfChambers: "Float", - chamberSpacing: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - chamberLength: 1.2 * 1000, - feedingChannelWidth: 0.41 * 1000, - rotation: 270, - chamberWidth: 1.23 * 1000, - numberOfChambers: 6, - chamberSpacing: 2.46 * 1000, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - chamberLength: "μm", - feedingChannelWidth: "μm", - rotation: "°", - chamberWidth: "μm", - numberOfChambers: "", - chamberSpacing: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - chamberLength: 30, - feedingChannelWidth: 10, - chamberWidth: 30, - numberOfChambers: 1, - chamberSpacing: 30, - height: 10, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - chamberLength: 6000, - feedingChannelWidth: 2000, - chamberWidth: 6000, - numberOfChambers: 100, - chamberSpacing: 12 * 1000, - height: 1200, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - chamberWidth: "chamberWidth", - chamberLength: "chamberLength", - numberOfChambers: "numberOfChambers", - chamberSpacing: "chamberSpacing", - feedingChannelWidth: "feedingChannelWidth", - height: "height" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - rotation: "rotation", - chamberWidth: "chamberWidth", - chamberLength: "chamberLength", - numberOfChambers: "numberOfChambers", - chamberSpacing: "chamberSpacing", - feedingChannelWidth: "feedingChannelWidth", - height: "height" - }; - - this.__placementTool = "CellPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW", "CELL"]; - - this.__mint = "LONG CELL TRAP"; - - this.__zOffsetKeys = { - FLOW: "height", - CELL: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CELL: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const chamberLength = params.chamberLength; - const numChambers = params.numberOfChambers; - const chamberWidth = params.chamberWidth; - const feedingChannelWidth = params.feedingChannelWidth; - const chamberSpacing = params.chamberSpacing; - - const ports = []; - - ports.push(new ComponentPort(0, chamberLength + feedingChannelWidth / 2, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort((numChambers / 2) * (chamberWidth + chamberSpacing) + chamberSpacing, chamberLength + feedingChannelWidth / 2, "2", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key = "FLOW") { - if (key === "FLOW") { - return this.__drawFlow(params); - } else if (key === "CELL") { - return this.__drawCell(params); - } else { - const flow = this.__drawFlow(params); - const control = this.__drawCell(params); - const ret = new paper.CompoundPath(""); - ret.addChild(flow); - ret.addChild(control); - return ret; - } - - throw new Error("Unknown key: " + key); - - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const traps = this.__drawFlow(params); - traps.addChild(this.__drawCell(params)); - traps.fillColor!.alpha = 0.5; - return traps; - } - - __drawFlow(params: { [k: string]: any }) { - const rotation = params.rotation; - const position = params.position; - const chamberLength = params.chamberLength; - const numChambers = params.numberOfChambers; - const chamberWidth = params.chamberWidth; - const feedingChannelWidth = params.feedingChannelWidth; - const chamberSpacing = params.chamberSpacing; - - const color = params.color; - const x = position[0]; - const y = position[1]; - const chamberList = new paper.CompoundPath(""); - chamberList.fillColor = color; - let rec; - let traps; - let channels; - - const startPoint = new paper.Point(x, y + chamberLength); - channels = new paper.Path.Rectangle({ - point: startPoint, - size: [(numChambers / 2) * (chamberWidth + chamberSpacing) + chamberSpacing, feedingChannelWidth], - fillColor: color, - strokeWidth: 0 - }); - chamberList.addChild(channels); - - traps = new paper.CompoundPath(chamberList); - traps.fillColor = color; - traps.rotate(rotation, new paper.Point(x, y)); - return traps; - } - - __drawCell(params: { [k: string]: any }) { - const rotation = params.rotation; - const position = params.position; - const chamberLength = params.chamberLength; - const numChambers = params.numberOfChambers; - const chamberWidth = params.chamberWidth; - const feedingChannelWidth = params.feedingChannelWidth; - const chamberSpacing = params.chamberSpacing; - const color = params.color; - const x = position[0]; - const y = position[1]; - const chamberList = new paper.CompoundPath(""); - let rec; - - for (let i = 0; i < numChambers / 2; i++) { - const startPoint = new paper.Point(x + i * (chamberWidth + chamberSpacing) + chamberSpacing, y); - rec = new paper.Path.Rectangle({ - size: [chamberWidth, 2 * chamberLength + feedingChannelWidth], - point: startPoint, - fillColor: color, - strokeWidth: 0 - }); - chamberList.addChild(rec); - } - - chamberList.fillColor = color; - chamberList.rotate(rotation, new paper.Point(x, y)); - return chamberList; - } -} diff --git a/src/app/library/celltrapS.ts b/src/app/library/celltrapS.ts deleted file mode 100644 index 8ed110d7..00000000 --- a/src/app/library/celltrapS.ts +++ /dev/null @@ -1,202 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class CellTrapS extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - height: "Float", - channelWidth: "Float", - channelLength: "Float", - chamberWidth: "Float", - chamberLength: "Float", - chamberHeight: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - height: 250, - channelWidth: 1 * 1000, - channelLength: 4 * 1000, - chamberWidth: 2.5 * 1000, - chamberLength: 2.5 * 1000, - chamberHeight: 250 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - height: "μm", - channelWidth: "μm", - channelLength: "μm", - chamberWidth: "μm", - chamberLength: "μm", - chamberHeight: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - rotation: 0, - height: 10, - channelWidth: 0.5 * 1000, - channelLength: 2.5 * 1000, - chamberWidth: 1.5 * 1000, - chamberLength: 1.5 * 1000, - chamberHeight: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - rotation: 360, - height: 1200, - channelWidth: 2 * 1000, - channelLength: 6 * 1000, - chamberWidth: 4 * 1000, - chamberLength: 4 * 1000, - chamberHeight: 1200 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - height: "height", - channelWidth: "channelWidth", - channelLength: "channelLength", - chamberWidth: "chamberWidth", - chamberLength: "chamberLength", - chamberHeight: "chamberHeight" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - rotation: "rotation", - height: "height", - channelWidth: "channelWidth", - channelLength: "channelLength", - chamberWidth: "chamberWidth", - chamberLength: "chamberLength", - chamberHeight: "chamberHeight" - }; - - this.__placementTool = "CellPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW", "CELL"]; - - this.__mint = "SQUARE CELL TRAP"; - - this.__zOffsetKeys = { - FLOW: "height", - CELL: "chamberHeight" - }; - - this.__substrateOffset = { - FLOW: "0", - CELL: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const channelLength = params.channelLength; - - const ports = []; - - ports.push(new ComponentPort(-channelLength / 2, 0, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(channelLength / 2, 0, "2", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(0, -channelLength / 2, "3", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(0, channelLength / 2, "4", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - if (key === "FLOW") { - return this.__drawFlow(params); - } else if (key === "CELL") { - return this.__drawCell(params); - }else{ - throw new Error("Unknown key for celltrapS: " + key); - } - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const traps = this.__drawFlow(params); - traps.addChild(this.__drawCell(params)); - - traps.fillColor!.alpha = 0.5; - - return traps; - } - - __drawFlow(params: { [k: string]: any }) { - const rotation = params.rotation; - const position = params.position; - const color = params.color; - const x = position[0]; - const y = position[1]; - const channelWidth = params.channelWidth; - const channelLength = params.channelLength; - - const traps = new paper.CompoundPath(""); - - // horizontal channel - let topLeft = new paper.Point(x - channelLength / 2, y - channelWidth / 2); - let bottomRight = new paper.Point(x + channelLength / 2, y + channelWidth / 2); - - traps.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // vertical channel - topLeft = new paper.Point(x - channelWidth / 2, y - channelLength / 2); - bottomRight = new paper.Point(x + channelWidth / 2, y + channelLength / 2); - - traps.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - traps.fillColor = color; - - traps.rotate(rotation, new paper.Point(x, y)); - - return traps; - } - - __drawCell(params: { [k: string]: any }) { - const rotation = params.rotation; - const color = params.color; - const position = params.position; - const x = position[0]; - const y = position[1]; - const chamberWidth = params.chamberWidth; - const chamberLength = params.chamberLength; - - const chamberList = new paper.CompoundPath(""); - - // chamber - const topLeft = new paper.Point(x - chamberWidth / 2, y - chamberLength / 2); - const bottomRight = new paper.Point(x + chamberWidth / 2, y + chamberLength / 2); - - chamberList.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - chamberList.fillColor = color; - chamberList.rotate(rotation, new paper.Point(x, y)); - - return chamberList; - } -} diff --git a/src/app/library/chamber.ts b/src/app/library/chamber.ts deleted file mode 100755 index 7eade239..00000000 --- a/src/app/library/chamber.ts +++ /dev/null @@ -1,150 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Chamber extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - width: "Float", - length: "Float", - height: "Float", - cornerRadius: "Float", - rotation: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - width: 5000, - length: 5000, - height: 250, - cornerRadius: 200, - rotation: 0 - }; - - this.__units = { - componentSpacing: "μm", - width: "μm", - length: "μm", - height: "μm", - cornerRadius: "μm", - rotation: "°" - }; - - this.__minimum = { - componentSpacing: 0, - width: 5, - length: 5, - height: 1, - cornerRadius: 1, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - width: 50000, - length: 50000, - height: 50000, - cornerRadius: 1000, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - width: "width", - length: "length", - height: "height", - cornerRadius: "cornerRadius", - rotation: "rotation" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - position: "position", - width: "width", - length: "length", - height: "height", - cornerRadius: "cornerRadius", - rotation: "rotation" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "REACTION CHAMBER"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const l = params.length; - const w = params.width; - - const ports = []; - - ports.push(new ComponentPort(0, -l / 2, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(w / 2, 0, "2", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(0, l / 2, "3", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(-w / 2, 0, "4", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - const position = params.position; - const px = position[0]; - const py = position[1]; - const l = params.length; - const w = params.width; - const rotation = params.rotation; - const color = params.color; - const radius = params.cornerRadius; - - const rendered = new paper.CompoundPath(""); - - const rec = new paper.Path.Rectangle({ - point: new paper.Point(px - w / 2, py - l / 2), - size: [w, l], - radius: radius - }); - - rendered.addChild(rec); - - rendered.fillColor = color; - rendered.rotate(rotation, new paper.Point(px, py)); - return rendered; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/channel.ts b/src/app/library/channel.ts deleted file mode 100644 index 4d6686e7..00000000 --- a/src/app/library/channel.ts +++ /dev/null @@ -1,105 +0,0 @@ -import Template from "./template"; -import paper from "paper"; - -export default class Channel extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - start: "Point", - end: "Point" - }; - - this.__defaults = { - channelWidth: 0.8 * 1000, - height: 250 - }; - - this.__heritable = { - channelWidth: "Float", - height: "Float" - }; - - this.__units = { - channelWidth: "μm", - height: "μm" - }; - - this.__minimum = { - channelWidth: 3, - height: 10 - }; - - this.__maximum = { - channelWidth: 12000, - height: 1200 - }; - - this.__placementTool = "DragTool"; - - this.__toolParams = { - start: "start", - end: "end" - }; - - this.__featureParams = { - start: "start", - end: "end", - width: "channelWidth" - }; - - this.__targetParams = { - diameter: "channelWidth", - channelWidth: "channelWidth" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "CHANNEL"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - render2D(params: { [k: string]: any }, key: string) { - // Regardless of the key... - const start = params.start; - const end = params.end; - const color = params.color; - const width = params.width; - const baseColor = params.baseColor; - const startPoint = new paper.Point(start[0], start[1]); - const endPoint = new paper.Point(end[0], end[1]); - const vec = endPoint.subtract(startPoint); - const rec = new paper.Path.Rectangle({ - size: [vec.length, width], - point: start, - // radius: width/2, - fillColor: color, - strokeWidth: 0 - }); - rec.translate(new paper.Point(0, -width / 2)); - rec.rotate(vec.angle, start); - return rec; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const thickness = params.channelWidth / 5; - const length = params.channelWidth; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - let chair = new paper.Path.Rectangle(new paper.Rectangle(x - length / 2, y - thickness / 2, length, thickness)); - let chairtarget = chair.unite(new paper.Path.Rectangle(new paper.Rectangle(x - thickness / 2, y - length / 2, thickness, length))); - chairtarget.fillColor = color; - chairtarget.fillColor!.alpha = 0.5; - return chair; - } -} diff --git a/src/app/library/chemostatring.ts b/src/app/library/chemostatring.ts deleted file mode 100644 index f0ce9d38..00000000 --- a/src/app/library/chemostatring.ts +++ /dev/null @@ -1,1170 +0,0 @@ -import Template from "./template"; -import paper, { CompoundPath } from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class ChemostatRing extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - flowChannelWidth: "Float", - controlChannelWidth: "Float", - chemostatChannelWidth: "Float", - radius: "Float", - rotation: "Float", - volume: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - flowChannelWidth: 100, - controlChannelWidth: 50, - chemostatChannelWidth: 100, - radius: 400, - rotation: 0, - volume: 30000000, - height: 20 - }; - - this.__units = { - bendSpacing: "μm", - numberOfBends: "", - channelWidth: "μm", - bendLength: "μm", - componentSpacing: "μm", - flowChannelWidth: "μm", - controlChannelWidth: "μm", - chemostatChannelWidth: "μm", - radius: "μm", - rotation: "°", - volume: "μm3", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - flowChannelWidth: 0.1 * 1000, - controlChannelWidth: 0.1 * 1000, - chemostatChannelWidth: 0.2 * 1000, - radius: 0.2 * 1000, - rotation: 0, - volume: 0.1 * 1000 * 1 * 1000 * 4 * 0.2 * 1000, - height: 0.2 * 1000 - }; - - this.__maximum = { - componentSpacing: 10000, - flowChannelWidth: 0.3 * 10000, - controlChannelWidth: 0.15 * 10000, - chemostatChannelWidth: 0.5 * 10000, - radius: 10000, - rotation: 260, - volume: 0.5 * 10000 * 10 * 1000 * 4 * 1 * 10000, - height: 1 * 10000 - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - cursorPosition: "position" - }; - - this.__featureParams = { - position: "position", - componentSpacing: "componentSpacing", - flowChannelWidth: "flowChannelWidth", - controlChannelWidth: "controlChannelWidth", - chemostatChannelWidth: "chemostatChannelWidth", - radius: "radius", - rotation: "rotation", - volume: "volume", - height: "height" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - flowChannelWidth: "flowChannelWidth", - controlChannelWidth: "controlChannelWidth", - chemostatChannelWidth: "chemostatChannelWidth", - radius: "radius", - rotation: "rotation", - volume: "volume", - height: "height" - }; - - this.__renderKeys = ["FLOW", "CONTROL"]; - - this.__mint = "CHEMOSTAT RING"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1" - }; - } - - getPorts(params: { [k: string]: any }) { - const flowChannelWidth = params.flowChannelWidth; - const controlChannelWidth = params.controlChannelWidth; - const chemostatChannelWidth = params.chemostatChannelWidth; - const volume = params.volume; - const height = params.height; - const radius = params.radius; - - const area = volume / height; - const chemostatLength = area / (4 * chemostatChannelWidth); - - const controlSpacing = chemostatLength / 10; - const controlendpoint = (-7 * chemostatLength) / 8; - const bendDist = chemostatLength / 15; - - const ports = []; - - // flow - ports.push(new ComponentPort(-chemostatLength / 3 - chemostatLength / 2, -chemostatLength / 3, "1", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(-chemostatLength / 3 - chemostatLength / 5, -chemostatLength / 3 - chemostatLength / 3, "2", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(-chemostatLength / 3 + chemostatLength / 5, -chemostatLength / 3 - chemostatLength / 3, "3", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(-chemostatLength / 3 + chemostatLength / 2, -chemostatLength / 3, "4", LogicalLayerType.FLOW)); - // ports.push(new ComponentPort(chemostatChannelWidth + chemostatLength + 2 * chemostatLength/5, chemostatChannelWidth/2 + 7 * chemostatLength/11, "5", "FLOW")); - - // control - // 1 - ports.push(new ComponentPort(-chemostatLength / 3 - chemostatLength / 5 - controlSpacing - radius, controlendpoint, "5", LogicalLayerType.CONTROL)); - // 2 - ports.push(new ComponentPort(-chemostatLength / 3 - chemostatLength / 5 + 1.3 * radius, controlendpoint, "6", LogicalLayerType.CONTROL)); - // 3 - ports.push(new ComponentPort(-chemostatLength / 3 - chemostatLength / 5 + 1.7 * radius, controlendpoint, "7", LogicalLayerType.CONTROL)); - // 4 - ports.push(new ComponentPort(-chemostatLength / 3 + chemostatLength / 5 - controlSpacing - radius, controlendpoint, "8", LogicalLayerType.CONTROL)); - // 5 - ports.push(new ComponentPort(-chemostatLength / 3 + chemostatLength / 5 + 1.3 * radius, controlendpoint, "9", LogicalLayerType.CONTROL)); - // 6 - ports.push(new ComponentPort(-chemostatLength / 3 + chemostatLength / 5 + 1.7 * radius, controlendpoint, "10", LogicalLayerType.CONTROL)); - - let originx = chemostatChannelWidth / 2 + (3 * chemostatLength) / 7; - let originy = chemostatChannelWidth / 2; - - // 7 - ports.push(new ComponentPort(originx - controlSpacing - 0.5 * radius, controlendpoint, "11", LogicalLayerType.CONTROL)); - // 8 - ports.push(new ComponentPort(originx + 1.3 * radius, controlendpoint, "12", LogicalLayerType.CONTROL)); - // 9 - ports.push(new ComponentPort(originx + 1.7 * radius, controlendpoint, "13", LogicalLayerType.CONTROL)); - - originx = (5 * chemostatLength) / 6; - originy = chemostatChannelWidth / 2; - - // 10 - ports.push(new ComponentPort(originx - controlSpacing - 0.5 * radius, controlendpoint, "14", LogicalLayerType.CONTROL)); - // 11 - ports.push(new ComponentPort(originx + 1.3 * radius, controlendpoint, "15", LogicalLayerType.CONTROL)); - // 12 - ports.push(new ComponentPort(originx + 1.7 * radius, controlendpoint, "16", LogicalLayerType.CONTROL)); - - originx = chemostatChannelWidth / 2; - originy = chemostatLength / 5; - - // 13 - ports.push(new ComponentPort(controlendpoint, originy - controlSpacing - 0.5 * radius, "17", LogicalLayerType.CONTROL)); - // 14 - ports.push(new ComponentPort(controlendpoint, originy + 1.3 * radius, "18", LogicalLayerType.CONTROL)); - // 15 - ports.push(new ComponentPort(controlendpoint, originy + 1.7 * radius, "19", LogicalLayerType.CONTROL)); - - originx = chemostatChannelWidth / 2; - originy = chemostatLength / 5 + chemostatLength / 2; - - // 16 - ports.push(new ComponentPort(controlendpoint, originy - controlSpacing - 0.5 * radius, "20", LogicalLayerType.CONTROL)); - // 17 - ports.push(new ComponentPort(controlendpoint, originy + 1.3 * radius, "21", LogicalLayerType.CONTROL)); - // 18 - ports.push(new ComponentPort(controlendpoint, originy + 1.7 * radius, "22", LogicalLayerType.CONTROL)); - - originx = chemostatChannelWidth / 2 + chemostatLength; - originy = chemostatChannelWidth / 2 + (2 * chemostatLength) / 5; - - // 19 - ports.push(new ComponentPort(2 * chemostatLength, originy - controlSpacing - 0.5 * radius, "23", LogicalLayerType.CONTROL)); - // 20 - ports.push(new ComponentPort(2 * chemostatLength, originy + 1.3 * radius, "24", LogicalLayerType.CONTROL)); - // 21 - ports.push(new ComponentPort(2 * chemostatLength, originy + 1.7 * radius, "25", LogicalLayerType.CONTROL)); - - originx = chemostatChannelWidth / 2 + chemostatLength; - originy = chemostatChannelWidth / 2 + (4 * chemostatLength) / 5; - - // 22 - ports.push(new ComponentPort(2 * chemostatLength, originy - controlSpacing - 0.5 * radius, "26", LogicalLayerType.CONTROL)); - // 23 - ports.push(new ComponentPort(2 * chemostatLength, originy + 1.3 * radius, "27", LogicalLayerType.CONTROL)); - // 24 - ports.push(new ComponentPort(2 * chemostatLength, originy + 1.7 * radius, "28", LogicalLayerType.CONTROL)); - - originx = chemostatChannelWidth / 2 + chemostatLength / 4; - originy = chemostatLength + chemostatChannelWidth / 2; - - // 25 - ports.push(new ComponentPort(originx - 0.3 * controlSpacing, 2 * chemostatLength, "29", LogicalLayerType.CONTROL)); - // 26 - ports.push(new ComponentPort(originx + 0.5 * controlSpacing, 2 * chemostatLength, "30", LogicalLayerType.CONTROL)); - // 27 - ports.push(new ComponentPort(originx + 0.4 * controlSpacing + 0.3 * controlSpacing, 2 * chemostatLength, "31", LogicalLayerType.CONTROL)); - - originx = chemostatChannelWidth / 2 + (3 * chemostatLength) / 7; - originy = chemostatLength + chemostatChannelWidth / 2; - - // 28 - ports.push(new ComponentPort(originx - 0.3 * controlSpacing, 2 * chemostatLength, "32", LogicalLayerType.CONTROL)); - // 29 - ports.push(new ComponentPort(originx - 0.5 * controlSpacing, 2 * chemostatLength, "33", LogicalLayerType.CONTROL)); - // 30 - ports.push(new ComponentPort(originx + 0.3 * controlSpacing, 2 * chemostatLength, "34", LogicalLayerType.CONTROL)); - - // 31 - ports.push(new ComponentPort(originx + 0.55 * controlSpacing, 2 * chemostatLength, "35", LogicalLayerType.CONTROL)); - // 32 - ports.push(new ComponentPort(originx + 0.85 * controlSpacing, 2 * chemostatLength, "36", LogicalLayerType.CONTROL)); - // 33 - ports.push(new ComponentPort(originx + 1.15 * controlSpacing, 2 * chemostatLength, "37", LogicalLayerType.CONTROL)); - - originx = chemostatChannelWidth / 2 + (3 * chemostatLength) / 5; - originy = chemostatLength + chemostatChannelWidth / 2; - - // 34 - ports.push(new ComponentPort(originx - 0.3 * controlSpacing, 2 * chemostatLength, "38", LogicalLayerType.CONTROL)); - // 35 - ports.push(new ComponentPort(originx + 0.5 * controlSpacing, 2 * chemostatLength, "49", LogicalLayerType.CONTROL)); - // 36 - ports.push(new ComponentPort(originx + 0.4 * controlSpacing + 0.3 * controlSpacing, 2 * chemostatLength, "40", LogicalLayerType.CONTROL)); - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - if (key === "FLOW") { - return this.__drawFlow(params); - } else if (key === "CONTROL") { - return this.__drawControl(params); - } - else{ - throw new Error("Unknown key for computing chemostat ring: " + key); - } - } - - __drawFlow(params: { [k: string]: any }) { - const x = params.position[0]; - const y = params.position[1]; - const flowChannelWidth = params.flowChannelWidth; - const controlChannelWidth = params.controlChannelWidth; - const chemostatChannelWidth = params.chemostatChannelWidth; - const volume = params.volume; - const height = params.height; - const radius = params.radius; - const rotation = params.rotation; - const color = params.color; - const serp = new paper.CompoundPath(""); - - const area = volume / height; - const chemostatLength = area / (4 * chemostatChannelWidth); - - /// / chemostat ring - - // chemostat ring top - let topLeft = new paper.Point(x + chemostatChannelWidth, y); - let bottomRight = new paper.Point(x + chemostatChannelWidth + chemostatLength, y + chemostatChannelWidth); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // chemostat ring right - topLeft = new paper.Point(x + chemostatLength, y + chemostatChannelWidth); - bottomRight = new paper.Point(x + chemostatChannelWidth + chemostatLength, y + chemostatChannelWidth + chemostatLength); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // chemostat ring bottom - topLeft = new paper.Point(x, y + chemostatLength); - bottomRight = new paper.Point(x + chemostatLength, y + chemostatLength + chemostatChannelWidth); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // chemostat ring left - topLeft = new paper.Point(x, y); - bottomRight = new paper.Point(x + chemostatChannelWidth, y + chemostatLength); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // in top left vert - topLeft = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength / 4 - flowChannelWidth / 2, y + chemostatChannelWidth / 2); - bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength / 4 + flowChannelWidth / 2, y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // in top right vert - topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 - flowChannelWidth / 2, y + chemostatChannelWidth / 2); - bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 + flowChannelWidth / 2, y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // in top right hori - topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5, y + chemostatChannelWidth / 2 + chemostatLength / 5 - flowChannelWidth / 2); - bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength, y + chemostatChannelWidth / 2 + chemostatLength / 5 + flowChannelWidth / 2); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // in top bottom hori - topLeft = new paper.Point(x + chemostatChannelWidth / 2, y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5 - flowChannelWidth / 2); - bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5, y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5 + flowChannelWidth / 2); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // in middle left hori - topLeft = new paper.Point(x + chemostatChannelWidth / 2, y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 5 - flowChannelWidth / 2); - bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength / 4, y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 5 + flowChannelWidth / 2); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // in middle middle vert - topLeft = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength / 4 - flowChannelWidth / 2, y + chemostatChannelWidth / 2 + chemostatLength / 2); - bottomRight = new paper.Point( - x + chemostatChannelWidth / 2 + chemostatLength / 4 + flowChannelWidth / 2, - y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 5 + flowChannelWidth / 2 - ); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // in middle middle hori - topLeft = new paper.Point( - x + chemostatChannelWidth / 2 + chemostatLength / 4 - flowChannelWidth / 2, - y + chemostatChannelWidth / 2 + chemostatLength / 2 - flowChannelWidth / 2 - ); - bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + (5 * chemostatLength) / 7, y + chemostatChannelWidth / 2 + chemostatLength / 2 + flowChannelWidth / 2); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // in top circle - let center = new paper.Point(x + chemostatChannelWidth / 2 + (5 * chemostatLength) / 7, y + chemostatChannelWidth / 2 + chemostatLength / 2); - const circ = new paper.Path.Circle(center, radius); - serp.addChild(circ); - - // calc H - const xval = Math.abs((5 * chemostatLength) / 7 - (3 * chemostatLength) / 5); - const yval = Math.abs(chemostatChannelWidth / 2 + chemostatLength / 2 - (chemostatChannelWidth / 2 + (2 * chemostatLength) / 5)); - const hval = Math.sqrt(Math.pow(xval, 2) + Math.pow(yval, 2)); - const angt = (Math.asin(yval / hval) * 180) / Math.PI; - - // in tilt - topLeft = new paper.Point( - x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 - flowChannelWidth / 2, - y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5 - flowChannelWidth / 2 - ); - bottomRight = new paper.Point( - x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 - flowChannelWidth / 2 + hval, - y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5 + flowChannelWidth / 2 - ); - serp.addChild( - (new paper.Path.Rectangle(topLeft, bottomRight).rotate( - angt, - new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5, y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5) - ) as unknown) as paper.Path.Rectangle - ); - - // in circle bottom vert - topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (5 * chemostatLength) / 7 - flowChannelWidth / 2, y + chemostatChannelWidth / 2 + chemostatLength / 2); - bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + (5 * chemostatLength) / 7 + flowChannelWidth / 2, y + chemostatChannelWidth / 2 + (7 * chemostatLength) / 11); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // in circle bottom hori - topLeft = new paper.Point( - x + chemostatChannelWidth / 2 + (5 * chemostatLength) / 7 - flowChannelWidth / 2, - y + chemostatChannelWidth / 2 + (7 * chemostatLength) / 11 - flowChannelWidth / 2 - ); - bottomRight = new paper.Point(x + chemostatLength, y + chemostatChannelWidth / 2 + (7 * chemostatLength) / 11 + flowChannelWidth / 2); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // in bottom right vert - topLeft = new paper.Point(x + (5 * chemostatLength) / 6 - flowChannelWidth / 2, y + chemostatChannelWidth / 2 + (7 * chemostatLength) / 11); - bottomRight = new paper.Point(x + (5 * chemostatLength) / 6 + flowChannelWidth / 2, y + chemostatChannelWidth / 2 + chemostatLength); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // in bottom middle vert - topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 7 - flowChannelWidth / 2, y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 6); - bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 7 + flowChannelWidth / 2, y + chemostatChannelWidth / 2 + chemostatLength); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // in bottom circle - center = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 7, y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 6); - serp.addChild(new paper.Path.Circle(center, radius)); - - /// / stuff outside the ring - - // left top hori - topLeft = new paper.Point(x - chemostatLength / 3, y + chemostatLength / 5 - flowChannelWidth / 2); - bottomRight = new paper.Point(x, y + chemostatLength / 5 + flowChannelWidth / 2); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // left top vert - topLeft = new paper.Point(x - chemostatLength / 3 - flowChannelWidth / 2, y - chemostatLength / 3); - bottomRight = new paper.Point(x - chemostatLength / 3 + flowChannelWidth / 2, y + chemostatLength / 5 + flowChannelWidth / 2); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // left flow port hori bar - topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 2, y - chemostatLength / 3 - flowChannelWidth / 2); - bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 2, y - chemostatLength / 3 + flowChannelWidth / 2); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // horizontal circles - // left - // center = new paper.Point(x - chemostatLength/3 - chemostatLength/2, y - chemostatLength/3); - // serp.addChild(new paper.Path.Circle(center, radius)); - // right - // center = new paper.Point(x - chemostatLength/3 + chemostatLength/2, y - chemostatLength/3); - // serp.addChild(new paper.Path.Circle(center, radius)); - - // left flow port vert - topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - flowChannelWidth / 2, y - chemostatLength / 3 - chemostatLength / 3); - bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + flowChannelWidth / 2, y - chemostatLength / 3); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // right flow port vert - topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - flowChannelWidth / 2, y - chemostatLength / 3 - chemostatLength / 3); - bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + flowChannelWidth / 2, y - chemostatLength / 3); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // top circles - // left - // center = new paper.Point(x - chemostatLength/3 - chemostatLength/5, y - chemostatLength/3 - chemostatLength/3); - // serp.addChild(new paper.Path.Circle(center, radius)); - - // right - // center = new paper.Point(x - chemostatLength/3 + chemostatLength/5, y - chemostatLength/3 - chemostatLength/3); - // serp.addChild(new paper.Path.Circle(center, radius)); - - // left vert line that goes to bottom - topLeft = new paper.Point(x - chemostatLength / 5 - flowChannelWidth / 2, y + chemostatLength / 5); - bottomRight = new paper.Point(x - chemostatLength / 5 + flowChannelWidth / 2, y + chemostatLength + chemostatChannelWidth + chemostatLength / 5); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // left middle hori - topLeft = new paper.Point(x - chemostatLength / 5, y + chemostatLength / 5 + chemostatLength / 2 - flowChannelWidth / 2); - bottomRight = new paper.Point(x, y + chemostatLength / 5 + chemostatLength / 2 + flowChannelWidth / 2); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // bottom hori - topLeft = new paper.Point(x - chemostatLength / 5 - flowChannelWidth / 2, y + chemostatLength + chemostatChannelWidth + chemostatLength / 5 - flowChannelWidth / 2); - bottomRight = new paper.Point( - x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5, - y + chemostatLength + chemostatChannelWidth + chemostatLength / 5 + flowChannelWidth / 2 - ); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // bottom left vert - topLeft = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength / 4 - flowChannelWidth / 2, y + chemostatLength + chemostatChannelWidth / 2); - bottomRight = new paper.Point( - x + chemostatChannelWidth / 2 + chemostatLength / 4 + flowChannelWidth / 2, - y + chemostatLength + chemostatChannelWidth + chemostatLength / 5 - ); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // bottom middle vert - topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 - flowChannelWidth / 2, y + chemostatLength + chemostatChannelWidth / 2); - bottomRight = new paper.Point( - x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 + flowChannelWidth / 2, - y + chemostatLength + chemostatChannelWidth + (2 * chemostatLength) / 5 - ); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // bottom right hori - topLeft = new paper.Point( - x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 - flowChannelWidth / 2, - y + chemostatLength + chemostatChannelWidth + (2 * chemostatLength) / 5 - flowChannelWidth / 2 - ); - bottomRight = new paper.Point( - x + chemostatChannelWidth + chemostatLength + (2 * chemostatLength) / 5, - y + chemostatLength + chemostatChannelWidth + (2 * chemostatLength) / 5 + flowChannelWidth / 2 - ); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // right bottom vert - topLeft = new paper.Point( - x + chemostatChannelWidth + chemostatLength + (2 * chemostatLength) / 5 - flowChannelWidth / 2, - y + chemostatChannelWidth / 2 + (7 * chemostatLength) / 11 - ); - bottomRight = new paper.Point( - x + chemostatChannelWidth + chemostatLength + (2 * chemostatLength) / 5 + flowChannelWidth / 2, - y + chemostatLength + chemostatChannelWidth + (2 * chemostatLength) / 5 + flowChannelWidth / 2 - ); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - center = new paper.Point(x + chemostatChannelWidth + chemostatLength + (2 * chemostatLength) / 5, y + chemostatChannelWidth / 2 + (7 * chemostatLength) / 11 - radius); - serp.addChild(new paper.Path.Circle(center, radius)); - - // right bottom hori - topLeft = new paper.Point( - x + chemostatChannelWidth + chemostatLength + chemostatLength / 5, - y + chemostatLength + chemostatChannelWidth + chemostatLength / 5 - flowChannelWidth / 2 - ); - bottomRight = new paper.Point( - x + chemostatChannelWidth + chemostatLength + (2 * chemostatLength) / 5, - y + chemostatLength + chemostatChannelWidth + chemostatLength / 5 + flowChannelWidth / 2 - ); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // right vert that goes to top - topLeft = new paper.Point(x + chemostatChannelWidth + chemostatLength + chemostatLength / 5 - flowChannelWidth / 2, y - chemostatLength / 5); - bottomRight = new paper.Point( - x + chemostatChannelWidth + chemostatLength + chemostatLength / 5 + flowChannelWidth / 2, - y + chemostatLength + chemostatChannelWidth + chemostatLength / 5 + flowChannelWidth / 2 - ); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // right middle hori - topLeft = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength, y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 5 - flowChannelWidth / 2); - bottomRight = new paper.Point( - x + chemostatChannelWidth + chemostatLength + chemostatLength / 5, - y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 5 + flowChannelWidth / 2 - ); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // right top hori - topLeft = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength, y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5 - flowChannelWidth / 2); - bottomRight = new paper.Point( - x + chemostatChannelWidth + chemostatLength + chemostatLength / 5, - y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5 + flowChannelWidth / 2 - ); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // top hori - topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 7, y - chemostatLength / 5 - flowChannelWidth / 2); - bottomRight = new paper.Point(x + chemostatChannelWidth + chemostatLength + chemostatLength / 5 + flowChannelWidth / 2, y - chemostatLength / 5 + flowChannelWidth / 2); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // top left vert - topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 7 - flowChannelWidth / 2, y - chemostatLength / 5 - flowChannelWidth / 2); - bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 7 + flowChannelWidth / 2, y); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // top right vert - topLeft = new paper.Point(x + (5 * chemostatLength) / 6 - flowChannelWidth / 2, y - chemostatLength / 5); - bottomRight = new paper.Point(x + (5 * chemostatLength) / 6 + flowChannelWidth / 2, y); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - serp.rotate(rotation, new paper.Point(x, y)); - serp.fillColor = color; - return serp; - } - - __drawControl(params: { [k: string]: any }) { - const x = params.position[0]; - const y = params.position[1]; - const flowChannelWidth = params.flowChannelWidth; - const controlChannelWidth = params.controlChannelWidth; - const chemostatChannelWidth = params.chemostatChannelWidth; - const volume = params.volume; - const height = params.height; - const radius = params.radius; - const rotation = params.rotation; - const color = params.color; - - const area = volume / height; - const chemostatLength = area / (4 * chemostatChannelWidth); - - const control = new paper.CompoundPath(""); - - const valvelength = 1.5 * chemostatChannelWidth; - const valvewidth = 2 * controlChannelWidth; - const controlSpacing = chemostatLength / 10; - - const controlendpoint = (-7 * chemostatLength) / 8; - const bendDist = chemostatLength / 15; - - // 1 - let topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - controlChannelWidth / 2 - controlSpacing - radius, y + controlendpoint); - let bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + controlChannelWidth / 2 - controlSpacing - radius, y - chemostatLength / 3 - bendDist); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point( - x - chemostatLength / 3 - chemostatLength / 5 - controlChannelWidth / 2 - controlSpacing - radius, - y - chemostatLength / 3 - bendDist - controlChannelWidth / 2 - ); - bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - controlSpacing, y - chemostatLength / 3 - bendDist + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point( - x - chemostatLength / 3 - chemostatLength / 5 - controlSpacing - controlChannelWidth / 2, - y - chemostatLength / 3 - bendDist - controlChannelWidth / 2 - ); - bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - controlSpacing + controlChannelWidth / 2, y - chemostatLength / 3); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - controlSpacing - valvewidth / 2, y - chemostatLength / 3 - valvelength / 2); - bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - controlSpacing + valvewidth / 2, y - chemostatLength / 3 + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 2 - topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - valvelength / 2, y - chemostatLength / 3 - controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + valvelength / 2, y - chemostatLength / 3 - controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5, y - chemostatLength / 3 - controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + 1.3 * radius, y - chemostatLength / 3 - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + 1.3 * radius - controlChannelWidth / 2, y + controlendpoint); - bottomRight = new paper.Point( - x - chemostatLength / 3 - chemostatLength / 5 + 1.3 * radius + controlChannelWidth / 2, - y - chemostatLength / 3 - controlSpacing + controlChannelWidth / 2 - ); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 3 - topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + controlSpacing - valvewidth / 2, y - chemostatLength / 3 - valvelength / 2); - bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + controlSpacing + valvewidth / 2, y - chemostatLength / 3 + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + controlSpacing - controlChannelWidth / 2, y - chemostatLength / 3 - bendDist); - bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + controlSpacing + controlChannelWidth / 2, y - chemostatLength / 3); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point( - x - chemostatLength / 3 - chemostatLength / 5 + controlSpacing - controlChannelWidth / 2, - y - chemostatLength / 3 - bendDist - controlChannelWidth / 2 - ); - bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + 1.7 * radius, y - chemostatLength / 3 - bendDist + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + 1.7 * radius - controlChannelWidth / 2, y + controlendpoint); - bottomRight = new paper.Point( - x - chemostatLength / 3 - chemostatLength / 5 + 1.7 * radius + controlChannelWidth / 2, - y - chemostatLength / 3 - bendDist + controlChannelWidth / 2 - ); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 4 - topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - controlChannelWidth / 2 - controlSpacing - radius, y + controlendpoint); - bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + controlChannelWidth / 2 - controlSpacing - radius, y - chemostatLength / 3 - bendDist); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point( - x - chemostatLength / 3 + chemostatLength / 5 - controlChannelWidth / 2 - controlSpacing - radius, - y - chemostatLength / 3 - bendDist - controlChannelWidth / 2 - ); - bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - controlSpacing, y - chemostatLength / 3 - bendDist + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point( - x - chemostatLength / 3 + chemostatLength / 5 - controlSpacing - controlChannelWidth / 2, - y - chemostatLength / 3 - bendDist - controlChannelWidth / 2 - ); - bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - controlSpacing + controlChannelWidth / 2, y - chemostatLength / 3); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - controlSpacing - valvewidth / 2, y - chemostatLength / 3 - valvelength / 2); - bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - controlSpacing + valvewidth / 2, y - chemostatLength / 3 + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 5 - topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - valvelength / 2, y - chemostatLength / 3 - controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + valvelength / 2, y - chemostatLength / 3 - controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5, y - chemostatLength / 3 - controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + 1.3 * radius, y - chemostatLength / 3 - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + 1.3 * radius - controlChannelWidth / 2, y + controlendpoint); - bottomRight = new paper.Point( - x - chemostatLength / 3 + chemostatLength / 5 + 1.3 * radius + controlChannelWidth / 2, - y - chemostatLength / 3 - controlSpacing + controlChannelWidth / 2 - ); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 6 - topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + controlSpacing - valvewidth / 2, y - chemostatLength / 3 - valvelength / 2); - bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + controlSpacing + valvewidth / 2, y - chemostatLength / 3 + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + controlSpacing - controlChannelWidth / 2, y - chemostatLength / 3 - bendDist); - bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + controlSpacing + controlChannelWidth / 2, y - chemostatLength / 3); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point( - x - chemostatLength / 3 + chemostatLength / 5 + controlSpacing - controlChannelWidth / 2, - y - chemostatLength / 3 - bendDist - controlChannelWidth / 2 - ); - bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + 1.7 * radius, y - chemostatLength / 3 - bendDist + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + 1.7 * radius - controlChannelWidth / 2, y + controlendpoint); - bottomRight = new paper.Point( - x - chemostatLength / 3 + chemostatLength / 5 + 1.7 * radius + controlChannelWidth / 2, - y - chemostatLength / 3 - bendDist + controlChannelWidth / 2 - ); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // top left vert - let originx = chemostatChannelWidth / 2 + (3 * chemostatLength) / 7; - let originy = chemostatChannelWidth / 2; - // 7 - topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - controlSpacing - 0.5 * radius, y + controlendpoint); - bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 - controlSpacing - 0.5 * radius, y + originy - bendDist); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - controlSpacing - 0.5 * radius, y + originy - bendDist - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx - controlSpacing, y + originy - bendDist + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlSpacing - controlChannelWidth / 2, y + originy - bendDist - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx - controlSpacing + controlChannelWidth / 2, y + originy); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx - controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 8 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx, y + originy - controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + 1.3 * radius, y + originy - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 1.3 * radius - controlChannelWidth / 2, y + controlendpoint); - bottomRight = new paper.Point(x + originx + 1.3 * radius + controlChannelWidth / 2, y + originy - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 9 - topLeft = new paper.Point(x + originx + controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx + controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy - bendDist); - bottomRight = new paper.Point(x + originx + controlSpacing + controlChannelWidth / 2, y + originy); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy - bendDist - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + 1.7 * radius, y + originy - bendDist + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 1.7 * radius - controlChannelWidth / 2, y + controlendpoint); - bottomRight = new paper.Point(x + originx + 1.7 * radius + controlChannelWidth / 2, y + originy - bendDist + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // top right vert - originx = (5 * chemostatLength) / 6; - originy = chemostatChannelWidth / 2; - // 10 - topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - controlSpacing - 0.5 * radius, y + controlendpoint); - bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 - controlSpacing - 0.5 * radius, y + originy - bendDist); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - controlSpacing - 0.5 * radius, y + originy - bendDist - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx - controlSpacing, y + originy - bendDist + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlSpacing - controlChannelWidth / 2, y + originy - bendDist - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx - controlSpacing + controlChannelWidth / 2, y + originy); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx - controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 11 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx, y + originy - controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + 1.3 * radius, y + originy - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 1.3 * radius - controlChannelWidth / 2, y + controlendpoint); - bottomRight = new paper.Point(x + originx + 1.3 * radius + controlChannelWidth / 2, y + originy - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 12 - topLeft = new paper.Point(x + originx + controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx + controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy - bendDist); - bottomRight = new paper.Point(x + originx + controlSpacing + controlChannelWidth / 2, y + originy); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy - bendDist - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + 1.7 * radius, y + originy - bendDist + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 1.7 * radius - controlChannelWidth / 2, y + controlendpoint); - bottomRight = new paper.Point(x + originx + 1.7 * radius + controlChannelWidth / 2, y + originy - bendDist + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // left top - originx = chemostatChannelWidth / 2; - originy = chemostatLength / 5; - - // 13 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - bendDist - controlChannelWidth / 2, y + originy - controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx, y + originy - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - bendDist - controlChannelWidth / 2, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius); - bottomRight = new paper.Point(x + originx - bendDist + controlChannelWidth / 2, y + originy - controlSpacing); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + controlendpoint, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius); - bottomRight = new paper.Point(x + originx - bendDist, y + originy + controlChannelWidth / 2 - controlSpacing - 0.5 * radius); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 14 - topLeft = new paper.Point(x + originx - controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx - controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlSpacing - controlChannelWidth / 2, y + originy); - bottomRight = new paper.Point(x + originx - controlSpacing + controlChannelWidth / 2, y + originy + 1.3 * radius); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + controlendpoint, y + originy + 1.3 * radius - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx - controlSpacing + controlChannelWidth / 2, y + originy + 1.3 * radius + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 15 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy + controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy + controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - bendDist, y + originy + controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx, y + originy + controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - bendDist - controlChannelWidth / 2, y + originy + controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx - bendDist + controlChannelWidth / 2, y + originy + 1.7 * radius); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + controlendpoint, y + originy + 1.7 * radius - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx - bendDist + controlChannelWidth / 2, y + originy + 1.7 * radius + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // left bottom - originx = chemostatChannelWidth / 2; - originy = chemostatLength / 5 + chemostatLength / 2; - - // 16 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - bendDist - controlChannelWidth / 2, y + originy - controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx, y + originy - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - bendDist - controlChannelWidth / 2, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius); - bottomRight = new paper.Point(x + originx - bendDist + controlChannelWidth / 2, y + originy - controlSpacing); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + controlendpoint, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius); - bottomRight = new paper.Point(x + originx - bendDist, y + originy + controlChannelWidth / 2 - controlSpacing - 0.5 * radius); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 17 - topLeft = new paper.Point(x + originx - controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx - controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlSpacing - controlChannelWidth / 2, y + originy); - bottomRight = new paper.Point(x + originx - controlSpacing + controlChannelWidth / 2, y + originy + 1.3 * radius); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + controlendpoint, y + originy + 1.3 * radius - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx - controlSpacing + controlChannelWidth / 2, y + originy + 1.3 * radius + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 18 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy + controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy + controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - bendDist, y + originy + controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx, y + originy + controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - bendDist - controlChannelWidth / 2, y + originy + controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx - bendDist + controlChannelWidth / 2, y + originy + 1.7 * radius); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + controlendpoint, y + originy + 1.7 * radius - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx - bendDist + controlChannelWidth / 2, y + originy + 1.7 * radius + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // right top - originx = chemostatChannelWidth / 2 + chemostatLength; - originy = chemostatChannelWidth / 2 + (2 * chemostatLength) / 5; - - // 19 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy - controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx, y + originy - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius); - bottomRight = new paper.Point(x + originx + bendDist + controlChannelWidth / 2, y + originy - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * chemostatLength, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius); - bottomRight = new paper.Point(x + originx + bendDist, y + originy + controlChannelWidth / 2 - controlSpacing - 0.5 * radius); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 20 - topLeft = new paper.Point(x + originx + controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx + controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy); - bottomRight = new paper.Point(x + originx + controlSpacing + controlChannelWidth / 2, y + originy + 1.3 * radius); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * chemostatLength, y + originy + 1.3 * radius - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy + 1.3 * radius + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 21 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy + controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy + controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + bendDist, y + originy + controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx, y + originy + controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy + controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + bendDist + controlChannelWidth / 2, y + originy + 1.7 * radius); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * chemostatLength, y + originy + 1.7 * radius - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy + 1.7 * radius + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // right bottom - originx = chemostatChannelWidth / 2 + chemostatLength; - originy = chemostatChannelWidth / 2 + (4 * chemostatLength) / 5; - - // 22 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy - controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx, y + originy - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius); - bottomRight = new paper.Point(x + originx + bendDist + controlChannelWidth / 2, y + originy - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * chemostatLength, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius); - bottomRight = new paper.Point(x + originx + bendDist, y + originy + controlChannelWidth / 2 - controlSpacing - 0.5 * radius); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 23 - topLeft = new paper.Point(x + originx + controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx + controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy); - bottomRight = new paper.Point(x + originx + controlSpacing + controlChannelWidth / 2, y + originy + 1.3 * radius); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * chemostatLength, y + originy + 1.3 * radius - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy + 1.3 * radius + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 24 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy + controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy + controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + bendDist, y + originy + controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx, y + originy + controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy + controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + bendDist + controlChannelWidth / 2, y + originy + 1.7 * radius); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * chemostatLength, y + originy + 1.7 * radius - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy + 1.7 * radius + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // bottom left - originx = chemostatChannelWidth / 2 + chemostatLength / 4; - originy = chemostatLength + chemostatChannelWidth / 2; - - // 25 - topLeft = new paper.Point(x + originx - 0.3 * controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx - 0.3 * controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - 0.3 * controlSpacing, y + originy); - bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 - 0.3 * controlSpacing, y + 2 * chemostatLength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 26 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy + controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy + controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx, y + originy + controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + 0.5 * controlSpacing, y + originy + controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 0.5 * controlSpacing - controlChannelWidth / 2, y + originy + controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + 0.5 * controlSpacing + controlChannelWidth / 2, y + 2 * chemostatLength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 27 - topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - controlChannelWidth / 2, y + originy); - bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + controlChannelWidth / 2, y + originy + bendDist); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - controlChannelWidth / 2, y + originy + bendDist - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + 0.4 * controlSpacing, y + originy + bendDist + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlChannelWidth / 2 + 0.4 * controlSpacing + 0.3 * controlSpacing, y + originy - controlChannelWidth / 2 + bendDist); - bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 + 0.4 * controlSpacing + 0.3 * controlSpacing, y + 2 * chemostatLength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // bottom middle - originx = chemostatChannelWidth / 2 + (3 * chemostatLength) / 7; - originy = chemostatLength + chemostatChannelWidth / 2; - - // 28 - topLeft = new paper.Point(x + originx - 0.3 * controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx - 0.3 * controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - 0.3 * controlSpacing, y + originy); - bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 - 0.3 * controlSpacing, y + 2 * chemostatLength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 29 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx, y + originy - controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx - 0.5 * controlSpacing, y + originy - controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - 0.5 * controlSpacing - controlChannelWidth / 2, y + originy - controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx - 0.5 * controlSpacing + controlChannelWidth / 2, y + 2 * chemostatLength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 30 - topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlChannelWidth / 2 + 0.3 * controlSpacing, y + originy); - bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 + 0.3 * controlSpacing, y + 2 * chemostatLength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 31 - topLeft = new paper.Point(x + originx + 0.55 * controlSpacing - valvewidth / 2, y + originy - valvelength); - bottomRight = new paper.Point(x + originx + 0.55 * controlSpacing + valvewidth / 2, y + originy + valvelength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 0.55 * controlSpacing - controlChannelWidth / 2, y + originy); - bottomRight = new paper.Point(x + originx + 0.55 * controlSpacing + controlChannelWidth / 2, y + 2 * chemostatLength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 32 - topLeft = new paper.Point(x + originx + 0.85 * controlSpacing - valvewidth / 2, y + originy - valvelength); - bottomRight = new paper.Point(x + originx + 0.85 * controlSpacing + valvewidth / 2, y + originy + valvelength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 0.85 * controlSpacing - controlChannelWidth / 2, y + originy); - bottomRight = new paper.Point(x + originx + 0.85 * controlSpacing + controlChannelWidth / 2, y + 2 * chemostatLength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 33 - topLeft = new paper.Point(x + originx + 1.15 * controlSpacing - valvewidth / 2, y + originy - valvelength); - bottomRight = new paper.Point(x + originx + 1.15 * controlSpacing + valvewidth / 2, y + originy + valvelength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 1.15 * controlSpacing - controlChannelWidth / 2, y + originy); - bottomRight = new paper.Point(x + originx + 1.15 * controlSpacing + controlChannelWidth / 2, y + 2 * chemostatLength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // bottom right - originx = chemostatChannelWidth / 2 + (3 * chemostatLength) / 5; - originy = chemostatLength + chemostatChannelWidth / 2; - - // 34 - topLeft = new paper.Point(x + originx - 0.3 * controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx - 0.3 * controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - 0.3 * controlSpacing, y + originy); - bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 - 0.3 * controlSpacing, y + 2 * chemostatLength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 35 - topLeft = new paper.Point(x + originx - valvelength / 2, y + originy + controlSpacing - valvewidth / 2); - bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy + controlSpacing + valvewidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx, y + originy + controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + 0.5 * controlSpacing, y + originy + controlSpacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 0.5 * controlSpacing - controlChannelWidth / 2, y + originy + controlSpacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + 0.5 * controlSpacing + controlChannelWidth / 2, y + 2 * chemostatLength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 36 - topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - valvewidth / 2, y + originy - valvelength / 2); - bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + valvewidth / 2, y + originy + valvelength / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - controlChannelWidth / 2, y + originy); - bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + controlChannelWidth / 2, y + originy + bendDist); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - controlChannelWidth / 2, y + originy + bendDist - controlChannelWidth / 2); - bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + 0.4 * controlSpacing, y + originy + bendDist + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + originx - controlChannelWidth / 2 + 0.4 * controlSpacing + 0.3 * controlSpacing, y + originy - controlChannelWidth / 2 + bendDist); - bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 + 0.4 * controlSpacing + 0.3 * controlSpacing, y + 2 * chemostatLength); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - control.rotate(rotation, new paper.Point(x, y)); - control.fillColor = color; - return control; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const serp = this.__drawFlow(params); - serp.addChild(this.__drawControl(params)); - - serp.fillColor!.alpha = 0.5; - return serp; - } -} diff --git a/src/app/library/circleValve.ts b/src/app/library/circleValve.ts deleted file mode 100644 index c9f63ca9..00000000 --- a/src/app/library/circleValve.ts +++ /dev/null @@ -1,99 +0,0 @@ -import Template from "./template"; -import paper from "paper"; - -export default class CircleValve extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - radius1: "Float", - radius2: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - radius1: 1.4 * 1000, - radius2: 1.2 * 1000, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - radius1: "μm", - radius2: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - radius1: 10, - radius2: 10, - height: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - radius1: 2000, - radius2: 2000, - height: 1200 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - radius1: "portRadius", - radius2: "radius2" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - radius1: "portRadius", - radius2: "radius2" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["CONTROL"]; - - this.__mint = "CIRCLE VALVE"; - - this.__zOffsetKeys = { - CONTROL: "height" - }; - - this.__substrateOffset = { - CONTROL: "+1" - }; - } - - render2D(params: { [k: string]: any }, key: string) { - const position = params.position; - const radius = params.portRadius; - const color1 = params.color; - const pos = new paper.Point(position[0], position[1]); - const outerCircle = new paper.Path.Circle(pos, radius); - outerCircle.fillColor = color1; - return outerCircle; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/connection.ts b/src/app/library/connection.ts deleted file mode 100644 index ecb1e89d..00000000 --- a/src/app/library/connection.ts +++ /dev/null @@ -1,137 +0,0 @@ -import Template from "./template"; -import paper from "paper"; - -export default class Connection extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - start: "Point", - end: "Point", - wayPoints: "PointArray", - segments: "SegmentArray" - }; - - this.__heritable = { - connectionSpacing: "Float", - channelWidth: "Float", - height: "Float" - }; - - this.__defaults = { - connectionSpacing: 1600, - channelWidth: 0.8 * 1000, - height: 250 - }; - - this.__units = { - connectionSpacing: "μm", - channelWidth: "μm", - height: "μm" - }; - - this.__minimum = { - connectionSpacing: 0, - channelWidth: 3, - height: 10 - }; - - this.__maximum = { - connectionSpacing: 10000, - channelWidth: 12000, - height: 1200 - }; - - this.__featureParams = { - connectionSpacing: "connectionSpacing", - start: "start", - end: "end", - wayPoints: "wayPoints", - channelWidth: "channelWidth", - segments: "segments", - height: "height" - }; - - this.__targetParams = { - connectionSpacing: "connectionSpacing", - wayPoints: "wayPoints", - channelWidth: "channelWidth", - segments: "segments", - height: "height" - }; - - this.__placementTool = "ConnectionTool"; - - this.__toolParams = { - start: "start", - end: "end" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "CHANNEL"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - render2D(params: { [k: string]: any }, key: string) { - const start = params.start; - const end = params.end; - const color = params.color; - const width = params.width; - const wayPoints = params.wayPoints; - const channelWidth = params.channelWidth; - const segments = params.segments; - const connectionpath = new paper.CompoundPath(""); - let startpoint, endpoint; - - let p1, p2; - - for (const i in segments) { - const segment = segments[i]; - p1 = segment[0]; - p2 = segment[1]; - startpoint = new paper.Point(p1[0], p1[1]); - endpoint = new paper.Point(p2[0], p2[1]); - this.__drawStraightConnection(connectionpath, startpoint, endpoint, channelWidth); - } - - connectionpath.fillColor = color; - return connectionpath; - } - - __drawStraightConnection(compoundpath: paper.CompoundPath, startpoint: paper.Point, endpoint: paper.Point, channelWidth: number): void { - // edit the points - const vec = endpoint.subtract(startpoint); - const rec = new paper.Path.Rectangle({ - point: startpoint, - radius: channelWidth / 2, - size: [vec.length + channelWidth, channelWidth] - }); - rec.translate(([-channelWidth / 2, -channelWidth / 2] as unknown) as paper.Point); - rec.rotate(vec.angle, startpoint); - - compoundpath.addChild(rec); - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const thickness = params.channelWidth / 5; - const length = params.channelWidth; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - let chair = new paper.Path.Rectangle(new paper.Rectangle(x - length / 2, y - thickness / 2, length, thickness)); - let chairtarget = chair.unite(new paper.Path.Rectangle(new paper.Rectangle(x - thickness / 2, y - length / 2, thickness, length))); - chairtarget.fillColor = color; - chairtarget.fillColor!.alpha = 0.5; - return chairtarget; - } -} diff --git a/src/app/library/curvedMixer.ts b/src/app/library/curvedMixer.ts deleted file mode 100755 index b9036a53..00000000 --- a/src/app/library/curvedMixer.ts +++ /dev/null @@ -1,201 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class CurvedMixer extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - bendSpacing: "Float", - numberOfBends: "Float", - channelWidth: "Float", - bendLength: "Float", - rotation: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - channelWidth: 0.8 * 1000, - bendSpacing: 1.23 * 1000, - numberOfBends: 1, - bendLength: 2.46 * 1000, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - bendSpacing: "μm", - numberOfBends: "", - channelWidth: "μm", - bendLength: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - rotation: 0, - channelWidth: 10, - bendSpacing: 10, - numberOfBends: 1, - bendLength: 10, - height: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - rotation: 360, - channelWidth: 2000, - bendSpacing: 6000, - numberOfBends: 20, - bendLength: 12 * 1000, - height: 1200 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - channelWidth: "channelWidth", - bendSpacing: "bendSpacing", - numberOfBends: "numberOfBends", - rotation: "rotation", - bendLength: "bendLength" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - channelWidth: "channelWidth", - bendSpacing: "bendSpacing", - numberOfBends: "numberOfBends", - rotation: "rotation", - bendLength: "bendLength" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "CURVED MIXER"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const channelWidth = params.channelWidth; - const bendLength = params.bendLength; - const bendSpacing = params.bendSpacing; - const numberOfBends = params.numberOfBends; - - const ports = []; - - ports.push(new ComponentPort(bendLength / 2 + channelWidth, 0, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(bendLength / 2 + channelWidth, (2 * numberOfBends + 1) * channelWidth + 2 * numberOfBends * bendSpacing, "2", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - const channelWidth = params.channelWidth; - const bendLength = params.bendLength; - const bendSpacing = params.bendSpacing; - const rotation = params.rotation; - const numBends = params.numberOfBends; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const segHalf = bendLength / 2 + channelWidth; - const segLength = bendLength + 2 * channelWidth; - const segBend = bendSpacing + 2 * channelWidth; - const vRepeat = 2 * bendSpacing + 2 * channelWidth; - const vOffset = bendSpacing + channelWidth; - const hOffset = bendLength / 2 + channelWidth / 2; - const serp = new paper.CompoundPath(""); - - // draw first segment - let toprect: paper.Rectangle | paper.PathItem = new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth - 1, y, bendLength / 2 + channelWidth / 2 + 1, channelWidth)); - (toprect as any).closed = true; - for (let i = 0; i < numBends; i++) { - // draw left curved segment - let leftCurve: paper.Path.Arc | paper.PathItem = new paper.Path.Arc({ - from: [x + channelWidth, y + vRepeat * i], - through: [x + channelWidth - (channelWidth + bendSpacing / 2), y + vRepeat * i + bendSpacing / 2 + channelWidth], - to: [x + channelWidth, y + vRepeat * i + bendSpacing + 2 * channelWidth] - }); - (leftCurve as any).closed = true; - const leftCurveSmall = new paper.Path.Arc({ - from: [x + channelWidth, y + vRepeat * i + bendSpacing + channelWidth], - through: [x + channelWidth - bendSpacing / 2, y + vRepeat * i + bendSpacing / 2 + channelWidth], - to: [x + channelWidth, y + vRepeat * i + channelWidth] - }); - leftCurveSmall.closed = true; - leftCurve = leftCurve.subtract(leftCurveSmall); - toprect = toprect.unite(leftCurve); - // serp.addChild(leftCurve); - // draw horizontal segment - let hseg = new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth - 1, y + vOffset + vRepeat * i, bendLength + 2, channelWidth)); - toprect = toprect.unite(hseg); - // draw right curved segment - let rightCurve: paper.Path.Arc | paper.PathItem = new paper.Path.Arc({ - from: [x + channelWidth + bendLength, y + vOffset + vRepeat * i], - through: [x + channelWidth + bendLength + (channelWidth + bendSpacing / 2), y + vOffset + vRepeat * i + bendSpacing / 2 + channelWidth], - to: [x + channelWidth + bendLength, y + vOffset + vRepeat * i + bendSpacing + 2 * channelWidth] - }); - (rightCurve as any).closed = true; - const rightCurveSmall = new paper.Path.Arc({ - from: [x + channelWidth + bendLength, y + vOffset + vRepeat * i + bendSpacing + channelWidth], - through: [x + channelWidth + bendLength + bendSpacing / 2, y + vOffset + vRepeat * i + bendSpacing / 2 + channelWidth], - to: [x + channelWidth + bendLength, y + vOffset + vRepeat * i + channelWidth] - }); - rightCurveSmall.closed = true; - rightCurve = rightCurve.subtract(rightCurveSmall); - toprect = toprect.unite(rightCurve); - - if (i === numBends - 1) { - // draw half segment to close - hseg = new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth / 2 + bendLength / 2, y + vRepeat * (i + 1), (bendLength + channelWidth) / 2 + 1, channelWidth)); - toprect = toprect.unite(hseg); - } else { - // draw full segment - hseg = new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth - 1, y + vRepeat * (i + 1), bendLength + 2, channelWidth)); - toprect = toprect.unite(hseg); - } - toprect = toprect.unite(hseg); - } - serp.addChild(toprect); - - serp.fillColor = color; - serp.rotate(rotation, new paper.Point(x, y)); - return serp; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/diamondReactionChamber.ts b/src/app/library/diamondReactionChamber.ts deleted file mode 100755 index 2c087f4b..00000000 --- a/src/app/library/diamondReactionChamber.ts +++ /dev/null @@ -1,149 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class DiamondReactionChamber extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - channelWidth: "Float", - length: "Float", - width: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - channelWidth: 0.8 * 1000, - width: 1.23 * 1000, - length: 4.92 * 1000, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - channelWidth: "μm", - length: "μm", - width: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - channelWidth: 10, - width: 30, - length: 120, - height: 10, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - channelWidth: 2000, - width: 6000, - length: 24 * 1000, - height: 1200, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - channelWidth: "channelWidth", - length: "length", - width: "width" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - channelWidth: "channelWidth", - length: "length", - width: "width", - rotation: "rotation" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "DIAMOND REACTION CHAMBER"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const channelWidth = params.channelWidth; - const l = params.length; - const w = params.width; - - const ports = []; - - ports.push(new ComponentPort(-l / 2, 0, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(l / 2, 0, "2", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - const position = params.position; - const px = position[0]; - const py = position[1]; - const cw = params.channelWidth; - const l = params.length; - const w = params.width; - const rotation = params.rotation; - console.log("Rotation", rotation); - const color = params.color; - let p0, p1, p2, p3, p4, p5; - p0 = [px - l / 2, py - cw / 2]; - p1 = [px - l / 2, py + cw / 2]; - p2 = [px, py + w + cw / 2]; - p3 = [px + l / 2, py + cw / 2]; - p4 = [px + l / 2, py - cw / 2]; - p5 = [px, py - cw / 2 - w]; - const hex = new paper.Path(); - hex.add(new paper.Point(p0)); - hex.add(new paper.Point(p1)); - hex.add(new paper.Point(p2)); - hex.add(new paper.Point(p3)); - hex.add(new paper.Point(p4)); - hex.add(new paper.Point(p5)); - hex.closed = true; - hex.rotate(rotation, new paper.Point(px, py)); - hex.fillColor = color; - return hex; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/dogboneInsert.ts b/src/app/library/dogboneInsert.ts deleted file mode 100644 index 274d21fb..00000000 --- a/src/app/library/dogboneInsert.ts +++ /dev/null @@ -1,191 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class DogboneInsert extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - length: "Float", - innerRadius: "Float", - outerRadius: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - innerRadius: 400, - outerRadius: 800, - length: 7200, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - length: "μm", - innerRadius: "μm", - outerRadius: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - innerRadius: 1, - outerRadius: 1, - length: 120, - height: 10, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - innerRadius: 1000, - outerRadius: 1000, - length: 24 * 1000, - height: 1200, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - length: "length", - innerRadius: "innerRadius", - outerRadius: "outerRadius", - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - length: "length", - innerRadius: "innerRadius", - outerRadius: "outerRadius", - rotation: "rotation" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "DOGBONE INSERT"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const l = params.length; - - const ports = []; - - ports.push(new ComponentPort(-l / 2, 0, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(l / 2, 0, "2", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string): paper.CompoundPath { - const position = params.position; - const px = position[0]; - const py = position[1]; - const length = params.length; - const innerRadius = params.innerRadius; - const outerRadius = params.outerRadius; - const rotation = params.rotation; - const color = params.color; - - const fulllength = length + innerRadius * 2 + outerRadius * 2; - const width = innerRadius * 2 + outerRadius * 4; - - const serp: paper.CompoundPath = new paper.CompoundPath([]); - - let insert = new paper.PathItem; - - // Produce rectangle - const rect2 = new paper.Path.Rectangle(new paper.Point(px - fulllength / 2 + outerRadius, py - width / 2), new paper.Size(fulllength - 2 * outerRadius, width)); - - // Add half circles to ends - // Left side - let curve: paper.Path.Arc | paper.PathItem = new paper.Path.Arc({ - from: [px - fulllength / 2 + outerRadius, py + width / 2], - through: [px - fulllength / 2, py + width / 2 - outerRadius], - to: [px - fulllength / 2 + outerRadius, py + innerRadius] - }); - (curve as any).closed = true; - insert = rect2.unite(curve); - curve = new paper.Path.Arc({ - from: [px - fulllength / 2 + outerRadius, py - width / 2], - through: [px - fulllength / 2, py - width / 2 + outerRadius], - to: [px - fulllength / 2 + outerRadius, py - innerRadius] - }); - (curve as any).closed = true; - insert = insert.unite(curve); - //Right side - curve = new paper.Path.Arc({ - from: [px + fulllength / 2 - outerRadius, py + width / 2], - through: [px + fulllength / 2, py + width / 2 - outerRadius], - to: [px + fulllength / 2 - outerRadius, py + innerRadius] - }); - (curve as any).closed = true; - insert = insert.unite(curve); - curve = new paper.Path.Arc({ - from: [px + fulllength / 2 - outerRadius, py - width / 2], - through: [px + fulllength / 2, py - width / 2 + outerRadius], - to: [px + fulllength / 2 - outerRadius, py - innerRadius] - }); - (curve as any).closed = true; - insert = insert.unite(curve); - - // Subtract half circles - curve = new paper.Path.Arc({ - from: [px - fulllength / 2 + outerRadius, py + innerRadius], - through: [px - fulllength / 2 + innerRadius + outerRadius, py], - to: [px - fulllength / 2 + outerRadius, py - innerRadius] - }); - (curve as any).closed = true; - insert = insert.subtract(curve); - curve = new paper.Path.Arc({ - from: [px + fulllength / 2 - outerRadius, py + innerRadius], - through: [px + fulllength / 2 - innerRadius - outerRadius, py], - to: [px + fulllength / 2 - outerRadius, py - innerRadius] - }); - (curve as any).closed = true; - insert = insert.subtract(curve); - - serp.addChild(insert); - serp.fillColor = color; - serp.rotate(rotation, new paper.Point(px, py)); - return serp; - } - - render2DTarget(key: string | null, params: { [k: string]: any }): paper.CompoundPath { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/dropletGenerator.ts b/src/app/library/dropletGenerator.ts deleted file mode 100644 index 018e4e03..00000000 --- a/src/app/library/dropletGenerator.ts +++ /dev/null @@ -1,213 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class DropletGenerator extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - orificeSize: "Float", - orificeLength: "Float", - oilInputWidth: "Float", - waterInputWidth: "Float", - outputWidth: "Float", - outputLength: "Float", - height: "Float", - rotation: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - orificeSize: 0.2 * 1000, - orificeLength: 0.4 * 1000, - oilInputWidth: 0.8 * 1000, - waterInputWidth: 0.6 * 1000, - outputWidth: 0.6 * 1000, - outputLength: 0.6 * 1000, - height: 250, - rotation: 0 - }; - - this.__units = { - componentSpacing: "μm", - orificeSize: "μm", - height: "μm", - orificeLength: "μm", - oilInputWidth: "μm", - waterInputWidth: "μm", - outputWidth: "μm", - outputLength: "μm", - rotation: "°" - }; - - this.__minimum = { - componentSpacing: 0, - orificeSize: 10, - orificeLength: 10, - oilInputWidth: 10, - waterInputWidth: 10, - outputWidth: 10, - outputLength: 10, - height: 10, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - orificeSize: 2000, - orificeLength: 2000, - oilInputWidth: 2000, - waterInputWidth: 2000, - outputWidth: 2000, - outputLength: 2000, - height: 1200, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - orificeSize: "orificeSize", - orificeLength: "orificeLength", - oilInputWidth: "oilInputWidth", - waterInputWidth: "waterInputWidth", - outputWidth: "outputWidth", - outputLength: "outputLength", - height: "height", - rotation: "rotation" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - orificeSize: "orificeSize", - orificeLength: "orificeLength", - oilInputWidth: "oilInputWidth", - waterInputWidth: "waterInputWidth", - outputWidth: "outputWidth", - outputLength: "outputLength", - height: "height", - rotation: "rotation" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "NOZZLE DROPLET GENERATOR"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const orificeSize = params.orificeSize; - const orificeLength = params.orificeLength; - const oilInputWidth = params.oilInputWidth; - const waterInputWidth = params.waterInputWidth; - const outputWidth = params.outputWidth; - const outputLength = params.outputLength; - - const ports = []; - - // Oil Top - ports.push(new ComponentPort(oilInputWidth / 2, -waterInputWidth / 2, "1", LogicalLayerType.FLOW)); - - // Out - ports.push(new ComponentPort(oilInputWidth + orificeLength + outputLength, 0, "2", LogicalLayerType.FLOW)); - - // Oil Bottom - ports.push(new ComponentPort(oilInputWidth / 2, waterInputWidth / 2, "3", LogicalLayerType.FLOW)); - - // Input - ports.push(new ComponentPort(0, 0, "4", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key = "FLOW") { - const pos = params.position; - const x = pos[0]; - const y = pos[1]; - const color = params.color; - const orificeSize = params.orificeSize; - const orificeLength = params.orificeLength; - const oilInputWidth = params.oilInputWidth; - const waterInputWidth = params.waterInputWidth; - const outputWidth = params.outputWidth; - const outputLength = params.outputLength; - const rotation = params.rotation; - - const ret = new paper.Path(); - - const p1 = new paper.Point(x, y - waterInputWidth / 2); - - const p2 = new paper.Point(p1.x + oilInputWidth, p1.y); - - const p3 = new paper.Point(p2.x, p2.y + (waterInputWidth / 2 - orificeSize / 2)); - - const p4 = new paper.Point(p3.x + orificeLength, p3.y); - - const p5 = new paper.Point(p4.x, p4.y - (outputWidth / 2 - orificeSize / 2)); - - const p6 = new paper.Point(p5.x + outputLength, p5.y); - - const p7 = new paper.Point(p6.x, p6.y + outputWidth); - - const p8 = new paper.Point(p7.x - outputLength, p7.y); - - const p9 = new paper.Point(p8.x, p8.y - (outputWidth / 2 - orificeSize / 2)); - - const p10 = new paper.Point(p9.x - orificeLength, p9.y); - - const p11 = new paper.Point(p10.x, p10.y + (waterInputWidth / 2 - orificeSize / 2)); - - const p12 = new paper.Point(p11.x - oilInputWidth, p11.y); - - ret.add(p1); - ret.add(p2); - ret.add(p3); - ret.add(p4); - ret.add(p5); - ret.add(p6); - ret.add(p7); - ret.add(p8); - ret.add(p9); - ret.add(p10); - ret.add(p11); - ret.add(p12); - - // Rotate the geometry - ret.rotate(rotation, new paper.Point(pos[0], pos[1])); - - ret.closed = true; - ret.fillColor = color; - return ret; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/dropletGeneratorFlowFocus.ts b/src/app/library/dropletGeneratorFlowFocus.ts deleted file mode 100755 index e8b6d7ae..00000000 --- a/src/app/library/dropletGeneratorFlowFocus.ts +++ /dev/null @@ -1,211 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class DropletGeneratorFlowFocus extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - oilChannelWidth: "Float", - waterChannelWidth: "Float", - length: "Float", - radius: "Float", - angle: "Float", - height: "Float", - rotation: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - oilChannelWidth: 0.4 * 1000, - waterChannelWidth: 0.2 * 1000, - length: 3 * 1000, - radius: 500, - angle: 45, - height: 250, - rotation: 0 - }; - - this.__units = { - componentSpacing: "μm", - oilChannelWidth: "μm", - height: "μm", - waterChannelWidth: "μm", - radius: "μm", - length: "μm", - rotation: "°", - angle: "°" - }; - - this.__minimum = { - componentSpacing: 0, - oilChannelWidth: 1, - waterChannelWidth: 1, - length: 1, - radius: 1, - angle: 1, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - oilChannelWidth: 2000, - waterChannelWidth: 2000, - length: 20000, - angle: 360, - height: 1200, - radius: 2000, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - oilChannelWidth: "oilChannelWidth", - waterChannelWidth: "waterChannelWidth", - length: "length", - angle: "angle", - height: "height", - rotation: "rotation", - radius: "radius" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - oilChannelWidth: "oilChannelWidth", - waterChannelWidth: "waterChannelWidth", - length: "length", - angle: "angle", - height: "height", - rotation: "rotation", - radius: "radius" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "DROPLET GENERATOR FLOW FOCUS"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const ports = []; - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - - // Out - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - const pos = params.position; - const x = pos[0]; - const y = pos[1]; - const color = params.color; - const oilChannelWidth = params.oilChannelWidth; - const waterChannelWidth = params.waterChannelWidth; - const length = params.length; - const angle = params.angle; - const radius = params.radius; - const rotation = params.rotation; - - const ret = new paper.CompoundPath(""); - - // middle path - let topLeft = new paper.Point(x - length / 3 - 2 * length, y - waterChannelWidth / 2); - let bottomRight = new paper.Point(x, y + waterChannelWidth / 2); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - let circ = new paper.Path.Circle(new paper.Point(x - length / 3 - 2 * length, y), radius); - - ret.addChild(circ); - // top tilt path - const Hlength = length / Math.cos((angle * Math.PI) / 180); - - topLeft = new paper.Point(x - length / 3 - Hlength, y - oilChannelWidth / 2); - bottomRight = new paper.Point(x - length / 3, y + oilChannelWidth / 2); - - let tiltBlock = new paper.Path.Rectangle(topLeft, bottomRight); - tiltBlock.rotate(angle, new paper.Point(x - length / 3, y)); - - ret.addChild(tiltBlock); - - // bottom tilt path - tiltBlock = new paper.Path.Rectangle(topLeft, bottomRight); - tiltBlock.rotate(-angle, new paper.Point(x - length / 3, y)); - - ret.addChild(tiltBlock); - - // top part - const disFromMid = Hlength * Math.sin((angle * Math.PI) / 180); - const angleS = 90 - angle; - const seamCover = (oilChannelWidth / 2) * Math.tan((angleS * Math.PI) / 180); - - topLeft = new paper.Point(x - length / 3 - length - oilChannelWidth / 2, y - disFromMid - (2 * length) / 3 + seamCover); - bottomRight = new paper.Point(x - length / 3 - length + oilChannelWidth / 2, y - disFromMid + seamCover); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x - length / 3 - 2 * length, y - disFromMid - (2 * length) / 3 + seamCover); - bottomRight = new paper.Point(x - length / 3 - length - oilChannelWidth / 2, y - disFromMid - (2 * length) / 3 + oilChannelWidth + seamCover); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - circ = new paper.Path.Circle(new paper.Point(x - length / 3 - 2 * length, y - disFromMid - (2 * length) / 3 + seamCover + oilChannelWidth / 2), radius); - - ret.addChild(circ); - - // bottom part - topLeft = new paper.Point(x - length / 3 - length - oilChannelWidth / 2, y + disFromMid + (2 * length) / 3 - seamCover); - bottomRight = new paper.Point(x - length / 3 - length + oilChannelWidth / 2, y + disFromMid - seamCover); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x - length / 3 - 2 * length, y + disFromMid + (2 * length) / 3 - seamCover); - bottomRight = new paper.Point(x - length / 3 - length - oilChannelWidth / 2, y + disFromMid + (2 * length) / 3 - oilChannelWidth - seamCover); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - circ = new paper.Path.Circle(new paper.Point(x - length / 3 - 2 * length, y + disFromMid + (2 * length) / 3 - seamCover - oilChannelWidth / 2), radius); - - ret.addChild(circ); - - // Rotate the geometry - ret.rotate(rotation, new paper.Point(pos[0], pos[1])); - - ret.closed = true; - ret.fillColor = color; - return ret; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/dropletGeneratorT.ts b/src/app/library/dropletGeneratorT.ts deleted file mode 100755 index d72ca6bd..00000000 --- a/src/app/library/dropletGeneratorT.ts +++ /dev/null @@ -1,164 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class DropletGeneratorT extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - oilChannelWidth: "Float", - waterChannelWidth: "Float", - length: "Float", - radius: "Float", - // angle: "Float", - height: "Float", - rotation: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - oilChannelWidth: 0.6 * 1000, - waterChannelWidth: 0.3 * 1000, - length: 5 * 1000, - radius: 500, - height: 250, - rotation: 0 - }; - - this.__units = { - componentSpacing: "μm", - oilChannelWidth: "μm", - height: "μm", - waterChannelWidth: "μm", - radius: "μm", - rotation: "°", - length: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - oilChannelWidth: 1, - waterChannelWidth: 1, - radius: 1, - rotation: 0, - length: 0 * 1000 - }; - - this.__maximum = { - componentSpacing: 10000, - oilChannelWidth: 2000, - waterChannelWidth: 2000, - height: 1200, - radius: 2000, - rotation: 360, - length: 8 * 1000 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - oilChannelWidth: "oilChannelWidth", - waterChannelWidth: "waterChannelWidth", - height: "height", - rotation: "rotation", - radius: "radius", - length: "length" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - oilChannelWidth: "oilChannelWidth", - waterChannelWidth: "waterChannelWidth", - height: "height", - rotation: "rotation", - radius: "radius", - length: "length" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "DROPLET GENERATOR T"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const length = params.length; - - const ports = []; - - ports.push(new ComponentPort(length / 2, 0, "1", LogicalLayerType.FLOW)); - - // Out - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - const pos = params.position; - const x = pos[0]; - const y = pos[1]; - const color = params.color; - const oilChannelWidth = params.oilChannelWidth; - const waterChannelWidth = params.waterChannelWidth; - const radius = params.radius; - const rotation = params.rotation; - const length = params.length; - - const ret = new paper.CompoundPath(""); - - let topLeft = new paper.Point(x - length / 2, y - oilChannelWidth / 2); - let bottomRight = new paper.Point(x + length / 2, y + oilChannelWidth / 2); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - let circ = new paper.Path.Circle(new paper.Point(x - length / 2, y), radius); - - ret.addChild(circ); - - topLeft = new paper.Point(x - waterChannelWidth / 2, y); - bottomRight = new paper.Point(x + waterChannelWidth / 2, y + length / 2); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - circ = new paper.Path.Circle(new paper.Point(x, y + length / 2), radius); - - ret.addChild(circ); - - // Rotate the geometry - ret.closed = true; - ret.rotate(rotation, new paper.Point(x, y)); - ret.fillColor = color; - - return ret; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/dropletMerger.ts b/src/app/library/dropletMerger.ts deleted file mode 100644 index 46ac1a98..00000000 --- a/src/app/library/dropletMerger.ts +++ /dev/null @@ -1,164 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class DropletMerger extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - inputWidth1: "Float", - inputWidth2: "Float", - outputWidth: "Float", - stabilizationLength: "Float", - rotation: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - inputWidth1: 400, - inputWidth2: 400, - outputWidth: 400, - stabilizationLength: 5000, - rotation: 0, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - inputWidth1: "μm", - inputWidth2: "μm", - outputWidth: "μm", - stabilizationLength: "μm", - rotation: "°", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - inputWidth1: 1, - inputWidth2: 1, - outputWidth: 1, - stabilizationLength: 10, - rotation: 0, - height: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - inputWidth1: 10000, - inputWidth2: 10000, - outputWidth: 10000, - stabilizationLength: 500000, - rotation: 360, - height: 10000 - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - cursorPosition: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - inputWidth1: "inputWidth1", - inputWidth2: "inputWidth2", - outputWidth: "outputWidth", - stabilizationLength: "stabilizationLength", - rotation: "rotation;", - height: "height" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - inputWidth1: "inputWidth1", - inputWidth2: "inputWidth2", - outputWidth: "outputWidth", - stabilizationLength: "stabilizationLength", - rotation: "rotation;" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "DROPLET MERGER"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const channelWidth = params.channelWidth; - const bendLength = params.bendLength; - const bendSpacing = params.bendSpacing; - const rotation = params.rotation; - const numberOfBends = params.numberOfBends; - - const ports = []; - - ports.push(new ComponentPort(bendLength / 2 + channelWidth, 0, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(bendLength / 2 + channelWidth, (2 * numberOfBends + 1) * channelWidth + 2 * numberOfBends * bendSpacing, "2", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string): paper.CompoundPath { - const channelWidth = params.channelWidth; - const bendLength = params.bendLength; - const bendSpacing = params.bendSpacing; - const rotation = params.rotation; - const numBends = params.numberOfBends; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const segHalf = bendLength / 2 + channelWidth; - const segLength = bendLength + 2 * channelWidth; - const segBend = bendSpacing + 2 * channelWidth; - const vRepeat = 2 * bendSpacing + 2 * channelWidth; - const vOffset = bendSpacing + channelWidth; - const hOffset = bendLength / 2 + channelWidth / 2; - const serp = new paper.CompoundPath(""); - // draw first segment - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y, segHalf + channelWidth / 2, channelWidth))); - for (let i = 0; i < numBends; i++) { - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * i, channelWidth, segBend))); - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vOffset + vRepeat * i, segLength, channelWidth))); - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth + bendLength, y + vOffset + vRepeat * i, channelWidth, segBend))); - if (i === numBends - 1) { - // draw half segment to close - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + hOffset, y + vRepeat * (i + 1), segHalf, channelWidth))); - } else { - // draw full segment - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * (i + 1), segLength, channelWidth))); - } - } - - serp.fillColor = color; - return (serp.rotate(rotation, new paper.Point(x, y)) as unknown) as paper.CompoundPath; - } - - render2DTarget(key: string | null, params: { [k: string]: any }): paper.CompoundPath { - if (key === null) { - key = this.__renderKeys[0]; - } - const serp = this.render2D(params, key); - serp.fillColor!.alpha = 0.5; - return serp; - } -} diff --git a/src/app/library/filter.ts b/src/app/library/filter.ts deleted file mode 100644 index 29a26369..00000000 --- a/src/app/library/filter.ts +++ /dev/null @@ -1,294 +0,0 @@ -import Template from "./template"; -import paper, { Path } from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Filter extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - height: "Float", - pillarDiameter: "Float", - filterWidth: "Float", - barrierWidth: "Float", - filterLength: "Float", - filterNumber: "Float", - levelNumber: "Float", - inletWidth: "Float", - inletLength: "Float", - outletWidth: "Float", - outletLength: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - height: 250, - pillarDiameter: 2 * 1000, - filterWidth: 1 * 1000, - barrierWidth: 1 * 1000, - filterLength: 3 * 1000, - filterNumber: 5, - levelNumber: 2, - inletWidth: 1 * 1000, - inletLength: 3 * 1000, - outletWidth: 1 * 1000, - outletLength: 3 * 1000 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - height: "μm", - pillarDiameter: "μm", - filterWidth: "μm", - barrierWidth: "μm", - filterLength: "μm", - filterNumber: "", - levelNumber: "", - inletWidth: "μm", - inletLength: "μm", - outletWidth: "μm", - outletLength: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - rotation: 0, - height: 10, - pillarDiameter: 1 * 1000, - filterWidth: 0.5 * 1000, - barrierWidth: 0.5 * 1000, - filterLength: 2 * 1000, - filterNumber: 2, - levelNumber: 1, - inletWidth: 0.5 * 1000, - inletLength: 1 * 1000, - outletWidth: 0.5 * 1000, - outletLength: 1 * 1000 - }; - - this.__maximum = { - componentSpacing: 10000, - rotation: 360, - height: 1200, - pillarDiameter: 4 * 1000, - filterWidth: 4 * 1000, - barrierWidth: 6 * 1000, - filterLength: 9 * 1000, - filterNumber: 5, - levelNumber: 10, - inletWidth: 4 * 1000, - inletLength: 8 * 1000, - outletWidth: 4 * 1000, - outletLength: 8 * 1000 - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - cursorPosition: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - pillarDiameter: "pillarDiameter", - filterWidth: "filterWidth", - barrierWidth: "barrierWidth", - filterLength: "filterLength", - filterNumber: "filterNumber", - levelNumber: "levelNumber", - inletWidth: "inletWidth", - inletLength: "inletLength", - outletWidth: "outletWidth", - outletLength: "outletLength" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - rotation: "rotation", - pillarDiameter: "pillarDiameter", - filterWidth: "filterWidth", - barrierWidth: "barrierWidth", - filterLength: "filterLength", - filterNumber: "filterNumber", - levelNumber: "levelNumber", - inletWidth: "inletWidth", - inletLength: "inletLength", - outletWidth: "outletWidth", - outletLength: "outletLength" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "FILTER"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const inletLength = params.inletLength; - const filterLength = params.filterLength; - const outletLength = params.outletLength; - const levelNumber = params.levelNumber; - const pillarDiameter = params.pillarDiameter; - - const ports = []; - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(inletLength + 5 * pillarDiameter + 1.3 * levelNumber * filterLength + outletLength, 0, "2", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - const rotation = params.rotation; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const pillarDiameter = params.pillarDiameter; - const filterWidth = params.filterWidth; - const barrierWidth = params.barrierWidth; - const filterLength = params.filterLength; - const filterNumber = params.filterNumber; - const levelNumber = params.levelNumber; - const inletWidth = params.inletWidth; - const inletLength = params.inletLength; - const outletWidth = params.outletWidth; - const outletLength = params.outletLength; - - const serp = new paper.CompoundPath(""); - - const bodyWidth = filterNumber * filterWidth + (filterNumber - 1) * barrierWidth; - - // inlet - let topLeft = new paper.Point(x, y - inletWidth / 2); - let bottomRight = new paper.Point(x + inletLength, y + inletWidth / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // left pillar - topLeft = new paper.Point(x + inletLength, y - inletWidth / 2); - let topRight = new paper.Point(x + inletLength + 2.5 * pillarDiameter, y - bodyWidth / 2); - let bottomLeft = new paper.Point(x + inletLength, y + inletWidth / 2); - bottomRight = new paper.Point(x + inletLength + 2.5 * pillarDiameter, y + bodyWidth / 2); - - let pillarPath: paper.Path | paper.PathItem = new paper.Path(); - (pillarPath as paper.Path).add(topLeft); - (pillarPath as paper.Path).add(topRight); - (pillarPath as paper.Path).add(bottomRight); - (pillarPath as paper.Path).add(bottomLeft); - - let circ = new paper.Path.Circle(new paper.Point(x + inletLength + 1.5 * pillarDiameter, y), pillarDiameter / 2); - - pillarPath = pillarPath.subtract(circ); - - serp.addChild(pillarPath); - - // body tube - let startBody = inletLength + 2.5 * pillarDiameter; - const extraSpace = 0.3 * filterLength; - - for (let i = 0; i < levelNumber; i++) { - topLeft = new paper.Point(x + startBody, y - bodyWidth / 2); - bottomRight = new paper.Point(x + startBody + filterLength + extraSpace, y + bodyWidth / 2); - - let rec: paper.PathItem | paper.Rectangle = new paper.Path.Rectangle(topLeft, bottomRight); - - if (i % 2 === 0) { - const division = (bodyWidth - (filterNumber - 1) * barrierWidth) / filterNumber; - let heightAccum = division; - - for (let j = 0; j < filterNumber - 1; j++) { - topLeft = new paper.Point(x + startBody + extraSpace / 2, y - bodyWidth / 2 + heightAccum); - heightAccum += barrierWidth; - bottomRight = new paper.Point(x + startBody + filterLength, y - bodyWidth / 2 + heightAccum); - - const cutrec = new paper.Path.Rectangle(topLeft, bottomRight); - - rec = rec.subtract(cutrec); - - heightAccum += division; - } - } else { - const division = (bodyWidth - (filterNumber - 2) * barrierWidth) / (filterNumber - 1); - let heightAccum = division; - - for (let j = 0; j < filterNumber - 2; j++) { - topLeft = new paper.Point(x + startBody + extraSpace / 2, y - bodyWidth / 2 + heightAccum); - heightAccum += barrierWidth; - bottomRight = new paper.Point(x + startBody + filterLength, y - bodyWidth / 2 + heightAccum); - - const cutrec = new paper.Path.Rectangle(topLeft, bottomRight); - - rec = rec.subtract(cutrec); - - heightAccum += division; - } - } - - serp.addChild(rec); - - startBody += filterLength + extraSpace; - } - - // right pillar - topLeft = new paper.Point(x + startBody, y - bodyWidth / 2); - topRight = new paper.Point(x + startBody + 2.5 * pillarDiameter, y - outletWidth / 2); - bottomRight = new paper.Point(x + startBody + 2.5 * pillarDiameter, y + outletWidth / 2); - bottomLeft = new paper.Point(x + startBody, y + bodyWidth / 2); - - pillarPath = new paper.Path(); - - (pillarPath as paper.Path).add(topLeft); - (pillarPath as paper.Path).add(topRight); - (pillarPath as paper.Path).add(bottomRight); - (pillarPath as paper.Path).add(bottomLeft); - - startBody += 2.5 * pillarDiameter; - - circ = new paper.Path.Circle(new paper.Point(x + startBody - 1.5 * pillarDiameter, y), pillarDiameter / 2); - - pillarPath = pillarPath.subtract(circ); - - serp.addChild(pillarPath); - - // outlet - topLeft = new paper.Point(x + startBody, y - outletWidth / 2); - bottomRight = new paper.Point(x + startBody + outletLength, y + outletWidth / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - serp.rotate(rotation, new paper.Point(x, y)); - - serp.fillColor = color; - return serp; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const serp = this.render2D(params, key); - serp.fillColor!.alpha = 0.5; - return serp; - } -} diff --git a/src/app/library/gelchannel.ts b/src/app/library/gelchannel.ts deleted file mode 100644 index 46503202..00000000 --- a/src/app/library/gelchannel.ts +++ /dev/null @@ -1,201 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Gelchannel extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - sideWidth: "Float", - mainWidth: "Float", - rotation: "Float", - length: "Float", - height: "Float", - sideheight: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - sideWidth: 200, - mainWidth: 500, - rotation: 0, - length: 3000, - height: 250, - sideheight: 50 - }; - - this.__units = { - componentSpacing: "μm", - sideWidth: "μm", - mainWidth: "μm", - rotation: "°", - length: "μm", - height: "μm", - sideheight: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - sideWidth: 20, - mainWidth: 10, - length: 1000, - height: 10, - sideheight: 10, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - sideWidth: 500, - mainWidth: 500, - length: 100 * 1000, - height: 1200, - sideheight: 1200, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - length: "length", - sideWidth: "sideWidth", - mainWidth: "mainWidth", - height: "height", - sideheight: "sideheight" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - rotation: "rotation", - length: "length", - sideWidth: "sideWidth", - mainWidth: "mainWidth", - height: "height", - sideheight: "sideheight" - }; - - this.__placementTool = "CellPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW", "CELL"]; - - this.__mint = "GEL CHANNEL"; - - this.__zOffsetKeys = { - FLOW: "height", - CELL: "sideHeight" - }; - - this.__substrateOffset = { - FLOW: "0", - CELL: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const ports = []; - const sideWidth = params.sideWidth; - const numChambers = 2; - const length = params.length; - const mainWidth = params.mainWidth; - - ports.push(new ComponentPort(0, sideWidth + mainWidth / 2, "1", LogicalLayerType.FLOW)); - ports.push(new ComponentPort((numChambers / 2) * (length + 60) + 60, sideWidth + mainWidth / 2, "2", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - if (key === "FLOW") { - return this.__drawFlow(params); - } else if (key === "CELL") { - return this.__drawCell(params); - } - - throw new Error("Unknown key: " + key); - - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const traps = this.__drawFlow(params); - traps.addChild(this.__drawCell(params)); - traps.fillColor!.alpha = 0.5; - return traps; - } - - __drawFlow(params: { [k: string]: any }) { - const rotation = params.rotation; - const position = params.position; - const sideWidth = params.sideWidth; - const numChambers = 2; - const length = params.length; - const mainWidth = params.mainWidth; - - console.log(rotation, position, sideWidth, numChambers, length, mainWidth, 60); - const color = params.color; - const x = position[0]; - const y = position[1]; - const chamberList = new paper.CompoundPath(""); - chamberList.fillColor = color; - let traps; - let channels; - - const startPoint = new paper.Point(x, y + sideWidth); - channels = new paper.Path.Rectangle({ - point: startPoint, - size: [(numChambers / 2) * (length + 60) + 60, mainWidth], - fillColor: color, - strokeWidth: 0 - }); - chamberList.addChild(channels); - - traps = new paper.CompoundPath(chamberList); - traps.fillColor = color; - const center = new paper.Point(position[0], position[1]); - traps.rotate(rotation, center); - return traps; - } - - __drawCell(params: { [k: string]: any }) { - const rotation = params.rotation; - const position = params.position; - const sideWidth = params.sideWidth; - const numChambers = 2; - const length = params.length; - const mainWidth = params.mainWidth; - const color = params.color; - const x = position[0]; - const y = position[1]; - const chamberList = new paper.CompoundPath(""); - let rec; - - for (let i = 0; i < numChambers / 2; i++) { - const startPoint = new paper.Point(x + i * (length + 60) + 60, y); - rec = new paper.Path.Rectangle({ - size: [length, 2 * sideWidth + mainWidth], - point: startPoint, - fillColor: color, - strokeWidth: 0 - }); - chamberList.addChild(rec); - } - - chamberList.fillColor = color; - const center = new paper.Point(x, y); - chamberList.rotate(rotation, center); - return chamberList; - } -} diff --git a/src/app/library/geometricElements/featureTemplate.ts b/src/app/library/geometricElements/featureTemplate.ts deleted file mode 100755 index 28ab6548..00000000 --- a/src/app/library/geometricElements/featureTemplate.ts +++ /dev/null @@ -1,100 +0,0 @@ - -import ComponentPort from "../../core/componentPort"; -import { GeometricOperationType, ToolPaperObject } from "../../core/init"; -import paper from "paper"; -//import { ManufacturingInfo } from "../manufacturing/ManufacturingInfo"; -import { LogicalLayerType } from "../../core/init"; -import {PRIMITIVES_SERVER} from "../../../componentAPI"; - -export default class FeatureTemplate { - - protected _macro: string = "FeatureTemplate"; - protected _geometricOperation: GeometricOperationType = GeometricOperationType.UNION; - protected __unique: { [key: string]: string } | null = null; - protected __heritable: { [key: string]: string } | null = null; - protected __defaults: { [key: string]: number } | null = null; - protected __minimum: { [key: string]: number } | null = null; - protected __maximum: { [key: string]: number } | null = null; - protected __units: { [key: string]: string } | null = null; - protected __toolParams: { [key: string]: string } | null = null; // { position: "position" }; - protected __featureParams: { [key: string]: string } | null = null; - protected __targetParams: { [key: string]: string } | null = null; - protected __zOffsetKeys: { [key: string]: string } | null = null; - protected __substrateOffset: { [key: string]: string } | null = null; - - - /** - *Creates an instance of Template. - * @memberof Template - */ - constructor() { - this.__setupDefinitions(); - this.__checkDefinitions(); - } - - __setupDefinitions(): void { - //Throw an error if this function is not implemented - throw new Error("Method not implemented."); - } - - __checkDefinitions(): void { - //Check that all the definitions are set - if (this._macro === null) { - throw new Error("Macro not defined: " + this._macro); - } - if (this.__unique === null) { - throw new Error("Unique parameters not defined: " + this._macro); - } - if (this.__heritable === null) { - throw new Error("Heritable parameters not defined: " + this._macro); - } - if (this.__defaults === null) { - throw new Error("Default parameters not defined: " + this._macro); - } - if (this.__minimum === null) { - throw new Error("Minimum parameters not defined: " + this._macro); - } - if (this.__maximum === null) { - throw new Error("Maximum parameters not defined: " + this._macro); - } - if (this.__units === null) { - throw new Error("Units not defined: " + this._macro); - } - if (this.__toolParams === null) { - throw new Error("Tool parameters not defined: " + this._macro); - } - if (this.__featureParams === null) { - throw new Error("Feature parameters not defined: " + this._macro); - } - if (this.__targetParams === null) { - throw new Error("Target parameters not defined: " + this._macro); - } - } - - /** - * Get the Macro parameters for the feature - * - * @type {GeometricOperationType} - * @memberof FeatureTemplate - */ - get geometricOperation(): GeometricOperationType { - return this._geometricOperation; - } - - /** - * Get the Macro parameters for the feature - * - * @type {string} - * @memberof FeatureTemplate - */ - get macro(): string { - return this._macro; - } - - render2d(params: { [key: string]: any }): ToolPaperObject { - //Throw an error if this function is not implemented - throw new Error("Method not implemented."); - } - -} - diff --git a/src/app/library/geometricElements/normallyClosedValveCrecents.ts b/src/app/library/geometricElements/normallyClosedValveCrecents.ts deleted file mode 100644 index cb1bfbb6..00000000 --- a/src/app/library/geometricElements/normallyClosedValveCrecents.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { GeometricOperationType } from "@/app/core/init"; -import FeatureTemplate from "./featureTemplate"; - -export default class NormallyClosedValveCrescents extends FeatureTemplate { - constructor() { - super(); - } - - __setupDefinitions(): void { - this._macro = "VALVE3D FLOW"; - - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - valveRadius: "Float", - height: "Float", - gap: "Float", - width: "Float", - length: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - valveRadius: 1.2 * 1000, - height: 250, - gap: 0.6 * 1000, - width: 2.4 * 1000, - length: 2.4 * 1000 - }; - - this.__units = { - componentSpacing: "μm", - valveRadius: "μm", - height: "μm", - gap: "μm", - width: "μm", - length: "μm", - rotation: "°" - }; - - this.__minimum = { - componentSpacing: 0, - valveRadius: 0.1 * 100, - height: 0.1 * 100, - gap: 0.5 * 10, - rotation: 0, - width: 10, - length: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - valveRadius: 0.3 * 10000, - height: 1.2 * 1000, - gap: 0.1 * 10000, - rotation: 180, - width: 3 * 1000, - length: 3 * 1000 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - radius1: "valveRadius", - radius2: "valveRadius", - valveRadius: "valveRadius", - gap: "gap" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - radius1: "valveRadius", - radius2: "valveRadius", - valveRadius: "valveRadius", - gap: "gap" - }; - - - this.__toolParams = { - position: "position" - }; - - this._geometricOperation = GeometricOperationType.UNION; - // TODO: Setup the manufacuring info for this feature - } - -} \ No newline at end of file diff --git a/src/app/library/geometricElements/normallyClosedValveGap.ts b/src/app/library/geometricElements/normallyClosedValveGap.ts deleted file mode 100644 index ac40cddd..00000000 --- a/src/app/library/geometricElements/normallyClosedValveGap.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { GeometricOperationType } from "@/app/core/init"; -import FeatureTemplate from "./featureTemplate"; - -export default class NormallyClosedValveModificationsGap extends FeatureTemplate { - constructor() { - super(); - } - - __setupDefinitions(): void { - this._macro = "VALVE3D GAP"; - - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - valveRadius: "Float", - height: "Float", - gap: "Float", - width: "Float", - length: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - valveRadius: 1.2 * 1000, - height: 250, - gap: 0.6 * 1000, - width: 2.4 * 1000, - length: 2.4 * 1000 - }; - - this.__units = { - componentSpacing: "μm", - valveRadius: "μm", - height: "μm", - gap: "μm", - width: "μm", - length: "μm", - rotation: "°" - }; - - this.__minimum = { - componentSpacing: 0, - valveRadius: 0.1 * 100, - height: 0.1 * 100, - gap: 0.5 * 10, - rotation: 0, - width: 10, - length: 10 - - }; - - this.__maximum = { - componentSpacing: 10000, - valveRadius: 0.3 * 10000, - height: 1.2 * 1000, - gap: 0.1 * 10000, - rotation: 180, - width: 3 * 1000, - length: 3 * 1000 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - radius1: "valveRadius", - radius2: "valveRadius", - valveRadius: "valveRadius", - gap: "gap" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - radius1: "valveRadius", - radius2: "valveRadius", - valveRadius: "valveRadius", - gap: "gap" - }; - - this.__toolParams = { - position: "position" - }; - - this._geometricOperation = GeometricOperationType.DIFFERENCE; - // TODO: Setup the manufacuring info for this feature - } - -} \ No newline at end of file diff --git a/src/app/library/gradientGenerator.ts b/src/app/library/gradientGenerator.ts deleted file mode 100755 index 5a9e1f9c..00000000 --- a/src/app/library/gradientGenerator.ts +++ /dev/null @@ -1,289 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class GradientGenerator extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - bendSpacing: "Float", - numberOfBends: "Float", - channelWidth: "Float", - bendLength: "Float", - in: "Float", - out: "Float", - spacing: "Float", - height: "Float", - rotation: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - channelWidth: 0.8 * 1000, - bendSpacing: 1.23 * 1000, - numberOfBends: 1, - bendLength: 2.46 * 1000, - in: 1, - out: 3, - spacing: 10000, - height: 250, - rotation: 0 - }; - - this.__units = { - componentSpacing: "μm", - bendSpacing: "μm", - numberOfBends: "", - channelWidth: "μm", - bendLength: "μm", - in: "", - out: "", - spacing: "μm", - height: "μm", - rotation: "°" - }; - - this.__minimum = { - componentSpacing: 0, - channelWidth: 10, - bendSpacing: 10, - numberOfBends: 1, - bendLength: 10, - in: 1, - out: 3, - spacing: 10, - height: 10, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - channelWidth: 2000, - bendSpacing: 6000, - numberOfBends: 20, - bendLength: 12 * 1000, - in: 30, - out: 90, - spacing: 90000, - height: 1200, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - channelWidth: "channelWidth", - bendSpacing: "bendSpacing", - numberOfBends: "numberOfBends", - rotation: "rotation", - bendLength: "bendLength", - in: "in", - out: "out", - spacing: "spacing" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - channelWidth: "channelWidth", - bendSpacing: "bendSpacing", - numberOfBends: "numberOfBends", - rotation: "rotation", - bendLength: "bendLength", - in: "in", - out: "out", - spacing: "spacing" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "GRADIENT GENERATOR"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const bendSpacing = params.bendSpacing; - const numBends = params.numberOfBends; - const channelWidth = params.channelWidth; - const invalue = params.in; - const outvalue = params.out; - const spacing = params.spacing; // Center to Center - - const ports = []; - - const maxstagewidth = (outvalue - 1) * spacing; - const posx = maxstagewidth / 2; - - const stagelength = channelWidth * (2 * numBends + 1) + (2 * numBends + 2) * bendSpacing + channelWidth; - - const segBend = bendSpacing + 2 * channelWidth; - - const fullLength = (outvalue - 1) * (4 * segBend - 3.5 * channelWidth) + stagelength; - - let stagevalue = invalue; - let totalstagewidth = (stagevalue - 1) * spacing; - - let xref = -totalstagewidth / 2; - let yref = stagelength * (stagevalue - invalue); - - const vRepeat = 2 * bendSpacing + 2 * channelWidth; - - for (let i = 0; i < invalue; i++) { - // Generate the ports for each of the inputs - const x = xref + spacing * i + channelWidth / 2; - ports.push(new ComponentPort(x, 0, (i + 1).toString(), LogicalLayerType.FLOW)); - } - - stagevalue = outvalue; - totalstagewidth = (stagevalue - 1) * spacing; - - xref = -totalstagewidth / 2; - yref = stagelength * (stagevalue - invalue + 1); - - for (let i = 0; i < outvalue; i++) { - // Generate the ports for each of the outputs - const x = xref + spacing * i + channelWidth / 2; - ports.push(new ComponentPort(x, yref + channelWidth, (invalue + 1 + i).toString(), LogicalLayerType.FLOW)); - } - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - const position = params.position; - const bendSpacing = params.bendSpacing; - const numBends = params.numberOfBends; - const channelWidth = params.channelWidth; - const bendLength = params.bendLength; - const rotation = params.rotation; - const invalue = params.in; - const outvalue = params.out; - const spacing = params.spacing; // Center to Center - const color = params.color; - - const posx = position[0]; - const posy = position[1]; - const stagelength = channelWidth * (2 * numBends + 1) + (2 * numBends + 2) * bendSpacing + channelWidth; - const gradientgenerator = new paper.CompoundPath(""); - // insertMixer(gradientgenerator, bendSpacing, numBends, channelWidth, bendLength, posx, posy, color); - // Iterate through each of the stages - - // Draw the first stage which is just channels - const totalstagewidth = (invalue - 1) * spacing; - let xref = posx - totalstagewidth / 2; - let yref = posy; - // Draw straight channels for each of the input lines - for (let i = 0; i < invalue; i++) { - const x = xref + spacing * i; - const y = yref; - - // Insert Straight channel - gradientgenerator.addChild( - new paper.Path.Rectangle({ - point: new paper.Point(x, y), - size: [channelWidth, stagelength + channelWidth] - }) - ); - } - - for (let stagevalue = invalue + 1; stagevalue <= outvalue; stagevalue++) { - // For each stage : do the following - /* - Check if each stagevalue is odd or even - - if (not last stage) place horizontal bar connecting eveything - */ - - // Calculate the total width and start placing mixers - const totalstagewidth = (stagevalue - 1) * spacing; - - xref = posx - totalstagewidth / 2; - yref = posy + stagelength * (stagevalue - invalue); - - // Start from the left - for (let i = 0; i < stagevalue; i++) { - const x = xref + spacing * i; - - const y = yref; - // insert the mixer - this.__insertMixer(gradientgenerator as paper.Path, bendSpacing, numBends, channelWidth, bendLength, x, y, color); - } - - // Insert horizontal bar - const hbar = new paper.Path.Rectangle({ - point: new paper.Point(xref, yref), - size: [totalstagewidth, channelWidth], - fillColor: color, - strokeWidth: 0 - }); - - gradientgenerator.addChild(hbar); - } - - gradientgenerator.fillColor = color; - // console.log("testing"); - - gradientgenerator.rotate(rotation, new paper.Point(posx, posy)); - - return gradientgenerator; - } - - __insertMixer(serpentine: paper.Path, bendSpacing: number, numBends: number, channelWidth: number, bendLength: number, x: number, y: number, color: paper.Color): paper.Path { - const segHalf = bendLength / 2 + channelWidth; - const segLength = bendLength + 2 * channelWidth; - const segBend = bendSpacing + 2 * channelWidth; - const vRepeat = 2 * bendSpacing + 2 * channelWidth; - const vOffset = bendSpacing + channelWidth; - const hOffset = bendLength / 2 + channelWidth / 2; - - x -= hOffset; - // TopRectangle - serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + hOffset, y, channelWidth, 2 * channelWidth + bendSpacing))); - y += channelWidth + bendSpacing; - serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y, segHalf + channelWidth / 2, channelWidth))); - for (let i = 0; i < numBends; i++) { - serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * i, channelWidth, segBend))); - serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vOffset + vRepeat * i, segLength, channelWidth))); - serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth + bendLength, y + vOffset + vRepeat * i, channelWidth, segBend))); - if (i === numBends - 1) { - // draw half segment to close - serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + hOffset, y + vRepeat * (i + 1), segHalf, channelWidth))); - } else { - // draw full segment - serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * (i + 1), segLength, channelWidth))); - } - } - - // Bottom rectabvke - serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + hOffset, y + vRepeat * numBends, channelWidth, 2 * channelWidth + bendSpacing))); - - return serpentine; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const render = this.render2D(params, (key = "FLOW")); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/incubation.ts b/src/app/library/incubation.ts deleted file mode 100644 index 7b48241d..00000000 --- a/src/app/library/incubation.ts +++ /dev/null @@ -1,157 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Incubation extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - channelWidth: "Float", - length: "Float", - width: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - channelWidth: 0.8 * 1000, - width: 1.23 * 1000, - length: 4.92 * 1000, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - channelWidth: "μm", - length: "μm", - width: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - rotation: 0, - channelWidth: 10, - width: 30, - length: 120, - height: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - rotation: 360, - channelWidth: 2000, - width: 6000, - length: 24 * 1000, - height: 1200 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - channelWidth: "channelWidth", - length: "length", - width: "width" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - channelWidth: "channelWidth", - length: "length", - width: "width", - rotation: "rotation" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "INCUBATION"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const length = params.length; - - const ports = []; - - ports.push(new ComponentPort(0, -length / 2, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(0, length / 2, "2", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - const position = params.position; - const px = position[0]; - const py = position[1]; - const cw = params.channelWidth; - const l = params.length; - const w = params.width; - const rotation = params.rotation; - const color = params.color; - let p0, p1, p2, p3, p4, p5; - // if (rotation === "H") { - // p0 = [px - l / 2, py - cw / 2]; - // p1 = [px - l / 2, py + cw / 2]; - // p2 = [px, py + w + cw / 2]; - // p3 = [px + l / 2, py + cw / 2]; - // p4 = [px + l / 2, py - cw / 2]; - // p5 = [px, py - cw / 2 - w]; - // } else { - p0 = [px - cw / 2, py - l / 2]; - p1 = [px + cw / 2, py - l / 2]; - p2 = [px + w + cw / 2, py]; - p3 = [px + cw / 2, py + l / 2]; - p4 = [px - cw / 2, py + l / 2]; - p5 = [px - cw / 2 - w, py]; - // } - const hex = new paper.Path(); - hex.add(new paper.Point(p0)); - hex.add(new paper.Point(p1)); - hex.add(new paper.Point(p2)); - hex.add(new paper.Point(p3)); - hex.add(new paper.Point(p4)); - hex.add(new paper.Point(p5)); - hex.closed = true; - hex.fillColor = color; - - hex.rotate(rotation, new paper.Point(px, py)); - - return hex; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/llChamber.ts b/src/app/library/llChamber.ts deleted file mode 100644 index 3e81cfbc..00000000 --- a/src/app/library/llChamber.ts +++ /dev/null @@ -1,252 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class LLChamber extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - width: "Float", - length: "Float", - height: "Float", - rotation: "Float", - spacing: "Float", - numberOfChambers: "Integer" - }; - - this.__defaults = { - componentSpacing: 1000, - width: 400, - length: 5000, - height: 250, - spacing: 2000, - numberOfChambers: 4, - rotation: 0 - }; - - this.__units = { - componentSpacing: "μm", - width: "μm", - length: "μm", - height: "μm", - spacing: "μm", - numberOfChambers: "10", - rotation: "°" - }; - - this.__minimum = { - componentSpacing: 0, - width: 5, - length: 5, - height: 1, - spacing: 1, - numberOfChambers: 1, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - width: 50000, - length: 50000, - height: 50000, - numberOfChambers: 1000, - spacing: 50000, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - width: "width", - length: "length", - height: "height", - numberOfChambers: "numberOfChambers", - spacing: "spacing", - rotation: "rotation" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - position: "position", - width: "width", - length: "length", - height: "height", - numberOfChambers: "numberOfChambers", - spacing: "spacing", - rotation: "rotation" - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__mint = "LL CHAMBER"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1" - }; - } - - getPorts(params: { [k: string]: any }) { - const position = params.position; - const px = position[0]; - const py = position[1]; - const l = params.length; - const w = params.width; - const rotation = params.rotation; - const color = params.color; - // let radius = params["cornerRadius"]; - - const numArray = params.numberOfChambers; - const spacing = params.spacing; - - const ports = []; - - ports.push(new ComponentPort(w / 2, -w, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(numArray * w + (numArray + 1) * spacing - w / 2, -w, "2", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(w / 2, l + w, "3", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(numArray * w + (numArray + 1) * spacing - w / 2, l + w, "4", LogicalLayerType.FLOW)); - - // //Control Ports - Left - ports.push(new ComponentPort(0, 0.2 * l, "10", LogicalLayerType.CONTROL)); - - ports.push(new ComponentPort(0, 0.5 * l, "9", LogicalLayerType.CONTROL)); - - ports.push(new ComponentPort(0, 0.8 * l, "8", LogicalLayerType.CONTROL)); - - // Control Ports - Right - ports.push(new ComponentPort(numArray * w + (numArray + 1) * spacing, 0.2 * l, "5", LogicalLayerType.CONTROL)); - - ports.push(new ComponentPort(numArray * w + (numArray + 1) * spacing, 0.5 * l, "6", LogicalLayerType.CONTROL)); - - ports.push(new ComponentPort(numArray * w + (numArray + 1) * spacing, 0.8 * l, "7", LogicalLayerType.CONTROL)); - - return ports; - } - - __renderFlow(params: { [k: string]: any }) { - const position = params.position; - const px = position[0]; - const py = position[1]; - const l = params.length; - const w = params.width; - const rotation = params.rotation; - const color = params.color; - // let radius = params["cornerRadius"]; - - const numArray = params.numberOfChambers; - const spacing = params.spacing; - - const rendered = new paper.CompoundPath(""); - - let rec; - - for (let i = 0; i < numArray; i++) { - rec = new paper.Path.Rectangle({ - point: new paper.Point(px + (i + 1) * spacing + i * w, py - 1), - size: [w, l + 2], - radius: 0 - }); - - rendered.addChild(rec); - } - - const topchannel = new paper.Path.Rectangle({ - point: new paper.Point(px, py - w), - size: [numArray * w + (numArray + 1) * spacing, w] - }); - - rendered.addChild(topchannel); - - const bottomchannel = new paper.Path.Rectangle({ - point: new paper.Point(px, py + l), - size: [numArray * w + (numArray + 1) * spacing, w] - }); - - rendered.addChild(bottomchannel); - - rendered.fillColor = color; - rendered.rotate(rotation, new paper.Point(px, py)); - return rendered; - } - - __renderControl(params: { [k: string]: any }) { - const rendered = new paper.CompoundPath(""); - const position = params.position; - const px = position[0]; - const py = position[1]; - const l = params.length; - const w = params.width; - const rotation = params.rotation; - const color = params.color; - // let radius = params["cornerRadius"]; - - const numArray = params.numberOfChambers; - const spacing = params.spacing; - - const topchannel = new paper.Path.Rectangle({ - point: new paper.Point(px, py + 0.2 * l - w / 2), - size: [numArray * w + (numArray + 1) * spacing, w] - }); - - rendered.addChild(topchannel); - - const middlechannel = new paper.Path.Rectangle({ - point: new paper.Point(px, py + 0.5 * l - w / 2), - size: [numArray * w + (numArray + 1) * spacing, w] - }); - - rendered.addChild(middlechannel); - - const bottomchannel = new paper.Path.Rectangle({ - point: new paper.Point(px, py + 0.8 * l - w / 2), - size: [numArray * w + (numArray + 1) * spacing, w] - }); - - rendered.addChild(bottomchannel); - - rendered.fillColor = color; - rendered.rotate(rotation, new paper.Point(px, py)); - return rendered; - } - - render2D(params: { [k: string]: any }, key = "FLOW") { - if (key === "FLOW") { - return this.__renderFlow(params); - } else if (key === "CONTROL") { - return this.__renderControl(params); - } - throw new Error("Unknown render key found in LLCHAMBER: " + key); - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const ret = new paper.CompoundPath(""); - const flow = this.render2D(params, "FLOW"); - const control = this.render2D(params, "CONTROL"); - ret.addChild(control); - ret.addChild(flow); - ret.fillColor = params.color; - ret.fillColor!.alpha = 0.5; - return ret; - } -} diff --git a/src/app/library/logicArray.ts b/src/app/library/logicArray.ts deleted file mode 100755 index 85d0b783..00000000 --- a/src/app/library/logicArray.ts +++ /dev/null @@ -1,750 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class LogicArray extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - chamberWidth: "Float", - height: "Float", - chamberLength: "Float", - flowChannelWidth: "Float", - controlChannelWidth: "Float", - portRadius: "Float", - rotation: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - height: 1.1 * 1000, - chamberWidth: 1.5 * 1000, - chamberLength: 1.5 * 1000, - flowChannelWidth: 0.6 * 1000, - controlChannelWidth: 0.4 * 1000, - portRadius: 1000, - rotation: 0 - }; - - this.__units = { - componentSpacing: "μm", - chamberWidth: "μm", - chamberLength: "μm", - flowChannelWidth: "μm", - controlChannelWidth: "μm", - portRadius: "μm", - height: "μm", - rotation: "°" - }; - - this.__minimum = { - componentSpacing: 0, - height: 1, - chamberWidth: 1, - chamberLength: 1, - flowChannelWidth: 1, - controlChannelWidth: 1, - portRadius: 1, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - height: 1.1 * 10000, - chamberWidth: 10000, - chamberLength: 10000, - flowChannelWidth: 10000, - controlChannelWidth: 10000, - portRadius: 10000, - rotation: 360 - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - chamberWidth: "chamberWidth", - flowChannelWidth: "flowChannelWidth", - controlChannelWidth: "controlChannelWidth", - portRadius: "portRadius", - chamberLength: "chamberLength", - height: "height", - position: "position", - rotation: "rotation" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - chamberWidth: "chamberWidth", - flowChannelWidth: "flowChannelWidth", - controlChannelWidth: "controlChannelWidth", - portRadius: "portRadius", - chamberLength: "chamberLength", - height: "height", - rotation: "rotation" - }; - - this.__renderKeys = ["FLOW", "CONTROL", "CELL"]; - - this.__mint = "LOGIC ARRAY"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height", - CELL: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1", - CELL: "0" - }; - } - - render2D(params: { [k: string]: any }, key: string) { - if (key === "FLOW") { - return this.__drawFlow(params); - } else if (key === "CONTROL") { - return this.__drawControl(params); - } else if (key === "CELL") { - console.log("cell"); - return this.__drawCell(params); - } - throw new Error("Invalid key passed to LogicArray render2D"); - } - - __drawFlow(params: { [k: string]: any }) { - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const spacing = params.componentSpacing; - const chamberWidth = params.chamberWidth; - const flowChannelWidth = params.flowChannelWidth; - const controlChannelWidth = params.controlChannelWidth; - const portRadius = params.portRadius; - const chamberLength = params.chamberLength; - const rotation = params.rotation; - - const ret = new paper.CompoundPath(""); - const topDistance = 14 * spacing; - const inWidth = 5 * spacing; - const pathLength = 20 * spacing; - const extraLength = 2 * spacing; - - // middle path - let topLeft = new paper.Point(x, y - flowChannelWidth / 2); - let bottomRight = new paper.Point(x + pathLength, y + flowChannelWidth / 2); - - let rec: paper.Rectangle | paper.PathItem = new paper.Path.Rectangle(topLeft, bottomRight); - - /// / left - topLeft = new paper.Point(x + (2 * inWidth) / 3 - controlChannelWidth, y - flowChannelWidth / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + (2 * inWidth) / 3 + controlChannelWidth, y + flowChannelWidth / 2 + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / second left - topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth, y - flowChannelWidth / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth, y + flowChannelWidth / 2 + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / right - topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth, y - flowChannelWidth / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth, y + flowChannelWidth / 2 + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - ret.addChild(rec); - - // top part ** cut - topLeft = new paper.Point(x, y - topDistance - flowChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth, y - topDistance + flowChannelWidth / 2); - - rec = new paper.Path.Rectangle(topLeft, bottomRight); - - topLeft = new paper.Point(x + inWidth / 3 - controlChannelWidth, y - topDistance - flowChannelWidth / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth / 3 + controlChannelWidth, y - topDistance + flowChannelWidth / 2 + controlChannelWidth); - - const cutrec = new paper.Path.Rectangle(topLeft, bottomRight); - - rec = rec.subtract(cutrec); - - ret.addChild(rec); - - topLeft = new paper.Point(x + inWidth - flowChannelWidth / 2, y - topDistance - topDistance / 2); - bottomRight = new paper.Point(x + inWidth + flowChannelWidth / 2, y - topDistance + topDistance / 2); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth, y - topDistance - topDistance / 2); - bottomRight = new paper.Point(x + inWidth + pathLength, y - topDistance - topDistance / 2 + flowChannelWidth); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength - flowChannelWidth, y - topDistance - topDistance / 2); - bottomRight = new paper.Point(x + inWidth + pathLength, y - topDistance + topDistance / 2); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // top part bottom line ** cut for control - topLeft = new paper.Point(x + inWidth, y - topDistance + topDistance / 2 - flowChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength, y - topDistance + topDistance / 2); - - rec = new paper.Path.Rectangle(topLeft, bottomRight); - - /// / left - topLeft = new paper.Point(x + pathLength / 2 - extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth); - bottomRight = new paper.Point(x + pathLength / 2 - extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / second left - topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / second right - topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / right - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - ret.addChild(rec); - - // bottom part ** cut - topLeft = new paper.Point(x, y + topDistance + flowChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth, y + topDistance - flowChannelWidth / 2); - - rec = new paper.Path.Rectangle(topLeft, bottomRight); - - topLeft = new paper.Point(x + inWidth / 3 - controlChannelWidth, y + topDistance - flowChannelWidth / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth / 3 + controlChannelWidth, y + topDistance + flowChannelWidth / 2 + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - ret.addChild(rec); - - topLeft = new paper.Point(x + inWidth - flowChannelWidth / 2, y + topDistance + topDistance / 2); - bottomRight = new paper.Point(x + inWidth + flowChannelWidth / 2, y + topDistance - topDistance / 2); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth, y + topDistance + topDistance / 2); - bottomRight = new paper.Point(x + inWidth + pathLength, y + topDistance + topDistance / 2 - flowChannelWidth); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength - flowChannelWidth, y + topDistance + topDistance / 2); - bottomRight = new paper.Point(x + inWidth + pathLength, y + topDistance - topDistance / 2); - - ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // bottom part top line ** cut for control - topLeft = new paper.Point(x + inWidth, y + topDistance - topDistance / 2 + flowChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength, y + topDistance - topDistance / 2); - - rec = new paper.Path.Rectangle(topLeft, bottomRight); - - /// / left - topLeft = new paper.Point(x + pathLength / 2 - extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + pathLength / 2 - extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / second left - topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / second right - topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / right - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - ret.addChild(rec); - - // insde middle ** cut - topLeft = new paper.Point(x + inWidth + pathLength / 2 - flowChannelWidth / 2, y - topDistance / 2); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + flowChannelWidth / 2, y + topDistance / 2); - - rec = new paper.Path.Rectangle(topLeft, bottomRight); - - /// / top - topLeft = new paper.Point(x + inWidth + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y - topDistance / 2 + 4 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y - topDistance / 2 + 4 * spacing + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / bottom - topLeft = new paper.Point(x + inWidth + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y + topDistance / 2 - 4 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y + topDistance / 2 - 4 * spacing + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - ret.addChild(rec); - - // inside left ** cut - topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2, y - topDistance - topDistance / 4); - bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2, y + topDistance + topDistance / 4); - - rec = new paper.Path.Rectangle(topLeft, bottomRight); - - /// / top - topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y - topDistance / 2 - 5 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y - topDistance / 2 - 5 * spacing + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / second top - topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y - topDistance / 2 + 3 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y - topDistance / 2 + 3 * spacing + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / second bottom - topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y + topDistance / 2 - 3 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y + topDistance / 2 - 3 * spacing + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / bottom - topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y + topDistance / 2 + 5 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y + topDistance / 2 + 5 * spacing + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - ret.addChild(rec); - - let circ = new paper.Path.Circle(new paper.Point(x + pathLength / 2, y - topDistance - topDistance / 4), portRadius); - - ret.addChild(circ); - - circ = new paper.Path.Circle(new paper.Point(x + pathLength / 2, y + topDistance + topDistance / 4), portRadius); - - ret.addChild(circ); - - // inside right ** cut - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth, y - topDistance - topDistance / 4); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2, y + topDistance + topDistance / 4); - - rec = new paper.Path.Rectangle(topLeft, bottomRight); - - /// / top - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y - topDistance / 2 - 2 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y - topDistance / 2 - 2 * spacing + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / second top - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y - topDistance / 2 + 5 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y - topDistance / 2 + 5 * spacing + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / second bottom - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y + topDistance / 2 - 5 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y + topDistance / 2 - 5 * spacing + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - - /// / bottom - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y + topDistance / 2 + 2 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y + topDistance / 2 + 2 * spacing + controlChannelWidth); - rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight)); - ret.addChild(rec); - - circ = new paper.Path.Circle(new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth / 2, y - topDistance - topDistance / 4), portRadius); - - ret.addChild(circ); - - circ = new paper.Path.Circle(new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth / 2, y + topDistance + topDistance / 4), portRadius); - - ret.addChild(circ); - - ret.fillColor = color; - ret.rotate(rotation, new paper.Point(x, y)); - return ret; - } - - __drawControl(params: { [k: string]: any }) { - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const spacing = params.componentSpacing; - const chamberWidth = params.chamberWidth; - const flowChannelWidth = params.flowChannelWidth; - const controlChannelWidth = params.controlChannelWidth; - const portRadius = params.portRadius; - const chamberLength = params.chamberLength; - const rotation = params.rotation; - - const ret = new paper.CompoundPath(""); - const topDistance = 14 * spacing; - const inWidth = 5 * spacing; - const pathLength = 20 * spacing; - - const extraLength = 2 * spacing; - - const control = new paper.CompoundPath(""); - - // control 24 - let topLeft = new paper.Point(x + inWidth / 3 - controlChannelWidth / 2, y - topDistance - topDistance / 2 - extraLength); - let bottomRight = new paper.Point(x + inWidth / 3 + controlChannelWidth / 2, y - topDistance); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth / 3 - controlChannelWidth, y - topDistance - flowChannelWidth / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth / 3 + controlChannelWidth, y - topDistance + flowChannelWidth / 2 + controlChannelWidth); - - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // cnotrol 25 - topLeft = new paper.Point(x + (2 * inWidth) / 3 - controlChannelWidth / 2, y - topDistance - topDistance / 2 - extraLength); - bottomRight = new paper.Point(x + (2 * inWidth) / 3 + controlChannelWidth / 2, y); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + (2 * inWidth) / 3 - controlChannelWidth, y - flowChannelWidth / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + (2 * inWidth) / 3 + controlChannelWidth, y + flowChannelWidth / 2 + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 26 - topLeft = new paper.Point(x + inWidth / 3 - controlChannelWidth / 2, y + topDistance + topDistance / 2 + extraLength); - bottomRight = new paper.Point(x + inWidth / 3 + controlChannelWidth / 2, y + topDistance); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth / 3 - controlChannelWidth, y + topDistance - flowChannelWidth / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth / 3 + controlChannelWidth, y + topDistance + flowChannelWidth / 2 + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 8 - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth / 2, y - topDistance / 2 - 2 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 - 2 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y - topDistance / 2 - 2 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y - topDistance / 2 - 2 * spacing + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 7 - topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength, y - topDistance / 2 - 3 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 - 3 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth / 2, y - topDistance / 2 - 3 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth / 2, y - topDistance / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 6 - topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength, y - topDistance / 2 - 4 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 - 4 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth / 2, y - topDistance / 2 - 4 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth / 2, y - topDistance / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 5 - topLeft = new paper.Point(x + pathLength / 2, y - topDistance / 2 - 5 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 - 5 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y - topDistance / 2 - 5 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y - topDistance / 2 - 5 * spacing + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 4 - topLeft = new paper.Point(x + pathLength / 2 - extraLength, y - topDistance / 2 - 6 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 - 6 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + pathLength / 2 - extraLength - controlChannelWidth / 2, y - topDistance / 2 - 6 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + pathLength / 2 - extraLength + controlChannelWidth / 2, y - topDistance / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + pathLength / 2 - extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth); - bottomRight = new paper.Point(x + pathLength / 2 - extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 19 - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth / 2, y + topDistance / 2 + 2 * spacing + controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 + 2 * spacing - controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y + topDistance / 2 + 2 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y + topDistance / 2 + 2 * spacing + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 20 - topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength, y + topDistance / 2 + 3 * spacing + controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 + 3 * spacing - controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth / 2, y + topDistance / 2 + 3 * spacing + controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth / 2, y + topDistance / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 21 - topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength, y + topDistance / 2 + 4 * spacing + controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 + 4 * spacing - controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth / 2, y + topDistance / 2 + 4 * spacing + controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth / 2, y + topDistance / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 22 - topLeft = new paper.Point(x + pathLength / 2, y + topDistance / 2 + 5 * spacing + controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 + 5 * spacing - controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y + topDistance / 2 + 5 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y + topDistance / 2 + 5 * spacing + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 23 - topLeft = new paper.Point(x + pathLength / 2 - extraLength, y + topDistance / 2 + 6 * spacing + controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 + 6 * spacing - controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + pathLength / 2 - extraLength - controlChannelWidth / 2, y + topDistance / 2 + 6 * spacing + controlChannelWidth / 2); - bottomRight = new paper.Point(x + pathLength / 2 - extraLength + controlChannelWidth / 2, y + topDistance / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + pathLength / 2 - extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + pathLength / 2 - extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 9 - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength, y - topDistance / 2 + 2 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 + 2 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength - controlChannelWidth / 2, y - topDistance / 2); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength + controlChannelWidth / 2, y - topDistance / 2 + 2 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 18 - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength, y + topDistance / 2 - 2 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 - 2 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength - controlChannelWidth / 2, y + topDistance / 2); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength + controlChannelWidth / 2, y + topDistance / 2 - 2 * spacing - controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 10 - topLeft = new paper.Point(x + pathLength / 2, y - topDistance / 2 + 3 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 + 3 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y - topDistance / 2 + 3 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y - topDistance / 2 + 3 * spacing + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 17 - topLeft = new paper.Point(x + pathLength / 2, y + topDistance / 2 - 3 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 - 3 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y + topDistance / 2 - 3 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y + topDistance / 2 - 3 * spacing + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 11 - topLeft = new paper.Point(x + inWidth + pathLength / 2, y - topDistance / 2 + 4 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 + 4 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y - topDistance / 2 + 4 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y - topDistance / 2 + 4 * spacing + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 16 - topLeft = new paper.Point(x + inWidth + pathLength / 2, y + topDistance / 2 - 4 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 - 4 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y + topDistance / 2 - 4 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y + topDistance / 2 - 4 * spacing + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 12 - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2, y - topDistance / 2 + 5 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 + 5 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y - topDistance / 2 + 5 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y - topDistance / 2 + 5 * spacing + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 15 - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2, y + topDistance / 2 - 5 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 - 5 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y + topDistance / 2 - 5 * spacing - controlChannelWidth); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y + topDistance / 2 - 5 * spacing + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 13 - topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength, y - topDistance / 2 + 6 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 + 6 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth / 2, y - topDistance / 2 + 6 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth / 2, y + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth, y - flowChannelWidth / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth, y + flowChannelWidth / 2 + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // control 14 - topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength, y + topDistance / 2 - 6 * spacing - controlChannelWidth / 2); - bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 - 6 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth / 2, y); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth / 2, y + topDistance / 2 - 6 * spacing + controlChannelWidth / 2); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth, y - flowChannelWidth / 2 - controlChannelWidth); - bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth, y + flowChannelWidth / 2 + controlChannelWidth); - control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - control.fillColor = color; - control.rotate(rotation, new paper.Point(x, y)); - - return control; - } - - getPorts(params: { [k: string]: any }) { - const ports = []; - const chamberWidth = params.chamberWidth; - const flowChannelWidth = params.flowChannelWidth; - const controlChannelWidth = params.controlChannelWidth; - const portRadius = params.portRadius; - const chamberLength = params.chamberLength; - const rotation = params.rotation; - const spacing = params.componentSpacing; - - const topDistance = 14 * spacing; - const inWidth = 5 * spacing; - const pathLength = 20 * spacing; - - const extraLength = 2 * spacing; - - // flow - ports.push(new ComponentPort(0, -topDistance, "1", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(0, 0, "2", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(0, topDistance, "3", LogicalLayerType.FLOW)); - - // control - ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 - 6 * spacing, "4", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 - 5 * spacing, "5", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 - 4 * spacing, "6", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 - 3 * spacing, "7", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 - 2 * spacing, "8", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 + 2 * spacing, "9", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 + 3 * spacing, "10", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 + 4 * spacing, "11", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 + 5 * spacing, "12", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 + 6 * spacing, "13", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 - 6 * spacing, "14", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 - 5 * spacing, "15", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 - 4 * spacing, "16", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 - 3 * spacing, "17", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 - 2 * spacing, "18", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 + 2 * spacing, "19", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 + 3 * spacing, "20", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 + 4 * spacing, "21", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 + 5 * spacing, "22", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 + 6 * spacing, "23", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth / 3, -topDistance - topDistance / 2 - extraLength, "24", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort((2 * inWidth) / 3, -topDistance - topDistance / 2 - extraLength, "25", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(inWidth / 3, topDistance + topDistance / 2 + extraLength, "26", LogicalLayerType.CONTROL)); - - return ports; - } - - __drawCell(params: { [k: string]: any }) { - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const spacing = params.componentSpacing; - const chamberWidth = params.chamberWidth; - const flowChannelWidth = params.flowChannelWidth; - const controlChannelWidth = params.controlChannelWidth; - const portRadius = params.portRadius; - const chamberLength = params.chamberLength; - const rotation = params.rotation; - - const ret = new paper.CompoundPath(""); - const topDistance = 14 * spacing; - const inWidth = 5 * spacing; - const pathLength = 20 * spacing; - - const extraLength = 2 * spacing; - - const cell = new paper.CompoundPath(""); - - // top left - let topLeft = new paper.Point(x + pathLength / 2 - chamberWidth / 2, y - topDistance / 2 - chamberLength / 2 - flowChannelWidth / 2); - let bottomRight = new paper.Point(x + pathLength / 2 + chamberWidth / 2, y - topDistance / 2 + chamberLength / 2 - flowChannelWidth / 2); - cell.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // top right - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - chamberWidth / 2 - flowChannelWidth / 2, y - topDistance / 2 - chamberLength / 2 - flowChannelWidth / 2); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + chamberWidth / 2 - flowChannelWidth / 2, y - topDistance / 2 + chamberLength / 2 - flowChannelWidth / 2); - cell.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // bottom left - topLeft = new paper.Point(x + pathLength / 2 - chamberWidth / 2, y + topDistance / 2 - chamberLength / 2 + flowChannelWidth / 2); - bottomRight = new paper.Point(x + pathLength / 2 + chamberWidth / 2, y + topDistance / 2 + chamberLength / 2 + flowChannelWidth / 2); - cell.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // top right - topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - chamberWidth / 2 - flowChannelWidth / 2, y + topDistance / 2 - chamberLength / 2 + flowChannelWidth / 2); - bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + chamberWidth / 2 - flowChannelWidth / 2, y + topDistance / 2 + chamberLength / 2 + flowChannelWidth / 2); - cell.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - cell.fillColor = color; - cell.rotate(rotation, new paper.Point(x, y)); - - return cell; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const render = this.__drawFlow(params); - render.addChild(this.__drawControl(params)); - render.addChild(this.__drawCell(params)); - - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/merger.ts b/src/app/library/merger.ts deleted file mode 100644 index d45d83dd..00000000 --- a/src/app/library/merger.ts +++ /dev/null @@ -1,267 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Merger extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - height: "Float", - inletWidth: "Float", - inletLength: "Float", - electrodeWidth: "Float", - electrodeLength: "Float", - electrodeDistance: "Float", - outletWidth: "Float", - outletLength: "Float", - chamberHeight: "Float", - chamberLength: "Float", - channelDepth: "Float", - electrodeDepth: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - height: 250, - inletWidth: 2 * 1000, - inletLength: 4 * 1000, - electrodeWidth: 1000, - electrodeLength: 5 * 1000, - electrodeDistance: 1000, - outletWidth: 2 * 1000, - outletLength: 4 * 1000, - chamberHeight: 2.7 * 1000, - chamberLength: 2 * 1000, - channelDepth: 1000, - electrodeDepth: 1000 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - height: "μm", - inletWidth: "μm", - inletLength: "μm", - electrodeWidth: "μm", - electrodeLength: "μm", - electrodeDistance: "μm", - outletWidth: "μm", - outletLength: "μm", - chamberHeight: "μm", - chamberLength: "μm", - channelDepth: "μm", - electrodeDepth: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - rotation: 0, - height: 10, - inletWidth: 1000, - inletLength: 1000, - electrodeWidth: 500, - electrodeLength: 3 * 1000, - electrodeDistance: 500, - outletWidth: 1000, - outletLength: 1000, - chamberHeight: 1000, - chamberLength: 1000, - channelDepth: 1000, - electrodeDepth: 1000 - }; - - this.__maximum = { - componentSpacing: 10000, - rotation: 360, - height: 1200, - inletWidth: 3 * 1000, - inletLength: 6 * 1000, - electrodeWidth: 3 * 1000, - electrodeLength: 7 * 1000, - electrodeDistance: 1500, - outletWidth: 3 * 1000, - outletLength: 6 * 1000, - chamberHeight: 4 * 1000, - chamberLength: 4 * 1000, - channelDepth: 1000, - electrodeDepth: 1000 - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - cursorPosition: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - inletWidth: "inletWidth", - inletLength: "inletLength", - electrodeWidth: "electrodeWidth", - electrodeLength: "electrodeLength", - electrodeDistance: "electrodeDistance", - outletWidth: "outletWidth", - outletLength: "outletLength", - chamberHeight: "chamberHeight", - chamberLength: "chamberLength", - channelDepth: "channelDepth", - electrodeDepth: "electrodeDepth" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - rotation: "rotation", - inletWidth: "inletWidth", - inletLength: "inletLength", - electrodeWidth: "electrodeWidth", - electrodeLength: "electrodeLength", - electrodeDistance: "electrodeDistance", - outletWidth: "outletWidth", - outletLength: "outletLength", - chamberHeight: "chamberHeight", - chamberLength: "chamberLength", - channelDepth: "channelDepth", - electrodeDepth: "electrodeDepth" - }; - - this.__renderKeys = ["FLOW", "INTEGRATION"]; - - this.__mint = "DROPLET MERGER"; - - this.__zOffsetKeys = { - FLOW: "height", - INTEGRATION: "electrodeDepth" - }; - - this.__substrateOffset = { - FLOW: "0", - INTEGRATION: "+1" - }; - } - - getPorts(params: { [k: string]: any }) { - const inletLength = params.inletLength; - const outletLength = params.outletLength; - const chamberLength = params.chamberLength; - - const ports = []; - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(inletLength + chamberLength + outletLength, 0, "2", LogicalLayerType.FLOW)); - - return ports; - } - - __renderFlow(params: { [k: string]: any }) { - const rotation = params.rotation; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const inletWidth = params.inletWidth; - const inletLength = params.inletLength; - const outletWidth = params.outletWidth; - const outletLength = params.outletLength; - const chamberHeight = params.chamberHeight; - const chamberLength = params.chamberLength; - const channelDepth = params.channelDepth; - const electrodeDepth = params.electrodeDepth; - - const serp = new paper.CompoundPath(""); - - // inlet - let topLeft = new paper.Point(x, y - inletWidth / 2); - let bottomRight = new paper.Point(x + inletLength, y + inletWidth / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // merge chamber - topLeft = new paper.Point(x + inletLength, y - chamberHeight / 2); - bottomRight = new paper.Point(x + inletLength + chamberLength, y + chamberHeight / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // outlet - topLeft = new paper.Point(x + inletLength + chamberLength, y - outletWidth / 2); - bottomRight = new paper.Point(x + inletLength + chamberLength + outletLength, y + outletWidth / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - serp.rotate(rotation, new paper.Point(x, y)); - - serp.fillColor = color; - return serp; - } - - __renderIntegrate(params: { [k: string]: any }) { - const rotation = params.rotation; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const inletLength = params.inletLength; - const electrodeWidth = params.electrodeWidth; - const electrodeLength = params.electrodeLength; - const electrodeDistance = params.electrodeDistance; - const channelDepth = params.channelDepth; - const electrodeDepth = params.electrodeDepth; - - const serp = new paper.CompoundPath(""); - - // left electrode - let topLeft = new paper.Point(x + inletLength, y - electrodeLength / 2); - let bottomRight = new paper.Point(x + inletLength + electrodeWidth, y + electrodeLength / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // right electrode - topLeft = new paper.Point(x + inletLength + electrodeWidth + electrodeDistance, y - electrodeLength / 2); - bottomRight = new paper.Point(x + inletLength + 2 * electrodeWidth + electrodeDistance, y + electrodeLength / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - serp.rotate(rotation, new paper.Point(x, y)); - - serp.fillColor = color; - return serp; - } - - // render2DTarget(key, params) { - // const serp = this.render2D(params, key); - - // serp.fillColor.alpha = 0.5; - // return serp; - // } - - render2D(params: { [k: string]: any }, key = "FLOW") { - if (key === "FLOW") { - return this.__renderFlow(params); - } else if (key === "INTEGRATION") { - return this.__renderIntegrate(params); - } - throw new Error("Unknown render key found in DROPLET MERGER: " + key); - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const ret = new paper.CompoundPath(""); - const flow = this.render2D(params, "FLOW"); - const integrate = this.render2D(params, "INTEGRATION"); - ret.addChild(integrate); - ret.addChild(flow); - ret.fillColor = params.color; - ret.fillColor!.alpha = 0.5; - return ret; - } -} diff --git a/src/app/library/mux.ts b/src/app/library/mux.ts deleted file mode 100755 index 28d53cda..00000000 --- a/src/app/library/mux.ts +++ /dev/null @@ -1,496 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Mux extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - flowChannelWidth: "Float", - rotation: "Float", - spacing: "Float", - in: "Integer", - out: "Integer", - width: "Float", - length: "Float", - height: "Float", - stageLength: "Float", - controlChannelWidth: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - flowChannelWidth: 0.8 * 1000, - rotation: 0, - spacing: 4 * 1000, - in: 1, - out: 8, - width: 1.6 * 1000, - length: 1.6 * 1000, - height: 250, - stageLength: 4000, - controlChannelWidth: 0.4 * 1000 - }; - - this.__units = { - componentSpacing: "μm", - flowChannelWidth: "μm", - rotation: "°", - spacing: "μm", - in: "", - out: "", - width: "μm", - length: "μm", - height: "μm", - stageLength: "μm", - controlChannelWidth: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - flowChannelWidth: 10, - spacing: 30, - in: 1, - out: 2, - width: 60, - length: 60, - height: 10, - stageLength: 100, - controlChannelWidth: 10, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - flowChannelWidth: 2000, - spacing: 12000, - in: 1, - out: 128, - width: 12 * 1000, - length: 12 * 1000, - height: 1200, - stageLength: 6000, - controlChannelWidth: 2000, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - flowChannelWidth: "flowChannelWidth", - controlChannelWidth: "controlChannelWidth", - rotation: "rotation", - spacing: "spacing", - width: "width", - length: "length", - in: "in", - out: "out", - stageLength: "stageLength" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - position: "position", - flowChannelWidth: "flowChannelWidth", - controlChannelWidth: "controlChannelWidth", - rotation: "rotation", - spacing: "spacing", - width: "width", - length: "length", - in: "in", - out: "out", - stageLength: "stageLength" - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW", "CONTROL"]; - - this.__mint = "MUX"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1" - }; - } - - __drawFlow(params: { [k: string]: any }): paper.CompoundPath { - const position = params.position; - const cw = params.flowChannelWidth; - let rotation = params.rotation; - const spacing = params.spacing; - const ins = params.in; - const outs = params.out; - let leafs; - if (ins < outs) { - leafs = outs; - } else { - leafs = ins; - rotation += 180; - } - const color = params.color; - const stagelength = params.stageLength; - const px = position[0]; - const py = position[1]; - - const levels = Math.ceil(Math.log2(leafs)); - let isodd = false; // This is used to figure out how many lines have to be made - if (leafs % 2 === 0) { - isodd = false; - } else { - isodd = true; - } - const w = spacing * (leafs / 2 + 1); - const l = (levels + 1) * stagelength; - - // console.log("CW: " + cw + " levels: "+ levels + " width: " + w + " length: " + l) - - const treepath = new paper.CompoundPath(""); - - this.__generateMuxTwig(treepath, px, py, cw, stagelength, w, 1, levels); - - // Draw the tree - - treepath.fillColor = color; - return (treepath.rotate(rotation, new paper.Point(px, py)) as unknown) as paper.CompoundPath; - } - - __drawControl(params: { [k: string]: any }): paper.CompoundPath { - const position = params.position; - const cw = params.flowChannelWidth; - const ctlcw = params.controlChannelWidth; - let rotation = params.rotation; - const spacing = params.spacing; - const ins = params.in; - const outs = params.out; - let leafs; - if (ins < outs) { - leafs = outs; - } else { - leafs = ins; - rotation += 180; - } - const color = params.color; - const stagelength = params.stageLength; - const valvelength = params.length; - const valvewidth = params.width; - const px = position[0]; - const py = position[1]; - - const treeWidth = (leafs - 1) * spacing + leafs * cw + leafs * valvewidth; - const leftEdge = px - treeWidth / 2; - const rightEdge = px + treeWidth / 2; - - const levels = Math.ceil(Math.log2(leafs)); - - const isodd = !(leafs % 2); - const w = spacing * (leafs / 2 + 1); - const l = (levels + 1) * stagelength; - - // console.log("CW: " + cw + " levels: "+ levels + " width: " + w + " length: " + l) - - const treepath = new paper.CompoundPath(""); - - this.__generateMuxControlTwig(treepath, px, py, cw, ctlcw, stagelength, w, 1, levels, valvewidth, valvelength, leftEdge, rightEdge); - - // Draw the tree - - treepath.fillColor = color; - return (treepath.rotate(rotation, new paper.Point(px, py)) as unknown) as paper.CompoundPath; - } - - getPorts(params: { [k: string]: any }) { - const ports = []; - const cw = params.flowChannelWidth; - const spacing = params.spacing; - const ins = params.in; - const outs = params.out; - let leafs; - if (ins < outs) { - leafs = outs; - } else { - leafs = ins; - } - const stagelength = params.stageLength; - - const levels = Math.ceil(Math.log2(leafs)); - const w = spacing * (leafs / 2 + 1); - - const length = levels * (cw + stagelength) + stagelength; - const width = 2 * 0.5 * w * 2 * Math.pow(0.5, levels); - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - - for (let i = 0; i < leafs; i++) { - ports.push(new ComponentPort(((leafs - 1) * width) / 2 - i * width, length, (2 + i).toString(), LogicalLayerType.FLOW)); - } - - let count = 2 + leafs; - const lstartx = -0.5 * (cw + spacing); - const lendx = lstartx + cw; - const lstarty = stagelength + cw; - const lendy = lstarty + stagelength; - - const lcenterx = (lstartx + lendx) / 2; - const lcentery = lstarty + Math.abs(lstarty - lendy) / 4; - const valvewidth = params.width; - - const treeWidth = (leafs - 1) * spacing + leafs * cw + valvewidth; - - const leftEdge = -treeWidth / 2; - const rightEdge = treeWidth / 2; - - const rstartx = 0.5 * (spacing - cw); - const rendx = rstartx + cw; - const rstarty = stagelength + cw; - const rendy = rstarty + stagelength; - - const rcenterx = (rstartx + rendx) / 2; - const rcentery = rstarty + (Math.abs(rstarty - rendy) * 3) / 4; - - for (let i = 0; i < Math.log2(leafs); i++) { - ports.push(new ComponentPort(leftEdge, i * (cw + stagelength) + lcentery, count.toString(), LogicalLayerType.CONTROL)); - count++; - ports.push(new ComponentPort(rightEdge, i * (cw + stagelength) + rcentery, count.toString(), LogicalLayerType.CONTROL)); - count++; - } - - return ports; - } - - render2D(params: { [k: string]: any }, key: string): paper.CompoundPath { - if (key === "FLOW") { - return this.__drawFlow(params); - } else if (key === "CONTROL") { - return this.__drawControl(params); - } - throw new Error("Unknown key: " + key); - } - - render2DTarget(key: string | null, params: { [k: string]: any }): paper.CompoundPath { - const render = this.render2D(params, "FLOW"); - render?.addChild(this.render2D(params, "CONTROL") as paper.Item); - render!.fillColor!.alpha = 0.5; - return render; - } - - __generateMuxTwig(treepath: paper.CompoundPath, px: number, py: number, cw: number, stagelength: number, newspacing: number, level: number, maxlevel: number, islast = false): void { - // var newspacing = 2 * (spacing + cw); - const hspacing = newspacing / 2; - const lex = px - 0.5 * newspacing; - const ley = py + cw + stagelength; - const rex = px + 0.5 * newspacing; - const rey = py + cw + stagelength; - - if (level === maxlevel) { - islast = true; - // console.log("Final Spacing: " + newspacing) - } - - this.__drawmuxtwig(treepath, px, py, cw, stagelength, newspacing, islast); - - if (!islast) { - this.__generateMuxTwig(treepath, lex, ley, cw, stagelength, hspacing, level + 1, maxlevel); - this.__generateMuxTwig(treepath, rex, rey, cw, stagelength, hspacing, level + 1, maxlevel); - } - } - - __drawmuxtwig(treepath: paper.CompoundPath, px: number, py: number, cw: number, stagelength: number, spacing: number, drawleafs = false): paper.CompoundPath { - // stem - let startPoint = new paper.Point(px - cw / 2, py); - let endPoint = new paper.Point(px + cw / 2, py + stagelength); - let rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - strokeWidth: 0 - }); - - treepath.addChild(rec); - - // Draw 2 leafs - // left leaf - const lstartx = px - 0.5 * (cw + spacing); - const lendx = lstartx + cw; - const lstarty = py + stagelength + cw; - const lendy = lstarty + stagelength; - - // //right leaf - const rstartx = px + 0.5 * (spacing - cw); - const rendx = rstartx + cw; - const rstarty = py + stagelength + cw; - const rendy = rstarty + stagelength; - - if (drawleafs) { - startPoint = new paper.Point(lstartx, lstarty); - endPoint = new paper.Point(lendx, lendy); - rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - strokeWidth: 0 - }); - treepath.addChild(rec); - - startPoint = new paper.Point(rstartx, rstarty); - endPoint = new paper.Point(rendx, rendy); - rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - strokeWidth: 0 - }); - treepath.addChild(rec); - } - - // Horizontal bar - const hstartx = px - 0.5 * (cw + spacing); - const hendx = rendx; - const hstarty = py + stagelength; - const hendy = hstarty + cw; - startPoint = new paper.Point(hstartx, hstarty); - endPoint = new paper.Point(hendx, hendy); - rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - strokeWidth: 0 - }); - treepath.addChild(rec); - return treepath; - } - - __generateMuxControlTwig( - treepath: paper.CompoundPath, - px: number, - py: number, - cw: number, - ctlcw: number, - stagelength: number, - newspacing: number, - level: number, - maxlevel: number, - valvewidth: number, - valvelength: number, - leftEdge: number, - rightEdge: number, - islast = false - ): void { - // var newspacing = 2 * (spacing + cw); - const hspacing = newspacing / 2; - const lex = px - 0.5 * newspacing; - const ley = py + cw + stagelength; - const rex = px + 0.5 * newspacing; - const rey = py + cw + stagelength; - - if (level === maxlevel) { - islast = true; - // console.log("Final Spacing: " + newspacing) - } - - this.__drawmuxcontroltwig(treepath, px, py, cw, ctlcw, stagelength, newspacing, valvewidth, valvelength, leftEdge, rightEdge, islast); - - if (!islast) { - this.__generateMuxControlTwig(treepath, lex, ley, cw, ctlcw, stagelength, hspacing, level + 1, maxlevel, valvewidth, valvelength, leftEdge, rightEdge); - this.__generateMuxControlTwig(treepath, rex, rey, cw, ctlcw, stagelength, hspacing, level + 1, maxlevel, valvewidth, valvelength, leftEdge, rightEdge); - } - } - - __drawmuxcontroltwig( - treepath: paper.CompoundPath, - px: number, - py: number, - cw: number, - ctlcw: number, - stagelength: number, - spacing: number, - valvewidth: number, - valvelength: number, - leftEdge: number, - rightEdge: number, - drawleafs = false - ): paper.CompoundPath { - // stem - don't bother with valves - - // Draw 2 valves - // left leaf - const lstartx = px - 0.5 * (cw + spacing); - const lendx = lstartx + cw; - const lstarty = py + stagelength + cw; - const lendy = lstarty + stagelength; - - const lcenterx = (lstartx + lendx) / 2; - const lcentery = lstarty + Math.abs(lstarty - lendy) / 4; - - // //right leaf - const rstartx = px + 0.5 * (spacing - cw); - const rendx = rstartx + cw; - const rstarty = py + stagelength + cw; - const rendy = rstarty + stagelength; - - const rcenterx = (rstartx + rendx) / 2; - const rcentery = rstarty + (Math.abs(rstarty - rendy) * 3) / 4; - - let startPoint = new paper.Point(lcenterx - valvewidth / 2, lcentery - valvelength / 2); - let endPoint = new paper.Point(lcenterx + valvewidth / 2, lcentery + valvewidth / 2); - let rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - strokeWidth: 0 - }); - treepath.addChild(rec); - - const leftChannelStart = new paper.Point(startPoint.x, lcentery - ctlcw / 2); - const leftChannelEnd = new paper.Point(leftEdge, lcentery + ctlcw / 2); - - const leftChannel = new paper.Path.Rectangle({ - from: leftChannelStart, - to: leftChannelEnd, - radius: 0, - strokeWidth: 0 - }); - treepath.addChild(leftChannel); - - startPoint = new paper.Point(rcenterx - valvewidth / 2, rcentery - valvelength / 2); - endPoint = new paper.Point(rcenterx + valvewidth / 2, rcentery + valvewidth / 2); - rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - strokeWidth: 0 - }); - - treepath.addChild(rec); - const rightChannelStart = new paper.Point(endPoint.x, rcentery - ctlcw / 2); - const rightChannelEnd = new paper.Point(rightEdge, rcentery + ctlcw / 2); - - const rightChannel = new paper.Path.Rectangle({ - from: rightChannelStart, - to: rightChannelEnd, - radius: 0, - strokeWidth: 0 - }); - treepath.addChild(rightChannel); - - return treepath; - } -} diff --git a/src/app/library/node.ts b/src/app/library/node.ts deleted file mode 100755 index d0f30936..00000000 --- a/src/app/library/node.ts +++ /dev/null @@ -1,91 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Node extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - height: 100 - }; - - this.__units = { - componentSpacing: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 10, - height: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - height: 1000 - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "NODE"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const ports = []; - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - // Regardless of the key... - const pos = new paper.Point(0, 0); - const outerCircle = new paper.Path.Circle(pos, 0); - return outerCircle; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/picoinjection.ts b/src/app/library/picoinjection.ts deleted file mode 100644 index 559e284f..00000000 --- a/src/app/library/picoinjection.ts +++ /dev/null @@ -1,259 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class PicoInjection extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - height: "Float", - width: "Float", - injectorWidth: "Float", - injectorLength: "Float", - dropletWidth: "Float", - nozzleWidth: "Float", - nozzleLength: "Float", - electrodeDistance: "Float", - electrodeWidth: "Float", - electrodeLength: "Float", - rotation: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - height: 250, - width: 10 * 1000, - injectorWidth: 2 * 1000, - injectorLength: 3 * 1000, - dropletWidth: 0.8 * 1000, - nozzleWidth: 0.4 * 1000, - nozzleLength: 0.4 * 1000, - electrodeDistance: 0.8 * 1000, - electrodeWidth: 0.8 * 1000, - electrodeLength: 3 * 1000, - rotation: 0 - }; - - this.__units = { - componentSpacing: "μm", - height: "μm", - width: "μm", - injectorWidth: "μm", - injectorLength: "μm", - dropletWidth: "μm", - nozzleWidth: "μm", - nozzleLength: "μm", - electrodeDistance: "μm", - electrodeWidth: "μm", - electrodeLength: "μm", - rotation: "°" - }; - - this.__minimum = { - componentSpacing: 0, - height: 10, - width: 5 * 1000, - injectorWidth: 1000, - injectorLength: 1000, - dropletWidth: 100, - nozzleWidth: 80, - nozzleLength: 80, - electrodeDistance: 100, - electrodeWidth: 100, - electrodeLength: 1000, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - height: 1200, - width: 20 * 1000, - injectorWidth: 4000, - injectorLength: 5000, - dropletWidth: 2000, - nozzleWidth: 1000, - nozzleLength: 500, - electrodeDistance: 2000, - electrodeWidth: 2000, - electrodeLength: 5000, - rotation: 360 - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - cursorPosition: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - width: "width", - injectorWidth: "injectorWidth", - injectorLength: "injectorLength", - dropletWidth: "dropletWidth", - nozzleWidth: "nozzleWidth", - nozzleLength: "nozzleLength", - electrodeDistance: "electrodeDistance", - electrodeWidth: "electrodeWidth", - electrodeLength: "electrodeLength", - rotation: "rotation" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - width: "width", - injectorWidth: "injectorWidth", - injectorLength: "injectorLength", - dropletWidth: "dropletWidth", - nozzleWidth: "nozzleWidth", - nozzleLength: "nozzleLength", - electrodeDistance: "electrodeDistance", - electrodeWidth: "electrodeWidth", - electrodeLength: "electrodeLength", - rotation: "rotation" - }; - - this.__renderKeys = ["FLOW", "INTEGRATION"]; - - this.__mint = "PICOINJECTOR"; - - this.__zOffsetKeys = { - FLOW: "height", - INTEGRATION: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - INTEGRATION: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const width = params.width; - const injectorLength = params.injectorLength; - const dropletWidth = params.dropletWidth; - const nozzleLength = params.nozzleLength; - const electrodeDistance = params.electrodeDistance; - const electrodeWidth = params.electrodeWidth; - const electrodeLength = params.electrodeLength; - - const ports = []; - - // droplet channel - ports.push(new ComponentPort(-width / 2, 0, "1", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(width / 2, 0, "2", LogicalLayerType.FLOW)); - - // injector - ports.push(new ComponentPort(0, -dropletWidth / 2 - nozzleLength - injectorLength, "3", LogicalLayerType.FLOW)); - - return ports; - } - - __renderFlow(params: { [k: string]: any }) { - const rotation = params.rotation; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const width = params.width; - const injectorWidth = params.injectorWidth; - const injectorLength = params.injectorLength; - const dropletWidth = params.dropletWidth; - const nozzleWidth = params.nozzleWidth; - const nozzleLength = params.nozzleLength; - const serp = new paper.CompoundPath(""); - - // droplet channel - let topLeft = new paper.Point(x - width / 2, y - dropletWidth / 2); - let bottomRight = new paper.Point(x + width / 2, y + dropletWidth / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // nozzle - topLeft = new paper.Point(x - nozzleWidth / 2, y - dropletWidth / 2 - nozzleLength); - bottomRight = new paper.Point(x + nozzleWidth / 2, y - dropletWidth / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // injector - topLeft = new paper.Point(x - injectorWidth / 2, y - dropletWidth / 2 - nozzleLength - injectorLength); - bottomRight = new paper.Point(x + injectorWidth / 2, y - dropletWidth / 2 - nozzleLength); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - serp.rotate(rotation, new paper.Point(x, y)); - - serp.fillColor = color; - return serp; - } - - __renderIntegrate(params: { [k: string]: any }) { - const rotation = params.rotation; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const electrodeDistance = params.electrodeDistance; - const electrodeWidth = params.electrodeWidth; - const electrodeLength = params.electrodeLength; - const serp = new paper.CompoundPath(""); - - // middle electrode - let topLeft = new paper.Point(x - electrodeWidth / 2, y + electrodeDistance); - let bottomRight = new paper.Point(x + electrodeWidth / 2, y + electrodeDistance + electrodeLength); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // left electrode - topLeft = new paper.Point(x - electrodeWidth / 2 - 2 * electrodeWidth, y + electrodeDistance); - bottomRight = new paper.Point(x + electrodeWidth / 2 - 2 * electrodeWidth, y + electrodeDistance + electrodeLength); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // right electrode - topLeft = new paper.Point(x - electrodeWidth / 2 + 2 * electrodeWidth, y + electrodeDistance); - bottomRight = new paper.Point(x + electrodeWidth / 2 + 2 * electrodeWidth, y + electrodeDistance + electrodeLength); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - serp.rotate(rotation, new paper.Point(x, y)); - - serp.fillColor = color; - return serp; - } - - // render2DTarget(key, params) { - // const serp = this.render2D(params, key); - - // serp.fillColor.alpha = 0.5; - // return serp; - // } - - render2D(params: { [k: string]: any }, key = "FLOW") { - if (key === "FLOW") { - return this.__renderFlow(params); - } else if (key === "INTEGRATION") { - return this.__renderIntegrate(params); - } - throw new Error("Unknown render key found in PICOINJECTOR: " + key); - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const ret = new paper.CompoundPath(""); - const flow = this.render2D(params, "FLOW"); - const integrate = this.render2D(params, "INTEGRATION"); - ret.addChild(integrate); - ret.addChild(flow); - ret.fillColor = params.color; - ret.fillColor!.alpha = 0.5; - return ret; - } -} diff --git a/src/app/library/port.ts b/src/app/library/port.ts deleted file mode 100644 index 6de0fb25..00000000 --- a/src/app/library/port.ts +++ /dev/null @@ -1,105 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Port extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - portRadius: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - portRadius: 0.7 * 1000, - height: 1.1 * 1000 - }; - - this.__units = { - componentSpacing: "μm", - portRadius: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - portRadius: 0.8 * 10, - height: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - portRadius: 3000, - height: 1200 - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - portRadius: "portRadius" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - portRadius: "portRadius" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "PORT"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - render2D(params: { [k: string]: any }, key: string) { - // Regardless of the key... - const position = params.position; - const radius = params.portRadius; - const color1 = params.color; - const pos = new paper.Point(position[0], position[1]); - const outerCircle = new paper.Path.Circle(pos, radius); - outerCircle.fillColor = color1; - return outerCircle; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } - - getPorts(params: { [k: string]: any }) { - const radius = params.portRadius; - - const ports = []; - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - - return ports; - } -} diff --git a/src/app/library/pump.ts b/src/app/library/pump.ts deleted file mode 100644 index a98bb0f8..00000000 --- a/src/app/library/pump.ts +++ /dev/null @@ -1,228 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Pump extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - length: "Float", - width: "Float", - height: "Float", - spacing: "Float", - flowChannelWidth: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - width: 600, - length: 300, - height: 250, - spacing: 1000, - flowChannelWidth: 300 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - length: "μm", - width: "μm", - height: "μm", - spacing: "μm", - flowChannelWidth: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - rotation: 0, - width: 30, - length: 120, - height: 10, - spacing: 10, - flowChannelWidth: 1 - }; - - this.__maximum = { - componentSpacing: 10000, - rotation: 360, - width: 6000, - length: 24 * 1000, - height: 1200, - spacing: 10000, - flowChannelWidth: 10000 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - length: "length", - width: "width", - rotation: "rotation", - spacing: "spacing", - flowChannelWidth: "flowChannelWidth" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - length: "length", - width: "width", - rotation: "rotation", - spacing: "spacing", - flowChannelWidth: "flowChannelWidth" - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW", "CONTROL"]; - - this.__mint = "PUMP"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1" - }; - } - - getPorts(params: { [k: string]: any }) { - const l = params.length; - const w = params.width; - const spacing = params.spacing; - - const ports = []; - ports.push(new ComponentPort(0, -l / 2 - spacing, "1", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(0, l / 2 + spacing, "2", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(0, -spacing, "3", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(0, 0, "4", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(0, spacing, "5", LogicalLayerType.CONTROL)); - - return ports; - } - - __drawFlow(params: { [k: string]: any }) { - let rec; - const position = params.position; - const px = position[0]; - const py = position[1]; - const l = params.length; - const w = params.width; - const color = params.color; - const rotation = params.rotation; - const spacing = params.spacing; - const channelwidth = params.flowChannelWidth; - - const startX = px - w / 2; - const startY = py - l / 2; - const endX = px + w / 2; - const endY = py + l / 2; - - const ret = new paper.CompoundPath(""); - - const startPoint = new paper.Point(startX, startY); - const endPoint = new paper.Point(endX, endY); - - rec = new paper.Path.Rectangle({ - from: new paper.Point(px - channelwidth / 2, py - spacing - l / 2), - to: new paper.Point(px + channelwidth / 2, py + spacing + l / 2) - }); - - ret.addChild(rec); - - ret.fillColor = color; - ret.rotate(rotation, new paper.Point(px, py)); - return ret; - } - - __drawControl(params: { [k: string]: any }) { - let rec; - const position = params.position; - const px = position[0]; - const py = position[1]; - const l = params.length; - const w = params.width; - const color = params.color; - const rotation = params.rotation; - const spacing = params.spacing; - - const startX = px - w / 2; - const startY = py - l / 2; - const endX = px + w / 2; - const endY = py + l / 2; - - const ret = new paper.CompoundPath(""); - - const startPoint = new paper.Point(startX, startY); - const endPoint = new paper.Point(endX, endY); - - rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - fillColor: color, - strokeWidth: 0 - }); - - ret.addChild(rec); - - const topcenter = new paper.Point(px, py - spacing); - - rec = new paper.Path.Rectangle({ - from: new paper.Point(topcenter.x - w / 2, topcenter.y - l / 2), - to: new paper.Point(topcenter.x + w / 2, topcenter.y + l / 2) - }); - - ret.addChild(rec); - - const bottomcenter = new paper.Point(px, py + spacing); - rec = new paper.Path.Rectangle({ - from: new paper.Point(bottomcenter.x - w / 2, bottomcenter.y - l / 2), - to: new paper.Point(bottomcenter.x + w / 2, bottomcenter.y + l / 2) - }); - - ret.addChild(rec); - - ret.fillColor = color; - ret.rotate(rotation, new paper.Point(px, py)); - return ret; - } - - render2D(params: { [k: string]: any }, key = "FLOW") { - if (key === "FLOW") { - return this.__drawFlow(params); - } else if (key === "CONTROL") { - return this.__drawControl(params); - } - - throw new Error("Unknown key: " + key); - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const ret = new paper.CompoundPath(""); - const flow = this.render2D(params, "FLOW"); - const control = this.render2D(params, "CONTROL"); - ret.addChild(control as paper.Item); - ret.addChild(flow as paper.Item); - ret.fillColor = params.color; - ret.fillColor!.alpha = 0.5; - return ret; - } -} diff --git a/src/app/library/pump3D.ts b/src/app/library/pump3D.ts deleted file mode 100644 index e1546834..00000000 --- a/src/app/library/pump3D.ts +++ /dev/null @@ -1,281 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Pump3D extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - valveRadius: "Float", - height: "Float", - gap: "Float", - rotation: "Float", - spacing: "Float", - flowChannelWidth: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - valveRadius: 1.2 * 1000, - height: 250, - gap: 0.6 * 1000, - width: 2.4 * 1000, - length: 2.4 * 1000, - rotation: 90, - spacing: 5000, - flowChannelWidth: 300 - }; - - this.__units = { - componentSpacing: "μm", - valveRadius: "μm", - height: "μm", - gap: "μm", - width: "μm", - length: "μm", - rotation: "°", - spacing: "μm", - flowChannelWidth: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - valveRadius: 0.1 * 100, - height: 0.1 * 100, - gap: 0.5 * 10, - rotation: 0, - spacing: 10, - flowChannelWidth: 1 - }; - - this.__maximum = { - componentSpacing: 10000, - valveRadius: 0.2 * 10000, - height: 1.2 * 1000, - gap: 0.1 * 10000, - rotation: 360, - spacing: 10000, - flowChannelWidth: 10000 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - valveRadius: "valveRadius", - flowChannelWidth: "flowChannelWidth", - spacing: "spacing", - gap: "gap" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - rotation: "rotation", - valveRadius: "valveRadius", - flowChannelWidth: "flowChannelWidth", - spacing: "spacing", - gap: "gap" - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW", "CONTROL", "INVERSE"]; - - this.__mint = "PUMP3D"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height", - INVERSE: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1", - INVERSE: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const radius = params.valveRadius; - const spacing = params.spacing; - - const ports = []; - - ports.push(new ComponentPort(0, -spacing - radius, "1", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(0, spacing + radius, "2", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(0, -spacing, "3", LogicalLayerType.CONTROL)); - - ports.push(new ComponentPort(0, 0, "4", LogicalLayerType.CONTROL)); - - ports.push(new ComponentPort(0, spacing, "5", LogicalLayerType.CONTROL)); - return ports; - } - - render2D(params: { [k: string]: any }, key = "FLOW") { - if (key === "FLOW") { - return this.__drawFlow(params); - } else if (key === "CONTROL") { - return this.__drawControl(params); - } else if (key === "INVERSE") { - return this.__drawInverse(params); - } - throw new Error("Unknown key: " + key); - - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const ret = new paper.CompoundPath(""); - const flow = this.render2D(params, "FLOW"); - const control = this.render2D(params, "CONTROL"); - ret.addChild(control as paper.Item); - ret.addChild(flow as paper.Item); - ret.fillColor = params.color; - ret.fillColor!.alpha = 0.5; - return ret; - } - - __drawFlow(params: { [k: string]: any }) { - let valve; - let cutout; - let circ; - let center; - const ret = new paper.CompoundPath(""); - - const position = params.position; - const gap = params.gap; - const radius = params.valveRadius; - const color = params.color; - const rotation = params.rotation; - const spacing = params.spacing; - const channelwidth = params.flowChannelWidth; - - center = new paper.Point(position[0], position[1]); - // let h0p0, h0p1, h0p2, h1p0, h1p1, h1p2; - circ = new paper.Path.Circle(center, radius); - // circ.fillColor = color; - // if (String(color) === "3F51B5") { - cutout = new paper.Path.Rectangle({ - from: new paper.Point(position[0] - radius, position[1] - gap / 2), - to: new paper.Point(position[0] + radius, position[1] + gap / 2) - }); - // cutout.fillColor = "white"; - valve = circ.subtract(cutout); - ret.addChild(valve); - - const bottomcenter = new paper.Point(position[0], position[1] + spacing); - circ = new paper.Path.Circle(bottomcenter, radius); - // circ.fillColor = color; - // if (String(color) === "3F51B5") { - cutout = new paper.Path.Rectangle({ - from: new paper.Point(bottomcenter.x - radius, bottomcenter.y - gap / 2), - to: new paper.Point(bottomcenter.x + radius, bottomcenter.y + gap / 2) - }); - // cutout.fillColor = "white"; - valve = circ.subtract(cutout); - ret.addChild(valve); - - const topcenter = new paper.Point(position[0], position[1] - spacing); - - circ = new paper.Path.Circle(topcenter, radius); - // circ.fillColor = color; - // if (String(color) === "3F51B5") { - cutout = new paper.Path.Rectangle({ - from: new paper.Point(topcenter.x - radius, topcenter.y - gap / 2), - to: new paper.Point(topcenter.x + radius, topcenter.y + gap / 2) - }); - // cutout.fillColor = "white"; - valve = circ.subtract(cutout); - ret.addChild(valve); - - // Create the channels that go through - const bottomchannel = new paper.Path.Rectangle({ - from: new paper.Point(bottomcenter.x - channelwidth / 2, bottomcenter.y - gap / 2), - to: new paper.Point(center.x + channelwidth / 2, center.y + gap / 2) - }); - - ret.addChild(bottomchannel); - - const topchannel = new paper.Path.Rectangle({ - from: new paper.Point(topcenter.x - channelwidth / 2, topcenter.y + gap / 2), - to: new paper.Point(center.x + channelwidth / 2, center.y - gap / 2) - }); - - ret.addChild(topchannel); - - ret.rotate(rotation, center); - ret.fillColor = color; - - return ret; - } - - __drawControl(params: { [k: string]: any }) { - let circ; - const position = params.position; - const radius = params.valveRadius; - const color = params.color; - const rotation = params.rotation; - const spacing = params.spacing; - - const ret = new paper.CompoundPath(""); - - const center = new paper.Point(position[0], position[1]); - - circ = new paper.Path.Circle(center, radius); - ret.addChild(circ); - - const topcenter = new paper.Point(position[0], position[1] - spacing); - circ = new paper.Path.Circle(topcenter, radius); - ret.addChild(circ); - - const bottomcenter = new paper.Point(position[0], position[1] + spacing); - circ = new paper.Path.Circle(bottomcenter, radius); - ret.addChild(circ); - - ret.rotate(rotation, center); - ret.fillColor = color; - return ret; - } - - __drawInverse(params: { [k: string]: any }) { - let circ; - const position = params.position; - const radius = params.valveRadius; - const color = params.color; - const rotation = params.rotation; - const spacing = params.spacing; - - const ret = new paper.CompoundPath(""); - - const center = new paper.Point(position[0], position[1]); - - circ = new paper.Path.Circle(center, radius); - ret.addChild(circ); - - const topcenter = new paper.Point(position[0], position[1] - spacing); - circ = new paper.Path.Circle(topcenter, radius); - ret.addChild(circ); - - const bottomcenter = new paper.Point(position[0], position[1] + spacing); - circ = new paper.Path.Circle(bottomcenter, radius); - ret.addChild(circ); - - ret.rotate(rotation, center); - ret.fillColor = color; - return ret; - } -} diff --git a/src/app/library/rectValve.ts b/src/app/library/rectValve.ts deleted file mode 100644 index 717806cd..00000000 --- a/src/app/library/rectValve.ts +++ /dev/null @@ -1,95 +0,0 @@ -import Template from "./template"; -import paper from "paper"; - -export default class RectValve extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - portRadius: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - portRadius: 0.7 * 1000, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - portRadius: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - portRadius: 0.8 * 10, - height: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - portRadius: 2000, - height: 1200 - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW", "CONTROL"]; - - this.__mint = "VALVE"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1" - }; - } - - render2D(params: { [k: string]: any }, key: string) { - // Regardless of the key... - const start = params.start; - const end = params.end; - const color = params.color; - const width = params.width; - const baseColor = params.baseColor; - const startPoint = new paper.Point(start[0], start[1]); - const endPoint = new paper.Point(end[0], end[1]); - const vec = endPoint.subtract(startPoint); - const rec = new paper.Path.Rectangle({ - size: [vec.length, width], - point: start, - // radius: width/2, - fillColor: color, - strokeWidth: 0 - }); - rec.translate(([0, -width / 2] as unknown) as paper.Point); - rec.rotate(vec.angle, start); - return rec; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/rotaryMixer.ts b/src/app/library/rotaryMixer.ts deleted file mode 100755 index bc258b20..00000000 --- a/src/app/library/rotaryMixer.ts +++ /dev/null @@ -1,308 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class RotaryMixer extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - radius: "Float", - flowChannelWidth: "Float", - controlChannelWidth: "Float", - valveWidth: "Float", - valveLength: "Float", - valveSpacing: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - radius: 2000, - flowChannelWidth: 1000, - controlChannelWidth: 500, - valveWidth: 2.4 * 1000, - valveLength: 1 * 1000, - valveSpacing: 300, - valveRadius: 1.2 * 1000, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - radius: "μm", - flowChannelWidth: "μm", - controlChannelWidth: "μm", - valveWidth: "μm", - valveLength: "μm", - valveSpacing: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - radius: 0.1 * 5000, - flowChannelWidth: 0.1 * 1000, - controlChannelWidth: 0.1 * 1000, - valveWidth: 0.1 * 2.4 * 1000, - valveLength: 0.1 * 2.4 * 1000, - valveSpacing: 0.1 * 300, - valveRadius: 0.1 * 1.2 * 1000, - height: 0.1 * 200, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - radius: 10 * 5000, - flowChannelWidth: 10 * 1000, - controlChannelWidth: 10 * 1000, - valveWidth: 10 * 2.4 * 1000, - valveLength: 10 * 2.4 * 1000, - valveSpacing: 10 * 300, - valveRadius: 10 * 1.2 * 1000, - height: 10 * 200, - rotation: 360 - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - flowChannelWidth: "flowChannelWidth", - controlChannelWidth: "controlChannelWidth", - radius: "radius", - valveWidth: "valveWidth", - valveLength: "valveLength", - valveSpacing: "valveSpacing", - height: "height" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - flowChannelWidth: "flowChannelWidth", - controlChannelWidth: "controlChannelWidth", - radius: "radius", - valveWidth: "valveWidth", - valveLength: "valveLength", - valveSpacing: "valveSpacing", - height: "height" - }; - - this.__renderKeys = ["FLOW", "CONTROL"]; - - this.__mint = "ROTARY MIXER"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1" - }; - } - - getPorts(params: { [k: string]: any }) { - const radius = params.radius; - const valvespacing = params.valveSpacing; - const valvelength = params.valveLength; - const valvewidth = params.valveWidth; - const flowChannelWidth = params.flowChannelWidth; // params["flowChannelWidth"]; - const channellength = radius + valvelength + 2 * valvespacing + flowChannelWidth; // This needs to be a real expression - - const ports = []; - - ports.push(new ComponentPort(channellength, -radius - flowChannelWidth / 2, "1", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(-channellength, radius + flowChannelWidth / 2, "2", LogicalLayerType.FLOW)); - - // top right - ports.push( - new ComponentPort(radius + flowChannelWidth + valvespacing + valvelength / 2, -radius - flowChannelWidth / 2 - valvewidth, "3", LogicalLayerType.CONTROL) - ); - // top bottom - ports.push(new ComponentPort(0, -radius - flowChannelWidth / 2 - valvewidth, "4", LogicalLayerType.CONTROL)); - // middle right - ports.push(new ComponentPort(flowChannelWidth / 2 + radius + valvewidth, 0, "5", LogicalLayerType.CONTROL)); - // bottom middle - ports.push(new ComponentPort(0, radius + flowChannelWidth / 2 + valvewidth, "6", LogicalLayerType.CONTROL)); - // bottom left - ports.push( - new ComponentPort(-radius - valvespacing - valvelength - flowChannelWidth / 2, radius + flowChannelWidth / 2 + valvewidth, "7", LogicalLayerType.CONTROL) - ); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - if (key === "FLOW") { - return this.__renderFlow(params); - } else if (key === "CONTROL") { - return this.__renderControl(params); - } - throw new Error("No valid key found"); - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const rotarymixer_flow = this.__renderFlow(params); - const rotarymixer_control = this.__renderControl(params); - const ret = new paper.CompoundPath(""); - ret.addChild(rotarymixer_flow); - ret.addChild(rotarymixer_control); - ret.fillColor = params.color; - ret.fillColor!.alpha = 0.5; - - return ret; - } - - __renderFlow(params: { [k: string]: any }) { - const position = params.position; - const radius = params.radius; - const color = params.color; - const rotation = params.rotation; - const valvespacing = params.valveSpacing; - const valvelength = params.valveLength; - const valvewidth = params.valveWidth; - const flowChannelWidth = params.flowChannelWidth; // params["flowChannelWidth"]; - const px = position[0]; - const py = position[1]; - const center = new paper.Point(px, py); - const channellength = radius + valvelength + 2 * valvespacing + flowChannelWidth; // This needs to be a real expression - - const rotarymixer = new paper.CompoundPath(""); - - const innercirc = new paper.Path.Circle(center, radius); - const outercirc = new paper.Path.Circle(center, radius + flowChannelWidth); - - let rotary = outercirc.subtract(innercirc); - - let topleft = new paper.Point(px - valvelength / 2, py - radius - flowChannelWidth / 2 - valvewidth / 2); - const topmiddlerectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth)); - rotary = rotary.subtract(topmiddlerectangle); - - topleft = new paper.Point(px + radius + flowChannelWidth / 2 - valvewidth / 2, py - valvelength / 2); - const middlerightrectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvewidth, valvelength)); - rotary = rotary.subtract(middlerightrectangle); - - topleft = new paper.Point(px - valvelength / 2, py + radius + flowChannelWidth / 2 - valvewidth / 2); - const bottommiddlerectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth)); - rotary = rotary.subtract(bottommiddlerectangle); - - rotarymixer.addChild(rotary); - - const point1 = new paper.Point(px, py - radius - flowChannelWidth); - const point2 = new paper.Point(px + channellength, py - radius); - let rectangle: paper.Path.Rectangle | paper.PathItem = new paper.Path.Rectangle(point1, point2); - - topleft = new paper.Point(px + radius + flowChannelWidth + valvespacing, py - radius - flowChannelWidth / 2 - valvewidth / 2); - const topleftrectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth)); - rectangle = rectangle.subtract(topleftrectangle); - - rectangle = rectangle.subtract(topmiddlerectangle); - - rotarymixer.addChild(rectangle); - - const point3 = new paper.Point(px - channellength, py + radius); - const point4 = new paper.Point(px, py + radius + flowChannelWidth); - let rectangle2: paper.Path.Rectangle | paper.PathItem = new paper.Path.Rectangle(point3, point4); - - topleft = new paper.Point(px - radius - valvespacing - valvelength - flowChannelWidth, py + radius + flowChannelWidth / 2 - valvewidth / 2); - const bottomleftrectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth)); - rectangle2 = rectangle2.subtract(bottomleftrectangle); - - rectangle2 = rectangle2.subtract(bottommiddlerectangle); - - rotarymixer.addChild(rectangle2); - - rotarymixer.fillColor = color; - rotarymixer.rotate(rotation, new paper.Point(px, py)); - return rotarymixer; - } - - __renderControl(params: { [k: string]: any }) { - const position = params.position; - const radius = params.radius; - const color = params.color; - const rotation = params.rotation; - const valvespacing = params.valveSpacing; - const valvelength = params.valveLength; - const valvewidth = params.valveWidth; - const flowChannelWidth = params.flowChannelWidth; - const controlChannelWidth = params.controlChannelWidth; // params["flowChannelWidth"]; - const px = position[0]; - const py = position[1]; - - const rotarymixer = new paper.CompoundPath(""); - let topleft = null; - const bottomright = null; - - // Draw top right valve - topleft = new paper.Point(px + radius + flowChannelWidth + valvespacing, py - radius - flowChannelWidth / 2 - valvewidth / 2); - const topleftrectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth)); - rotarymixer.addChild(topleftrectangle); - - let topLeft = new paper.Point(px + radius + flowChannelWidth + valvespacing + valvelength / 2 - controlChannelWidth / 2, py - radius - flowChannelWidth / 2 - valvewidth); - let bottomRight = new paper.Point(px + radius + flowChannelWidth + valvespacing + valvelength / 2 + controlChannelWidth / 2, py - radius); - rotarymixer.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // Draw top middle valve - topleft = new paper.Point(px - valvelength / 2, py - radius - flowChannelWidth / 2 - valvewidth / 2); - const topmiddlerectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth)); - rotarymixer.addChild(topmiddlerectangle); - - topLeft = new paper.Point(px - controlChannelWidth / 2, py - radius - flowChannelWidth / 2 - valvewidth); - bottomRight = new paper.Point(px + controlChannelWidth / 2, py - radius); - rotarymixer.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // Draw middle right valve - topleft = new paper.Point(px + radius + flowChannelWidth / 2 - valvewidth / 2, py - valvelength / 2); - const middlerightrectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvewidth, valvelength)); - rotarymixer.addChild(middlerightrectangle); - - topLeft = new paper.Point(px + flowChannelWidth / 2 + radius, py - controlChannelWidth / 2); - bottomRight = new paper.Point(px + flowChannelWidth / 2 + radius + valvewidth, py + controlChannelWidth / 2); - rotarymixer.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // Draw Bottom middle valve - topleft = new paper.Point(px - valvelength / 2, py + radius + flowChannelWidth / 2 - valvewidth / 2); - const bottommiddlerectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth)); - rotarymixer.addChild(bottommiddlerectangle); - - topLeft = new paper.Point(px - controlChannelWidth / 2, py + radius + flowChannelWidth / 2); - bottomRight = new paper.Point(px + controlChannelWidth / 2, py + radius + flowChannelWidth / 2 + valvewidth); - rotarymixer.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // Draw bottom left valve - topleft = new paper.Point(px - radius - valvespacing - valvelength - flowChannelWidth, py + radius + flowChannelWidth / 2 - valvewidth / 2); - const bottomleftrectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth)); - rotarymixer.addChild(bottomleftrectangle); - - topLeft = new paper.Point(px - radius - valvespacing - valvelength - flowChannelWidth / 2 - controlChannelWidth / 2, py + radius + flowChannelWidth / 2); - bottomRight = new paper.Point(px - radius - valvespacing - valvelength - flowChannelWidth / 2 + controlChannelWidth / 2, py + radius + flowChannelWidth / 2 + valvewidth); - rotarymixer.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - rotarymixer.fillColor = color; - rotarymixer.rotate(rotation, new paper.Point(px, py)); - return rotarymixer; - } -} diff --git a/src/app/library/roundedChannel.ts b/src/app/library/roundedChannel.ts deleted file mode 100644 index 9bfc1df7..00000000 --- a/src/app/library/roundedChannel.ts +++ /dev/null @@ -1,100 +0,0 @@ -import Template from "./template"; -import paper from "paper"; - -export default class RoundedChannel extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - start: "Point", - end: "Point" - }; - - this.__heritable = { - channelWidth: "Float", - height: "Float" - }; - - this.__defaults = { - channelWidth: 0.8 * 1000, - height: 250 - }; - - this.__units = { - channelWidth: "μm", - height: "μm" - }; - - this.__minimum = { - channelWidth: 3, - height: 10 - }; - - this.__maximum = { - channelWidth: 2000, - height: 1200 - }; - - this.__featureParams = { - start: "start", - end: "end", - width: "channelWidth" - }; - - this.__targetParams = { - diameter: "channelWidth" - }; - - this.__placementTool = "DragTool"; - - this.__toolParams = { - start: "start", - end: "end" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "ROUNDED CHANNEL"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - render2D(params: { [k: string]: any }, key: string) { - const start = params.start; - const end = params.end; - const color = params.color; - const width = params.width; - const baseColor = params.baseColor; - const startPoint = new paper.Point(start[0], start[1]); - const endPoint = new paper.Point(end[0], end[1]); - const vec = endPoint.subtract(startPoint); - const rec = new paper.Path.Rectangle({ - size: [vec.length + width, width], - point: start, - radius: width / 2, - fillColor: color, - strokeWidth: 0 - }); - rec.translate(([-width / 2, -width / 2] as unknown) as paper.Point); - rec.rotate(vec.angle, start); - return rec; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const position = params.position; - const radius = params.diameter; - const color1 = params.color; - const pos = new paper.Point(position[0], position[1]); - const outerCircle = new paper.Path.Circle(pos, radius); - outerCircle.fillColor = color1; - return outerCircle; - } -} diff --git a/src/app/library/sorter.ts b/src/app/library/sorter.ts deleted file mode 100644 index 244ce910..00000000 --- a/src/app/library/sorter.ts +++ /dev/null @@ -1,374 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Sorter extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - height: "Float", - inletWidth: "Float", - inletLength: "Float", - electrodeDistance: "Float", - electrodeWidth: "Float", - electrodeLength: "Float", - outletWidth: "Float", - angle: "Float", - wasteWidth: "Float", - outputLength: "Float", - keepWidth: "Float", - pressureWidth: "Float", - pressureSpacing: "Float", - numberofDistributors: "Float", - channelDepth: "Float", - electrodeDepth: "Float", - pressureDepth: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - height: 250, - inletWidth: 0.8 * 1000, - inletLength: 4 * 1000, - electrodeDistance: 1 * 1000, - electrodeWidth: 0.7 * 1000, - electrodeLength: 5 * 1000, - outletWidth: 0.8 * 1000, - angle: 45, - wasteWidth: 1.2 * 1000, - outputLength: 4 * 1000, - keepWidth: 2 * 1000, - pressureWidth: 0.4 * 1000, - pressureSpacing: 1.5 * 1000, - numberofDistributors: 5, - channelDepth: 1000, - electrodeDepth: 1000, - pressureDepth: 1000 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - height: "μm", - inletWidth: "μm", - inletLength: "μm", - electrodeDistance: "μm", - electrodeWidth: "μm", - electrodeLength: "μm", - outletWidth: "μm", - angle: "°", - wasteWidth: "μm", - outputLength: "μm", - keepWidth: "μm", - pressureWidth: "μm", - pressureSpacing: "μm", - numberofDistributors: "μm", - channelDepth: "μm", - electrodeDepth: "μm", - pressureDepth: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - rotation: 0, - height: 10, - inletWidth: 0.5 * 1000, - inletLength: 2 * 1000, - electrodeDistance: 0.5 * 1000, - electrodeWidth: 0.5 * 1000, - electrodeLength: 2.5 * 1000, - outletWidth: 0.5 * 1000, - angle: 0, - wasteWidth: 0.5 * 1000, - outputLength: 2 * 1000, - keepWidth: 2 * 1000, - pressureWidth: 0.2 * 1000, - pressureSpacing: 0.5 * 1000, - numberofDistributors: 1, - channelDepth: 1000, - electrodeDepth: 1000, - pressureDepth: 1000 - }; - - this.__maximum = { - componentSpacing: 10000, - rotation: 360, - height: 1200, - inletWidth: 2 * 1000, - inletLength: 6 * 1000, - electrodeDistance: 1.5 * 1000, - electrodeWidth: 1.5 * 1000, - electrodeLength: 7.5 * 1000, - outletWidth: 2 * 1000, - angle: 180, - wasteWidth: 1.5 * 1000, - outputLength: 6 * 1000, - keepWidth: 3.5 * 1000, - pressureWidth: 1 * 1000, - pressureSpacing: 2 * 1000, - numberofDistributors: 10, - channelDepth: 1000, - electrodeDepth: 1000, - pressureDepth: 1000 - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - cursorPosition: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - inletWidth: "inletWidth", - inletLength: "inletLength", - electrodeDistance: "electrodeDistance", - electrodeWidth: "electrodeWidth", - electrodeLength: "electrodeLength", - outletWidth: "outletWidth", - angle: "angle", - wasteWidth: "wasteWidth", - outputLength: "outputLength", - keepWidth: "keepWidth", - pressureWidth: "pressureWidth", - pressureSpacing: "pressureSpacing", - numberofDistributors: "numberofDistributors", - channelDepth: "channelDepth", - electrodeDepth: "electrodeDepth", - pressureDepth: "pressureDepth" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - rotation: "rotation", - inletWidth: "inletWidth", - inletLength: "inletLength", - electrodeDistance: "electrodeDistance", - electrodeWidth: "electrodeWidth", - electrodeLength: "electrodeLength", - outletWidth: "outletWidth", - angle: "angle", - wasteWidth: "wasteWidth", - outputLength: "outputLength", - keepWidth: "keepWidth", - pressureWidth: "pressureWidth", - pressureSpacing: "pressureSpacing", - numberofDistributors: "numberofDistributors", - channelDepth: "channelDepth", - electrodeDepth: "electrodeDepth", - pressureDepth: "pressureDepth" - }; - - this.__renderKeys = ["FLOW", "INTEGRATION"]; - - this.__mint = "DROPLET SORTER"; - - this.__zOffsetKeys = { - FLOW: "height", - INTEGRATION: "electrodeDepth" - }; - - this.__substrateOffset = { - FLOW: "0", - INTEGRATION: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const inletLength = params.inletLength; - const angle = params.angle; - const outputLength = params.outputLength; - const pressureWidth = params.pressureWidth; - const pressureSpacing = params.pressureSpacing; - const numberofDistributors = params.numberofDistributors; - - const outletLen = ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth)) / Math.cos(((angle / 2) * Math.PI) / 180); - - const ports = []; - - ports.push(new ComponentPort(-inletLength, 0, "1", LogicalLayerType.FLOW)); - - ports.push( - new ComponentPort( - outletLen * Math.cos(((angle / 2) * Math.PI) / 180) + outputLength, - -((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth) - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180), - "2", - LogicalLayerType.FLOW - ) - ); - - ports.push( - new ComponentPort( - outletLen * Math.cos(((angle / 2) * Math.PI) / 180) + outputLength, - ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth) - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180), - "3", - LogicalLayerType.FLOW - ) - ); - - return ports; - } - - __renderFlow(params: { [k: string]: any }) { - const rotation = params.rotation; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const inletWidth = params.inletWidth; - const inletLength = params.inletLength; - const outletWidth = params.outletWidth; - const angle = params.angle; - const wasteWidth = params.wasteWidth; - const outputLength = params.outputLength; - const keepWidth = params.keepWidth; - const pressureWidth = params.pressureWidth; - const pressureSpacing = params.pressureSpacing; - const numberofDistributors = params.numberofDistributors; - const serp = new paper.CompoundPath(""); - - // pressure distributors - for (let i = 0; i < numberofDistributors; i++) { - const newRightX = (i + 1.5) * (pressureSpacing + pressureWidth); - - const newLeftX = newRightX - pressureWidth; - - const pHeight = (newRightX - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180); - // upper - let topLeft = new paper.Point(x + newLeftX, y - pHeight); - let bottomRight = new paper.Point(x + newRightX, y); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // lower - topLeft = new paper.Point(x + newLeftX, y + pHeight); - bottomRight = new paper.Point(x + newRightX, y); - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - } - - const outletLen = ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth)) / Math.cos(((angle / 2) * Math.PI) / 180); - let topLeft = new paper.Point(x, y - outletWidth / 2); - let bottomRight = new paper.Point(x + outletLen, y + outletWidth / 2); - - // upper outlet - let outlet = new paper.Path.Rectangle(topLeft, bottomRight); - outlet.rotate(-angle / 2, new paper.Point(x, y)); - serp.addChild(outlet); - - // lower outlet - outlet = new paper.Path.Rectangle(topLeft, bottomRight); - outlet.rotate(angle / 2, new paper.Point(x, y)); - serp.addChild(outlet); - - // inlet - topLeft = new paper.Point(x - inletLength, y - inletWidth / 2); - bottomRight = new paper.Point(x, y + inletWidth / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // waste - topLeft = new paper.Point( - x + outletLen * Math.cos(((angle / 2) * Math.PI) / 180), - y - ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth) - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180) - wasteWidth / 2 - ); - bottomRight = new paper.Point( - x + outletLen * Math.cos(((angle / 2) * Math.PI) / 180) + outputLength, - y - ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth) - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180) + wasteWidth / 2 - ); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // keep - topLeft = new paper.Point( - x + outletLen * Math.cos(((angle / 2) * Math.PI) / 180), - y + ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth) - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180) - keepWidth / 2 - ); - bottomRight = new paper.Point( - x + outletLen * Math.cos(((angle / 2) * Math.PI) / 180) + outputLength, - y + ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth) - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180) + keepWidth / 2 - ); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - serp.rotate(rotation, new paper.Point(x, y)); - - serp.fillColor = color; - return serp; - } - - __renderIntegrate(params: { [k: string]: any }) { - const rotation = params.rotation; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const electrodeDistance = params.electrodeDistance; - const electrodeWidth = params.electrodeWidth; - const electrodeLength = params.electrodeLength; - const angle = params.angle; - const serp = new paper.CompoundPath(""); - - // middle electrode - let topLeft = new paper.Point(x - electrodeWidth / 2, y + electrodeDistance); - let bottomRight = new paper.Point(x + electrodeWidth / 2, y + electrodeDistance + electrodeLength); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // left electrode - topLeft = new paper.Point(x - electrodeWidth / 2 - 2 * electrodeWidth, y + electrodeDistance); - bottomRight = new paper.Point(x + electrodeWidth / 2 - 2 * electrodeWidth, y + electrodeDistance + electrodeLength); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // right electrode - topLeft = new paper.Point(x - electrodeWidth / 2 + 2 * electrodeWidth, y + electrodeDistance + 2 * electrodeWidth * Math.tan(((angle / 2) * Math.PI) / 180)); - bottomRight = new paper.Point( - x + electrodeWidth / 2 + 2 * electrodeWidth, - y + electrodeDistance + 2 * electrodeWidth * Math.tan(((angle / 2) * Math.PI) / 180) + electrodeLength - ); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - serp.rotate(rotation, new paper.Point(x, y)); - - serp.fillColor = color; - return serp; - } - - // render2DTarget(key, params) { - // const serp = this.render2D(params, key); - - // serp.fillColor.alpha = 0.5; - // return serp; - // } - - render2D(params: { [k: string]: any }, key = "FLOW") { - if (key === "FLOW") { - return this.__renderFlow(params); - } else if (key === "INTEGRATION") { - return this.__renderIntegrate(params); - } - throw new Error("Unknown render key found in DROPLET SORTER: " + key); - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const ret = new paper.CompoundPath(""); - const flow = this.render2D(params, "FLOW"); - const integrate = this.render2D(params, "INTEGRATION"); - ret.addChild(integrate); - ret.addChild(flow); - ret.fillColor = params.color; - ret.fillColor!.alpha = 0.5; - return ret; - } -} diff --git a/src/app/library/splitter.ts b/src/app/library/splitter.ts deleted file mode 100644 index 60c9980c..00000000 --- a/src/app/library/splitter.ts +++ /dev/null @@ -1,188 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Splitter extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - height: "Float", - inletWidth: "Float", - inletLength: "Float", - outletWidth1: "Float", - outletLength1: "Float", - outletWidth2: "Float", - outletLength2: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - height: 250, - inletWidth: 2 * 1000, - inletLength: 6 * 1000, - outletWidth1: 1 * 1000, - outletLength1: 3 * 1000, - outletWidth2: 2 * 1000, - outletLength2: 3 * 1000 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - height: "μm", - inletWidth: "μm", - inletLength: "μm", - outletWidth1: "μm", - outletLength1: "μm", - outletWidth2: "μm", - outletLength2: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - rotation: 0, - height: 10, - inletWidth: 1 * 1000, - inletLength: 3 * 1000, - outletWidth1: 0.5 * 1000, - outletLength1: 2 * 1000, - outletWidth2: 0.5 * 1000, - outletLength2: 2 * 1000 - }; - - this.__maximum = { - componentSpacing: 10000, - rotation: 360, - height: 1200, - inletWidth: 3 * 1000, - inletLength: 8 * 1000, - outletWidth1: 3 * 1000, - outletLength1: 5 * 1000, - outletWidth2: 3 * 1000, - outletLength2: 5 * 1000 - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - cursorPosition: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - height: "height", - inletWidth: "inletWidth", - inletLength: "inletLength", - outletWidth1: "outletWidth1", - outletLength1: "outletLength1", - outletWidth2: "outletWidth2", - outletLength2: "outletLength2" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - rotation: "rotation", - height: "height", - inletWidth: "inletWidth", - inletLength: "inletLength", - outletWidth1: "outletWidth1", - outletLength1: "outletLength1", - outletWidth2: "outletWidth2", - outletLength2: "outletLength2" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "DROPLET SPLITTER"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const inletWidth = params.inletWidth; - const inletLength = params.inletLength; - const outletWidth1 = params.outletWidth1; - const outletLength1 = params.outletLength1; - const outletWidth2 = params.outletWidth2; - const outletLength2 = params.outletLength2; - - const ports = []; - - // inlet - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - - // outlet 1 - ports.push(new ComponentPort(inletLength - outletWidth1 / 2, -inletWidth / 2 - outletLength1, "2", LogicalLayerType.FLOW)); - - // outlet 2 - ports.push(new ComponentPort(inletLength - outletWidth2 / 2, inletWidth / 2 + outletLength2, "3", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - const rotation = params.rotation; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const inletWidth = params.inletWidth; - const inletLength = params.inletLength; - const outletWidth1 = params.outletWidth1; - const outletLength1 = params.outletLength1; - const outletWidth2 = params.outletWidth2; - const outletLength2 = params.outletLength2; - - const serp = new paper.CompoundPath(""); - - // inlet - let topLeft = new paper.Point(x, y - inletWidth / 2); - let bottomRight = new paper.Point(x + inletLength, y + inletWidth / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // outlet 1 - topLeft = new paper.Point(x + inletLength - outletWidth1, y - inletWidth / 2 - outletLength1); - bottomRight = new paper.Point(x + inletLength, y - inletWidth / 2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // outlet 2 - topLeft = new paper.Point(x + inletLength - outletWidth2, y + inletWidth / 2); - bottomRight = new paper.Point(x + inletLength, y + inletWidth / 2 + outletLength2); - - serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - serp.rotate(rotation, new paper.Point(x, y)); - - serp.fillColor = color; - return serp; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const serp = this.render2D(params, key); - serp.fillColor!.alpha = 0.5; - return serp; - } -} diff --git a/src/app/library/template.ts b/src/app/library/template.ts deleted file mode 100755 index c736a4b3..00000000 --- a/src/app/library/template.ts +++ /dev/null @@ -1,446 +0,0 @@ -import ComponentPort from "../core/componentPort"; -import { ToolPaperObject } from "../core/init"; -import paper from "paper"; -//import { ManufacturingInfo } from "../manufacturing/ManufacturingInfo"; -import { LogicalLayerType } from "../core/init"; -import {PRIMITIVES_SERVER} from "../../componentAPI"; -export enum PositionToolType { - FEATURE_POSITION_TOOL = "positionTool", - COMPONENT_POSITION_TOOL = "componentPositionTool", - MULTILAYER_POSITION_TOOL = "multilayerPositionTool", - VALVE_INSERTION_TOOL = "valveInsertionTool" -} - -export default class Template { - protected __unique: { [key: string]: string } | null = null; - protected __heritable: { [key: string]: string } | null = null; - protected __defaults: { [key: string]: number } | null = null; - protected __minimum: { [key: string]: number } | null = null; - protected __maximum: { [key: string]: number } | null = null; - protected __units: { [key: string]: string } | null = null; - protected __placementTool: string | null = null; - protected __toolParams: { [key: string]: string } | null = null; // { position: "position" }; - protected __featureParams: { [key: string]: string } | null = null; - protected __targetParams: { [key: string]: string } | null = null; - protected __mint: string | null = null; - protected __renderKeys: Array = ["FLOW"]; - protected _previewImage: string = ""; - protected __zOffsetKeys: { [key: string]: string } | null = null; - protected __substrateOffset: { [key: string]: string } | null = null; - protected __childFeatureMacros: Array = []; // Store all the macro names - - /** - *Creates an instance of Template. - * @memberof Template - */ - constructor() { - this.__setupDefinitions(); - } - - /** - * Returns the mint definition for the component definition - * - * @readonly - * @type {string} - * @memberof Template - */ - get mint(): string { - if (this.__mint === null) { - throw new Error("User needs to provide unique MINT string for component type"); - } - return this.__mint; - } - - /** - * Returns the z-offset-key for the given layer type - * - * @param {string} - * @memberof Template - */ - zOffsetKey(key: string): string { - if (this.__zOffsetKeys === null) { - throw new Error("zOffsetKey cannot be null instantiate in the __setupDefinitions"); - } else if (this.__zOffsetKeys.hasOwnProperty(key)) { - return this.__zOffsetKeys[key]; - } else { - throw new Error("zOffsetKey does not contain key " + key); - } - } - - /** - * Returns the z-offset-key for the given layer type - * - * @param {string} - * @memberof Template - */ - substrateOffset(key: string): string { - if (this.__substrateOffset === null) { - throw new Error("substrateOffset cannot be null instantiate in the __setupDefinitions"); - } else if (this.__substrateOffset.hasOwnProperty(key)) { - return this.__substrateOffset[key]; - } else { - throw new Error("substrateOffset does not contain key " + key); - } - } - - /** - * TODO - Remove this thing's dependency - */ - get featureParams(): { [key: string]: string } { - if (this.__featureParams === null) { - throw new Error("featureParams cannot be null instantiate in the __setupDefinitions"); - } - - return this.__featureParams; - } - - /** - * TODO - Remove this thing's dependency - */ - get targetParams(): { [key: string]: string } { - if (this.__targetParams === null) { - throw new Error("targetParams cannot be null instantiate in the __setupDefinitions"); - } - - return this.__targetParams; - } - - /** - * Returns the placement tool for the component/feature - * - * @readonly - * @type {string} - * @memberof Template - */ - get placementTool(): string { - if (this.__placementTool === null) { - throw new Error("placementtool cannot be null instantiate in the __setupDefinitions"); - } - - return this.__placementTool; - } - - /** - * Returns the tool params for the component - * - * @readonly - * @type {{ [key: string]: string }} - * @memberof Template - */ - get toolParams(): { [key: string]: string } { - if (this.__toolParams === null) { - throw new Error("toolparams cannot be null instantiate in the __setupDefinitions"); - } - - return this.__toolParams; - } - - /** - * Returns the default value for the component params - * - * @readonly - * @type {{ [key: string]: number }} - * @memberof Template - */ - get defaults(): { [key: string]: number } { - if (this.__defaults === null) { - throw new Error("defaults cannot be null instantiate in the __setupDefinitions"); - } - - return this.__defaults; - } - - /** - * Returns the min value for the component params - * - * @readonly - * @type {{ [key: string]: number }} - * @memberof Template - */ - get minimum(): { [key: string]: number } { - if (this.__minimum === null) { - throw new Error("minimum cannot be null instantiate in the __setupDefinitions"); - } - - return this.__minimum; - } - - /** - * Returns the max value for the component params - * - * @readonly - * @type {{ [key: string]: number }} - * @memberof Template - */ - get maximum(): { [key: string]: number } { - if (this.__maximum === null) { - throw new Error("maximum cannot be null instantiate in the __setupDefinitions"); - } - - return this.__maximum; - } - - /** - * Returns the units for the component params - * - * @readonly - * @type {{ [key: string]: string }} - * @memberof Template - */ - get units(): { [key: string]: string } { - if (this.__units === null) { - throw new Error("units cannot be null instantiate in the __setupDefinitions"); - } - - return this.__units; - } - - /** - * Returns the unique params for the component definition - * - * @readonly - * @type {{ [key: string]: string }} - * @memberof Template - */ - get unique(): { [key: string]: string } { - if (this.__unique === null) { - throw new Error("unique cannot be null instantiate in the __setupDefinitions"); - } - - return this.__unique; - } - - /** - * Returns the heritable properties for the component definition - * - * @readonly - * @type {{ [key: string]: string }} - * @memberof Template - */ - get heritable(): { [key: string]: string } { - if (this.__heritable === null) { - throw new Error("Heritable cannot be null instantiate in the __setupDefinitions"); - } - return this.__heritable; - } - - /** - * Returns the renderkeys for the component definition - * - * @readonly - * @type {Array} - * @memberof Template - */ - get renderKeys(): Array { - if (this.__renderKeys === null) { - throw new Error("renderKeys cannot be null instantiate in the __setupDefinitions"); - } - - return this.__renderKeys; - } - - /** - * Returns the preview link for the component - * - * @readonly - * @type {string} - * @memberof Template - */ - get previewImage(): string { - return this._previewImage; - } - get childFeatureMacros(): Array { - return this.__childFeatureMacros; - } - - - /** - * Override this method to setup the definitions for the component - * - * @memberof Template - */ - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - height: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - height: 1200 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position" - }; - - this.__targetParams = { - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "TEMPLATE"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - - /* - Check https://github.com/CIDARLAB/3DuF/wiki/Adding-new-components-v2 for more example data - */ - //throw new Error("User needs to provide method for component definition, look at examples"); - } - - /* - * Replacing /src/app/view/render2D/primitiveSets2D/basic2D - */ - - /** - * Returns the paperjs render for a given key (can be control/flow or anything user defined key that for future - * compatibility. - * @param key - */ - render2D(params: { [key: string]: any }, key: string): ToolPaperObject { - console.error("Default component template being used. User needs to provide method for component definition, look at examples"); - const x = params.position[0]; - const y = params.position[1]; - - const rect = new paper.Path.Rectangle(new paper.Point(x - 100, y - 100), new paper.Size(5000, 5000)); - rect.fillColor = params.color; - return rect; - } - - - /** - * Returns the render target for the component - * - * @param {string} key - * @param {{ [key: string]: any }} params - * @returns {ToolPaperObject} - * @memberof Template - */ - render2DTarget(key: string | null, params: { [key: string]: any }): ToolPaperObject { - throw new Error("User needs to provide method for component definition, look at examples"); - } - - /** - * Returns the ports for the component definition - * @param params - */ - getPorts(params: { [key: string]: any }): Array { - console.error("User needs to provide method for component definition, look at examples"); - const ports = []; - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - return ports; - } - - /** - * Returns the bounds for component for given params. This assummes that the mint definiton, - * render2D is implemented for the given defintion. - * - * @param {{ [key: string]: any }} params - * @returns {paper.Rectangle} - * @memberof Template - */ - getBounds(params: { [key: string]: any }): paper.Rectangle{ - const renderkeys = this.renderKeys; - const features: Array = []; - for (let i = 0; i < renderkeys.length; i++) { - const feature = this.render2D(params, renderkeys[i]); - if(feature instanceof paper.PointText){ - continue; - } - features.push(feature.bounds); - } - - const unitedBounds = features.reduce((bbox, item): paper.Rectangle => { - if (item === null || item instanceof paper.PointText) { - return bbox; - }else{ - return !bbox ? item : bbox.unite(item); - } - }); - if (unitedBounds) { - return unitedBounds; - } else { - return new paper.Rectangle(0, 0, 0, 0); - } - } - - /** - * Returns the dimensions for the component for given params. - * - * @param {{ [key: string]: any }} params - * @returns {{ xspan: any; yspan: any }} - * @memberof Template - */ - getDimensions(params: { [key: string]: any }): { xspan: any; yspan: any } { - // TODO - Figure out a workaround for this - if (PRIMITIVES_SERVER) { - paper.setup(new paper.Size([64000, 48000])); - } - - params.position = [0, 0]; - - const unitedBounds = this.getBounds(params); - if (unitedBounds === null) { - throw new Error("No bounds found for component"); - } - const xspan = unitedBounds.width; - const yspan = unitedBounds.height; - // console.log("Dimensions:",xspan, yspan); - return { xspan: xspan, yspan: yspan }; - } - - /** - * Returns the drawing offset for the component for given params. This assummes - * that the mint definiton, and the getBounds methd works correctly - * - * @param {{ [key: string]: any }} params - * @returns - * @memberof Template - */ - getDrawOffset(params: { [key: string]: any }) { - params.position = [0, 0]; - params.rotation = 0; - const position = params.position; - const positionUnitedBounds = this.getBounds(params); - // console.log(positionUnitedBounds.topLeft, position); - if (positionUnitedBounds === null) { - throw new Error("unitedBounds is null"); - } - const x_new = position[0] - positionUnitedBounds.topLeft.x; - const y_new = position[1] - positionUnitedBounds.topLeft.y; - return [x_new, y_new]; - } -} diff --git a/src/app/library/text.ts b/src/app/library/text.ts deleted file mode 100644 index 464f7ee0..00000000 --- a/src/app/library/text.ts +++ /dev/null @@ -1,94 +0,0 @@ -import Template from "./template"; -import paper from "paper"; - -export default class Text extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - text: "String", - height: "Float", - fontSize: "Float" - }; - - this.__defaults = { - fontSize: 10000 / 3, - height: 250 - }; - - this.__units = { - fontSize: "μm", - height: "μm" - }; - - this.__minimum = { - fontSize: 10000 / 3, - height: 1 - }; - - this.__maximum = { - fontSize: 10000 / 3, - height: 10000 - }; - - this.__toolParams = { - position: "position" - }; - - this.__featureParams = { - position: "position", - text: "text", - fontSize: "fontSize", - height: "height" - }; - - this.__targetParams = { - text: "text", - fontSize: "fontSize", - height: "height" - }; - - this.__placementTool = "PositionTool"; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "TEXT"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - render2D(params: { [k: string]: any }, key: string) { - // Regardless of the key... - const position = params.position; - const text = params.text; - const color = params.color; - const rendered = new paper.PointText(new paper.Point(position[0], position[1])); - rendered.justification = "center"; - rendered.fillColor = color; - /// rendered.content = feature.getText(); - rendered.content = text; - rendered.fontSize = 10000 / 3; - return rendered; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/thermoCycler.ts b/src/app/library/thermoCycler.ts deleted file mode 100644 index f99571de..00000000 --- a/src/app/library/thermoCycler.ts +++ /dev/null @@ -1,151 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class thermoCycler extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - width: "Float", - length: "Float", - height: "Float", - temperature: "Float" - }; - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - width: 20 * 1000, - length: 40 * 1000, - height: 5 * 1000, - temperature: 0.03 * 1000 - }; - this.__units = { - componentSpacing: "μm", - rotation: "°", - width: "μm", - length: "μm", - height: "μm", - temperature: "°C" - }; - this.__minimum = { - componentSpacing: 0, - rotation: 0, - width: 10 * 1000, - length: 10 * 1000, - height: 1.25 * 1000, - temperature: 0 * 1000 - }; - this.__maximum = { - componentSpacing: 10000, - rotation: 90, - width: 60 * 1000, - length: 60 * 1000, - height: 10 * 1000, - temperature: 0.1 * 1000 - }; - this.__placementTool = "multilayerPositionTool"; - this.__toolParams = { - position: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - length: "length", - width: "width", - temperature: "temperature" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - rotation: "rotation", - length: "length", - width: "width", - temperature: "temperature" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "THERMO CYCLER"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - render2D(params: { [k: string]: any }, key: string) { - const position = params.position; - const rotation = params.rotation; - const px = position[0]; - const py = position[1]; - const l = params.length; - const w = params.width; - const color = params.color; - const startX = px - w / 2; - const startY = py - l / 2; - const endX = px + w / 2; - const endY = py + l / 2; - const startPoint = new paper.Point(startX, startY); - const endPoint = new paper.Point(endX, endY); - const rendered = new paper.CompoundPath(""); - const cirrad = l / 4; - const centerr = new paper.Point(px - w, py - l); - - const rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - fillColor: color, - strokeWidth: 0 - }); - rendered.addChild(rec); - - // let cir = new paper.Path.Circle({ - // center: centerr, - // radius: cirrad, - // fillColor: 'black' - // }) - // rendered.addChild(cir); - - rendered.fillColor = color; - // cir.fillColor = 'black'; - // rec.addChild(cir) - rendered.rotate(rotation, new paper.Point(px, py)); - return rendered; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } - - getPorts(params: { [k: string]: any }) { - const l = params.length; - const w = params.width; - - const ports = []; - - ports.push(new ComponentPort(-w / 2, -l / 6, "1", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(-w / 2, l / 6, "2", LogicalLayerType.CONTROL)); - - return ports; - } -} diff --git a/src/app/library/threeDMixer.ts b/src/app/library/threeDMixer.ts deleted file mode 100644 index 010a0c6e..00000000 --- a/src/app/library/threeDMixer.ts +++ /dev/null @@ -1,183 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class ThreeDMixer extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - bendSpacing: "Float", - numberOfBends: "Float", - channelWidth: "Float", - bendLength: "Float", - rotation: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - channelWidth: 0.8 * 1000, - bendSpacing: 1.23 * 1000, - numberOfBends: 1, - rotation: 0, - bendLength: 2.46 * 1000, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - bendSpacing: "μm", - numberOfBends: "", - channelWidth: "μm", - bendLength: "μm", - rotation: "°", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - channelWidth: 10, - bendSpacing: 10, - numberOfBends: 1, - rotation: 0, - bendLength: 10, - height: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - channelWidth: 2000, - bendSpacing: 6000, - numberOfBends: 20, - rotation: 360, - bendLength: 12 * 1000, - height: 1200 - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - cursorPosition: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - channelWidth: "channelWidth", - bendSpacing: "bendSpacing", - numberOfBends: "numberOfBends", - rotation: "rotation", - bendLength: "bendLength" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - channelWidth: "channelWidth", - bendSpacing: "bendSpacing", - numberOfBends: "numberOfBends", - rotation: "rotation", - bendLength: "bendLength" - }; - - this.__renderKeys = ["FLOW", "CONTROL"]; - - this.__mint = "MIXER3D"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1" - }; - } - - getPorts(params: { [k: string]: any }) { - const channelWidth = params.channelWidth; - const bendLength = params.bendLength; - const bendSpacing = params.bendSpacing; - const rotation = params.rotation; - const numberOfBends = params.numberOfBends; - - const ports = []; - - ports.push(new ComponentPort(bendLength / 2 + channelWidth, 0, "1", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(bendLength / 2 + channelWidth, (2 * numberOfBends + 1) * channelWidth + 2 * numberOfBends * bendSpacing, "2", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - const channelWidth = params.channelWidth; - const bendLength = params.bendLength; - const bendSpacing = params.bendSpacing; - const rotation = params.rotation; - const numBends = params.numberOfBends; - const x = params.position[0]; - const y = params.position[1]; - const color = params.color; - const segHalf = bendLength / 2 + channelWidth; - const segLength = bendLength + 2 * channelWidth; - const segBend = bendSpacing + 2 * channelWidth; - const vRepeat = 2 * bendSpacing + 2 * channelWidth; - const vOffset = bendSpacing + channelWidth; - const hOffset = bendLength / 2 + channelWidth / 2; - const serp = new paper.CompoundPath(""); - - if (key === "FLOW") { - // draw first segment - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y, segHalf + channelWidth / 2, channelWidth))); - for (let i = 0; i < numBends; i++) { - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * i, channelWidth, segBend))); - // serp.addChild(new paper.Path.Rectangle(x, y + vOffset + vRepeat * i, segLength, channelWidth)); - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth + bendLength, y + vOffset + vRepeat * i, channelWidth, segBend))); - if (i === numBends - 1) { - // draw half segment to close - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + hOffset, y + vRepeat * (i + 1), segHalf, channelWidth))); - } else { - // draw full segment - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * (i + 1), segLength, channelWidth))); - } - } - } else { - // draw first segment - // serp.addChild(new paper.Path.Rectangle(x, y, segHalf + channelWidth / 2, channelWidth)); - for (let i = 0; i < numBends; i++) { - // serp.addChild(new paper.Path.Rectangle(x, y + vRepeat * i, channelWidth, segBend)); - serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vOffset + vRepeat * i, segLength, channelWidth))); - // serp.addChild(new paper.Path.Rectangle(x + channelWidth + bendLength, y + vOffset + vRepeat * i, channelWidth, segBend)); - // if (i === numBends - 1) {//draw half segment to close - // serp.addChild(new paper.Path.Rectangle(x + hOffset, y + vRepeat * (i + 1), segHalf, channelWidth)); - // } else {//draw full segment - // serp.addChild(new paper.Path.Rectangle(x, y + vRepeat * (i + 1), segLength, channelWidth)); - // } - } - } - - serp.fillColor = color; - serp.rotate(rotation, new paper.Point(x, y)); - return serp; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const serp = this.render2D(params, key); - serp.fillColor = params.color; - serp.fillColor!.alpha = 0.5; - return serp; - } -} diff --git a/src/app/library/threeDMux.ts b/src/app/library/threeDMux.ts deleted file mode 100644 index 8115c1cd..00000000 --- a/src/app/library/threeDMux.ts +++ /dev/null @@ -1,544 +0,0 @@ -import Template from "./template"; -import paper, { CompoundPath } from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class ThreeDMux extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - in: "Integer", - out: "Integer", - rotation: "Float", - valveRadius: "Float", - height: "Float", - gap: "Float", - width: "Float", - length: "Float", - valveSpacing: "Float", - channelWidth: "Float", - controlChannelWidth: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - in: 1, - out: 8, - rotation: 0, - valveRadius: 1.2 * 1000, - height: 0.8 * 1000, - gap: 0.6 * 1000, - width: 100, - length: 100, - valveSpacing: 0.6 * 1000, - channelWidth: 500, - controlChannelWidth: 0.6 * 1000 - }; - - this.__units = { - componentSpacing: "μm", - in: "", - out: "", - rotation: "°", - valveRadius: "μm", - height: "μm", - gap: "μm", - width: "μm", - length: "μm", - valveSpacing: "μm", - channelWidth: "μm", - controlChannelWidth: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - in: 1, - out: 2, - rotation: 0, - valveRadius: 0.1 * 100, - height: 0.1 * 100, - gap: 0.5 * 10, - width: 100, - length: 100, - valveSpacing: 0.1 * 1000, - channelWidth: 25, - controlChannelWidth: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - in: 1, - out: 128, - rotation: 360, - valveRadius: 0.2 * 10000, - height: 1.2 * 1000, - gap: 0.1 * 10000, - width: 100, - length: 100, - valveSpacing: 0.1 * 10000, - channelWidth: 25e3, - controlChannelWidth: 1000 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - in: "in", - out: "out", - position: "position", - rotation: "rotation", - radius1: "valveRadius", - radius2: "valveRadius", - valveRadius: "valveRadius", - gap: "gap", - width: "width", - length: "length", - valveSpacing: "valveSpacing", - channelWidth: "channelWidth", - controlChannelWidth: "controlChannelWidth" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - in: "in", - out: "out", - position: "position", - rotation: "rotation", - radius1: "valveRadius", - radius2: "valveRadius", - valveRadius: "valveRadius", - gap: "gap", - width: "width", - length: "length", - valveSpacing: "valveSpacing", - channelWidth: "channelWidth", - controlChannelWidth: "controlChannelWidth" - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW", "CONTROL", "INVERSE"]; - - this.__mint = "MUX3D"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height", - INVERSE: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1", - INVERSE: "0" - }; - } - - render2D(params: { [k: string]: any }, key: string) { - if (key === "FLOW") { - return this.__drawFlow(params); - } else if (key === "CONTROL") { - return this.__drawControl(params); - } else if (key === "INVERSE") { - return this.__drawInverse(params); - }else{ - throw new Error("Unknown key threedmux: " + key); - } - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const ret = new paper.CompoundPath(""); - const flow = this.render2D(params, "FLOW"); - const control = this.render2D(params, "CONTROL"); - ret.addChild((control as unknown) as paper.CompoundPath); - ret.addChild((flow as unknown) as paper.CompoundPath); - ret.fillColor = params.color; - ret.fillColor!.alpha = 0.5; - return ret; - } - - getPorts(params: { [k: string]: any }) { - const ins = params.in; - const outs = params.out; - let N; - const channelWidth = params.channelWidth; - let rotation = params.rotation; - - if (ins < outs) { - N = outs; - } else { - N = ins; - rotation += 180; - } - - const horizontal_length = N * 4000; - const vertical_length = N * 3000; - const ports = []; - - for (let i = 0; i < N; i++) { - const xpos = i * (horizontal_length / (N - 1)); - ports.push(new ComponentPort(xpos, 0, (i + 1).toString(), LogicalLayerType.FLOW)); - } - - ports.push(new ComponentPort(horizontal_length / 2, vertical_length + N * 1000, (N + 1).toString(), LogicalLayerType.FLOW)); - const bottomlinelength = N * 4000; // modify, so it depends on the input N - const vertlinelength = N * 3000; // same as above - - const leftInput = -N * 1000; - const rightInput = bottomlinelength + N * 1000; - let indexN = N; - const valvenum = Math.log(N) / Math.log(2); - const vertholder = vertlinelength / (2 * valvenum); - - let count = N + 2; - - for (let i = 0; i < 2 * valvenum; i++) { - // left side - if (i % 2 === 0) { - indexN /= 2; - const cur_ind = N - indexN - 1; - // let leftsideLeft = new paper.Point(leftInput, vertholder + (i) * vertlinelength/(2*valvenum + 2) - channelWidth/2); - ports.push(new ComponentPort(leftInput, vertholder + (i * vertlinelength) / (2 * valvenum + 2), count.toString(), LogicalLayerType.CONTROL)); - console.log(count); - count++; - } - // right side - else { - ports.push(new ComponentPort(rightInput, vertholder + (i * vertlinelength) / (2 * valvenum + 2), count.toString(), LogicalLayerType.CONTROL)); - console.log(count); - count++; - } - } - - return ports; - } - - __drawFlow(params: { [k: string]: any }) { - const position = params.position; - const gap = params.gap; - const radius = params.valveRadius; - const color = params.color; - let rotation = params.rotation; - const channelWidth = params.channelWidth; - const threedmux_flow = new paper.CompoundPath(""); - - const px = position[0]; - const py = position[1]; - const ins = params.in; - const outs = params.out; - let N; - if (ins < outs) { - N = outs; - } else { - N = ins; - rotation += 180; - } - const bottomlinelength = N * 4000; // modify, so it depends on the input N - const vertlinelength = N * 3000; // same as above - - const bottomlineleft = new paper.Point(px - channelWidth / 2, py - channelWidth / 2 + vertlinelength); - const bottomlineright = new paper.Point(px + bottomlinelength + channelWidth / 2, py + channelWidth / 2 + vertlinelength); - const channel = new paper.Path.Rectangle(bottomlineleft, bottomlineright); - - threedmux_flow.addChild(channel); - - const valvenum = Math.log(N) / Math.log(2); - const valveselect = vertlinelength / (2 * valvenum); - const branchArray = new Array(N); - const centerArray = new Array(N); - - // create base flow - for (let i = 0; i < N; i++) { - const xposbranch = i * (bottomlinelength / (N - 1)); - - const vertlinebottom = new paper.Point(px + xposbranch - channelWidth / 2, py + vertlinelength); - const vertlinetop = new paper.Point(px + xposbranch + channelWidth / 2, py); - branchArray[i] = new paper.Path.Rectangle(vertlinebottom, vertlinetop); - } - - // create output port - const portCon = new paper.Point(px + bottomlinelength / 2 - channelWidth / 2, py + vertlinelength); - const portOut = new paper.Point(px + bottomlinelength / 2 + channelWidth / 2, py + vertlinelength + N * 1000); - - const portRec = new paper.Path.Rectangle(portCon, portOut); - - threedmux_flow.addChild(portRec); - - // add valves and remove parts of channels - let cur_N = N; - const xpos = px; - let ypos = py + valveselect; - - for (let j = 0; j < valvenum; j++) { - // left side - let count1 = 0; - const increment1 = cur_N / 2; - while (count1 < N) { - for (let w = 0; w < cur_N / 2; w++) { - const current_xpos = xpos + ((count1 + w) * bottomlinelength) / (N - 1); - - const cutrec = new paper.Path.Rectangle({ - from: new paper.Point(current_xpos - channelWidth / 2, ypos - gap / 2), - to: new paper.Point(current_xpos + channelWidth / 2, ypos + gap / 2) - }); - - this.__createthreedmuxValve(threedmux_flow, current_xpos, ypos, gap, radius, rotation, channelWidth); - branchArray[count1 + w] = branchArray[count1 + w].subtract(cutrec); // remove a portion from the selected channel - } - - count1 += 2 * increment1; - } - - // right side - const ypos_adjust = vertlinelength / (2 * valvenum + 2); - let count2 = 0; - const increment2 = cur_N / 2; - ypos += ypos_adjust; - - while (count2 < N) { - for (let w = 0; w < cur_N / 2; w++) { - const current_xpos = xpos + bottomlinelength - ((count2 + w) * bottomlinelength) / (N - 1); - - const cutrec = new paper.Path.Rectangle({ - from: new paper.Point(current_xpos - channelWidth / 2, ypos - gap / 2), - to: new paper.Point(current_xpos + channelWidth / 2, ypos + gap / 2) - }); - - branchArray[N - 1 - w - count2] = branchArray[N - 1 - w - count2].subtract(cutrec); - this.__createthreedmuxValve(threedmux_flow, current_xpos, ypos, gap, radius, rotation, channelWidth); - } - count2 += increment2 + cur_N / 2; - } - ypos += ypos_adjust; - cur_N = cur_N / 2; - } - - for (let i = 0; i < N; i++) { - threedmux_flow.addChild(branchArray[i]); - // threedmux_flow.addChild(centerArray[i]); - } - - threedmux_flow.fillColor = color; - - threedmux_flow.rotate(rotation, new paper.Point(px, py)); - - return threedmux_flow; - } - - __createthreedmuxValve(compound_path: paper.CompoundPath, xpos: number, ypos: number, gap: number, radius: number, rotation: number, channel_width: number): void { - const center = new paper.Point(xpos, ypos); - - // Create the basic circle - let circ: paper.Path.Circle | paper.PathItem = new paper.Path.Circle(center, radius); - - // Add the tiny channel pieces that jut out - let rec = new paper.Path.Rectangle({ - point: new paper.Point(xpos - channel_width / 2, ypos - radius), - size: [channel_width, radius], - stokeWidth: 0 - }); - - circ = circ.unite(rec); - - rec = new paper.Path.Rectangle({ - point: new paper.Point(xpos - channel_width / 2, ypos), - size: [channel_width, radius], - stokeWidth: 0 - }); - - circ = circ.unite(rec); - - const cutout = new paper.Path.Rectangle({ - from: new paper.Point(xpos - radius, ypos - gap / 2), - to: new paper.Point(xpos + radius, ypos + gap / 2) - }); - - const valve = circ.subtract(cutout); - - compound_path.addChild(valve); - } - - __drawControl(params: { [k: string]: any }) { - const position = params.position; - const radius = params.valveRadius; - const color = params.color; - let rotation = params.rotation; - const channelWidth = params.controlChannelWidth; - const threedmux_control = new paper.CompoundPath(""); - - const px = position[0]; - const py = position[1]; - - const ins = params.in; - const outs = params.out; - - let N; - if (ins < outs) { - N = outs; - } else { - N = ins; - rotation += 180; - } - - const bottomlinelength = N * 4000; // modify, so it depends on the input N - const vertlinelength = N * 3000; // same as above - - const leftInput = px - N * 1000; - const rightInput = px + bottomlinelength + N * 1000; - let indexN = N; - const valvenum = Math.log(N) / Math.log(2); - const vertholder = vertlinelength / (2 * valvenum); - const valveselect = vertlinelength / (2 * valvenum); - - for (let i = 0; i < 2 * valvenum; i++) { - // left side - if (i % 2 === 0) { - indexN /= 2; - const cur_ind = N - indexN - 1; - const leftsideLeft = new paper.Point(leftInput, py + vertholder + (i * vertlinelength) / (2 * valvenum + 2) - channelWidth / 2); - const leftsideRight = new paper.Point(px + cur_ind * (bottomlinelength / (N - 1)), py + vertholder + (i * vertlinelength) / (2 * valvenum + 2) + channelWidth / 2); - const leftcontrol = new paper.Path.Rectangle(leftsideLeft, leftsideRight); - - threedmux_control.addChild(leftcontrol); - } - // right side - else { - const cur_ind = indexN; - const rightsideLeft = new paper.Point(px + cur_ind * (bottomlinelength / (N - 1)), py + vertholder + (i * vertlinelength) / (2 * valvenum + 2) - channelWidth / 2); - const rightsideRight = new paper.Point(rightInput, py + vertholder + (i * vertlinelength) / (2 * valvenum + 2) + channelWidth / 2); - const rightcontrol = new paper.Path.Rectangle(rightsideLeft, rightsideRight); - - threedmux_control.addChild(rightcontrol); - } - } - - let cur_N = N; - const xpos = px; - let ypos = py + valveselect; - - for (let j = 0; j < valvenum; j++) { - // left side - let count1 = 0; - const increment1 = cur_N / 2; - while (count1 < N) { - for (let w = 0; w < cur_N / 2; w++) { - const current_xpos = xpos + ((count1 + w) * bottomlinelength) / (N - 1); - const center = new paper.Point(current_xpos, ypos); - const circle = new paper.Path.Circle(center, radius); - threedmux_control.addChild(circle); - } - - count1 += 2 * increment1; - } - - // right side - const ypos_adjust = vertlinelength / (2 * valvenum + 2); - let count2 = 0; - const increment2 = cur_N / 2; - ypos += ypos_adjust; - - while (count2 < N) { - for (let w = 0; w < cur_N / 2; w++) { - const current_xpos = xpos + bottomlinelength - ((count2 + w) * bottomlinelength) / (N - 1); - const center = new paper.Point(current_xpos, ypos); - const circle = new paper.Path.Circle(center, radius); - threedmux_control.addChild(circle); - } - count2 += increment2 + cur_N / 2; - } - ypos += ypos_adjust; - cur_N = cur_N / 2; - } - - threedmux_control.fillColor = color; - threedmux_control.rotate(rotation, new paper.Point(px, py)); - - return threedmux_control; - } - - __drawInverse(params: { [k: string]: any }) { - const position = params.position; - const radius = params.valveRadius; - const color = params.color; - let rotation = params.rotation; - const threedmux_control = new paper.CompoundPath(""); - - const px = position[0]; - const py = position[1]; - - const ins = params.in; - const outs = params.out; - - let N; - if (ins < outs) { - N = outs; - } else { - N = ins; - rotation += 180; - } - - const bottomlinelength = N * 4000; // modify, so it depends on the input N - const vertlinelength = N * 3000; // same as above - - const leftInput = px - N * 1000; - const rightInput = px + bottomlinelength + N * 1000; - let indexN = N; - const valvenum = Math.log(N) / Math.log(2); - const vertholder = vertlinelength / (2 * valvenum); - const valveselect = vertlinelength / (2 * valvenum); - - let cur_N = N; - const xpos = px; - let ypos = py + valveselect; - - for (let j = 0; j < valvenum; j++) { - // left side - let count1 = 0; - const increment1 = cur_N / 2; - while (count1 < N) { - for (let w = 0; w < cur_N / 2; w++) { - const current_xpos = xpos + ((count1 + w) * bottomlinelength) / (N - 1); - const center = new paper.Point(current_xpos, ypos); - const circle = new paper.Path.Circle(center, radius); - threedmux_control.addChild(circle); - } - - count1 += 2 * increment1; - } - - // right side - const ypos_adjust = vertlinelength / (2 * valvenum + 2); - let count2 = 0; - const increment2 = cur_N / 2; - ypos += ypos_adjust; - - while (count2 < N) { - for (let w = 0; w < cur_N / 2; w++) { - const current_xpos = xpos + bottomlinelength - ((count2 + w) * bottomlinelength) / (N - 1); - const center = new paper.Point(current_xpos, ypos); - const circle = new paper.Path.Circle(center, radius); - threedmux_control.addChild(circle); - } - count2 += increment2 + cur_N / 2; - } - ypos += ypos_adjust; - cur_N = cur_N / 2; - } - - threedmux_control.fillColor = color; - threedmux_control.rotate(rotation, new paper.Point(px, py)); - - return threedmux_control; - } -} \ No newline at end of file diff --git a/src/app/library/toroidalMixer.ts b/src/app/library/toroidalMixer.ts deleted file mode 100644 index 83565379..00000000 --- a/src/app/library/toroidalMixer.ts +++ /dev/null @@ -1,254 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { Path, Point } from "paper/dist/paper-core"; -// import { LogicalLayerType, ToolPaperObject } from "../core/init"; -import { LogicalLayerType } from "../core/init"; - -export default class ToroidalMixer extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - neckAngle: "Float", - neckLength: "Float", - neckWidth: "Float", - numberOfMixers: "Float", - channelWidth: "Float", - innerDiameter: "Float", - rotation: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - channelWidth: 0.8 * 1000, - neckAngle: 120, - neckLength: 1000, - neckWidth: 800, - numberOfMixers: 1, - innerDiameter: 2.46 * 1000, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - neckAngle: "°", - neckLength: "μm", - neckWidth: "μm", - numberOfMixers: "", - channelWidth: "μm", - innerDiameter: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - rotation: 0, - channelWidth: 10, - neckAngle: 0, - neckLength: 0, - neckWidth: 10, - numberOfMixers: 1, - innerDiameter: 10, - height: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - rotation: 360, - channelWidth: 2000, - neckAngle: 360, - neckLength: 10000, - neckWidth: 2000, - numberOfMixers: 20, - innerDiameter: 12 * 1000, - height: 1200 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - channelWidth: "channelWidth", - neckAngle: "neckAngle", - neckLength: "neckLength", - neckWidth: "neckWidth", - numberOfMixers: "numberOfMixers", - rotation: "rotation", - innerDiameter: "innerDiameter" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - channelWidth: "channelWidth", - neckAngle: "neckAngle", - neckLength: "neckLength", - neckWidth: "neckWidth", - numberOfMixers: "numberOfMixers", - rotation: "rotation", - innerDiameter: "innerDiameter" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "TOROIDAL MIXER"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [index: string]: any }) { - const y: number = params.position[1]; - const channelWidth: number = params.channelWidth; - const innerDiameter: number = params.innerDiameter; - const neckLength: number = params.neckLength; - const neckAngle: number = params.neckAngle; - const numberOfMixers: number = params.numberOfMixers; - const y_center: number = y + Math.abs((neckLength + channelWidth + 0.5 * innerDiameter) * Math.sin((0.5 * neckAngle * Math.PI) / 180)); - const diameter: number = 2 * (y_center - y); - const y_neckComponent: number = neckLength * Math.sin((0.5 * neckAngle * Math.PI) / 180); - - const ports: Array = []; - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - - if (numberOfMixers % 2 == 1) { - ports.push( - new ComponentPort( - 0, - (numberOfMixers - 1) * diameter - (numberOfMixers - 2) * y_neckComponent + diameter - neckLength * Math.sin((0.5 * neckAngle * Math.PI) / 180), - "2", - LogicalLayerType.FLOW - ) - ); - } else { - ports.push( - new ComponentPort( - -1 * neckLength * Math.cos((0.5 * neckAngle * Math.PI) / 180), - (numberOfMixers - 1) * diameter - (numberOfMixers - 2) * y_neckComponent + diameter - neckLength * Math.sin((0.5 * neckAngle * Math.PI) / 180), - "2", - LogicalLayerType.FLOW - ) - ); - } - - return ports; - } - - render2D(params: { [index: string]: any }, key: string): paper.CompoundPath { - const channelWidth: number = params.channelWidth; - const innerDiameter: number = params.innerDiameter; - const neckAngle: number = params.neckAngle; - const neckWidth: number = params.neckWidth; - const rotation: number = params.rotation; - const neckLength: number = params.neckLength; - const numMixers: number = params.numberOfMixers; - const x: number = params.position[0]; - const y: number = params.position[1]; - const color: any = params.color; - const serp: paper.CompoundPath = new paper.CompoundPath([]); - const x_center: number = x - (neckLength + channelWidth + 0.5 * innerDiameter) * Math.cos((0.5 * neckAngle * Math.PI) / 180); - const y_center: number = y + Math.abs((neckLength + channelWidth + 0.5 * innerDiameter) * Math.sin((0.5 * neckAngle * Math.PI) / 180)); - const center: paper.Point = new paper.Point(x_center, y_center); - const diameter: number = 2 * (y_center - y); - const y_neckComponent: number = neckLength * Math.sin((0.5 * neckAngle * Math.PI) / 180); - - let mixerUnit: paper.PathItem; - - //Initial ring - let outerCircle: paper.Path = new paper.Path.Circle(center, 0.5 * innerDiameter + channelWidth); - let innerCircle: paper.Path = new paper.Path.Circle(center, 0.5 * innerDiameter); - mixerUnit = outerCircle.subtract(innerCircle); - //Initial neck - let neck: paper.Path = new paper.Path.Rectangle(new paper.Point(x - neckLength - channelWidth, y - 0.5 * neckWidth), new paper.Size(neckLength + channelWidth, neckWidth)); - neck.rotate((-1 * neckAngle) / 2, new paper.Point(x, y)); - mixerUnit = mixerUnit.unite(neck); - //Trailing neck - neck = new paper.Path.Rectangle(new paper.Point(x - neckLength - channelWidth, y - 0.5 * neckWidth + diameter), new paper.Size(neckLength + channelWidth, neckWidth)); - neck.rotate(neckAngle / 2, new paper.Point(x, y + diameter)); - mixerUnit = mixerUnit.unite(neck); - - let y_val: number; - let x_centerAnalog: number; - let y_centerAnalog: number; - let centerAnalog: paper.Point; - let numRepeats: number = numMixers - 1; - for (let i = 1; i <= numRepeats; i++) { - y_val = y + i * diameter - (i - 1) * y_neckComponent; - if (i % 2 == 1) { - x_centerAnalog = x + (channelWidth + 0.5 * innerDiameter) * Math.cos((0.5 * neckAngle * Math.PI) / 180); - y_centerAnalog = y_val + Math.abs((channelWidth + 0.5 * innerDiameter) * Math.sin((0.5 * neckAngle * Math.PI) / 180)); - centerAnalog = new paper.Point(x_centerAnalog, y_centerAnalog); - //Add next ring - outerCircle = new paper.Path.Circle(centerAnalog, 0.5 * innerDiameter + channelWidth); - innerCircle = new paper.Path.Circle(centerAnalog, 0.5 * innerDiameter); - mixerUnit = mixerUnit.unite(outerCircle.subtract(innerCircle)); - //Complete inter-ring connection - neck = new paper.Path.Rectangle(new paper.Point(x, y_val - 0.5 * neckWidth), new paper.Size(channelWidth, neckWidth)); - neck.rotate(neckAngle / 2, new paper.Point(x, y_val)); - mixerUnit = mixerUnit.unite(neck); - //Add trailing neck - neck = new paper.Path.Rectangle( - new paper.Point(x - neckLength, y_val - 0.5 * neckWidth + (2 * channelWidth + innerDiameter) * Math.sin((0.5 * neckAngle * Math.PI) / 180)), - new paper.Size(neckLength + channelWidth, neckWidth) - ); - neck.rotate((-1 * neckAngle) / 2, new paper.Point(x, y_val + (2 * channelWidth + innerDiameter) * Math.sin((0.5 * neckAngle * Math.PI) / 180))); - mixerUnit = mixerUnit.unite(neck); - } else { - y_centerAnalog = y_val + Math.abs((channelWidth + 0.5 * innerDiameter) * Math.sin((0.5 * neckAngle * Math.PI) / 180)); - centerAnalog = new paper.Point(x_center, y_centerAnalog); - //Add next ring - outerCircle = new paper.Path.Circle(centerAnalog, 0.5 * innerDiameter + channelWidth); - innerCircle = new paper.Path.Circle(centerAnalog, 0.5 * innerDiameter); - mixerUnit = mixerUnit.unite(outerCircle.subtract(innerCircle)); - //Complete inter-ring connection - neck = new paper.Path.Rectangle( - new paper.Point(x - channelWidth - neckLength * Math.cos((0.5 * neckAngle * Math.PI) / 180), y_val - 0.5 * neckWidth), - new paper.Size(channelWidth, neckWidth) - ); - neck.rotate((-1 * neckAngle) / 2, new paper.Point(x - neckLength * Math.cos((0.5 * neckAngle * Math.PI) / 180), y_val)); - mixerUnit = mixerUnit.unite(neck); - //Add trailing neck - neck = new paper.Path.Rectangle( - new paper.Point(x - neckLength - channelWidth, y_val - 0.5 * neckWidth + diameter - neckLength * Math.sin((0.5 * neckAngle * Math.PI) / 180)), - new paper.Size(neckLength + channelWidth, neckWidth) - ); - neck.rotate(neckAngle / 2, new paper.Point(x, y_val + diameter - neckLength * Math.sin((0.5 * neckAngle * Math.PI) / 180))); - mixerUnit = mixerUnit.unite(neck); - } - } - serp.addChild(mixerUnit); - serp.fillColor = color; - serp.rotate(rotation, new paper.Point(x, y)); - return serp; - } - - render2DTarget(key: string | null, params: { [index: string]: any }): paper.CompoundPath { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - if (render.fillColor !== null) render.fillColor.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/transition.ts b/src/app/library/transition.ts deleted file mode 100644 index e88b6f73..00000000 --- a/src/app/library/transition.ts +++ /dev/null @@ -1,116 +0,0 @@ -import Template from "./template"; -import paper from "paper"; - -export default class Transition extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - cw1: "Float", - cw2: "Float", - length: "Float", - rotation: "Float", - height: "Float" - }; - - this.__defaults = { - cw1: 0.8 * 1000, - cw2: 0.9 * 1000, - length: 1.0 * 1000, - rotation: 0, - height: 250 - }; - - this.__units = { - cw1: "μm", - cw2: "μm", - length: "μm", - rotation: "°", - height: "μm" - }; - - this.__minimum = { - cw1: 3, - cw2: 3, - length: 10, - height: 10, - rotation: 0 - }; - - this.__maximum = { - rotation: 180, - cw1: 2000, - cw2: 2000, - length: 1200, - height: 1200 - }; - - this.__featureParams = { - position: "position", - cw1: "cw1", - cw2: "cw2", - length: "length", - rotation: "rotation" - }; - - this.__targetParams = { - cw1: "cw1", - cw2: "cw2", - length: "length", - rotation: "rotation" - }; - - this.__placementTool = "PositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "TRANSITION"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - render2D(params: { [k: string]: any }, key: string): paper.Path { - const position = params.position; - const cw1 = params.cw1; - const cw2 = params.cw2; - const length = params.length; - const rotation = params.rotation; - const color = params.color; - const trap = new paper.Path(); - - trap.add(new paper.Point(position[0] - cw1 / 2, position[1])); - trap.add(new paper.Point(position[0] + cw1 / 2, position[1])); - trap.add(new paper.Point(position[0] + cw2 / 2, position[1] + length)); - trap.add(new paper.Point(position[0] - cw2 / 2, position[1] + length)); - // trap.add(new paper.Point(position[0] - cw1/2, position[1])); - - trap.closed = true; - trap.fillColor = color; - return (trap.rotate(rotation, new paper.Point(position[0], position[1])) as unknown) as paper.Path; - } - - render2DTarget(key: string | null, params: { [k: string]: any }): paper.Path { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/transposer.ts b/src/app/library/transposer.ts deleted file mode 100644 index e0d9fdd6..00000000 --- a/src/app/library/transposer.ts +++ /dev/null @@ -1,416 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Transposer extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - valveRadius: "Float", - height: "Float", - valveGap: "Float", - valveSpacing: "Float", - flowChannelWidth: "Float", - controlChannelWidth: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - valveRadius: 1.2 * 1000, - height: 250, - valveGap: 0.6 * 1000, - valveSpacing: 0.6 * 1000, - flowChannelWidth: 500, - controlChannelWidth: 500 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - valveRadius: "μm", - height: "μm", - valveGap: "μm", - valveSpacing: "μm", - flowChannelWidth: "μm", - controlChannelWidth: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - valveRadius: 0.1 * 100, - height: 0.1 * 100, - valveGap: 0.5 * 10, - valveSpacing: 0.1 * 1000, - flowChannelWidth: 0.1, - controlChannelWidth: 0.1, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - valveRadius: 0.2 * 10000, - height: 1.2 * 1000, - valveGap: 0.1 * 10000, - valveSpacing: 0.1 * 10000, - flowChannelWidth: 0.1 * 10000, - controlChannelWidth: 0.1 * 10000, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - valveRadius: "valveRadius", - valveGap: "valveGap", - valveSpacing: "valveSpacing", - flowChannelWidth: "flowChannelWidth", - controlChannelWidth: "controlChannelWidth" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - valveRadius: "valveRadius", - valveGap: "valveGap", - valveSpacing: "valveSpacing", - flowChannelWidth: "flowChannelWidth", - controlChannelWidth: "controlChannelWidth" - }; - - this.__placementTool = "multilayerPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW", "CONTROL", "INVERSE"]; - - this.__mint = "TRANSPOSER"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height", - INVERSE: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1", - INVERSE: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const ports = []; - - const radius = params.valveRadius; - const channelWidth = params.flowChannelWidth; - const valvespacing = params.valveSpacing; - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(6 * valvespacing + 4 * radius + 3 * channelWidth, 0, "2", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(0, 2 * channelWidth + 4 * valvespacing + 2 * 2 * radius, "3", LogicalLayerType.FLOW)); - ports.push(new ComponentPort(6 * valvespacing + 4 * radius + 3 * channelWidth, 2 * channelWidth + 4 * valvespacing + 2 * 2 * radius, "4", LogicalLayerType.FLOW)); - - ports.push(new ComponentPort(-2 * radius - channelWidth / 2, channelWidth + 2 * valvespacing + 2 * radius, "5", LogicalLayerType.CONTROL)); - ports.push(new ComponentPort(5 * valvespacing + 6 * radius + 3 * channelWidth, channelWidth + 2 * valvespacing + 2 * radius, "6", LogicalLayerType.CONTROL)); - - return ports; - } - - render2D(params: { [k: string]: any }, key = "FLOW") { - if (key === "FLOW") { - return this.__drawFlow(params); - } else if (key === "CONTROL") { - return this.__drawControl(params); - } - - throw new Error("Unknown key: " + key); - - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const ret = new paper.CompoundPath(""); - const flow = this.render2D(params, "FLOW"); - const control = this.render2D(params, "CONTROL"); - ret.addChild(control as paper.CompoundPath); - ret.addChild(flow as paper.CompoundPath); - ret.fillColor = params.color; - ret.fillColor!.alpha = 0.5; - return ret; - } - - __drawFlow(params: { [k: string]: any }) { - const position = params.position; - const valveGap = params.valveGap; - const radius = params.valveRadius; - const color = params.color; - const rotation = params.rotation; - const channelWidth = params.flowChannelWidth; - const valvespacing = params.valveSpacing; - const transposer_flow = new paper.CompoundPath(""); - - const px = position[0]; - const py = position[1]; - - // Draw top left channel - let topleftpoint = new paper.Point(px, py - channelWidth / 2); - let bottomrightpoint = new paper.Point(px + 4 * valvespacing + 2 * radius + 2 * channelWidth, py + channelWidth / 2); - let channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint); - - transposer_flow.addChild(channel); - - // Draw Valve - this.__createTransposerValve(transposer_flow, bottomrightpoint.x + radius, topleftpoint.y + channelWidth / 2, valveGap, radius, "H", channelWidth); - - // Draw top right channel - topleftpoint = new paper.Point(px + 4 * valvespacing + 4 * radius + 2 * channelWidth, py - channelWidth / 2); - bottomrightpoint = new paper.Point(px + 6 * valvespacing + 4 * radius + 3 * channelWidth, py + channelWidth / 2); - channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint); - - transposer_flow.addChild(channel); - - // Draw middle channels - topleftpoint = new paper.Point(px + 3 * valvespacing + channelWidth + 2 * radius, py + channelWidth / 2); - bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + valvespacing); - channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint); - - transposer_flow.addChild(channel); - this.__createTransposerValve(transposer_flow, topleftpoint.x + channelWidth / 2, bottomrightpoint.y + radius, valveGap, radius, "V", channelWidth); - - // 2 - topleftpoint = new paper.Point(topleftpoint.x, bottomrightpoint.y + 2 * radius); - bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + 2 * valvespacing + channelWidth); - channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint); - - transposer_flow.addChild(channel); - - this.__createTransposerValve(transposer_flow, topleftpoint.x + channelWidth / 2, bottomrightpoint.y + radius, valveGap, radius, "V", channelWidth); - - // 3 - topleftpoint = new paper.Point(topleftpoint.x, bottomrightpoint.y + 2 * radius); - bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + valvespacing); - channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint); - - transposer_flow.addChild(channel); - - // Bottom Channels - topleftpoint = new paper.Point(px, py + 1.5 * channelWidth + 4 * valvespacing + 2 * 2 * radius); - bottomrightpoint = new paper.Point(topleftpoint.x + 2 * valvespacing + channelWidth, topleftpoint.y + channelWidth); - channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint); - - transposer_flow.addChild(channel); - - this.__createTransposerValve(transposer_flow, bottomrightpoint.x + radius, topleftpoint.y + channelWidth / 2, valveGap, radius, "H", channelWidth); - - // 2 - topleftpoint = new paper.Point(bottomrightpoint.x + 2 * radius, topleftpoint.y); - bottomrightpoint = new paper.Point(topleftpoint.x + 4 * valvespacing + 2 * channelWidth + 2 * radius, topleftpoint.y + channelWidth); - channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint); - - transposer_flow.addChild(channel); - - // Draw the right channels - topleftpoint = new paper.Point(px + 5 * valvespacing + 2 * channelWidth + 4 * radius, py + channelWidth / 2); - bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + valvespacing); - channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint); - - transposer_flow.addChild(channel); - - this.__createTransposerValve(transposer_flow, topleftpoint.x + channelWidth / 2, bottomrightpoint.y + radius, valveGap, radius, "V", channelWidth); - - // 2 - topleftpoint = new paper.Point(topleftpoint.x, bottomrightpoint.y + 2 * radius); - bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + valvespacing + channelWidth); - channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint); - - transposer_flow.addChild(channel); - - transposer_flow.fillColor = color; - - // Draw the left channels - topleftpoint = new paper.Point(px + valvespacing, py + 1.5 * channelWidth + 2 * valvespacing + 2 * radius); - bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + valvespacing); - channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint); - - transposer_flow.addChild(channel); - - this.__createTransposerValve(transposer_flow, topleftpoint.x + channelWidth / 2, bottomrightpoint.y + radius, valveGap, radius, "V", channelWidth); - - // 2 - topleftpoint = new paper.Point(topleftpoint.x, bottomrightpoint.y + 2 * radius); - bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + valvespacing + channelWidth); - channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint); - - transposer_flow.addChild(channel); - - transposer_flow.fillColor = color; - - transposer_flow.rotate(rotation, new paper.Point(px + 3 * valvespacing + 1.5 * channelWidth + 2 * radius, py + channelWidth + 2 * valvespacing + 2 * radius)); - - return transposer_flow; - } - - __createTransposerValve(compound_path: paper.CompoundPath, xpos: number, ypos: number, valveGap: number, radius: number, orientation: string, channel_width: number): void { - const center = new paper.Point(xpos, ypos); - - // Create the basic circle - let circ: paper.Path.Circle | paper.PathItem = new paper.Path.Circle(center, radius); - - // Add the tiny channel pieces that jut out - let rec = new paper.Path.Rectangle({ - point: new paper.Point(xpos - channel_width / 2, ypos - radius), - size: [channel_width, radius], - stokeWidth: 0 - }); - - circ = circ.unite(rec); - - rec = new paper.Path.Rectangle({ - point: new paper.Point(xpos - channel_width / 2, ypos), - size: [channel_width, radius], - stokeWidth: 0 - }); - - circ = circ.unite(rec); - - const cutout = new paper.Path.Rectangle({ - from: new paper.Point(xpos - radius, ypos - valveGap / 2), - to: new paper.Point(xpos + radius, ypos + valveGap / 2) - }); - - // cutout.fillColor = "white"; - const valve = circ.subtract(cutout); - - // TODO Rotate - if (orientation === "H") { - valve.rotate(90, center); - } - - compound_path.addChild(valve); - } - - __drawControl(params: { [k: string]: any }) { - const position = params.position; - const valveGap = params.valveGap; - const radius = params.valveRadius; - const color = params.color; - const rotation = params.rotation; - const channelWidth = params.controlChannelWidth; - const valvespacing = params.valveSpacing; - const transposer_control = new paper.CompoundPath(""); - - const px = position[0]; - const py = position[1]; - - // Top right valve - let center = new paper.Point(px + 4 * valvespacing + 2 * channelWidth + 2 * radius + radius, py); - let circle = new paper.Path.Circle(center, radius); - transposer_control.addChild(circle); - - let topLeft = new paper.Point(px + 4 * valvespacing + 2 * channelWidth + 2 * radius + radius - channelWidth / 2, py - 2 * radius); - let bottomRight = new paper.Point(px + 4 * valvespacing + 2 * channelWidth + 2 * radius + radius + channelWidth / 2, py); - transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(px - 2 * radius, py - 2 * radius - channelWidth / 2); - bottomRight = new paper.Point(px + 4 * valvespacing + 2 * channelWidth + 2 * radius + radius + channelWidth / 2, py - 2 * radius + channelWidth / 2); - transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 2nd row valves - - center = new paper.Point(px + 1.5 * channelWidth + 3 * valvespacing + 2 * radius, py + channelWidth / 2 + valvespacing + radius); - circle = new paper.Path.Circle(center, radius); - transposer_control.addChild(circle); - - let crosschannelstart = center; - - center = new paper.Point(center.x + 2 * valvespacing + 2 * radius + channelWidth, py + channelWidth / 2 + valvespacing + radius); - circle = new paper.Path.Circle(center, radius); - transposer_control.addChild(circle); - - let crosschannelend = center; - - // Draw the cross channel connecting the 2nd row valves - let rect = new paper.Path.Rectangle({ - from: new paper.Point(crosschannelstart.x, crosschannelstart.y - channelWidth / 2), - to: new paper.Point(crosschannelend.x, crosschannelstart.y + channelWidth / 2) - }); - - transposer_control.addChild(rect); - - topLeft = new paper.Point(crosschannelend.x, crosschannelstart.y - channelWidth / 2); - bottomRight = new paper.Point(crosschannelend.x + 2 * radius, crosschannelstart.y + channelWidth / 2); - transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(crosschannelend.x + 2 * radius - channelWidth / 2, crosschannelstart.y - channelWidth / 2); - bottomRight = new paper.Point(crosschannelend.x + 2 * radius + channelWidth / 2, py + 1.5 * channelWidth + 3 * valvespacing + 2 * radius + radius); - transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // 3rd Row valves - - center = new paper.Point(px + 0.5 * channelWidth + valvespacing, py + 1.5 * channelWidth + 3 * valvespacing + 2 * radius + radius); - circle = new paper.Path.Circle(center, radius); - transposer_control.addChild(circle); - - crosschannelstart = center; - - center = new paper.Point(center.x + 2 * valvespacing + 2 * radius + channelWidth, center.y); - circle = new paper.Path.Circle(center, radius); - transposer_control.addChild(circle); - - crosschannelend = center; - - // Draw the cross channel connecting the 3nd row valves - rect = new paper.Path.Rectangle({ - from: new paper.Point(crosschannelstart.x, crosschannelstart.y - channelWidth / 2), - to: new paper.Point(crosschannelend.x, crosschannelstart.y + channelWidth / 2) - }); - - transposer_control.addChild(rect); - - topLeft = new paper.Point(crosschannelend.x, crosschannelstart.y - channelWidth / 2); - bottomRight = new paper.Point(center.x + 2 * valvespacing + 4 * radius + channelWidth + channelWidth / 2, crosschannelstart.y + channelWidth / 2); - transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // Bottom Row valve - center = new paper.Point(px + channelWidth + 2 * valvespacing + radius, py + 4 * valvespacing + 4 * radius + 2 * channelWidth); - circle = new paper.Path.Circle(center, radius); - transposer_control.addChild(circle); - - topLeft = new paper.Point(px - 2 * radius - channelWidth / 2, py - 2 * radius - channelWidth / 2); - bottomRight = new paper.Point(px - 2 * radius + channelWidth / 2, py + 4 * valvespacing + 6 * radius + 2 * channelWidth); - transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(px - 2 * radius - channelWidth / 2, py + 4 * valvespacing + 6 * radius + 2 * channelWidth - channelWidth / 2); - bottomRight = new paper.Point(px + channelWidth + 2 * valvespacing + radius, py + 4 * valvespacing + 6 * radius + 2 * channelWidth + channelWidth / 2); - transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - topLeft = new paper.Point(px + channelWidth + 2 * valvespacing + radius - channelWidth / 2, py + 4 * valvespacing + 4 * radius + 2 * channelWidth); - bottomRight = new paper.Point(px + channelWidth + 2 * valvespacing + radius + channelWidth / 2, py + 4 * valvespacing + 6 * radius + 2 * channelWidth + channelWidth / 2); - transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight)); - - // Finally we draw the cross channel - const topleftpoint = new paper.Point(px + valvespacing, py + channelWidth / 2 + 2 * radius + 2 * valvespacing); - const bottomleftpoint = new paper.Point(topleftpoint.x + +4 * valvespacing + 3 * channelWidth + 4 * radius, topleftpoint.y + channelWidth); - const rectangle = new paper.Path.Rectangle(topleftpoint, bottomleftpoint); - transposer_control.addChild(rectangle); - - transposer_control.rotate(rotation, new paper.Point(px + 3 * valvespacing + 1.5 * channelWidth + 2 * radius, py + channelWidth + 2 * valvespacing + 2 * radius)); - - transposer_control.fillColor = color; - return transposer_control; - } -} diff --git a/src/app/library/tree.ts b/src/app/library/tree.ts deleted file mode 100644 index cecb6597..00000000 --- a/src/app/library/tree.ts +++ /dev/null @@ -1,283 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Tree extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - flowChannelWidth: "Float", - rotation: "Float", - spacing: "Float", - in: "Integer", - out: "Integer", - width: "Float", - height: "Float", - stageLength: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - flowChannelWidth: 0.8 * 1000, - rotation: 0, - spacing: 4 * 1000, - in: 1, - out: 8, - width: 2.46 * 1000, - height: 250, - stageLength: 4000 - }; - - this.__units = { - componentSpacing: "μm", - flowChannelWidth: "μm", - rotation: "°", - spacing: "μm", - in: "", - out: "", - width: "μm", - height: "μm", - stageLength: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - flowChannelWidth: 10, - spacing: 30, - in: 1, - out: 2, - width: 60, - height: 10, - stageLength: 100, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - flowChannelWidth: 2000, - spacing: 12000, - in: 1, - out: 128, - width: 12 * 1000, - height: 1200, - stageLength: 6000, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - flowChannelWidth: "flowChannelWidth", - rotation: "rotation", - spacing: "spacing", - width: "width", - in: "in", - out: "out", - stageLength: "stageLength" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - flowChannelWidth: "flowChannelWidth", - rotation: "rotation", - spacing: "spacing", - width: "width", - in: "in", - out: "out", - stageLength: "stageLength" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "TREE"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const ports = []; - const cw = params.flowChannelWidth; - const spacing = params.spacing; - const ins = params.in; - const outs = params.out; - let leafs; - if (ins < outs) { - leafs = outs; - } else { - leafs = ins; - } - const stagelength = params.stageLength; - - const levels = Math.ceil(Math.log2(leafs)); - const w = spacing * (leafs / 2 + 1); - - const length = levels * (cw + stagelength) + stagelength; - const width = 2 * 0.5 * w * 2 * Math.pow(0.5, levels); - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - - for (let i = 0; i < leafs; i++) { - ports.push(new ComponentPort(((leafs - 1) * width) / 2 - i * width, length, (2 + i).toString(), LogicalLayerType.FLOW)); - } - - return ports; - } - - render2D(params: { [k: string]: any }, key: string): paper.CompoundPath { - const position = params.position; - const cw = params.flowChannelWidth; - const rotation = params.rotation; - const spacing = params.spacing; - const ins = params.in; - const outs = params.out; - let leafs; - if (ins < outs) { - leafs = outs; - } else { - leafs = ins; - } - const color = params.color; - const stagelength = params.stageLength; - const px = position[0]; - const py = position[1]; - - const levels = Math.ceil(Math.log2(leafs)); - let isodd = false; // This is used to figure out how many lines have to be made - if (leafs % 2 === 0) { - isodd = false; - } else { - isodd = true; - } - const w = spacing * (leafs / 2 + 1); - const l = (levels + 1) * stagelength; - - // console.log("CW: " + cw + " levels: "+ levels + " width: " + w + " length: " + l) - - const treepath = new paper.CompoundPath(""); - - this.__generateTwig(treepath, px, py, cw, stagelength, w, 1, levels); - - // Draw the tree - - treepath.fillColor = color; - return (treepath.rotate(rotation, new paper.Point(px, py)) as unknown) as paper.CompoundPath; - } - - __generateTwig(treepath: paper.CompoundPath, px: number, py: number, cw: number, stagelength: number, newspacing: number, level: number, maxlevel: number, islast = false): void { - // var newspacing = 2 * (spacing + cw); - const hspacing = newspacing / 2; - const lex = px - 0.5 * newspacing; - const ley = py + cw + stagelength; - const rex = px + 0.5 * newspacing; - const rey = py + cw + stagelength; - - if (level === maxlevel) { - islast = true; - // console.log("Final Spacing: " + newspacing) - } - - this.__drawtwig(treepath, px, py, cw, stagelength, newspacing, islast); - // drawtwig(treepath, lex, ley, cw, stagelength, hspacing, islast); - // drawtwig(treepath, rex, rey, cw, stagelength, hspacing, islast); - - if (!islast) { - this.__generateTwig(treepath, lex, ley, cw, stagelength, hspacing, level + 1, maxlevel); - this.__generateTwig(treepath, rex, rey, cw, stagelength, hspacing, level + 1, maxlevel); - } - } - - __drawtwig(treepath: paper.CompoundPath, px: number, py: number, cw: number, stagelength: number, spacing: number, drawleafs = false): paper.CompoundPath { - // stem - let startPoint = new paper.Point(px - cw / 2, py); - let endPoint = new paper.Point(px + cw / 2, py + stagelength); - let rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - strokeWidth: 0 - }); - - treepath.addChild(rec); - - // Draw 2 leafs - // left leaf - const lstartx = px - 0.5 * (cw + spacing); - const lendx = lstartx + cw; - const lstarty = py + stagelength + cw; - const lendy = lstarty + stagelength; - - // //right leaf - const rstartx = px + 0.5 * (spacing - cw); - const rendx = rstartx + cw; - const rstarty = py + stagelength + cw; - const rendy = rstarty + stagelength; - - if (drawleafs) { - startPoint = new paper.Point(lstartx, lstarty); - endPoint = new paper.Point(lendx, lendy); - rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - strokeWidth: 0 - }); - treepath.addChild(rec); - - startPoint = new paper.Point(rstartx, rstarty); - endPoint = new paper.Point(rendx, rendy); - rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - strokeWidth: 0 - }); - treepath.addChild(rec); - } - - // Horizontal bar - const hstartx = px - 0.5 * (cw + spacing); - const hendx = rendx; - const hstarty = py + stagelength; - const hendy = hstarty + cw; - startPoint = new paper.Point(hstartx, hstarty); - endPoint = new paper.Point(hendx, hendy); - rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - strokeWidth: 0 - }); - treepath.addChild(rec); - return treepath; - } - - render2DTarget(key: string | null, params: { [k: string]: any }): paper.CompoundPath { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/valve.ts b/src/app/library/valve.ts deleted file mode 100644 index a6282780..00000000 --- a/src/app/library/valve.ts +++ /dev/null @@ -1,135 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType, ValveType } from "../core/init"; -import ValveTemplate from "./valveTemplate"; - -export default class Valve extends ValveTemplate { - constructor(valveType: ValveType) { - super(valveType); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - length: "Float", - width: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - width: 1.23 * 1000, - length: 4.92 * 1000, - height: 250 - }; - - this.__units = { - componentSpacing: "μm", - rotation: "°", - length: "μm", - width: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - rotation: 0, - width: 30, - length: 120, - height: 10 - }; - - this.__maximum = { - componentSpacing: 10000, - rotation: 180, - width: 6000, - length: 24 * 1000, - height: 1200 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - length: "length", - width: "width", - rotation: "rotation" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - length: "length", - width: "width", - rotation: "rotation" - }; - - this.__placementTool = "valveInsertionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["CONTROL"]; - - this.__mint = "VALVE"; - - this.__zOffsetKeys = { - CONTROL: "height" - }; - - this.__substrateOffset = { - CONTROL: "+1" - }; - } - - getPorts(params: { [k: string]: any }) { - const l = params.length; - const w = params.width; - - const ports = []; - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.CONTROL)); - - return ports; - } - - render2D(params: { [k: string]: any }, key = "CONTROL") { - const position = params.position; - const px = position[0]; - const py = position[1]; - const l = params.length; - const w = params.width; - const color = params.color; - const rotation = params.rotation; - const startX = px - w / 2; - const startY = py - l / 2; - const endX = px + w / 2; - const endY = py + l / 2; - const startPoint = new paper.Point(startX, startY); - const endPoint = new paper.Point(endX, endY); - const rec = new paper.Path.Rectangle({ - from: startPoint, - to: endPoint, - radius: 0, - fillColor: color, - strokeWidth: 0 - }); - rec.rotate(rotation, new paper.Point(px, py)); - let compoundPath = new paper.CompoundPath(rec); - compoundPath.fillColor = color; - return (compoundPath); - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const render = this.render2D(params, "CONTROL"); - render.fillColor = params.color; - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/valve3D.ts b/src/app/library/valve3D.ts deleted file mode 100644 index 654798d9..00000000 --- a/src/app/library/valve3D.ts +++ /dev/null @@ -1,191 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType, ValveType } from "../core/init"; -import ValveTemplate from "./valveTemplate"; - -export default class Valve3D extends ValveTemplate { - constructor(valveType: ValveType) { - super(valveType); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - rotation: "Float", - valveRadius: "Float", - height: "Float", - gap: "Float", - width: "Float", - length: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - rotation: 0, - valveRadius: 1.2 * 1000, - height: 250, - gap: 0.6 * 1000, - width: 2.4 * 1000, - length: 2.4 * 1000 - }; - - this.__units = { - componentSpacing: "μm", - valveRadius: "μm", - height: "μm", - gap: "μm", - width: "μm", - length: "μm", - rotation: "°" - }; - - this.__minimum = { - componentSpacing: 0, - valveRadius: 0.1 * 100, - height: 0.1 * 100, - gap: 0.5 * 10, - rotation: 0, - width: 10, - length: 10 - - }; - - this.__maximum = { - componentSpacing: 10000, - valveRadius: 0.3 * 10000, - height: 1.2 * 1000, - gap: 0.1 * 10000, - rotation: 180, - width: 3 * 1000, - length: 3 * 1000 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - radius1: "valveRadius", - radius2: "valveRadius", - valveRadius: "valveRadius", - gap: "gap" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - position: "position", - rotation: "rotation", - radius1: "valveRadius", - radius2: "valveRadius", - valveRadius: "valveRadius", - gap: "gap" - }; - - this.__placementTool = "valveInsertionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW", "CONTROL", "INVERSE"]; - - this.__mint = "VALVE3D"; - - this.__zOffsetKeys = { - FLOW: "height", - CONTROL: "height", - INVERSE: "height" - }; - - this.__substrateOffset = { - FLOW: "0", - CONTROL: "+1", - INVERSE: "0" - }; - - this.__childFeatureMacros = [ - "VALVE3D GAP", - "VALVE3D FLOW", - ]; - } - - getPorts(params: { [k: string]: any }) { - const ports = []; - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.CONTROL)); - - return ports; - } - - __drawFlow(params: { [k: string]: any }) { - const position = params.position; - const gap = params.gap; - const radius = params.valveRadius; - const color = params.color; - const rotation = params.rotation; - - const center = new paper.Point(position[0], position[1]); - // let h0p0, h0p1, h0p2, h1p0, h1p1, h1p2; - const circ = new paper.Path.Circle(center, radius); - // circ.fillColor = color; - // if (String(color) === "3F51B5") { - const cutout = new paper.Path.Rectangle({ - from: new paper.Point(position[0] - radius, position[1] - gap / 2), - to: new paper.Point(position[0] + radius, position[1] + gap / 2) - }); - // cutout.fillColor = "white"; - const valve = circ.subtract(cutout); - valve.rotate(rotation, center); - valve.fillColor = color; - return valve; - } - - __drawControl(params: { [k: string]: any }) { - const position = params.position; - const gap = params.gap; - const radius = params.valveRadius; - const color = params.color; - const rotation = params.rotation; - const center = new paper.Point(position[0], position[1]); - // let h0p0, h0p1, h0p2, h1p0, h1p1, h1p2; - const circ = new paper.Path.Circle(center, radius); - circ.fillColor = color; - return circ; - } - - render2D(params: { [k: string]: any }, key = "FLOW") { - if (key === "FLOW") { - return this.__drawFlow(params); - } else if (key === "CONTROL") { - return this.__drawControl(params); - } else if (key === "INVERSE") { - return this.__drawInverseFlow(params); - } else { - throw new Error("No render procedure defined for component:" + this.__mint + ", key: " + key); - } - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - const render = this.render2D(params, "FLOW"); - render.fillColor!.alpha = 0.5; - return render; - } - - __drawInverseFlow(params: { [k: string]: any }): paper.PathItem { - const position = params.position; - const gap = params.gap; - const radius = params.valveRadius; - const color = params.color; - console.log("Color:", color); - const rotation = params.rotation; - const center = new paper.Point(position[0], position[1]); - // let h0p0, h0p1, h0p2, h1p0, h1p1, h1p2; - const circ = new paper.Path.Circle(center, radius); - circ.fillColor = color; - return (circ.rotate(rotation, center) as unknown) as paper.Path.Circle; - } -} diff --git a/src/app/library/valveTemplate.ts b/src/app/library/valveTemplate.ts deleted file mode 100644 index fdf0dcdf..00000000 --- a/src/app/library/valveTemplate.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { extend } from "vue/types/umd"; -import Template from "./template"; -import { ValveType } from "../core/init"; - -export default class ValveTemplate extends Template{ - protected _valveType: ValveType = ValveType.NORMALLY_OPEN; - constructor(valveType: ValveType) { - super(); - this._valveType = valveType; - } - - get valveType(): ValveType { - return this._valveType; - } - -} \ No newline at end of file diff --git a/src/app/library/via.ts b/src/app/library/via.ts deleted file mode 100644 index abe3ac30..00000000 --- a/src/app/library/via.ts +++ /dev/null @@ -1,105 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; - -export default class Via extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - radius: "Float", - height: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - radius: 0.7 * 1000, - height: 0 - }; - - this.__units = { - componentSpacing: "μm", - radius: "μm", - height: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - radius: 0.8 * 10, - height: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - radius: 2000, - height: 0 - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - radius: "radius" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - radius: "radius" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "VIA"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const radius = params.radius; - - const ports = []; - - ports.push(new ComponentPort(0, 0, "1", LogicalLayerType.FLOW)); - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - // Regardless of the key... - const position = params.position; - const radius = params.radius; - const color1 = params.color; - const pos = new paper.Point(position[0], position[1]); - const outerCircle = new paper.Path.Circle(pos, radius); - outerCircle.fillColor = color1; - return outerCircle; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } -} diff --git a/src/app/library/ytree.ts b/src/app/library/ytree.ts deleted file mode 100644 index edc487eb..00000000 --- a/src/app/library/ytree.ts +++ /dev/null @@ -1,250 +0,0 @@ -import Template from "./template"; -import paper from "paper"; -import ComponentPort from "../core/componentPort"; -import { LogicalLayerType } from "../core/init"; -import { CompoundPath } from "paper/dist/paper-core"; - -export default class YTree extends Template { - constructor() { - super(); - } - - __setupDefinitions(): void { - this.__unique = { - position: "Point" - }; - - this.__heritable = { - componentSpacing: "Float", - flowChannelWidth: "Float", - rotation: "Float", - spacing: "Float", - in: "Integer", - out: "Integer", - width: "Float", - height: "Float", - stageLength: "Float" - }; - - this.__defaults = { - componentSpacing: 1000, - flowChannelWidth: 0.8 * 1000, - rotation: 0, - spacing: 4 * 1000, - in: 1, - out: 8, - width: 2.46 * 1000, - height: 250, - stageLength: 4000 - }; - - this.__units = { - componentSpacing: "μm", - flowChannelWidth: "μm", - rotation: "°", - spacing: "μm", - in: "", - out: "", - width: "μm", - height: "μm", - stageLength: "μm" - }; - - this.__minimum = { - componentSpacing: 0, - flowChannelWidth: 10, - spacing: 30, - in: 1, - out: 2, - width: 60, - height: 10, - stageLength: 100, - rotation: 0 - }; - - this.__maximum = { - componentSpacing: 10000, - flowChannelWidth: 2000, - spacing: 12000, - in: 1, - out: 128, - width: 12 * 1000, - height: 1200, - stageLength: 6000, - rotation: 360 - }; - - this.__featureParams = { - componentSpacing: "componentSpacing", - position: "position", - flowChannelWidth: "flowChannelWidth", - rotation: "rotation", - spacing: "spacing", - width: "width", - in: "in", - out: "out", - stageLength: "stageLength" - }; - - this.__targetParams = { - componentSpacing: "componentSpacing", - flowChannelWidth: "flowChannelWidth", - rotation: "rotation", - spacing: "spacing", - in: "in", - out: "out", - stageLength: "stageLength" - }; - - this.__placementTool = "componentPositionTool"; - - this.__toolParams = { - position: "position" - }; - - this.__renderKeys = ["FLOW"]; - - this.__mint = "YTREE"; - - this.__zOffsetKeys = { - FLOW: "height" - }; - - this.__substrateOffset = { - FLOW: "0" - }; - } - - getPorts(params: { [k: string]: any }) { - const ports = []; - const cw = params.flowChannelWidth; - const spacing = params.spacing; - const ins = params.in; - const outs = params.out; - let rotation = params.rotation; - let leafs; - if (ins < outs) { - leafs = outs; - } else { - leafs = ins; - rotation += 180; - } - const stagelength = params.stageLength; - - const levels = Math.ceil(Math.log2(leafs)); - const w = spacing * (leafs / 2 + 1); - - const length = levels * stagelength; - const width = 2 * 0.5 * w * 2 * Math.pow(0.5, levels); - - ports.push(new ComponentPort(0, -cw / 2, "1", LogicalLayerType.FLOW)); - - for (let i = 0; i < leafs; i++) { - ports.push(new ComponentPort(((leafs - 1) * width) / 2 - i * width, length + cw / 2, (2 + i).toString(), LogicalLayerType.FLOW)); - } - - return ports; - } - - render2D(params: { [k: string]: any }, key: string) { - const position = params.position; - const cw = params.flowChannelWidth; - let rotation = params.rotation; - const spacing = params.spacing; - const ins = params.in; - const outs = params.out; - let leafs; - if (ins < outs) { - leafs = outs; - } else { - leafs = ins; - rotation += 180; - } - const color = params.color; - const stagelength = params.stageLength; - const px = position[0]; - const py = position[1]; - - const levels = Math.ceil(Math.log2(leafs)); - let isodd = false; // This is used to figure out how many lines have to be made - if (leafs % 2 === 0) { - isodd = false; - } else { - isodd = true; - } - const w = spacing * (leafs / 2 + 1); - const l = (levels + 1) * stagelength; - - const treepath = new paper.CompoundPath(""); - - this.__generateYTwig(treepath, px, py, cw, stagelength, w, 1, levels); - - // Draw the tree - - treepath.fillColor = color; - treepath.rotate(rotation, new paper.Point(px, py)); - - return treepath; - } - - render2DTarget(key: string | null, params: { [k: string]: any }) { - if (key === null) { - key = this.__renderKeys[0]; - } - const render = this.render2D(params, key); - render.fillColor!.alpha = 0.5; - return render; - } - - __generateYTwig(treepath: paper.CompoundPath, px: number, py: number, cw: number, stagelength: number, newspacing: number, level: number, maxlevel: number, islast = false): void { - const hspacing = newspacing / 2; - const lex = px - 0.5 * newspacing; - const ley = py + stagelength; - const rex = px + 0.5 * newspacing; - const rey = py + stagelength; - - if (level === maxlevel) { - islast = true; - } - - this.__drawYtwig(treepath, px, py, cw, stagelength, newspacing, islast); - - if (!islast) { - this.__generateYTwig(treepath, lex, ley, cw, stagelength, hspacing, level + 1, maxlevel); - this.__generateYTwig(treepath, rex, rey, cw, stagelength, hspacing, level + 1, maxlevel); - } - } - - __drawYtwig(treepath: paper.CompoundPath, px: number, py: number, cw: number, stagelength: number, spacing: number, drawleafs = false): paper.CompoundPath { - const pivotpoint = new paper.Point(px, py); - - // stem - const startPoint = new paper.Point(px - cw / 2, py - cw / 2); - - const angle = Math.atan(spacing / 2 / stagelength); - - const h = spacing / 2 / Math.sin(angle) + cw; - - // left leaf - let rec = new paper.Path.Rectangle({ - size: [cw, h], - point: startPoint, - radius: cw / 2, - stokeWidth: 0 - }); - rec.rotate((angle * 180) / Math.PI, pivotpoint); - treepath.addChild(rec); - - // right leaf - rec = new paper.Path.Rectangle({ - size: [cw, h], - point: startPoint, - radius: cw / 2, - stokeWidth: 0 - }); - rec.rotate((-angle * 180) / Math.PI, pivotpoint); - treepath.addChild(rec); - - return treepath; - } -} diff --git a/src/app/manufacturing/cncGenerator.ts b/src/app/manufacturing/cncGenerator.ts deleted file mode 100644 index 62f2fec5..00000000 --- a/src/app/manufacturing/cncGenerator.ts +++ /dev/null @@ -1,168 +0,0 @@ -import ManufacturingLayer from "./manufacturingLayer"; -import DepthFeatureMap from "./depthFeatureMap"; -import { LogicalLayerType } from "../core/init"; - -import Device from "../core/device"; -import Layer from "../core/layer"; -import Feature from "../core/feature"; -import viewManager from "../view/viewManager"; -import paper from "paper"; -import { DFMType } from "./manufacturingInfo"; - -/** - * GNCGenerator class - */ -export default class CNCGenerator { - __device: Device; - __viewManagerDelegate: viewManager; - __svgData: Map; - - /** - * Default Constructor of GNCGenerator object. - * @param {Device} device Device object - * @param {*} viewManagerDelegate - */ - constructor(device: Device, viewManagerDelegate: viewManager) { - this.__device = device; - this.__viewManagerDelegate = viewManagerDelegate; - - this.__svgData = new Map(); - } - - /** - * Gets the SVG output - * @returns {} - * @memberof CNCGenerator - */ - getSVGOutputs(): Map { - return this.__svgData; - } - - /** - * Generate the port layers - * @memberof CNCGenerator - * @returns {void} - */ - generatePortLayers(): void { - - console.log("Port layers called and not executed, functionality moved to generateDepthLayers"); - } - - /** - * Generates separate mfglayers and svgs for each of the depth layers - * @returns {void} - * @memberof CNCGenerator - */ - generateDepthLayers(): void { - // Generate a manufacturing layer for each logical layer, - // substrate, dpeth combination in device - // and output to svg - - const layers: Array = this.__device.layers; - - const mfglayers: Array = []; - let isControl: boolean = false; - - const manufacturingLayerMap: Map = new Map(); - for (const i in layers) { - const layer: Layer = layers[i]; - - const features: { [index: string]: Feature } = layer.features; - - if (layer.type === LogicalLayerType.CONTROL) { - isControl = true; - } - - for (const key in features) { - const feature: Feature = features[key]; - - let manufacturingLayerName: string; - if (feature.manufacturingInfo.substrate !== null) { - manufacturingLayerName = - feature.manufacturingInfo.modifier + - "_" + - feature.manufacturingInfo.layertype + - "_" + - feature.manufacturingInfo.substrate.toString() + - "_" + - feature.manufacturingInfo.depth; - } else { - throw new Error("Manufacturing layer name failed to be generated"); - } - - if (manufacturingLayerMap.has(manufacturingLayerName)) { - const manufacturingLayer: ManufacturingLayer | undefined = manufacturingLayerMap.get(manufacturingLayerName); - let issuccessful: boolean; - if (manufacturingLayer != undefined) { - issuccessful = manufacturingLayer.addFeature(this.__viewManagerDelegate.view.getRenderedFeature(feature.ID)); - if (!issuccessful) console.error("Could not find the feature for the corresponding id: " + feature.ID); - manufacturingLayerMap.set(manufacturingLayerName, manufacturingLayer); - } else { - throw new Error("manufacturingLayer undefined"); - } - } else { - const odd: number = feature.manufacturingInfo.substrate % 2; - let flip: boolean = false; - if (odd == 1) flip = true; - const manufacturingLayer = new ManufacturingLayer(manufacturingLayerName, flip); - const issuccessful: boolean = manufacturingLayer.addFeature(this.__viewManagerDelegate.view.getRenderedFeature(feature.ID)); - if (!issuccessful) console.error("Could not find the feature for the corresponding id: " + feature.ID); - manufacturingLayerMap.set(manufacturingLayerName, manufacturingLayer); - } - } - } - - manufacturingLayerMap.forEach((manufacturingLayer, manufacturingLayerName) => { - if (manufacturingLayer.flip) { - manufacturingLayer.flipX(); - } - mfglayers.push(manufacturingLayer); - }); - - console.log("XY Manufacturing Layers:", mfglayers); - const ref = this; - mfglayers.forEach(function(mfglayer: ManufacturingLayer, index: number) { - ref.__svgData.set(mfglayer.name, mfglayer.exportToSVG()); - mfglayer.flushData(); - }); - } - - /** - * Generates all the edge cuts - * @returns {void} - * @memberof CNCGenerator - */ - generateEdgeLayers(): void { - // TODO: Replace with something that does not - // simply generate a rectangle the dimensions of the device - - const topleft = new paper.Point(0, 0); - const bottomright = new paper.Point(this.__device.getXSpan(), this.__device.getYSpan()); - const edge = new paper.Path.Rectangle(topleft, bottomright); - const mfglayer = new ManufacturingLayer("UniversalEdge"); - mfglayer.addFeature(edge); - const ref = this; - ref.__svgData.set(mfglayer.name, mfglayer.exportToSVG()); - mfglayer.flushData(); - } - - /** - * Sets the device the CNCGenerator needs to work of - * @param {Device} currentDevice - * @returns {void} - * @memberof CNCGenerator - */ - setDevice(currentDevice: Device): void { - this.__device = currentDevice; - console.log("Currentdevice:", currentDevice); - } - - /** - * Flush all the data - * @returns {void} - * @memberof CNCGenerator - */ - flushData(): void { - this.__svgData.clear(); - } -} diff --git a/src/app/manufacturing/depthFeatureMap.ts b/src/app/manufacturing/depthFeatureMap.ts deleted file mode 100644 index 82ff1eca..00000000 --- a/src/app/manufacturing/depthFeatureMap.ts +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Depth feature map class - */ -export default class DepthFeatureMap { - private __name: string; - __depthMap: Map; - - /** - * Default Constructor for DepthFeatureMap object. - * @param {string} name - */ - constructor(name: string) { - this.__name = name; - this.__depthMap = new Map(); - } - - /** - * Add feature to the object - * @param {number} depth Value of depth - * @param {*} featureref - * @memberof DepthFeatureMap - * @returns {void} - */ - addFeature(depth: number, featureref: any): void { - if (this.__depthMap.has(depth)) { - // Get the array stored for the depth - const features = this.__depthMap.get(depth); - if (features != undefined) features.push(featureref); - // this.__depthMap.set(depth, features); - } else { - const features = []; - features.push(featureref); - this.__depthMap.set(depth, features); - } - } - - /** - * Gets depth - * @returns {Array} Returns all the depth - * @memberof DepthFeatureMap - */ - getDepths(): IterableIterator { - return this.__depthMap.keys(); - } - - /** - * Gets features for a certain depth - * @param {*} depth - * @returns {Array} Returns the feature of the depth - * @memberof DepthFeatureMap - */ - getFeaturesAtDepth(depth: number): Array { - if (this.__depthMap.has(depth)) { - return this.__depthMap.get(depth) as Array; - } - throw new Error("Could not find features at Depth: " + depth); - } -} diff --git a/src/app/manufacturing/laserCuttingGenerator.ts b/src/app/manufacturing/laserCuttingGenerator.ts deleted file mode 100644 index 9d6a5729..00000000 --- a/src/app/manufacturing/laserCuttingGenerator.ts +++ /dev/null @@ -1,263 +0,0 @@ -import ManufacturingLayer from "./manufacturingLayer"; -import DepthFeatureMap from "./depthFeatureMap"; -import Device from "../core/device"; -import { ComponentAPI } from "@/componentAPI"; -import Layer from "../core/layer"; -import Feature from "../core/feature"; -import { LogicalLayerType } from "../core/init"; -import paper from "paper"; -import { ViewManager } from ".."; - -/** - * Lasser Cutting Generator object - */ -export default class LaserCuttingGenerator { - private __device: Device; - private __viewManagerDelegate: ViewManager; - - private __svgData: Map; - - /** - * Default Constructor for the laser cutting generator object - * @param {Device} device Device object - * @param {*} viewManagerDelegate - */ - constructor(device: Device, viewManagerDelegate: ViewManager) { - this.__device = device; - this.__viewManagerDelegate = viewManagerDelegate; - - this.__svgData = new Map(); - } - - /** - * Gets the SVG data - * @returns Returns the SVG data - * @memberof LaserCuttingGenerator - */ - getSVGOutputs(): Map { - return this.__svgData; - } - - /** - * Generate the port layers - * @memberof LaserCuttingGenerator - * @returns {void} - */ - generatePortLayers(): void { - - console.log("Port layers called and not executed, functionality moved to generateDepthLayers"); - } - - /** - * Generates separate mfglayers and svgs for each of the depth layers - * @memberof LaserCuttingGenerator - * @returns {void} - */ - generateDepthLayers(): void { - // Generate a manufacturing layer for each logical layer, - // substrate, depth combination in device - // and output to svg - - const layers: Array = this.__device.layers; - - const mfglayers: Array = []; - let isControl: boolean = false; - - const manufacturingLayerMap: Map = new Map(); - for (const i in layers) { - const layer: Layer = layers[i]; - - const features: { [index: string]: Feature } = layer.features; - - if (layer.type === LogicalLayerType.CONTROL) { - isControl = true; - } - - for (const key in features) { - const feature: Feature = features[key]; - - let manufacturingLayerName: string; - if (feature.manufacturingInfo.substrate !== null) { - manufacturingLayerName = - feature.manufacturingInfo.modifier + - "_" + - feature.manufacturingInfo.layertype + - "_" + - feature.manufacturingInfo.substrate.toString() + - "_" + - feature.manufacturingInfo.depth; - } else { - throw new Error("Manufacturing layer name failed to be generated"); - } - - if (manufacturingLayerMap.has(manufacturingLayerName)) { - const manufacturingLayer: ManufacturingLayer | undefined = manufacturingLayerMap.get(manufacturingLayerName); - let issuccessful: boolean; - if (manufacturingLayer != undefined) { - issuccessful = manufacturingLayer.addFeature(this.__viewManagerDelegate.view.getRenderedFeature(feature.ID)); - if (!issuccessful) console.error("Could not find the feature for the corresponding id: " + feature.ID); - manufacturingLayerMap.set(manufacturingLayerName, manufacturingLayer); - } else { - throw new Error("manufacturingLayer undefined"); - } - } else { - const odd: number = feature.manufacturingInfo.substrate % 2; - let flip: boolean = false; - if (odd == 1) flip = true; - const manufacturingLayer = new ManufacturingLayer(manufacturingLayerName, flip); - const issuccessful: boolean = manufacturingLayer.addFeature(this.__viewManagerDelegate.view.getRenderedFeature(feature.ID)); - if (!issuccessful) console.error("Could not find the feature for the corresponding id: " + feature.ID); - manufacturingLayerMap.set(manufacturingLayerName, manufacturingLayer); - } - } - } - - manufacturingLayerMap.forEach((manufacturingLayer, manufacturingLayerName) => { - if (manufacturingLayer.flip) { - manufacturingLayer.flipX(); - } - mfglayers.push(manufacturingLayer); - }); - - console.log("XY Manufacturing Layers:", mfglayers); - const ref = this; - mfglayers.forEach(function(mfglayer: ManufacturingLayer, index: number) { - ref.__svgData.set(mfglayer.name, mfglayer.exportToSVG()); - mfglayer.flushData(); - }); - } - - /** - * Generates all the edge cuts - * @memberof LaserCuttingGenerator - * @returns {void} - */ - generateEdgeLayers(): void { - // TODO: Replace with something that does not - // simply generate a rectangle the dimensions of the device - - const topleft = new paper.Point(0, 0); - const bottomright = new paper.Point(this.__device.getXSpan(), this.__device.getYSpan()); - const edge = new paper.Path.Rectangle(topleft, bottomright); - const mfglayer = new ManufacturingLayer("UniversalEdge"); - mfglayer.addFeature(edge); - const ref = this; - ref.__svgData.set(mfglayer.name, mfglayer.exportToSVG()); - mfglayer.flushData(); - } - - /** - * Sets the device the CNCGenerator needs to work of - * @param {Device} currentDevice - * @memberof LaserCuttingGenerator - * @returns {void} - */ - setDevice(currentDevice: Device): void { - this.__device = currentDevice; - console.log("Currentdevice:", currentDevice); - } - - /** - * Flush all the data - * @memberof LaserCuttingGenerator - * @returns {void} - */ - flushData(): void { - this.__svgData.clear(); - } - - /** - * Generates all the glue burn off layers necessary for the valves - * @memberof LaserCuttingGenerator - * @returns {void} - */ - generateInverseControlLayers(): void { - console.log("Generating inverse layers"); - const layers: Array = this.__device.layers; - - const mfglayers: Array = []; - - let isControl: boolean = false; - const manufacturingLayerMap: Map = new Map(); - for (const i in layers) { - const layer: Layer = layers[i]; - - const features: { [index: string]: Feature } = layer.features; - - if (layer.type == LogicalLayerType.CONTROL) { - isControl = true; - } - - // Add logic to generate the here to check if its control... - if (isControl) { - // Do the actual feature generation part here - for (const key in features) { - const feature: Feature = features[key]; - // TODO: Include fabtype check also - const type: string = feature.getType(); - - /* - Check if type has an inverse layer - */ - - // Skip the EDGE features - if (type === "EDGE") { - continue; - } - - if (ComponentAPI.hasInverseRenderLayer(type)) { - let manufacturingLayerName: string; - console.log("TYPE: ",feature.type); - console.log("MANINFO: ", feature.manufacturingInfo); - if (feature.manufacturingInfo.substrate !== null) { - manufacturingLayerName = - "INVERSE" + - "_" + - feature.manufacturingInfo.layertype + - "_" + - feature.manufacturingInfo.substrate.toString() + - "_" + - feature.manufacturingInfo.depth; - } else { - throw new Error("Manufacturing layer name failed to be generated"); - } - console.log(manufacturingLayerName); - if (manufacturingLayerMap.has(manufacturingLayerName)) { - const manufacturingLayer: ManufacturingLayer | undefined = manufacturingLayerMap.get(manufacturingLayerName); - let issuccessful: boolean; - if (manufacturingLayer != undefined) { - issuccessful = manufacturingLayer.generateFeatureRender(feature, "INVERSE"); - if (!issuccessful) console.error("Could not find the feature for the corresponding id: " + feature.ID); - manufacturingLayerMap.set(manufacturingLayerName, manufacturingLayer); - } else { - throw new Error("manufacturingLayer undefined"); - } - } else { - const manufacturingLayer = new ManufacturingLayer(manufacturingLayerName); - const issuccessful: boolean = manufacturingLayer.generateFeatureRender(feature, "INVERSE"); - if (!issuccessful) console.error("Could not find the feature for the corresponding id: " + feature.ID); - manufacturingLayerMap.set(manufacturingLayerName, manufacturingLayer); - } - /* - If the type has an inverse layer, then generate the inverse feature render - and throw it into the manufacturing layer. - */ - } - } - isControl = false; - } - } - - manufacturingLayerMap.forEach((manufacturingLayer, manufacturingLayerName) => { - mfglayers.push(manufacturingLayer); - }); - - console.log("Inverse Control Manufacturing Layers:", mfglayers); - - const ref = this; - mfglayers.forEach(function(mfglayer: ManufacturingLayer, index: number) { - ref.__svgData.set(mfglayer.name, mfglayer.exportToSVG()); - mfglayer.flushData(); - }); - } -} diff --git a/src/app/manufacturing/manufacturingInfo.ts b/src/app/manufacturing/manufacturingInfo.ts deleted file mode 100644 index c0163e3f..00000000 --- a/src/app/manufacturing/manufacturingInfo.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { LogicalLayerType } from "../core/init"; - -export enum DFMType { - EDGE = "EDGE", - XYZ = "XYZ", - XY = "XY", - Z = "Z" -} - -/** - * Type which contains information for manufacturing svg production - * @param {DFMType} fabtype Type of fabrication - * @param {LogicalLayerType | null} layertype Type of layer on which the feature sits - * @param {string} rendername Key which accesses the z-offset-key and substrate--offset - * @param {string} z-offset-key Key which corresponds to the property representing height of the feature - * @param {string} substrate_offset String represented value which represent how this substrate relates to the FLOW substrate - */ -export type ManufacturingInfo = { - fabtype: DFMType; - layertype: LogicalLayerType | null; - rendername: string; - z_offset_key: string; - depth: number; - substrate_offset: string; - substrate: number | null; - modifier: string | null; -}; diff --git a/src/app/manufacturing/manufacturingLayer.ts b/src/app/manufacturing/manufacturingLayer.ts deleted file mode 100644 index ca230d17..00000000 --- a/src/app/manufacturing/manufacturingLayer.ts +++ /dev/null @@ -1,152 +0,0 @@ -import paper from "paper"; -import * as FeatureRenderer2D from "../view/render2D/featureRenderer2D"; -import Registry from "../core/registry"; -import Feature from "../core/feature"; -import Device from "../core/device"; -import { PaperView } from ".."; -import { ToolPaperObject } from "../core/init"; - -/** - * Manufacturing Layer class - */ -export default class ManufacturingLayer { - __features: Array; - __name: string; - __paperGroup: paper.Group; - __flip: boolean; - - /** - * Default Constructor for the Manufacturing Layer - * @param {String} name Name of the field - */ - constructor(name: string, flip = false) { - this.__features = []; - this.__name = name; - this.__paperGroup = new paper.Group(); - this.__flip = flip; - } - - /** - * Returns the name field - * @return {String} Returns the name of the field - * @memberof ManufacturingLayer - */ - get name(): string { - return this.__name; - } - - /** - * Returns the flip property - * @return {boolean} Returns a boolean representing whether the manufacturing layer should be flipped - * @memberof ManufacturingLayer - */ - get flip(): boolean { - return this.__flip; - } - - /** - * Adds a feature to the manufacturing layer - * @param {Feature} feature Feature to add to the layer - * @memberof ManufacturingLayer - * @returns {boolean} - */ - addFeature(feature: ToolPaperObject): boolean { - if (feature === null || undefined === feature) { - return false; - } - const copy: ToolPaperObject = feature.clone(); - console.log("Copied feature", copy); - this.__features.push(copy); - - this.__paperGroup.addChild(copy); - return true; - } - - /** - * Generates the paperjs render for a feature that has no render displayed on the canvas - * and hence cannot get the render out of display set. - * @param feature - * @param renderkey - * @returns {boolean} - * @memberof ManufacturingLayer - */ - generateFeatureRender(feature: Feature, renderkey: string | null): boolean { - console.log("Generating Render for invisible feature", feature); - - const render: ToolPaperObject = FeatureRenderer2D.renderFeature(feature, renderkey); - this.__features.push(render); - - this.__paperGroup.addChild(render); - return true; - } - - /** - * Flips the manufacturing layer in X-Axis - * @memberof ManufacturingLayer - * @returns {void} - */ - flipX(): void { - // console.warn("Implement method to flip the the group"); - /* - Step 2 - Flip the whole godamn thing - */ - const currentDevice: Device | null = Registry.currentDevice; - if (currentDevice !== null) { - const yspan = currentDevice.getYSpan(); - const xspan = currentDevice.getXSpan(); - - console.log("Flipping stuff:", xspan, yspan); - - const center = new paper.Point(xspan / 2, yspan / 2); - - this.__paperGroup.scale(-1, 1, center); - } - } - - /** - * Returns the SVG text - * @return {string} - * @memberof ManufacturingLayer - */ - exportToSVG(): string { - const currentDevice: Device | null = Registry.currentDevice; - if (currentDevice !== null) { - const yspan = currentDevice.getYSpan(); - const xspan = currentDevice.getXSpan(); - let svgtext = this.__paperGroup.exportSVG({ asString: true }); - svgtext = ManufacturingLayer.generateSVGTextPrepend(xspan, yspan) + svgtext + ManufacturingLayer.generateSVGTextAppend(); - return svgtext; - } else { - throw new Error("Registry.currentDevice is null"); - } - } - - /** - * @memberof ManufacturingLayer - * @returns {void} - */ - flushData(): void { - this.__paperGroup.removeChildren(); - } - - /** - * Generates the SVG Prepend - * @param {number} xspan - * @param {number} yspan - * @return {string} - * @memberof ManufacturingLayer - */ - static generateSVGTextPrepend(xspan: number, yspan: number): string { - const text = ``; - return text; - } - - /** - * Generates the SVG Append - * @return {string} - * @memberof ManufacturingLayer - */ - static generateSVGTextAppend(): string { - return ""; - } -} diff --git a/src/app/plugin/dafdPlugin.ts b/src/app/plugin/dafdPlugin.ts deleted file mode 100644 index a9104b48..00000000 --- a/src/app/plugin/dafdPlugin.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { Registry } from "../index"; -import Connection from "../core/connection"; -import Feature from "../core/feature"; -import ChannelTool from "../view/tools/channelTool"; -import ComponentPort from "../core/componentPort"; - -export default class DAFDPlugin { - static fixLayout(params: { [k: string]: any }): void { - // Update Params - let channelid; - const orificeSize = params.orificeSize; - const orificeLength = params.orificeLength; - const oilInputWidth = params.oilInputWidth; - const waterInputWidth = params.waterInputWidth; - const outputWidth = params.outputWidth; - const outputLength = params.outputLength; - const height = params.height; - - // Load up all the components and change their positions based on the component dimensions - const dropgen = Registry.currentDevice?.getComponentByName("DropletGen_1"); - const port_in = Registry.currentDevice?.getComponentByName("Port_in"); - const port_oil1 = Registry.currentDevice?.getComponentByName("Port_oil1"); - const port_oil2 = Registry.currentDevice?.getComponentByName("Port_oil2"); - const port_out = Registry.currentDevice?.getComponentByName("Port_out"); - - const transition_in = Registry.currentDevice?.getFeatureByName("Transition_3"); - const transition_oil1 = Registry.currentDevice?.getFeatureByName("Transition_6"); - const transition_oil2 = Registry.currentDevice?.getFeatureByName("Transition_5"); - const transition_out = Registry.currentDevice?.getFeatureByName("Transition_4"); - - // Update all the droplet generator params - dropgen?.updateParameter("orificeSize", orificeSize); - dropgen?.updateParameter("orificeLength", orificeLength); - dropgen?.updateParameter("oilInputWidth", oilInputWidth); - dropgen?.updateParameter("waterInputWidth", waterInputWidth); - dropgen?.updateParameter("outputWidth", outputWidth); - dropgen?.updateParameter("outputLength", outputLength); - dropgen?.updateParameter("height", height); - - // Update the transitions - transition_out?.updateParameter("cw2", outputWidth); - transition_in?.updateParameter("cw2", waterInputWidth); - transition_oil1?.updateParameter("cw2", oilInputWidth); - transition_oil2?.updateParameter("cw2", oilInputWidth); - - const componentports = dropgen?.ports; - console.log("component ports:", componentports); - // Draw the channels - let startpoint; - let endpoint; - let cp; - - // Align ports to the droplet generator - const dxpos = dropgen?.getPosition()[0]; - const xpos = dxpos! + oilInputWidth / 2; - let ypos = port_oil1?.getCenterPosition()[1]; - port_oil1?.updateComponentPosition([xpos, ypos!]); - ypos = port_oil2?.getCenterPosition()[1]; - port_oil2?.updateComponentPosition([xpos, ypos!]); - - // Moving teh transistions to align with droplet generators - ypos = port_oil1?.getValue("position")[1]; - transition_oil1?.updateParameter("position", [xpos, ypos]); - ypos = port_oil2?.getValue("position")[1]; - transition_oil2?.updateParameter("position", [xpos, ypos]); - const inpos = port_in?.getValue("position"); - const outpos = port_out?.getValue("position"); - transition_in?.updateParameter("position", inpos); - transition_out?.updateParameter("position", outpos); - - // Input Channel - startpoint = port_in?.getCenterPosition(); - cp = componentports?.get("4"); - endpoint = ComponentPort.calculateAbsolutePosition(cp!, dropgen!); - console.log("endpoint", endpoint); - let newChannel = ChannelTool.createChannel(startpoint, endpoint, ("RoundedChannel" as unknown) as null, ("Basic" as unknown) as null); - channelid = (newChannel as any).getID(); - - //Registry.currentLayer.addFeature(newChannel); - Registry.viewManager?.addFeature(newChannel); - - newChannel = Registry.currentDevice!.getFeatureByID(channelid); - newChannel.updateParameter("channelWidth", waterInputWidth); - - // oil top Channel - startpoint = port_oil1?.getCenterPosition(); - cp = componentports?.get("1"); - endpoint = ComponentPort.calculateAbsolutePosition(cp!, dropgen!); - console.log("endpoint", endpoint); - newChannel = ChannelTool.createChannel(startpoint, endpoint, ("RoundedChannel" as unknown) as null, ("Basic" as unknown) as null); - channelid = (newChannel as any).getID(); - - //Registry.currentLayer.addFeature(newChannel); - Registry.viewManager?.addFeature(newChannel); - newChannel = Registry.currentDevice!.getFeatureByID(channelid); - newChannel.updateParameter("channelWidth", oilInputWidth); - - // output Channel - startpoint = port_out?.getCenterPosition(); - cp = componentports?.get("2"); - endpoint = ComponentPort.calculateAbsolutePosition(cp!, dropgen!); - console.log("endpoint", endpoint); - newChannel = ChannelTool.createChannel(startpoint, endpoint, ("RoundedChannel" as unknown) as null, ("Basic" as unknown) as null); - channelid = (newChannel as any).getID(); - - //Registry.currentLayer.addFeature(newChannel); - Registry.viewManager?.addFeature(newChannel); - - newChannel = Registry.currentDevice!.getFeatureByID(channelid); - newChannel.updateParameter("channelWidth", outputWidth); - - // oil bottom Channel - startpoint = port_oil2?.getCenterPosition(); - cp = componentports?.get("3"); - console.log("cp", cp); - endpoint = ComponentPort.calculateAbsolutePosition(cp!, dropgen!); - console.log("endpoint", endpoint); - newChannel = ChannelTool.createChannel(startpoint, endpoint, ("RoundedChannel" as unknown) as null, ("Basic" as unknown) as null); - channelid = (newChannel as any).getID(); - - //Registry.currentLayer.addFeature(newChannel); - Registry.viewManager?.addFeature(newChannel); - - newChannel = Registry.currentDevice!.getFeatureByID(channelid); - newChannel.updateParameter("channelWidth", oilInputWidth); - } -} diff --git a/src/app/utils/componentUtils.ts b/src/app/utils/componentUtils.ts deleted file mode 100644 index 458a8552..00000000 --- a/src/app/utils/componentUtils.ts +++ /dev/null @@ -1,26 +0,0 @@ -import Registry from "@/app/core/registry"; -import { ComponentAPI } from "@/componentAPI"; - -export default class ComponentUtils { - constructor() {} - - static getFeatureFromID(featureid: string) { - return Registry.currentDevice!.getFeatureByID(featureid); - } - - static getRenderedFeature(featureid: string) { - return Registry.viewManager!.view.getRenderedFeature(featureid); - } - - static generateDeviceName(type: string): string { - return Registry.currentDevice!.generateNewName(type); - } - - static getDeviceLayers() { - return Registry.currentDevice!.layers; - } - - static getDeviceLayerFromID(featureid: string) { - return Registry.currentDevice!.getLayerFromFeatureID(featureid); - } -} diff --git a/src/app/utils/connectionUtils.ts b/src/app/utils/connectionUtils.ts deleted file mode 100644 index 7f31b080..00000000 --- a/src/app/utils/connectionUtils.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Registry from "@/app/core/registry"; -import { ComponentAPI } from "@/componentAPI"; - -export default class ConnectionUtils { - constructor() {} - - - static getDefinition(stringname: string) { - return ComponentAPI.getDefinition("Connection"); - } - - static getFeatureFromID(featureid: string) { - return Registry.currentDevice!.getFeatureByID(featureid); - } -} diff --git a/src/app/utils/cookieUtils.ts b/src/app/utils/cookieUtils.ts deleted file mode 100644 index 5f780445..00000000 --- a/src/app/utils/cookieUtils.ts +++ /dev/null @@ -1,21 +0,0 @@ -export function setCookie(cname: string, cvalue: string, exdays: number): void { - const d = new Date(); - d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000); - const expires = "expires=" + d.toUTCString(); - document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; -} - -export function getCookie(cname: string): string { - const name = cname + "="; - const ca = document.cookie.split(";"); - for (let i = 0; i < ca.length; i++) { - let c = ca[i]; - while (c.charAt(0) === " ") { - c = c.substring(1); - } - if (c.indexOf(name) === 0) { - return c.substring(name.length, c.length); - } - } - return ""; -} diff --git a/src/app/utils/deviceUtils.ts b/src/app/utils/deviceUtils.ts deleted file mode 100644 index c1dbbed8..00000000 --- a/src/app/utils/deviceUtils.ts +++ /dev/null @@ -1,27 +0,0 @@ -import Registry from "@/app/core/registry"; -import Layer from "../core/layer"; - -export default class DeviceUtils { - static __nameMap = new Map(); - - static addLayer(layer: Layer, index: number): void { - Registry.viewManager!.addLayer(layer, index); - } - - /** - * Generates a new new name for the type, use this to autogenerate the names for components that are typespecific - * @param {string} type - * @return {string} - * @memberof Device - */ - static generateNewName(type: string): string { - let value = DeviceUtils.__nameMap.get(type); - if (value != undefined) { - this.__nameMap.set(type, value + 1); - return type + "_" + String(value + 1); - } else { - this.__nameMap.set(type, 1); - return type + "_1"; - } - } -} diff --git a/src/app/utils/exportUtils.ts b/src/app/utils/exportUtils.ts deleted file mode 100644 index 7f4b729e..00000000 --- a/src/app/utils/exportUtils.ts +++ /dev/null @@ -1,149 +0,0 @@ -import ViewManager from "@/app/view/viewManager"; - -import { - ConnectionTargetInterchangeV1, - GeometryElementInterchangeV1_2, - InterchangeV1_2 - // DeviceInterchangeV1, - // LayerInterchangeV1, - // RenderLayerInterchangeV1, - // FeatureInterchangeV0, - // ComponentInterchangeV1, - // ConnectionInterchangeV1, - // ComponentPortInterchangeV1, - // LogicalLayerType -} from "@/app/core/init"; -import ConnectionTarget from "../core/connectionTarget"; -import GeometryElement from "../core/geometryElement"; - -export class SerializationError { - /** - * Error message for the user. - * - * @type {string} - * @memberof SerializationError - */ - public message: string; - - /** - * The element that caused the error. - * TBD on how ot use this in the future. - * @type {*} - * @memberof SerializationError - */ - public element: string; - - /** - * The JSON data that was being processed when the error occurred. - * - * @type {string} - * @memberof SerializationError - */ - public jsonData: string; - - /** - * Creates an instance of SerializationError. - * @param {string} message - * @param {string} element - * @param {string} jsonData - * @memberof SerializationError - */ - constructor(message: string, element: string, jsonData: string) { - this.message = message; - this.element = element; - this.jsonData = jsonData; - } - - /** - * Converts the error to a string. - * suitable for display to the user. or in a log file. - * - * @returns {string} - * @memberof SerializationError - */ - toText(): string { - let ret = `Error: ${this.message}\n`; - ret += `Element: ${this.element}\n`; - ret += "JSON Data:\n"; - ret += "\`\`\`\n"; - ret += this.jsonData; - ret += "\n\`\`\`\n"; - - return ret; - } -} - - -export default class ExportUtils { - - /** - * Converts a device to interchange format. - * - * @static - * @param {ViewManager} viewManagerDelegate - * @returns {InterchangeV1_2} - * @memberof ExportUtils - */ - static toInterchangeV1_2(viewManagerDelegate: ViewManager, errorList:SerializationError[]): InterchangeV1_2 { - if(viewManagerDelegate.currentDevice === null) { - throw new Error("No device selected"); - } - let renderLayers = []; - if (viewManagerDelegate === null) throw new Error("Registry or viewManager not initialized"); - for (let i = 0; i < viewManagerDelegate.renderLayers.length; i++) { - renderLayers.push(viewManagerDelegate.renderLayers[i].toInterchangeV1()); - } - const device = viewManagerDelegate.currentDevice.toInterchangeV1(errorList); - - const valvemap = {}; - const valvetypemap = {}; - - - const newScratch: InterchangeV1_2 = { - name: device.name, - params: device.params, - renderLayers: renderLayers, - layers: device.layers, - groups: device.groups, - components: device.components, - connections: device.connections, - valves: device.valves, - features: ExportUtils.featuresToInterchangeV1_2(viewManagerDelegate.currentDevice.parchmintFeatures) , - version: "1.2" - }; - - return newScratch; - } - - /** - * Converts a list of features to interchange format. - * @static - * @param {Array} featuresGeometries - * @returns {Array} - * @memberof ExportUtils - */ - static featuresToInterchangeV1_2(featuresGeometries: Array): Array { - let features: Array = []; - featuresGeometries.forEach(feature => { - features.push(feature.toInterchageV1_2()); - }); - return features; - } - - /** - * Converts a device to interchange format. - * - * @static - * @param {ConnectionTarget} target - * @returns {ConnectionTargetInterchangeV1} - * @memberof ExportUtils - */ - static toConnectionTargetInterchangeV1(target: ConnectionTarget): ConnectionTargetInterchangeV1{ - const ret: ConnectionTargetInterchangeV1 = { - component: target.component.id, - port: target.portLabel - }; - return ret; - } -} - diff --git a/src/app/utils/featureUtils.ts b/src/app/utils/featureUtils.ts deleted file mode 100644 index 42fd8df6..00000000 --- a/src/app/utils/featureUtils.ts +++ /dev/null @@ -1,47 +0,0 @@ -import Registry from "@/app/core/registry"; -import Feature from "@/app/core/feature"; -import Layer from "@/app/core/layer"; -import RenderLayer from "@/app/view/renderLayer"; -import { LogicalLayerType } from "@/app/core/init"; - -export default class FeatureUtils { - /** - * Determines substrate from layer index and susbtrate offset - * @return {number} - * @memberof FeatureUtils - */ - static setSubstrate(feature: Feature, offset: string): number { - let substrate: number; - let layer: Layer | null = feature.layer; - if (layer === null) { - throw new Error("Layer never set for feature " + feature.ID); - } else if (Registry.currentDevice === null) { - throw new Error("Current device has not been set in registry"); - } - - if (layer.type == LogicalLayerType.FLOW) { - if (offset.includes("-")) { - substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) - parseInt(offset); - } else { - substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) + parseInt(offset); - } - } else if (layer.type == LogicalLayerType.CONTROL) { - if (offset.includes("-")) { - substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) - parseInt(offset); - } else if (offset != "0") { - substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) + parseInt(offset); - } else { - substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) + 1; - } - } else if (layer.type == LogicalLayerType.INTEGRATION) { - if (offset.includes("-")) { - substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) - parseInt(offset); - } else { - substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) + parseInt(offset); - } - } else { - throw new Error("Layer type" + layer.type + "not recognized"); - } - return substrate; - } -} diff --git a/src/app/utils/geometryUtils.ts b/src/app/utils/geometryUtils.ts deleted file mode 100644 index 83e59bc4..00000000 --- a/src/app/utils/geometryUtils.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* Returns the the radian value of the specified degrees in the range of (-PI, PI] */ -export function degToRad(degrees: number): number { - const res = (degrees / 180) * Math.PI; - return res; -} - -/* Returns the radian value of the specified radians in the range of [0,360), to a precision of four decimal places. */ -export function radToDeg(radians: number): number { - const res = (radians * 180) / Math.PI; - return res; -} - -export function computeAngleFromPoints(start: number[], end: number[]): number { - const dX = end[0] - start[0]; - const dY = end[1] - start[1]; - return computeAngle(dX, dY); -} - -export function computeAngle(dX: number, dY: number): number { - return radToDeg(Math.atan2(dY, dX)); -} - -export function computeDistanceBetweenPoints(start: number[], end: number[]): number { - return computeDistance(end[0] - start[0], end[1] - start[1]); -} - -export function computeDistance(dX: number, dY: number): number { - return Math.sqrt(Math.pow(dX, 2) + Math.pow(dY, 2)); -} - -export function computeEndPoint(start: number[], angle: number, length: string | number) { - length = parseFloat(length as string); - const rad = degToRad(angle); - const dX = length * Math.cos(rad); - const dY = length * Math.sin(rad); - return [start[0] + dX, start[1] + dY]; -} diff --git a/src/app/utils/htmlUtils.ts b/src/app/utils/htmlUtils.ts deleted file mode 100644 index f8afe530..00000000 --- a/src/app/utils/htmlUtils.ts +++ /dev/null @@ -1,49 +0,0 @@ -export function removeClass(el: HTMLElement, className: string): void { - if (el.classList) el.classList.remove(className); - else el.className = el.className.replace(new RegExp("(^|\\b)" + className.split(" ").join("|") + "(\\b|$)", "gi"), " "); -} - -export function addClass(el: HTMLElement, className: string): void { - if (el.classList) el.classList.add(className); - else el.className += " " + className; -} - -// From http://stackoverflow.com/questions/8869403/drag-drop-json-into-chrome -export function DnDFileController(this: any, selector: string, onDropCallback: (files: FileList, e: unknown) => any): void { - const el_ = document.querySelector(selector); - this.dragenter = function(e: DragEvent) { - e.stopPropagation(); - e.preventDefault(); - el_?.classList.add("dropping"); - }; - - this.dragover = function(e: DragEvent) { - e.stopPropagation(); - e.preventDefault(); - }; - - this.dragleave = function(e: DragEvent) { - e.stopPropagation(); - e.preventDefault(); - // el_.classList.remove('dropping'); - }; - - this.drop = function(e: DragEvent) { - e.stopPropagation(); - e.preventDefault(); - - el_?.classList.remove("dropping"); - - onDropCallback(e.dataTransfer?.files!, e); - }; - - el_?.addEventListener("dragenter", this.dragenter, false); - el_?.addEventListener("dragover", this.dragover, false); - el_?.addEventListener("dragleave", this.dragleave, false); - el_?.addEventListener("drop", this.drop, false); -} - -export function setButtonColor(button: HTMLButtonElement, color: string, text: string): void { - button.style.background = color; - button.style.color = text; -} diff --git a/src/app/utils/ioUtils.ts b/src/app/utils/ioUtils.ts deleted file mode 100644 index 6bfd0f92..00000000 --- a/src/app/utils/ioUtils.ts +++ /dev/null @@ -1,43 +0,0 @@ -export function mapToJson(map: Map) { - console.log("map to json"); - const object: { [k: string]: any } = {}; - for (const [k, v] of map) { - // We don’t escape the key '__proto__' - // which can cause problems on older engines - object[k] = v; - } - return object; -} - -export function jsonToMap(jsonStr: { [k: string]: any }) { - console.log("json to map"); - const ret = new Map(); - for (const key in jsonStr) { - const value = jsonStr[key]; - console.log("Setting:", key, value); - ret.set(key, value); - } - return ret; -} - -function fixDeviceDimensionParams(json: { [k: string]: any }) { - if (Object.prototype.hasOwnProperty.call(json, "params")) { - if (Object.prototype.hasOwnProperty.call(json.params, "width")) { - const xspan = json.params.width; - json.params.xspan = xspan; - delete json.params.width; - console.warn("Fixed issue with incorrect device xspan param"); - } - if (Object.prototype.hasOwnProperty.call(json.params, "length")) { - const yspan = json.params.length; - json.params.yspan = yspan; - delete json.params.length; - console.warn("Fixed issue with incorrect device yspan param"); - } - } -} - -export function sanitizeV1Plus(jsonstr: { [k: string]: any }): void { - fixDeviceDimensionParams(jsonstr); - // TODO: add other proceses -} diff --git a/src/app/utils/linkedList.ts b/src/app/utils/linkedList.ts deleted file mode 100644 index 59edafd1..00000000 --- a/src/app/utils/linkedList.ts +++ /dev/null @@ -1,117 +0,0 @@ -export default class LinkedList { - head: Node | null; - tail: Node | null; - count: number; - current: Node | null; - - constructor() { - this.head = null; - this.tail = null; - this.count = 0; - this.current = null; - } - - currentData() { - return this.current?.data; - } - - removeCurrent(): void { - const prev = this.current!.prev; - const next = this.current!.next; - - prev!.next = next; - next!.prev = prev; - } - - removeNode(node: { [k: string]: any }): void { - const cnode = this.head; - if (node.id === cnode?.id) { - // remove the node - const prev = cnode!.prev; - const next = cnode!.next; - - prev!.next = next; - if (next) { - next.prev = prev; - } - } else { - let nextnode = LinkedList.getNextNode(cnode!); - while (nextnode) { - if (nextnode.id === node.id) { - // remove the node - const prev = nextnode.prev; - const next = nextnode.next; - - prev!.next = next; - if (next) { - next.prev = prev; - } - break; - } else { - nextnode = LinkedList.getNextNode(nextnode); - } - } - } - this.count--; - } - - get length() { - return this.count; - } - - push(data: { [k: string]: any }): void { - // Incase its the first one - if (this.count === 0) { - const node = new Node(data); - this.head = node; - this.tail = node; - } else { - // Save the old head - const temp = this.head; - - // Set the new head - const node = new Node(data); - node.id = this.count; - - // Create new links - node.next = temp; - temp!.prev = node; - - this.head = node; - } - this.count++; - } - - getArray() { - const retarray = []; - retarray.push(this.head!.data); - let nextnode = LinkedList.getNextNode(this.head!); - while (nextnode) { - retarray.push(nextnode.data); - nextnode = LinkedList.getNextNode(nextnode); - } - return retarray; - } - - static getNextNode(node: Node) { - return node.next; - } - - static getPreviousNode(node: Node) { - return node.prev; - } -} - -class Node { - prev: Node | null; - data: any; - next: Node | null; - id: number; - - constructor(data: any) { - this.prev = null; - this.data = data; - this.next = null; - this.id = 0; - } -} diff --git a/src/app/utils/loadUtils.ts b/src/app/utils/loadUtils.ts deleted file mode 100644 index 166277dd..00000000 --- a/src/app/utils/loadUtils.ts +++ /dev/null @@ -1,741 +0,0 @@ -import Device from "@/app/core/device"; -import Layer from "@/app/core/layer"; -import Connection from "@/app/core/connection"; -import Component from "@/app/core/component"; -import Feature from "@/app/core/feature"; -import Params from "@/app/core/params"; -import RenderLayer from "@/app/view/renderLayer"; - -import CustomComponent from "@/app/core/customComponent"; -import ComponentPort from "@/app/core/componentPort"; -import { ComponentAPI } from "@/componentAPI"; -import MapUtils from "./mapUtils"; - -import ConnectionUtils from "@/app/utils/connectionUtils"; - -import { - InterchangeV1_2, - DeviceInterchangeV1, - LayerInterchangeV1, - RenderLayerInterchangeV1_2, - FeatureInterchangeV1_2, - ComponentInterchangeV1, - ConnectionInterchangeV1_2, - ComponentPortInterchangeV1, - LogicalLayerType, - ValveType, - DeviceInterchangeV1_1 -} from "@/app/core/init"; - -export default class LoadUtils { - constructor() {} - - static loadFromScratch(json: InterchangeV1_2): [Device, Array] { - const newDevice: Device = LoadUtils.loadDeviceFromInterchangeV1_2(json); - let newRenderLayers: Array = []; - if (json.renderLayers) { - for (let i = 0; i < json.renderLayers.length; i++) { - newRenderLayers.push(LoadUtils.loadRenderLayerFromInterchangeV1(json.renderLayers[i], newDevice)); - } - } else if (Object.prototype.hasOwnProperty.call(json, "layers")) { - for (let i = 0; i < json.layers.length; i++) { - newRenderLayers.push(LoadUtils.generateRenderLayerFromLayerInterchangeV1(json.layers[i], newDevice)); - } - } else { - newRenderLayers.push(new RenderLayer(newDevice.generateNewName("RenderLayerFlow"), newDevice.layers[0], LogicalLayerType.FLOW)); - newRenderLayers.push(new RenderLayer(newDevice.generateNewName("RenderLayerControl"), newDevice.layers[1], LogicalLayerType.CONTROL)); - newRenderLayers.push(new RenderLayer(newDevice.generateNewName("RenderLayerIntegration"), newDevice.layers[0], LogicalLayerType.INTEGRATION)); - } - - // Ensures that there are three layers per group - let layerGroups: Map = new Map(); - for (let i = 0; i < newDevice.layers.length; i++) { - if (layerGroups.has(newDevice.layers[i].group)) { - const currentVal = layerGroups.get(newDevice.layers[i].group); - if (currentVal) layerGroups.set(newDevice.layers[i].group, currentVal + 1); - } else { - layerGroups.set(newDevice.layers[i].group, 1); - } - } - - layerGroups.forEach((value, key) => { - const keyVal = parseInt(key, 10); - - if (value == 3) { - console.log("All layers accounted for in group " + key); - } else { - const layerTypes: Array = ["FLOW", "CONTROL", "INTEGRATION"]; - for (const i in json.layers) { - const index = layerTypes.indexOf(json.layers[i].type); - layerTypes.splice(index, 1); - } - console.log(layerTypes.length + " layers missing from group " + key + ", these will be generated"); - for (const j in layerTypes) { - const featuresToAdd = LoadUtils.generateMissingLayerFeaturesV1(json, layerTypes[j], key); - if (layerTypes[j] == "FLOW") { - const newLayer = new Layer({}, newDevice.generateNewName("LayerFlow"), LogicalLayerType.FLOW, key, newDevice); - for (const k in featuresToAdd) { - newLayer.features[featuresToAdd[k].ID] = featuresToAdd[k]; - } - newLayer.featureCount = featuresToAdd.length; - newDevice.addLayerAtIndex(newLayer, keyVal * 3); - newRenderLayers.splice(keyVal * 3, 0, new RenderLayer(newDevice.generateNewName("RenderLayerFlow"), newDevice.layers[keyVal * 3], LogicalLayerType.FLOW)); - } - else if (layerTypes[j] == "CONTROL") { - const newLayer = new Layer({}, newDevice.generateNewName("LayerControl"), LogicalLayerType.CONTROL, key, newDevice); - for (const k in featuresToAdd) { - newLayer.features[featuresToAdd[k].ID] = featuresToAdd[k]; - } - newLayer.featureCount = featuresToAdd.length; - newDevice.addLayerAtIndex(newLayer, keyVal * 3 + 1); - newRenderLayers.splice(keyVal * 3 + 1, 0, new RenderLayer(newDevice.generateNewName("RenderLayerControl"), newDevice.layers[keyVal * 3 + 1], LogicalLayerType.CONTROL)); - } - else if (layerTypes[j] == "INTEGRATION") { - const newLayer = new Layer({}, newDevice.generateNewName("LayerIntegration"), LogicalLayerType.INTEGRATION, key, newDevice); - for (const k in featuresToAdd) { - newLayer.features[featuresToAdd[k].ID] = featuresToAdd[k]; - } - newLayer.featureCount = featuresToAdd.length; - newDevice.addLayerAtIndex(newLayer, keyVal * 3 + 2); - newRenderLayers.splice(keyVal * 3 + 2, 0, new RenderLayer(newDevice.generateNewName("RenderLayerIntegration"), newDevice.layers[keyVal * 3 + 2], LogicalLayerType.INTEGRATION)); - } - } - } - }); - - //Updating cross-references - let features = newDevice.getAllFeaturesFromDevice(); - for (let i in features) { - const feature = features[i]; - if (feature.referenceID !== null) { - newDevice.updateObjectReference(feature.referenceID, feature.ID); - } - } - - return [newDevice, newRenderLayers]; - } - - static loadDeviceFromInterchangeV1_2(json: InterchangeV1_2): Device { - let newDevice: Device; - if (Object.prototype.hasOwnProperty.call(json, "params")) { - if (Object.prototype.hasOwnProperty.call(json.params, "width") && Object.prototype.hasOwnProperty.call(json.params, "length")) { - newDevice = new Device( - { - "x-span": json.params.width, - "y-span": json.params.length - }, - json.name - ); - } else { - newDevice = new Device( - { - "x-span": 135000, - "y-span": 85000 - }, - json.name - ); - } - } else { - console.warn("Could not find device params, using some default values for device size"); - newDevice = new Device( - { - width: 135000, - length: 85000 - }, - json.name - ); - } - - //Check if JSON has layers else mark - if (Object.prototype.hasOwnProperty.call(json, "layers")) { - for (const i in json.layers) { - newDevice.addLayer(LoadUtils.loadLayerFromInterchangeV1(json, json.layers[i], newDevice)); - } - } else { - //We need to add a default layer - let newlayer = new Layer({}, newDevice.generateNewName("LayerFlow"), LogicalLayerType.FLOW, "0", newDevice); - newDevice.addLayer(newlayer); - newlayer = new Layer({}, newDevice.generateNewName("LayerControl"), LogicalLayerType.CONTROL, "0", newDevice); - newDevice.addLayer(newlayer); - newlayer = new Layer({}, newDevice.generateNewName("LayerIntegration"), LogicalLayerType.INTEGRATION, "0", newDevice); - newDevice.addLayer(newlayer); - } - - //TODO: Use this to dynamically create enough layers to scroll through - //TODO: Use these to generate a rat's nest - for (const i in json.components) { - const newComponent = LoadUtils.loadComponentFromInterchangeV1(json.components[i]); - newDevice.addComponent(newComponent); - } - - for (const i in json.connections) { - const newConnection = LoadUtils.loadConnectionFromInterchangeV1(newDevice, json.connections[i]); - newDevice.addConnection(newConnection); - } - - if (Object.prototype.hasOwnProperty.call(json, "valves")) { - for (const i in json.valves) { - const newValve = json.valves[i]; - const component = newDevice.getComponentByID(newValve.componentid); - const connection = newDevice.getConnectionByID(newValve.connectionid); - if (component === null){ - console.warn("Could not find component with ID " + newValve.componentid + " for valve " + newValve.componentid); - throw new Error("Could not find component with ID " + newValve.componentid + " for valve " + newValve.componentid); - } - if (connection === null){ - console.warn("Could not find connection with ID " + newValve.connectionid + " for valve " + newValve.componentid); - throw new Error("Could not find connection with ID " + newValve.connectionid + " for valve " + newValve.componentid); - } - newDevice.insertValve(component, connection, newValve.type); - } - } else { - console.warn("Could not find valve map, using default valve map"); - } - - return newDevice; - } - - /** - * Loads the layer information from the interchange format - * - * @static - * @param {LayerInterchangeV1} jsonlayer - * @param {Device} device - * @returns {Layer} - * @memberof LoadUtils - */ - static loadLayerFromInterchangeV1(json: DeviceInterchangeV1, jsonlayer: LayerInterchangeV1, device: Device): Layer { - let layerType = LogicalLayerType.FLOW; - if (Object.prototype.hasOwnProperty.call(jsonlayer, "type")) { - if (jsonlayer.type === "FLOW") { - layerType = LogicalLayerType.FLOW; - } else if (jsonlayer.type === "CONTROL") { - layerType = LogicalLayerType.CONTROL; - } else if (jsonlayer.type === "INTEGRATION") { - layerType = LogicalLayerType.INTEGRATION; - } else { - throw new Error("Unknown layer type: " + jsonlayer.type); - } - } - const newLayer: Layer = new Layer(jsonlayer.params, jsonlayer.name, layerType, jsonlayer.group, device); - - if (jsonlayer.features) { - for (const i in jsonlayer.features) { - newLayer.features[jsonlayer.features[i].id] = LoadUtils.loadFeatureFromInterchangeV1(jsonlayer.features[i]); - } - newLayer.featureCount = jsonlayer.features.length; - } else { - //Generate features - - //Generate feature from components - const componentFeats: Array = LoadUtils.loadFeaturesFromComponentInterchangeV1(json, jsonlayer); - for (const k in componentFeats) { - newLayer.features[componentFeats[k].ID] = componentFeats[k]; - } - newLayer.featureCount = componentFeats.length; - - //Genereate feature from connection - const connectionFeats: Array = LoadUtils.loadFeaturesFromConnectionInterchangeV1(json, jsonlayer); - for (const k in connectionFeats) { - newLayer.features[connectionFeats[k].ID] = connectionFeats[k]; - } - newLayer.featureCount = newLayer.featureCount + connectionFeats.length; - } - newLayer.id = jsonlayer.id; - - return newLayer; - } - - /** - * Loads the features from the interchange format - * - * @static - * @param {FeatureInterchangeV1_2} json - * @returns {Feature} - * @memberof LoadUtils - */ - static loadFeatureFromInterchangeV1(json: FeatureInterchangeV1_2): Feature { - // TODO: This will have to change soon when the thing is updated - console.log("PARAMS: ", json.params); - let ret = Device.makeFeature(json.macro, json.params, json.name, json.id, json.type, json.dxfData); - if (Object.prototype.hasOwnProperty.call(json, "referenceID")) { - ret.referenceID = json.referenceID; - // Registry.currentDevice.updateObjectReference(json.id, json.referenceID); - } - return ret; - } - - /** - * Loads the features for layers with no feature category from component entries - * - * @static - * @param {DeviceInterchangeV1} json - * @param {LayerInterchangeV1} jsonlayer - * @returns {Array} - * @memberof LoadUtils - */ - static loadFeaturesFromComponentInterchangeV1(json: DeviceInterchangeV1, jsonlayer: LayerInterchangeV1): Array { - const ret: Array = []; - for (const i in json.components) { - const typestring = ComponentAPI.getTypeForMINT(json.components[i].entity); - if (typestring !== null) { - let feat: Feature; - const renderKeys: Array = ComponentAPI.getAllRenderKeys(typestring); - let group: string | null = null; - for (const j in json.layers) { - if (json.layers[j].id == json.components[i].layers[0]) group = json.layers[j].group; - } - if (group !== null) { - if (renderKeys.length == 1) { - if (json.components[i].layers[0] == jsonlayer.id) { - console.log("Assuming default type feature can be placed on current layer"); - const paramstoadd = json.components[i].params; - if (!Object.prototype.hasOwnProperty.call(json.components[i].params, "position")) { - paramstoadd.position = [0.0, 0.0]; - } - feat = Device.makeFeature(typestring, paramstoadd); - feat.referenceID = json.components[i].id; - ret.push(feat); - } - } else { - for (const j in renderKeys) { - if (renderKeys[j] == jsonlayer.type) { - if (group == jsonlayer.group) { - const paramstoadd = json.components[i].params; - if (!Object.prototype.hasOwnProperty.call(json.components[i].params, "position")) { - paramstoadd.position = [0.0, 0.0]; - } - if (ComponentAPI.library[typestring].key == jsonlayer.type) { - feat = Device.makeFeature(typestring, paramstoadd); - } else if (ComponentAPI.library[typestring + "_" + jsonlayer.type.toLowerCase()]) { - feat = Device.makeFeature(typestring + "_" + jsonlayer.type.toLowerCase(), paramstoadd); - } else { - console.log("Assuming default type feature can be placed on current layer"); - feat = Device.makeFeature(typestring, paramstoadd); - } - feat.referenceID = json.components[i].id; - ret.push(feat); - } - } - } - } - } - } else { - console.log("Mint " + json.components[i].entity + "not supported"); - } - } - return ret; - } - - /** - * Loads the features for layers with no feature category from connection entries - * - * @static - * @param {DeviceInterchangeV1} json - * @param {LayerInterchangeV1} jsonlayer - * @returns {Array} - * @memberof LoadUtils - */ - static loadFeaturesFromConnectionInterchangeV1(json: DeviceInterchangeV1, jsonlayer: LayerInterchangeV1): Array { - const ret: Array = []; - for (const i in json.connections) { - if (jsonlayer.id == json.connections[i].layer) { - const mint = json.connections[i].entity; - let typestring: string | null = null; - if (mint && mint != "CHANNEL") typestring = ComponentAPI.getTypeForMINT(json.connections[i].entity); - if (typestring === null) typestring = "Connection"; - - let feat: Feature; - let rawParams = json.connections[i].params; - if (rawParams.start) { - feat = Device.makeFeature(typestring, rawParams); - feat.referenceID = json.connections[i].id; - ret.push(feat); - } else { - if (json.connections[i].paths[0]) { - const wayPoints = json.connections[i].paths[0].wayPoints; - const segments: Array<[[number, number],[number,number]]> = []; - for (let k = 0; k < wayPoints.length - 1; k++) { - segments[k] = [wayPoints[k], wayPoints[k + 1]]; - } - const newParams = { - start: ["Point", wayPoints[0][0], wayPoints[0][1]], - end: wayPoints[wayPoints.length - 1], - wayPoints: wayPoints, - segments: segments, - connectionSpacing: rawParams.connectionSpacing, - channelWidth: rawParams.channelWidth, - height: ComponentAPI.getDefaultsForType(typestring).height - }; - feat = Device.makeFeature(typestring, newParams); - feat.referenceID = json.connections[i].id; - ret.push(feat); - } else { - console.log("Connection missing path description"); - } - } - } - } - return ret; - } - - /** - * Loads the features from component entries for layers missing from a group - * Assumes no connections present on undescribed layers - * Purpose is to fill in parts of components added later (e.g., integration layer part of picoinjector) - * @static - * @param {InterchangeV1_2} json - * @param {string} type - * @param {string} layerGroup - * @returns {Array} - * @memberof LoadUtils - */ - static generateMissingLayerFeaturesV1(json: InterchangeV1_2, type: string, layerGroup: string): Array { - const ret: Array = []; - for (const i in json.components) { - const typestring = ComponentAPI.getTypeForMINT(json.components[i].entity); - if (typestring !== null) { - if (type == "FLOW") { - const libEntry = ComponentAPI.library[typestring]; - if (libEntry != undefined && libEntry.key == "FLOW") { - let componentGroup: string | null = null; - for (const j in json.layers) { - if (json.layers[j].id == json.components[i].layers[0]) componentGroup = json.layers[j].group; - } - if (componentGroup !== null && componentGroup == layerGroup) { - const feat: Feature = Device.makeFeature(typestring, json.components[i].params); - feat.referenceID = json.components[i].id; - ret.push(feat); - } - } - } else { - if (ComponentAPI.library[typestring + "_" + type.toLowerCase()]) { - let componentGroup: string | null = null; - for (const j in json.layers) { - if (json.layers[j].id == json.components[i].layers[0]) componentGroup = json.layers[j].group; - } - if (componentGroup !== null && componentGroup == layerGroup) { - const feat: Feature = Device.makeFeature(typestring + "_" + type.toLowerCase(), json.components[i].params); - feat.referenceID = json.components[i].id; - ret.push(feat); - } - } - } - } else { - console.log("Mint " + json.components[i].entity + "not supported"); - } - } - return ret; - } - - /** - * Loads the connections from the interchange format - * - * @static - * @param {Device} device - * @param {ConnectionInterchangeV1_2} json - * @returns {Connection} - * @memberof LoadUtils - */ - static loadConnectionFromInterchangeV1(device: Device, json: ConnectionInterchangeV1_2): Connection { - const name = json.name; - const id = json.id; - const entity = json.entity; - let params = json.params; - const layer = device.getLayer(json.layer); - if (layer === null) { - throw new Error("Could not find layer with id: " + json.layer); - } - if (entity) { - // Check if the params have the other unique elements necessary otherwise add them as null - if (!Object.prototype.hasOwnProperty.call(params, "start")) { - if (json.paths[0]) { - params.start = ["Point", json.paths[0].wayPoints[0][0], json.paths[0].wayPoints[0][1]]; - } else { - // Setting this value to origin - params.start = [0, 0]; - } - } - if (!Object.prototype.hasOwnProperty.call(params, "end")) { - if (json.paths) { - params.end = json.paths[0].wayPoints[json.paths[0].wayPoints.length - 1]; - } else { - // Setting this value to origin - params.end = [0, 0]; - } - } - if (!Object.prototype.hasOwnProperty.call(params, "wayPoints")) { - // TODO: setting a single waypoint at origin - if (json.paths[0]) { - params.wayPoints = json.paths[0].wayPoints; - } else { - params.wayPoints = [ - [0, 0], - [1, 2] - ]; - } - } - if (!Object.prototype.hasOwnProperty.call(params, "segments")) { - // TODO: Setting a default segment from origin to origin - if (json.paths[0]) { - const segments: Array<[[number, number],[number,number]]> = []; - for (let k = 0; k < json.paths[0].wayPoints.length - 1; k++) { - segments[k] = [json.paths[0].wayPoints[k], json.paths[0].wayPoints[k + 1]]; - } - params.segments = segments; - } else { - params.segments = [ - [ - [0, 0], - [0, 0] - ], - [ - [0, 0], - [0, 0] - ] - ]; - } - } - if (!Object.prototype.hasOwnProperty.call(params, "height")) { - params.height = ComponentAPI.getDefaultsForType("Connection").height; - } - } else { - if (json.paths[0]) { - const wayPoints = json.paths[0].wayPoints; - const rawParams = json.params; - const segments: Array<[[number, number],[number,number]]> = []; - for (let k = 0; k < wayPoints.length - 1; k++) { - segments[k] = [wayPoints[k], wayPoints[k + 1]]; - } - const typestring = "Connection"; - params = { - start: ["Point", wayPoints[0][0], wayPoints[0][1]], - end: wayPoints[wayPoints.length - 1], - wayPoints: wayPoints, - segments: segments, - connectionSpacing: rawParams.connectionSpacing, - channelWidth: rawParams.channelWidth, - height: ComponentAPI.getDefaultsForType(typestring).height - }; - } else { - console.log("Connection missing path description"); - } - } - - let definition = ConnectionUtils.getDefinition("Connection"); - - if (definition === null || definition === undefined) { - throw new Error("Could not find the definition for the Connection"); - } - const paramstoadd = new Params(params, MapUtils.toMap(definition.unique), MapUtils.toMap(definition.heritable)); - const connection = new Connection(entity, paramstoadd, name, entity, layer, id); - if (Object.prototype.hasOwnProperty.call(json, "source")) { - if (json.source !== null && json.source !== undefined) { - connection.setSourceFromJSON(device, json.source); - } - } - if (Object.prototype.hasOwnProperty.call(json, "sinks")) { - if (json.sinks !== null && json.sinks !== undefined) { - for (const i in json.sinks) { - const sink = json.sinks[i]; - connection.addSinkFromJSON(device, sink); - } - } - } - if (Object.prototype.hasOwnProperty.call(json, "paths")) { - if (json.paths !== null && json.paths !== undefined) { - for (const i in json.paths) { - connection.addWayPoints(json.paths[i].wayPoints); - } - } - } - - return connection; - } - - /** - * Loads the components from the interchange format - * - * @static - * @param {ComponentInterchangeV1} json - * @returns {Component} - * @memberof LoadUtils - */ - static loadComponentFromInterchangeV1(json: ComponentInterchangeV1): Component { - const iscustomcompnent = false; - const name = json.name; - const id = json.id; - const entity = json.entity; - - // Idk whether this is correct - // It was originially this._span = this.span which threw several errors so I patterned in off the above const var - const xspan = json["x-span"]; - const yspan = json["y-span"]; - - const params = json.params; - - // TODO - remove this dependency - // iscustomcompnent = Registry.viewManager.customComponentManager.hasDefinition(entity); - - let definition; - - if (iscustomcompnent) { - definition = CustomComponent.defaultParameterDefinitions(); - } else { - definition = ComponentAPI.getDefinitionForMINT(entity); - } - - if (definition === null) { - //Is this the way to do this? - definition = ComponentAPI.getDefinition("Template"); - console.log("Def: ", definition); - } - - if (definition === null) { - throw Error("Could not find definition for type: " + entity); - } - - let type; - let value; - for (const key in json.params) { - if (Object.prototype.hasOwnProperty.call(definition.heritable, key)) { - type = definition.heritable[key]; - } else if (Object.prototype.hasOwnProperty.call(definition.unique, key)) { - type = definition.unique[key]; - } - // let paramobject = Parameter.generateComponentParameter(key, json.params[key]); - // Check if the value type is float and convert the value from string - value = json.params[key]; - if (type === "Float" && typeof value === "string") { - value = parseFloat(value); - } - - // let paramobject = new Parameter(type, value); - params[key] = value; - } - - // Do another check and see if position is present or not - if (!Object.prototype.hasOwnProperty.call(params, "position")) { - params.position = [0.0, 0.0]; - } - const unique_map = MapUtils.toMap(definition.unique); - const heritable_map = MapUtils.toMap(definition.heritable); - const paramstoadd = new Params(params, unique_map, heritable_map); - const component = new Component(paramstoadd, name, entity, id); - - // Deserialize the component ports - const portdata = new Map(); - for (const i in json.ports) { - const componentport = LoadUtils.loadComponentPortFromInterchangeV1(json.ports[i]); - portdata.set(componentport.label, componentport); - } - - component.ports = portdata; - - return component; - } - - /** - * Loads the component port from the interchange format - * - * @static - * @param {ComponentPortInterchangeV1} json - * @returns {ComponentPort} - * @memberof LoadUtils - */ - static loadComponentPortFromInterchangeV1(json: ComponentPortInterchangeV1): ComponentPort { - let layer_type = LogicalLayerType.FLOW; - if (json.layer === "FLOW"){ - layer_type = LogicalLayerType.FLOW; - } else if (json.layer === "CONTROL") { - layer_type = LogicalLayerType.CONTROL; - } else if (json.layer === "INTEGRATION") { - layer_type = LogicalLayerType.INTEGRATION; - } - return new ComponentPort(json.x, json.y, json.label, layer_type); - } - - /** - * Loads the renderlayers from the interchange format - * - * @static - * @param {RenderLayerInterchangeV1_2} json - * @param {Device} device - * @returns {RenderLayer} - * @memberof LoadUtils - */ - static loadRenderLayerFromInterchangeV1(json: RenderLayerInterchangeV1_2, device: Device): RenderLayer { - let layerType: LogicalLayerType | undefined; - if (Object.prototype.hasOwnProperty.call(json, "type")) { - if (json.type === "FLOW") { - layerType = LogicalLayerType.FLOW; - } else if (json.type === "CONTROL") { - layerType = LogicalLayerType.CONTROL; - } else if (json.type === "INTEGRATION") { - layerType = LogicalLayerType.INTEGRATION; - } else { - throw new Error("Unknown layer type: " + json.type); - } - } - const newLayer: RenderLayer = new RenderLayer(json.name, null, layerType); - - for (const i in json.features) { - newLayer.features[json.features[i].id] = LoadUtils.loadFeatureFromInterchangeV1(json.features[i]); - } - - if (json.modellayer) { - for (let i = 0; i < device.layers.length; i++) { - if (device.layers[i].id == json.modellayer) newLayer.physicalLayer = device.layers[i]; - } - } - if (json.color) newLayer.color = json.color; // TODO: Figure out if this needs to change in the future - return newLayer; - } - - /** - * Generates the render layers from the layer information. Typically used to generate all the render layers - * for the device. - * - * @static - * @param {LayerInterchangeV1} json - * @param {Device} device - * @returns {RenderLayer} - * @memberof LoadUtils - */ - static generateRenderLayerFromLayerInterchangeV1(json: LayerInterchangeV1, device: Device): RenderLayer { - let layerType: LogicalLayerType | undefined; - if (Object.prototype.hasOwnProperty.call(json, "type")) { - if (json.type === "FLOW") { - layerType = LogicalLayerType.FLOW; - } else if (json.type === "CONTROL") { - layerType = LogicalLayerType.CONTROL; - } else if (json.type === "INTEGRATION") { - layerType = LogicalLayerType.INTEGRATION; - } else { - throw new Error("Unknown layer type: " + json.type); - } - } - const newLayer: RenderLayer = new RenderLayer(json.name, null, layerType); - - for (const i in json.features) { - newLayer.features[json.features[i].id] = LoadUtils.loadFeatureFromInterchangeV1(json.features[i]); - } - - for (let i = 0; i < device.layers.length; i++) { - if (device.layers[i].id == json.id) newLayer.physicalLayer = device.layers[i]; - } - - if (Object.prototype.hasOwnProperty.call(json, "type")) { - if (json.type === "FLOW") { - newLayer.color = "indigo"; - } else if (json.type === "CONTROL") { - newLayer.color = "red"; - } else if (json.type === "INTEGRATION") { - newLayer.color = "green"; - } else { - throw new Error("Unknown layer type: " + json.type); - } - } - return newLayer; - } -} diff --git a/src/app/utils/mapUtils.ts b/src/app/utils/mapUtils.ts deleted file mode 100644 index 3d78254d..00000000 --- a/src/app/utils/mapUtils.ts +++ /dev/null @@ -1,11 +0,0 @@ -export default class MapUtils { - static toMap(obj: { [key: string]: any }): Map { - const map = new Map(); - for (const key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - map.set(key, obj[key]); - } - } - return map; - } -} diff --git a/src/app/utils/numberUtils.ts b/src/app/utils/numberUtils.ts deleted file mode 100644 index f8afc03b..00000000 --- a/src/app/utils/numberUtils.ts +++ /dev/null @@ -1,11 +0,0 @@ -export function isFloat(n: number): boolean { - return n === +n && n !== (n | 0); -} - -export function isInteger(n: number): boolean { - return n === +n && n === (n | 0); -} - -export function isFloatOrInt(n: number): boolean { - return isFloat(n) || isInteger(n); -} diff --git a/src/app/utils/paramUtils.nots b/src/app/utils/paramUtils.nots deleted file mode 100644 index b48a9506..00000000 --- a/src/app/utils/paramUtils.nots +++ /dev/null @@ -1,38 +0,0 @@ -import { Registry } from ".."; -import FloatValue from "@/app/core/parameters/floatValue"; -import { ComponentAPI } from "@/componentAPI"; - -export const generateUpdateFunction = function(sourceID, targetID, typeString, setString, paramString) { - return function() { - const source = document.getElementById(sourceID); - const target = document.getElementById(targetID); - let param; - if (!source?.value || source?.value === "") { - return; - } - try { - param = new FloatValue(parseFloat(source?.value)); - } catch (err) { - console.log("Invalid Float value."); - return; - } - target.value = String(param.getValue()); - Registry.viewManager?.adjustParams(typeString, setString, paramString, param.getValue()); - }; -}; - -export function revertToDefaultParams(typeString:string, setString:string) { - const def = ComponentAPI.getDefinition(typeString); - if (def === null){ - throw new Error("No definition found for " + typeString); - } - const heritable = def.heritable; - const defaults = def.defaults; - - for (const key in heritable) { - const type = heritable[key]; - - Registry.viewManager?.adjustParams(typeString, setString, key, defaults[key]); - - } -} diff --git a/src/app/utils/parchmintSanitizationUtils.ts b/src/app/utils/parchmintSanitizationUtils.ts deleted file mode 100644 index e59a484c..00000000 --- a/src/app/utils/parchmintSanitizationUtils.ts +++ /dev/null @@ -1,51 +0,0 @@ -export function sanitizeJSON(json: { [k: string]: any }): { [k: string]: any } { - const components = json.components; - - for (const component of components) { - const params = component.params; - - if (Object.prototype.hasOwnProperty.call(params, "orientation")) { - let rotation = 0; - const orientation = params.orientation; - if (orientation === "V") { - rotation = 0; - } else { - rotation = 270; - } - console.log(`Changed Param of Component '${component.name}' : ${orientation}->${rotation}`); - delete params.orientation; - params.rotation = rotation; - } - } - - const features_layers = json.features; - - for (const i in features_layers) { - const feature_layer = features_layers[i]; - const features = feature_layer.features; - console.log(features); - for (const j in features) { - const feature = features[j]; - - if (Object.prototype.hasOwnProperty.call(feature, "params")) { - const params = feature.params; - - if (Object.prototype.hasOwnProperty.call(params, "orientation")) { - let rotation = 0; - const orientation = params.orientation; - if (orientation === "V") { - rotation = 0; - } else { - rotation = 270; - } - console.log(`Changed Param of feature '${feature.name}' : ${orientation}->${rotation}`); - - delete params.orientation; - params.rotation = rotation; - } - } - } - } - - return json; -} diff --git a/src/app/utils/renderLayerUtils.ts b/src/app/utils/renderLayerUtils.ts deleted file mode 100644 index 49b1f9b3..00000000 --- a/src/app/utils/renderLayerUtils.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Registry } from ".."; -import Layer from "../core/layer"; -import RenderLayer from "../view/renderLayer"; - -/** - * Looks up the render layer for a given physical layer - * - * @export - * @param {Layer} physicalLayer - * @returns {(RenderLayer | null)} - */ -export function lookUpRenderLayer(physicalLayer: Layer): RenderLayer | null { - if (Registry.viewManager === null) { - throw new Error("View manager not set in registry"); - } - for (const layer of Registry.viewManager.renderLayers) { - if (layer.physicalLayer?.id === physicalLayer.id) { - return layer; - } - } - return null; -} \ No newline at end of file diff --git a/src/app/utils/renderUtils.ts b/src/app/utils/renderUtils.ts deleted file mode 100644 index 54dea88c..00000000 --- a/src/app/utils/renderUtils.ts +++ /dev/null @@ -1,81 +0,0 @@ -import Device from "../core/device"; -import Layer from "@/app/core/layer"; -import { LogicalLayerType } from "../core/init"; -import RenderLayer from "../view/renderLayer"; -import LoadUtils from "./loadUtils"; - -export function generateRenderLayers(device: Device): Array { - - let newRenderLayers: Array = []; - newRenderLayers.push(new RenderLayer(device.generateNewName("RenderLayerFlow"), device.layers[0], LogicalLayerType.FLOW)); - newRenderLayers.push(new RenderLayer(device.generateNewName("RenderLayerControl"), device.layers[1], LogicalLayerType.CONTROL)); - newRenderLayers.push(new RenderLayer(device.generateNewName("RenderLayerIntegration"), device.layers[0], LogicalLayerType.INTEGRATION)); - - // Ensures that there are three layers per group - let layerGroups: Map = new Map(); - for (let i = 0; i < device.layers.length; i++) { - if (layerGroups.has(device.layers[i].group)) { - const currentVal = layerGroups.get(device.layers[i].group); - if (currentVal) layerGroups.set(device.layers[i].group, currentVal + 1); - } else { - layerGroups.set(device.layers[i].group, 1); - } - } - - // layerGroups.forEach((value, key) => { - // const keyVal = parseInt(key, 10); - - // if (value == 3) { - // console.log("All layers accounted for in group " + key); - // } else { - // const layerTypes: Array = ["FLOW", "CONTROL", "INTEGRATION"]; - // for (const i in json.layers) { - // const index = layerTypes.indexOf(json.layers[i].type); - // layerTypes.splice(index, 1); - // } - // console.log(layerTypes.length + " layers missing from group " + key + ", these will be generated"); - // for (const j in layerTypes) { - // const featuresToAdd = LoadUtils.generateMissingLayerFeaturesV1(json, layerTypes[j], key); - // if (layerTypes[j] == "FLOW") { - // const newLayer = new Layer({}, device.generateNewName("LayerFlow"), LogicalLayerType.FLOW, key, device); - // for (const k in featuresToAdd) { - // newLayer.features[featuresToAdd[k].ID] = featuresToAdd[k]; - // } - // newLayer.featureCount = featuresToAdd.length; - // device.addLayerAtIndex(newLayer, keyVal * 3); - // newRenderLayers.splice(keyVal * 3, 0, new RenderLayer(device.generateNewName("RenderLayerFlow"), device.layers[keyVal * 3], LogicalLayerType.FLOW)); - // } - // else if (layerTypes[j] == "CONTROL") { - // const newLayer = new Layer({}, device.generateNewName("LayerControl"), LogicalLayerType.CONTROL, key, device); - // for (const k in featuresToAdd) { - // newLayer.features[featuresToAdd[k].ID] = featuresToAdd[k]; - // } - // newLayer.featureCount = featuresToAdd.length; - // device.addLayerAtIndex(newLayer, keyVal * 3 + 1); - // newRenderLayers.splice(keyVal * 3 + 1, 0, new RenderLayer(device.generateNewName("RenderLayerControl"), device.layers[keyVal * 3 + 1], LogicalLayerType.CONTROL)); - // } - // else if (layerTypes[j] == "INTEGRATION") { - // const newLayer = new Layer({}, device.generateNewName("LayerIntegration"), LogicalLayerType.INTEGRATION, key, device); - // for (const k in featuresToAdd) { - // newLayer.features[featuresToAdd[k].ID] = featuresToAdd[k]; - // } - // newLayer.featureCount = featuresToAdd.length; - // device.addLayerAtIndex(newLayer, keyVal * 3 + 2); - // newRenderLayers.splice(keyVal * 3 + 2, 0, new RenderLayer(device.generateNewName("RenderLayerIntegration"), device.layers[keyVal * 3 + 2], LogicalLayerType.INTEGRATION)); - // } - // } - // } - // }); - - // //Updating cross-references - // let features = device.getAllFeaturesFromDevice(); - // for (let i in features) { - // const feature = features[i]; - // if (feature.referenceID !== null) { - // device.updateObjectReference(feature.referenceID, feature.ID); - // } - // } - - return newRenderLayers; - -} \ No newline at end of file diff --git a/src/app/utils/simpleQueue.ts b/src/app/utils/simpleQueue.ts deleted file mode 100644 index f8b3211f..00000000 --- a/src/app/utils/simpleQueue.ts +++ /dev/null @@ -1,47 +0,0 @@ -export default class SimpleQueue { - timeout?: number; - func: () => any; - waiting: boolean; - queued: boolean; - counter: number; - report: boolean; - - constructor(func: () => any, timeout?: number, report = false) { - this.timeout = timeout; - this.func = func; - this.waiting = false; - this.queued = true; - this.counter = 0; - this.report = report; - } - - run(): void { - if (this.waiting) { - this.counter++; - if (!this.queued) { - this.queued = true; - } - } else { - if (this.report) console.log("Waited " + this.counter + " times."); - this.func(); - this.startTimer(); - this.counter = 0; - } - } - - endTimer(): void { - this.waiting = false; - if (this.queued) { - this.queued = false; - this.run(); - } - } - - startTimer(): void { - const ref = this; - this.waiting = true; - window.setTimeout(function() { - ref.endTimer(); - }, this.timeout); - } -} diff --git a/src/app/utils/stringUtils.ts b/src/app/utils/stringUtils.ts deleted file mode 100644 index f8e3749f..00000000 --- a/src/app/utils/stringUtils.ts +++ /dev/null @@ -1,4 +0,0 @@ -// from http://stackoverflow.com/questions/1026069/capitalize-the-first-letter-of-string-in-javascript -export function capitalizeFirstLetter(string: string): string { - return string.charAt(0).toUpperCase() + string.slice(1); -} diff --git a/src/app/view/colors.ts b/src/app/view/colors.ts deleted file mode 100644 index 291174ee..00000000 --- a/src/app/view/colors.ts +++ /dev/null @@ -1,195 +0,0 @@ -// import Feature from "../core/feature"; -import * as paper from "paper"; -import Layer from "../core/layer"; -import { LogicalLayerType } from "@/app/core/init"; -import RenderLayer from "./renderLayer"; - -// Colors taken from: http://www.google.ch/design/spec/style/color.html -export const RED_500 = "#F44336"; -export const INDIGO_500 = "#3F51B5"; -export const GREEN_500 = "#4CAF50"; -export const GREEN_100 = "#C8E6C9"; -export const GREEN_A200 = "#69F0AE"; -export const DEEP_PURPLE_500 = "#673AB7"; -export const PURPLE_200 = "#E1BEE7"; -export const PURPLE_100 = "#E1BEE7"; -export const TEAL_100 = "#B2DFDB"; -export const BLUE_50 = "#e3f2fd"; -export const BLUE_100 = "#BBDEFB"; -export const BLUE_200 = "#90CAF9"; -export const BLUE_300 = "#64B5F6"; -export const BLUE_500 = "#2196F3"; -export const GREY_200 = "#EEEEEE"; -export const GREY_300 = "#E0E0E0"; -export const GREY_400 = "#BDBDBD"; -export const LIGHT_GREEN_100 = "#DCEDC8"; -export const GREY_700 = "#616161"; -export const GREY_500 = "#9E9E9E"; -export const AMBER_50 = "#FFF8E1"; -export const PINK_500 = "#E91E63"; -export const PINK_300 = "#F06292"; -export const BLACK = "#000000"; -export const WHITE = "#FFFFFF"; - -export const defaultColorKeys = ["50", "100", "200", "300", "400", "500", "600", "700", "800", "900"]; -export const darkColorKeys = ["300", "400", "500", "600", "700", "800", "900"]; - -const indigo = { - 900: "#" + "1A237E", - 800: "#" + "283593", - 700: "#" + "303F9F", - 600: "#" + "3949AB", - 500: "#" + "3F51B5", - 400: "#" + "5C6BC0", - 300: "#" + "7986CB", - 200: "#" + "9FA8DA", - 100: "#" + "C5CAE9", - 50: "#" + "E8EAF6", - A100: "#" + "8C9EFF", - A200: "#" + "536DFE", - A400: "#" + "3D5AFE", - A700: "#" + "304FFE" -}; - -const red = { - 900: "#" + "B71C1C", - 800: "#" + "C62828", - 700: "#" + "D32F2F", - 600: "#" + "E53935", - 500: "#" + "F44336", - 400: "#" + "EF5350", - 300: "#" + "E57373", - 200: "#" + "EF9A9A", - 100: "#" + "FFCDD2", - 50: "#" + "FFEBEE", - A100: "#" + "FF8A80", - A200: "#" + "FF5252", - A400: "#" + "FF1744", - A700: "#" + "D50000" -}; - -const blue = { - 900: "#" + "1A237E", - 800: "#" + "283593", - 700: "#" + "303F9F", - 600: "#" + "3949AB", - 500: "#" + "3F51B5", - 400: "#" + "5C6BC0", - 300: "#" + "7986CB", - 200: "#" + "9FA8DA", - 100: "#" + "C5CAE9", - 50: "#" + "E8EAF6", - A100: "#" + "8C9EFF", - A200: "#" + "536DFE", - A400: "#" + "3D5AFE", - A700: "#" + "304FFE" -}; - -const green = { - 900: "#" + "006200", - 800: "#" + "007600", - 700: "#" + "008900", - 600: "#" + "009d00", - 500: "#" + "00b100", - 400: "#" + "00d800", - 300: "#" + "00ff00", - 200: "#" + "3bff3b", - 100: "#" + "62ff62", - 50: "#" + "b1ffb1", - A100: "#" + "ebffeb", - A200: "#" + "9dff9d", - A400: "#" + "14ff14", - A700: "#" + "00b100" -}; - -const layerColors = { - indigo: indigo, - red: red, - blue: blue, - green: green -}; -/** - * Converts from decimal to index - * @param {number} decimal - * @param {number} indices - * @returns {number} - */ -const decimalToIndex = function(decimal: number, indices: number) { - return Math.round((indices - 1) * decimal); -}; -/** - * Converts the decimal to the corresponding layer color - * @param {number} decimal - * @param {Object} layerColors - * @param {Array} orderedKeys - */ -export function decimalToLayerColor(decimal: number, layerColors: { [k: string]: string }, orderedKeys: string[]): string { - const index = decimalToIndex(decimal, orderedKeys.length); - const key = orderedKeys[index]; - return layerColors["700"]; -} -/** - * Renders all the colors - * @param {Layer} layer - * @param {Array} orderedKeys - */ -export function renderAllColors(layer: { [k: string]: string }, orderedKeys: string[]): void { - for (let i = 0; i < orderedKeys.length; i++) { - new paper.Path.Circle({ - position: new paper.Point(0 + i * 1000, 0), - fillColor: layer[orderedKeys[i]], - radius: 500 - }); - } - - for (let i = 0; i < orderedKeys.length; i++) { - const color = decimalToLayerColor(i / orderedKeys.length, layer, orderedKeys); - new paper.Path.Circle({ - position: new paper.Point(0 + i * 1000, 2000), - fillColor: layer[orderedKeys[i]], - radius: 500 - }); - } -} -/** - * Gets the color corresponding to the layer. - * @param {Layer} layerType - */ -export function getLayerColors(layerType: LogicalLayerType) { - if (!layerType) { - throw new Error("Undefined color"); - } - - if (layerType == LogicalLayerType.FLOW) { - return layerColors.indigo; - } else if (layerType == LogicalLayerType.CONTROL) { - return layerColors.red; - } else if (layerType == LogicalLayerType.INTEGRATION) { - return layerColors.green; - } else { - throw new Error("Undefined LogicalLayerType"); - } -} -/** - * Gets the default color for the layer - * @param {Layer} layer - */ -export function getDefaultLayerColor(layer: Layer) { - if (layer === undefined) { - throw new Error("Undefined layer object passed"); - } - return getLayerColors(layer.type)["500"]; -} - -// TODO: We need to fix how this works and remove the circular dependency form this chain -export function getDefaultFeatureColor(typeString: string, layer: RenderLayer) { - if (layer) { - // let height = Feature.getDefaultsForType(typeString, setString)["height"]; - let decimal = 500; // layer.estimateLayerHeight(); - // if (!(layer as any).flip) decimal = 1 - decimal; - const colors = getLayerColors(layer.type); - return decimalToLayerColor(decimal, colors, darkColorKeys); - } else { - return decimalToLayerColor(0, layerColors.indigo, darkColorKeys); - } -} diff --git a/src/app/view/customComponentManager.ts b/src/app/view/customComponentManager.ts deleted file mode 100644 index 837185e0..00000000 --- a/src/app/view/customComponentManager.ts +++ /dev/null @@ -1,116 +0,0 @@ -import CustomComponent from "../core/customComponent"; -import Registry from "../core/registry"; -import ViewManager from "./viewManager"; - -export default class CustomComponentManager { - viewManagerDelegate: ViewManager; - private __library: Map; - - /** - * Default Constructor of the CustomComponentManger object - * @param {*} viewManager - */ - constructor(viewManager: ViewManager) { - this.viewManagerDelegate = viewManager; - this.__library = new Map(); - - // set up registry for custom tools - } - - /** - * Gets the library - * @memberof CustomComponentManager - * @returns {} - */ - get library() { - return this.__library; - } - - /** - * Inserts a new component - * @param {string} type Type of component - * @param dxfdata DXF data - * @param renderData Render data - * @returns {void} - * @memberof CustomComponentManager - */ - importComponentFromDXF(type: string, dxfdata: any, renderData: any): void { - // console.log("Yay ! loaded the data", dxfdata); - // console.log("Render Data", renderData); - // Create DXF Objects - const customcomponent = new CustomComponent(type, dxfdata); - customcomponent.renderData = renderData; - this.__library.set(type, customcomponent); - this.viewManagerDelegate.addCustomComponentTool(type); - // TODO: Update the Vue UI via the component API - // (this.viewManagerDelegate as any).rightPanel.customComponentToolBar.updateToolBar(); - } - - /** - * Import a new component from a JSON format - * @param {CustomComponent} customcomponent Custom component object - * @returns {void} - * @memberof CustomComponentManager - */ - __importComponentFromDeserializedJSON(customcomponent: CustomComponent): void { - this.__library.set(customcomponent.type, customcomponent); - this.viewManagerDelegate.addCustomComponentTool(customcomponent.type); - // TODO - Update the Vue UI via the component API - // (this.viewManagerDelegate as any).rightPanel.customComponentToolBar.updateToolBar(); - } - - /** - * Gets the custom component - * @param {*} componenttype - * @returns {} - * @memberof CustomComponentManager - */ - getCustomComponent(componenttype: string) { - return this.__library.get(componenttype); - } - - /** - * Converts to JSON format - * @returns {JSON} - * @memberof CustomComponentManager - */ - toJSON() { - const ret: { [k: string]: any } = {}; - - for (const key of this.__library.keys()) { - const customcomponent = this.__library.get(key); - // console.log("Key:", key); - // console.log("Key:", customcomponent); - ret[key] = customcomponent.toJSON(); - } - - // console.log("library", this.__library); - // console.log("ret", ret); - - return ret; - } - - /** - * Loads from a JSON format - * @param {JSON} json - * @memberof CustomComponentManager - * @returns {void} - */ - loadFromJSON(json: { [k: string]: any }): void { - for (const key in json) { - const customcomponent = CustomComponent.fromInterchangeV1(json[key]); - - this.__importComponentFromDeserializedJSON(customcomponent); - } - } - - /** - * Checks if the library has a definition ? - * @param {*} entity - * @returns {} - * @memberof CustomComponentManager - */ - hasDefinition(entity: any): boolean { - return this.__library.has(entity); - } -} diff --git a/src/app/view/designHistory.ts b/src/app/view/designHistory.ts deleted file mode 100644 index 158fdc96..00000000 --- a/src/app/view/designHistory.ts +++ /dev/null @@ -1,74 +0,0 @@ -import md5 from "md5"; -import Device from "../core/device"; - -const HISTORY_SIZE = 50; -/** - * Design History class - */ -export default class DesignHistory { - deviceData: any[]; - private __mostRecentMD5: string | null; - - /** - * Default Construcot for the Design History object - */ - constructor() { - this.deviceData = []; - this.__mostRecentMD5 = null; - } - - /** - * Adds new design to the design history - * @param {Array} devicedata - * @returns {void} - * @memberof DesignHistory - */ - pushDesign(devicedata: string): void { - // Calculate md5 hash and see if we want so save this design - const hash = md5(devicedata); - if (this.__mostRecentMD5) { - if (hash === this.__mostRecentMD5) { - return; - } - } - // Remove data from the undo stack if there is too much info there - if (this.deviceData.length > HISTORY_SIZE) { - this.deviceData.splice(0, 1); - } - - // Add to design - this.deviceData.push(devicedata); - this.__mostRecentMD5 = hash; - console.log("Saved new state:", hash); - } - - /** - * Removes a design from the history - * @returns {Device} - * @memberof DesignHistory - */ - popDesign(): string | null { - if (this.deviceData.length > 0) { - const device = this.deviceData.pop(); - return device; - } else { - return null; - } - } - - /** - * Deep copys the object being stored in the design - * @param obj - * @returns {Object} - * @memberof DesignHistory - * @private - */ - __cloneObject(obj: { [k: string]: any }) { - const clone: { [k: string]: any } = {}; - for (const i in obj) { - if (obj[i] !== null && typeof obj[i] === "object") clone[i] = this.__cloneObject(obj[i]); - else clone[i] = obj[i]; - } - return clone; - } -} diff --git a/src/app/view/grid/adaptiveGrid.ts b/src/app/view/grid/adaptiveGrid.ts deleted file mode 100644 index 829f49f2..00000000 --- a/src/app/view/grid/adaptiveGrid.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { ViewManager } from "@/app"; -import paper from "paper"; - -import * as Colors from "../colors"; - -export default class AdaptiveGrid { - private __viewManagerDelegate: ViewManager; - private __spacing: number; - private __isAutomaticEnabled: boolean; - - origin: paper.Point; - thinWidth: number; - thickWidth: number; - minSpacing: number; - maxSpacing: number; - thickCount: number; - color: paper.Color; - - constructor(viewmanager: ViewManager, minSpacing = 5, maxSpacing = 100, thickCount = 10, origin = [0, 0], thinWidth = 1, thickWidth = 3, color = Colors.BLUE_100) { - this.__viewManagerDelegate = viewmanager; - - this.origin = new paper.Point(origin[0], origin[1]); - this.thinWidth = thinWidth; // pixel - this.thickWidth = thickWidth; // pixels - this.minSpacing = minSpacing; // pixels - this.maxSpacing = maxSpacing; // pixels - this.thickCount = thickCount; - this.__spacing = 500; - this.__isAutomaticEnabled = true; - this.color = new paper.Color(color); - } - - /** - * Returns the current grid spacing - * - * @type {number} - * @memberof AdaptiveGrid - */ - get spacing(): number { - return this.__spacing; - } - - set spacing(value) { - // You can have validation code here - console.log(AdaptiveGrid.isValidZoom(value)); - this.__spacing = value; - } - - enableAdaptiveGrid(): void { - this.__isAutomaticEnabled = true; - } - - disableAdaptiveGrid(): void { - this.__isAutomaticEnabled = false; - } - - getClosestGridPoint(point: paper.Point) { - const x = Math.round((point.x - this.origin.x) / this.__spacing) * this.__spacing + this.origin.x; - const y = Math.round((point.y - this.origin.y) / this.__spacing) * this.__spacing + this.origin.y; - return new paper.Point(x, y); - } - - setOrigin(origin: number[]): void { - this.origin = new paper.Point(origin[0], origin[1]); - this.notifyViewManagerToUpdateView(); - } - - setThinWidth(width: number): void { - this.thinWidth = width; - this.notifyViewManagerToUpdateView(); - } - - setThickWidth(width: number): void { - this.thickWidth = width; - this.notifyViewManagerToUpdateView(); - } - - setMinSpacing(pixels: number): void { - this.__spacing = pixels; - this.notifyViewManagerToUpdateView(); - } - - setMaxSpacing(pixels: number): void { - this.maxSpacing = pixels; - this.notifyViewManagerToUpdateView(); - } - - setColor(color: string): void { - this.color = new paper.Color(color); - this.notifyViewManagerToUpdateView(); - } - - getSpacing(): number { - if (this.__isAutomaticEnabled) { - const zoomlevel = paper.view.zoom; - if (zoomlevel <= 0.02) { - this.__spacing = 1000; - } else if (zoomlevel <= 0.05) { - this.__spacing = 500; - } else if (zoomlevel <= 0.1) { - this.__spacing = 100; - } else if (zoomlevel <= 0.6) { - this.__spacing = 50; - } else { - this.__spacing = 5; - } - return this.__spacing; - } else { - return this.__spacing; - } - // console.log("Zoom: " + paper.view.zoom + " Spacing: " + this.__spacing); - } - - updateGridSpacing(value: number): boolean { - if (AdaptiveGrid.isValidZoom(value)) { - console.log("New spacing value:", value); - this.__spacing = value; - return true; - } else { - console.error("Inavlid Grid Spacing"); - return false; - } - } - - getThinWidth(): number { - return this.thinWidth / paper.view.zoom; - } - - getThickWidth(): number { - return this.thickWidth / paper.view.zoom; - } - - notifyViewManagerToUpdateView(): void { - if (this.__viewManagerDelegate) { - this.__viewManagerDelegate.updateGrid(); - } else { - console.error("Could not find view manager to send update grid signal"); - } - } - - static isValidZoom(value: number): boolean { - // First check if its a valid number - - // TODO: figure out if we want to round it off - - // Then check if its in bounds - - // TODO: change this to be actually functional - return true; - } -} diff --git a/src/app/view/mouseAndKeyboardHandler.ts b/src/app/view/mouseAndKeyboardHandler.ts deleted file mode 100644 index 2ea0ce05..00000000 --- a/src/app/view/mouseAndKeyboardHandler.ts +++ /dev/null @@ -1,325 +0,0 @@ -import paper from "paper"; -import PanTool from "./tools/panTool"; -import EventBus from "@/events/events"; -import { ViewManager } from ".."; - -/** - * Mouse and Keyboard Handler class - */ -export default class MouseAndKeyboardHandler { - viewManagerDelegate: ViewManager; - - private __leftMouseTool: any; - private __rightMouseTool: any; - private __middleMouseTool: any; - - /** - * Default Constructor for MouseAndKeyboardHandler object - * @param {*} viewManagerDelegate - */ - constructor(viewManagerDelegate: ViewManager) { - this.viewManagerDelegate = viewManagerDelegate; - - this.__leftMouseTool = null; - this.__rightMouseTool = null; - this.__middleMouseTool = new PanTool(viewManagerDelegate); - - // Prevent default keyboard window events - window.onkeydown = function(event: KeyboardEvent) { - const key = event.keyCode || event.which; - if (key === 46) { - event.preventDefault(); - } - }; - - this.__setupDefaultKeyboardShortcuts(); - // this.__updateViewMouseEvents(); - } - - /** - * Sets the tool for the left mouse - * @returns {void} - * @memberof MouseAndKeyboardHandler - */ - set leftMouseTool(tool) { - this.__leftMouseTool = tool; - } - - /** - * Sets the tool for the right mouse - * @param {} tool Selected tool - * @returns {void} - * @memberof MouseAndKeyboardHandler - */ - set rightMouseTool(tool) { - this.__rightMouseTool = tool; - } - - /** - * Gets the tool of the left mouse - * @returns Returns left mouse tool - * @memberof MouseAndKeyboardHandler - */ - get leftMouseTool() { - return this.__leftMouseTool; - } - - /** - * Gets the tool of the right mouse - * @returns Returns right mouse tool - * @memberof MouseAndKeyboardHandler - */ - get rightMouseTool() { - return this.__rightMouseTool; - } - - /** - * Sets up the default keyboard handlers - * @returns {void} - * @memberof MouseAndKeyboardHandler - * @private - */ - private __setupDefaultKeyboardShortcuts() { - const reference = this.viewManagerDelegate; - - window.addEventListener("keydown", function(event) { - const key = event.keyCode || event.which; - - // Saving - if ((event.ctrlKey || event.metaKey) && key === 83) { - event.preventDefault(); - reference.downloadJSON(); - } - - if (key === 70) { - // Reset the view - reference.view.initializeView(); - reference.updateGrid(); - reference.view.updateAlignmentMarks(); - event.preventDefault(); - } - - // Escape key - if (key === 27) { - // Deselect all - paper.project.deselectAll(); - - // Change active tool to select tool - reference.resetToDefaultTool(); - - // Close all windows/dialogs - EventBus.get().emit(EventBus.CLOSE_ALL_WINDOWS); - } - }); - - reference.view.setKeyDownFunction(function(event) { - const key = event.keyCode || event.which; - - // Delete - if (key === 46 || key === 8) { - reference.saveDeviceState(); - reference.view.deleteSelectedFeatures(); - } - // Copy - if ((event.ctrlKey || event.metaKey) && key === 67) { - // console.log("Ctl c detected"); - reference.initiateCopy(); - } - // Cut - if ((event.ctrlKey || event.metaKey) && key === 88) { - // console.log("Ctl x detected"); - const selectedFeatures = reference.view.getSelectedFeatures(); - if (selectedFeatures.length > 0) { - reference.pasteboard[0] = selectedFeatures[0]; - } - reference.saveDeviceState(); - reference.view.deleteSelectedFeatures(); - } - // Paste - if ((event.ctrlKey || event.metaKey) && key === 86) { - // console.log("Ctl v detected"); - const pasteboardFeatures = reference.pasteboard; - if (pasteboardFeatures.length > 0) { - reference.updateDefaultsFromFeature(pasteboardFeatures[0]); - reference.activateTool(pasteboardFeatures[0].getType()); - } - } - - // Undo - if (event.keyCode === 90 && (event.metaKey || event.ctrlKey)) { - console.log("Undo executed"); - reference.undo(); - } - - let pan_multiplier; - - if (key === 37) { - // console.log("left arrow"); - if (event.shiftKey) { - pan_multiplier = 10; - } else if (event.ctrlKey) { - pan_multiplier = 0.1; - } else { - pan_multiplier = 1; - } - reference.view.moveCenter(new paper.Point(1000 * pan_multiplier, 0)); - reference.updateGrid(); - reference.view.updateAlignmentMarks(); - } - - if (key === 38) { - // console.log("Up arrow"); - if (event.shiftKey) { - pan_multiplier = 10; - } else if (event.ctrlKey) { - pan_multiplier = 0.1; - } else { - pan_multiplier = 1; - } - reference.view.moveCenter(new paper.Point(0, 1000 * pan_multiplier)); - reference.updateGrid(); - reference.view.updateAlignmentMarks(); - } - - if (key === 39) { - // console.log("right arrow"); - if (event.shiftKey) { - pan_multiplier = 10; - } else if (event.ctrlKey) { - pan_multiplier = 0.1; - } else { - pan_multiplier = 1; - } - reference.view.moveCenter((new paper.Point(-1000 * pan_multiplier, 0))); - reference.updateGrid(); - reference.view.updateAlignmentMarks(); - } - - if (key === 40) { - // console.log("down arrow"); - if (event.shiftKey) { - pan_multiplier = 10; - } else if (event.ctrlKey) { - pan_multiplier = 0.1; - } else { - pan_multiplier = 1; - } - reference.view.moveCenter(new paper.Point(0, -1000 * pan_multiplier)); - reference.updateGrid(); - reference.view.updateAlignmentMarks(); - } - - if ((event.ctrlKey || event.metaKey) && key === 65) { - // Select all - reference.view.selectAllActive(); - return false; - } - }); - } - - /** - * Updates mouse events - * @returns {void} - * @memberof MouseAndKeyboardHandler - */ - updateViewMouseEvents(): void { - this.viewManagerDelegate.view.setMouseDownFunction(this.constructMouseDownEvent(this.__leftMouseTool, this.__middleMouseTool, this.__leftMouseTool)); - this.viewManagerDelegate.view.setMouseUpFunction(this.constructMouseUpEvent(this.__leftMouseTool, this.__middleMouseTool, this.__leftMouseTool)); - this.viewManagerDelegate.view.setMouseMoveFunction(this.constructMouseMoveEvent(this.__leftMouseTool, this.__middleMouseTool, this.__leftMouseTool)); - } - - /** - * This function is executed as a callback for every mouse down event - * @memberof MouseAndKeyboardHandler - * @returns {void} - * @private - */ - private __mouseDownCallback(event: any) { - console.log("testing down callback", event); - } - - /** - * this function is executed as a callback for every mouse up event - * @memberof MouseAndKeyboardHandler - * @returns {void} - * @private - */ - private __mouseUpCallback(event: any) { - console.log("testing up callback", event); - } - - /** - * This function is executed as a callback for every mouse move event - * @memberof MouseAndKeyboardHandler - * @returns {void} - * @private - */ - private __mouseMoveCallback(event: any) { - console.log("testing move callback", event); - } - - /** - * - * @param {*} tool1 - * @param {*} tool2 - * @param {*} tool3 - */ - constructMouseDownEvent(tool1: any, tool2: any, tool3: any) { - console.log("Tool1: ", tool1, "Tool2: ", tool2, "Tool3: ", tool3); - if (tool1 === tool3) { - console.log("Both right and left tool is the same"); - return this.constructMouseEvent(tool1.down, tool2.down, tool3.rightdown, this.__mouseDownCallback); - } else { - return this.constructMouseEvent(tool1.down, tool2.down, tool3.down); - } - } - - constructMouseMoveEvent(tool1: any, tool2: any, tool3: any) { - return this.constructMouseEvent(tool1.move, tool2.move, tool3.move, this.__mouseUpCallback); - } - - constructMouseUpEvent(tool1: any, tool2: any, tool3: any) { - return this.constructMouseEvent(tool1.up, tool2.up, tool3.up, this.__mouseMoveCallback); - } - - /** - * - * @param {*} func1 - * @param {*} func2 - * @param {*} func3 - * @param {*} buttondownCallback - * @memberof MouseAndKeyboardHandler - * @returns {Function} - */ - constructMouseEvent(func1: (...args: any[]) => any, func2: (...args: any[]) => any, func3: (...args: any[]) => any, buttondownCallback?: (...args: any[]) => any) { - console.log("construct mouse event!"); - return function(event: any) { - let target; - if (event.buttons) { - buttondownCallback!(event); - target = MouseAndKeyboardHandler.__eventButtonsToWhich(event.buttons); - } else { - target = event.which; - } - if (target === 2) { - func2(event); - } else if (target === 3) { - func3(event); - } else if (target === 1 || target === 0) { - func1(event); - } - }; - } - - static __eventButtonsToWhich(num: number): number | undefined { - if (num === 1) { - return 1; - } else if (num === 2) { - return 3; - } else if (num === 4) { - return 2; - } else if (num === 3) { - return 2; - } - } -} diff --git a/src/app/view/panAndZoom.ts b/src/app/view/panAndZoom.ts deleted file mode 100644 index 6c8c9a32..00000000 --- a/src/app/view/panAndZoom.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { PaperView } from ".."; - -/** - * Pan and Zoom class - */ -export default class PanAndZoom { - view: PaperView; - - /** - * Default Constructor for the PanAndZoom object - * @param {*} paperView - */ - constructor(paperView: PaperView) { - this.view = paperView; - } - - /** - * Sets a zoom value to a certain position - * @param {number} zoom Zoom value - * @param {Array} position X and Y coordinates - * @returns {void} - * @memberof PanAndZoom - */ - stableZoom(zoom: number, position: paper.Point): void { - const newZoom = zoom; - const p = position; - const c = this.view.getCenter(); - const beta = this.view.getZoom() / newZoom; - const pc = p.subtract(c); - const a = p.subtract(pc.multiply(beta)).subtract(c); - this.view.setCenter(this.view.getCenter().add(a)); - this.view.setZoom(newZoom); - } - - /** - * Adjust the zoom and the position - * @param {number} delta Value of adjustment of the zoom value - * @param {Array} position X and Y coordinates - * @returns {void} - * @memberof PanAndZoom - */ - adjustZoom(delta: number, position: paper.Point): void { - this.stableZoom(this.calcZoom(delta), position); - } - - // Stable pan and zoom modified from: http://matthiasberth.com/articles/stable-zoom-and-pan-in-paperjs/ - /** - * Calculates the zoom - * @param {number} delta Value of adjustment of the zoom value - * @param {number} multiplier Default = 1.177827941003 - * @returns {number} - * @memberof PanAndZoom - */ - calcZoom(delta: number, multiplier = 1.177827941003): number { - if (delta < 0) return this.view.getZoom() * multiplier; - else if (delta > 0) return this.view.getZoom() / multiplier; - else return this.view.getZoom(); - } - - /** - * Updates the center coordinates - * @param {number} delta Value of adjustment of the zoom value - * @returns {void} - * @memberof PanAndZoom - */ - moveCenter(delta: paper.Point): void { - this.view.setCenter(this.calcCenter(delta)); - } - - /** - * Calculates the new center position - * @param {number} delta Value of adjustment of the zoom value - * @returns {Array} Returns and array with X and Y coordinates - * @memberof PanAndZoom - */ - calcCenter(delta: paper.Point): paper.Point { - return this.view.getCenter().subtract(delta); - } -} diff --git a/src/app/view/paperView.ts b/src/app/view/paperView.ts deleted file mode 100644 index 37ca54ff..00000000 --- a/src/app/view/paperView.ts +++ /dev/null @@ -1,1292 +0,0 @@ -import uuid from "node-uuid"; -import EdgeFeature from "../core/edgeFeature"; -import paper from "paper"; -import { ComponentAPI } from "@/componentAPI"; - -import Registry from "../core/registry"; -import * as FeatureRenderer2D from "./render2D/featureRenderer2D"; -import GridRenderer from "./render2D/gridRenderer"; -import DeviceRenderer from "./render2D/deviceRenderer2D"; -// const DeviceRenderer = require("./render2D/deviceRenderer2D"); -// var AlignmentRenderer = require("./render2D/alignmentRenderer2D"); -import PanAndZoom from "./panAndZoom"; -import * as Colors from "./colors"; -import ManufacturingLayer from "../manufacturing/manufacturingLayer"; -import RatsNestRenderer2D from "./render2D/ratsNestRenderer2D"; -import ComponentPortRenderer2D from "./render2D/componentPortRenderer2D"; -import PaperComponentPortView from "./render2D/paperComponentPortView"; -import * as DXFObjectRenderer2D from "./render2D/dxfObjectRenderer2D"; -import * as DXFSolidObjectRenderer from "./render2D/dxfSolidObjectRenderer2D"; -import Layer from "../core/layer"; -import Device from "../core/device"; -import Feature from "../core/feature"; -import Params from "../core/params"; -import Component from "../core/component"; -import UIElement from "./uiElement"; -import TextElement from "./textElement"; -import MapUtils from "../utils/mapUtils"; -import { Point, ToolPaperObject } from "../core/init"; -import Connection from "../core/connection"; -import { ViewManager } from ".."; -import Parameter from "../core/parameter"; -import EventBus from "@/events/events"; -/** - * Paper View class - */ -export default class PaperView { - panAndZoom: PanAndZoom; - center: paper.Point; - zoom: number; - canvas: HTMLElement | null; - paperFeatures: any; - paperLayers: any; - paperGrid: paper.Group | null; - paperDevice: paper.Group | null; - activeLayer: any; - gridLayer: paper.Group; - deviceLayer: paper.Group; - featureLayer: paper.Group; - textFeatureLayer: paper.Group; - alignmentMarksLayer: paper.Group; - uiLayer: paper.Group; - ratsNestLayer: paper.Group; - componentPortsLayer: paper.Group; - currentTarget: any; - lastTargetType: string | null; - lastTargetPosition: Point | null; - lastTargetParameters: any; - selectedComponents: Array; - selectedConnections: Array; - inactiveAlpha: number; - private __viewManagerDelegate: any; - featureRegistry: Map; - lastTargetSet: string | null = null; - protected _paperComponentPortView: PaperComponentPortView; - private __ratsNestRender: paper.Group | null = null; - layerMask: any; - alignmentMarks: paper.Group | null = null; - - /** - * Requires the canvas ID to setup the entire application. - * @param {string} canvasID - * @param {} viewmanager - */ - constructor(canvasID: string, viewmanager: ViewManager) { - // Setup the Canvas - paper.setup(canvasID); - - // Get the Canvas Object - const canvas = document.getElementById(canvasID); - - this.panAndZoom = new PanAndZoom(this); - this.center = paper.view.center; - this.zoom = paper.view.zoom; - this.canvas = canvas; - this.paperFeatures = {}; - this.paperLayers = []; - this.paperGrid = null; - this.paperDevice = null; - this.activeLayer = null; - this.gridLayer = new paper.Group(); - this.deviceLayer = new paper.Group(); - this.gridLayer.insertAbove(this.deviceLayer); - this.featureLayer = new paper.Group(); - this.featureLayer.insertAbove(this.gridLayer); - this.textFeatureLayer = new paper.Group(); - this.textFeatureLayer.insertAbove(this.featureLayer); - this.alignmentMarksLayer = new paper.Group(); - this.alignmentMarksLayer.insertAbove(this.textFeatureLayer); - this.uiLayer = new paper.Group(); // This is the layer which we use to render targets - this.uiLayer.insertAbove(this.featureLayer); - this.ratsNestLayer = new paper.Group(); - this.ratsNestLayer.insertAbove(this.featureLayer); - this.componentPortsLayer = new paper.Group(); - this.componentPortsLayer.insertAbove(this.featureLayer); - this.currentTarget = null; - this.lastTargetType = null; - this.lastTargetPosition = null; - this.selectedComponents = []; - this.selectedConnections = []; - this.inactiveAlpha = 0.5; - this.__viewManagerDelegate = viewmanager; - this.featureRegistry = new Map(); - - this._paperComponentPortView = new PaperComponentPortView(this.componentPortsLayer, viewmanager); - - this.disableContextMenu(); - } - - /** - * Returns a list of selected items on the canvas - * @return {Array} - * @memberof PaperView - */ - getSelectedFeatures() { - const output = []; - const items = paper.project.selectedItems; - for (let i = 0; i < items.length; i++) { - // @ts-ignore - output.push(this.__viewManagerDelegate.getFeatureByID(items[i].featureID)); - } - return output; - } - - /** - * Deselects the items from the canvas - * @returns {void} - * @memberof PaperView - */ - clearSelectedItems(): void { - paper.project.deselectAll(); - this.selectedConnections = []; - this.selectedComponents = []; - } - - /** - * Deletes the selected features and selected components from the canvas - * TODO: Rename the method - * @returns {void} - * @memberof PaperView - */ - deleteSelectedFeatures(): void { - // TODO: Refine how this works with the selection object code later on - const items = paper.project.selectedItems; - if (items && items.length > 0) { - for (let i = 0; i < items.length; i++) { - // @ts-ignore - this.__viewManagerDelegate.removeFeatureByID(items[i].featureID); - } - - // Delete the selected Components !!! - let connection; - for (const i in this.selectedComponents) { - connection = this.__viewManagerDelegate.currentDevice.removeComponent(this.selectedComponents[i]); - if (connection) { - this.__viewManagerDelegate.updatesConnectionRender(connection); - } - } - - // Delete the selected Connecitons - for (const i in this.selectedConnections) { - this.__viewManagerDelegate.currentDevice.removeConnection(this.selectedConnections[i]); - } - } - } - - /** - * Selects all active layers in the canvas - * @returns {void} - * @memberof PaperView - */ - selectAllActive(): void { - const layer = this.paperLayers[this.activeLayer]; - for (const i in layer.children) { - layer.children[i].selected = true; - } - } - - /** - * Converts the layers to SVG format - * @memberof PaperView - * @returns {} - */ - layersToSVGStrings() { - const output = []; - for (let i = 0; i < this.featureLayer.children.length; i++) { - const layer = this.featureLayer.children[i]; - const svg = this.postProcessLayerToSVG(layer); - output.push(svg); - } - return output; - } - - /** - * Process layers to SVG - * @param {Layer} layer Layer object - * @returns Returns an SVG format - * @memberof PaperView - */ - postProcessLayerToSVG(layer: paper.Item): string { - // var flip = layer.params["flip"]; - const layerCopy = layer.clone(); - // if (flip === true) { - // layerCopy.scale(-1,1); - // } - layerCopy.bounds.topLeft = new paper.Point(0, 0); - const deviceWidth = this.__viewManagerDelegate.currentDevice.getXSpan(); - const deviceHeight = this.__viewManagerDelegate.currentDevice.getYSpan(); - layerCopy.bounds.topLeft = new paper.Point(0, 0); - layerCopy.bounds.bottomRight = new paper.Point(deviceWidth, deviceHeight); - const svg = layer.exportSVG({ - asString: true - }); - - const width = deviceWidth; - const height = deviceHeight; - const widthInMillimeters = width / 1000; - const heightInMilliMeters = height / 1000; - const prepend = ManufacturingLayer.generateSVGTextPrepend(widthInMillimeters, heightInMilliMeters); - const append = ManufacturingLayer.generateSVGTextAppend(); - const newSVG = prepend + svg + append; - layerCopy.remove(); - return newSVG; - } - - /** - * Gets the width of the canvas - * @returns {number} Returns the width of the canvas - * @memberof PaperView - */ - getCanvasWidth(): number { - if (this.canvas === null) { - throw new Error("Canvas is null"); - } - return this.canvas.clientWidth; - } - - /** - * Gets the height of the canvas - * @returns {number} Returns the height of the canvas - * @memberof PaperView - */ - getCanvasHeight(): number { - if (this.canvas === null) { - throw new Error("Canvas is null"); - } - return this.canvas.clientHeight; - } - - /** - * Gets the view of the center in mm - * @returns {number} - * @memberof PaperView - */ - getViewCenterInMillimeters() { - return [paper.view.center.x / 1000, paper.view.center.y / 1000]; - } - - /** - * Gets the device height in pixels - * @returns {number} - * @memberof PaperView - */ - getDeviceHeightInPixels(): number { - return this.__viewManagerDelegate.currentDevice.getYSpan() * paper.view.zoom; - } - - /** - * Clears the all the paper group collections stored in the paperview object. Used when everything has to be - * redrawn - * @returns {void} - * @memberof PaperView - */ - clear(): void { - this.activeLayer = null; - this.featureLayer.removeChildren(); - this.deviceLayer.removeChildren(); - this.gridLayer.removeChildren(); - this.alignmentMarksLayer.removeChildren(); - } - - /** - * Gets the center of the paper - * @returns {Array} - * @memberof PaperView - */ - getCenter(): paper.Point { - return this.center; - } - - /** - * Sets the center at a specific point of the canvas - * @param {Array} point X and Y coordinates - * @returns {void} - * @memberof PaperView - */ - setCenter(point: paper.Point): void { - this.center = point; - this.updateCenter(); - } - - /** - * Updates the paper center to the new value - * @returns {void} - * @memberof PaperView - */ - updateCenter(): void { - paper.view.center = this.center; - } - - /** - * Gets the zoom at the paper - * @returns {number} Returns zoom value - * @memberof PaperView - */ - getZoom(): number { - return this.zoom; - } - - /** - * Sets a specific zoom at the paper view - * @param {number} zoom Zoom value - * @returns {void} - * @memberof PaperView - */ - setZoom(zoom: number): void { - this.zoom = zoom; - this.updateZoom(); - - //sends out the update zoom event - EventBus.get().emit(EventBus.UPDATE_ZOOM); - } - - /** - * Updates zoom of the canvas - * @returns {void} - * @memberof PaperView - */ - updateZoom(): void { - paper.view.zoom = this.zoom; - } - - /** - * Returns the coordinates of the project - * @param {number} x X coordinate of the canvas - * @param {number} y Y coordinate of the canvas - * @returns {} - * @memberof PaperView - */ - canvasToProject(x: number, y: number) { - if (this.canvas === null) { - throw new Error("Canvas is null"); - } - const rect = this.canvas.getBoundingClientRect(); - const projX = x - rect.left; - const projY = y - rect.top; - return paper.view.viewToProject(new paper.Point(projX, projY)); - } - - /** - * Converts from canvas to project position - * @param {number} x X coordinate - * @param {number} y Y coordinate - * @returns {} - * @memberof PaperView - */ - getProjectPosition(x: number, y: number) { - return this.canvasToProject(x, y); - } - - /** - * Adds an event listener to the mouse wheel key - * @param {Function} func Event to execute - * @returns {void} - * @memberof PaperView - */ - setMouseWheelFunction(func: { (event: any): void; (event: any): void; (this: HTMLElement, ev: WheelEvent): any }): void { - if (this.canvas === null) { - throw new Error("Canvas is null"); - } - this.canvas.addEventListener("wheel", func); - } - - /** - * Adds an event listener when the mouse goes down - * @param {Function} func Event to execute - * @returns {void} - * @memberof PaperView - */ - setMouseDownFunction(func: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null): void { - if (this.canvas === null) { - throw new Error("Canvas is null"); - } - this.canvas.onmousedown = func; - } - - /** - * Adds an event listener to the mouse up key - * @param {Function} func Event to execute - * @returns {void} - * @memberof PaperView - */ - setMouseUpFunction(func: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null): void { - if (this.canvas === null) { - throw new Error("Canvas is null"); - } - this.canvas.onmouseup = func; - } - - /** - * Adds an event listener when the mouse moves - * @param {Function} func Event to execute - * @returns {void} - * @memberof PaperView - */ - setMouseMoveFunction(func: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null): void { - if (this.canvas === null) { - throw new Error("Canvas is null"); - } - this.canvas.onmousemove = func; - } - - /** - * Adds an event listener when a key is press - * @param {Function} func Event to execute - * @returns {void} - * @memberof PaperView - */ - setKeyPressFunction(func: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null): void { - if (this.canvas === null) { - throw new Error("Canvas is null"); - } - this.canvas.onkeypress = func; - } - - /** - * Adds an event listener when a key is down - * @param {Function} func Event to execute - * @returns {void} - * @memberof PaperView - */ - setKeyDownFunction(func: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null): void { - if (this.canvas === null) { - throw new Error("Canvas is null"); - } - this.canvas.onkeydown = func; - } - - /** - * Sets the resize function - * @param {Function} func Event to execute - * @returns {void} - * @memberof PaperView - */ - setResizeFunction(func: () => void | null): void { - if (this.canvas === null) { - throw new Error("Canvas is null"); - } - paper.view.onResize = func; - } - - /** - * Disables the contex menu - * @param {Function} func Event to execute - * @returns {void} - * @memberof PaperView - */ - disableContextMenu(): void { - if (this.canvas === null) { - throw new Error("Canvas is null"); - } - this.canvas.oncontextmenu = function(event) { - event.preventDefault(); - }; - } - - /** - * Refreshes the view of the paper - * @returns {void} - * @memberof PaperView - */ - refresh(): void { - paper.view.update(); - } - - /* Rendering Devices */ - /** - * Renders device - * @param {Device} device Device object - * @returns {void} - * @memberof PaperView - */ - addDevice(device: Device): void { - this.updateDevice(device); - } - - /** - * Updates a device - * @param {Device} device Device object - * @returns {void} - * @memberof PaperView - */ - updateDevice(device: Device): void { - this.removeDevice(); - const newPaperDevice = DeviceRenderer.renderDevice(device); - this.paperDevice = newPaperDevice; - this.deviceLayer.addChild(newPaperDevice); - } - - /** - * Removes the device from the paper - * @returns {void} - * @memberof PaperView - */ - removeDevice(): void { - if (this.paperDevice) this.paperDevice.remove(); - this.paperDevice = null; - //TODO: Figure out how to handle featureRegistry - //this.featureRegistry = new Map(); - } - - /* Rendering Layers */ - /** - * Renders the layers - * @param {Layer} layer Layer object - * @param {number} index Index of layer to render (Int) - * @returns {void} - * @memberof PaperView - */ - addLayer(layer: Layer, index: number): void { - this.paperLayers[index] = new paper.Group(); - this.featureLayer.addChild(this.paperLayers[index]); - // this.setActiveLayer(index); - } - - - /** - * Delete the layer from the paperview at the given index. - * @param {number} index Index of the layer to be removed (Int) - * @returns {void} - * @memberof PaperView - */ - removeLayer(index: number): void { - if (index !== -1) { - for (let i = 0; i < this.paperLayers[index].children.length; i++) { - this.featureRegistry.delete(this.paperLayers[index].children[i].featureID); - } - this.paperLayers.splice(index, 1); - } - } - - /* Rendering Features */ - /** - * Renders a feature - * @param {Feature} feature Feature to be render - * @returns {void} - * @memberof PaperView - */ - addFeature(feature: Feature): void { - this.updateFeature(feature); - } - - /** - * Sets a new active layer - * @param {number} index Index of layer to be active (Int) - * @returns {void} - * @memberof PaperView - */ - setActiveLayer(index: number): void { - this.activeLayer = index; - if (this.activeLayer !== null && this.activeLayer >= 0) this.showActiveLayer(); - } - - /** - * Show the current active layer - * @returns {void} - * @memberof PaperView - */ - showActiveLayer(): void { - this.featureLayer.remove(); - this.featureLayer = new paper.Group(); - for (let i = 0; i < this.paperLayers.length; i++) { - this.featureLayer.addChild(this.paperLayers[i]); - } - if (this.layerMask) this.layerMask.remove(); - this.layerMask = DeviceRenderer.renderLayerMask(this.__viewManagerDelegate.currentDevice); - this.featureLayer.addChild(this.layerMask); - const activeLayer = this.paperLayers[this.activeLayer]; - activeLayer.bringToFront(); - } - - /** - * Show only the desired features - * Chosen features appear - * Built for use in uF Guide Tool - * @param {Array} features Array of features to be displayed - * @returns {void} - * @memberof PaperView - */ - showChosenFeatures(features: Array): void { - this.resetFeatureLayers(); - this.featureLayer.remove(); - this.featureLayer = new paper.Group(); - for (let i = 0; i < this.paperLayers.length; i++) { - this.featureLayer.addChild(this.paperLayers[i]); - } - if (this.layerMask) this.layerMask.remove(); - this.layerMask = DeviceRenderer.renderLayerMask(this.__viewManagerDelegate.currentDevice); - this.featureLayer.addChild(this.layerMask); - const activeLayer = new paper.Group(); - for (let i = 0; i < features.length; i++) { - activeLayer.addChild(features[i]); - } - activeLayer.bringToFront(); - - const textLayer = this.getNonphysText(); - textLayer.bringToFront(); - } - - /** - * Show all but the desired features - * Chosen features behind mask - * Built for use in uF Guide Tool - * @param {Array} features Array of features to be displayed - * @returns {void} - * @memberof PaperView - */ - hideChosenFeatures(features: Array): void { - this.resetFeatureLayers(); - this.featureLayer.remove(); - this.featureLayer = new paper.Group(); - if (this.layerMask) this.layerMask.remove(); - this.layerMask = DeviceRenderer.renderLayerMask(this.__viewManagerDelegate.currentDevice); - this.featureLayer.addChild(this.layerMask); - for (let i = 0; i < this.paperLayers.length; i++) { - this.featureLayer.addChild(this.paperLayers[i]); - } - const activeLayer = new paper.Group(); - for (let i = 0; i < features.length; i++) { - activeLayer.addChild(features[i]); - } - activeLayer.insertAbove(this.gridLayer); - - const textLayer = this.getNonphysText(); - textLayer.bringToFront(); - } - - /** - * Display all features in the device - * Built for use in uF Guide Tool - * @returns {void} - * @memberof PaperView - */ - showAllFeatures(): void { - this.resetFeatureLayers(); - this.featureLayer.remove(); - this.featureLayer = new paper.Group(); - if (this.layerMask) this.layerMask.remove(); - this.layerMask = DeviceRenderer.renderLayerMask(this.__viewManagerDelegate.currentDevice); - this.featureLayer.addChild(this.layerMask); - for (let i = 0; i < this.paperLayers.length; i++) { - this.featureLayer.addChild(this.paperLayers[i]); - } - - const textLayer = this.getNonphysText(); - textLayer.bringToFront(); - } - - /** - * Return all features to the paper layers defined in featureRegistry - * Built for use in uF Guide Tool - * @returns {void} - * @memberof PaperView - */ - resetFeatureLayers(): void { - for (let i = 0; i < this.paperLayers.length; i++) { - this.featureRegistry.forEach((value, key) => { - if (this.paperLayers[i].id == value) { - this.paperLayers[i].addChild(this.paperFeatures[key]); - } - }); - } - } - - /** - * Brings nonphysical text features to the front - * Ensures nonphysical text is on top of device features - * Built for use in uF Guide Tool - * @returns {void} - * @memberof PaperView - */ - getNonphysText() { - if (Registry.viewManager === undefined || Registry.viewManager === null) { - throw new Error("Registry.viewManager is undefined"); - } - const textLayer = new paper.Group(); - const nonphysElements = Registry.viewManager.nonphysElements; - for (let i = 0; i < nonphysElements.length; i++) { - for (const j in this.paperFeatures) { - if (nonphysElements[i].type == "Text" && nonphysElements[i].featureIDs.includes(this.paperFeatures[j].featureID)) { - textLayer.addChild(this.paperFeatures[j]); - } - } - } - return textLayer; - } - - /** - * Generate nonphysical text - * Text color can be set to black, white, red, or blue - * Built for use in uF Guide Tool - * @param {string} text Text to be displayed - * @param {[number,number]} position Coordinates on the canvas grid - * @param {number} size Font size - * @param {string} color The color of the text - * @param {number} layer The layer on which - * @returns {void} - * @memberof PaperView - */ - generateNonphysText(text: string, position: paper.Point, size: number, color: any, layer = this.activeLayer): void { - const newFeature = Device.makeFeature( - "Text", - { - position: position, - height: 20, - text: text, - fontSize: size, - color: color - }, - "TEXT_" + text, - uuid.v1(), - "XY", - null - ); - this.__viewManagerDelegate.addFeature(newFeature, layer, false); - // this.addComponent("Text", newFeature.getParams(), [newFeature.ID], false); - const element = this.addUIElement("Text", newFeature.getParams(), [newFeature.ID]); - newFeature.referenceID = element.id; - this.__viewManagerDelegate.saveDeviceState(); - } - - /** - * Creates a new UIElement and adds it to viewManager's nonphysicalElements array - * Note: Takes the feature ids as an array - * TODO: Modify this to take the MINT String as another parameter - * Built for use in uF Guide Tool - * @param typeString Type of the Feature - * @param params Map of all the paramters - * @param featureIDs [String] Feature id's of all the features that will be a part of this component - */ - addUIElement(typeString: string, paramdata: { [index: string]: Parameter }, featureIDs: Array) { - if (Registry.viewManager === undefined || Registry.viewManager === null) { - console.log("ViewManager is not defined"); - throw new Error("ViewManager is not defined"); - } - let newElement; - if (typeString == "Text") { - newElement = new TextElement(typeString, paramdata, featureIDs); - } else { - newElement = new UIElement(); - // TODO: implement parameter handling for base UIElement - } - Registry.viewManager.nonphysElements.push(newElement); - return newElement; - } - - /** - * Inserts paper feature into the UILayer - * Built for use in uF Guide Tool - * @param newPaperFeature Paper feature to be added to the UI layer - */ - insertUIFeature(newPaperFeature: paper.Item): void { - this.uiLayer.insertChild(0, newPaperFeature); - } - - /** - * Creates a new component and adds it to viewManager's nonphysicalComponents or the currentDevice's __components - * Note: Takes the feature ids as an array - * TODO: Modify this to take the MINT String as another parameter - * Built for use in uF Guide Tool - * @param typeString Type of the Feature - * @param params Map of all the paramters - * @param featureIDs [String] Feature id's of all the features that will be a part of this component - * @param physical Boolean stating whether feature physical or not - */ - addComponent(typeString: string, paramdata: { [index: string]: Parameter }, featureIDs: Array, physical: boolean) { - if (Registry.viewManager === undefined || Registry.viewManager === null) { - console.error("ViewManager is not defined"); - throw new Error("ViewManager is not defined"); - } - if (Registry.currentDevice === undefined || Registry.currentDevice === null) { - console.error("Current Device is not defined"); - throw new Error("Current Device is not defined"); - } - const definition = ComponentAPI.getDefinition(typeString); - if (definition === undefined || definition === null) { - throw new Error("Component definition not found"); - } - // Clean Param Data - const cleanparamdata: { [key: string]: any } = {}; - for (const key in paramdata) { - cleanparamdata[key] = paramdata[key].value; - } - const params = new Params(cleanparamdata, MapUtils.toMap(definition.unique), MapUtils.toMap(definition.heritable)); - const componentid = ComponentAPI.generateID(); - const name = Registry.currentDevice.generateNewName(typeString); - const newComponent = new Component(params, name, definition.mint, componentid); - let feature; - - for (const i in featureIDs) { - newComponent.addFeatureID(featureIDs[i]); - - // Update the component reference - feature = this.__viewManagerDelegate.getFeatureByID(featureIDs[i]); - feature.referenceID = componentid; - } - - Registry.currentDevice.addComponent(newComponent); - return newComponent; - } - - /** - * Compares feature heights of the paper - * @param {number} a - * @param {number} b - * @returns {number} - * @memberof PaperView - */ - comparePaperFeatureHeights(a: { featureID: any }, b: { featureID: any }): number { - let bHeight; - let aHeight; - const aFeature = this.__viewManagerDelegate.getFeatureByID(a.featureID); - const bFeature = this.__viewManagerDelegate.getFeatureByID(b.featureID); - - // TODO: So this needs to be eliminated form the entire sequence - try { - aHeight = aFeature.getValue("height"); - } catch (e) { - aHeight = 9999; - } - - try { - bHeight = bFeature.getValue("height"); - } catch (e) { - bHeight = 9999; - } - return aHeight - bHeight; - } - - /** - * Insert a child component by height order - * @param {*} group - * @param {*} newChild - * @returns {void} - * @memberof PaperView - */ - insertChildByHeight(group: { children: string | any[]; insertChild: (arg0: any, arg1: any) => void }, newChild: any): void { - let index; - if (group.children.length > 0) { - index = this.getIndexByHeight(group.children, newChild); - } else { - index = 0; - } - group.insertChild(index, newChild); - } - - // TODO: Could be done faster with a binary search. Probably not needed! - /** - * Gets the index of a children component depending on it's height - * @param {*} children - * @param {*} newChild - * @returns {number} Returns the index of the component - * @memberof PaperView - */ - getIndexByHeight(children: string | any[], newChild: any): number { - for (let i = 0; i < children.length; i++) { - const test = this.comparePaperFeatureHeights(children[i], newChild); - if (test >= 0) { - return i; - } - } - return children.length; - } - - /** - * Updates the selected featured - * @param {Feature} feature Feature object - * @returns {void} - * @memberof PaperView - */ - updateFeature(feature: Feature): void { - const existingFeature = this.paperFeatures[feature.ID]; - let selected; - if (existingFeature) selected = existingFeature.selected; - else selected = false; - this.removeFeature(feature); - let newPaperFeature; - // if (!Registry.currentDevice.containsFeatureID(feature.ID)) { - // newPaperFeature = FeatureRenderer2D.renderFeature(feature); - // this.insertUIFeature(newPaperFeature); - // } else { - if (feature instanceof EdgeFeature) { - newPaperFeature = DXFObjectRenderer2D.renderEdgeFeature(feature); - newPaperFeature.selected = selected; - // @ts-ignore - this.paperFeatures[newPaperFeature.featureID] = newPaperFeature; - this.insertEdgeFeatures(newPaperFeature); - return; - } else { - newPaperFeature = FeatureRenderer2D.renderFeature(feature, null); - } - newPaperFeature.selected = selected; - this.paperFeatures[newPaperFeature.featureID] = newPaperFeature; - const index = this.__viewManagerDelegate.renderLayers.indexOf(this.__viewManagerDelegate.getRenderLayerByID(feature.ID)); - const layer = this.paperLayers[index]; - this.insertChildByHeight(layer, newPaperFeature); - this.featureRegistry.set(newPaperFeature.featureID, layer.id); - // } - } - - /** - * Removes the target that is being rendered - * @returns {void} - * @memberof PaperView - */ - removeTarget(): void { - if (this.currentTarget) this.currentTarget.remove(); - this.currentTarget = null; - } - - /** - * Add information about the target that has to be rendered - * @param {string} featureType String that identifies what kind of a feature this is - * @param {Feature} set Feature set the feature belongs to - * @param {Array} position x,y position of the feature - * @returns {void} - * @memberof PaperView - */ - addTarget(featureType: string | null, set: string, position: Point | null, currentParameters: any): void { - this.removeTarget(); - this.lastTargetParameters = currentParameters; - this.lastTargetType = featureType; - this.lastTargetPosition = position; - this.lastTargetSet = set; - this.updateTarget(); - } - - /** - * Updates the target that being rendered. This entails removing the current target and - * then creates a new target at the new position. - * @returns {void} - * @memberof PaperView - */ - updateTarget(): void { - if (this.__viewManagerDelegate.currentLayer === null){ - console.error("No layer selected"); - throw new Error("No layer selected"); - } - this.removeTarget(); - if (this.lastTargetType && this.lastTargetPosition) { - // Checks if the target is a text type target - if (this.lastTargetType === "TEXT") { - this.currentTarget = FeatureRenderer2D.renderTextTarget(this.lastTargetType, this.lastTargetPosition); - this.uiLayer.addChild(this.currentTarget); - } else if (this.lastTargetSet === "Custom") { - const customcomponent = this.__viewManagerDelegate.customComponentManager.getCustomComponent(this.lastTargetType); - // @ts-ignore - const params = Registry.featureDefaults[this.lastTargetSet][this.lastTargetType]; - params.position = this.lastTargetPosition; - params.color = Colors.getDefaultFeatureColor(this.lastTargetType, this.__viewManagerDelegate.currentLayer); - this.currentTarget = DXFSolidObjectRenderer.renderCustomComponentTarget(customcomponent, params); - this.uiLayer.addChild(this.currentTarget); - } else { - this.currentTarget = FeatureRenderer2D.renderTarget(this.lastTargetType, this.lastTargetPosition, this.lastTargetParameters); - this.uiLayer.addChild(this.currentTarget); - } - } - } - - /** - * Removes a feature - * @param {Feature} feature Feature to be removed - * @returns {void} - * @memberof PaperView - */ - removeFeature(feature: Feature): void { - const paperFeature = this.paperFeatures[feature.ID]; - if (paperFeature) { - paperFeature.remove(); - } - this.paperFeatures[feature.ID] = null; - this.featureRegistry.delete(feature.ID); - } - - /** - * Removes grid of the paper - * @returns {void} - * @memberof PaperView - */ - removeGrid(): void { - if (this.paperGrid) this.paperGrid.remove(); - this.paperGrid = null; - } - - /** - * Updates the grid of the paper - * @param {*} grid Grid to update - * @returns {void} - * @memberof PaperView - */ - updateGrid(grid: any): void { - this.removeGrid(); - const newPaperGrid = GridRenderer.renderGrid(grid); - this.paperGrid = newPaperGrid; - this.gridLayer.addChild(newPaperGrid); - } - - /** - * Updates alignment marks of the paper - */ - updateAlignmentMarks(): void { - // TODO: Update this for the new visualizations - // Remove current Alignment Marks: - // this.removeAlignmentMarks(); - // let newAlignmentMarks = AlignmentRenderer.renderAlignmentMarks(this.lastTargetPosition, 20000, this.paperFeatures); - // this.alignmentMarks = newAlignmentMarks; - // this.alignmentMarksLayer.addChild(newAlignmentMarks); - } - - /** - * Removes alignment marks of the paper - * @returns {void} - * @memberof PaperView - */ - removeAlignmentMarks(): void { - // Does nothing right now - if (this.alignmentMarks) this.alignmentMarks.removeChildren(); - this.alignmentMarks = null; - } - - /** - * Updates unrouted connections of the paper - * @returns {void} - * @memberof PaperView - */ - updateRatsNest(): void { - this.removeRatsNest(); - const unrouted = this.__viewManagerDelegate.currentDevice.getUnroutedConnections(); - - const rendergroup = RatsNestRenderer2D.renderRatsNest(unrouted, this.__viewManagerDelegate.currentDevice); - - this.__ratsNestRender = rendergroup; - this.ratsNestLayer.addChild(this.__ratsNestRender); - } - - /** - * Removes unrouted connections of the paper - * @returns {void} - * @memberof PaperView - */ - removeRatsNest(): void { - // First clear out the render objects - if (this.__ratsNestRender) { - this.__ratsNestRender.remove(); - } - // Next set it to null - this.__ratsNestRender = null; - } - - /** - * Moves the center by a specific value - * @param {number} delta - * @returns {void} - * @memberof PaperView - */ - moveCenter(delta: paper.Point): void { - this.panAndZoom.moveCenter(delta); - } - - /** - * Adjust the zoom bu a specific value to a certain point on the paper - * @param {number} delta - * @param {Array} point - * @returns {void} - * @memberof PaperView - */ - adjustZoom(delta: number, point: paper.Point): void { - this.panAndZoom.adjustZoom(delta, point); - } - - /** - * Gets the paper features - * @param {Array} paperFeatures - * @returns {Array} Returns an array with the features - * @memberof PaperView - */ - getFeaturesByViewElements(paperFeatures: string | any[]) { - const output = []; - for (let i = 0; i < paperFeatures.length; i++) { - output.push(this.__viewManagerDelegate.getFeatureByID(paperFeatures[i].featureID)); - } - return output; - } - - /** - * Initialize the view on the paper - * @returns {void} - * @memberof PaperView - */ - initializeView(): void { - const center = this.getDeviceCenter(); - const zoom = this.computeOptimalZoom(); - this.setCenter(center); - this.setZoom(zoom); - } - - /** - * Centers the device on the paper - * @returns {Array} Returns an array with the X and Y coordinates of the center - * @memberof PaperView - */ - getDeviceCenter() { - const width = this.__viewManagerDelegate.currentDevice.getXSpan(); - const height = this.__viewManagerDelegate.currentDevice.getYSpan(); - return new paper.Point(width / 2, height / 2); - } - - /** - * Calculates the optimal zoom of the paper - * @returns {number} Returns the value of the optima zoom - * @memberof PaperView - */ - computeOptimalZoom(): number { - const borderMargin = 200; // pixels - const deviceWidth = this.__viewManagerDelegate.currentDevice.getXSpan(); - const deviceHeight = this.__viewManagerDelegate.currentDevice.getYSpan(); - const canvasWidth = this.getCanvasWidth(); - const canvasHeight = this.getCanvasHeight(); - let maxWidth; - let maxHeight; - if (canvasWidth - borderMargin <= 0) maxWidth = canvasWidth; - else maxWidth = canvasWidth - borderMargin; - if (canvasHeight - borderMargin <= 0) maxHeight = canvasHeight; - else maxHeight = canvasHeight - borderMargin; - const widthRatio = deviceWidth / maxWidth; - const heightRatio = deviceHeight / maxHeight; - if (widthRatio > heightRatio) { - return 1 / widthRatio; - } else { - return 1 / heightRatio; - } - } - - /** - * Checks to see if the point intersects with any feature that is rendered on the canvas - * @param {Array} point X and Y coordinates of the point - * @param {boolean} onlyHitActiveLayer Default to true - * @return {boolean} Rendered Feature - * @memberof PaperView - */ - hitFeature(point: paper.Point, onlyHitActiveLayer = true, nonphysActiveLayer = false) { - const hitOptions = { - fill: true, - tolerance: 5, - guides: false - }; - - let target; - - if (onlyHitActiveLayer && this.activeLayer !== null && !nonphysActiveLayer) { - target = this.paperLayers[this.activeLayer]; - - const result = target.hitTest(point, hitOptions); - if (result) { - return result.item; - } - } else if (onlyHitActiveLayer && nonphysActiveLayer) { - target = this.getNonphysText(); - - const result = target.hitTest(point, hitOptions); - if (result) { - return result.item; - } - } else { - for (let i = this.paperLayers.length - 1; i >= 0; i--) { - target = this.paperLayers[i]; - const result = target.hitTest(point, hitOptions); - if (result) { - return result.item; - } - } - } - return null; - } - - /** - * Checks if the feature hit an element ? - * @param {*} paperElement - * @param {*} onlyHitActiveLayer - * @returns {Array} Returns an Array with all the child components which intersects the paper element - * @memberof PaperView - */ - hitFeaturesWithViewElement(paperElement: any, onlyHitActiveLayer = true) { - const output = []; - if (onlyHitActiveLayer && this.activeLayer !== null) { - const layer = this.paperLayers[this.activeLayer]; - for (let i = 0; i < layer.children.length; i++) { - const child = layer.children[i]; - if (paperElement.intersects(child) || child.isInside(paperElement.bounds)) { - output.push(child); - } - } - } else { - for (let i = 0; i < this.paperLayers.length; i++) { - const layer = this.paperLayers[i]; - for (let j = 0; j < layer.children.length; j++) { - const child = layer.children[j]; - if (paperElement.intersects(child) || child.isInside(paperElement.bounds)) { - output.push(child); - } - } - } - } - return output; - } - - /** - * Inserts new feature to the edge - * @param {Feature} newPaperFeature Feature to be inserted - * @returns {void} - * @memberof PaperView - */ - insertEdgeFeatures(newPaperFeature: paper.CompoundPath): void { - const layer = this.paperLayers[0]; - layer.insertChild(0, newPaperFeature); - } - - /** - * Returns the rendered feature object that is being displayed for the particular feature - * @param {string} featureID ID of the feature - * @return {ToolPaperObject} Returns an object containing the rendered features - * @memberof PaperView - */ - getRenderedFeature(featureID: string) { - return this.paperFeatures[featureID]; - } - - /** - * Updates the component after it was rendered - * @returns {void} - * @memberof PaperView - */ - updateComponentPortsRender(): void { - this._paperComponentPortView.updateRenders(); - } - - /** - * Enable snap render - * @returns {void} - * @memberof PaperView - */ - enableSnapRender(): void { - this._paperComponentPortView.enable(); - } - - /** - * Disable snap render - * @returns {void} - * @memberof PaperView - */ - disableSnapRender(): void { - this._paperComponentPortView.disable(); - } - - /** - * Returns the paperjs object that is rendering the feature - * @param {string} featureID - * @returns - */ - getRender(featureID: string) { - return this.paperFeatures[featureID]; - } -} diff --git a/src/app/view/render2D/alignmentRenderer2D.ts b/src/app/view/render2D/alignmentRenderer2D.ts deleted file mode 100644 index 0f9e6f66..00000000 --- a/src/app/view/render2D/alignmentRenderer2D.ts +++ /dev/null @@ -1,83 +0,0 @@ -import * as Colors from "../colors"; -import Feature from "../../core/feature"; -import paper from "paper"; -import { Point } from "@/app/core/init"; - -function getLayerColor(feature: any) { - const height = feature.getValue("height"); - const layerHeight = 1; // feature.layer.estimateLayerHeight(); - let decimal = height / layerHeight; - if (decimal > 1) decimal = 1; - if (!feature.layer.flip) decimal = 1 - decimal; - const targetColorSet = Colors.getLayerColors(feature.layer); - return Colors.decimalToLayerColor(decimal, targetColorSet, Colors.darkColorKeys); -} - -function getBaseColor(feature:any) { - let decimal = 0; - if (!feature.layer.flip) decimal = 1 - decimal; - const targetColorSet = Colors.getLayerColors(feature.layer); - return Colors.decimalToLayerColor(decimal, targetColorSet, Colors.darkColorKeys); -} - -function calculateDistance(pointer_position: Point, feature_position: paper.Point) { - return Math.sqrt(Math.pow(pointer_position[0] - feature_position.x, 2) + Math.pow(pointer_position[1] - feature_position.y, 2)); -} - -export function renderAlignmentMarks(position: Point, radius: number, features: Array) { - // let renderer = getFeatureRenderer(typeString, setString); - // let params = renderer.targetParams; - // let prim = getPrimitive2D(renderer.targetPrimitiveType, renderer.targetPrimitiveSet); - // let primParams = {}; - // for (let key in params) { - // primParams[key] = getDefaultValueForType(typeString, setString, params[key]); - // } - // primParams["position"] = position; - // primParams["color"] = Colors.getDefaultFeatureColor(typeString, setString, Registry.currentLayer); - // let rendered = prim(primParams); - const alignmentmarkergroup = new paper.Group(); - - for (const i in features) { - const feature = features[i]; - if (feature === null) { - continue; - } - if (calculateDistance(position, feature.getBounds().center) < radius) { - // TODO: figure out how check for different kinds of components and then generate - - // Generate the alignment H | V lines for each of the features - - // Get the bounds of the feature - - const bounds = feature.getBounds(); - - // Only the centroid alignment marks - const center = bounds.center; - const hstart = new paper.Point(center.x - radius, center.y); - const hend = new paper.Point(center.x + radius, center.y); - - const vstart = new paper.Point(center.x, center.y - radius); - const vend = new paper.Point(center.x, center.y + radius); - - const hpath = new paper.Path([hstart, hend]); - const vpath = new paper.Path([vstart, vend]); - - hpath.strokeColor = new paper.Color("#696965"); - hpath.strokeWidth = 500; - hpath.strokeCap = "round"; - - hpath.dashArray = [1000, 1200]; - - vpath.strokeColor = new paper.Color("#696965"); - vpath.strokeWidth = 500; - vpath.strokeCap = "round"; - - vpath.dashArray = [1000, 1200]; - - alignmentmarkergroup.addChild(vpath); - alignmentmarkergroup.addChild(hpath); - } - } - - return alignmentmarkergroup; -} diff --git a/src/app/view/render2D/componentPortRenderer2D.ts b/src/app/view/render2D/componentPortRenderer2D.ts deleted file mode 100644 index 47285d65..00000000 --- a/src/app/view/render2D/componentPortRenderer2D.ts +++ /dev/null @@ -1,54 +0,0 @@ -import * as Colors from "../colors"; -import paper from "paper"; -import Registry from "../../core/registry"; -import Component from "@/app/core/component"; -import ComponentPort from "@/app/core/componentPort"; -import { Point } from "@/app/core/init"; - -export default class ComponentPortRenderer2D { - static renderComponentPort(componentport: ComponentPort, draworigin: Point, rotation: number, portrendersize: number = 500) { - const xpos = draworigin[0]; - const ypos = draworigin[1]; - const point = new paper.Point(xpos + componentport.x, ypos + componentport.y); - - const circle = new paper.Path.Circle(point, portrendersize); - - circle.rotate(rotation, new paper.Point(draworigin[0], draworigin[1])); - - circle.fillColor = new paper.Color(Colors.BLACK); - - return circle; - } - - static getSizeforZoomLevel() { - const zoomlevel = paper.view.zoom; - let ret = 5 / zoomlevel; - if (ret > 500) { - ret = 500; - } - return ret; - } - - static renderComponentPorts(component: Component) { - const rendersize = ComponentPortRenderer2D.getSizeforZoomLevel(); - const componentports = component.ports; - const ret = []; - const rotation = component.getRotation(); - const currPos = component.getValue("position"); - component.setOffset(); - const position: Point = [currPos[0] - component.offset[0], currPos[1] - component.offset[1]]; - for (const key of componentports.keys()) { - const componentport = componentports.get(key); - if (componentport === undefined) { - console.error(`component ${component.id} has no port ${key}`); - continue; - } - const render = ComponentPortRenderer2D.renderComponentPort(componentport, position, rotation, rendersize); - // TODO - Figure out how to fix this or keep track of this - // render["renderid"] = componentport.id; - component.attachComponentPortRender(key, render); - ret.push(render); - } - return ret; - } -} diff --git a/src/app/view/render2D/deviceRenderer2D.ts b/src/app/view/render2D/deviceRenderer2D.ts deleted file mode 100644 index dc6b9917..00000000 --- a/src/app/view/render2D/deviceRenderer2D.ts +++ /dev/null @@ -1,44 +0,0 @@ -import * as Colors from "../colors"; // pixels -import paper from "paper"; -import Device from "@/app/core/device"; -const DEFAULT_STROKE_COLOR = Colors.GREY_700; -const BORDER_THICKNESS = 5; - -export default class DeviceRenderer { - static renderLayerMask(device: Device) { - const width = device.getXSpan(); - const height = device.getYSpan(); - let fillColor = new paper.Color(Colors.WHITE); - fillColor.alpha = 0.5; - const mask = new paper.Path.Rectangle({ - from: new paper.Point(0, 0), - to: new paper.Point(width, height), - fillColor: fillColor, - strokeColor: null - }); - return mask; - } - - static renderDevice(device: Device, strokeColor = DEFAULT_STROKE_COLOR) { - const background = new paper.Path.Rectangle({ - from: paper.view.bounds.topLeft.subtract(new paper.Point(paper.view.size)), - to: paper.view.bounds.bottomRight.add(new paper.Point(paper.view.size)), - fillColor: new paper.Color(Colors.BLUE_50), - strokeColor: null - }); - const thickness = BORDER_THICKNESS / paper.view.zoom; - const xspan = device.getXSpan(); - const yspan = device.getYSpan(); - const border = new paper.Path.Rectangle({ - from: new paper.Point(0, 0), - to: new paper.Point(xspan, yspan), - fillColor: Colors.WHITE, - strokeColor: strokeColor, - strokeWidth: thickness - }); - - const group = new paper.Group([background, border]); - - return group; - } -} diff --git a/src/app/view/render2D/dxfObjectRenderer2D.ts b/src/app/view/render2D/dxfObjectRenderer2D.ts deleted file mode 100644 index 5ec84dfb..00000000 --- a/src/app/view/render2D/dxfObjectRenderer2D.ts +++ /dev/null @@ -1,392 +0,0 @@ -import * as THREE from "three"; -import paper from "paper"; - -import edgeFeature from "@/app/core/edgeFeature"; - -export function renderFeatureObjects(feature: any) { - throw new Error("Implement the renderer"); - - // console.log("rendering the features dxf objects"); - // for (const i in feature.getDXFObjects()) { - // const dxfobject = feature.getDXFObjects()[i]; - // } - // return undefined; -} - -/** - * Returns a PaperJS outline rendering of the given - * DXF objects contained in the feature. - * @param feature - */ -export function renderEdgeFeature(feature: edgeFeature) { - const path = new paper.CompoundPath(""); - - // console.log('rendering the outline dxf objects....', feature.getDXFObjects()); - for (const i in feature.getDXFObjects()) { - const dxfobject = feature.getDXFObjects()[i]; - // Figure out what entity this is and then based on that do the drawing - let mesh; - if (dxfobject.getType() === "ARC") { - drawArc(dxfobject.getData(), path); - } else if (dxfobject.getType() === "LWPOLYLINE" || dxfobject.getType() === "LINE" || dxfobject.getType() === "POLYLINE") { - drawLine(dxfobject.getData(), path); - } else if (dxfobject.getType() === "SPLINE") { - drawSpline(dxfobject.getData(), path); - } else if (dxfobject.getType() === "ELLIPSE") { - drawEllipse(dxfobject.getData(), path); - } else if (dxfobject.getType() === "CIRCLE") { - drawCircle(dxfobject.getData(), path); - } else { - console.error("Unsupported DXF Entity Type for Outline Generation : " + dxfobject.getType()); - } - } - // Set the visual properties for the path - path.strokeColor = new paper.Color("#ff7606"); - path.strokeWidth = 200; - // Since this is an outline we need to do the required transformations to it - path.scale(1, -1); // The coordinate system is all different for DXF - // console.log(path.bounds.topLeft); - const topleft = path.bounds.topLeft; - path.translate(new paper.Point(-topleft.x, -topleft.y)); - - // Add the feature id to the rendered object or else the whole things breaks down - // TODO: Streamline the feature ID insertion for each rendered object business - - // eslint-disable-next-line - let modpath = path as any; - modpath.featureID = feature.ID; - return modpath as paper.CompoundPath; -} - - -/** - * Generates the paper.js equivalent of the ELLIPSE DXF object - * @param entity DXF Data - * @param path Compound Path onto which the drawing will be inserted into - */ -function drawEllipse(entity: { center: { x: number; y: number; }; axisRatio: any; majorAxisEndPoint: { x: number; y: number; }; }, path: paper.CompoundPath) { - /* - https://www.autodesk.com/techpubs/autocad/acad2000/dxf/ellipse_dxf_06.htm - */ - // console.log("DXF Data", entity); - - const center = new paper.Point(entity.center.x * 1000, entity.center.y * 1000); - const axisratio = entity.axisRatio; - const majoraxislength = Math.sqrt(Math.pow(entity.majorAxisEndPoint.x * 1000, 2) + Math.pow(entity.majorAxisEndPoint.y * 1000, 2)); - const minoraxislength = majoraxislength * axisratio; - let rotation = (Math.atan(entity.majorAxisEndPoint.y / entity.majorAxisEndPoint.x) * 180) / Math.PI; - // console.log("Rotation:", rotation); - if (Number.isNaN(rotation)) { - rotation = 0; - } - // console.log("Rotation:", rotation); - // console.log("lengths:", majoraxislength, minoraxislength); - const ellipse = new paper.Path.Ellipse({ - center: [center.x, center.y], - radius: [majoraxislength, minoraxislength] - }); - - ellipse.rotate(rotation, center); - path.addChild(ellipse); -} - -function drawMtext(entity: any, data: any) { - throw new Error("Not Implemented"); - // const color = getColor(entity, data); - - // const geometry = new THREE.TextGeometry(entity.text, { - // font: font, - // size: entity.height * (4 / 5), - // height: 1 - // }); - // const material = new THREE.MeshBasicMaterial({ color: color }); - // const text = new THREE.Mesh(geometry, material); - - // // Measure what we rendered. - // const measure = new THREE.Box3(); - // measure.setFromObject(text); - - // const textWidth = measure.max.x - measure.min.x; - - // // If the text ends up being wider than the box, it's supposed - // // to be multiline. Doing that in threeJS is overkill. - // if (textWidth > entity.width) { - // console.log("Can't render this multipline MTEXT entity, sorry.", entity); - // return undefined; - // } - - // text.position.z = 0; - // switch (entity.attachmentPoint) { - // case 1: - // // Top Left - // text.position.x = entity.position.x; - // text.position.y = entity.position.y - entity.height; - // break; - // case 2: - // // Top Center - // text.position.x = entity.position.x - textWidth / 2; - // text.position.y = entity.position.y - entity.height; - // break; - // case 3: - // // Top Right - // text.position.x = entity.position.x - textWidth; - // text.position.y = entity.position.y - entity.height; - // break; - - // case 4: - // // Middle Left - // text.position.x = entity.position.x; - // text.position.y = entity.position.y - entity.height / 2; - // break; - // case 5: - // // Middle Center - // text.position.x = entity.position.x - textWidth / 2; - // text.position.y = entity.position.y - entity.height / 2; - // break; - // case 6: - // // Middle Right - // text.position.x = entity.position.x - textWidth; - // text.position.y = entity.position.y - entity.height / 2; - // break; - - // case 7: - // // Bottom Left - // text.position.x = entity.position.x; - // text.position.y = entity.position.y; - // break; - // case 8: - // // Bottom Center - // text.position.x = entity.position.x - textWidth / 2; - // text.position.y = entity.position.y; - // break; - // case 9: - // // Bottom Right - // text.position.x = entity.position.x - textWidth; - // text.position.y = entity.position.y; - // break; - - // default: - // return undefined; - // } - - // return text; -} - -function drawSpline(entity: any, path: paper.CompoundPath) { - throw new Error("Not Implemented"); - // const points = entity.controlPoints.map(function(vec) { - // return new paper.Point(vec.x, vec.y); - // }); - // let curve; - // let interpolatedPoints = []; - // if (entity.degreeOfSplineCurve === 2 || entity.degreeOfSplineCurve === 3) { - // for (let i = 0; i + 2 < points.length; i = i + 2) { - // if (entity.degreeOfSplineCurve === 2) { - // curve = new THREE.QuadraticBezierCurve(points[i], points[i + 1], points[i + 2]); - // } else { - // curve = new THREE.QuadraticBezierCurve3(points[i], points[i + 1], points[i + 2]); - // } - // interpolatedPoints.push.apply(interpolatedPoints, curve.getPoints(50)); - // } - // } else { - // curve = new THREE.SplineCurve(points); - // interpolatedPoints = curve.getPoints(400); - // } - - // const geometry = new THREE.BufferGeometry().setFromPoints(interpolatedPoints); - // const material = new THREE.LineBasicMaterial({ linewidth: 1, color: color }); - // const splineObject = new THREE.Line(geometry, material); - - // return splineObject; -} - -function drawCircle(entity: { center: { x: number; y: number; }; radius: number; }, path: paper.CompoundPath) { - const center = new paper.Point(entity.center.x * 1000, entity.center.y * 1000); - const circle = new paper.Path.Circle(center, entity.radius * 1000); - path.addChild(circle); -} - -/** - * Generates the paper.js equivalent of the LINE, POLYLINE, LWPOLYLINE DXF object - * @param entity DXF Data - * @param path Compound Path onto which the drawing will be inserted into - */ -function drawLine(entity: { vertices: string | any[]; }, path: paper.CompoundPath) { - let bulge, bugleGeometry; - let startPoint, endPoint; - - // // create geometry - for (let i = 0; i < entity.vertices.length; i++) { - if (entity.vertices[i].bulge) { - // TODO: Figure out what to do with the bugle value - bulge = entity.vertices[i].bulge; - startPoint = entity.vertices[i]; - endPoint = i + 1 < entity.vertices.length ? entity.vertices[i + 1] : entity.vertices[0]; - console.log("Start Point:", startPoint); - console.log("End Point:", endPoint); - } else { - const vertex = entity.vertices[i]; - const nextvertex = entity.vertices[i + 1 < entity.vertices.length ? i + 1 : 0]; - const point = new paper.Point(vertex.x * 1000, vertex.y * 1000); // Need to convert everything to microns - const nextpoint = new paper.Point(nextvertex.x * 1000, nextvertex.y * 1000); - // console.log("Vertex:", point, nextpoint); - const line = new paper.Path.Line(point, nextpoint); - path.addChild(line); - } - } -} - -/** - * Generates the paper.js equivalent of the ARC DXF object - * @param entity DXF Data - * @param path Compound Path onto which the drawing will be inserted into - */ -function drawArc(entity: { center: { x: number; y: number; }; radius: number; startAngle: any; endAngle: any; }, path: paper.CompoundPath) { - /* - Ok so for this to work in paperjs, we need to have 3 variables - 1. Start - 2. Through - 3. End - - DXF gives : - 1. startAngle - 2. endAngle - 3. center - 4. radius - - To translate we start with the center point, then calculate points at start angle and end angle - - center-> @------r------* <- startAngle - \ - \ - r - \ - \ - * <- endAngle - - */ - - const center = new paper.Point(entity.center.x * 1000, entity.center.y * 1000); - const radius = entity.radius * 1000; - const startAngle = entity.startAngle; - const endAngle = entity.endAngle; //* 180/Math.PI; - const midAngle = (startAngle + endAngle) / 2; - - const startpoint = new paper.Point(center.x + radius * Math.cos(startAngle), center.y + radius * Math.sin(startAngle)); - - // var starcenter = new paper.Point(startpoint); - // var points = 5; - // var radius1 = 250; - // var radius2 = 400; - // var star = new paper.Path.Star(starcenter, points, radius1, radius2); - // - // path.addChild(star); - - const midpoint = new paper.Point(center.x + radius * Math.cos(midAngle), center.y + radius * Math.sin(midAngle)); - - // starcenter = new paper.Point(midpoint); - // points = 10; - // star = new paper.Path.Star(starcenter, points, radius1, radius2); - // - // path.addChild(star); - - const endpoint = new paper.Point(center.x + radius * Math.cos(endAngle), center.y + radius * Math.sin(endAngle)); - - // starcenter = new paper.Point(endpoint); - // points = 20; - // star = new paper.Path.Star(starcenter, points, radius1, radius2); - // - // path.addChild(star); - - const arc = new paper.Path.Arc(startpoint, midpoint, endpoint); - - path.addChild(arc); -} - -function drawSolid(entity: any, data: any) { - throw new Error("Not Implemented"); - // let material; - // let mesh; - // let verts; - // const geometry = new THREE.Geometry(); - - // verts = geometry.vertices; - // verts.push(new THREE.Vector3(entity.points[0].x, entity.points[0].y, entity.points[0].z)); - // verts.push(new THREE.Vector3(entity.points[1].x, entity.points[1].y, entity.points[1].z)); - // verts.push(new THREE.Vector3(entity.points[2].x, entity.points[2].y, entity.points[2].z)); - // verts.push(new THREE.Vector3(entity.points[3].x, entity.points[3].y, entity.points[3].z)); - - // // Calculate which direction the points are facing (clockwise or counter-clockwise) - // const vector1 = new THREE.Vector3(); - // const vector2 = new THREE.Vector3(); - // vector1.subVectors(verts[1], verts[0]); - // vector2.subVectors(verts[2], verts[0]); - // vector1.cross(vector2); - - // // If z < 0 then we must draw these in reverse order - // if (vector1.z < 0) { - // geometry.faces.push(new THREE.Face3(2, 1, 0)); - // geometry.faces.push(new THREE.Face3(2, 3, 1)); - // } else { - // geometry.faces.push(new THREE.Face3(0, 1, 2)); - // geometry.faces.push(new THREE.Face3(1, 3, 2)); - // } - - // material = new THREE.MeshBasicMaterial({ color: getColor(entity, data) }); - - // return new THREE.Mesh(geometry, material); -} - -function drawText(entity: any, data: any) { - throw new Error("Not implemented yet"); - // let geometry, material, text; - - // if (!font) { - // return console.warn( - // "Text is not supported without a Three.js font loaded with THREE.FontLoader! Load a font of your choice and pass this into the constructor. See the sample for this repository or Three.js examples at http://threejs.org/examples/?q=text#webgl_geometry_text for more details." - // ); - // } - - // geometry = new THREE.TextGeometry(entity.text, { - // font: font, - // height: 0, - // size: entity.textHeight || 12 - // }); - - // material = new THREE.MeshBasicMaterial({ color: getColor(entity, data) }); - - // text = new THREE.Mesh(geometry, material); - // text.position.x = entity.startPoint.x; - // text.position.y = entity.startPoint.y; - // text.position.z = entity.startPoint.z; - - // return text; -} - -// function drawPoint(entity, data) { -// let geometry, material, point; - -// geometry = new THREE.Geometry(); - -// geometry.vertices.push(new THREE.Vector3(entity.position.x, entity.position.y, entity.position.z)); - -// // TODO: could be more efficient. PointCloud per layer? - -// const numPoints = 1; - -// const color = getColor(entity, data); -// const colors = new Float32Array(numPoints * 3); -// colors[0] = color.r; -// colors[1] = color.g; -// colors[2] = color.b; - -// geometry.colors = colors; -// geometry.computeBoundingBox(); - -// material = new THREE.PointsMaterial({ -// size: 0.05, -// vertexColors: THREE.VertexColors -// }); -// point = new THREE.Points(geometry, material); -// scene.add(point); -// } diff --git a/src/app/view/render2D/dxfSolidObjectRenderer2D.ts b/src/app/view/render2D/dxfSolidObjectRenderer2D.ts deleted file mode 100644 index f77e3dc5..00000000 --- a/src/app/view/render2D/dxfSolidObjectRenderer2D.ts +++ /dev/null @@ -1,626 +0,0 @@ -import paper from "paper"; -import * as THREE from "three"; -import LinkedList from "../../utils/linkedList"; -import GeometryGraph from "../../geometry/geometryGraph"; -import Feature from "@/app/core/feature"; -import DXFObject from "@/app/core/dxfObject"; -import CustomComponent from "@/app/core/customComponent"; - -export function renderCustomComponentFeature(feature: Feature, color: string) { - const position = feature.getValue("position"); - const rotation = feature.getValue("rotation"); - const render = renderDXFObjects(feature.dxfObjects); - render.translate(new paper.Point(position[0], position[1])); - render.rotate(rotation); - render.fillColor = new paper.Color(color); - return render; -} - -export function renderCustomComponentTarget(customcomponent: CustomComponent, params: {[key: string]: any}) { - // console.log("Render Posiition:", position); - const position = params.position; - const color = new paper.Color(params.color); - const rotation = params.rotation; - const p = new paper.Point(position[0], position[1]); - const render = renderDXFObjects(customcomponent.dxfData); - - render.fillColor = color; - render.fillColor.alpha = 0.5; - render.translate(p); - render.rotate(rotation); - return render; -} - -export function renderFeatureObjects(feature: Feature) { - console.log("rendering the features dxf objects"); - for (const i in feature.getDXFObjects()) { - const dxfobject = feature.getDXFObjects()[i]; - } - throw new Error("Implement the renderer"); -} - -/** - * Calculates and returns the bulge through point - * @param startpoint - * @param endpoint - * @param bulgevalue - * @return {paper.Point} - */ -function calculateBulgeThroughPoint(startpoint: paper.Point, endpoint: paper.Point, bulgevalue: number) { - - const start = new paper.Point(startpoint.x, startpoint.y); - const end = new paper.Point(endpoint.x, endpoint.y); - const angle = 4 * Math.atan(bulgevalue); - - /* - https://math.stackexchange.com/questions/9365/endpoint-of-a-line-knowing-slope-start-and-distance - */ - const epsilon = angle / 4; - - const midpoint = new paper.Point(startpoint.x / 2 + endpoint.x / 2, startpoint.y / 2 + endpoint.y / 2); - - const p = new paper.Point(startpoint.x, startpoint.y).getDistance(midpoint) * bulgevalue; - - let slope = (endpoint.y - startpoint.y) / (endpoint.x - startpoint.x); - - const chordvector = end.subtract(start); - - // console.log("all points:", start, end, chordvector); - /* - First handle the two cases when they're nicely aligned to the axes - */ - - // console.log(chordvector, "Angle:",chordvector.angle, Math.round(chordvector.angle), "Dist from midpoint:", p); - - if (Math.round(chordvector.angle) === 0) { - // Horizontal - // console.log("Horizontal Case"); - let throughpoint = new paper.Point(midpoint.x, midpoint.y - p); - return throughpoint; - } else if (Math.round(chordvector.angle) === 90) { - // Vertical - // console.log("Vertical Case"); - let throughpoint = new paper.Point(midpoint.x + p, midpoint.y); - return throughpoint; - } else { - // All other angles - // console.log("Angled Case") - slope = -1 * slope; - - // midpoint - const k = -p / Math.sqrt(1 + slope * slope); - - let throughpoint = midpoint.add(new paper.Point(k, k * slope)); - return throughpoint; - } - -} - -function isClosedPolyline(dxfobject: DXFObject) { - const data = dxfobject.getData(); - // console.log(data, data.shape); - return data.shape; -} - -function processARC(geometryGraph: GeometryGraph, data: {[key: string]: any}) { - // console.warn("Implement this function !!"); - - /* - - DXF gives : - 1. startAngle - 2. endAngle - 3. center - 4. radius - - To translate we start with the center point, then calculate points at start angle and end angle - - center-> @------r------* <- startAngle - \ - \ - r - \ - \ - * <- endAngle - - */ - - const center = new paper.Point(data.center.x * 1000, data.center.y * 1000); - const radius = data.radius * 1000; - const startAngle = data.startAngle; - const endAngle = data.endAngle; //* 180/Math.PI; - - const startpoint = new paper.Point(center.x + radius * Math.cos(startAngle), center.y + radius * Math.sin(startAngle)); - - const endpoint = new paper.Point(center.x + radius * Math.cos(endAngle), center.y + radius * Math.sin(endAngle)); - - geometryGraph.addEdge(startpoint, endpoint, data); -} - -function processClosedPolyLine(entity: any) { - const polygon = new paper.Path(); - - // // create geometry - for (let i = 0; i < entity.vertices.length; i++) { - const dxfvertex = entity.vertices[i]; - polygon.add(new paper.Point(dxfvertex.x * 1000, dxfvertex.y * 1000)); - } - polygon.closed = true; - - let modpath = polygon as any; - modpath.origin = "POLYLINE"; - return modpath as paper.PathItem; -} - -function processPolyLine(geometryGraph: GeometryGraph, data: any) { - console.warn("Implement this function !!"); -} - -function processSpline(geometryGraph: GeometryGraph, data: any) { - console.warn("Implement this function !!"); -} - -function processLine(geometryGraph: GeometryGraph, data: any) { - const startPoint = data.vertices[0]; - const endPoint = data.vertices[1]; - - geometryGraph.addEdge(startPoint, endPoint, data); -} - -export function renderDXFObjects(dxfobjectarray: Array) { - // let path = new paper.CompoundPath(); - - if (dxfobjectarray === undefined) { - throw new Error("Cannot find DXF DATA"); - } - // console.log("DXF Object Array to render:", dxfobjectarray); - - const patharray = new LinkedList(); - const closedshapes = []; - - const geometryGraph = new GeometryGraph(); - - for (const i in dxfobjectarray) { - const dxfobject = dxfobjectarray[i]; - - /* - If ARC - Get the start and end points - save to edge graph as - */ - - if (dxfobject.getType() === "ARC") { - processARC(geometryGraph, dxfobject.getData()); - } else if (dxfobject.getType() === "LINE") { - processLine(geometryGraph, dxfobject.getData()); - } else if (dxfobject.getType() === "LWPOLYLINE" || dxfobject.getType() === "POLYLINE") { - if (isClosedPolyline(dxfobject)) { - closedshapes.push(processClosedPolyLine(dxfobject.getData())); - } else { - processPolyLine(geometryGraph, dxfobject.getData()); - } - } else if (dxfobject.getType() === "ELLIPSE") { - closedshapes.push(drawEllipse(dxfobject.getData())); - } else if (dxfobject.getType() === "CIRCLE") { - closedshapes.push(drawCircle(dxfobject.getData())); - } else if (dxfobject.getType() === "SPLINE") { - alert("The current version of the DXF Parser does not support SPLINE objects. Support will be added in future versions"); - throw new Error("Unsupported DXF render object - SPLINE"); - // processSpline(geometryGraph, dxfobject.getData()); - } else if (dxfobject.getType() === "DIMENSION") { - console.warn("DIMENSION entry in DXF will be ignored. Please ensure that all the designs are of the correct dimensions"); - } else if (dxfobject.getType() === "MTEXT") { - console.warn("MTEXT entry in DXF will be ignored. Please ensure that none of the features require text "); - } else if (dxfobject.getType() === "INSERT") { - alert("The current version of the DXF Parser does not support INSERT and BLOCK design references."); - throw new Error("Unsupported render object"); - } else { - alert("Unsupported DXF Entity Type for Component Import : " + dxfobject.getType()); - console.error("Unsupported DXF Entity Type for Component Import : " + dxfobject.getType()); - } - } - - // console.log("Geometry grpah:",geometryGraph); - // console.log("Closed Shapes:", closedshapes); - // TODO: Generate the Geometry from the geometry graph , this should a return a compound path that takes care of the - // right kind of correct connected paths - - const path = geometryGraph.generateGeometry(); - - // TODO: Now add all the remainder closed shapes to the compound paths - for (const child of closedshapes) { - path.addChild(child); - } - - // path.strokeColor = '#000000'; - // path.strokeWidth = 1; - path.closed = true; - path.fillColor = new paper.Color("#ff7606"); - path.fillRule = "evenodd"; - const topleft = path.bounds.topLeft; - path.translate(new paper.Point(-topleft.x, -topleft.y)); - path.scale(1, -1); // The coordinate system is all different for DXF - - path.scale(1000, 1000); // Scale the coordinates to microns - - return path; -} - -/** - * Returns a PaperJS outline rendering of the given - * DXF objects contained in the feature. - * @param feature - */ -export function renderEdgeFeature(feature: Feature) { - const path = new paper.CompoundPath(""); - - // console.log('rendering the outline dxf objects....', feature.getDXFObjects()); - for (const i in feature.getDXFObjects()) { - const dxfobject = feature.getDXFObjects()[i]; - // Figure out what entity this is and then based on that do the drawing - let mesh; - if (dxfobject.getType() === "ARC") { - path.addChild(drawArc(dxfobject.getData())); - } else if (dxfobject.getType() === "LWPOLYLINE" || dxfobject.getType() === "LINE" || dxfobject.getType() === "POLYLINE") { - path.addChild(drawLine(dxfobject.getData())); - } else if (dxfobject.getType() === "SPLINE") { - path.addChild(drawSpline(dxfobject.getData(), path)); - } else if (dxfobject.getType() === "ELLIPSE") { - path.addChild(drawEllipse(dxfobject.getData())); - } else if (dxfobject.getType() === "CIRCLE") { - path.addChild(drawCircle(dxfobject.getData())); - } else { - console.error("Unsupported DXF Entity Type for Outline Generation : " + dxfobject.getType()); - } - } - // Set the visual properties for the path - path.strokeColor = new paper.Color("#ff7606"); - path.strokeWidth = 200; - // Since this is an outline we need to do the required transformations to it - path.scale(1, -1); // The coordinate system is all different for DXF - // console.log(path.bounds.topLeft); - const topleft = path.bounds.topLeft; - path.translate(new paper.Point(-topleft.x, -topleft.y)); - - // Add the feature id to the rendered object or else the whole things breaks down - // TODO: Streamline the feature ID insertion for each rendered object business - let modpath = path as any; - modpath.featureID = feature.ID; - return modpath as paper.PathItem; -} - - -/** - * Generates the paper.js equivalent of the ELLIPSE DXF object - * @param entity DXF Data - */ -function drawEllipse(entity: any) { - /* - https://www.autodesk.com/techpubs/autocad/acad2000/dxf/ellipse_dxf_06.htm - */ - // console.log("DXF Data", entity); - - const center = new paper.Point(entity.center.x * 1000, entity.center.y * 1000); - const axisratio = entity.axisRatio; - const majoraxislength = Math.sqrt(Math.pow(entity.majorAxisEndPoint.x * 1000, 2) + Math.pow(entity.majorAxisEndPoint.y * 1000, 2)); - const minoraxislength = majoraxislength * axisratio; - let rotation = (Math.atan(entity.majorAxisEndPoint.y / entity.majorAxisEndPoint.x) * 180) / Math.PI; - // console.log("Rotation:", rotation); - if (Number.isNaN(rotation)) { - rotation = 0; - } - // console.log("Rotation:", rotation); - // console.log("lengths:", majoraxislength, minoraxislength); - const ellipse = new paper.Path.Ellipse({ - center: [center.x, center.y], - radius: [majoraxislength, minoraxislength] - }); - - ellipse.rotate(rotation, center); - return ellipse; -} - -// function drawMtext(entity, data) { -// var color = getColor(entity, data); - -// var geometry = new THREE.TextGeometry(entity.text, { -// font: font, -// size: entity.height * (4 / 5), -// height: 1 -// }); -// var material = new THREE.MeshBasicMaterial({ color: color }); -// var text = new THREE.Mesh(geometry, material); - -// // Measure what we rendered. -// var measure = new THREE.Box3(); -// measure.setFromObject(text); - -// var textWidth = measure.max.x - measure.min.x; - -// // If the text ends up being wider than the box, it's supposed -// // to be multiline. Doing that in threeJS is overkill. -// if (textWidth > entity.width) { -// console.log("Can't render this multipline MTEXT entity, sorry.", entity); -// return undefined; -// } - -// text.position.z = 0; -// switch (entity.attachmentPoint) { -// case 1: -// // Top Left -// text.position.x = entity.position.x; -// text.position.y = entity.position.y - entity.height; -// break; -// case 2: -// // Top Center -// text.position.x = entity.position.x - textWidth / 2; -// text.position.y = entity.position.y - entity.height; -// break; -// case 3: -// // Top Right -// text.position.x = entity.position.x - textWidth; -// text.position.y = entity.position.y - entity.height; -// break; - -// case 4: -// // Middle Left -// text.position.x = entity.position.x; -// text.position.y = entity.position.y - entity.height / 2; -// break; -// case 5: -// // Middle Center -// text.position.x = entity.position.x - textWidth / 2; -// text.position.y = entity.position.y - entity.height / 2; -// break; -// case 6: -// // Middle Right -// text.position.x = entity.position.x - textWidth; -// text.position.y = entity.position.y - entity.height / 2; -// break; - -// case 7: -// // Bottom Left -// text.position.x = entity.position.x; -// text.position.y = entity.position.y; -// break; -// case 8: -// // Bottom Center -// text.position.x = entity.position.x - textWidth / 2; -// text.position.y = entity.position.y; -// break; -// case 9: -// // Bottom Right -// text.position.x = entity.position.x - textWidth; -// text.position.y = entity.position.y; -// break; - -// default: -// return undefined; -// } - -// return text; -// } - -function drawSpline(entity: any, path: any): paper.PathItem { - let curve; - // const points = entity.controlPoints.map(function(vec) { - // return new paper.Point(vec.x, vec.y); - // }); - throw new Error("Spline entity is not supported !"); - // let color = "black"; - // var interpolatedPoints = []; - // if (entity.degreeOfSplineCurve === 2 || entity.degreeOfSplineCurve === 3) { - // for (var i = 0; i + 2 < points.length; i = i + 2) { - // if (entity.degreeOfSplineCurve === 2) { - // curve = new THREE.QuadraticBezierCurve(points[i], points[i + 1], points[i + 2]); - // } else { - // curve = new THREE.QuadraticBezierCurve3(points[i], points[i + 1], points[i + 2]); - // } - // interpolatedPoints.push.apply(interpolatedPoints, curve.getPoints(50)); - // } - // } else { - // curve = new THREE.SplineCurve(points); - // interpolatedPoints = curve.getPoints(400); - // } - - // var geometry = new THREE.BufferGeometry().setFromPoints(interpolatedPoints); - // var material = new THREE.LineBasicMaterial({ linewidth: 1, color: color }); - // var splineObject = new THREE.Line(geometry, material); - - // return splineObject; -} - -function drawCircle(entity: any) { - const center = new paper.Point(entity.center.x * 1000, entity.center.y * 1000); - const circle = new paper.Path.Circle(center, entity.radius * 1000); - return circle; -} - -/** - * Generates the paper.js equivalent of the LINE, POLYLINE, LWPOLYLINE DXF object - * @param entity DXF Data - */ -function drawLine(entity: any) { - // Create a path - const basepath = new paper.Path(); - - let bulge, bugleGeometry; - let startPoint, endPoint; - - // // create geometry - for (let i = 0; i < entity.vertices.length; i++) { - // console.log("Point:", i , entity.vertices[i]); - if (entity.vertices[i].bulge) { - console.log("Drawing arc segment to incorporate bulge values"); - // TODO: Figure out what to do with the bugle value - bulge = entity.vertices[i].bulge; - startPoint = entity.vertices[i]; - if (i < entity.vertices.length - 1) { - endPoint = entity.vertices[i + 1]; - } else { - console.log("LAst vertex"); - endPoint = entity.vertices[0]; - } - // endPoint = (i + 1 < entity.vertices.length) ? entity.vertices[i + 1] :entity.vertices[0]; - console.log("Start Point:", startPoint); - console.log("End Point:", endPoint); - const throughpoint = calculateBulgeThroughPoint(startPoint, endPoint, bulge); - - console.log("Throughpoint:", throughpoint); - - basepath.add(new paper.Point(startPoint.x * 1000, startPoint.y * 1000)); - // basepath.add(new paper.Point(endPoint.x, endPoint.y)); - basepath.arcTo(throughpoint, new paper.Point(endPoint.x * 1000, endPoint.y * 1000)); - i++; - } else { - // let vertex = entity.vertices[i]; - // let nextvertex = entity.vertices[(i + 1 < entity.vertices.length) ? i + 1 : 0]; - // let point = new paper.Point(vertex.x * 1000, vertex.y * 1000); //Need to convert everything to microns - // let nextpoint = new paper.Point(nextvertex.x * 1000, nextvertex.y * 1000); - // // console.log("Vertex:", point, nextpoint); - // let line = new paper.Path.Line(point, nextpoint); - // path.addChild(line); - - const dxfvertex = entity.vertices[i]; - basepath.add(new paper.Point(dxfvertex.x * 1000, dxfvertex.y * 1000)); - } - } - - let modpath = basepath as any; - modpath.origin = "LINE"; - - return modpath as paper.PathItem; -} - -/** - * Generates the paper.js equivalent of the ARC DXF object - * @param entity DXF Data - */ -function drawArc(entity: any) { - /* - Ok so for this to work in paperjs, we need to have 3 variables - 1. Start - 2. Through - 3. End - - DXF gives : - 1. startAngle - 2. endAngle - 3. center - 4. radius - - To translate we start with the center point, then calculate points at start angle and end angle - - center-> @------r------* <- startAngle - \ - \ - r - \ - \ - * <- endAngle - - */ - - const center = new paper.Point(entity.center.x * 1000, entity.center.y * 1000); - const radius = entity.radius * 1000; - const startAngle = entity.startAngle; - const endAngle = entity.endAngle; //* 180/Math.PI; - const midAngle = (startAngle + endAngle) / 2; - - const startpoint = new paper.Point(center.x + radius * Math.cos(startAngle), center.y + radius * Math.sin(startAngle)); - - const midpoint = new paper.Point(center.x + radius * Math.cos(midAngle), center.y + radius * Math.sin(midAngle)); - - const endpoint = new paper.Point(center.x + radius * Math.cos(endAngle), center.y + radius * Math.sin(endAngle)); - - const arc = new paper.Path.Arc(startpoint, midpoint, endpoint); - - // arc.origin = "ARC"; - let modpath = arc as any; - modpath.origin = "ARC"; - - return modpath as paper.PathItem; -} - -// function drawSolid(entity, data) { -// var material, -// mesh, -// verts, -// geometry = new THREE.Geometry(); - -// verts = geometry.vertices; -// verts.push(new THREE.Vector3(entity.points[0].x, entity.points[0].y, entity.points[0].z)); -// verts.push(new THREE.Vector3(entity.points[1].x, entity.points[1].y, entity.points[1].z)); -// verts.push(new THREE.Vector3(entity.points[2].x, entity.points[2].y, entity.points[2].z)); -// verts.push(new THREE.Vector3(entity.points[3].x, entity.points[3].y, entity.points[3].z)); - -// // Calculate which direction the points are facing (clockwise or counter-clockwise) -// var vector1 = new THREE.Vector3(); -// var vector2 = new THREE.Vector3(); -// vector1.subVectors(verts[1], verts[0]); -// vector2.subVectors(verts[2], verts[0]); -// vector1.cross(vector2); - -// // If z < 0 then we must draw these in reverse order -// if (vector1.z < 0) { -// geometry.faces.push(new THREE.Face3(2, 1, 0)); -// geometry.faces.push(new THREE.Face3(2, 3, 1)); -// } else { -// geometry.faces.push(new THREE.Face3(0, 1, 2)); -// geometry.faces.push(new THREE.Face3(1, 3, 2)); -// } - -// material = new THREE.MeshBasicMaterial({ color: getColor(entity, data) }); - -// return new THREE.Mesh(geometry, material); -// } - -// function drawText(entity, data) { -// var geometry, material, text; - -// if (!font) -// return console.warn( -// "Text is not supported without a Three.js font loaded with THREE.FontLoader! Load a font of your choice and pass this into the constructor. See the sample for this repository or Three.js examples at http://threejs.org/examples/?q=text#webgl_geometry_text for more details." -// ); - -// geometry = new THREE.TextGeometry(entity.text, { -// font: font, -// height: 0, -// size: entity.textHeight || 12 -// }); - -// material = new THREE.MeshBasicMaterial({ color: getColor(entity, data) }); - -// text = new THREE.Mesh(geometry, material); -// text.position.x = entity.startPoint.x; -// text.position.y = entity.startPoint.y; -// text.position.z = entity.startPoint.z; - -// return text; -// } - -// function drawPoint(entity, data) { -// var geometry, material, point; - -// geometry = new THREE.Geometry(); - -// geometry.vertices.push(new THREE.Vector3(entity.position.x, entity.position.y, entity.position.z)); - -// // TODO: could be more efficient. PointCloud per layer? - -// var numPoints = 1; - -// var color = getColor(entity, data); -// var colors = new Float32Array(numPoints * 3); -// colors[0] = color.r; -// colors[1] = color.g; -// colors[2] = color.b; - -// geometry.colors = colors; -// geometry.computeBoundingBox(); - -// material = new THREE.PointsMaterial({ -// size: 0.05, -// vertexColors: THREE.VertexColors -// }); -// point = new THREE.Points(geometry, material); -// scene.add(point); -// } diff --git a/src/app/view/render2D/featureRenderer2D.ts b/src/app/view/render2D/featureRenderer2D.ts deleted file mode 100644 index b6790e4c..00000000 --- a/src/app/view/render2D/featureRenderer2D.ts +++ /dev/null @@ -1,182 +0,0 @@ -import * as DXFSolidObjectRenderer2D from "./dxfSolidObjectRenderer2D"; -import * as Colors from "../colors"; -import Registry from "../../core/registry"; -import { renderEdgeFeature } from "./dxfObjectRenderer2D"; -import paper from "paper"; -import { ComponentAPI } from "@/componentAPI"; -import {Point, ToolPaperObject} from "@/app/core/init"; -import Feature from "@/app/core/feature"; - -const getLayerColor = function(feature: Feature) { - const height = feature.getValue("height"); - const layerHeight = 1; // feature.layer.estimateLayerHeight(); - let decimal = height / layerHeight; - if (decimal > 1) decimal = 1; - // if (!feature.layer.flip) decimal = 1 - decimal; - console.log("feature Object:", feature); - console.log("feature layer:", feature.layer); - console.log("feature layer type:", feature.layer!.type); - // Throw error if the layer in the feature is null - if (!feature.layer) { - throw new Error("Feature layer is null"); - } - const targetColorSet = Colors.getLayerColors(feature.layer.type); - return Colors.decimalToLayerColor(decimal, targetColorSet, Colors.darkColorKeys); -}; - -const getBaseColor = function(feature: Feature): string { - let decimal = 0; - // if (!feature.layer.flip) decimal = 1 - decimal; - // throw error if the layer in the feature is null - if (!feature.layer) { - throw new Error("Feature layer is null"); - } - const targetColorSet = Colors.getLayerColors(feature.layer.type); - return Colors.decimalToLayerColor(decimal, targetColorSet, Colors.darkColorKeys); -}; - -export function getDefaultValueForType(typeString: string, key: string) { - return ComponentAPI.getDefaultsForType(typeString)[key]; -} - -export function renderTarget(typeString:string, position: Point, customParameters:any = null) { - if (Registry.viewManager?.currentLayer === null || Registry.viewManager?.currentLayer === undefined) { - console.error("No current layer"); - throw new Error("No current layer"); - } - const rendererinfo = ComponentAPI.getRendererInfo(typeString); - const renderer = rendererinfo.object; - const params = renderer.targetParams; - const primParams: {[key: string]: any} = {}; - if (customParameters !== null) { - for (const item of customParameters) { - primParams[item.name] = item.value; - } - } else { - for (const key in params) { - primParams[key] = getDefaultValueForType(typeString, params[key]); - } - } - primParams["position"] = position; - primParams["color"] = new paper.Color(Colors.getDefaultFeatureColor(typeString, Registry.viewManager?.currentLayer)); - const rendered = renderer.render2DTarget(null, primParams); - return rendered; -} - -/** - * This function renders the text to target that trails the cursor - * @param typeString - * @param setString - * @param position - * @return {d} - */ -export function renderTextTarget(typeString: string, position: Point) { - if (Registry.viewManager === null) { - console.error("Registry.viewManager is null"); - throw new Error("Registry.viewManager is null"); - } - const rendered = new paper.PointText(new paper.Point(position[0], position[1])); - rendered.justification = "center"; - rendered.fillColor = new paper.Color(Colors.DEEP_PURPLE_500); - rendered.content = Registry.viewManager.tools.InsertTextTool.text; - rendered.fontSize = 10000; - return rendered; -} - -export function renderEdge(feature:any) { - // TODO: Just call the DXF renderer (outline) for this - renderEdgeFeature(feature); -} - -export function renderText(feature:any) { - // TODO - Figure out where to save the position of the feature - const position = feature.getValue("position"); - const rendered = new paper.PointText(new paper.Point(position[0], position[1])); - rendered.justification = "center"; - if (feature.getParams().color != undefined) { - let color = feature.getParams().color.value; - if (color == "white" || color == "White" || color == "WHITE") { - rendered.fillColor = new paper.Color(Colors.WHITE); - } else if (color == "black" || color == "Black" || color == "BLACK") { - rendered.fillColor = new paper.Color(Colors.BLACK); - } else if (color == "blue" || color == "Blue" || color == "BLUE") { - rendered.fillColor = new paper.Color(Colors.BLUE_500); - } else if (color == "red" || color == "Red" || color == "RED") { - rendered.fillColor = new paper.Color(Colors.RED_500); - } else { - throw new Error("Color choice " + color + " not enabled"); - } - } else { - rendered.fillColor = new paper.Color(getLayerColor(feature)); - } - /// rendered.content = feature.getText(); - rendered.content = feature.getValue("text"); - rendered.fontSize = feature.getValue("fontSize"); - let modrendered = rendered as any; - modrendered["featureID"] = feature.ID; - return modrendered; -} - -/** - * Returns the paperjs drawing object of the passed feature - * @param feature - * @return {*} - */ -export function renderFeature(feature: Feature, key: string | null) { - let rendered; - let params; - const type = feature.getType(); - let set = "Basic"; - if (ComponentAPI.isCustomType(type)) { - set = "Custom"; - rendered = DXFSolidObjectRenderer2D.renderCustomComponentFeature(feature, getBaseColor(feature)); - let modrendered = rendered as any; - modrendered["featureID"] = feature.ID; - return modrendered as ToolPaperObject; - } else if (type === "EDGE") { - return renderEdge(feature); - } else if (type === "Text") { - return renderText(feature); - } else { - const rendererinfo = ComponentAPI.getRendererInfo(type); - const renderer = ComponentAPI.getRenderer(type); - - /* - If the user does not specify the key, then extract it from the rendering info of the feature. - I guess theoretically speaking, one needs to generate a set of invisible feature but for now we are just - ignoring that. - - TODO - Clean up this mess of a system. Its not obvious about how once send this logic. - */ - if (!key || key === null) { - key = rendererinfo.key; - } - - if (!renderer) { - console.error("Could not find renderer method for feature:", feature); - } else { - params = renderer.featureParams; - } - - const primParams: {[key: string]: any} = {}; - for (const paramkey in params) { - primParams[paramkey] = feature.getValue(params[paramkey]); - } - //primParams["position"] = [0,0]; - //console.log("Data for rendering:", primParams); - //Set the position of the params to 0,0 - primParams.color = getLayerColor(feature); - primParams.baseColor = getBaseColor(feature); - rendered = renderer.render2D(primParams, key); - // Rendered is going to be at 0,0 with whatever rotation - // Now we can get draw offset by looking at the rendered topleft corner - // move the feature to user pointed position - // save the drawoffsets on the feature object - // later on in the component, calculate position by subtracting draw offset - // recalculate draw offset whenever parameter changed - let modrendered = rendered as any; - modrendered["featureID"] = feature.ID; - - return modrendered as ToolPaperObject; - } -} diff --git a/src/app/view/render2D/gridRenderer.ts b/src/app/view/render2D/gridRenderer.ts deleted file mode 100644 index 9f25bbf8..00000000 --- a/src/app/view/render2D/gridRenderer.ts +++ /dev/null @@ -1,92 +0,0 @@ -import paper from "paper"; -import {SymbolDefinition} from "paper"; -import AdaptiveGrid from "../grid/adaptiveGrid"; - -export default class GridRenderer { - static renderGrid(grid: AdaptiveGrid) { - // con - const gridGroup = new paper.Group(); - gridGroup.addChild(GridRenderer.makeHorizontalLines(grid)); - gridGroup.addChild(GridRenderer.makeVerticalLines(grid)); - return gridGroup; - } - - static vertLineSymbol(width: number, color: paper.Color) { - return GridRenderer.lineSymbol(paper.view.bounds.topLeft, paper.view.bounds.bottomLeft, width, color); - } - - static horizLineSymbol(width: number, color: paper.Color) { - return GridRenderer.lineSymbol(paper.view.bounds.topLeft, paper.view.bounds.topRight, width, color); - } - - static lineSymbol(start: paper.Point, end: paper.Point, width: number, color: paper.Color) { - color.alpha = 0.25; - const line = new paper.Path.Line({ - from: start, - to: end, - strokeWidth: width, - strokeColor: color - }); - // line.strokeColor.alpha = 0.25; - line.remove(); - return new paper.SymbolDefinition(line); - } - - static isThick(val: number, origin: number, spacing:number, thickCount:number) { - const diff = Math.abs(val - origin); - const remainder = diff % (spacing * thickCount); - if (remainder < spacing) { - return true; - } else return false; - } - - static makeVerticalLines(grid: AdaptiveGrid) { - const spacing = grid.getSpacing(); - const sym = GridRenderer.vertLineSymbol(grid.getThinWidth(), grid.color); - const thickSym = GridRenderer.vertLineSymbol(grid.getThickWidth(), grid.color); - const start = paper.view.bounds.topLeft; - const end = paper.view.bounds.topRight; - const height = paper.view.bounds.height; - const group = new paper.Group(); - - const startX = Math.floor((start.x - grid.origin.x) / spacing) * spacing + grid.origin.x; - - for (let i = startX; i < end.x; i += spacing) { - const pos = new paper.Point(i, start.y + height / 2); - if (GridRenderer.isThick(i, grid.origin.x, spacing, grid.thickCount)) group.addChild(thickSym.place(pos)); - else group.addChild(sym.place(pos)); - } - - for (let i = startX; i >= end.x; i -= spacing) { - const pos = new paper.Point(i, start.y + height / 2); - if (GridRenderer.isThick(i, grid.origin.x, spacing, grid.thickCount)) group.addChild(thickSym.place(pos)); - else group.addChild(sym.place(pos)); - } - return group; - } - - static makeHorizontalLines(grid: AdaptiveGrid) { - const spacing = grid.getSpacing(); - const sym = GridRenderer.horizLineSymbol(grid.getThinWidth(), grid.color); - const thickSym = GridRenderer.horizLineSymbol(grid.getThickWidth(), grid.color); - const start = paper.view.bounds.topLeft; - const end = paper.view.bounds.bottomLeft; - const width = paper.view.bounds.width; - const group = new paper.Group(); - - const startY = Math.floor((start.y - grid.origin.y) / spacing) * spacing + grid.origin.y; - - for (let i = startY; i < end.y; i += spacing) { - const pos = new paper.Point(start.x + width / 2, i); - if (GridRenderer.isThick(i, grid.origin.y, spacing, grid.thickCount)) group.addChild(thickSym.place(pos)); - else group.addChild(sym.place(pos)); - } - - for (let i = startY; i >= end.y; i -= spacing) { - const pos = new paper.Point(start.x + width / 2, i); - if (GridRenderer.isThick(i, grid.origin.y, spacing, grid.thickCount)) group.addChild(thickSym.place(pos)); - else group.addChild(sym.place(pos)); - } - return group; - } -} diff --git a/src/app/view/render2D/paperComponentPortView.ts b/src/app/view/render2D/paperComponentPortView.ts deleted file mode 100644 index 6daa2acf..00000000 --- a/src/app/view/render2D/paperComponentPortView.ts +++ /dev/null @@ -1,90 +0,0 @@ -import Component from "@/app/core/component"; -import { Point } from "paper/dist/paper-core"; -import ViewManager from "../viewManager"; -import ComponentPortRenderer2D from "./componentPortRenderer2D"; - -export default class PaperComponentPortView { - - private _viewManagerDelegate: ViewManager; - private _componentAndRenderMap: Map>; - private _activeRenders: Array; - private _paperlayer: paper.Group; - private _enabled: boolean; - - constructor(paperlayer: paper.Group, viewmanager: ViewManager) { - this._paperlayer = paperlayer; - this._componentAndRenderMap = new Map(); - this._activeRenders = []; - this._viewManagerDelegate = viewmanager; - this._enabled = true; - } - - addComponentPortElements(component: Component) { - const zfactor = 1; - if (!this._componentAndRenderMap.has(component.id)) { - this._componentAndRenderMap.set(component.id, []); - } - - const componentportrenders = this._componentAndRenderMap.get(component.id); - - if (componentportrenders === undefined) { - console.error(`component ${component.id} has no port renders`); - return; - } - - for (const key of component.ports.keys()) { - const componentport = component.ports.get(key); - if (componentport === undefined) { - console.error(`component ${component.id} has no port ${key}`); - continue; - } - // TODO - Fix this API - const render = ComponentPortRenderer2D.renderComponentPort(componentport, [0,0], 0, zfactor); - componentportrenders.push(render); - } - } - - updateRenders() { - if(this._viewManagerDelegate.currentDevice === null){ - console.error("No device selected, not rendering component ports"); - return; - } - - if (!this._enabled) { - this.clearActiveRenders(); - return; - } - this.clearActiveRenders(); - const components = this._viewManagerDelegate.currentDevice.components; - for (const i in components) { - const component = components[i]; - const renders = ComponentPortRenderer2D.renderComponentPorts(component); - for (const j in renders) { - this._activeRenders.push(renders[j]); - this._paperlayer.addChild(renders[j]); - } - } - } - - clearActiveRenders() { - if (!this._enabled) { - return; - } - if (this._activeRenders) { - for (const i in this._activeRenders) { - this._activeRenders[i].remove(); - } - } - - this._activeRenders = []; - } - - enable() { - this._enabled = true; - } - - disable() { - this.clearActiveRenders(); - this._enabled = false; - } -} diff --git a/src/app/view/render2D/ratsNestRenderer2D.ts b/src/app/view/render2D/ratsNestRenderer2D.ts deleted file mode 100644 index 58777df1..00000000 --- a/src/app/view/render2D/ratsNestRenderer2D.ts +++ /dev/null @@ -1,47 +0,0 @@ -import Connection from "@/app/core/connection"; -import { Point } from "@/app/core/init"; -import paper from "paper"; -import Device from "@/app/core/device"; - -export default class RatsNestRenderer2D { - static renderRatsNest(connectionlist: Array, device: Device) { - const ratsnestgroup = new paper.Group(); - let start, end, sink, render, sourceid, sinkid; - for (const i in connectionlist) { - const connection = connectionlist[i]; - const source = connection.source; - if (source === null) { - console.error(`source ${connection.id} is null, cannot render rats nest`); - continue; - } - const sinks = connection.sinks; - // console.log("Sinks", sinks, sinks.length); - for (const ii in sinks) { - sink = sinks[ii]; - const startcomponent = source.component; - const endcomponent = sink.component; - start = startcomponent.getCenterPosition(); - end = endcomponent.getCenterPosition(); - // console.log(start, end); - render = RatsNestRenderer2D.renderRatsNestConnection(start, end); - ratsnestgroup.addChild(render); - } - } - - return ratsnestgroup; - } - - static renderRatsNestConnection(start: Point, end: Point) { - const vstart = new paper.Point(start[0], start[1]); - const vend = new paper.Point(end[0], end[1]); - - const vpath = new paper.Path([vstart, vend]); - - vpath.strokeColor = new paper.Color("#696965"); - vpath.strokeWidth = 500; - vpath.strokeCap = "round"; - - vpath.dashArray = [1000, 1300]; - return vpath; - } -} diff --git a/src/app/view/renderLayer.ts b/src/app/view/renderLayer.ts deleted file mode 100644 index e0188a6d..00000000 --- a/src/app/view/renderLayer.ts +++ /dev/null @@ -1,351 +0,0 @@ -import uuid from "node-uuid"; -import Feature from "../core/feature"; -import EdgeFeature from "../core/edgeFeature"; - -import { RenderLayerInterchangeV1_2, FeatureInterchangeV1_2, LayerInterchangeV1, LogicalLayerType } from "../core/init"; -import Layer from "../core/layer"; -import Params from "../core/params"; -import { ComponentAPI } from "@/componentAPI"; - -export default class RenderLayer { - features: { [index: string]: Feature }; - featureCount: number; - color: string | undefined; - private __id: string; - private __type: LogicalLayerType; - name: string; - protected _physicalLayer: Layer | null; - protected params: Params; - - constructor(name: string = "New Layer", modellayer: Layer | null = null, type: LogicalLayerType = LogicalLayerType.FLOW) { - this.__type = type; - this.features = {}; - this.featureCount = 0; - this.name = name; - if (modellayer) this.params = modellayer.params; - else this.params = new Params([], Layer.getUniqueParameters(), new Map()); - this._physicalLayer = modellayer; - if (type == LogicalLayerType.FLOW) { - this.color = "indigo"; - } else if (type == LogicalLayerType.CONTROL) { - this.color = "red"; - } else if (type == LogicalLayerType.INTEGRATION) { - this.color = "green"; - } else { - this.color = undefined; - } - this.__id = ComponentAPI.generateID(); - } - - /** - * Sets the render layer - * - * @memberof RenderLayer - */ - set physicalLayer(layer: Layer | null) { - this._physicalLayer = layer; - } - - /** - * returns the render layer - * - * @type {(Layer | null)} - * @memberof RenderLayer - */ - get physicalLayer(): Layer | null { - return this._physicalLayer; - } - - /** - * Returns the type of the render layer - * - * @readonly - * @type {string} - * @memberof RenderLayer - */ - get type(): LogicalLayerType { - return this.__type; - } - - /** - * Returns id of the render layer - * - * @readonly - * @type {string} - * @memberof RenderLayer - */ - get id(): string { - return this.__id; - } - - /** - * Adds a feature to the layer - * @param {Feature} feature Feature to pass to add to the layer - * @memberof Layer - * @returns {void} - */ - addFeature(feature: Feature, physfeat: boolean = true): void { - this.__ensureIsAFeature(feature); - this.features[feature.ID] = feature; - this.featureCount += 1; - if (this.physicalLayer !== null && physfeat == true) { - this.physicalLayer.addFeature(feature); - feature.layer = this.physicalLayer; - } else { - feature.layer = this.physicalLayer; - } - feature.setManufacturingInfoLayer(); - } - - /** - * Checks whether the argument pass is a feature - * @param {Feature} feature Feature object - * @memberof Layer - * @returns {void} - */ - __ensureIsAFeature(feature: any): void { - if (!(feature instanceof Feature) && !(feature instanceof EdgeFeature)) { - throw new Error("Provided value" + feature + " is not a Feature! Did you pass an ID by mistake?"); - } - } - - /** - * Checks whether the feature already exist - * @param {Feature} feature Feature object - * @memberof Layer - * @returns {void} - */ - __ensureFeatureExists(feature: Feature): void { - if (!this.containsFeature(feature)) throw new Error("Layer does not contain the specified feature!"); - } - - /** - * Checks if feature exist based on it's ID - * @param {String} featureID ID of the feature to search for - * @memberof Layer - * @returns {void} - */ - __ensureFeatureIDExists(featureID: string): void { - if (!this.containsFeatureID(featureID)) throw new Error("Layer does not contain a feature with the specified ID!"); - } - - /** - * Returns feature based on it's ID - * @param {String} featureID - * @returns {Feature} - * @memberof Layer - */ - getFeature(featureID: string): Feature { - this.__ensureFeatureIDExists(featureID); - return this.features[featureID]; - } - - /** - * Removes selected feature - * @param {Feature} feature Feature object - * @memberof Layer - * @returns {void} - */ - removeFeature(feature: Feature): void { - this.removeFeatureByID(feature.ID); - } - - // TODO: Stop using delete, it's slow! - /** - * Removes a feature by passing it's ID as a parameter - * @param {string} featureID ID of the feature - * @memberof Layer - * @returns {void} - */ - removeFeatureByID(featureID: string): void { - this.__ensureFeatureIDExists(featureID); - this.featureCount -= 1; - let physLayer = this._physicalLayer; - if (physLayer !== null) { - if (physLayer.containsFeatureID(featureID)) physLayer.removeFeatureByID(featureID); - } - delete this.features[featureID]; - } - - /** - * Checks if object contains a feature - * @param {Feature} feature Feature object - * @returns {Boolean} true if it has the feature - * @memberof Layer - */ - containsFeature(feature: Feature): boolean { - this.__ensureIsAFeature(feature); - return this.features.hasOwnProperty(feature.ID); - } - - /** - * Checks if object contains a feature based on the feature's ID - * @param {String} featureID ID of the feature to search for - * @returns {Boolean} true if it has the feature - * @memberof Layer - */ - containsFeatureID(featureID: string): boolean { - return this.features.hasOwnProperty(featureID); - } - - /** - * Gets all features from the layers - * @returns {Array} Returns all features from the layers - * @memberof Layer - */ - getAllFeaturesFromLayer(): { [index: string]: Feature } { - return this.features; - } - - /** - * Convers features to JSON format - * @returns {JSON} Returns a JSON format with the features in a JSON format - * @memberof Layer - */ - __featuresToJSON(): { [index: string]: any } { - const output: { [index: string]: any } = {}; - for (const i in this.features) { - output[i] = this.features[i].toJSON(); - } - return output; - } - - /** - * Converts features to Interchange format - * @returns {Array} Returns an array with the features in Interchange format - * @memberof Layer - */ - __featuresInterchangeV1(): Array { - const output: Array = []; - for (const i in this.features) { - output.push(this.features[i].toInterchangeV1()); - } - return output; - } - - /** - * Loads features from JSON format - * @param {JSON} json JSON format file - * @memberof Layer - */ - __loadFeaturesFromJSON(json: { [index: string]: any }): void { - for (const i in json) { - this.addFeature(Feature.fromJSON(json[i])); - } - } - - /** - * Loads features from Interchange format - * @param {FeatureInterchangeV1_2} json Interchange format file - * @memberof RenderLayer - */ - __loadFeaturesFromInterchangeV1(json: Array): void { - for (const i in json) { - this.addFeature(Feature.fromInterchangeV1(json[i])); - } - } - - /** - * Converts the model layer into Interchange format - * @returns {LayerInterchangeV1 | null} Returns a Interchange format with the attributes of the object - * @memberof RenderLayer - */ - __layerToInterchangeV1(): LayerInterchangeV1 | null { - if (this._physicalLayer !== null) { - return this._physicalLayer.toInterchangeV1(); - } - return null; - } - - // /** - // * Loads physical layer from json format - // * @param {json} json format file - // * @memberof RenderLayer - // */ - // __loadLayerFromJSON(json: { [index: string]: any }): void { - // this.physicalLayer = Layer.fromJSON(json); - // } - - // /** - // * Loads physical layer from Interchange format - // * @param {LayerInterchangeV1} json Interchange format file - // * @memberof RenderLayer - // */ - // __loadLayerFromInterchange(json: LayerInterchangeV1): void { - // this.physicalLayer = Layer.fromInterchangeV1(json); - // } - - /** - * Converts the attributes of the object into Interchange format - * @returns {LayerInterchangeV1} Returns a Interchange format with the attributes of the object - * @memberof Layer - */ - toInterchangeV1(): RenderLayerInterchangeV1_2 { - let physlayer; - if (this.physicalLayer) { - physlayer = this.physicalLayer.id; - } else { - physlayer = null; - } - const output: RenderLayerInterchangeV1_2 = { - id: this.__id, - name: this.name, - //name: this.name, - // TODO - Add group and unique name parameters to the system and do type checking - // against type and not name in the future - modellayer: physlayer, - type: this.__type, - //params: this.params.toJSON(), - features: this.__featuresInterchangeV1(), - color: this.color - }; - return output; - } - - /** - * Load from a JSON format a new layer object - * @param {JSON} json JSON format - * @returns {Layer} Returns a new layer object - * @memberof Layer - */ - static fromJSON(json: { [index: string]: any }): RenderLayer { - //Effectively defunct, use loadUtils version - if (!Object.prototype.hasOwnProperty.call(json, "features")) { - throw new Error("JSON layer has no features!"); - } - const newLayer = new RenderLayer(json.name, null, json.type); - newLayer.__loadFeaturesFromJSON(json.features); - //if (json.modellayer) newLayer.__loadLayerFromJSON(json.modellayer); - if (json.color) newLayer.color = json.color; - return newLayer; - } - - /** - * Load from an Interchange format a new layer object - * @param {*} json - * @returns {Layer} Returns a new layer object - * @memberof Layer - */ - static fromInterchangeV1(json: RenderLayerInterchangeV1_2): RenderLayer { - //Effectively defunct, use loadUtils version - let layerType: LogicalLayerType | undefined; - if (Object.prototype.hasOwnProperty.call(json, "type")) { - if (json.type === "FLOW") { - layerType = LogicalLayerType.FLOW; - } else if (json.type === "CONTROL") { - layerType = LogicalLayerType.CONTROL; - } else if (json.type === "INTEGRATION") { - layerType = LogicalLayerType.INTEGRATION; - } else { - throw new Error("Unknown layer type: " + json.type); - } - } - const newLayer: RenderLayer = new RenderLayer(json.name, null, layerType); - - newLayer.__loadFeaturesFromInterchangeV1(json.features); - - //if (json.modellayer) newLayer.__loadLayerFromInterchange(json.modellayer); - if (json.color) newLayer.color = json.color; // TODO: Figure out if this needs to change in the future - return newLayer; - } -} diff --git a/src/app/view/selection.ts b/src/app/view/selection.ts deleted file mode 100644 index bca4052a..00000000 --- a/src/app/view/selection.ts +++ /dev/null @@ -1,185 +0,0 @@ -import paper from "paper"; -import { ViewManager } from ".."; - -/** - * Selection class - */ -export default class Selection { - protected __components: Array; - protected __connections: Array; - protected __otherFeatures: Array; - protected __bounds: paper.Rectangle; - private viewManagerDelegate: ViewManager; - - /** - * Pass an array of feature IDs that can be used to store the selection - * @param {Array} items Array of String - */ - constructor(items: Array, viewManager: ViewManager) { - this.__components = []; - this.__connections = []; - this.__otherFeatures = []; - // Sort out wether each of the items selected belongs to one of the following - for (const i in items) { - console.log(items[i]); - } - this.__bounds = this.__calculateSelectionBounds(); - this.viewManagerDelegate = viewManager; - } - - /** - * Generates a replica - * @param {number} x X coordinate for here the selection should be replicated - * @param {number} y Y coordinate for where the selection should be replicated - * @returns {void} - * @memberof Selection - */ - replicate(x: number, y: number): void { - /* - 1. Get the selection's reference point - 2. Go through each of the items - 3. Clone components/connections/other features - */ - const referencepoint = this.__bounds.topLeft; - - console.log("reference point:", referencepoint); - - if (this.viewManagerDelegate.currentDevice === null) { - throw new Error("No device selected"); - } - for (const i in this.__components) { - const render = this.viewManagerDelegate.currentDevice.getFeatureByID(this.__components[i]); - } - - for (const i in this.__connections) { - const render = this.viewManagerDelegate.currentDevice.getFeatureByID(this.__connections[i]); - } - - for (const i in this.__otherFeatures) { - const render = this.viewManagerDelegate.currentDevice.getFeatureByID(this.__otherFeatures[i]); - } - } - - /** - * Selects all the components, connections and features - * @returns {void} - * @memberof Selection - */ - selectAll(): void { - // Check if currentDevices is null - if (this.viewManagerDelegate.currentDevice === null) { - throw new Error("No device selected"); - } - for (const i in this.__components) { - const component = this.viewManagerDelegate.currentDevice.getComponentByID(this.__components[i]); - if (component === null) { - throw new Error("Component not found"); - } - for (const j in component.featureIDs) { - const feature = this.viewManagerDelegate.currentDevice.getFeatureByID(component.featureIDs[i]); - const render = this.viewManagerDelegate.view.getRender(feature.ID); - render.selected = true; - } - } - - for (const i in this.__connections) { - const connection = this.viewManagerDelegate.currentDevice.getConnectionByID(this.__connections[i]); - if (connection === null) { - throw new Error("Connection not found"); - } - for (const j in connection.featureIDs) { - const feature = this.viewManagerDelegate.currentDevice.getFeatureByID(connection.featureIDs[i]); - const render = this.viewManagerDelegate.view.getRender(feature.ID); - render.selected = true; - } - } - - for (const i in this.__otherFeatures) { - const feature = this.viewManagerDelegate.currentDevice.getFeatureByID(this.__otherFeatures[i]); - const render = this.viewManagerDelegate.view.getRender(feature.ID); - render.selected = true; - } - } - - /** - * Gets all the bounds - * @returns {Array} Returns an array containing the bounds of the selection - * @memberof Selection - */ - get bounds(): paper.Rectangle { - return this.__bounds; - } - - /** - * Calculates how much area has been selected - * @returns {void} - * @memberof Selection - */ - __calculateSelectionBounds(): paper.Rectangle { - let xmin = 0; - let ymin = 0; - let xmax = 0; - let ymax = 0; - let bounds; - - if(this.viewManagerDelegate.currentDevice === null) { - throw new Error("No device selected"); - } - for (const i in this.__components) { - const feature = this.viewManagerDelegate.currentDevice.getFeatureByID(this.__components[i]); - const render = this.viewManagerDelegate.view.getRender(feature.ID); - bounds = render.bounds; - if (bounds.x < xmin) { - xmin = bounds.x; - } - if (bounds.y < ymin) { - ymin = bounds.y; - } - if (bounds.x + bounds.width > xmax) { - xmax = bounds.x + bounds.width; - } - if (bounds.y + bounds.height > ymax) { - ymax = bounds.y + bounds.height; - } - } - - for (const i in this.__connections) { - const feature = this.viewManagerDelegate.currentDevice.getFeatureByID(this.__connections[i]); - const render = this.viewManagerDelegate.view.getRender(feature.ID); - bounds = render.bounds; - if (bounds.x < xmin) { - xmin = bounds.x; - } - if (bounds.y < ymin) { - ymin = bounds.y; - } - if (bounds.x + bounds.width > xmax) { - xmax = bounds.x + bounds.width; - } - if (bounds.y + bounds.height > ymax) { - ymax = bounds.y + bounds.height; - } - } - - for (const i in this.__otherFeatures) { - const feature = this.viewManagerDelegate.currentDevice.getFeatureByID(this.__otherFeatures[i]); - const render = this.viewManagerDelegate.view.getRender(feature.ID); - bounds = render.bounds; - if (bounds.x < xmin) { - xmin = bounds.x; - } - if (bounds.y < ymin) { - ymin = bounds.y; - } - if (bounds.x + bounds.width > xmax) { - xmax = bounds.x + bounds.width; - } - if (bounds.y + bounds.height > ymax) { - ymax = bounds.y + bounds.height; - } - } - - const ret = new paper.Rectangle(new paper.Point(xmin, ymin), new paper.Point(xmax, ymax)); - return ret; - } -} diff --git a/src/app/view/textElement.ts b/src/app/view/textElement.ts deleted file mode 100644 index fb24c522..00000000 --- a/src/app/view/textElement.ts +++ /dev/null @@ -1,13 +0,0 @@ -import Parameter from "../core/parameter"; -import { ComponentAPI } from "@/componentAPI"; -import UIElement from "./uiElement"; - -export default class TextElement extends UIElement { - constructor(type: string, paramdata: { [index: string]: Parameter }, featureIDs: Array, id: string = ComponentAPI.generateID()) { - super(id); - this.__position = paramdata.position.value; - this.__height = paramdata.height.value; - this.__type = type; - this.__featureIDs = featureIDs; - } -} diff --git a/src/app/view/tools/cellPositionTool.ts b/src/app/view/tools/cellPositionTool.ts deleted file mode 100644 index fde9aad0..00000000 --- a/src/app/view/tools/cellPositionTool.ts +++ /dev/null @@ -1,53 +0,0 @@ -import PositionTool from "./positionTool"; -import paper from "paper"; -import Registry from "../../core/registry"; -import Device from "../../core/device"; -import ViewManager from "@/app/view/viewManager"; -import Parameter from "../../core/parameter"; -export default class CellPositionTool extends PositionTool { - constructor(viewManagerDelegate: ViewManager, typeString: string, setString: string, currentParameters = null) { - super(viewManagerDelegate, typeString, currentParameters); - } - - createNewFeature(point: paper.Point): void { - const featureIDs = []; - const currentlevel = Math.floor(Registry.viewManager!.renderLayers.indexOf(this.viewManagerDelegate.currentLayer) / 3); - const flowlayer = currentlevel * 3; - const controllayer = currentlevel * 3 + 1; - const cell_layer = currentlevel * 3; - - const paramvalues = this.getCreationParameters(new paper.Point(0, 0)); - let newFeature = Device.makeFeature(this.typeString, paramvalues); - this.currentFeatureID = newFeature.ID; - this.viewManagerDelegate.addFeature(newFeature, flowlayer); - - featureIDs.push(newFeature.ID); - - const params_to_copy = newFeature.getParams(); - - const params_point = PositionTool.getTarget([point.x, point.y]); - const newtypestring = this.typeString + "_cell"; - const paramstoadd = newFeature.getParams(); - paramstoadd["position"] = new Parameter("position", params_point); - newFeature = Device.makeFeature(newtypestring, paramvalues); - newFeature.setParams(paramstoadd); - - this.currentFeatureID = newFeature.ID; - this.viewManagerDelegate.addFeature(newFeature, cell_layer); - featureIDs.push(newFeature.ID); - - super.createNewComponent(this.typeString, params_to_copy, featureIDs); - Registry.viewManager!.saveDeviceState(); - } - - showTarget(): void { - if (this.lastPoint === null) { - return; - } - if (this.currentParameters === null) { - throw new Error("No parameters set"); - } - const target = PositionTool.getTarget(this.lastPoint); - this.viewManagerDelegate.updateTarget(this.typeString, this.setString, target, this.currentParameters); - } -} diff --git a/src/app/view/tools/channelTool.ts b/src/app/view/tools/channelTool.ts deleted file mode 100644 index 78e44838..00000000 --- a/src/app/view/tools/channelTool.ts +++ /dev/null @@ -1,141 +0,0 @@ -import MouseTool from "./mouseTool"; - -import Registry from "../../core/registry"; -import SimpleQueue from "../../utils/simpleQueue"; -import Device from "../../core/device"; -import paper from "paper"; -import { Point, ToolPaperObject } from "@/app/core/init"; -import ViewManager from "../viewManager"; - -export default class ChannelTool extends MouseTool { - typeString: string; - setString: string; - startPoint: Point | null; - lastPoint: Point | null; - currentChannelID: string | null; - currentTarget: any; - dragging: boolean; - - showQueue: SimpleQueue; - updateQueue: SimpleQueue; - - constructor(viewManager: ViewManager, typeString: string, setString: string) { - super(viewManager); - this.typeString = typeString; - this.setString = setString; - this.startPoint = null; - this.lastPoint = null; - this.currentChannelID = null; - this.currentTarget = null; - this.dragging = false; - const ref = this; - - this.showQueue = new SimpleQueue( - function() { - if(ref.lastPoint === null){ - return; - } - ref.showTarget(new paper.Point(ref.lastPoint)); - }, - 20, - false - ); - - this.updateQueue = new SimpleQueue( - function() { - ref.updateChannel(); - }, - 20, - false - ); - - this.down = function(event) { - Registry.viewManager?.killParamsWindow(); - paper.project.deselectAll(); - ref.dragging = true; - ref.initChannel(); - }; - this.up = function(event) { - ref.dragging = false; - ref.finishChannel((MouseTool.getEventPosition((event as unknown) as MouseEvent) as unknown) as Point); - }; - this.move = function(event) { - ref.lastPoint = (MouseTool.getEventPosition((event as unknown) as MouseEvent) as unknown) as Point; - if (ref.dragging) { - ref.updateQueue.run(); - } - ref.showQueue.run(); - }; - } - - static makeReticle(point: paper.Point) { - const size = 10 / paper.view.zoom; - const ret = new paper.Path.Circle(point, size); - ret.fillColor = new paper.Color(0.5, 0, 1, 0.5); - return ret; - } - - abort(): void { - this.dragging = false; - if (this.currentTarget) { - this.currentTarget.remove(); - } - if (this.currentChannelID) { - Registry.viewManager?.removeFeatureByID(this.currentChannelID); - } - } - - showTarget(point: paper.Point): void { - const target = ChannelTool.getTarget(this.lastPoint!); - Registry.viewManager?.updateTarget(this.typeString, this.setString, target, {}); - } - - initChannel(): void { - this.startPoint = ChannelTool.getTarget(this.lastPoint!); - this.lastPoint = this.startPoint; - } - - updateChannel(): void { - if (this.lastPoint && this.startPoint) { - if (this.currentChannelID) { - const target = ChannelTool.getTarget(this.lastPoint); - const feat = this.viewManagerDelegate.currentLayer.getFeature(this.currentChannelID); - feat?.updateParameter("end", target); - } else { - const newChannel = ChannelTool.createChannel(this.startPoint, this.startPoint, this.typeString, this.setString); - this.currentChannelID = newChannel.ID; - Registry.viewManager?.addFeature(newChannel); - } - } - } - - finishChannel(point: Point): void { - const target = ChannelTool.getTarget(point); - if (this.currentChannelID) { - if (this.startPoint![0] === target[0] && this.startPoint![1] === target[1]) { - Registry.viewManager?.removeFeatureByID(this.currentChannelID); - } - } else { - this.updateChannel(); - } - this.currentChannelID = null; - this.startPoint = null; - Registry.viewManager?.saveDeviceState(); - } - - static createChannel(start: any, end: any, typestring: string | null = null, setstring: string | null = null) { - return Device.makeFeature(typestring!, { - start: start, - end: end - }); - } - - // TODO: Re-establish target selection logic from earlier demo - static getTarget(point: Point): Point { - if (Registry.viewManager === null){ - throw new Error("ViewManager not initialized"); - } - const target = Registry.viewManager.snapToGrid(point); - return target; - } -} diff --git a/src/app/view/tools/componentPositionTool.ts b/src/app/view/tools/componentPositionTool.ts deleted file mode 100644 index d669d1a1..00000000 --- a/src/app/view/tools/componentPositionTool.ts +++ /dev/null @@ -1,30 +0,0 @@ -import PositionTool from "./positionTool"; -import Registry from "../../core/registry"; -import Device from "../../core/device"; -import ViewManager from "@/app/view/viewManager"; -import paper from "paper"; -import Parameter from "@/app/core/parameter"; - -export default class ComponentPositionTool extends PositionTool { - constructor(viewManagerDelegate: ViewManager, typeString: string, setString: string, currentParams: { [k: string]: any } | null = null) { - super(viewManagerDelegate, typeString, currentParams); - } - - createNewFeature(point: paper.Point): void { - const featureIDs = []; - const paramvalues = this.getCreationParameters(new paper.Point(0, 0)); - const newFeature = Device.makeFeature(this.typeString, paramvalues); - this.currentFeatureID = newFeature.ID; - - this.viewManagerDelegate.addFeature(newFeature); - - featureIDs.push(newFeature.ID); - - const params_point = PositionTool.getTarget([point.x, point.y]); - - const params_to_copy = newFeature.getParams(); - params_to_copy["position"] = new Parameter("position", params_point); - super.createNewComponent(this.typeString, params_to_copy, featureIDs); - Registry.viewManager?.saveDeviceState(); - } -} diff --git a/src/app/view/tools/connectionTool.ts b/src/app/view/tools/connectionTool.ts deleted file mode 100644 index c0034a48..00000000 --- a/src/app/view/tools/connectionTool.ts +++ /dev/null @@ -1,577 +0,0 @@ -import MouseTool from "./mouseTool"; -import Connection from "../../core/connection"; -import SimpleQueue from "../../utils/simpleQueue"; -import Device from "../../core/device"; -import paper from "paper"; -import Params from "../../core/params"; -import ConnectionTarget from "../../core/connectionTarget"; -import ComponentPort from "../../core/componentPort"; -import { ComponentAPI } from "@/componentAPI"; -import EventBus from "@/events/events"; -import { LogicalLayerType, Point, ToolPaperObject } from "@/app/core/init"; - -import Registry from "../../core/registry"; -import MapUtils from "../../utils/mapUtils"; -import PositionTool from "./positionTool"; -import { ViewManager } from "@/app"; - -export enum ConnectionToolState { - PLACE_FIRST_POINT, - TARGET_PLACED_START_AGAIN, - PLACE_WAYPOINT, - INTERSECTION_AWAITING_USER_INPUT -} - -export default class ConnectionTool extends MouseTool { - typeString: string; - setString: string; - startPoint: Point | null; - lastPoint: Point | null; - wayPoints: any[]; - currentChannelID: string | null; - currentTarget: paper.Point | null; - dragging: boolean; - source: ConnectionTarget | null; - sinks: Array; - - private __currentConnectionObject: Connection | null; - private __STATE: ConnectionToolState = ConnectionToolState.PLACE_FIRST_POINT; - showQueue: SimpleQueue; - updateQueue: SimpleQueue; - - - public get state() : ConnectionToolState { - return this.__STATE; - } - - - constructor(viewManagerDelegate: ViewManager, typeString: string, setString: string) { - super(viewManagerDelegate); - this.typeString = typeString; - this.setString = setString; - this.startPoint = null; - this.lastPoint = [0,0]; - this.wayPoints = []; - this.currentChannelID = null; - this.currentTarget = null; - this.dragging = false; - this.source = null; - this.sinks = []; - this.__currentConnectionObject = null; - - /* - States: - 1. SOURCE - 2. WAYPOINT - 3. TARGET - */ - const ref = this; - - this.showQueue = new SimpleQueue( - function () { - if (ref.lastPoint === null) { - return; - } - ref.showTarget(new paper.Point(ref.lastPoint)); - }, - 20, - false - ); - - this.updateQueue = new SimpleQueue( - function () { - ref.updateChannel(); - }, - 20, - false - ); - - this.down = function (event) { - Registry.viewManager?.killParamsWindow(); - paper.project.deselectAll(); - console.log("Current State:", ref.__STATE); - switch (ref.__STATE) { - case ConnectionToolState.PLACE_FIRST_POINT: - ref.__STATE = ConnectionToolState.PLACE_WAYPOINT; - ref.dragging = true; - ref.initChannel(); - break; - case ConnectionToolState.PLACE_WAYPOINT: - ref.addWayPoint(event as unknown as MouseEvent, (event as any).altKey); - break; - case ConnectionToolState.TARGET_PLACED_START_AGAIN: - ref.__STATE = ConnectionToolState.PLACE_WAYPOINT; - ref.dragging = true; - ref.initChannel(); - // ref.createConnection(); - break; - } - }; - - this.rightdown = function (event) { - ref.__STATE = ConnectionToolState.TARGET_PLACED_START_AGAIN; - ref.dragging = false; - const end = ref.wayPoints.pop(); - ref.lastPoint = end; - ref.finishChannel(); - EventBus.get().emit(EventBus.RIGHT_CLICK); - }; - - this.move = function (event) { - // Check if orthogonal - const point = MouseTool.getEventPosition(event as unknown as MouseEvent); - if (point === null) return; - const target = PositionTool.getTarget([point.x, point.y]); - - if ((event as any).altKey && ref.__STATE === ConnectionToolState.PLACE_WAYPOINT) { - let lastwaypoint = ref.startPoint; - if (ref.wayPoints.length > 0) { - lastwaypoint = ref.wayPoints[ref.wayPoints.length - 1]; - } - // Check if lastwaypoint is null or not - if (lastwaypoint === null) { - throw new Error("Last waypoint is null"); - } - // ref.getNextOrthogonalPoint(lastwaypoint, target); - const orthopoint = ref.getNextOrthogonalPoint(lastwaypoint, target); - ref.lastPoint = [orthopoint[0], orthopoint[1]]; - } else { - ref.lastPoint = [target[0], target[1]]; - } - if (ref.dragging) { - // This queue basically does the rendering of the connection feature - ref.updateQueue.run(); - } - - // This queue basically does the rendering of the target - ref.showQueue.run(); - }; - } - - /** - * This function renders the cross haired target used to show the mouse position. - * @param point - */ - showTarget(point: paper.Point): void { - const target = PositionTool.getTarget([point.x, point.y]); - Registry.viewManager?.updateTarget(this.typeString, this.setString, target); - } - - initChannel(): void { - if (this.lastPoint === null) { - throw new Error("No last point to init channel"); - } - const isPointOnComponent = this.__isPointOnComponent(new paper.Point(this.lastPoint)); - const isPointOnConnection = this.__isPointOnConnection(new paper.Point(this.lastPoint)); - this.startPoint = PositionTool.getTarget(this.lastPoint); - this.lastPoint = this.startPoint; - if (isPointOnComponent) { - // Modify the waypoint to reflect closest port in the future - const componentport = this.__getClosestComponentPort(isPointOnComponent, this.startPoint); - if (componentport !== null) { - const location = ComponentPort.calculateAbsolutePosition(componentport, isPointOnComponent); - this.source = new ConnectionTarget(isPointOnComponent, componentport.label); - this.startPoint = location; - this.lastPoint = this.startPoint; - this.wayPoints.push(location); - } else { - this.source = new ConnectionTarget(isPointOnComponent, ""); - this.wayPoints.push(this.startPoint); - } - } else if (isPointOnConnection) { - console.warn("Implement method to make the connection connections"); - // TODO: Find the current connection we are working with and load it into this tools working memory - this.__currentConnectionObject = isPointOnConnection; // We just use this as the reference - // TODO: Modify the waypoint to reflect the closest point on connection center spine - this.wayPoints.push(this.startPoint); - } else { - this.wayPoints.push(this.startPoint); - } - } - - updateChannel(): void { - if (this.lastPoint && this.startPoint) { - if (this.currentChannelID) { - const target = PositionTool.getTarget(this.lastPoint); - const feat = this.viewManagerDelegate.currentLayer?.getFeature(this.currentChannelID); - feat?.updateParameter("end", target); - feat?.updateParameter("wayPoints", this.wayPoints); - feat?.updateParameter("segments", this.generateSegments()); - } else { - if (this.startPoint === null) { - throw new Error("No start point to update the channel"); - } - const newChannel = this.createChannel(new paper.Point(this.startPoint), new paper.Point(this.startPoint)); - this.currentChannelID = newChannel.ID; - Registry.viewManager?.addFeature(newChannel); - } - } - } - - /** - * Finishes the creation of the connection object - */ - finishChannel(): void { - if (this.currentChannelID) { - this.wayPoints.push(this.lastPoint); - const feat = this.viewManagerDelegate.currentLayer.getFeature(this.currentChannelID); - feat?.updateParameter("end", this.lastPoint); - // feat.updateParameter("wayPoints", this.wayPoints); - feat?.updateParameter("segments", this.generateSegments()); - // Save the connection object - const rawparams = feat?.getParams(); - const values: { [k: string]: any } = {}; - for (const key in rawparams) { - values[key] = rawparams[key].value; - } - const definition = ComponentAPI.getDefinition("Connection"); - const params = new Params(values, MapUtils.toMap(definition!.unique), MapUtils.toMap(definition!.heritable)); - if (this.__currentConnectionObject === null || this.__currentConnectionObject === undefined) { - if (this.viewManagerDelegate.currentLayer.physicalLayer === null) throw new Error("Error: Attempting to add connection on non-physical layer"); - const connection = new Connection("Connection", params, Registry.currentDevice!.generateNewName("CHANNEL"), "CHANNEL", this.viewManagerDelegate.currentLayer.physicalLayer); - connection.routed = true; - connection.addFeatureID(feat!.ID); - connection.addWayPoints(this.wayPoints); - feat!.referenceID = connection.id; - this.__addConnectionTargets(connection); - Registry.currentDevice?.addConnection(connection); - } else { - // console.error("Implement conneciton tool to update existing connection"); - // TODO: Update the connection with more sinks and paths and what not - this.__currentConnectionObject.addFeatureID(feat!.ID); - feat!.referenceID = this.__currentConnectionObject.id; - this.__currentConnectionObject.addWayPoints(this.wayPoints); - feat!.referenceID = this.__currentConnectionObject.id; - this.__addConnectionTargets(this.__currentConnectionObject); - } - - this.currentChannelID = null; - this.wayPoints = []; - this.source = null; - this.sinks = []; - this.__currentConnectionObject = null; - Registry.viewManager?.saveDeviceState(); - } else { - console.error("Something is wrong here, unable to finish the connection"); - } - - Registry.viewManager?.saveDeviceState(); - } - - cleanup(): void { - console.log("Running Cleanup for the Connection Tool"); - - /* - Step 1 - Check the state - Step 2 - based on the state do the following - SOURCE - Do nothing, everything is good - WAYPOINT - 1) Reset the state to __source 2) cleanup features 3) TBA - TARGET - Set the state to SOURCE and do nothing else - */ - switch (this.__STATE) { - case ConnectionToolState.PLACE_FIRST_POINT: - console.log("Doing nothing"); - break; - case ConnectionToolState.PLACE_WAYPOINT: - console.warn("Paused connection placement midway"); - - break; - case ConnectionToolState.TARGET_PLACED_START_AGAIN: - this.__STATE = ConnectionToolState.PLACE_FIRST_POINT; - this.dragging = false; - break; - } - } - - /** - * Adds a way point to the connection - * @param event - * @param isManhatten - */ - addWayPoint(event: MouseEvent, isManhatten: boolean): void { - let connectiontargettoadd; - const point = MouseTool.getEventPosition(event); - const isPointOnComponent = this.__isPointOnComponent(point!); - const isPointOnConnection = this.__isPointOnConnection(point!); - if (point === null) return; - let target = PositionTool.getTarget([point.x, point.y]); - if (isManhatten && target) { - // TODO: modify the target to find the orthogonal point - let lastwaypoint = this.startPoint; - if (this.wayPoints.length > 0) { - lastwaypoint = this.wayPoints[this.wayPoints.length - 1]; - } - // Check if the lastwaypoint is null or not - if (lastwaypoint === null) { - throw new Error("Target is null"); - } - target = this.getNextOrthogonalPoint(lastwaypoint, target); - } - if (target.length == 2) { - this.wayPoints.push(target); - } - - if (isPointOnComponent) { - // Modify the waypoint to reflect closest port in the future - if (this.startPoint === null) { - throw new Error("No start point to update the channel"); - } - const componentport = this.__getClosestComponentPort(isPointOnComponent, this.startPoint, target); - if (componentport !== null) { - const location = ComponentPort.calculateAbsolutePosition(componentport, isPointOnComponent); - connectiontargettoadd = new ConnectionTarget(isPointOnComponent, componentport.label); - this.wayPoints.pop(); - this.lastPoint = location; - } else { - connectiontargettoadd = new ConnectionTarget(isPointOnComponent, ""); - this.lastPoint = this.wayPoints.pop(); - } - - // Do this if we want to terminate the connection - // Check if source is empty - if (this.source === null) { - // Set is as the source - // console.log("isPointOnComponent", isPointOnComponent); - this.source = connectiontargettoadd; - } else { - // Add it to the sinks - this.sinks.push(connectiontargettoadd); - } - this.__STATE = ConnectionToolState.TARGET_PLACED_START_AGAIN; // "TARGET"; - this.dragging = false; - this.finishChannel(); - } else if (isPointOnConnection) { - console.log("There is connection at the waypoint path"); - if (this.__currentConnectionObject === null) { - this.__currentConnectionObject = isPointOnConnection; - } else { - this.__currentConnectionObject.mergeConnection(isPointOnConnection); - } - this.__STATE = ConnectionToolState.TARGET_PLACED_START_AGAIN; //"TARGET"; - this.dragging = false; - this.lastPoint = this.wayPoints.pop(); - this.finishChannel(); - } - } - - /** - * Checks if the point coincides with a Connection. Return the Connection associated with the point or returns false - * @param point - * @return {boolean} or Connection Object - * @private - */ - __isPointOnConnection(point: paper.Point) { - // console.log("Point to check", point); - const render = Registry.viewManager?.hitFeature(point as unknown as number[]); - if (render !== false && render !== null && render !== undefined) { - let connection; - const feature = Registry.viewManager?.getFeatureByID(render.featureID); - // const feature = Registry.currentDevice.getFeatureByID(render.featureID); - // TODO: Replace this logic - if (feature!.referenceID === null) { - return false; - } else { - connection = Registry.currentDevice?.getConnectionByID(feature!.referenceID); - } - // console.log("Feature that intersects:", feature); - // console.log("Associated object:", connection); - return connection; - } - - return false; - } - - /** - * Checks if the point coincides with a component. Return the Component associated with the point or returns false - * @param point - * @return {boolean} or Component Object - * @private - */ - __isPointOnComponent(point: paper.Point) { - // console.log("Point to check", point); - const render = Registry.viewManager?.hitFeature(point as unknown as number[]); - - if (render !== false && render !== null && render !== undefined) { - let component; - const feature = Registry.viewManager?.getFeatureByID(render.featureID); - // const feature = Registry.currentDevice.getFeatureByID(render.featureID); - // console.log("Feature that intersects:", feature); - // TODO: Replace this logic - if (feature!.referenceID === null) { - return false; - } else { - component = Registry.currentDevice?.getComponentByID(feature!.referenceID); - } - // console.log("Associated object:", component); - if (component !== null || component !== undefined) { - return component; - } else { - return false; - } - } - - return false; - } - - /** - * Creates the channel from the start and the end point - * @param start - * @param end - * @return {EdgeFeature} - */ - createChannel(start: paper.Point, end: paper.Point) { - return Device.makeFeature(this.typeString, { - start: start, - end: end, - wayPoints: this.wayPoints, - segments: this.generateSegments() - }); - } - - /** - * Gets the closes manhatten point to where ever the mouse is - * @param lastwaypoint - * @param target - * @return {*} - */ - getNextOrthogonalPoint(lastwaypoint: Point, target: Point): Point { - // Trivial case where target is orthogonal - if (target[0] === lastwaypoint[0] || target[1] === lastwaypoint[1]) { - return target; - } - - const ret: Point = [target[0], target[1]]; - // Find out if the delta x or delta y is smaller and then just 0 the that coordinate - const delta_x = Math.abs(target[0] - lastwaypoint[0]); - const delta_y = Math.abs(target[1] - lastwaypoint[1]); - if (delta_x < delta_y) { - ret[0] = lastwaypoint[0]; - } else { - ret[1] = lastwaypoint[1]; - } - return ret; - } - - /** - * Goes through teh waypoints and generates the connection segments - * @return {Array} - */ - generateSegments() { - const waypointscopy = []; - waypointscopy.push(this.startPoint); - this.wayPoints.forEach(function (waypoint) { - waypointscopy.push(waypoint); - }); - // TODO: Fix this bullshit where teh points are not always arrays - if (Array.isArray(this.lastPoint)) { - waypointscopy.push(this.lastPoint); - } else { - waypointscopy.push(this.lastPoint); - } - // console.log("waypoints", this.wayPoints, this.startPoint); - const ret = []; - for (let i = 0; i < waypointscopy.length - 1; i++) { - const segment = [waypointscopy[i], waypointscopy[i + 1]]; - ret.push(segment); - } - // console.log("segments:", ret); - return ret; - } - - /** - * Checks if the current connection tool object has source and sinks and updates the connection object that is - * passed as an argument in this method. - * @private - */ - __addConnectionTargets(connection: Connection): void { - if (this.source !== null && this.source !== undefined) { - connection.addConnectionTarget(this.source); - } - - for (const i in this.sinks) { - console.log("Sinks: ", this.sinks); - connection.addConnectionTarget(this.sinks[i]); - } - } - - /** - * Returns the closest component port to the given point - * @param component - * @param startPoint - * @param targetPoint This is null in case of the initialzing case - * @return {ComponentPort} - * @private - */ - __getClosestComponentPort(component: any, startPoint: Point, targetPoint: Point | null = null) { - // console.log("Location of startpoint: ",startPoint); - // Find out if this is on control or flow for now - // TODO:Change this implementation, currently layer does not have a type setting that maps 1-1 to the componentport layer location - let closest; - let layertype = null; - let dist; - const gridsize = Registry.currentGrid?.getSpacing(); - console.log("Grid Size: ", gridsize); - - if (this.viewManagerDelegate.currentLayer.type === LogicalLayerType.CONTROL) { - layertype = "CONTROL"; - } else if (this.viewManagerDelegate.currentLayer.type === LogicalLayerType.FLOW) { - layertype = "FLOW"; - } else if (this.viewManagerDelegate.currentLayer.type === LogicalLayerType.INTEGRATION) { - layertype = "INTEGRATION"; - } - console.log("This layer: ", layertype); - const componentports = component.ports; - if (layertype === null) { - console.warn("Could not find the current layer type, searching through all the component ports without filtering"); - } - - // TODO: Check if the targetPoint and the component port are closer than grid size, if they are just make the connection - if (targetPoint !== null) { - for (const key of componentports.keys()) { - const componentport = componentports.get(key); - if (componentport.layer !== layertype) { - continue; - } - const location = ComponentPort.calculateAbsolutePosition(componentport, component); - const calc = Math.abs(targetPoint[0] - location[0]) + Math.abs(targetPoint[1] - location[1]); - // let gridsize = 1000; //TODO:Calculate from grid size - // Check if anything is really really close (use current grid size for now) to the port. - if (calc <= 3 * gridsize!) { - // If the distance is really small then yes fix return it - return componentport; - } - } - } - - dist = 1000000000000000; - closest = null; - for (const key of componentports.keys()) { - const componentport = componentports.get(key); - if (componentport.layer !== layertype) { - continue; - } - const location = ComponentPort.calculateAbsolutePosition(componentport, component); - const calc = Math.abs(startPoint[0] - location[0]) + Math.abs(startPoint[1] - location[1]); - if (calc < dist) { - dist = calc; - closest = componentport; - } - } - - return closest; - } - - /** - * Updates the parameters of the connection object - * - * @param {string} parameter - * @param {*} value - * @memberof ConnectionTool - */ - updateParameter(parameter: string, value: any): void { - if(this.currentChannelID !== null){ - const feat = this.viewManagerDelegate.currentLayer.getFeature(this.currentChannelID); - feat?.updateParameter(parameter, value); - } - } -} diff --git a/src/app/view/tools/customComponentPositionTool.ts b/src/app/view/tools/customComponentPositionTool.ts deleted file mode 100644 index 257b3b3e..00000000 --- a/src/app/view/tools/customComponentPositionTool.ts +++ /dev/null @@ -1,78 +0,0 @@ -import paper from "paper"; -import PositionTool from "./positionTool"; -import Registry from "../../core/registry"; -import Feature from "../../core/feature"; -import CustomComponent from "../../core/customComponent"; -import Params from "../../core/params"; -import Component from "../../core/component"; -import ViewManager from "../viewManager"; -import { ComponentAPI } from "@/componentAPI"; - -export default class CustomComponentPositionTool extends PositionTool { - private __customComponent: CustomComponent; - - constructor(viewManagerDelegate: ViewManager, customcomponent: CustomComponent, setString: string) { - super(viewManagerDelegate, customcomponent.type); - - this.__customComponent = customcomponent; - } - - createNewFeature(point: paper.Point): void { - const featureIDs = []; - // console.log("Custom Component:", this.__customComponent); - - const newFeature = Feature.makeCustomComponentFeature(this.__customComponent, this.setString, { - position: PositionTool.getTarget([point.x, point.y]) - }); - this.currentFeatureID = newFeature.ID; - - Registry.viewManager?.addFeature(newFeature); - - featureIDs.push(newFeature.ID); - - const params_to_copy = newFeature.getParams(); - - // TODO: Change the component generation - this.createNewCustomComponent(params_to_copy, featureIDs); - Registry.viewManager?.saveDeviceState(); - } - - showTarget(): void { - if (this.lastPoint === null) { - throw new Error("No last point"); - } - const target = PositionTool.getTarget(this.lastPoint); - Registry.viewManager?.updateTarget(this.typeString, this.setString, target, {}); - } - - createNewCustomComponent(paramdata: { [k: string]: any }, featureIDs: string[]) { - const definition = CustomComponent.defaultParameterDefinitions(); - // Clean Param Data - const cleanparamdata: { [k: string]: any } = {}; - for (const key in paramdata) { - cleanparamdata[key] = paramdata[key].value; - } - // console.log(cleanparamdata); - const params = new Params(cleanparamdata, definition.unique as unknown as Map, definition.heritable as unknown as Map); - const componentid = ComponentAPI.generateID(); - console.log(this.__customComponent.entity, this.__customComponent.type); - // Check if currentDevice is null or not - if (Registry.currentDevice === null) { - throw new Error("No current device"); - } - const name = Registry.currentDevice.generateNewName(this.__customComponent.entity); - const newComponent = new Component(params, name, this.__customComponent.entity, componentid); - let feature; - - for (const i in featureIDs) { - newComponent.addFeatureID(featureIDs[i]); - - // Update the component reference - feature = Registry.currentDevice?.getFeatureByID(featureIDs[i]); - feature!.referenceID = componentid; - } - - Registry.currentDevice?.addComponent(newComponent); - return newComponent; - } -} diff --git a/src/app/view/tools/generateArrayTool.ts b/src/app/view/tools/generateArrayTool.ts deleted file mode 100644 index c4091d1f..00000000 --- a/src/app/view/tools/generateArrayTool.ts +++ /dev/null @@ -1,261 +0,0 @@ -import MouseTool, { MouseToolCallback } from "./mouseTool"; - -import Registry from "../../core/registry"; -import SimpleQueue from "../../utils/simpleQueue"; -import Component from "@/app/core/component"; -import ViewManager from "../viewManager"; - -export default class GenerateArrayTool extends MouseTool { - private __currentComponent?: any; - private __originalPosition?: any; - - /** - * Creates an instance of GenerateArrayTool. - * @memberof GenerateArrayTool - */ - constructor(viewManagerDelegate: ViewManager) { - super(viewManagerDelegate); - - // this.dragging = false; - // this.dragStart = null; - // this.lastPoint = null; - // this.currentSelectBox = null; - // this.currentSelection = []; - const ref = this; - // this.updateQueue = new SimpleQueue(function () { - // ref.dragHandler(); - // }, 20); - this.down = function(event) { - // Registry.viewManager.killParamsWindow(); - ref.mouseDownHandler(event); - // ref.dragging = true; - // ref.showTarget(); - }; - this.move = function(event) { - // if (ref.dragging) { - // ref.lastPoint = MouseTool.getEventPosition(event); - // ref.updateQueue.run(); - // } - // ref.showTarget(); - }; - this.up = function(event) { - // ref.dragging = false; - ref.mouseUpHandler(event); - // ref.showTarget(); - }; - } - - activate(component: Component): void { - console.log("Activating the tool for a new component", component); - // Store the component position here - this.__currentComponent = component; - } - - deactivate(): void { - Registry.viewManager?.resetToDefaultTool(); - } - - generateArray(xdim: number, ydim: number, xspacing: number, yspacing: number): void { - console.log("Generate array:", xdim, ydim, xspacing, yspacing); - const xposref = this.__currentComponent.getPosition()[0]; - const yposref = this.__currentComponent.getPosition()[1]; - const name = this.__currentComponent.name; - this.__currentComponent.name = name + "_1_1"; - const replicas = []; - // Loop to create the components at the new positions - for (let y = 0; y < ydim; y++) { - for (let x = 0; x < xdim; x++) { - // Skip the x=0, y=0 because thats the initial one - if (x === 0 && y === 0) { - continue; - } - const xpos = xposref + x * xspacing; - const ypos = yposref + y * yspacing; - replicas.push(this.__currentComponent.replicate(xpos, ypos, name + "_" + String(x + 1) + "_" + String(y + 1))); - } - } - - // Add the replicas to the device - console.log(replicas); - replicas.forEach(function(replica) { - Registry.currentDevice?.addComponent(replica); - }); - - Registry.viewManager?.saveDeviceState(); - } - - revertToOriginalPosition(): void { - this.__currentComponent.updateComponentPosition(this.__originalPosition); - } - - dragHandler(): void { - // if (this.dragStart) { - // if (this.currentSelectBox) { - // this.currentSelectBox.remove(); - // } - // this.currentSelectBox = this.rectSelect(this.dragStart, this.lastPoint); - // } - } - - // showTarget() { - // Registry.viewManager.removeTarget(); - // } - - mouseUpHandler(event: MouseEvent): void { - // if (this.currentSelectBox) { - // this.currentSelection = Registry.viewManager.hitFeaturesWithViewElement(this.currentSelectBox); - // this.selectFeatures(); - // } - // this.killSelectBox(); - console.log("Up event", event); - } - - mouseDownHandler(event: MouseEvent): void { - // let point = MouseTool.getEventPosition(event); - // let target = this.hitFeature(point); - // if (target) { - // if (target.selected) { - // let feat = Registry.currentDevice.getFeatureByID(target.featureID); - // Registry.viewManager.updateDefaultsFromFeature(feat); - // let rightclickmenu = new RightClickMenu(feat); - // rightclickmenu.show(event); - // Registry.viewManager.rightClickMenu = rightclickmenu; - // this.rightClickMenu = rightclickmenu; - // // let func = PageSetup.getParamsWindowCallbackFunction(feat.getType(), feat.getSet()); - // //func(event); - // } else { - // this.deselectFeatures(); - // this.selectFeature(target); - // } - // - // - // } else { - // this.deselectFeatures(); - // this.dragStart = point; - // } - console.log("Down event", event); - } - - // killSelectBox() { - // if (this.currentSelectBox) { - // this.currentSelectBox.remove(); - // this.currentSelectBox = null; - // } - // this.dragStart = null; - // } - // - // hitFeature(point) { - // let target = Registry.viewManager.hitFeature(point); - // return target; - // } - - /** - * Function that is fired when we click to select a single object on the paperjs canvas - * @param paperElement - */ - // selectFeature(paperElement) { - // this.currentSelection.push(paperElement); - // - // //Find the component that owns this feature and then select all of the friends - // let component = this.__getComponentWithFeatureID(paperElement.featureID); - // if (component === null) { - // //Does not belong to a component, hence this returns - // paperElement.selected = true; - // - // } else { - // //Belongs to the component so we basically select all features with this id - // let featureIDs = component.featureIDs; - // for (let i in featureIDs) { - // let featureid = featureIDs[i]; - // let actualfeature = Registry.viewManager.view.paperFeatures[featureid]; - // actualfeature.selected = true; - // } - // - // Registry.viewManager.view.selectedComponents.push(component); - // } - // } - - // /** - // * Finds and return the corresponding Component Object in the Registry's current device associated with - // * the featureid. Returns null if no component is found. - // * - // * @param featureid - // * @return {Component} - // * @private - // */ - // __getComponentWithFeatureID(featureid) { - // // Get component with the features - // - // let device_components = Registry.currentDevice.components; - // - // //Check against every component - // for (let i in device_components) { - // let component = device_components[i]; - // //Check against features in the in the component - // let componentfeatures = component.featureIDs; - // let index = componentfeatures.indexOf(featureid); - // - // if (index !== -1) { - // //Found it !! - // console.log("Found Feature: " + featureid + " in component: " + component.getID()); - // return component; - // } - // } - // - // return null; - // } - - /** - * Function that is fired when we drag and select an area on the paperjs canvas - */ - // selectFeatures() { - // if (this.currentSelection) { - // for (let i = 0; i < this.currentSelection.length; i++) { - // let paperFeature = this.currentSelection[i]; - // - // //Find the component that owns this feature and then select all of the friends - // let component = this.__getComponentWithFeatureID(paperFeature.featureID); - // - // if (component === null) { - // //Does not belong to a component hence do the normal stuff - // paperFeature.selected = true; - // - // } else { - // //Belongs to the component so we basically select all features with this id - // let featureIDs = component.featureIDs; - // for (let i in featureIDs) { - // let featureid = featureIDs[i]; - // let actualfeature = Registry.viewManager.view.paperFeatures[featureid]; - // actualfeature.selected = true; - // } - // - // Registry.viewManager.view.selectedComponents.push(component); - // } - // - // } - // } - // } - - // deselectFeatures() { - // if(this.rightClickMenu){ - // this.rightClickMenu.close(); - // this.rightClickMenu = null; - // } - // paper.project.deselectAll(); - // this.currentSelection = []; - // } - - // abort() { - // this.deselectFeatures(); - // this.killSelectBox(); - // } - - // rectSelect(point1, point2) { - // let rect = new paper.Path.Rectangle(point1, point2); - // rect.fillColor = new paper.Color(0, .3, 1, .4); - // rect.strokeColor = new paper.Color(0, 0, 0); - // rect.strokeWidth = 2; - // rect.selected = true; - // return rect; - // } -} diff --git a/src/app/view/tools/insertTextTool.ts b/src/app/view/tools/insertTextTool.ts deleted file mode 100644 index d6cb24a7..00000000 --- a/src/app/view/tools/insertTextTool.ts +++ /dev/null @@ -1,98 +0,0 @@ -import MouseTool, { MouseToolCallback } from "./mouseTool"; -import Device from "@/app/core/device"; -import Registry from "../../core/registry"; -import SimpleQueue from "../../utils/simpleQueue"; - -import paper from "paper"; -import PositionTool from "./positionTool"; -import Params from "../../core/params"; -import { ComponentAPI } from "@/componentAPI"; -import { ViewManager } from "@/app"; -import { Point } from "@/app/core/init"; - -export default class InsertTextTool extends MouseTool { - typeString: string; - setString: string; - currentFeatureID: string | null; - lastPoint: Point | null; - - private _text: string; - fontSize: number; - viewManagerDelegate: ViewManager; - showQueue: SimpleQueue; - - constructor(viewManager: ViewManager) { - super(viewManager); - this.typeString = "TEXT"; - this.setString = "Standard"; - this.currentFeatureID = null; - const ref = this; - this.lastPoint = null; - this._text = "TESTING-TEXT"; - this.fontSize = 12; - this.viewManagerDelegate = viewManager; - this.showQueue = new SimpleQueue( - function() { - ref.showTarget(); - }, - 20, - false - ); - this.up = function(event) { - // do nothing - }; - this.move = function(event) { - let point = MouseTool.getEventPosition((event as unknown) as MouseEvent); - if(point === null) { - return; - } - ref.lastPoint = [point.x, point.y]; - ref.showQueue.run(); - }; - this.down = function(event) { - Registry.viewManager?.killParamsWindow(); - paper.project.deselectAll(); - // TODO - Add the ability to insert a non physical text element later on using Liam's Nonphysical compoennt API - ref.createNewFeature(MouseTool.getEventPosition((event as unknown) as MouseEvent) as paper.Point); - }; - } - - /** - * Creates a physical test feature when using the InsertTextTool - */ - createNewFeature(point: paper.Point): void { - let fixedpoint = PositionTool.getTarget([point.x, point.y]); - let newFeature = Device.makeFeature( - "Text", - { - position: fixedpoint, - height: 200, - text: this._text, - fontSize: this.fontSize * 10000 - }, - "TEXT_" + this._text, - ComponentAPI.generateID(), - "XY", - null - ); - this.viewManagerDelegate.addFeature(newFeature, this.viewManagerDelegate.activeRenderLayerIndex); - this.viewManagerDelegate.view.addComponent("Text", newFeature.getParams(), [newFeature.ID], true); - this.viewManagerDelegate.saveDeviceState(); - } - - showTarget(): void { - if (this.lastPoint === null) { - return; - } - const target = PositionTool.getTarget(this.lastPoint); - Registry.viewManager?.updateTarget(this.typeString, this.setString, target, {}); - } - - get text() { - return this._text; - } - - set text(text) { - this._text = text; - } -} diff --git a/src/app/view/tools/mouseSelectTool.ts b/src/app/view/tools/mouseSelectTool.ts deleted file mode 100644 index aa8ed411..00000000 --- a/src/app/view/tools/mouseSelectTool.ts +++ /dev/null @@ -1,294 +0,0 @@ -import MouseTool, { MouseToolCallback } from "./mouseTool"; - -import Registry from "../../core/registry"; -import SimpleQueue from "../../utils/simpleQueue"; -import paper from "paper"; -import EventBus from "@/events/events"; -import ViewManager from "@/app/view/viewManager"; -import PaperView from "@/app/view/paperView"; - -export default class MouseSelectTool extends MouseTool { - paperView: PaperView; - - dragging: boolean; - - dragStart: paper.Point | null; - lastPoint: paper.Point | number[] | null; - - currentSelectBox: any; - - currentSelection: any[]; - - updateQueue: SimpleQueue; - - constructor(viewManager: ViewManager, paperview: PaperView) { - super(viewManager); - this.viewManagerDelegate = viewManager; - this.paperView = paperview; - this.dragging = false; - this.dragStart = null; - this.lastPoint = null; - this.currentSelectBox = null; - this.currentSelection = []; - const ref = this; - this.updateQueue = new SimpleQueue(function () { - ref.dragHandler(); - }, 20); - this.down = function (event) { - ref.viewManagerDelegate.killParamsWindow(); - ref.mouseDownHandler(event); - ref.dragging = true; - ref.showTarget(); - }; - this.move = function (event) { - if (ref.dragging) { - ref.lastPoint = MouseTool.getEventPosition(event as unknown as MouseEvent) as unknown as number[]; - ref.updateQueue.run(); - } - ref.showTarget(); - }; - this.up = function (event) { - ref.dragging = false; - ref.mouseUpHandler(MouseTool.getEventPosition(event as unknown as MouseEvent)!); - ref.showTarget(); - }; - } - - keyHandler(event: KeyboardEvent): void { - if (event.key === "delete" || event.key === "backspace") { - console.log("Removing feature"); - this.removeFeatures(); - } - if (event.key === "c") { - console.log("Detected a ctrlC"); - console.log(this.currentSelection); - } - } - - dragHandler(): void { - if (this.dragStart) { - if (this.currentSelectBox) { - this.currentSelectBox.remove(); - } - this.currentSelectBox = this.rectSelect(this.dragStart, this.lastPoint as paper.Point); - } - } - - showTarget(): void { - this.viewManagerDelegate.removeTarget(); - } - - mouseUpHandler(point: paper.Point): void { - if (this.currentSelectBox) { - this.currentSelection = this.viewManagerDelegate.hitFeaturesWithViewElement(this.currentSelectBox); - this.selectFeatures(); - } - this.killSelectBox(); - } - - removeFeatures(): void { - if (this.currentSelection.length > 0) { - for (let i = 0; i < this.currentSelection.length; i++) { - const paperFeature = this.currentSelection[i]; - let devicefeature = Registry.currentDevice?.getFeatureByID(paperFeature.featureID); - Registry.currentDevice?.removeFeature(devicefeature!); - } - this.currentSelection = []; - // Registry.canvasManager?.render(); - } - } - - mouseDownHandler(event: MouseEvent): void { - const point = MouseTool.getEventPosition(event as unknown as MouseEvent); - const target = this.hitFeature(point as unknown as number[]); - if (target) { - if (target.selected) { - const feat = this.viewManagerDelegate.getFeatureByID(target.featureID); - this.viewManagerDelegate.updateDefaultsFromFeature(feat); - // Check if the feature is a part of a component - let component, connection; - if (feat.referenceID === null) { - throw new Error("ReferenceID of feature is null"); - } else { - component = Registry.currentDevice?.getComponentByID(feat.referenceID); - connection = Registry.currentDevice?.getConnectionByID(feat.referenceID); - if (component !== null) { - (EventBus as any).get().emit(EventBus.DBL_CLICK_COMPONENT, event, component); - } else if (connection !== null) { - (EventBus as any).get().emit(EventBus.DBL_CLICK_CONNECTION, event, connection); - } else { - (EventBus as any).get().emit(EventBus.DBL_CLICK_FEATURE, event, feat); - } - } - - // const rightclickmenu = this.viewManagerDelegate.rightClickMenu; // new RightClickMenu(feat); - // rightclickmenu.show(event, feat); - // this.rightClickMenu = rightclickmenu; - // let func = PageSetup.getParamsWindowCallbackFunction(feat.getType(), feat.getSet()); - // func(event); - } else { - this.deselectFeatures(); - this.selectFeature(target); - } - } else { - this.deselectFeatures(); - this.dragStart = point!; - } - } - - killSelectBox(): void { - if (this.currentSelectBox) { - this.currentSelectBox.remove(); - this.currentSelectBox = null; - } - this.dragStart = null; - } - - hitFeature(point: number[]) { - const target = this.viewManagerDelegate.hitFeature(point); - return target; - } - - /** - * Function that is fired when we click to select a single object on the paperjs canvas - * @param paperElement - */ - selectFeature(paperElement: any): void { - this.currentSelection.push(paperElement); - - // Find the component that owns this feature and then select all of the friends - const component = this.__getComponentWithFeatureID(paperElement.featureID); - const connection = this.__getConnectionWithFeatureID(paperElement.featureID); - if (component === null && connection === null) { - // Does not belong to a component, hence this returns - paperElement.selected = true; - } else if (component !== null) { - // Belongs to the component so we basically select all features with this id - const featureIDs = component.featureIDs; - for (const i in featureIDs) { - const featureid = featureIDs[i]; - const actualfeature = this.viewManagerDelegate.view.paperFeatures[featureid]; - actualfeature.selected = true; - } - - this.viewManagerDelegate.view.selectedComponents.push(component); - } else if (connection !== null) { - const featureIDs = connection.featureIDs; - for (const i in featureIDs) { - const featureid = featureIDs[i]; - const actualfeature = this.viewManagerDelegate.view.paperFeatures[featureid]; - actualfeature.selected = true; - } - - this.viewManagerDelegate.view.selectedConnections.push(connection); - } else { - throw new Error("Totally got the selection logic wrong, reimplement this"); - } - } - - /** - * Finds and return the corresponding Component Object in the Registry's current device associated with - * the featureid. Returns null if no component is found. - * - * @param featureid - * @return {Component} - * @private - */ - __getComponentWithFeatureID(featureid: string) { - // Get component with the features - - const device_components = Registry.currentDevice!.components; - - // Check against every component - for (const i in device_components) { - const component = device_components[i]; - // Check against features in the in the component - const componentfeatures = component.featureIDs; - const index = componentfeatures.indexOf(featureid); - - if (index !== -1) { - // Found it !! - return component; - } - } - - return null; - } - - /** - * Finds and return the corresponding Connection Object in the Registry's current device associated with - * the featureid. Returns null if no connection is found. - * - * @param featureid - * @return {*} - * @private - */ - __getConnectionWithFeatureID(featureid: string) { - // Get component with the features - - const device_connections = Registry.currentDevice!.connections; - - // Check against every component - for (const i in device_connections) { - const connection = device_connections[i]; - // Check against features in the in the component - const connection_features = connection.featureIDs; - const index = connection_features.indexOf(featureid); - - if (index !== -1) { - // Found it !! - return connection; - } - } - - return null; - } - - /** - * Function that is fired when we drag and select an area on the paperjs canvas - */ - selectFeatures(): void { - if (this.currentSelection) { - for (let i = 0; i < this.currentSelection.length; i++) { - const paperFeature = this.currentSelection[i]; - - // Find the component that owns this feature and then select all of the friends - const component = this.__getComponentWithFeatureID(paperFeature.featureID); - - if (component === null) { - // Does not belong to a component hence do the normal stuff - paperFeature.selected = true; - } else { - // Belongs to the component so we basically select all features with this id - const featureIDs = component.featureIDs; - for (const j in featureIDs) { - const featureid = featureIDs[j]; - const actualfeature = this.viewManagerDelegate.view.paperFeatures[featureid]; - actualfeature.selected = true; - } - - this.viewManagerDelegate.view.selectedComponents.push(component); - } - } - } - } - - deselectFeatures(): void { - this.paperView.clearSelectedItems(); - this.currentSelection = []; - } - - abort(): void { - this.deselectFeatures(); - this.killSelectBox(); - } - - rectSelect(point1: paper.Point, point2: paper.Point) { - const rect = new paper.Path.Rectangle(point1, point2); - rect.fillColor = new paper.Color(0, 0.3, 1, 0.4); - rect.strokeColor = new paper.Color(0, 0, 0); - rect.strokeWidth = 2; - rect.selected = true; - return rect; - } -} diff --git a/src/app/view/tools/mouseTool.ts b/src/app/view/tools/mouseTool.ts deleted file mode 100644 index 01070914..00000000 --- a/src/app/view/tools/mouseTool.ts +++ /dev/null @@ -1,97 +0,0 @@ -import paper from "paper"; -import Registry from "../../core/registry"; -import ViewManager from "../viewManager"; - -export interface MouseToolCallback { - (event: MouseEvent): void; -} -export default class MouseTool { - - viewManagerDelegate: ViewManager; - - /** - * Creates an instance of MouseTool. This is the base class for all mouse tools. - * @memberof MouseTool - */ - constructor(viewManagerDelegate: ViewManager) { - this.viewManagerDelegate = viewManagerDelegate; - } - - /** - * This function is called when the mouse is released. - * - * @param {MouseEvent} event - * @memberof MouseTool - */ - up(event: MouseEvent): void { - MouseTool.defaultFunction("up"); - } - - /** - * This function is called when the mouse is pressed. - * - * @param {MouseEvent} event - * @memberof MouseTool - */ - down(event: MouseEvent): void { - MouseTool.defaultFunction("down"); - } - - /** - * This function is called when the mouse is moved. - * - * @param {MouseEvent} event - * @memberof MouseTool - */ - move(event: MouseEvent): void { - MouseTool.defaultFunction("move"); - } - - /** - * This function is called when the right mouse button is clicked. - * - * @param {MouseEvent} event - * @memberof MouseTool - */ - rightdown(event: MouseEvent): void { - MouseTool.defaultFunction("rightdown"); - } - - /** - * This fucntion is a convenience function that can be called to clean up the tool. - * - * @memberof MouseTool - */ - cleanup(): void { - console.log("Default Message: You have to implement the method cleanup!"); - } - - /** - * This is the dummy function that is called when no function is set. - * - * @static - * @param {string} value - * @returns - * @memberof MouseTool - */ - static defaultFunction(value: string) { - return function(): void { - console.log("No " + value + " function set."); - }; - } - - /** - * This function returns the position of the mouse event in the paper coordinate system. - * - * @static - * @param {MouseEvent} event - * @returns {paper.Point} - * @memberof MouseTool - */ - static getEventPosition(event: MouseEvent):paper.Point { - if (Registry.viewManager !== null) { - return Registry.viewManager.getEventPosition(event); - } - throw new Error("No view manager set!"); - } -} diff --git a/src/app/view/tools/moveTool.ts b/src/app/view/tools/moveTool.ts deleted file mode 100644 index a334e804..00000000 --- a/src/app/view/tools/moveTool.ts +++ /dev/null @@ -1,169 +0,0 @@ -import MouseTool from "./mouseTool"; -import paper from "paper"; -import Registry from "../../core/registry"; -import { Point } from "@/app/core/init"; -import ViewManager from "../viewManager"; - -export default class MoveTool extends MouseTool { - private __startPoint: Point | null; - private __dragging: boolean; - - private __currentComponent: any; - private __originalPosition: Point | null = null; - private _viewManagerDelegate: ViewManager; - - callback: ((...args: any[]) => any) | null; - - constructor(viewManagerDelegate: ViewManager) { - super(viewManagerDelegate); - - // Use the startpoint to calculate the delta for movement - this.__startPoint = null; - this.__dragging = false; - this.callback = null; - - this._viewManagerDelegate = viewManagerDelegate; - - // this.dragging = false; - // this.dragStart = null; - // this.lastPoint = null; - // this.currentSelectBox = null; - // this.currentSelection = []; - const ref = this; - // this.updateQueue = new SimpleQueue(function () { - // ref.dragHandler(); - // }, 20); - this.down = function (event) { - // Registry.viewManager.killParamsWindow(); - ref.mouseDownHandler(event as unknown as MouseEvent); - // ref.dragging = true; - // ref.showTarget(); - }; - this.move = function (event) { - // if (ref.dragging) { - // ref.lastPoint = MouseTool.getEventPosition(event); - // ref.updateQueue.run(); - // } - // ref.showTarget(); - ref.dragHandler(event as unknown as MouseEvent); - }; - this.up = function (event) { - // ref.dragging = false; - ref.mouseUpHandler(event as unknown as MouseEvent); - // ref.showTarget(); - }; - } - - /** - * Default activation method - * @param component - */ - activate(component: any, callback: (...args: any[]) => any): void { - // console.log("Activating the tool for a new component", component); - // Store the component position here - this.__currentComponent = component; - this.__originalPosition = component.getPosition(); - this.callback = callback; - } - - /** - * Default deactivation method - */ - deactivate(): void { - this._viewManagerDelegate.resetToDefaultTool(); - } - - /** - * Method that can process the update of the component position - * @param xpos - * @param ypos - */ - processUIPosition(xpos: number, ypos: number): void { - this.__currentComponent.updateComponentPosition([xpos, ypos]); - this.callback!(xpos, ypos); - } - - /** - * Updates the position of the current selected component - * @param xpos - * @param ypos - * @private - */ - __updatePosition(xpos: number, ypos: number): void { - this.processUIPosition(xpos, ypos); - } - - /** - * Reverts the position to the original position - */ - revertToOriginalPosition(): void { - this.__currentComponent.updateComponentPosition(this.__originalPosition); - } - - /** - * Function that handles the dragging of the mouse - * @param event - */ - dragHandler(event: MouseEvent): void { - if (this._viewManagerDelegate === null) { - throw new Error("No view manager set!"); - } - if (this.__dragging) { - const point = MouseTool.getEventPosition(event); - let target: paper.Point = new paper.Point(point.x, point.y); - if (point !== null && point !== undefined) { - let snappoint = this._viewManagerDelegate.snapToGrid([point.x, point.y]); - target = new paper.Point(snappoint[0], snappoint[1]); - } - // const delta = { - // x: (target).x - this.__startPoint[0], - // y: (target).y - this.__startPoint[1] - // }; - this.__startPoint = [target.x, target.y]; - // console.log("delta:", delta); - - // let oldposition = this.__currentComponent.getPosition(); - // // console.log("oldposition:", oldposition); - // - // let newposition = [oldposition[0] + delta.x, oldposition[1] + delta.y]; - // console.log("Newposition:", newposition); - // this.__currentComponent.updateComponentPosition(newposition); - this.__updatePosition(target.x, target.y); - } - } - - // showTarget() { - // Registry.viewManager.removeTarget(); - // } - - /** - * Method that handles the mouse up event - * @param event - */ - mouseUpHandler(event: MouseEvent): void { - const point = MouseTool.getEventPosition(event); - if (point === null){ - throw new Error("Point is null for move tool event handler"); - } - const targettosnap: Point = [point.x, point.y]; - const target = this._viewManagerDelegate.snapToGrid(targettosnap); - - // console.log("Start:",this.__startPoint, "End:" ,target); - this.__dragging = false; - } - - /** - * Method that handles the movement of the mouse cursor - * @param event - */ - mouseDownHandler(event: MouseEvent): void { - const point = MouseTool.getEventPosition(event); - if (point === null){ - throw new Error("Point is null for move tool event handler"); - } - const targettosnap: Point = [point.x, point.y]; - const target = this._viewManagerDelegate.snapToGrid(targettosnap); - this.__startPoint = target; - this.__dragging = true; - } -} diff --git a/src/app/view/tools/multilayerPositionTool.ts b/src/app/view/tools/multilayerPositionTool.ts deleted file mode 100644 index 5f8671ae..00000000 --- a/src/app/view/tools/multilayerPositionTool.ts +++ /dev/null @@ -1,63 +0,0 @@ -import PositionTool from "./positionTool"; -import { ComponentAPI } from "@/componentAPI"; -import Registry from "../../core/registry"; -import Device from "../../core/device"; -import ViewManager from "@/app/view/viewManager"; -import paper from "paper"; -import Parameter from "@/app/core/parameter"; - -export default class MultilayerPositionTool extends PositionTool { - constructor(viewManagerDelegate: ViewManager, typeString: string, setString: string, currentParameters: { [k: string]: any } | null = null) { - super(viewManagerDelegate, typeString, currentParameters); - } - - createNewFeature(point: paper.Point): void { - const featureIDs = []; - const currentlevel = Math.floor(Registry.viewManager!.renderLayers.indexOf(this.viewManagerDelegate.currentLayer!) / 3); - const flowlayer = currentlevel * 3; - const controllayer = currentlevel * 3 + 1; - const intlayer = currentlevel * 3 + 2; - - // Set up flow layer component - const paramvalues = this.getCreationParameters(new paper.Point(0, 0)); - let newFeature = Device.makeFeature(this.typeString, paramvalues); - this.currentFeatureID = newFeature.ID; - this.viewManagerDelegate.addFeature(newFeature, flowlayer); - const params_to_copy = newFeature.getParams(); - featureIDs.push(newFeature.ID); - - let newtypestring; - if (ComponentAPI.library[this.typeString + "_control"]) { - newtypestring = this.typeString + "_control"; - newFeature = Device.makeFeature(newtypestring, paramvalues); - - this.currentFeatureID = newFeature.ID; - this.viewManagerDelegate.addFeature(newFeature, controllayer); - - featureIDs.push(newFeature.ID); - } - - // Set up integration layer component - if (ComponentAPI.library[this.typeString + "_integration"]) { - newtypestring = this.typeString + "_integration"; - newFeature = Device.makeFeature(newtypestring, paramvalues); - - this.currentFeatureID = newFeature.ID; - this.viewManagerDelegate.addFeature(newFeature, intlayer); - - featureIDs.push(newFeature.ID); - } - - params_to_copy["position"] = new Parameter("position", [point.x, point.y]); - super.createNewComponent(this.typeString, params_to_copy, featureIDs); - Registry.viewManager?.saveDeviceState(); - } - - showTarget(): void { - if (this.lastPoint === null) { - return; - } - const target = PositionTool.getTarget(this.lastPoint); - this.viewManagerDelegate.updateTarget(this.typeString, this.setString, target, this.currentParameters!); - } -} diff --git a/src/app/view/tools/multilevelPositionTool.ts b/src/app/view/tools/multilevelPositionTool.ts deleted file mode 100644 index 293644c6..00000000 --- a/src/app/view/tools/multilevelPositionTool.ts +++ /dev/null @@ -1,118 +0,0 @@ -import PositionTool from "./positionTool"; -import { ComponentAPI } from "@/componentAPI"; -import Registry from "../../core/registry"; -import Device from "../../core/device"; -import ViewManager from "@/app/view/viewManager"; -import Layer from "@/app/core/layer"; -import RenderLayer from "../renderLayer"; -import paper from "paper"; - -export default class MultilevelPositionTool extends PositionTool { - flowlayer: RenderLayer | null; - controllayer: RenderLayer | null; - intlayer: RenderLayer | null; - - /** - * Creates an instance of MultilevelPositionTool. - * @param {ViewManager} viewManager - * @param {string} typeString - * @param {string} setString - * @param {*} [currentParameters=null] - * @memberof MultilevelPositionTool - */ - constructor( - viewManager: ViewManager, - typeString: string, - setString: string, - // flowLayer = this.currentLayer, - // controlLayer = null, - // intLayer = null, - currentParameters = null - ) { - super(viewManager, typeString, currentParameters); - let [flowLayer, controlLayer, intLayer] = this.viewManagerDelegate.getCurrentLevelRenderLayers(); - if (flowLayer === null) { - throw new Error("Flow layer is null"); - } else { - this.flowlayer = flowLayer; - } - if (controlLayer === null) { - throw new Error("Control layer is null"); - } - if (intLayer === null) { - throw new Error("Integration layer is null"); - } - this.controllayer = controlLayer; - this.intlayer = intLayer; - } - - /** - * Create a new feature - * - * @param {paper.Point} point - * @memberof MultilevelPositionTool - */ - createNewFeature(point: paper.Point): void { - const featureIDs = []; - - // Set up flow layer component - const paramvalues = this.getCreationParameters(point); - let newFeature = Device.makeFeature(this.typeString, paramvalues); - this.currentFeatureID = newFeature.ID; - if (this.flowlayer !== null) { - this.viewManagerDelegate.addFeature(newFeature, this.viewManagerDelegate.renderLayers.indexOf(this.flowlayer)); - } - - featureIDs.push(newFeature.ID); - - const params_to_copy = newFeature.getParams(); - - let newtypestring; - const paramstoadd = newFeature.getParams(); - // Set up control layer component - if (ComponentAPI.library[this.typeString + "_control"]) { - newFeature.setParams(paramstoadd); - - this.currentFeatureID = newFeature.ID; - if (this.controllayer !== null) { - this.viewManagerDelegate.addFeature(newFeature, this.viewManagerDelegate.renderLayers.indexOf(this.controllayer)); - } - - featureIDs.push(newFeature.ID); - } - - // Set up integration layer component - if (ComponentAPI.library[this.typeString + "_integration"]) { - newtypestring = this.typeString + "_integration"; - newFeature = Device.makeFeature(newtypestring, paramvalues); - newFeature.setParams(paramstoadd); - - this.currentFeatureID = newFeature.ID; - if (this.intlayer !== null) { - this.viewManagerDelegate.addFeature(newFeature, this.viewManagerDelegate.renderLayers.indexOf(this.intlayer)); - } - - featureIDs.push(newFeature.ID); - } - - super.createNewComponent(this.typeString, params_to_copy, featureIDs); - this.viewManagerDelegate.saveDeviceState(); - } - - /** - * Show the target of the tool - * - * @returns {void} - * @memberof MultilevelPositionTool - */ - showTarget(): void { - if (this.lastPoint === null) { - return; - } - if (this.currentParameters === null) { - throw new Error("No parameters set"); - } - const target = PositionTool.getTarget(this.lastPoint); - this.viewManagerDelegate.updateTarget(this.typeString, this.setString, target, this.currentParameters); - } -} diff --git a/src/app/view/tools/panTool.ts b/src/app/view/tools/panTool.ts deleted file mode 100644 index aa6823ac..00000000 --- a/src/app/view/tools/panTool.ts +++ /dev/null @@ -1,69 +0,0 @@ -import MouseTool from "./mouseTool"; -import paper from "paper"; -import Registry from "../../core/registry"; -import SimpleQueue from "../../utils/simpleQueue"; -import ViewManager from "../viewManager"; - -export default class PanTool extends MouseTool { - startPoint: paper.Point | number[] | null; - lastPoint: paper.Point | number[] | null; - startCenter: paper.Point | number[] | null; - - updateQueue: SimpleQueue; - - dragging?: boolean; - - constructor(viewManager: ViewManager) { - super(viewManager); - this.startPoint = null; - this.lastPoint = null; - this.startCenter = null; - const ref = this; - this.updateQueue = new SimpleQueue(function () { - ref.pan(); - }, 10); - this.down = function (event) { - ref.startPan(MouseTool.getEventPosition(event as unknown as MouseEvent)!); - ref.showTarget(); - }; - this.up = function (event) { - ref.endPan(MouseTool.getEventPosition(event as unknown as MouseEvent)!); - ref.showTarget(); - }; - this.move = function (event) { - ref.moveHandler(MouseTool.getEventPosition(event as unknown as MouseEvent)!); - ref.showTarget(); - }; - } - - startPan(point: paper.Point): void { - this.dragging = true; - this.startPoint = point; - } - - moveHandler(point: paper.Point): void { - if (this.dragging) { - this.lastPoint = point; - this.updateQueue.run(); - // this.pan(); - } - } - - endPan(point: paper.Point): void { - this.pan(); - this.lastPoint = null; - this.dragging = false; - this.startPoint = null; - } - - showTarget(): void { - Registry.viewManager?.removeTarget(); - } - - pan(): void { - if (this.lastPoint) { - const delta = (this.lastPoint as paper.Point).subtract(this.startPoint as paper.Point); - Registry.viewManager?.moveCenter([delta.x, delta.y] as unknown as paper.Point); - } - } -} diff --git a/src/app/view/tools/positionTool.ts b/src/app/view/tools/positionTool.ts deleted file mode 100644 index 8c93346c..00000000 --- a/src/app/view/tools/positionTool.ts +++ /dev/null @@ -1,158 +0,0 @@ -import MouseTool from "./mouseTool"; - -import Registry from "../../core/registry"; -import Feature from "../../core/feature"; -import Device from "../../core/device"; -import SimpleQueue from "../../utils/simpleQueue"; - -import paper from "paper"; -import Params from "../../core/params"; -import Component from "../../core/component"; -import { ComponentAPI } from "@/componentAPI"; -import MapUtils from "../../utils/mapUtils"; -import ViewManager from "@/app/view/viewManager"; -import { Point } from "@/app/core/init"; - -export default class PositionTool extends MouseTool { - viewManagerDelegate: ViewManager; - typeString: string; - setString: string; - currentFeatureID: string | null; - currentParameters: { [k: string]: any } | null; - - lastPoint: Point = [0, 0]; - - showQueue: SimpleQueue; - - constructor(viewManagerDelegate: ViewManager, typeString: string, currentParameters: { [k: string]: any } | null = null) { - super(viewManagerDelegate); - this.viewManagerDelegate = viewManagerDelegate; - this.typeString = typeString; - this.setString = "Basic"; - this.currentFeatureID = null; - this.currentParameters = currentParameters; - const ref = this; - this.lastPoint = [0, 0]; - this.showQueue = new SimpleQueue( - function() { - ref.showTarget(); - }, - 20, - false - ); - this.up = function(event) { - // do nothing - }; - this.move = function(event) { - let point = MouseTool.getEventPosition((event as unknown) as MouseEvent); - if(point === null) { - return; - } - ref.lastPoint = [point.x, point.y]; - ref.showQueue.run(); - }; - this.down = function(event) { - ref.viewManagerDelegate.killParamsWindow(); - paper.project.deselectAll(); - ref.createNewFeature(MouseTool.getEventPosition((event as unknown) as MouseEvent)!); - }; - } - - createNewFeature(point: paper.Point): void { - const name = this.viewManagerDelegate.currentDevice?.generateNewName(this.typeString); - const newFeature = Device.makeFeature( - this.typeString, - { - position: PositionTool.getTarget([point.x, point.y]) - }, - name - ); - this.currentFeatureID = newFeature.ID; - this.viewManagerDelegate.addFeature(newFeature); - } - - /** - * Returns the 2D vector of the position of the cursor - * @param point - * @return {Point} - */ - static getTarget(point:Point): Point { - if (Registry.viewManager === null) { - throw new Error("View Manager is null"); - } - const target = Registry.viewManager.snapToGrid(point); - return target; - } - - static getMinTarget(point: Point): Point { - const target: Point = [Math.round(point[0]), Math.round(point[1])]; - return target; - } - - /** - * Renders the target - */ - showTarget(): void { - if (this.lastPoint === null) { - return; - } - const target = PositionTool.getTarget(this.lastPoint); - this.viewManagerDelegate.updateTarget(this.typeString, this.setString, target, this.currentParameters!); - } - - /** - * Creates a new component and adds it to the registry's current device - * Note: Takes the feature ids as an array - * TODO: Modify this to take the MINT String as another parameter - * @param typeString Type of the Feature - * @param params Map of all the paramters - * @param featureIDs [String] Feature id's of all the features that will be a part of this component - */ - createNewComponent(typeString: string, paramdata: { [k: string]: any }, featureIDs: string[]) { - const definition = ComponentAPI.getDefinition(typeString); - // Clean Param Data - const cleanparamdata: { [k: string]: any } = {}; - for (const key in paramdata) { - cleanparamdata[key] = paramdata[key].value; - } - cleanparamdata["position"] = [0, 0]; - const params = new Params(cleanparamdata, MapUtils.toMap(definition!.unique), MapUtils.toMap(definition!.heritable)); - const componentid = ComponentAPI.generateID(); - const name = Registry.currentDevice!.generateNewName(typeString); - const newComponent = new Component(params, name, definition!.mint, componentid); - let feature; - - for (const i in featureIDs) { - newComponent.addFeatureID(featureIDs[i]); - - // Update the component reference - feature = Registry.currentDevice!.getFeatureByID(featureIDs[i]); - feature.referenceID = componentid; - } - - newComponent.setInitialOffset(); - - newComponent.updateComponentPosition(paramdata["position"].value); - - this.viewManagerDelegate.currentDevice!.addComponent(newComponent); - return newComponent; - } - - deactivate(): void {} - - getCreationParameters(position: paper.Point) { - if (this.currentParameters === null) { - throw new Error("No parameters to create a new feature"); - } - const paramvalues = { - position: PositionTool.getTarget([position.x, position.y]) - }; - for (const i in this.currentParameters) { - const item = this.currentParameters[i]; - const param = item.name; - const value = item.value; - (paramvalues as any)[param] = value; - } - return paramvalues; - } -} diff --git a/src/app/view/tools/renderMouseTool.ts b/src/app/view/tools/renderMouseTool.ts deleted file mode 100644 index f652c503..00000000 --- a/src/app/view/tools/renderMouseTool.ts +++ /dev/null @@ -1,216 +0,0 @@ -// import RightClickMenu from "../ui/rightClickMenu"; -import MouseTool from "./mouseTool"; - -import Registry from "../../core/registry"; -import SimpleQueue from "../../utils/simpleQueue"; -import paper from "paper"; -import EventBus from "@/events/events"; -import { PaperView, ViewManager } from "@/app"; -import { ToolPaperObject } from "@/app/core/init"; - -// Mouse tool for use with uF Guide Tool -// Allows for selection only of nonphysical features - -export default class RenderMouseTool extends MouseTool { - paperView: PaperView; - dragging: boolean; - dragStart: paper.Point | null; - lastPoint: paper.Point | number[] | null; - - currentSelectBox: paper.Point | number[] | null; - currentSelection: any[]; - updateQueue: SimpleQueue; - - /** - * Creates an instance of RenderMouseTool. - * @param {ViewManager} viewManager - * @param {PaperView} paperview - * @memberof RenderMouseTool - */ - constructor(viewManager: ViewManager, paperview: PaperView) { - super(viewManager); - this.viewManagerDelegate = viewManager; - this.paperView = paperview; - this.dragging = false; - this.dragStart = null; - this.lastPoint = null; - this.currentSelectBox = null; - this.currentSelection = []; - const ref = this; - this.updateQueue = new SimpleQueue(function () { - ref.dragHandler(); - }, 20); - this.down = function (event) { - this.viewManagerDelegate.killParamsWindow(); - ref.mouseDownHandler(event as unknown as MouseEvent); - ref.dragging = true; - ref.showTarget(); - }; - this.move = function (event) { - if (ref.dragging) { - ref.lastPoint = MouseTool.getEventPosition(event as unknown as MouseEvent) as paper.Point; - ref.updateQueue.run(); - } - ref.showTarget(); - }; - this.up = function (event) { - ref.dragging = false; - ref.mouseUpHandler(MouseTool.getEventPosition(event as unknown as MouseEvent)!); - ref.showTarget(); - }; - } - - /** - * Handles the KeyDown event - * - * @param {KeyboardEvent} event - * @memberof RenderMouseTool - */ - keyHandler(event: KeyboardEvent): void {} - - /** - * Handles the drag event - * - * @memberof RenderMouseTool - */ - dragHandler(): void {} - - /** - * Shows the target - * - * @memberof RenderMouseTool - */ - showTarget(): void { - this.viewManagerDelegate.removeTarget(); - } - - /** - * Handles the mouse up event - * - * @param {paper.Point} point - * @memberof RenderMouseTool - */ - mouseUpHandler(point: paper.Point): void { - if (this.currentSelectBox) { - this.currentSelection = this.viewManagerDelegate.hitFeaturesWithViewElement(this.currentSelectBox); - // Figure out where this is even used - // this.selectFeatures(); - } - } - - /** - * Handles the mouse down event - * - * @param {MouseEvent} event - * @memberof RenderMouseTool - */ - mouseDownHandler(event: MouseEvent): void { - const point = MouseTool.getEventPosition(event); - const target = this.hitFeature(point!); - if (target) { - // if (this.viewManagerDelegate.getNonphysComponentForFeatureID(target.featureID) && this.viewManagerDelegate.getNonphysComponentForFeatureID(target.featureID).mint == "TEXT") { - const element = this.viewManagerDelegate.getNonphysElementFromFeatureID(target.featureID); - if (element && element.type == "Text") { - if (target.selected) { - const feat = this.viewManagerDelegate.getFeatureByID(target.featureID); - this.viewManagerDelegate.updateDefaultsFromFeature(feat); - // Check if the feature is a part of a component - if (feat.referenceID === null) { - throw new Error("ReferenceID of feature is null"); - } else { - if (element !== null) { - EventBus.get().emit(EventBus.DBL_CLICK_ELEMENT, event, element); - } else { - EventBus.get().emit(EventBus.DBL_CLICK_FEATURE, event, feat); - } - } - } else { - this.deselectFeatures(); - this.selectFeature(target); - } - } else { - this.deselectFeatures(); - } - } else { - this.deselectFeatures(); - } - } - - /** - * Function that is fired when we click to select a single object on the paperjs canvas - * - * @param {paper.Point} point - * @returns - * @memberof RenderMouseTool - */ - hitFeature(point: paper.Point) { - const target = this.viewManagerDelegate.view.hitFeature(point, true, true); - return target; - } - - /** - * Function that is fired when we click to select a single object on the paperjs canvas - * @param paperElement - */ - selectFeature(paperElement: any): void { - this.currentSelection.push(paperElement); - - // Find the component that owns this feature and then select all of the friends - const component = this.__getComponentWithFeatureID(paperElement.featureID); - if (component === null) { - // Does not belong to a component, hence this returns - paperElement.selected = true; - } else if (component !== null) { - // Belongs to the component so we basically select all features with this id - const featureIDs = component.featureIDs; - for (const i in featureIDs) { - const featureid = featureIDs[i]; - const actualfeature = this.viewManagerDelegate.view.paperFeatures[featureid]; - actualfeature.selected = true; - } - - this.viewManagerDelegate.view.selectedComponents.push(component); - } else { - throw new Error("Totally got the selection logic wrong, reimplement this"); - } - } - - /** - * Deselects all features - * - * @memberof RenderMouseTool - */ - deselectFeatures(): void { - this.paperView.clearSelectedItems(); - this.currentSelection = []; - } - - /** - * Finds and return the corresponding Component Object in the Registry's current device associated with - * the featureid. Returns null if no component is found. - * - * @param featureid - * @return {Component} - * @private - */ - __getComponentWithFeatureID(featureid: string) { - // Get component with the features - - const device_components = (this.viewManagerDelegate as any).nonphysComponents; - - // Check against every component - for (const i in device_components) { - const component = device_components[i]; - // Check against features in the in the component - const componentfeatures = component.featureIDs; - const index = componentfeatures.indexOf(featureid); - - if (index !== -1) { - // Found it !! - return component; - } - } - - return null; - } -} diff --git a/src/app/view/tools/selectTool.ts b/src/app/view/tools/selectTool.ts deleted file mode 100644 index dbca4c96..00000000 --- a/src/app/view/tools/selectTool.ts +++ /dev/null @@ -1,299 +0,0 @@ -import MouseTool, { MouseToolCallback } from "./mouseTool"; - -import Registry from "../../core/registry"; -import SimpleQueue from "../../utils/simpleQueue"; -import paper from "paper"; -import { ToolPaperObject } from "@/app/core/init"; -import ViewManager from "../viewManager"; - -export default class SelectTool extends MouseTool { - dragging: boolean; - dragStart: paper.Point | null; - lastPoint: paper.Point | null; - - currentSelectBox: any; - currentSelection: any[]; - - updateQueue: SimpleQueue; - - /** - * Creates an instance of SelectTool. - * @param {ViewManager} viewManagerDelegate - * @memberof SelectTool - */ - constructor(viewManagerDelegate: ViewManager) { - super(viewManagerDelegate); - this.dragging = false; - this.dragStart = null; - this.lastPoint = null; - this.currentSelectBox = null; - this.currentSelection = []; - const ref = this; - this.updateQueue = new SimpleQueue(function() { - ref.dragHandler(); - }, 20); - - this.down = function(event) { - Registry.viewManager?.killParamsWindow(); - ref.mouseDownHandler(event); - ref.dragging = true; - ref.showTarget(); - }; - - this.move = function(event) { - if (ref.dragging) { - ref.lastPoint = MouseTool.getEventPosition((event as unknown) as MouseEvent) as paper.Point; - ref.updateQueue.run(); - } - ref.showTarget(); - }; - - this.up = function(event) { - ref.dragging = false; - ref.mouseUpHandler(MouseTool.getEventPosition((event as unknown) as MouseEvent)!); - ref.showTarget(); - }; - } - - /** - * Handles the KeyDown event - * - * @param {KeyboardEvent} event - * @memberof SelectTool - */ - keyHandler(event: KeyboardEvent): void { - if (event.key === "delete" || event.key === "backspace") { - console.log("Removing feature"); - this.removeFeatures(); - } - if (event.key === "c") { - console.log("Detected a ctrlC"); - console.log(this.currentSelection); - } - } - - /** - * Handles the mouse drag event - * - * @memberof SelectTool - */ - dragHandler(): void { - if (this.dragStart) { - if (this.currentSelectBox) { - this.currentSelectBox.remove(); - } - this.currentSelectBox = this.rectSelect(this.dragStart, this.lastPoint!); - } - } - - /** - * Handles the mouse down event - * - * @memberof SelectTool - */ - showTarget(): void { - Registry.viewManager?.removeTarget(); - } - - /** - * Handles the mouse up event - * - * @param {paper.Point} point - * @memberof SelectTool - */ - mouseUpHandler(point: paper.Point): void { - if (this.currentSelectBox) { - this.currentSelection = Registry.viewManager!.hitFeaturesWithViewElement(this.currentSelectBox); - this.selectFeatures(); - } - this.killSelectBox(); - } - - - /** - * Deletes the selected features - * - * @memberof SelectTool - */ - removeFeatures(): void { - if (this.currentSelection.length > 0) { - for (let i = 0; i < this.currentSelection.length; i++) { - const paperFeature = this.currentSelection[i]; - let devicefeature = Registry.currentDevice!.getFeatureByID(paperFeature.featureID); - Registry.currentDevice!.removeFeature(devicefeature); - } - this.currentSelection = []; - //Registry.canvasManager!.render(); - } - } - - /** - * Handles the mouse down event - * - * @param {MouseEvent} event - * @memberof SelectTool - */ - mouseDownHandler(event: MouseEvent): void { - const point = MouseTool.getEventPosition((event as unknown) as MouseEvent); - const target = this.hitFeature(point!); - if (target) { - if (target.selected) { - const feat = Registry.currentDevice!.getFeatureByID(target.featureID); - Registry.viewManager!.updateDefaultsFromFeature(feat); - } else { - this.deselectFeatures(); - this.selectFeature(target); - } - } else { - this.deselectFeatures(); - this.dragStart = point!; - } - } - - /** - * Removes the selection box - * - * @memberof SelectTool - */ - killSelectBox(): void { - if (this.currentSelectBox) { - this.currentSelectBox.remove(); - this.currentSelectBox = null; - } - this.dragStart = null; - } - - - /** - * Helper method that tests if a point is within a rectangle - * - * @param {paper.Point} point - * @returns - * @memberof SelectTool - */ - hitFeature(point: paper.Point) { - const target = Registry.viewManager!.hitFeature((point as unknown) as number[]); - return target; - } - - /** - * Function that is fired when we click to select a single object on the paperjs canvas - * @param paperElement - */ - selectFeature(paperElement: any): void { - this.currentSelection.push(paperElement); - - // Find the component that owns this feature and then select all of the friends - const component = this.__getComponentWithFeatureID(paperElement.featureID); - if (component === null) { - // Does not belong to a component, hence this returns - paperElement.selected = true; - } else { - // Belongs to the component so we basically select all features with this id - const featureIDs = component.featureIDs; - for (const i in featureIDs) { - const featureid = featureIDs[i]; - const actualfeature = Registry.viewManager!.view.paperFeatures[featureid]; - actualfeature.selected = true; - } - - Registry.viewManager!.view.selectedComponents.push(component); - } - } - - /** - * Finds and return the corresponding Component Object in the Registry's current device associated with - * the featureid. Returns null if no component is found. - * - * @param featureid - * @return {Component} - * @private - */ - __getComponentWithFeatureID(featureid: string) { - // Get component with the features - - const device_components = Registry.currentDevice!.components; - - // Check against every component - for (const i in device_components) { - const component = device_components[i]; - // Check against features in the in the component - const componentfeatures = component.featureIDs; - const index = componentfeatures.indexOf(featureid); - - if (index !== -1) { - // Found it !! - console.log("Found Feature: " + featureid + " in component: " + component.id); - return component; - } - } - - return null; - } - - /** - * Function that is fired when we drag and select an area on the paperjs canvas - */ - selectFeatures(): void { - if (this.currentSelection) { - for (let i = 0; i < this.currentSelection.length; i++) { - const paperFeature = this.currentSelection[i]; - - // Find the component that owns this feature and then select all of the friends - const component = this.__getComponentWithFeatureID(paperFeature.featureID); - - if (component === null) { - // Does not belong to a component hence do the normal stuff - paperFeature.selected = true; - } else { - // Belongs to the component so we basically select all features with this id - const featureIDs = component.featureIDs; - for (const j in featureIDs) { - const featureid = featureIDs[j]; - const actualfeature = Registry.viewManager!.view.paperFeatures[featureid]; - actualfeature.selected = true; - } - - Registry.viewManager!.view.selectedComponents.push(component); - } - } - } - } - - /** - * Deselects all features - * - * @memberof SelectTool - */ - deselectFeatures(): void { - paper.project.deselectAll(); - this.currentSelection = []; - } - - /** - * Aborts the current operation - * - * @memberof SelectTool - */ - abort(): void { - this.deselectFeatures(); - this.killSelectBox(); - } - - /** - * Creates a selection box - * - * @param {paper.Point} point1 - * @param {paper.Point} point2 - * @returns - * @memberof SelectTool - */ - rectSelect(point1: paper.Point, point2: paper.Point) { - const rect = new paper.Path.Rectangle(point1, point2); - rect.fillColor = new paper.Color(0, 0.3, 1, 0.4); - rect.strokeColor = new paper.Color(0, 0, 0); - rect.strokeWidth = 2; - rect.selected = true; - return rect; - } -} diff --git a/src/app/view/tools/valveInsertionTool.ts b/src/app/view/tools/valveInsertionTool.ts deleted file mode 100644 index 5ec7ea99..00000000 --- a/src/app/view/tools/valveInsertionTool.ts +++ /dev/null @@ -1,276 +0,0 @@ -import MultilayerPositionTool from "./multilayerPositionTool"; - -import Registry from "../../core/registry"; -import Device from "../../core/device"; -import MouseTool, { MouseToolCallback } from "./mouseTool"; -import PositionTool from "./positionTool"; -import paper from "paper"; -import ViewManager from "@/app/view/viewManager"; -import Connection from "@/app/core/connection"; -import Component from "@/app/core/component"; -import { ValveType } from "@/app/core/init"; -import { ComponentAPI } from "@/componentAPI"; - -export default class ValveInsertionTool extends MultilayerPositionTool { - valveType: ValveType; - - /** - * Creates an instance of ValveInsertionTool. - * @param {ViewManager} viewManagerDelegate - * @param {string} mintstring - * @param {string} setString - * @param {{ [k: string]: any }} currentParameters - * @param {ValveType} [valveType=ValveType.NORMALLY_OPEN] - * @memberof ValveInsertionTool - */ - constructor(viewManagerDelegate: ViewManager, mintstring: string, setString: string, currentParameters: { [k: string]: any }, valveType: ValveType = ValveType.NORMALLY_OPEN) { - const threeduftype = ComponentAPI.getTypeForMINT(mintstring); - if (!threeduftype) { - throw new Error("Could not find type for MINT type " + mintstring); - } - super(viewManagerDelegate, threeduftype, setString, currentParameters); - this.valveType = valveType; - - const ref = this; - - this.down = function (event: MouseEvent) { - console.log(event); - const point = MouseTool.getEventPosition(event); - if (point === null) return; - const target = PositionTool.getTarget([point.x, point.y]); - // Check if connection exists at point - const connection = ref.checkIfConnectionExistsAt(new paper.Point(target[0], target[1])); - // if connection exists then place the valve - if (connection) { - ref.insertValve(point!, connection); - } else if ((event as any).ctrlKey || (event as any).metaKey) { - // Forced placement of the Valve - console.warn("Forcing placement of valve, a lot of things will not work correct if done this way"); - ref.forceInsertValve(point!); - } else { - // Send out error message - console.log("Could not find connection at this location"); - } - }; - } - - /** - * Places the component (single layer) - * @param point - * @param rotation - * @return {Component} - */ - createNewFeature(point: paper.Point, rotation: number | null = null): Component { - const featureIDs = []; - let overridedata; - - if (rotation) { - overridedata = { - position: PositionTool.getTarget([point.x, point.y]), - rotation: rotation - }; - } else { - overridedata = { - position: PositionTool.getTarget([point.x, point.y]) - }; - } - - const currentlevel = Math.floor(this.viewManagerDelegate!.renderLayers.indexOf(this.viewManagerDelegate.currentLayer) / 3); - // const flowlayer = currentlevel * 3; - const controllayer = currentlevel * 3 + 1; - // const intlayer = currentlevel * 3 + 2; - - const newFeature = Device.makeFeature(this.typeString, overridedata); - this.currentFeatureID = newFeature.ID; - - this.viewManagerDelegate.addFeature(newFeature, controllayer); - - featureIDs.push(newFeature.ID); - - const params_to_copy = newFeature.getParams(); - - const component = super.createNewComponent(this.typeString, params_to_copy, featureIDs); - - return component; - } - - /** - * Places the component (multi-layer) - * @param point - * @param rotation - * @return {Component} - */ - createNewMultiLayerFeature(point: paper.Point, rotation: number | null = null): Component { - const featureIDs = []; - let overridedata; - - if (rotation) { - overridedata = { - position: PositionTool.getTarget([point.x, point.y]), - rotation: rotation - }; - } else { - overridedata = { - position: PositionTool.getTarget([point.x, point.y]) - }; - } - - const currentlevel = Math.floor(Registry.viewManager!.renderLayers.indexOf(this.viewManagerDelegate.currentLayer) / 3); - const flowlayer = currentlevel * 3; - const controllayer = currentlevel * 3 + 1; - - let newFeature = Device.makeFeature(this.typeString, overridedata); - this.currentFeatureID = newFeature.ID; - this.viewManagerDelegate.addFeature(newFeature, flowlayer); - - featureIDs.push(newFeature.ID); - - const params_to_copy = newFeature.getParams(); - - const newtypestring = this.typeString + "_control"; - const paramstoadd = newFeature.getParams(); - newFeature = Device.makeFeature(newtypestring, overridedata); - newFeature.setParams(paramstoadd); - - this.currentFeatureID = newFeature.ID; - this.viewManagerDelegate.addFeature(newFeature, controllayer); - - featureIDs.push(newFeature.ID); - - const component = super.createNewComponent(this.typeString, params_to_copy, featureIDs); - - return component; - } - - /** - * Shows the target - */ - showTarget(): void { - if (this.lastPoint === null) { - return; - } - const target = PositionTool.getTarget(this.lastPoint); - this.viewManagerDelegate.updateTarget(this.typeString, this.setString, target, this.currentParameters!); - } - - /** - * Checks if the connection exists at the point where the user clicks - * @param target - * @return {*} - */ - checkIfConnectionExistsAt(target: paper.Point): Connection | null { - const hit = Registry.viewManager!.view.hitFeature(target, false); - // TODO: check if the hit feature belongs to a connection - if (hit) { - const connection = Registry.currentDevice!.getConnectionForFeatureID(hit.featureID); - return connection; - } - - return null; - } - - /** - * Inserts the valve at the point on the connection - * @param point - * @param connection - */ - insertValve(point: paper.Point, connection: Connection): void { - let angle = this.__getRotation(point, connection); - if (angle < 0) { - angle += 180; - } - - let component: Component; - - // TODO: Enable this.is3D functionality - if (this.valveType === ValveType.NORMALLY_OPEN) { - component = this.createNewFeature(point, angle); - this.viewManagerDelegate.currentDevice!.insertValve(component, connection, this.valveType); - } else if (this.valveType === ValveType.NORMALLY_CLOSED) { - angle += 90; - component = this.createNewMultiLayerFeature(point, angle); - this.viewManagerDelegate.currentDevice!.insertValve(component, connection, this.valveType); - } - // Registry.viewManager!.updatesConnectionRender(connection); - Registry.viewManager!.saveDeviceState(); - } - - /** - * Inserts the valve at the point on the connection - * @param point - * @param connection - */ - forceInsertValve(point: paper.Point): void { - let component; - if (this.typeString == "Valve3D") { - // TODO: Insert the valve features in both flow and control - component = this.createNewMultiLayerFeature(point); - // TODO: Redraw the connection - } else { - // TODO: Insert the valve feature in flow - component = this.createNewFeature(point); - } - - Registry.viewManager!.saveDeviceState(); - } - - /** - * Generates the rotation for the valve when placed on the connection - * @param point - * @param connection - * @return {*} - * @private - */ - __getRotation(point: paper.Point, connection: Connection) { - // Find closes normal intersection of the point and place the - let conn_waypoints; - let lowestdist = 1000000000000000000000; - let p0: number[], p1: number[], sol: number; - const paths = connection.getPaths(); - const waypoints = []; - for (const j in paths) { - conn_waypoints = paths[j]; - // conn_waypoints = connection.getValue("wayPoints"); - for (let i = 0; i < conn_waypoints.length; i++) { - waypoints.push(conn_waypoints[i]); - } - - // Find out which segment the point is on - for (let i = 0; i < waypoints.length - 1; i++) { - p0 = waypoints[i]; - p1 = waypoints[i + 1]; - - const tempdist = this.__calculateNormalDistance(point, p0, p1); - if (tempdist < lowestdist || i === 0) { - sol = i; - lowestdist = tempdist; - } - } - - p0 = waypoints[sol!]; - p1 = waypoints[sol! + 1]; - } - // waypoints.splice(0, 0, connection.getValue("start")); - - const to = new paper.Point(p0![0], p0![1]); - const from = new paper.Point(p1![0], p1![1]); - const vec = from.subtract(to); - - return vec.angle; - } - - /** - * Calculates normal distance - * @param point - * @param p0 - * @param p1 - * @private - */ - __calculateNormalDistance(point: paper.Point, p0: number[], p1: number[]) { - const line = new paper.Path.Line(new paper.Point(p0[0], p0[1]), new paper.Point(p1[0], p1[1])); - const target = new paper.Point(point.x, point.y); - const closestpt = line.getNearestPoint(target); - const dist = closestpt.getDistance(point); - return dist; - } -} diff --git a/src/app/view/uiElement.ts b/src/app/view/uiElement.ts deleted file mode 100644 index 4645a22f..00000000 --- a/src/app/view/uiElement.ts +++ /dev/null @@ -1,48 +0,0 @@ -import Parameter from "../core/parameter"; -import { ComponentAPI } from "@/componentAPI"; - -export default class UIElement { - protected __type: string; - protected __position: [number, number]; - protected __height: number; - protected __featureIDs: Array; - protected __id: string; - - //constructor(type: string, paramdata: { [index: string]: Parameter }, featureIDs: Array, id: string = ComponentAPI.generateID()) { - constructor(id: string = ComponentAPI.generateID()) { - this.__position = [0, 0]; - this.__height = 0; - this.__type = "BlankUIElement"; - this.__featureIDs = []; - // this.__position = paramdata.position.value; - // this.__height = paramdata.height.value; - // this.__type = type; - // this.__featureIDs = featureIDs; - this.__id = id; - } - - get type(): string { - return this.__type; - } - - get featureIDs(): Array { - return this.__featureIDs; - } - - get position(): [number, number] { - return this.__position; - } - - get id(): string { - return this.__id; - } - - hasFeatureID(featureID: string): boolean { - if (this.__featureIDs.includes(featureID)) return true; - else return false; - } - - draw(): void { - console.log(`Drawing at ${this.__position[0]}, ${this.__position[1]}`); - } -} diff --git a/src/app/view/viewManager.ts b/src/app/view/viewManager.ts deleted file mode 100644 index 39979ab0..00000000 --- a/src/app/view/viewManager.ts +++ /dev/null @@ -1,1785 +0,0 @@ -// import ZoomToolBar from "@/components/zoomSlider.vue"; -import paper from "paper"; - -import Registry from "../core/registry"; -import * as Colors from "./colors"; -import { saveAs } from "file-saver"; - -import Device from "../core/device"; -import SelectTool from "./tools/selectTool"; -import InsertTextTool from "./tools/insertTextTool"; -import SimpleQueue from "../utils/simpleQueue"; -import MouseSelectTool from "./tools/mouseSelectTool"; -// import RenderMouseTool from "./tools/renderMouseTool"; - -import DXFObject from "../core/dxfObject"; -import EdgeFeature from "../core/edgeFeature"; -import * as HTMLUtils from "../utils/htmlUtils"; -import MouseAndKeyboardHandler from "./mouseAndKeyboardHandler"; -import DesignHistory from "./designHistory"; -import MoveTool from "./tools/moveTool"; -import ComponentPositionTool from "./tools/componentPositionTool"; -import MultilayerPositionTool from "./tools/multilayerPositionTool"; -import MultilevelPositionTool from "./tools/multilevelPositionTool"; -import CellPositionTool from "./tools/cellPositionTool"; -import ValveInsertionTool from "./tools/valveInsertionTool"; -import PositionTool from "./tools/positionTool"; -import ConnectionTool from "./tools/connectionTool"; -import GenerateArrayTool from "./tools/generateArrayTool"; -import CustomComponentManager from "./customComponentManager"; -import CustomComponentPositionTool from "./tools/customComponentPositionTool"; -import { setButtonColor } from "../utils/htmlUtils"; -import PaperView from "./paperView"; -import AdaptiveGrid from "./grid/adaptiveGrid"; -import DAFDPlugin from "../plugin/dafdPlugin"; -import { Examples } from "../index"; -import Feature from "../core/feature"; -import Layer from "../core/layer"; -import Component from "../core/component"; -import EventBus from "@/events/events"; -import { ComponentAPI } from "@/componentAPI"; -import RenderLayer from "@/app/view/renderLayer"; - -import LoadUtils from "@/app/utils/loadUtils"; -import ExportUtils, { SerializationError } from "@/app/utils/exportUtils"; -import { LogicalLayerType, InterchangeV1_2, ValveType } from "@/app/core/init"; - -import { Point } from "@/app/core/init"; - -/** - * View manager class - */ -import { MultiplyOperation } from "three"; -import UIElement from "./uiElement"; -import Connection from "../core/connection"; -import Params from "../core/params"; -import MouseTool from "./tools/mouseTool"; -import { generateRenderLayers } from "../utils/renderUtils"; - -export default class ViewManager { - view: PaperView; - renderLayers: RenderLayer[]; - activeRenderLayerIndex: number; - nonphysElements: UIElement[]; - tools: { [k: string]: any }; - rightMouseTool: MouseTool; - updateQueue: any; - saveQueue: any; - undoStack: any; - pasteboard: any[]; - mouseAndKeyboardHandler: MouseAndKeyboardHandler; - minZoom: number; - maxZoom: number; - threeD: boolean; - renderer: any; - - messageBox?: any; - customComponentManager?: CustomComponentManager; - currentSelection?: any; - - private __grid: AdaptiveGrid; - private __currentDevice: Device | null; - private __button2D?: HTMLButtonElement; - private __button3D?: HTMLButtonElement; - private __canvasBlock?: HTMLCanvasElement; - private __renderBlock?: HTMLCanvasElement; - - // TODO : Check if we can remove this tracking - currentLayer: RenderLayer; - - /** - * Default ViewManger Constructor - */ - constructor() { - this.view = new PaperView("c", this); - this.__grid = new AdaptiveGrid(this); - Registry.currentGrid = this.__grid; - this.renderLayers = []; - this.nonphysElements = []; // TODO - Keep track of what types of objects fall here UIElements - this.tools = {}; - this.rightMouseTool = new SelectTool(this); - this.__currentDevice = null; - const reference = this; - this.updateQueue = new SimpleQueue(function() { - reference.view.refresh(); - }, 20); - - this.saveQueue = new SimpleQueue(function() { - reference.saveToStorage(); - }); - - this.undoStack = new DesignHistory(); - this.pasteboard = []; - - this.mouseAndKeyboardHandler = new MouseAndKeyboardHandler(this); - - this.view.setResizeFunction(function() { - reference.updateGrid(); - reference.updateAlignmentMarks(); - - reference.view.updateRatsNest(); - reference.view.updateComponentPortsRender(); - reference.updateDevice(Registry.currentDevice!); - }); - - const func = function(event: any) { - reference.adjustZoom(event.deltaY, (reference.getEventPosition(event) as unknown) as number[]); - }; - - // this.manufacturingPanel = new ManufacturingPanel(this); - - // this.exportPanel = new ExportPanel(this); - - this.view.setMouseWheelFunction(func); - this.minZoom = 0.0001; - this.maxZoom = 5; - this.setupTools(); - const ref = this; - EventBus.get().on(EventBus.UPDATE_RENDERS, function(feature, refresh = true) { - if (ref.ensureFeatureExists(feature)) { - ref.view.updateFeature(feature); - ref.refresh(refresh); - } - }); - - // TODO: Figure out how remove UpdateQueue as dependency mechanism - this.__grid.setColor(Colors.BLUE_500); - - // Removed from Page Setup - this.threeD = false; - this.renderer = Registry.threeRenderer; - // this.__button2D = document.getElementById("button_2D"); - // this.__canvasBlock = document.getElementById("canvas_block"); - // this.__renderBlock = document.getElementById("renderContainer"); - // this.setupDragAndDropLoad("#c"); - // this.setupDragAndDropLoad("#renderContainer"); - this.currentLayer = this.renderLayers[0]; - this.activeRenderLayerIndex = 0; - - } - - - /** - * Returns the current device the ViewManager is displaying. Right now I'm using this to replace the - * Registry.currentDevice dependency, however this might change as the modularity requirements change. - * - * @return {Device} - * @memberof ViewManager - */ - get currentDevice(): Device | null { - return this.__currentDevice; - } - - /** - * Initiates the copy operation on the selected feature - * @returns {void} - * @memberof ViewManager - */ - initiateCopy(): void { - const selectedFeatures = this.view.getSelectedFeatures(); - if (selectedFeatures.length > 0) { - this.pasteboard[0] = selectedFeatures[0]; - } - } - - /** - * Initiating the zoom toolbar - * @memberof ViewManager - * @returns {void} - */ - setupToolBars(): void { - // Initiating the zoom toolbar - // this.zoomToolBar = new ZoomToolBar(0.0001, 5); - // this.componentToolBar = new ComponentToolBar(this); - this.resetToDefaultTool(); - } - - /** - * Sets the initial state of the name map - * @memberof ViewManager - * @returns {void} - */ - setNameMap(): void { - const newMap = new Map(); - for (let i = 0; i < this.currentDevice!.layers.length; i++) { - const [nameStr, nameNum] = this.currentDevice!.layers[i].name.split("_"); - if (newMap.has(nameStr)) { - if (newMap.get(nameStr) < nameNum) newMap.set(nameStr, parseInt(nameNum)); - } else { - newMap.set(nameStr, parseInt(nameNum)); - } - } - for (let i = 0; i < this.currentDevice!.connections.length; i++) { - const [nameStr, nameNum] = this.currentDevice!.connections[i].name.split("_"); - if (newMap.has(nameStr)) { - if (newMap.get(nameStr) < nameNum) newMap.set(nameStr, parseInt(nameNum)); - } else { - newMap.set(nameStr, parseInt(nameNum)); - } - } - for (let i = 0; i < this.currentDevice!.components.length; i++) { - const [nameStr, nameNum] = this.currentDevice!.components[i].name.split("_"); - if (newMap.has(nameStr)) { - if (newMap.get(nameStr) < nameNum) newMap.set(nameStr, parseInt(nameNum)); - } else { - newMap.set(nameStr, parseInt(nameNum)); - } - } - for (let i = 0; i < this.renderLayers.length; i++) { - const [nameStr, nameNum] = this.renderLayers[i].name.split("_"); - if (newMap.has(nameStr)) { - if (newMap.get(nameStr) < nameNum) newMap.set(nameStr, parseInt(nameNum)); - } else { - newMap.set(nameStr, parseInt(nameNum)); - } - } - - this.currentDevice!.nameMap = newMap; - } - - /** - * Adds a device to the view manager - * @param {Device} device Device to be added - * @param {Boolean} refresh Default true - * @memberof ViewManager - * @returns {void} - */ - addDevice(device: Device, refresh = true): void { - this.view.addDevice(device); - this.__addAllDeviceLayers(device, false); - this.refresh(refresh); - } - - /** - * Adds all the layers in the device - * @param {Device} device Selected device - * @param {boolean} refresh Whether to refresh or not. true by default - * @memberof ViewManager - * @returns {void} - * @private - */ - __addAllDeviceLayers(device: Device, refresh = true): void { - for (let i = 0; i < device.layers.length; i++) { - const layer = device.layers[i]; - this.addLayer(layer, i, false); - } - } - - /** - * Removes all layers in the device - * @param {Device} device Selected device - * @param {boolean} refresh Whether to refresh or not. true by default - * @memberof ViewManager - * @returns {void} - */ - __removeAllDeviceLayers(device: Device, refresh = true): void { - for (let i = 0; i < device.layers.length; i++) { - const layer = device.layers[i]; - this.removeLayer(layer, i, false); - } - } - - /** - * Removes the device from the view - * @param {Device} device Selected device to remove - * @param {Boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - removeDevice(device: Device, refresh = true): void { - this.view.removeDevice(); - this.__removeAllDeviceLayers(device, false); - this.refresh(refresh); - } - - /** - * Updates the device in the view - * @param {Device} device Selected device to update - * @param {boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - updateDevice(device: Device, refresh = true): void { - this.view.updateDevice(device); - this.refresh(refresh); - } - - /** - * Adds a feature to the view - * @param {Feature} feature Feature to add - * @param {Boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - addFeature(feature: Feature, index = this.activeRenderLayerIndex, isPhysicalFlag = true, refresh = true): void { - // let isPhysicalFlag = true; - this.renderLayers[index as number].addFeature(feature, isPhysicalFlag); - if (this.ensureFeatureExists(feature)) { - this.view.addFeature(feature); - this.refresh(refresh); - } - } - - /** - * Returns the component identified by the id - * @param {string} id ID of the feature to get the component - * @return {UIElement|null} - * @memberof ViewManager - */ - getNonphysElementFromFeatureID(id: string): UIElement | null { - for (const i in this.nonphysElements) { - const element = this.nonphysElements[i]; - // go through each component's features - for (const j in element.featureIDs) { - if (element.featureIDs[j] === id) { - return element; - } - } - } - - return null; - } - - /** - * Updates a feature from the view - * @param {Feature} feature Feature to update - * @param {boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - updateFeature(feature: Feature, refresh = true): void { - if (this.ensureFeatureExists(feature)) { - this.view.updateFeature(feature); - this.refresh(refresh); - } - } - - /** - * Removes feature from the view - * @param {Feature} feature Feature to remove - * @param {boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - removeFeature(feature: Feature, refresh = true): void { - const layer = this.getRenderLayerByID(feature.ID); - if (this.ensureFeatureExists(feature)) { - this.view.removeFeature(feature); - this.refresh(refresh); - } - layer.removeFeatureByID(feature.ID); - } - - /** - * Removes feature from the view - * @param {string} feature Feature to remove - * @param {boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - removeFeatureByID(featureID: string, refresh = true): void { - const layer = this.getRenderLayerByID(featureID); - const feature = layer.getFeature(featureID); - if (this.ensureFeatureExists(feature)) { - this.view.removeFeature(feature); - this.refresh(refresh); - } - layer.removeFeatureByID(featureID); - } - - /** - * Adds layer to the view - * @param {Layer} layer Layer to add - * @param {Number} index Index of the layer - * @param {Boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - addLayer(layer: Layer, index: number, refresh = true): void { - if (this.__isLayerInCurrentDevice(layer)) { - this.view.addLayer(layer, index); - this.__addAllLayerFeatures(layer, index, false); - this.refresh(refresh); - } - } - - /** - * Create a new set of layers (flow, control and cell) for the upcoming level. - * @returns {void} - * @memberof ViewManager - */ - createNewLayerBlock(): void { - if(this.__currentDevice === null) { - throw new Error("No device set on ViewManager"); - } - // Generate model layers - let groupNum = this.__currentDevice.layers.length; - if (groupNum != 0) groupNum = groupNum / 3; - - const newlayers = []; - newlayers[0] = new Layer({ z_offset: 0, flip: false }, this.currentDevice?.generateNewName("LayerFlow"), LogicalLayerType.FLOW, groupNum.toString()); - newlayers[1] = new Layer({ z_offset: 0, flip: false }, this.currentDevice?.generateNewName("LayerControl"), LogicalLayerType.CONTROL, groupNum.toString()); - newlayers[2] = new Layer({ z_offset: 0, flip: false }, this.currentDevice?.generateNewName("LayerIntegration"), LogicalLayerType.INTEGRATION, groupNum.toString()); - // Add model layers to current device - this.__currentDevice.createNewLayerBlock(newlayers); - - // Find all the edge features - const edgefeatures = []; - const devicefeatures = Registry.currentDevice?.layers[0].features; - let feature; - - for (const i in devicefeatures) { - feature = devicefeatures[i]; - if (feature.fabType === "EDGE") { - edgefeatures.push(feature); - } - } - - // Add the Edge Features from layer '0' - // to all other layers - for (const i in newlayers) { - for (const j in edgefeatures) { - newlayers[i].addFeature(edgefeatures[j]); - } - } - - // Added the new layers - for (const i in newlayers) { - const layertoadd = newlayers[i]; - const index = this.view.paperLayers.length; - this.addLayer(layertoadd, index, true); - } - - // Add new renderLayers - this.renderLayers[this.renderLayers.length] = new RenderLayer(this.currentDevice?.generateNewName("RenderLayerFlow"), newlayers[0], LogicalLayerType.FLOW); - this.renderLayers[this.renderLayers.length] = new RenderLayer(this.currentDevice?.generateNewName("RenderLayerControl"), newlayers[1], LogicalLayerType.CONTROL); - this.renderLayers[this.renderLayers.length] = new RenderLayer(this.currentDevice?.generateNewName("RenderLayerIntegration"), newlayers[2], LogicalLayerType.INTEGRATION); - for (const i in edgefeatures) { - this.renderLayers[this.renderLayers.length - 3].addFeature(edgefeatures[i]); - this.renderLayers[this.renderLayers.length - 2].addFeature(edgefeatures[i]); - this.renderLayers[this.renderLayers.length - 1].addFeature(edgefeatures[i]); - } - - console.log("Active Layer", this.activeRenderLayerIndex); - this.setActiveRenderLayer(this.renderLayers.length - 3); - } - - /** - * Deletes the layers at the level index, we have 3-set of layers so it deletes everything at - * that level - * @param {number} levelindex Integer only - * @returns {void} - * @memberof ViewManager - */ - deleteLayerBlock(levelindex: number): void { - // Delete the levels in the device model - Registry.currentDevice?.deleteLayer(levelindex * 3); - Registry.currentDevice?.deleteLayer(levelindex * 3); - Registry.currentDevice?.deleteLayer(levelindex * 3); - - // Delete levels in render model - this.renderLayers.splice(levelindex * 3, 3); - if (this.activeRenderLayerIndex! > levelindex * 3 + 2) { - this.setActiveRenderLayer(this.activeRenderLayerIndex! - 3); - } else if (this.activeRenderLayerIndex! < levelindex * 3) { - console.log("No change"); - } else { - if (levelindex == 0) { - if (this.renderLayers.length == 0) { - // The param shouldn't be null - this.setActiveRenderLayer(levelindex); - } else { - this.setActiveRenderLayer(0); - } - } else { - this.setActiveRenderLayer((levelindex - 1) * 3); - } - } - - // Delete the levels in the render model - this.view.removeLayer(levelindex * 3); - this.view.removeLayer(levelindex * 3); - this.view.removeLayer(levelindex * 3); - this.updateActiveLayer(); - this.refresh(); - } - - setActiveRenderLayer(index: number): void { - this.activeRenderLayerIndex = index; - this.currentLayer = this.renderLayers[index]; // Registry.currentDevice.layers[index]; - this.updateActiveLayer(); - } - - /** - * Removes layer from the view - * @param {Layer} layer Layer to be removed from the view - * @param {Number} index Index of the layer to remove - * @param {Boolean} refresh Default to true - * @returns {view} - * @memberof ViewManager - */ - removeLayer(layer: Layer, index: number, refresh = true): void { - if (this.__isLayerInCurrentDevice(layer)) { - this.view.removeLayer(index); - this.__removeAllLayerFeatures(layer); - this.refresh(refresh); - } - } - - /** - * Converts the layers to SVG format - * @returns {} - * @memberof ViewManager - */ - layersToSVGStrings() { - return this.view.layersToSVGStrings(); - } - - /** - * Adds all the features of the layer - * @param {Layer} layer Selected layer - * @param {Boolean} refresh Default to true - * @returns {void} - * @memberof ViewManager - * @private - */ - __addAllLayerFeatures(layer: Layer, index: number, refresh = true): void { - for (const key in layer.features) { - const feature = layer.features[key]; - this.addFeature(feature, index, false); - this.refresh(refresh); - } - } - - /** - * Updates all the feature of the layer - * @param {Layer} layer Selected layer - * @param {boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - __updateAllLayerFeatures(layer: Layer, refresh = true): void { - for (const key in layer.features) { - const feature = layer.features[key]; - this.updateFeature(feature, false); - this.refresh(refresh); - } - } - - /** - * Removes all feature of the layer - * @param {Layer} layer Selected layer - * @param {Boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - __removeAllLayerFeatures(layer: Layer, refresh = true): void { - for (const key in layer.features) { - const feature = layer.features[key]; - this.removeFeature(feature, false); - this.refresh(refresh); - } - } - - /** - * Updates layer - * @param {Layer} layer Selected layer to be updated - * @param {boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - updateLayer(layer: Layer, refresh = true): void { - if (this.__isLayerInCurrentDevice(layer)) { - // Missing param - this.refresh(refresh); - } - } - - /** - * Updates the active layer - * @param {Boolean} refresh Default to true - * @returns {void} - * @memberof ViewManager - */ - updateActiveLayer(refresh = true): void { - if(this.activeRenderLayerIndex === null){ - console.warn("Attempting update active layer in view manager with no active layer value"); - return; - } - this.view.setActiveLayer(this.activeRenderLayerIndex as number); - this.refresh(refresh); - } - - /** - * Removes the grid - * @param {Boolean} refresh Default to true - * @returns {void} - * @memberof ViewManager - */ - removeGrid(refresh = true): void { - if (this.__hasCurrentGrid()) { - this.view.removeGrid(); - this.refresh(refresh); - } - } - - /** - * Update grid - * @param {Boolean} refresh Default to true - * @returns {void} - * @memberof ViewManager - */ - updateGrid(refresh = true): void { - if (this.__hasCurrentGrid()) { - this.view.updateGrid(Registry.currentGrid); - this.refresh(refresh); - // Send the EventBus Notification - EventBus.get().emit(EventBus.UPDATE_GRID_SIZE); - } - } - - /** - * Update the alignment marks of the view - * @returns {void} - * @memberof ViewManager - */ - updateAlignmentMarks(): void { - this.view.updateAlignmentMarks(); - } - - /** - * Clear the view - * @returns {void} - * @memberof ViewManager - */ - clear(): void { - this.view.clear(); - } - - /** - * Sets a specific value of zoom - * @param {Number} zoom Zoom value - * @param {boolean} refresh Whether it will refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - setZoom(zoom: number, refresh = true): void { - if (zoom > this.maxZoom) zoom = this.maxZoom; - else if (zoom < this.minZoom) zoom = this.minZoom; - this.view.setZoom(zoom); - this.updateGrid(false); - this.updateAlignmentMarks(); - this.view.updateRatsNest(); - this.view.updateComponentPortsRender(); - - this.updateDevice(Registry.currentDevice!, false); - this.__updateViewTarget(false); - this.refresh(refresh); - } - - /** - * Automatically generates a rectangular border for the device - * @returns {void} - * @memberof ViewManager - */ - generateBorder(): void { - const borderfeature = new EdgeFeature(null, new Params({}, new Map(), new Map())); - - // Get the bounds for the border feature and then update the device dimensions - const xspan = Registry.currentDevice?.getXSpan(); - const yspan = Registry.currentDevice?.getYSpan(); - borderfeature.generateRectEdge(xspan as number, yspan as number); - - // Adding the feature to all the layers - for (const i in Registry.currentDevice!.layers) { - const layer = Registry.currentDevice!.layers[i]; - layer.addFeature(borderfeature); - } - } - - /** - * Accepts a DXF object and then converts it into a feature, an edgeFeature in particular - * @param dxfobject - * @returns {void} - * @memberof ViewManager - */ - importBorder(dxfobject: any): void { - const customborderfeature = new EdgeFeature(null, new Params({}, new Map(), new Map())); - for (const i in dxfobject.entities) { - const foo = new DXFObject(dxfobject.entities[i]); - customborderfeature.addDXFObject(foo); - } - - // Adding the feature to all the layers - if(Registry.currentDevice === null) { - throw new Error("No device selected"); - } - for (const i in Registry.currentDevice.layers) { - const layer = Registry.currentDevice.layers[i]; - layer.addFeature(customborderfeature); - } - - // Get the bounds for the border feature and then update the device dimensions - const bounds = this.view.getRenderedFeature(customborderfeature.ID).bounds; - - Registry.currentDevice?.setXSpan(bounds.width); - Registry.currentDevice?.setYSpan(bounds.height); - // Refresh the view - Registry.viewManager?.view.initializeView(); - Registry.viewManager?.view.refresh(); - } - - /** - * Deletes the border - * @returns {void} - * @memberof ViewManager - */ - deleteBorder(): void { - /* - 1. Find all the features that are EDGE type - 2. Delete all these features - */ - - console.log("Deleting border..."); - - const features = Registry.currentDevice?.getAllFeaturesFromDevice(); - console.log("All features", features); - - const edgefeatures = []; - if (features === undefined){ - throw new Error("No features found"); - } - for (const i in features) { - // Check if the feature is EDGE or not - if (features[i].fabType === "EDGE") { - edgefeatures.push(features[i]); - } - } - - // Delete all the features - for (const i in edgefeatures) { - this.removeFeatureByID(edgefeatures[i].ID); - } - - console.log("Edgefeatures", edgefeatures); - } - - /** - * Removes the target view - * @memberof ViewManager - * @returns {void} - */ - removeTarget(): void { - this.view.removeTarget(); - } - - /** - * Update the target view - * @param {string} featureType - * @param {string} featureSet - * @param {Array} position Array with X and Y coordinates - * @param {boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - updateTarget(featureType: string, featureSet: string, position: Point, currentParameters: { [k: string]: any } | null = null, refresh = true): void { - this.view.addTarget(featureType, featureSet, position, currentParameters); - this.view.updateAlignmentMarks(); - this.view.updateRatsNest(); - this.refresh(refresh); - } - - /** - * Update the view target - * @param {Boolean} refresh Default to true - * @returns {void} - * @memberof ViewManager - */ - __updateViewTarget(refresh = true): void { - this.view.updateTarget(); - this.updateAlignmentMarks(); - this.view.updateRatsNest(); - this.view.updateComponentPortsRender(); - this.refresh(refresh); - } - - /** - * Adjust the zoom value in a certain point - * @param {Number} delta Value of zoom - * @param {Array} point Coordinates to zoom in - * @param {Boolean} refresh Default to true - * @returns {void} - * @memberof ViewManager - */ - adjustZoom(delta: number, point: number[], refresh = true): void { - const belowMin = this.view.getZoom() >= this.maxZoom && delta < 0; - const aboveMax = this.view.getZoom() <= this.minZoom && delta > 0; - if (!aboveMax && !belowMin) { - this.view.adjustZoom(delta, new paper.Point(point)); - this.updateGrid(false); - // this.updateAlignmentMarks(); - this.view.updateRatsNest(); - this.view.updateComponentPortsRender(); - this.updateDevice(Registry.currentDevice!, false); - this.__updateViewTarget(false); - } else { - // console.log("Too big or too small!"); - } - this.refresh(refresh); - } - - /** - * Sets the center value - * @param {Array} center Center coordinates - * @param {Boolean} refresh Default to true - * @returns {void} - * @memberof ViewManager - */ - setCenter(center: number[], refresh = true): void { - this.view.setCenter((center as unknown) as paper.Point); - this.updateGrid(false); - // this.updateAlighmentMarks(); - - this.updateDevice(Registry.currentDevice!, false); - this.refresh(refresh); - } - - /** - * Moves center by a certain value - * @param {number} delta - * @param {boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - moveCenter(delta: paper.Point, refresh = true): void { - this.view.moveCenter(delta); - this.updateGrid(false); - // this.updateAlignmentMarks(); - this.view.updateRatsNest(); - this.view.updateComponentPortsRender(); - this.updateDevice(Registry.currentDevice!, false); - this.refresh(refresh); - } - - /** - * Save the device to JSON format - * @returns {void} - * @memberof ViewManager - */ - saveToStorage(): void { - if (Registry.viewManager) { - try { - localStorage.setItem("currentDevice", JSON.stringify(Registry.viewManager.generateExportJSON())); - } catch (err) { - // can't save, so.. don't? - } - } - } - - /** - * Refresh the view - * @param {boolean} refresh Whether to refresh or not. true by default - * @returns {void} - * @memberof ViewManager - */ - refresh(refresh = true): void { - this.updateQueue.run(); - // Update the toolbar - const spacing = Registry.currentGrid?.getSpacing(); - // TODO - undo this - // this.resolutionToolBar.updateResolutionLabelAndSlider(spacing); - } - - /** - * Gets the coordinates of the project - * @param {*} event - * @returns {Array} Returns the X and Y coordinates - * @memberof ViewManager - */ - getEventPosition(event: any) { - return this.view.getProjectPosition(event.clientX, event.clientY); - } - - /** - * Checks if it has current grid - * @returns {Boolean} - * @memberof ViewManager - */ - __hasCurrentGrid(): boolean { - if (Registry.currentGrid) return true; - else return false; - } - - /** - * Checks if layer is in the current device - * @param {Layer} layer Layer to check if it's on the current device - * @returns {Boolean} - * @memberof ViewManager - */ - __isLayerInCurrentDevice(layer: Layer): boolean { - if (Registry.currentDevice && layer.device === Registry.currentDevice) return true; - else return false; - } - - /** - * Checks if feature is in the current device - * @param {Object} feature Feature to check if it's on the current device - * @returns {Boolean} - * @memberof ViewManager - */ - isFeatureInCurrentDevice(feature: { [k: string]: any }): boolean { - if (Registry.currentDevice && this.__isLayerInCurrentDevice(feature.layer)) return true; - else return false; - } - - /** - * Checks if feature exists - * @param {Feature} feature Feature to check whether in existence - * @returns {Boolean} - * @memberof ViewManager - */ - ensureFeatureExists(feature: Feature): boolean { - for (let i = 0; i < this.renderLayers.length; i++) { - if (this.renderLayers[i].containsFeature(feature)) { - return true; - } - } - return false; - } - - /** - * Loads a device from a JSON format - * @param {JSON} json - * @returns {void} - * @memberof ViewManager - */ - loadDeviceFromJSON(json: InterchangeV1_2): void { - let device; - Registry.viewManager?.clear(); - // Check and see the version number if its 0 or none is present, - // its going the be the legacy format, else it'll be a new format - const version = json.version; - - if (version === null || undefined === version || version === "1" || version == "1.1" || version == "1.2") { - const ret = LoadUtils.loadFromScratch(json); - device = ret[0]; - Registry.currentDevice = device; - this.__currentDevice = device; - - this.renderLayers = ret[1]; - - this.setNameMap(); - // } else if (version == 1.1 || version == "1.1") { - // // this.loadCustomComponents(json); - // device = Device.fromInterchangeV1_1(json); - // Registry.currentDevice = device; - // this.__currentDevice = device; - - // // TODO: Add separate render layers to initializing json, make fromInterchangeV1_1??? - // for (const i in json.layers) { - // const newRenderLayer = RenderLayer.fromInterchangeV1(json.renderLayers[i]); - // this.renderLayers.push(newRenderLayer); - // } - } else { - alert("Version '" + version + "' is not supported by 3DuF !"); - } - // Common Code for rendering stuff - // console.log("Feature Layers", Registry.currentDevice.layers); - this.currentLayer = this.renderLayers[0]; - // Registry.currentTextLayer = Registry.currentDevice!.textLayers[0]; - - this.activeRenderLayerIndex = 0; - - // TODO: Need to replace the need for this function, right now without this, the active layer system gets broken - this.addDevice(Registry.currentDevice!); - - // In case of MINT exported json, generate layouts for rats nests - this.__initializeRatsNest(); - - this.view.initializeView(); - this.updateGrid(); - this.updateDevice(Registry.currentDevice!); - this.refresh(true); - this.currentLayer = this.renderLayers[0]; - // this.layerToolBar.setActiveLayer("0"); - this.updateActiveLayer(); - - - console.log(json.version); - //If older version fix feature locations - if (this.__currentDevice !== null) { - console.log("There"); - console.log("version: ", json.version); - if (json.version == "1" || json.version == "1.1") { - for (const i in this.__currentDevice.components) { - //[center[0] - (center[0] - rect.x), center[1] - (center[1] - rect.y)] - const rect = this.__currentDevice.components[i].getBoundingRectangle(); - const currPos = this.__currentDevice.components[i].getPosition(); - this.__currentDevice.components[i].updateComponentPosition([currPos[0] + (currPos[0] - rect.x), currPos[1] + (currPos[1] - rect.y)]); - } - } - } - } - - /** - * Removes the features of the current device by searching on it's ID - * @param {*} paperElements - * @returns {void} - * @memberof ViewManager - */ - removeFeaturesByPaperElements(paperElements: any): void { - if (paperElements.length > 0) { - for (let i = 0; i < paperElements.length; i++) { - const paperFeature = paperElements[i]; - this.removeFeatureByID(paperFeature.featureID); - } - this.currentSelection = []; - } - } - - /** - * Updates the component parameters of a specific component - * @param {string} componentname - * @param {Array} params - * @returns {void} - * @memberof ViewManager - */ - updateComponentParameters(componentname: string, params: { [k: string]: any }): void { - const component = this.__currentDevice?.getComponentByName(componentname); - for (const key in params) { - component?.updateParameter(key, params[key]); - } - } - - /** - * Returns a Point, coordinate list that is the closes grid coordinate - * @param {Array} point Array with the X and Y coordinates - * @return {void|Array} - * @memberof ViewManager - */ - snapToGrid(point: Point): Point { - if (Registry.currentGrid) - { - const closestpt = Registry.currentGrid.getClosestGridPoint(new paper.Point(point[0], point[1])); - return [closestpt.x, closestpt.y]; - } else { return point; } - } - - /** - * Gets the features of a specific type ? - * @param {string} typeString - * @param {string} setString - * @param {Array} features Array with features - * @returns {Array} Returns array with the features of a specific type - * @memberof ViewManager - */ - getFeaturesOfType(typeString: string, features: Feature[]) { - const output = []; - for (let i = 0; i < features.length; i++) { - const feature = features[i]; - if (feature.getType() === typeString) { - output.push(feature); - } - } - return output; - } - - /** - * Updates all feature parameters - * @param {string} valueString - * @param {*} value - * @param {Array} features Array of features - * @returns {void} - * @memberof ViewManager - */ - adjustAllFeatureParams(valueString: string, value: any, features: Feature[]): void { - for (let i = 0; i < features.length; i++) { - const feature = features[i]; - feature.updateParameter(valueString, value); - } - } - - /** - * Adjust all parameters of the same type - * @param {string} typeString - * @param {string} setString - * @param {string} valueString - * @param {*} value - * @returns {void} - * @memberof ViewManager - */ - adjustParams(typeString: string, valueString: string, value: any): void { - const selectedFeatures = this.view.getSelectedFeatures(); - if (selectedFeatures.length > 0) { - const correctType = this.getFeaturesOfType(typeString, selectedFeatures); - if (correctType.length > 0) { - this.adjustAllFeatureParams(valueString, value, correctType); - } - - // Check if any components are selected - // TODO: modify parameters window to not have chain of updates - // Cycle through all components and connections and change the parameters - for (const i in this.view.selectedComponents) { - this.view.selectedComponents[i].updateParameter(valueString, value); - } - for (const i in this.view.selectedConnections) { - this.view.selectedConnections[i].updateParameter(valueString, value); - } - } else { - this.updateDefault(typeString, valueString, value); - } - } - - /** - * Updates the default feature parameter - * @param {string} typeString - * @param {string} setString - * @param {string} valueString - * @param value - * @returns {void} - * @memberof ViewManager - */ - updateDefault(typeString: string, valueString: string, value: any): void { - // Registry.featureDefaults[setString][typeString][valueString] = value; - const defaults = ComponentAPI.getDefaultsForType(typeString); - defaults[valueString] = value; - } - - /** - * Updates the defaults in the feature - * @param {Feature} feature Feature object - * @returns {void} - * @memberof ViewManager - */ - updateDefaultsFromFeature(feature: Feature): void { - const heritable = feature.getHeritableParams(); - for (const key in heritable) { - this.updateDefault(feature.getType(), key, feature.getValue(key)); - } - } - - /** - * Reverts the feature to default - * @param {string} valueString - * @param {Feature} feature - * @returns {void} - * @memberof ViewManager - */ - revertFieldToDefault(valueString: string, feature: Feature): void { - feature.updateParameter(valueString, ComponentAPI.getDefaultsForType(feature.getType())[valueString]); - } - - /** - * Reverts the feature to params to defaults - * @param {Feature} feature - * @returns {void} - * @memberof ViewManager - */ - revertFeatureToDefaults(feature: Feature): void { - const heritable = feature.getHeritableParams(); - for (const key in heritable) { - this.revertFieldToDefault(key, feature); - } - } - - /** - * Reverts features to defaults - * @param {Array} features Features to revert to default - * @returns {void} - * @memberof ViewManager - */ - revertFeaturesToDefaults(features: Feature[]): void { - for (const feature of features) { - this.revertFeatureToDefaults(feature); - } - } - - /** - * Checks if the point intersects with any other feature - * @param {Array} point Array with the X and Y coordinates - * @return PaperJS rendered Feature - * @memberof ViewManager - */ - hitFeature(point: number[]) { - return this.view.hitFeature((point as unknown) as paper.Point); - } - - /** - * Checks if the point intersects with any other feature - * @param {string} ID of feature object - * @return {Feature} - * @memberof ViewManager - */ - - getFeatureByID(featureID: string) { - const layer = this.getRenderLayerByID(featureID); - return layer.getFeature(featureID); - } - - /** - * Checks if the point intersects with any other feature - * @param {string} ID of feature object - * @return {RenderLayer} - * @memberof ViewManager - */ - getRenderLayerByID(featureID: string) { - for (let i = 0; i < this.renderLayers.length; i++) { - const layer = this.renderLayers[i]; - if (layer.containsFeatureID(featureID)) { - return layer; - } - } - // Should textlayer logic be here or in device? (Currently in device) - // for (let i = 0; i < this.__textLayers.length; i++) { - // let layer = this.__textLayers[i]; - // if (layer.containsFeatureID(featureID)) { - // return layer; - // } - // } - throw new Error("FeatureID " + featureID + " not found in any renderLayer."); - } - - /** - * Checks if the element intersects with any other feature - * @param element - * @return {*|Array} - * @memberof ViewManager - */ - hitFeaturesWithViewElement(element: any): any[] { - return this.view.hitFeaturesWithViewElement(element); - } - - /** - * Activates the given tool - * @param {string} toolString - * @param rightClickToolString - * @returns {void} - * @memberof ViewManager - */ - activateTool(toolString: string, rightClickToolString = "SelectTool"): void { - if (this.tools[toolString] === null) { - throw new Error("Could not find tool with the matching string"); - } - // Cleanup job when activating new tool - this.view.clearSelectedItems(); - - this.mouseAndKeyboardHandler.leftMouseTool = this.tools[toolString]; - this.mouseAndKeyboardHandler.rightMouseTool = this.tools[rightClickToolString]; - this.mouseAndKeyboardHandler.updateViewMouseEvents(); - } - - /** - * Switches to 2D - * @returns {void} - * @memberof ViewManager - */ - switchTo2D(): void { - if (Registry.currentDevice === null){ - throw new Error("No device selected"); - } - if (this.threeD) { - this.threeD = false; - const center = this.renderer.getCameraCenterInMicrometers(); - const zoom = this.renderer.getZoom(); - let newCenterX = center[0]; - if (newCenterX < 0) { - newCenterX = 0; - } else if (newCenterX > Registry.currentDevice.getXSpan()) { - newCenterX = Registry.currentDevice.getXSpan(); - } - let newCenterY = paper.view.center.y - center[1]; - if (newCenterY < 0) { - newCenterY = 0; - } else if (newCenterY > Registry.currentDevice.getYSpan()) { - newCenterY = Registry.currentDevice.getYSpan(); - } - // HTMLUtils.setButtonColor(this.__button2D!, Colors.getDefaultLayerColor((Registry.currentLayer as unknown) as Layer), activeText); - // HTMLUtils.setButtonColor(this.__button3D!, inactiveBackground, inactiveText); - Registry.viewManager!.setCenter((new paper.Point(newCenterX, newCenterY) as unknown) as number[]); - Registry.viewManager!.setZoom(zoom); - // HTMLUtils.addClass(this.__renderBlock!, "hidden-block"); - // HTMLUtils.removeClass(this.__canvasBlock!, "hidden-block"); - // HTMLUtils.removeClass(this.__renderBlock!, "shown-block"); - // HTMLUtils.addClass(this.__canvasBlock!, "shown-block"); - } - } - - /** - * Switches to 3D - * @returns {void} - * @memberof ViewManager - */ - switchTo3D(): void { - if (!this.threeD) { - this.threeD = true; - // setButtonColor(this.__button3D!, Colors.getDefaultLayerColor(Registry.currentLayer as any), activeText); - // setButtonColor(this.__button2D!!, inactiveBackground, inactiveText); - this.renderer.loadJSON((Registry.currentDevice as any).toJSON()); - const cameraCenter = this.view.getViewCenterInMillimeters(); - const height = (Registry.currentDevice as any).params.getValue("height") / 1000; - const pixels = this.view.getDeviceHeightInPixels(); - this.renderer.setupCamera(cameraCenter[0], cameraCenter[1], height, pixels, paper.view.zoom); - this.renderer.showMockup(); - HTMLUtils.removeClass(this.__renderBlock!, "hidden-block"); - HTMLUtils.addClass(this.__canvasBlock!, "hidden-block"); - HTMLUtils.addClass(this.__renderBlock!, "shown-block"); - HTMLUtils.removeClass(this.__canvasBlock!, "shown-block"); - } - } - - /** - * Loads a device from a JSON format when the user drags and drops it on the grid - * @param selector - * @returns {void} - * @memberof ViewManager - */ - setupDragAndDropLoad(selector: string): void { - const dnd = HTMLUtils.DnDFileController(selector, function(files) { - const f = files[0]; - - const reader = new FileReader(); - reader.onloadend = function(e) { - let result = this.result as string; - // try { - let jsonresult = JSON.parse(result); - Registry.viewManager?.loadDeviceFromJSON((jsonresult as unknown) as InterchangeV1_2); - // } catch (error) { - // console.error(error.message); - // alert("Unable to parse the design file, please ensure that the file is not corrupted:\n" + error.message); - // } - }; - try { - reader.readAsText(f); - } catch (err) { - console.log("unable to load JSON: " + f); - } - }); - } - - /** - * Closes the params window - * @returns {void} - * @memberof ViewManager - */ - killParamsWindow(): void { - const paramsWindow = document.getElementById("parameter_menu"); - if (paramsWindow) paramsWindow.parentElement?.removeChild(paramsWindow); - } - - /** - * This method saves the current device to the design history - * @memberof ViewManager - * @returns {void} - */ - saveDeviceState(): void { - console.log("Saving to stack"); - - // TODO - Future versions of the software should be using the saving - // the device as a set of atomic operations and not as the json data - // unless we are using it as a refernce. - const save = JSON.stringify(Registry.currentDevice?.toInterchangeV1([])); - - this.undoStack.pushDesign(save); - } - - /** - * Undoes the recent update - * @returns {void} - * @memberof ViewManager - */ - undo(): void { - const previousdesign = this.undoStack.popDesign(); - console.log(previousdesign); - if (previousdesign) { - const result = JSON.parse(previousdesign); - this.loadDeviceFromJSON(result); - } - } - - /** - * Resets the tool to the default tool - * @returns {void} - * @memberof ViewManager - */ - resetToDefaultTool(): void { - this.cleanupActiveTools(); - this.activateTool("MouseSelectTool"); - // this.activateTool("RenderMouseTool"); - // this.componentToolBar.setActiveButton("SelectButton"); - } - - /** - * Runs cleanup method on the activated tools - * @returns {void} - * @memberof ViewManager - */ - cleanupActiveTools(): void { - if (this.mouseAndKeyboardHandler.leftMouseTool) { - this.mouseAndKeyboardHandler.leftMouseTool.cleanup(); - } - if (this.mouseAndKeyboardHandler.rightMouseTool) { - this.mouseAndKeyboardHandler.rightMouseTool.cleanup(); - } - } - - /** - * Updates the renders for all the connection in the blah - * @returns {void} - * @memberof ViewManager - */ - updatesConnectionRender(connection: Connection): void { - // First Redraw all the segements without valves or insertions - connection.regenerateSegments(); - - // Get all the valves for a connection - const valves = Registry.currentDevice?.getValvesForConnection(connection); - - // Cycle through each of the valves - if (valves === undefined || valves === null) { - throw new Error("Valves are undefined or null when updating connection: " + connection.id); - } - for (const j in valves) { - const valve = valves[j]; - const is3D = Registry.currentDevice?.getValveType(valve); - if (is3D) { - const boundingbox = valve.getBoundingRectangle(); - connection.insertFeatureGap(boundingbox); - } - } - } - - /** - * Shows in the UI a message - * @param {string} message Messsage to display - * @returns {void} - * @memberof ViewManager - */ - showUIMessage(message: string): void { - this.messageBox.MaterialSnackbar.showSnackbar({ - message: message - }); - } - - /** - * Sets up all the tools to be used by the user - * @returns {void} - * @memberof ViewManager - */ - setupTools(): void { - this.tools.MouseSelectTool = new MouseSelectTool(this, this.view); - // this.tools.RenderMouseTool = new RenderMouseTool(this, this.view); - this.tools.InsertTextTool = new InsertTextTool(this); - this.tools.Connection = new ConnectionTool(this, "Connection", "Basic"); - // All the new tools - this.tools.MoveTool = new MoveTool(this); - this.tools.GenerateArrayTool = new GenerateArrayTool(this); - - } - - /** - * Adds a custom component tool - * @param {string} identifier - * @returns {void} - * @memberof ViewManager - */ - addCustomComponentTool(identifier: string): void { - const customcomponent = this.customComponentManager?.getCustomComponent(identifier); - this.tools[identifier] = new CustomComponentPositionTool(this, customcomponent, "Custom"); - } - - /** - * Initialize the default placement for components - * @returns {void} - * @memberof ViewManager - */ - __initializeRatsNest(): void { - // Step 1 generate features for all the components with some basic layout - const components = this.currentDevice?.components; - const xpos = 10000; - const ypos = 10000; - for (const i in components) { - const component = components[parseInt(i)]; - const currentposition = component.getPosition(); - // TODO: Refine this logic, it sucks - if (currentposition[0] === 0 && currentposition[1] === 0) { - if (!component.placed) { - this.__generateDefaultPlacementForComponent(component, xpos * (parseInt(i) + 1), ypos * (Math.floor(parseInt(i) / 5) + 1)); - } - } else { - if (!component.placed) { - this.__generateDefaultPlacementForComponent(component, currentposition[0], currentposition[1]); - } - } - } - - // TODO: Step 2 generate rats nest renders for all the components - - this.view.updateRatsNest(); - this.view.updateComponentPortsRender(); - } - - /** - * Generates the default placement for components - * @param {Component} component - * @param {number} xpos Default X coordinate - * @param {number} ypos Default Y coordinate - * @returns {void} - * @memberof ViewManager - */ - __generateDefaultPlacementForComponent(component: Component, xpos: number, ypos: number): void { - const params_to_copy = component.params.toJSON(); - - params_to_copy.position = [xpos, ypos]; - - // Get default params and overwrite them with json params, this can account for inconsistencies - const renderdefkeys = ComponentAPI.getRenderTypeKeysForMINT(component.mint); - for (let i = 0; i < renderdefkeys?.length!; i++) { - const key = renderdefkeys![i]; - const newFeature = Device.makeFeature(key, params_to_copy); - component.addFeatureID(newFeature.ID); - this.currentLayer.addFeature(newFeature); - } - - // Set the component position - component.updateComponentPosition([xpos, ypos]); - } - - /** - * Generates a JSON format file to export it - * @returns {void} - * @memberof ViewManager - */ - generateExportJSON(errorList:Array = []): InterchangeV1_2 { - const json = ExportUtils.toInterchangeV1_2(this, errorList); - // const json = this.currentDevice.toInterchangeV1_1(); - // json.customComponents = this.customComponentManager.toJSON(); - return json; - } - - /** - * This method attempts to load any custom components that are stored in the custom components property - * @param json - */ - loadCustomComponents(json: { [key: string]: any }): void { - if (Object.prototype.hasOwnProperty.call(json, "customComponents")) { - this.customComponentManager?.loadFromJSON(json.customComponents); - } - } - - /** - * Activates DAFD plugin - * @param {*} params - * @returns {void} - * @memberof ViewManager - */ - activateDAFDPlugin(params: any = null): void { - this.loadDeviceFromJSON(JSON.parse(Examples.dafdtemplate)); - - if (params === null) { - params = { - orificeSize: 750, - orificeLength: 200, - oilInputWidth: 800, - waterInputWidth: 900, - outputWidth: 900, - outputLength: 500, - height: 100 - }; - } - - DAFDPlugin.fixLayout(params); - } - - /** - * This is the method we need to call to fix the valvemaps - * @memberof ViewManager - */ - createValveMapFromSelection():void { - // TODO: Run through the current selection and generate the valve map for every - // vavle that is in the Selection - const selection = this.tools.MouseSelectTool.currentSelection; - const valves = []; - let connection = null; - // TODO: run though the items - for (const render_element of selection) { - // Check if render_element is associated with a VALVE/VALVE3D - const component = this.currentDevice!.getComponentForFeatureID(render_element.featureID); - if (component !== null) { - console.log("Component Type:", component.mint); - const type = (component as any).getType(); - if (type === "VALVE3D" || type === "VALVE") { - valves.push(component); - } - } - - connection = this.currentDevice!.getConnectionForFeatureID(render_element.featureID); - } - - // Add to the valvemap - for (const valve of valves) { - let valve_type = ValveType.NORMALLY_OPEN; - if (valve.mint === "VALVE3D") { - valve_type = ValveType.NORMALLY_CLOSED; - } - console.log("Adding Valve: ", valve); - this.currentDevice!.insertValve(valve, connection!, valve_type); - } - } - - /** - * Activates the corresponding placement tool for the given type of component and returns the active tool - * @param {*} minttype - * @returns - */ - activateComponentPlacementTool(minttype: string, currentParameters: any): PositionTool | ValveInsertionTool | ConnectionTool { - const threeduftype = ComponentAPI.getTypeForMINT(minttype); - if (threeduftype === null) { - throw new Error("Found null when looking for MINT Type"); - } - // Cleanup job when activating new tool - this.view.clearSelectedItems(); - - let activeTool = null; - const renderer = ComponentAPI.getRendererForMINT(minttype); - if (renderer.placementTool === "componentPositionTool") { - activeTool = new ComponentPositionTool(this, threeduftype , "Basic", currentParameters); - } else if (renderer.placementTool === "customComponentPositionTool") { - // activeTool = new CustomComponentPositionTool(ComponentAPI.getTypeForMINT(minttype), "Basic"); - } else if (renderer.placementTool === "positionTool") { - activeTool = new PositionTool(this, threeduftype, currentParameters); - } else if (renderer.placementTool === "multilayerPositionTool") { - activeTool = new MultilayerPositionTool(this, threeduftype, "Basic", currentParameters); - } else if (renderer.placementTool === "valveInsertionTool") { - activeTool = new ValveInsertionTool(this, minttype, "Basic", currentParameters); - } else if (renderer.placementTool === "CellPositionTool") { - activeTool = new CellPositionTool(this, threeduftype, "Basic", currentParameters); - } else if (renderer.placementTool === "multilevelPositionTool") { - // TODO: Add pop up window when using the multilevel position tool to get layer indices - activeTool = new MultilevelPositionTool(this, threeduftype, "Basic", currentParameters); - throw new Error("multilevel position tool ui/input elements not set up"); - }else if(renderer.placementTool === "connectionTool"){ - activeTool = new ConnectionTool(this, threeduftype, "Basic"); - } - - if (activeTool === null) { - throw new Error(`Could not initialize the tool ${minttype}`); - } - - this.mouseAndKeyboardHandler.leftMouseTool = activeTool; - this.mouseAndKeyboardHandler.rightMouseTool = activeTool; - this.mouseAndKeyboardHandler.updateViewMouseEvents(); - - return activeTool; - } - - /** - * Deactivates the current placement tool - * - * @memberof ViewManager - */ - deactivateComponentPlacementTool(): void { - console.log("Deactivating Component Placement Tool"); - this.mouseAndKeyboardHandler.leftMouseTool.deactivate(); - this.mouseAndKeyboardHandler.rightMouseTool.deactivate(); - this.resetToDefaultTool(); - } - - /** - * Returns the spacing for the current grid on the device - * - * @returns - * @memberof ViewManager - */ - getGridSize(): number { - if (this.__grid === null) { - return 0; - } - return this.__grid.spacing; - } - - /** - * Updated the grid size for the current view - * - * @param {number} value - * @memberof ViewManager - */ - updateGridSpacing(value: number):void { - this.__grid.updateGridSpacing(value); - this.updateGrid(); - } - - /** - * Starts the download sequence for the current device - * - * @memberof ViewManager - */ - downloadJSON(): void { - if(this.currentDevice === null){ - throw new Error("No device loaded"); - } - const errorList: Array = []; - const json = new Blob([JSON.stringify(this.generateExportJSON(errorList))], { - type: "application/json" - }); - saveAs(json, this.currentDevice.name + ".json"); - - if (errorList.length > 0) { - // Concatenate all the errors into a single string with newlines and save it as a file - let errorString = ""; - for (const error of errorList) { - errorString += error.toText() + "\n\n"; - } - const errorBlob = new Blob([errorString], { - type: "text/plain" - }); - saveAs(errorBlob, this.currentDevice.name + "_errors.txt"); - } - } - - createNewDevice(name: string): void { - let device = new Device({"x-span": 135000, "y-span": 85000}, name); - console.log("Created new device: ", device.getXSpan(), device.getYSpan()); - this.clear(); - this.__currentDevice = device; - // TODO - Clean up lifecyle for active rendered layers - this.activeRenderLayerIndex = 0; - this.createNewLayerBlock(); - // TODO - Generate render layers - generateRenderLayers(this.__currentDevice); - this.setNameMap(); - - Registry.currentDevice = device; - - this.activeRenderLayerIndex = 0; - - this.addDevice(device); - - // In case of MINT exported json, generate layouts for rats nests - this.__initializeRatsNest(); - - this.view.initializeView(); - this.updateGrid(); - this.updateDevice(Registry.currentDevice!); - this.refresh(true); - this.currentLayer = this.renderLayers[0]; - this.updateActiveLayer(); - - } - - /** - * Ridiculously convoluted method to return the render layers corresponding to the current level - * To be used in the case of creating multi-level components - * @returns {[any, any, any]} - * @memberof ViewManager - */ - getCurrentLevelRenderLayers(): [RenderLayer | null , RenderLayer | null , RenderLayer | null] { - // Get the current level - const currentLevel = this.activeRenderLayerIndex % 3; - let currentFlowLayerIndex = currentLevel * 3 + 0; - let currentControlLayerIndex = currentLevel * 3 + 1; - let currentIntegrationLayerIndex = currentLevel * 3 + 2; - return [this.renderLayers[currentFlowLayerIndex], this.renderLayers[currentControlLayerIndex], this.renderLayers[currentIntegrationLayerIndex]]; - } - - -} diff --git a/src/assets/lib/nouislider/nouislider.d.ts b/src/assets/lib/nouislider/nouislider.d.ts deleted file mode 100644 index ea575eee..00000000 --- a/src/assets/lib/nouislider/nouislider.d.ts +++ /dev/null @@ -1,198 +0,0 @@ -interface CssClasses { - target: string; - base: string; - origin: string; - handle: string; - handleLower: string; - handleUpper: string; - touchArea: string; - horizontal: string; - vertical: string; - background: string; - connect: string; - connects: string; - ltr: string; - rtl: string; - textDirectionLtr: string; - textDirectionRtl: string; - draggable: string; - drag: string; - tap: string; - active: string; - tooltip: string; - pips: string; - pipsHorizontal: string; - pipsVertical: string; - marker: string; - markerHorizontal: string; - markerVertical: string; - markerNormal: string; - markerLarge: string; - markerSub: string; - value: string; - valueHorizontal: string; - valueVertical: string; - valueNormal: string; - valueLarge: string; - valueSub: string; -} -export interface PartialFormatter { - to: (value: number) => string | number; - from?: (value: string) => number | false; -} -export interface Formatter extends PartialFormatter { - from: (value: string) => number | false; -} -export declare enum PipsMode { - Range = "range", - Steps = "steps", - Positions = "positions", - Count = "count", - Values = "values" -} -export declare enum PipsType { - None = -1, - NoValue = 0, - LargeValue = 1, - SmallValue = 2 -} -declare type WrappedSubRange = [number] | [number, number]; -declare type SubRange = number | WrappedSubRange; -interface Range { - min: SubRange; - max: SubRange; - [key: string]: SubRange; -} -interface BasePips { - mode: PipsMode; - density?: number; - filter?: PipsFilter; - format?: PartialFormatter; -} -interface PositionsPips extends BasePips { - mode: PipsMode.Positions; - values: number[]; - stepped?: boolean; -} -interface ValuesPips extends BasePips { - mode: PipsMode.Values; - values: number[]; - stepped?: boolean; -} -interface CountPips extends BasePips { - mode: PipsMode.Count; - values: number; - stepped?: boolean; -} -interface StepsPips extends BasePips { - mode: PipsMode.Steps; -} -interface RangePips extends BasePips { - mode: PipsMode.Range; -} -declare type Pips = PositionsPips | ValuesPips | CountPips | StepsPips | RangePips; -declare type StartValues = string | number | (string | number)[]; -declare type HandleAttributes = { - [key: string]: string; -}; -interface UpdatableOptions { - range?: Range; - start?: StartValues; - margin?: number; - limit?: number; - padding?: number | number[]; - snap?: boolean; - step?: number; - pips?: Pips; - format?: Formatter; - tooltips?: boolean | PartialFormatter | (boolean | PartialFormatter)[]; - animate?: boolean; -} -export interface Options extends UpdatableOptions { - range: Range; - connect?: "lower" | "upper" | boolean | boolean[]; - orientation?: "vertical" | "horizontal"; - direction?: "ltr" | "rtl"; - behaviour?: string; - keyboardSupport?: boolean; - keyboardPageMultiplier?: number; - keyboardMultiplier?: number; - keyboardDefaultStep?: number; - documentElement?: HTMLElement; - cssPrefix?: string; - cssClasses?: CssClasses; - ariaFormat?: PartialFormatter; - animationDuration?: number; - handleAttributes?: HandleAttributes[]; -} -export interface API { - destroy: () => void; - steps: () => NextStepsForHandle[]; - on: (eventName: string, callback: EventCallback) => void; - off: (eventName: string) => void; - get: (unencoded?: boolean) => GetResult; - set: (input: number | string | (number | string)[], fireSetEvent?: boolean, exactInput?: boolean) => void; - setHandle: (handleNumber: number, value: number | string, fireSetEvent?: boolean, exactInput?: boolean) => void; - reset: (fireSetEvent?: boolean) => void; - options: Options; - updateOptions: (optionsToUpdate: UpdatableOptions, fireSetEvent: boolean) => void; - target: HTMLElement; - removePips: () => void; - removeTooltips: () => void; - getTooltips: () => { - [handleNumber: number]: HTMLElement | false; - }; - getOrigins: () => { - [handleNumber: number]: HTMLElement; - }; - pips: (grid: Pips) => HTMLElement; -} -interface TargetElement extends HTMLElement { - noUiSlider?: API; -} -interface NearByStep { - startValue: number; - step: number | false; - highestStep: number; -} -interface NearBySteps { - stepBefore: NearByStep; - thisStep: NearByStep; - stepAfter: NearByStep; -} -declare type GetResult = number | string | (string | number)[]; -declare type NextStepsForHandle = [number | false | null, number | false | null]; -declare type PipsFilter = (value: number, type: PipsType) => PipsType; -declare type EventCallback = (this: API, values: (number | string)[], handleNumber: number, unencoded: number[], tap: boolean, locations: number[], slider: API) => void; -declare class Spectrum { - xPct: number[]; - xVal: number[]; - xSteps: (number | false)[]; - xNumSteps: (number | false)[]; - protected xHighestCompleteStep: number[]; - protected snap: boolean; - constructor(entry: Range, snap: boolean, singleStep: number); - getDistance(value: number): number[]; - getAbsoluteDistance(value: number, distances: number[] | null, direction: boolean): number; - toStepping(value: number): number; - fromStepping(value: number): number; - getStep(value: number): number; - getDefaultStep(value: number, isDown: boolean, size: number): number; - getNearbySteps(value: number): NearBySteps; - countStepDecimals(): number; - hasNoSize(): boolean; - convert(value: number): number; - private handleEntryPoint; - private handleStepPoint; -} -declare const cssClasses: CssClasses; -declare function initialize(target: TargetElement, originalOptions: Options): API; -export { TargetElement as target }; -export { initialize as create }; -export { cssClasses }; -declare const _default: { - __spectrum: typeof Spectrum; - cssClasses: CssClasses; - create: typeof initialize; -}; -export default _default; diff --git a/src/assets/lib/nouislider/nouislider.js b/src/assets/lib/nouislider/nouislider.js deleted file mode 100644 index 01fc0bc1..00000000 --- a/src/assets/lib/nouislider/nouislider.js +++ /dev/null @@ -1,2254 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.noUiSlider = {})); -})(this, (function (exports) { 'use strict'; - - exports.PipsMode = void 0; - (function (PipsMode) { - PipsMode["Range"] = "range"; - PipsMode["Steps"] = "steps"; - PipsMode["Positions"] = "positions"; - PipsMode["Count"] = "count"; - PipsMode["Values"] = "values"; - })(exports.PipsMode || (exports.PipsMode = {})); - exports.PipsType = void 0; - (function (PipsType) { - PipsType[PipsType["None"] = -1] = "None"; - PipsType[PipsType["NoValue"] = 0] = "NoValue"; - PipsType[PipsType["LargeValue"] = 1] = "LargeValue"; - PipsType[PipsType["SmallValue"] = 2] = "SmallValue"; - })(exports.PipsType || (exports.PipsType = {})); - //region Helper Methods - function isValidFormatter(entry) { - return isValidPartialFormatter(entry) && typeof entry.from === "function"; - } - function isValidPartialFormatter(entry) { - // partial formatters only need a to function and not a from function - return typeof entry === "object" && typeof entry.to === "function"; - } - function removeElement(el) { - el.parentElement.removeChild(el); - } - function isSet(value) { - return value !== null && value !== undefined; - } - // Bindable version - function preventDefault(e) { - e.preventDefault(); - } - // Removes duplicates from an array. - function unique(array) { - return array.filter(function (a) { - return !this[a] ? (this[a] = true) : false; - }, {}); - } - // Round a value to the closest 'to'. - function closest(value, to) { - return Math.round(value / to) * to; - } - // Current position of an element relative to the document. - function offset(elem, orientation) { - var rect = elem.getBoundingClientRect(); - var doc = elem.ownerDocument; - var docElem = doc.documentElement; - var pageOffset = getPageOffset(doc); - // getBoundingClientRect contains left scroll in Chrome on Android. - // I haven't found a feature detection that proves this. Worst case - // scenario on mis-match: the 'tap' feature on horizontal sliders breaks. - if (/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)) { - pageOffset.x = 0; - } - return orientation ? rect.top + pageOffset.y - docElem.clientTop : rect.left + pageOffset.x - docElem.clientLeft; - } - // Checks whether a value is numerical. - function isNumeric(a) { - return typeof a === "number" && !isNaN(a) && isFinite(a); - } - // Sets a class and removes it after [duration] ms. - function addClassFor(element, className, duration) { - if (duration > 0) { - addClass(element, className); - setTimeout(function () { - removeClass(element, className); - }, duration); - } - } - // Limits a value to 0 - 100 - function limit(a) { - return Math.max(Math.min(a, 100), 0); - } - // Wraps a variable as an array, if it isn't one yet. - // Note that an input array is returned by reference! - function asArray(a) { - return Array.isArray(a) ? a : [a]; - } - // Counts decimals - function countDecimals(numStr) { - numStr = String(numStr); - var pieces = numStr.split("."); - return pieces.length > 1 ? pieces[1].length : 0; - } - // http://youmightnotneedjquery.com/#add_class - function addClass(el, className) { - if (el.classList && !/\s/.test(className)) { - el.classList.add(className); - } - else { - el.className += " " + className; - } - } - // http://youmightnotneedjquery.com/#remove_class - function removeClass(el, className) { - if (el.classList && !/\s/.test(className)) { - el.classList.remove(className); - } - else { - el.className = el.className.replace(new RegExp("(^|\\b)" + className.split(" ").join("|") + "(\\b|$)", "gi"), " "); - } - } - // https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/ - function hasClass(el, className) { - return el.classList ? el.classList.contains(className) : new RegExp("\\b" + className + "\\b").test(el.className); - } - // https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes - function getPageOffset(doc) { - var supportPageOffset = window.pageXOffset !== undefined; - var isCSS1Compat = (doc.compatMode || "") === "CSS1Compat"; - var x = supportPageOffset - ? window.pageXOffset - : isCSS1Compat - ? doc.documentElement.scrollLeft - : doc.body.scrollLeft; - var y = supportPageOffset - ? window.pageYOffset - : isCSS1Compat - ? doc.documentElement.scrollTop - : doc.body.scrollTop; - return { - x: x, - y: y, - }; - } - // we provide a function to compute constants instead - // of accessing window.* as soon as the module needs it - // so that we do not compute anything if not needed - function getActions() { - // Determine the events to bind. IE11 implements pointerEvents without - // a prefix, which breaks compatibility with the IE10 implementation. - return window.navigator.pointerEnabled - ? { - start: "pointerdown", - move: "pointermove", - end: "pointerup", - } - : window.navigator.msPointerEnabled - ? { - start: "MSPointerDown", - move: "MSPointerMove", - end: "MSPointerUp", - } - : { - start: "mousedown touchstart", - move: "mousemove touchmove", - end: "mouseup touchend", - }; - } - // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md - // Issue #785 - function getSupportsPassive() { - var supportsPassive = false; - /* eslint-disable */ - try { - var opts = Object.defineProperty({}, "passive", { - get: function () { - supportsPassive = true; - }, - }); - // @ts-ignore - window.addEventListener("test", null, opts); - } - catch (e) { } - /* eslint-enable */ - return supportsPassive; - } - function getSupportsTouchActionNone() { - return window.CSS && CSS.supports && CSS.supports("touch-action", "none"); - } - //endregion - //region Range Calculation - // Determine the size of a sub-range in relation to a full range. - function subRangeRatio(pa, pb) { - return 100 / (pb - pa); - } - // (percentage) How many percent is this value of this range? - function fromPercentage(range, value, startRange) { - return (value * 100) / (range[startRange + 1] - range[startRange]); - } - // (percentage) Where is this value on this range? - function toPercentage(range, value) { - return fromPercentage(range, range[0] < 0 ? value + Math.abs(range[0]) : value - range[0], 0); - } - // (value) How much is this percentage on this range? - function isPercentage(range, value) { - return (value * (range[1] - range[0])) / 100 + range[0]; - } - function getJ(value, arr) { - var j = 1; - while (value >= arr[j]) { - j += 1; - } - return j; - } - // (percentage) Input a value, find where, on a scale of 0-100, it applies. - function toStepping(xVal, xPct, value) { - if (value >= xVal.slice(-1)[0]) { - return 100; - } - var j = getJ(value, xVal); - var va = xVal[j - 1]; - var vb = xVal[j]; - var pa = xPct[j - 1]; - var pb = xPct[j]; - return pa + toPercentage([va, vb], value) / subRangeRatio(pa, pb); - } - // (value) Input a percentage, find where it is on the specified range. - function fromStepping(xVal, xPct, value) { - // There is no range group that fits 100 - if (value >= 100) { - return xVal.slice(-1)[0]; - } - var j = getJ(value, xPct); - var va = xVal[j - 1]; - var vb = xVal[j]; - var pa = xPct[j - 1]; - var pb = xPct[j]; - return isPercentage([va, vb], (value - pa) * subRangeRatio(pa, pb)); - } - // (percentage) Get the step that applies at a certain value. - function getStep(xPct, xSteps, snap, value) { - if (value === 100) { - return value; - } - var j = getJ(value, xPct); - var a = xPct[j - 1]; - var b = xPct[j]; - // If 'snap' is set, steps are used as fixed points on the slider. - if (snap) { - // Find the closest position, a or b. - if (value - a > (b - a) / 2) { - return b; - } - return a; - } - if (!xSteps[j - 1]) { - return value; - } - return xPct[j - 1] + closest(value - xPct[j - 1], xSteps[j - 1]); - } - //endregion - //region Spectrum - var Spectrum = /** @class */ (function () { - function Spectrum(entry, snap, singleStep) { - this.xPct = []; - this.xVal = []; - this.xSteps = []; - this.xNumSteps = []; - this.xHighestCompleteStep = []; - this.xSteps = [singleStep || false]; - this.xNumSteps = [false]; - this.snap = snap; - var index; - var ordered = []; - // Map the object keys to an array. - Object.keys(entry).forEach(function (index) { - ordered.push([asArray(entry[index]), index]); - }); - // Sort all entries by value (numeric sort). - ordered.sort(function (a, b) { - return a[0][0] - b[0][0]; - }); - // Convert all entries to subranges. - for (index = 0; index < ordered.length; index++) { - this.handleEntryPoint(ordered[index][1], ordered[index][0]); - } - // Store the actual step values. - // xSteps is sorted in the same order as xPct and xVal. - this.xNumSteps = this.xSteps.slice(0); - // Convert all numeric steps to the percentage of the subrange they represent. - for (index = 0; index < this.xNumSteps.length; index++) { - this.handleStepPoint(index, this.xNumSteps[index]); - } - } - Spectrum.prototype.getDistance = function (value) { - var distances = []; - for (var index = 0; index < this.xNumSteps.length - 1; index++) { - distances[index] = fromPercentage(this.xVal, value, index); - } - return distances; - }; - // Calculate the percentual distance over the whole scale of ranges. - // direction: 0 = backwards / 1 = forwards - Spectrum.prototype.getAbsoluteDistance = function (value, distances, direction) { - var xPct_index = 0; - // Calculate range where to start calculation - if (value < this.xPct[this.xPct.length - 1]) { - while (value > this.xPct[xPct_index + 1]) { - xPct_index++; - } - } - else if (value === this.xPct[this.xPct.length - 1]) { - xPct_index = this.xPct.length - 2; - } - // If looking backwards and the value is exactly at a range separator then look one range further - if (!direction && value === this.xPct[xPct_index + 1]) { - xPct_index++; - } - if (distances === null) { - distances = []; - } - var start_factor; - var rest_factor = 1; - var rest_rel_distance = distances[xPct_index]; - var range_pct = 0; - var rel_range_distance = 0; - var abs_distance_counter = 0; - var range_counter = 0; - // Calculate what part of the start range the value is - if (direction) { - start_factor = (value - this.xPct[xPct_index]) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]); - } - else { - start_factor = (this.xPct[xPct_index + 1] - value) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]); - } - // Do until the complete distance across ranges is calculated - while (rest_rel_distance > 0) { - // Calculate the percentage of total range - range_pct = this.xPct[xPct_index + 1 + range_counter] - this.xPct[xPct_index + range_counter]; - // Detect if the margin, padding or limit is larger then the current range and calculate - if (distances[xPct_index + range_counter] * rest_factor + 100 - start_factor * 100 > 100) { - // If larger then take the percentual distance of the whole range - rel_range_distance = range_pct * start_factor; - // Rest factor of relative percentual distance still to be calculated - rest_factor = (rest_rel_distance - 100 * start_factor) / distances[xPct_index + range_counter]; - // Set start factor to 1 as for next range it does not apply. - start_factor = 1; - } - else { - // If smaller or equal then take the percentual distance of the calculate percentual part of that range - rel_range_distance = ((distances[xPct_index + range_counter] * range_pct) / 100) * rest_factor; - // No rest left as the rest fits in current range - rest_factor = 0; - } - if (direction) { - abs_distance_counter = abs_distance_counter - rel_range_distance; - // Limit range to first range when distance becomes outside of minimum range - if (this.xPct.length + range_counter >= 1) { - range_counter--; - } - } - else { - abs_distance_counter = abs_distance_counter + rel_range_distance; - // Limit range to last range when distance becomes outside of maximum range - if (this.xPct.length - range_counter >= 1) { - range_counter++; - } - } - // Rest of relative percentual distance still to be calculated - rest_rel_distance = distances[xPct_index + range_counter] * rest_factor; - } - return value + abs_distance_counter; - }; - Spectrum.prototype.toStepping = function (value) { - value = toStepping(this.xVal, this.xPct, value); - return value; - }; - Spectrum.prototype.fromStepping = function (value) { - return fromStepping(this.xVal, this.xPct, value); - }; - Spectrum.prototype.getStep = function (value) { - value = getStep(this.xPct, this.xSteps, this.snap, value); - return value; - }; - Spectrum.prototype.getDefaultStep = function (value, isDown, size) { - var j = getJ(value, this.xPct); - // When at the top or stepping down, look at the previous sub-range - if (value === 100 || (isDown && value === this.xPct[j - 1])) { - j = Math.max(j - 1, 1); - } - return (this.xVal[j] - this.xVal[j - 1]) / size; - }; - Spectrum.prototype.getNearbySteps = function (value) { - var j = getJ(value, this.xPct); - return { - stepBefore: { - startValue: this.xVal[j - 2], - step: this.xNumSteps[j - 2], - highestStep: this.xHighestCompleteStep[j - 2], - }, - thisStep: { - startValue: this.xVal[j - 1], - step: this.xNumSteps[j - 1], - highestStep: this.xHighestCompleteStep[j - 1], - }, - stepAfter: { - startValue: this.xVal[j], - step: this.xNumSteps[j], - highestStep: this.xHighestCompleteStep[j], - }, - }; - }; - Spectrum.prototype.countStepDecimals = function () { - var stepDecimals = this.xNumSteps.map(countDecimals); - return Math.max.apply(null, stepDecimals); - }; - Spectrum.prototype.hasNoSize = function () { - return this.xVal[0] === this.xVal[this.xVal.length - 1]; - }; - // Outside testing - Spectrum.prototype.convert = function (value) { - return this.getStep(this.toStepping(value)); - }; - Spectrum.prototype.handleEntryPoint = function (index, value) { - var percentage; - // Covert min/max syntax to 0 and 100. - if (index === "min") { - percentage = 0; - } - else if (index === "max") { - percentage = 100; - } - else { - percentage = parseFloat(index); - } - // Check for correct input. - if (!isNumeric(percentage) || !isNumeric(value[0])) { - throw new Error("noUiSlider: 'range' value isn't numeric."); - } - // Store values. - this.xPct.push(percentage); - this.xVal.push(value[0]); - var value1 = Number(value[1]); - // NaN will evaluate to false too, but to keep - // logging clear, set step explicitly. Make sure - // not to override the 'step' setting with false. - if (!percentage) { - if (!isNaN(value1)) { - this.xSteps[0] = value1; - } - } - else { - this.xSteps.push(isNaN(value1) ? false : value1); - } - this.xHighestCompleteStep.push(0); - }; - Spectrum.prototype.handleStepPoint = function (i, n) { - // Ignore 'false' stepping. - if (!n) { - return; - } - // Step over zero-length ranges (#948); - if (this.xVal[i] === this.xVal[i + 1]) { - this.xSteps[i] = this.xHighestCompleteStep[i] = this.xVal[i]; - return; - } - // Factor to range ratio - this.xSteps[i] = - fromPercentage([this.xVal[i], this.xVal[i + 1]], n, 0) / subRangeRatio(this.xPct[i], this.xPct[i + 1]); - var totalSteps = (this.xVal[i + 1] - this.xVal[i]) / this.xNumSteps[i]; - var highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1); - var step = this.xVal[i] + this.xNumSteps[i] * highestStep; - this.xHighestCompleteStep[i] = step; - }; - return Spectrum; - }()); - //endregion - //region Options - /* Every input option is tested and parsed. This will prevent - endless validation in internal methods. These tests are - structured with an item for every option available. An - option can be marked as required by setting the 'r' flag. - The testing function is provided with three arguments: - - The provided value for the option; - - A reference to the options object; - - The name for the option; - - The testing function returns false when an error is detected, - or true when everything is OK. It can also modify the option - object, to make sure all values can be correctly looped elsewhere. */ - //region Defaults - var defaultFormatter = { - to: function (value) { - return value === undefined ? "" : value.toFixed(2); - }, - from: Number, - }; - var cssClasses = { - target: "target", - base: "base", - origin: "origin", - handle: "handle", - handleLower: "handle-lower", - handleUpper: "handle-upper", - touchArea: "touch-area", - horizontal: "horizontal", - vertical: "vertical", - background: "background", - connect: "connect", - connects: "connects", - ltr: "ltr", - rtl: "rtl", - textDirectionLtr: "txt-dir-ltr", - textDirectionRtl: "txt-dir-rtl", - draggable: "draggable", - drag: "state-drag", - tap: "state-tap", - active: "active", - tooltip: "tooltip", - pips: "pips", - pipsHorizontal: "pips-horizontal", - pipsVertical: "pips-vertical", - marker: "marker", - markerHorizontal: "marker-horizontal", - markerVertical: "marker-vertical", - markerNormal: "marker-normal", - markerLarge: "marker-large", - markerSub: "marker-sub", - value: "value", - valueHorizontal: "value-horizontal", - valueVertical: "value-vertical", - valueNormal: "value-normal", - valueLarge: "value-large", - valueSub: "value-sub", - }; - // Namespaces of internal event listeners - var INTERNAL_EVENT_NS = { - tooltips: ".__tooltips", - aria: ".__aria", - }; - //endregion - function testStep(parsed, entry) { - if (!isNumeric(entry)) { - throw new Error("noUiSlider: 'step' is not numeric."); - } - // The step option can still be used to set stepping - // for linear sliders. Overwritten if set in 'range'. - parsed.singleStep = entry; - } - function testKeyboardPageMultiplier(parsed, entry) { - if (!isNumeric(entry)) { - throw new Error("noUiSlider: 'keyboardPageMultiplier' is not numeric."); - } - parsed.keyboardPageMultiplier = entry; - } - function testKeyboardMultiplier(parsed, entry) { - if (!isNumeric(entry)) { - throw new Error("noUiSlider: 'keyboardMultiplier' is not numeric."); - } - parsed.keyboardMultiplier = entry; - } - function testKeyboardDefaultStep(parsed, entry) { - if (!isNumeric(entry)) { - throw new Error("noUiSlider: 'keyboardDefaultStep' is not numeric."); - } - parsed.keyboardDefaultStep = entry; - } - function testRange(parsed, entry) { - // Filter incorrect input. - if (typeof entry !== "object" || Array.isArray(entry)) { - throw new Error("noUiSlider: 'range' is not an object."); - } - // Catch missing start or end. - if (entry.min === undefined || entry.max === undefined) { - throw new Error("noUiSlider: Missing 'min' or 'max' in 'range'."); - } - parsed.spectrum = new Spectrum(entry, parsed.snap || false, parsed.singleStep); - } - function testStart(parsed, entry) { - entry = asArray(entry); - // Validate input. Values aren't tested, as the public .val method - // will always provide a valid location. - if (!Array.isArray(entry) || !entry.length) { - throw new Error("noUiSlider: 'start' option is incorrect."); - } - // Store the number of handles. - parsed.handles = entry.length; - // When the slider is initialized, the .val method will - // be called with the start options. - parsed.start = entry; - } - function testSnap(parsed, entry) { - if (typeof entry !== "boolean") { - throw new Error("noUiSlider: 'snap' option must be a boolean."); - } - // Enforce 100% stepping within subranges. - parsed.snap = entry; - } - function testAnimate(parsed, entry) { - if (typeof entry !== "boolean") { - throw new Error("noUiSlider: 'animate' option must be a boolean."); - } - // Enforce 100% stepping within subranges. - parsed.animate = entry; - } - function testAnimationDuration(parsed, entry) { - if (typeof entry !== "number") { - throw new Error("noUiSlider: 'animationDuration' option must be a number."); - } - parsed.animationDuration = entry; - } - function testConnect(parsed, entry) { - var connect = [false]; - var i; - // Map legacy options - if (entry === "lower") { - entry = [true, false]; - } - else if (entry === "upper") { - entry = [false, true]; - } - // Handle boolean options - if (entry === true || entry === false) { - for (i = 1; i < parsed.handles; i++) { - connect.push(entry); - } - connect.push(false); - } - // Reject invalid input - else if (!Array.isArray(entry) || !entry.length || entry.length !== parsed.handles + 1) { - throw new Error("noUiSlider: 'connect' option doesn't match handle count."); - } - else { - connect = entry; - } - parsed.connect = connect; - } - function testOrientation(parsed, entry) { - // Set orientation to an a numerical value for easy - // array selection. - switch (entry) { - case "horizontal": - parsed.ort = 0; - break; - case "vertical": - parsed.ort = 1; - break; - default: - throw new Error("noUiSlider: 'orientation' option is invalid."); - } - } - function testMargin(parsed, entry) { - if (!isNumeric(entry)) { - throw new Error("noUiSlider: 'margin' option must be numeric."); - } - // Issue #582 - if (entry === 0) { - return; - } - parsed.margin = parsed.spectrum.getDistance(entry); - } - function testLimit(parsed, entry) { - if (!isNumeric(entry)) { - throw new Error("noUiSlider: 'limit' option must be numeric."); - } - parsed.limit = parsed.spectrum.getDistance(entry); - if (!parsed.limit || parsed.handles < 2) { - throw new Error("noUiSlider: 'limit' option is only supported on linear sliders with 2 or more handles."); - } - } - function testPadding(parsed, entry) { - var index; - if (!isNumeric(entry) && !Array.isArray(entry)) { - throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers."); - } - if (Array.isArray(entry) && !(entry.length === 2 || isNumeric(entry[0]) || isNumeric(entry[1]))) { - throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers."); - } - if (entry === 0) { - return; - } - if (!Array.isArray(entry)) { - entry = [entry, entry]; - } - // 'getDistance' returns false for invalid values. - parsed.padding = [parsed.spectrum.getDistance(entry[0]), parsed.spectrum.getDistance(entry[1])]; - for (index = 0; index < parsed.spectrum.xNumSteps.length - 1; index++) { - // last "range" can't contain step size as it is purely an endpoint. - if (parsed.padding[0][index] < 0 || parsed.padding[1][index] < 0) { - throw new Error("noUiSlider: 'padding' option must be a positive number(s)."); - } - } - var totalPadding = entry[0] + entry[1]; - var firstValue = parsed.spectrum.xVal[0]; - var lastValue = parsed.spectrum.xVal[parsed.spectrum.xVal.length - 1]; - if (totalPadding / (lastValue - firstValue) > 1) { - throw new Error("noUiSlider: 'padding' option must not exceed 100% of the range."); - } - } - function testDirection(parsed, entry) { - // Set direction as a numerical value for easy parsing. - // Invert connection for RTL sliders, so that the proper - // handles get the connect/background classes. - switch (entry) { - case "ltr": - parsed.dir = 0; - break; - case "rtl": - parsed.dir = 1; - break; - default: - throw new Error("noUiSlider: 'direction' option was not recognized."); - } - } - function testBehaviour(parsed, entry) { - // Make sure the input is a string. - if (typeof entry !== "string") { - throw new Error("noUiSlider: 'behaviour' must be a string containing options."); - } - // Check if the string contains any keywords. - // None are required. - var tap = entry.indexOf("tap") >= 0; - var drag = entry.indexOf("drag") >= 0; - var fixed = entry.indexOf("fixed") >= 0; - var snap = entry.indexOf("snap") >= 0; - var hover = entry.indexOf("hover") >= 0; - var unconstrained = entry.indexOf("unconstrained") >= 0; - var dragAll = entry.indexOf("drag-all") >= 0; - var smoothSteps = entry.indexOf("smooth-steps") >= 0; - if (fixed) { - if (parsed.handles !== 2) { - throw new Error("noUiSlider: 'fixed' behaviour must be used with 2 handles"); - } - // Use margin to enforce fixed state - testMargin(parsed, parsed.start[1] - parsed.start[0]); - } - if (unconstrained && (parsed.margin || parsed.limit)) { - throw new Error("noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit"); - } - parsed.events = { - tap: tap || snap, - drag: drag, - dragAll: dragAll, - smoothSteps: smoothSteps, - fixed: fixed, - snap: snap, - hover: hover, - unconstrained: unconstrained, - }; - } - function testTooltips(parsed, entry) { - if (entry === false) { - return; - } - if (entry === true || isValidPartialFormatter(entry)) { - parsed.tooltips = []; - for (var i = 0; i < parsed.handles; i++) { - parsed.tooltips.push(entry); - } - } - else { - entry = asArray(entry); - if (entry.length !== parsed.handles) { - throw new Error("noUiSlider: must pass a formatter for all handles."); - } - entry.forEach(function (formatter) { - if (typeof formatter !== "boolean" && !isValidPartialFormatter(formatter)) { - throw new Error("noUiSlider: 'tooltips' must be passed a formatter or 'false'."); - } - }); - parsed.tooltips = entry; - } - } - function testHandleAttributes(parsed, entry) { - if (entry.length !== parsed.handles) { - throw new Error("noUiSlider: must pass a attributes for all handles."); - } - parsed.handleAttributes = entry; - } - function testAriaFormat(parsed, entry) { - if (!isValidPartialFormatter(entry)) { - throw new Error("noUiSlider: 'ariaFormat' requires 'to' method."); - } - parsed.ariaFormat = entry; - } - function testFormat(parsed, entry) { - if (!isValidFormatter(entry)) { - throw new Error("noUiSlider: 'format' requires 'to' and 'from' methods."); - } - parsed.format = entry; - } - function testKeyboardSupport(parsed, entry) { - if (typeof entry !== "boolean") { - throw new Error("noUiSlider: 'keyboardSupport' option must be a boolean."); - } - parsed.keyboardSupport = entry; - } - function testDocumentElement(parsed, entry) { - // This is an advanced option. Passed values are used without validation. - parsed.documentElement = entry; - } - function testCssPrefix(parsed, entry) { - if (typeof entry !== "string" && entry !== false) { - throw new Error("noUiSlider: 'cssPrefix' must be a string or `false`."); - } - parsed.cssPrefix = entry; - } - function testCssClasses(parsed, entry) { - if (typeof entry !== "object") { - throw new Error("noUiSlider: 'cssClasses' must be an object."); - } - if (typeof parsed.cssPrefix === "string") { - parsed.cssClasses = {}; - Object.keys(entry).forEach(function (key) { - parsed.cssClasses[key] = parsed.cssPrefix + entry[key]; - }); - } - else { - parsed.cssClasses = entry; - } - } - // Test all developer settings and parse to assumption-safe values. - function testOptions(options) { - // To prove a fix for #537, freeze options here. - // If the object is modified, an error will be thrown. - // Object.freeze(options); - var parsed = { - margin: null, - limit: null, - padding: null, - animate: true, - animationDuration: 300, - ariaFormat: defaultFormatter, - format: defaultFormatter, - }; - // Tests are executed in the order they are presented here. - var tests = { - step: { r: false, t: testStep }, - keyboardPageMultiplier: { r: false, t: testKeyboardPageMultiplier }, - keyboardMultiplier: { r: false, t: testKeyboardMultiplier }, - keyboardDefaultStep: { r: false, t: testKeyboardDefaultStep }, - start: { r: true, t: testStart }, - connect: { r: true, t: testConnect }, - direction: { r: true, t: testDirection }, - snap: { r: false, t: testSnap }, - animate: { r: false, t: testAnimate }, - animationDuration: { r: false, t: testAnimationDuration }, - range: { r: true, t: testRange }, - orientation: { r: false, t: testOrientation }, - margin: { r: false, t: testMargin }, - limit: { r: false, t: testLimit }, - padding: { r: false, t: testPadding }, - behaviour: { r: true, t: testBehaviour }, - ariaFormat: { r: false, t: testAriaFormat }, - format: { r: false, t: testFormat }, - tooltips: { r: false, t: testTooltips }, - keyboardSupport: { r: true, t: testKeyboardSupport }, - documentElement: { r: false, t: testDocumentElement }, - cssPrefix: { r: true, t: testCssPrefix }, - cssClasses: { r: true, t: testCssClasses }, - handleAttributes: { r: false, t: testHandleAttributes }, - }; - var defaults = { - connect: false, - direction: "ltr", - behaviour: "tap", - orientation: "horizontal", - keyboardSupport: true, - cssPrefix: "noUi-", - cssClasses: cssClasses, - keyboardPageMultiplier: 5, - keyboardMultiplier: 1, - keyboardDefaultStep: 10, - }; - // AriaFormat defaults to regular format, if any. - if (options.format && !options.ariaFormat) { - options.ariaFormat = options.format; - } - // Run all options through a testing mechanism to ensure correct - // input. It should be noted that options might get modified to - // be handled properly. E.g. wrapping integers in arrays. - Object.keys(tests).forEach(function (name) { - // If the option isn't set, but it is required, throw an error. - if (!isSet(options[name]) && defaults[name] === undefined) { - if (tests[name].r) { - throw new Error("noUiSlider: '" + name + "' is required."); - } - return; - } - tests[name].t(parsed, !isSet(options[name]) ? defaults[name] : options[name]); - }); - // Forward pips options - parsed.pips = options.pips; - // All recent browsers accept unprefixed transform. - // We need -ms- for IE9 and -webkit- for older Android; - // Assume use of -webkit- if unprefixed and -ms- are not supported. - // https://caniuse.com/#feat=transforms2d - var d = document.createElement("div"); - var msPrefix = d.style.msTransform !== undefined; - var noPrefix = d.style.transform !== undefined; - parsed.transformRule = noPrefix ? "transform" : msPrefix ? "msTransform" : "webkitTransform"; - // Pips don't move, so we can place them using left/top. - var styles = [ - ["left", "top"], - ["right", "bottom"], - ]; - parsed.style = styles[parsed.dir][parsed.ort]; - return parsed; - } - //endregion - function scope(target, options, originalOptions) { - var actions = getActions(); - var supportsTouchActionNone = getSupportsTouchActionNone(); - var supportsPassive = supportsTouchActionNone && getSupportsPassive(); - // All variables local to 'scope' are prefixed with 'scope_' - // Slider DOM Nodes - var scope_Target = target; - var scope_Base; - var scope_Handles; - var scope_Connects; - var scope_Pips; - var scope_Tooltips; - // Slider state values - var scope_Spectrum = options.spectrum; - var scope_Values = []; - var scope_Locations = []; - var scope_HandleNumbers = []; - var scope_ActiveHandlesCount = 0; - var scope_Events = {}; - // Document Nodes - var scope_Document = target.ownerDocument; - var scope_DocumentElement = options.documentElement || scope_Document.documentElement; - var scope_Body = scope_Document.body; - // For horizontal sliders in standard ltr documents, - // make .noUi-origin overflow to the left so the document doesn't scroll. - var scope_DirOffset = scope_Document.dir === "rtl" || options.ort === 1 ? 0 : 100; - // Creates a node, adds it to target, returns the new node. - function addNodeTo(addTarget, className) { - var div = scope_Document.createElement("div"); - if (className) { - addClass(div, className); - } - addTarget.appendChild(div); - return div; - } - // Append a origin to the base - function addOrigin(base, handleNumber) { - var origin = addNodeTo(base, options.cssClasses.origin); - var handle = addNodeTo(origin, options.cssClasses.handle); - addNodeTo(handle, options.cssClasses.touchArea); - handle.setAttribute("data-handle", String(handleNumber)); - if (options.keyboardSupport) { - // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex - // 0 = focusable and reachable - handle.setAttribute("tabindex", "0"); - handle.addEventListener("keydown", function (event) { - return eventKeydown(event, handleNumber); - }); - } - if (options.handleAttributes !== undefined) { - var attributes_1 = options.handleAttributes[handleNumber]; - Object.keys(attributes_1).forEach(function (attribute) { - handle.setAttribute(attribute, attributes_1[attribute]); - }); - } - handle.setAttribute("role", "slider"); - handle.setAttribute("aria-orientation", options.ort ? "vertical" : "horizontal"); - if (handleNumber === 0) { - addClass(handle, options.cssClasses.handleLower); - } - else if (handleNumber === options.handles - 1) { - addClass(handle, options.cssClasses.handleUpper); - } - return origin; - } - // Insert nodes for connect elements - function addConnect(base, add) { - if (!add) { - return false; - } - return addNodeTo(base, options.cssClasses.connect); - } - // Add handles to the slider base. - function addElements(connectOptions, base) { - var connectBase = addNodeTo(base, options.cssClasses.connects); - scope_Handles = []; - scope_Connects = []; - scope_Connects.push(addConnect(connectBase, connectOptions[0])); - // [::::O====O====O====] - // connectOptions = [0, 1, 1, 1] - for (var i = 0; i < options.handles; i++) { - // Keep a list of all added handles. - scope_Handles.push(addOrigin(base, i)); - scope_HandleNumbers[i] = i; - scope_Connects.push(addConnect(connectBase, connectOptions[i + 1])); - } - } - // Initialize a single slider. - function addSlider(addTarget) { - // Apply classes and data to the target. - addClass(addTarget, options.cssClasses.target); - if (options.dir === 0) { - addClass(addTarget, options.cssClasses.ltr); - } - else { - addClass(addTarget, options.cssClasses.rtl); - } - if (options.ort === 0) { - addClass(addTarget, options.cssClasses.horizontal); - } - else { - addClass(addTarget, options.cssClasses.vertical); - } - var textDirection = getComputedStyle(addTarget).direction; - if (textDirection === "rtl") { - addClass(addTarget, options.cssClasses.textDirectionRtl); - } - else { - addClass(addTarget, options.cssClasses.textDirectionLtr); - } - return addNodeTo(addTarget, options.cssClasses.base); - } - function addTooltip(handle, handleNumber) { - if (!options.tooltips || !options.tooltips[handleNumber]) { - return false; - } - return addNodeTo(handle.firstChild, options.cssClasses.tooltip); - } - function isSliderDisabled() { - return scope_Target.hasAttribute("disabled"); - } - // Disable the slider dragging if any handle is disabled - function isHandleDisabled(handleNumber) { - var handleOrigin = scope_Handles[handleNumber]; - return handleOrigin.hasAttribute("disabled"); - } - function removeTooltips() { - if (scope_Tooltips) { - removeEvent("update" + INTERNAL_EVENT_NS.tooltips); - scope_Tooltips.forEach(function (tooltip) { - if (tooltip) { - removeElement(tooltip); - } - }); - scope_Tooltips = null; - } - } - // The tooltips option is a shorthand for using the 'update' event. - function tooltips() { - removeTooltips(); - // Tooltips are added with options.tooltips in original order. - scope_Tooltips = scope_Handles.map(addTooltip); - bindEvent("update" + INTERNAL_EVENT_NS.tooltips, function (values, handleNumber, unencoded) { - if (!scope_Tooltips || !options.tooltips) { - return; - } - if (scope_Tooltips[handleNumber] === false) { - return; - } - var formattedValue = values[handleNumber]; - if (options.tooltips[handleNumber] !== true) { - formattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]); - } - scope_Tooltips[handleNumber].innerHTML = formattedValue; - }); - } - function aria() { - removeEvent("update" + INTERNAL_EVENT_NS.aria); - bindEvent("update" + INTERNAL_EVENT_NS.aria, function (values, handleNumber, unencoded, tap, positions) { - // Update Aria Values for all handles, as a change in one changes min and max values for the next. - scope_HandleNumbers.forEach(function (index) { - var handle = scope_Handles[index]; - var min = checkHandlePosition(scope_Locations, index, 0, true, true, true); - var max = checkHandlePosition(scope_Locations, index, 100, true, true, true); - var now = positions[index]; - // Formatted value for display - var text = String(options.ariaFormat.to(unencoded[index])); - // Map to slider range values - min = scope_Spectrum.fromStepping(min).toFixed(1); - max = scope_Spectrum.fromStepping(max).toFixed(1); - now = scope_Spectrum.fromStepping(now).toFixed(1); - handle.children[0].setAttribute("aria-valuemin", min); - handle.children[0].setAttribute("aria-valuemax", max); - handle.children[0].setAttribute("aria-valuenow", now); - handle.children[0].setAttribute("aria-valuetext", text); - }); - }); - } - function getGroup(pips) { - // Use the range. - if (pips.mode === exports.PipsMode.Range || pips.mode === exports.PipsMode.Steps) { - return scope_Spectrum.xVal; - } - if (pips.mode === exports.PipsMode.Count) { - if (pips.values < 2) { - throw new Error("noUiSlider: 'values' (>= 2) required for mode 'count'."); - } - // Divide 0 - 100 in 'count' parts. - var interval = pips.values - 1; - var spread = 100 / interval; - var values = []; - // List these parts and have them handled as 'positions'. - while (interval--) { - values[interval] = interval * spread; - } - values.push(100); - return mapToRange(values, pips.stepped); - } - if (pips.mode === exports.PipsMode.Positions) { - // Map all percentages to on-range values. - return mapToRange(pips.values, pips.stepped); - } - if (pips.mode === exports.PipsMode.Values) { - // If the value must be stepped, it needs to be converted to a percentage first. - if (pips.stepped) { - return pips.values.map(function (value) { - // Convert to percentage, apply step, return to value. - return scope_Spectrum.fromStepping(scope_Spectrum.getStep(scope_Spectrum.toStepping(value))); - }); - } - // Otherwise, we can simply use the values. - return pips.values; - } - return []; // pips.mode = never - } - function mapToRange(values, stepped) { - return values.map(function (value) { - return scope_Spectrum.fromStepping(stepped ? scope_Spectrum.getStep(value) : value); - }); - } - function generateSpread(pips) { - function safeIncrement(value, increment) { - // Avoid floating point variance by dropping the smallest decimal places. - return Number((value + increment).toFixed(7)); - } - var group = getGroup(pips); - var indexes = {}; - var firstInRange = scope_Spectrum.xVal[0]; - var lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length - 1]; - var ignoreFirst = false; - var ignoreLast = false; - var prevPct = 0; - // Create a copy of the group, sort it and filter away all duplicates. - group = unique(group.slice().sort(function (a, b) { - return a - b; - })); - // Make sure the range starts with the first element. - if (group[0] !== firstInRange) { - group.unshift(firstInRange); - ignoreFirst = true; - } - // Likewise for the last one. - if (group[group.length - 1] !== lastInRange) { - group.push(lastInRange); - ignoreLast = true; - } - group.forEach(function (current, index) { - // Get the current step and the lower + upper positions. - var step; - var i; - var q; - var low = current; - var high = group[index + 1]; - var newPct; - var pctDifference; - var pctPos; - var type; - var steps; - var realSteps; - var stepSize; - var isSteps = pips.mode === exports.PipsMode.Steps; - // When using 'steps' mode, use the provided steps. - // Otherwise, we'll step on to the next subrange. - if (isSteps) { - step = scope_Spectrum.xNumSteps[index]; - } - // Default to a 'full' step. - if (!step) { - step = high - low; - } - // If high is undefined we are at the last subrange. Make sure it iterates once (#1088) - if (high === undefined) { - high = low; - } - // Make sure step isn't 0, which would cause an infinite loop (#654) - step = Math.max(step, 0.0000001); - // Find all steps in the subrange. - for (i = low; i <= high; i = safeIncrement(i, step)) { - // Get the percentage value for the current step, - // calculate the size for the subrange. - newPct = scope_Spectrum.toStepping(i); - pctDifference = newPct - prevPct; - steps = pctDifference / (pips.density || 1); - realSteps = Math.round(steps); - // This ratio represents the amount of percentage-space a point indicates. - // For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-divided. - // Round the percentage offset to an even number, then divide by two - // to spread the offset on both sides of the range. - stepSize = pctDifference / realSteps; - // Divide all points evenly, adding the correct number to this subrange. - // Run up to <= so that 100% gets a point, event if ignoreLast is set. - for (q = 1; q <= realSteps; q += 1) { - // The ratio between the rounded value and the actual size might be ~1% off. - // Correct the percentage offset by the number of points - // per subrange. density = 1 will result in 100 points on the - // full range, 2 for 50, 4 for 25, etc. - pctPos = prevPct + q * stepSize; - indexes[pctPos.toFixed(5)] = [scope_Spectrum.fromStepping(pctPos), 0]; - } - // Determine the point type. - type = group.indexOf(i) > -1 ? exports.PipsType.LargeValue : isSteps ? exports.PipsType.SmallValue : exports.PipsType.NoValue; - // Enforce the 'ignoreFirst' option by overwriting the type for 0. - if (!index && ignoreFirst && i !== high) { - type = 0; - } - if (!(i === high && ignoreLast)) { - // Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value. - indexes[newPct.toFixed(5)] = [i, type]; - } - // Update the percentage count. - prevPct = newPct; - } - }); - return indexes; - } - function addMarking(spread, filterFunc, formatter) { - var _a, _b; - var element = scope_Document.createElement("div"); - var valueSizeClasses = (_a = {}, - _a[exports.PipsType.None] = "", - _a[exports.PipsType.NoValue] = options.cssClasses.valueNormal, - _a[exports.PipsType.LargeValue] = options.cssClasses.valueLarge, - _a[exports.PipsType.SmallValue] = options.cssClasses.valueSub, - _a); - var markerSizeClasses = (_b = {}, - _b[exports.PipsType.None] = "", - _b[exports.PipsType.NoValue] = options.cssClasses.markerNormal, - _b[exports.PipsType.LargeValue] = options.cssClasses.markerLarge, - _b[exports.PipsType.SmallValue] = options.cssClasses.markerSub, - _b); - var valueOrientationClasses = [options.cssClasses.valueHorizontal, options.cssClasses.valueVertical]; - var markerOrientationClasses = [options.cssClasses.markerHorizontal, options.cssClasses.markerVertical]; - addClass(element, options.cssClasses.pips); - addClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical); - function getClasses(type, source) { - var a = source === options.cssClasses.value; - var orientationClasses = a ? valueOrientationClasses : markerOrientationClasses; - var sizeClasses = a ? valueSizeClasses : markerSizeClasses; - return source + " " + orientationClasses[options.ort] + " " + sizeClasses[type]; - } - function addSpread(offset, value, type) { - // Apply the filter function, if it is set. - type = filterFunc ? filterFunc(value, type) : type; - if (type === exports.PipsType.None) { - return; - } - // Add a marker for every point - var node = addNodeTo(element, false); - node.className = getClasses(type, options.cssClasses.marker); - node.style[options.style] = offset + "%"; - // Values are only appended for points marked '1' or '2'. - if (type > exports.PipsType.NoValue) { - node = addNodeTo(element, false); - node.className = getClasses(type, options.cssClasses.value); - node.setAttribute("data-value", String(value)); - node.style[options.style] = offset + "%"; - node.innerHTML = String(formatter.to(value)); - } - } - // Append all points. - Object.keys(spread).forEach(function (offset) { - addSpread(offset, spread[offset][0], spread[offset][1]); - }); - return element; - } - function removePips() { - if (scope_Pips) { - removeElement(scope_Pips); - scope_Pips = null; - } - } - function pips(pips) { - // Fix #669 - removePips(); - var spread = generateSpread(pips); - var filter = pips.filter; - var format = pips.format || { - to: function (value) { - return String(Math.round(value)); - }, - }; - scope_Pips = scope_Target.appendChild(addMarking(spread, filter, format)); - return scope_Pips; - } - // Shorthand for base dimensions. - function baseSize() { - var rect = scope_Base.getBoundingClientRect(); - var alt = ("offset" + ["Width", "Height"][options.ort]); - return options.ort === 0 ? rect.width || scope_Base[alt] : rect.height || scope_Base[alt]; - } - // Handler for attaching events trough a proxy. - function attachEvent(events, element, callback, data) { - // This function can be used to 'filter' events to the slider. - // element is a node, not a nodeList - var method = function (event) { - var e = fixEvent(event, data.pageOffset, data.target || element); - // fixEvent returns false if this event has a different target - // when handling (multi-) touch events; - if (!e) { - return false; - } - // doNotReject is passed by all end events to make sure released touches - // are not rejected, leaving the slider "stuck" to the cursor; - if (isSliderDisabled() && !data.doNotReject) { - return false; - } - // Stop if an active 'tap' transition is taking place. - if (hasClass(scope_Target, options.cssClasses.tap) && !data.doNotReject) { - return false; - } - // Ignore right or middle clicks on start #454 - if (events === actions.start && e.buttons !== undefined && e.buttons > 1) { - return false; - } - // Ignore right or middle clicks on start #454 - if (data.hover && e.buttons) { - return false; - } - // 'supportsPassive' is only true if a browser also supports touch-action: none in CSS. - // iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support - // touch-action: manipulation, but that allows panning, which breaks - // sliders after zooming/on non-responsive pages. - // See: https://bugs.webkit.org/show_bug.cgi?id=133112 - if (!supportsPassive) { - e.preventDefault(); - } - e.calcPoint = e.points[options.ort]; - // Call the event handler with the event [ and additional data ]. - callback(e, data); - return; - }; - var methods = []; - // Bind a closure on the target for every event type. - events.split(" ").forEach(function (eventName) { - element.addEventListener(eventName, method, supportsPassive ? { passive: true } : false); - methods.push([eventName, method]); - }); - return methods; - } - // Provide a clean event with standardized offset values. - function fixEvent(e, pageOffset, eventTarget) { - // Filter the event to register the type, which can be - // touch, mouse or pointer. Offset changes need to be - // made on an event specific basis. - var touch = e.type.indexOf("touch") === 0; - var mouse = e.type.indexOf("mouse") === 0; - var pointer = e.type.indexOf("pointer") === 0; - var x = 0; - var y = 0; - // IE10 implemented pointer events with a prefix; - if (e.type.indexOf("MSPointer") === 0) { - pointer = true; - } - // Erroneous events seem to be passed in occasionally on iOS/iPadOS after user finishes interacting with - // the slider. They appear to be of type MouseEvent, yet they don't have usual properties set. Ignore - // events that have no touches or buttons associated with them. (#1057, #1079, #1095) - if (e.type === "mousedown" && !e.buttons && !e.touches) { - return false; - } - // The only thing one handle should be concerned about is the touches that originated on top of it. - if (touch) { - // Returns true if a touch originated on the target. - var isTouchOnTarget = function (checkTouch) { - var target = checkTouch.target; - return (target === eventTarget || - eventTarget.contains(target) || - (e.composed && e.composedPath().shift() === eventTarget)); - }; - // In the case of touchstart events, we need to make sure there is still no more than one - // touch on the target so we look amongst all touches. - if (e.type === "touchstart") { - var targetTouches = Array.prototype.filter.call(e.touches, isTouchOnTarget); - // Do not support more than one touch per handle. - if (targetTouches.length > 1) { - return false; - } - x = targetTouches[0].pageX; - y = targetTouches[0].pageY; - } - else { - // In the other cases, find on changedTouches is enough. - var targetTouch = Array.prototype.find.call(e.changedTouches, isTouchOnTarget); - // Cancel if the target touch has not moved. - if (!targetTouch) { - return false; - } - x = targetTouch.pageX; - y = targetTouch.pageY; - } - } - pageOffset = pageOffset || getPageOffset(scope_Document); - if (mouse || pointer) { - x = e.clientX + pageOffset.x; - y = e.clientY + pageOffset.y; - } - e.pageOffset = pageOffset; - e.points = [x, y]; - e.cursor = mouse || pointer; // Fix #435 - return e; - } - // Translate a coordinate in the document to a percentage on the slider - function calcPointToPercentage(calcPoint) { - var location = calcPoint - offset(scope_Base, options.ort); - var proposal = (location * 100) / baseSize(); - // Clamp proposal between 0% and 100% - // Out-of-bound coordinates may occur when .noUi-base pseudo-elements - // are used (e.g. contained handles feature) - proposal = limit(proposal); - return options.dir ? 100 - proposal : proposal; - } - // Find handle closest to a certain percentage on the slider - function getClosestHandle(clickedPosition) { - var smallestDifference = 100; - var handleNumber = false; - scope_Handles.forEach(function (handle, index) { - // Disabled handles are ignored - if (isHandleDisabled(index)) { - return; - } - var handlePosition = scope_Locations[index]; - var differenceWithThisHandle = Math.abs(handlePosition - clickedPosition); - // Initial state - var clickAtEdge = differenceWithThisHandle === 100 && smallestDifference === 100; - // Difference with this handle is smaller than the previously checked handle - var isCloser = differenceWithThisHandle < smallestDifference; - var isCloserAfter = differenceWithThisHandle <= smallestDifference && clickedPosition > handlePosition; - if (isCloser || isCloserAfter || clickAtEdge) { - handleNumber = index; - smallestDifference = differenceWithThisHandle; - } - }); - return handleNumber; - } - // Fire 'end' when a mouse or pen leaves the document. - function documentLeave(event, data) { - if (event.type === "mouseout" && - event.target.nodeName === "HTML" && - event.relatedTarget === null) { - eventEnd(event, data); - } - } - // Handle movement on document for handle and range drag. - function eventMove(event, data) { - // Fix #498 - // Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty). - // https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero - // IE9 has .buttons and .which zero on mousemove. - // Firefox breaks the spec MDN defines. - if (navigator.appVersion.indexOf("MSIE 9") === -1 && event.buttons === 0 && data.buttonsProperty !== 0) { - return eventEnd(event, data); - } - // Check if we are moving up or down - var movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint); - // Convert the movement into a percentage of the slider width/height - var proposal = (movement * 100) / data.baseSize; - moveHandles(movement > 0, proposal, data.locations, data.handleNumbers, data.connect); - } - // Unbind move events on document, call callbacks. - function eventEnd(event, data) { - // The handle is no longer active, so remove the class. - if (data.handle) { - removeClass(data.handle, options.cssClasses.active); - scope_ActiveHandlesCount -= 1; - } - // Unbind the move and end events, which are added on 'start'. - data.listeners.forEach(function (c) { - scope_DocumentElement.removeEventListener(c[0], c[1]); - }); - if (scope_ActiveHandlesCount === 0) { - // Remove dragging class. - removeClass(scope_Target, options.cssClasses.drag); - setZindex(); - // Remove cursor styles and text-selection events bound to the body. - if (event.cursor) { - scope_Body.style.cursor = ""; - scope_Body.removeEventListener("selectstart", preventDefault); - } - } - if (options.events.smoothSteps) { - data.handleNumbers.forEach(function (handleNumber) { - setHandle(handleNumber, scope_Locations[handleNumber], true, true, false, false); - }); - data.handleNumbers.forEach(function (handleNumber) { - fireEvent("update", handleNumber); - }); - } - data.handleNumbers.forEach(function (handleNumber) { - fireEvent("change", handleNumber); - fireEvent("set", handleNumber); - fireEvent("end", handleNumber); - }); - } - // Bind move events on document. - function eventStart(event, data) { - // Ignore event if any handle is disabled - if (data.handleNumbers.some(isHandleDisabled)) { - return; - } - var handle; - if (data.handleNumbers.length === 1) { - var handleOrigin = scope_Handles[data.handleNumbers[0]]; - handle = handleOrigin.children[0]; - scope_ActiveHandlesCount += 1; - // Mark the handle as 'active' so it can be styled. - addClass(handle, options.cssClasses.active); - } - // A drag should never propagate up to the 'tap' event. - event.stopPropagation(); - // Record the event listeners. - var listeners = []; - // Attach the move and end events. - var moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, { - // The event target has changed so we need to propagate the original one so that we keep - // relying on it to extract target touches. - target: event.target, - handle: handle, - connect: data.connect, - listeners: listeners, - startCalcPoint: event.calcPoint, - baseSize: baseSize(), - pageOffset: event.pageOffset, - handleNumbers: data.handleNumbers, - buttonsProperty: event.buttons, - locations: scope_Locations.slice(), - }); - var endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, { - target: event.target, - handle: handle, - listeners: listeners, - doNotReject: true, - handleNumbers: data.handleNumbers, - }); - var outEvent = attachEvent("mouseout", scope_DocumentElement, documentLeave, { - target: event.target, - handle: handle, - listeners: listeners, - doNotReject: true, - handleNumbers: data.handleNumbers, - }); - // We want to make sure we pushed the listeners in the listener list rather than creating - // a new one as it has already been passed to the event handlers. - listeners.push.apply(listeners, moveEvent.concat(endEvent, outEvent)); - // Text selection isn't an issue on touch devices, - // so adding cursor styles can be skipped. - if (event.cursor) { - // Prevent the 'I' cursor and extend the range-drag cursor. - scope_Body.style.cursor = getComputedStyle(event.target).cursor; - // Mark the target with a dragging state. - if (scope_Handles.length > 1) { - addClass(scope_Target, options.cssClasses.drag); - } - // Prevent text selection when dragging the handles. - // In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move, - // which is scroll blocking. The selectstart event is supported by FireFox starting from version 52, - // meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there. - // The 'cursor' flag is false. - // See: http://caniuse.com/#search=selectstart - scope_Body.addEventListener("selectstart", preventDefault, false); - } - data.handleNumbers.forEach(function (handleNumber) { - fireEvent("start", handleNumber); - }); - } - // Move closest handle to tapped location. - function eventTap(event) { - // The tap event shouldn't propagate up - event.stopPropagation(); - var proposal = calcPointToPercentage(event.calcPoint); - var handleNumber = getClosestHandle(proposal); - // Tackle the case that all handles are 'disabled'. - if (handleNumber === false) { - return; - } - // Flag the slider as it is now in a transitional state. - // Transition takes a configurable amount of ms (default 300). Re-enable the slider after that. - if (!options.events.snap) { - addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration); - } - setHandle(handleNumber, proposal, true, true); - setZindex(); - fireEvent("slide", handleNumber, true); - fireEvent("update", handleNumber, true); - if (!options.events.snap) { - fireEvent("change", handleNumber, true); - fireEvent("set", handleNumber, true); - } - else { - eventStart(event, { handleNumbers: [handleNumber] }); - } - } - // Fires a 'hover' event for a hovered mouse/pen position. - function eventHover(event) { - var proposal = calcPointToPercentage(event.calcPoint); - var to = scope_Spectrum.getStep(proposal); - var value = scope_Spectrum.fromStepping(to); - Object.keys(scope_Events).forEach(function (targetEvent) { - if ("hover" === targetEvent.split(".")[0]) { - scope_Events[targetEvent].forEach(function (callback) { - callback.call(scope_Self, value); - }); - } - }); - } - // Handles keydown on focused handles - // Don't move the document when pressing arrow keys on focused handles - function eventKeydown(event, handleNumber) { - if (isSliderDisabled() || isHandleDisabled(handleNumber)) { - return false; - } - var horizontalKeys = ["Left", "Right"]; - var verticalKeys = ["Down", "Up"]; - var largeStepKeys = ["PageDown", "PageUp"]; - var edgeKeys = ["Home", "End"]; - if (options.dir && !options.ort) { - // On an right-to-left slider, the left and right keys act inverted - horizontalKeys.reverse(); - } - else if (options.ort && !options.dir) { - // On a top-to-bottom slider, the up and down keys act inverted - verticalKeys.reverse(); - largeStepKeys.reverse(); - } - // Strip "Arrow" for IE compatibility. https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key - var key = event.key.replace("Arrow", ""); - var isLargeDown = key === largeStepKeys[0]; - var isLargeUp = key === largeStepKeys[1]; - var isDown = key === verticalKeys[0] || key === horizontalKeys[0] || isLargeDown; - var isUp = key === verticalKeys[1] || key === horizontalKeys[1] || isLargeUp; - var isMin = key === edgeKeys[0]; - var isMax = key === edgeKeys[1]; - if (!isDown && !isUp && !isMin && !isMax) { - return true; - } - event.preventDefault(); - var to; - if (isUp || isDown) { - var direction = isDown ? 0 : 1; - var steps = getNextStepsForHandle(handleNumber); - var step = steps[direction]; - // At the edge of a slider, do nothing - if (step === null) { - return false; - } - // No step set, use the default of 10% of the sub-range - if (step === false) { - step = scope_Spectrum.getDefaultStep(scope_Locations[handleNumber], isDown, options.keyboardDefaultStep); - } - if (isLargeUp || isLargeDown) { - step *= options.keyboardPageMultiplier; - } - else { - step *= options.keyboardMultiplier; - } - // Step over zero-length ranges (#948); - step = Math.max(step, 0.0000001); - // Decrement for down steps - step = (isDown ? -1 : 1) * step; - to = scope_Values[handleNumber] + step; - } - else if (isMax) { - // End key - to = options.spectrum.xVal[options.spectrum.xVal.length - 1]; - } - else { - // Home key - to = options.spectrum.xVal[0]; - } - setHandle(handleNumber, scope_Spectrum.toStepping(to), true, true); - fireEvent("slide", handleNumber); - fireEvent("update", handleNumber); - fireEvent("change", handleNumber); - fireEvent("set", handleNumber); - return false; - } - // Attach events to several slider parts. - function bindSliderEvents(behaviour) { - // Attach the standard drag event to the handles. - if (!behaviour.fixed) { - scope_Handles.forEach(function (handle, index) { - // These events are only bound to the visual handle - // element, not the 'real' origin element. - attachEvent(actions.start, handle.children[0], eventStart, { - handleNumbers: [index], - }); - }); - } - // Attach the tap event to the slider base. - if (behaviour.tap) { - attachEvent(actions.start, scope_Base, eventTap, {}); - } - // Fire hover events - if (behaviour.hover) { - attachEvent(actions.move, scope_Base, eventHover, { - hover: true, - }); - } - // Make the range draggable. - if (behaviour.drag) { - scope_Connects.forEach(function (connect, index) { - if (connect === false || index === 0 || index === scope_Connects.length - 1) { - return; - } - var handleBefore = scope_Handles[index - 1]; - var handleAfter = scope_Handles[index]; - var eventHolders = [connect]; - var handlesToDrag = [handleBefore, handleAfter]; - var handleNumbersToDrag = [index - 1, index]; - addClass(connect, options.cssClasses.draggable); - // When the range is fixed, the entire range can - // be dragged by the handles. The handle in the first - // origin will propagate the start event upward, - // but it needs to be bound manually on the other. - if (behaviour.fixed) { - eventHolders.push(handleBefore.children[0]); - eventHolders.push(handleAfter.children[0]); - } - if (behaviour.dragAll) { - handlesToDrag = scope_Handles; - handleNumbersToDrag = scope_HandleNumbers; - } - eventHolders.forEach(function (eventHolder) { - attachEvent(actions.start, eventHolder, eventStart, { - handles: handlesToDrag, - handleNumbers: handleNumbersToDrag, - connect: connect, - }); - }); - }); - } - } - // Attach an event to this slider, possibly including a namespace - function bindEvent(namespacedEvent, callback) { - scope_Events[namespacedEvent] = scope_Events[namespacedEvent] || []; - scope_Events[namespacedEvent].push(callback); - // If the event bound is 'update,' fire it immediately for all handles. - if (namespacedEvent.split(".")[0] === "update") { - scope_Handles.forEach(function (a, index) { - fireEvent("update", index); - }); - } - } - function isInternalNamespace(namespace) { - return namespace === INTERNAL_EVENT_NS.aria || namespace === INTERNAL_EVENT_NS.tooltips; - } - // Undo attachment of event - function removeEvent(namespacedEvent) { - var event = namespacedEvent && namespacedEvent.split(".")[0]; - var namespace = event ? namespacedEvent.substring(event.length) : namespacedEvent; - Object.keys(scope_Events).forEach(function (bind) { - var tEvent = bind.split(".")[0]; - var tNamespace = bind.substring(tEvent.length); - if ((!event || event === tEvent) && (!namespace || namespace === tNamespace)) { - // only delete protected internal event if intentional - if (!isInternalNamespace(tNamespace) || namespace === tNamespace) { - delete scope_Events[bind]; - } - } - }); - } - // External event handling - function fireEvent(eventName, handleNumber, tap) { - Object.keys(scope_Events).forEach(function (targetEvent) { - var eventType = targetEvent.split(".")[0]; - if (eventName === eventType) { - scope_Events[targetEvent].forEach(function (callback) { - callback.call( - // Use the slider public API as the scope ('this') - scope_Self, - // Return values as array, so arg_1[arg_2] is always valid. - scope_Values.map(options.format.to), - // Handle index, 0 or 1 - handleNumber, - // Un-formatted slider values - scope_Values.slice(), - // Event is fired by tap, true or false - tap || false, - // Left offset of the handle, in relation to the slider - scope_Locations.slice(), - // add the slider public API to an accessible parameter when this is unavailable - scope_Self); - }); - } - }); - } - // Split out the handle positioning logic so the Move event can use it, too - function checkHandlePosition(reference, handleNumber, to, lookBackward, lookForward, getValue, smoothSteps) { - var distance; - // For sliders with multiple handles, limit movement to the other handle. - // Apply the margin option by adding it to the handle positions. - if (scope_Handles.length > 1 && !options.events.unconstrained) { - if (lookBackward && handleNumber > 0) { - distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.margin, false); - to = Math.max(to, distance); - } - if (lookForward && handleNumber < scope_Handles.length - 1) { - distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.margin, true); - to = Math.min(to, distance); - } - } - // The limit option has the opposite effect, limiting handles to a - // maximum distance from another. Limit must be > 0, as otherwise - // handles would be unmovable. - if (scope_Handles.length > 1 && options.limit) { - if (lookBackward && handleNumber > 0) { - distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.limit, false); - to = Math.min(to, distance); - } - if (lookForward && handleNumber < scope_Handles.length - 1) { - distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.limit, true); - to = Math.max(to, distance); - } - } - // The padding option keeps the handles a certain distance from the - // edges of the slider. Padding must be > 0. - if (options.padding) { - if (handleNumber === 0) { - distance = scope_Spectrum.getAbsoluteDistance(0, options.padding[0], false); - to = Math.max(to, distance); - } - if (handleNumber === scope_Handles.length - 1) { - distance = scope_Spectrum.getAbsoluteDistance(100, options.padding[1], true); - to = Math.min(to, distance); - } - } - if (!smoothSteps) { - to = scope_Spectrum.getStep(to); - } - // Limit percentage to the 0 - 100 range - to = limit(to); - // Return false if handle can't move - if (to === reference[handleNumber] && !getValue) { - return false; - } - return to; - } - // Uses slider orientation to create CSS rules. a = base value; - function inRuleOrder(v, a) { - var o = options.ort; - return (o ? a : v) + ", " + (o ? v : a); - } - // Moves handle(s) by a percentage - // (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...]) - function moveHandles(upward, proposal, locations, handleNumbers, connect) { - var proposals = locations.slice(); - // Store first handle now, so we still have it in case handleNumbers is reversed - var firstHandle = handleNumbers[0]; - var smoothSteps = options.events.smoothSteps; - var b = [!upward, upward]; - var f = [upward, !upward]; - // Copy handleNumbers so we don't change the dataset - handleNumbers = handleNumbers.slice(); - // Check to see which handle is 'leading'. - // If that one can't move the second can't either. - if (upward) { - handleNumbers.reverse(); - } - // Step 1: get the maximum percentage that any of the handles can move - if (handleNumbers.length > 1) { - handleNumbers.forEach(function (handleNumber, o) { - var to = checkHandlePosition(proposals, handleNumber, proposals[handleNumber] + proposal, b[o], f[o], false, smoothSteps); - // Stop if one of the handles can't move. - if (to === false) { - proposal = 0; - } - else { - proposal = to - proposals[handleNumber]; - proposals[handleNumber] = to; - } - }); - } - // If using one handle, check backward AND forward - else { - b = f = [true]; - } - var state = false; - // Step 2: Try to set the handles with the found percentage - handleNumbers.forEach(function (handleNumber, o) { - state = - setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o], false, smoothSteps) || state; - }); - // Step 3: If a handle moved, fire events - if (state) { - handleNumbers.forEach(function (handleNumber) { - fireEvent("update", handleNumber); - fireEvent("slide", handleNumber); - }); - // If target is a connect, then fire drag event - if (connect != undefined) { - fireEvent("drag", firstHandle); - } - } - } - // Takes a base value and an offset. This offset is used for the connect bar size. - // In the initial design for this feature, the origin element was 1% wide. - // Unfortunately, a rounding bug in Chrome makes it impossible to implement this feature - // in this manner: https://bugs.chromium.org/p/chromium/issues/detail?id=798223 - function transformDirection(a, b) { - return options.dir ? 100 - a - b : a; - } - // Updates scope_Locations and scope_Values, updates visual state - function updateHandlePosition(handleNumber, to) { - // Update locations. - scope_Locations[handleNumber] = to; - // Convert the value to the slider stepping/range. - scope_Values[handleNumber] = scope_Spectrum.fromStepping(to); - var translation = transformDirection(to, 0) - scope_DirOffset; - var translateRule = "translate(" + inRuleOrder(translation + "%", "0") + ")"; - scope_Handles[handleNumber].style[options.transformRule] = translateRule; - updateConnect(handleNumber); - updateConnect(handleNumber + 1); - } - // Handles before the slider middle are stacked later = higher, - // Handles after the middle later is lower - // [[7] [8] .......... | .......... [5] [4] - function setZindex() { - scope_HandleNumbers.forEach(function (handleNumber) { - var dir = scope_Locations[handleNumber] > 50 ? -1 : 1; - var zIndex = 3 + (scope_Handles.length + dir * handleNumber); - scope_Handles[handleNumber].style.zIndex = String(zIndex); - }); - } - // Test suggested values and apply margin, step. - // if exactInput is true, don't run checkHandlePosition, then the handle can be placed in between steps (#436) - function setHandle(handleNumber, to, lookBackward, lookForward, exactInput, smoothSteps) { - if (!exactInput) { - to = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false, smoothSteps); - } - if (to === false) { - return false; - } - updateHandlePosition(handleNumber, to); - return true; - } - // Updates style attribute for connect nodes - function updateConnect(index) { - // Skip connects set to false - if (!scope_Connects[index]) { - return; - } - var l = 0; - var h = 100; - if (index !== 0) { - l = scope_Locations[index - 1]; - } - if (index !== scope_Connects.length - 1) { - h = scope_Locations[index]; - } - // We use two rules: - // 'translate' to change the left/top offset; - // 'scale' to change the width of the element; - // As the element has a width of 100%, a translation of 100% is equal to 100% of the parent (.noUi-base) - var connectWidth = h - l; - var translateRule = "translate(" + inRuleOrder(transformDirection(l, connectWidth) + "%", "0") + ")"; - var scaleRule = "scale(" + inRuleOrder(connectWidth / 100, "1") + ")"; - scope_Connects[index].style[options.transformRule] = - translateRule + " " + scaleRule; - } - // Parses value passed to .set method. Returns current value if not parse-able. - function resolveToValue(to, handleNumber) { - // Setting with null indicates an 'ignore'. - // Inputting 'false' is invalid. - if (to === null || to === false || to === undefined) { - return scope_Locations[handleNumber]; - } - // If a formatted number was passed, attempt to decode it. - if (typeof to === "number") { - to = String(to); - } - to = options.format.from(to); - if (to !== false) { - to = scope_Spectrum.toStepping(to); - } - // If parsing the number failed, use the current value. - if (to === false || isNaN(to)) { - return scope_Locations[handleNumber]; - } - return to; - } - // Set the slider value. - function valueSet(input, fireSetEvent, exactInput) { - var values = asArray(input); - var isInit = scope_Locations[0] === undefined; - // Event fires by default - fireSetEvent = fireSetEvent === undefined ? true : fireSetEvent; - // Animation is optional. - // Make sure the initial values were set before using animated placement. - if (options.animate && !isInit) { - addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration); - } - // First pass, without lookAhead but with lookBackward. Values are set from left to right. - scope_HandleNumbers.forEach(function (handleNumber) { - setHandle(handleNumber, resolveToValue(values[handleNumber], handleNumber), true, false, exactInput); - }); - var i = scope_HandleNumbers.length === 1 ? 0 : 1; - // Spread handles evenly across the slider if the range has no size (min=max) - if (isInit && scope_Spectrum.hasNoSize()) { - exactInput = true; - scope_Locations[0] = 0; - if (scope_HandleNumbers.length > 1) { - var space_1 = 100 / (scope_HandleNumbers.length - 1); - scope_HandleNumbers.forEach(function (handleNumber) { - scope_Locations[handleNumber] = handleNumber * space_1; - }); - } - } - // Secondary passes. Now that all base values are set, apply constraints. - // Iterate all handles to ensure constraints are applied for the entire slider (Issue #1009) - for (; i < scope_HandleNumbers.length; ++i) { - scope_HandleNumbers.forEach(function (handleNumber) { - setHandle(handleNumber, scope_Locations[handleNumber], true, true, exactInput); - }); - } - setZindex(); - scope_HandleNumbers.forEach(function (handleNumber) { - fireEvent("update", handleNumber); - // Fire the event only for handles that received a new value, as per #579 - if (values[handleNumber] !== null && fireSetEvent) { - fireEvent("set", handleNumber); - } - }); - } - // Reset slider to initial values - function valueReset(fireSetEvent) { - valueSet(options.start, fireSetEvent); - } - // Set value for a single handle - function valueSetHandle(handleNumber, value, fireSetEvent, exactInput) { - // Ensure numeric input - handleNumber = Number(handleNumber); - if (!(handleNumber >= 0 && handleNumber < scope_HandleNumbers.length)) { - throw new Error("noUiSlider: invalid handle number, got: " + handleNumber); - } - // Look both backward and forward, since we don't want this handle to "push" other handles (#960); - // The exactInput argument can be used to ignore slider stepping (#436) - setHandle(handleNumber, resolveToValue(value, handleNumber), true, true, exactInput); - fireEvent("update", handleNumber); - if (fireSetEvent) { - fireEvent("set", handleNumber); - } - } - // Get the slider value. - function valueGet(unencoded) { - if (unencoded === void 0) { unencoded = false; } - if (unencoded) { - // return a copy of the raw values - return scope_Values.length === 1 ? scope_Values[0] : scope_Values.slice(0); - } - var values = scope_Values.map(options.format.to); - // If only one handle is used, return a single value. - if (values.length === 1) { - return values[0]; - } - return values; - } - // Removes classes from the root and empties it. - function destroy() { - // remove protected internal listeners - removeEvent(INTERNAL_EVENT_NS.aria); - removeEvent(INTERNAL_EVENT_NS.tooltips); - Object.keys(options.cssClasses).forEach(function (key) { - removeClass(scope_Target, options.cssClasses[key]); - }); - while (scope_Target.firstChild) { - scope_Target.removeChild(scope_Target.firstChild); - } - delete scope_Target.noUiSlider; - } - function getNextStepsForHandle(handleNumber) { - var location = scope_Locations[handleNumber]; - var nearbySteps = scope_Spectrum.getNearbySteps(location); - var value = scope_Values[handleNumber]; - var increment = nearbySteps.thisStep.step; - var decrement = null; - // If snapped, directly use defined step value - if (options.snap) { - return [ - value - nearbySteps.stepBefore.startValue || null, - nearbySteps.stepAfter.startValue - value || null, - ]; - } - // If the next value in this step moves into the next step, - // the increment is the start of the next step - the current value - if (increment !== false) { - if (value + increment > nearbySteps.stepAfter.startValue) { - increment = nearbySteps.stepAfter.startValue - value; - } - } - // If the value is beyond the starting point - if (value > nearbySteps.thisStep.startValue) { - decrement = nearbySteps.thisStep.step; - } - else if (nearbySteps.stepBefore.step === false) { - decrement = false; - } - // If a handle is at the start of a step, it always steps back into the previous step first - else { - decrement = value - nearbySteps.stepBefore.highestStep; - } - // Now, if at the slider edges, there is no in/decrement - if (location === 100) { - increment = null; - } - else if (location === 0) { - decrement = null; - } - // As per #391, the comparison for the decrement step can have some rounding issues. - var stepDecimals = scope_Spectrum.countStepDecimals(); - // Round per #391 - if (increment !== null && increment !== false) { - increment = Number(increment.toFixed(stepDecimals)); - } - if (decrement !== null && decrement !== false) { - decrement = Number(decrement.toFixed(stepDecimals)); - } - return [decrement, increment]; - } - // Get the current step size for the slider. - function getNextSteps() { - return scope_HandleNumbers.map(getNextStepsForHandle); - } - // Updatable: margin, limit, padding, step, range, animate, snap - function updateOptions(optionsToUpdate, fireSetEvent) { - // Spectrum is created using the range, snap, direction and step options. - // 'snap' and 'step' can be updated. - // If 'snap' and 'step' are not passed, they should remain unchanged. - var v = valueGet(); - var updateAble = [ - "margin", - "limit", - "padding", - "range", - "animate", - "snap", - "step", - "format", - "pips", - "tooltips", - ]; - // Only change options that we're actually passed to update. - updateAble.forEach(function (name) { - // Check for undefined. null removes the value. - if (optionsToUpdate[name] !== undefined) { - originalOptions[name] = optionsToUpdate[name]; - } - }); - var newOptions = testOptions(originalOptions); - // Load new options into the slider state - updateAble.forEach(function (name) { - if (optionsToUpdate[name] !== undefined) { - options[name] = newOptions[name]; - } - }); - scope_Spectrum = newOptions.spectrum; - // Limit, margin and padding depend on the spectrum but are stored outside of it. (#677) - options.margin = newOptions.margin; - options.limit = newOptions.limit; - options.padding = newOptions.padding; - // Update pips, removes existing. - if (options.pips) { - pips(options.pips); - } - else { - removePips(); - } - // Update tooltips, removes existing. - if (options.tooltips) { - tooltips(); - } - else { - removeTooltips(); - } - // Invalidate the current positioning so valueSet forces an update. - scope_Locations = []; - valueSet(isSet(optionsToUpdate.start) ? optionsToUpdate.start : v, fireSetEvent); - } - // Initialization steps - function setupSlider() { - // Create the base element, initialize HTML and set classes. - // Add handles and connect elements. - scope_Base = addSlider(scope_Target); - addElements(options.connect, scope_Base); - // Attach user events. - bindSliderEvents(options.events); - // Use the public value method to set the start values. - valueSet(options.start); - if (options.pips) { - pips(options.pips); - } - if (options.tooltips) { - tooltips(); - } - aria(); - } - setupSlider(); - var scope_Self = { - destroy: destroy, - steps: getNextSteps, - on: bindEvent, - off: removeEvent, - get: valueGet, - set: valueSet, - setHandle: valueSetHandle, - reset: valueReset, - // Exposed for unit testing, don't use this in your application. - __moveHandles: function (upward, proposal, handleNumbers) { - moveHandles(upward, proposal, scope_Locations, handleNumbers); - }, - options: originalOptions, - updateOptions: updateOptions, - target: scope_Target, - removePips: removePips, - removeTooltips: removeTooltips, - getPositions: function () { - return scope_Locations.slice(); - }, - getTooltips: function () { - return scope_Tooltips; - }, - getOrigins: function () { - return scope_Handles; - }, - pips: pips, // Issue #594 - }; - return scope_Self; - } - // Run the standard initializer - function initialize(target, originalOptions) { - if (!target || !target.nodeName) { - throw new Error("noUiSlider: create requires a single element, got: " + target); - } - // Throw an error if the slider was already initialized. - if (target.noUiSlider) { - throw new Error("noUiSlider: Slider was already initialized."); - } - // Test the options and create the slider environment; - var options = testOptions(originalOptions); - var api = scope(target, options, originalOptions); - target.noUiSlider = api; - return api; - } - var nouislider = { - // Exposed for unit testing, don't use this in your application. - __spectrum: Spectrum, - // A reference to the default classes, allows global changes. - // Use the cssClasses option for changes to one slider. - cssClasses: cssClasses, - create: initialize, - }; - - exports.create = initialize; - exports.cssClasses = cssClasses; - exports["default"] = nouislider; - - Object.defineProperty(exports, '__esModule', { value: true }); - -})); diff --git a/src/assets/lib/nouislider/nouislider.min.css b/src/assets/lib/nouislider/nouislider.min.css deleted file mode 100644 index 60f217c0..00000000 --- a/src/assets/lib/nouislider/nouislider.min.css +++ /dev/null @@ -1 +0,0 @@ -.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-target{position:relative}.noUi-base,.noUi-connects{width:100%;height:100%;position:relative;z-index:1}.noUi-connects{overflow:hidden;z-index:0}.noUi-connect,.noUi-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;height:100%;width:100%;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform-style:preserve-3d;transform-origin:0 0;transform-style:flat}.noUi-txt-dir-rtl.noUi-horizontal .noUi-origin{left:0;right:auto}.noUi-vertical .noUi-origin{top:-100%;width:0}.noUi-horizontal .noUi-origin{height:0}.noUi-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;position:absolute}.noUi-touch-area{height:100%;width:100%}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{-webkit-transition:transform .3s;transition:transform .3s}.noUi-state-drag *{cursor:inherit!important}.noUi-horizontal{height:18px}.noUi-horizontal .noUi-handle{width:34px;height:28px;right:-17px;top:-6px}.noUi-vertical{width:18px}.noUi-vertical .noUi-handle{width:28px;height:34px;right:-6px;bottom:-17px}.noUi-txt-dir-rtl.noUi-horizontal .noUi-handle{left:-17px;right:auto}.noUi-target{background:#FAFAFA;border-radius:4px;border:1px solid #D3D3D3;box-shadow:inset 0 1px 1px #F0F0F0,0 3px 6px -5px #BBB}.noUi-connects{border-radius:3px}.noUi-connect{background:#3FB8AF}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{border:1px solid #D9D9D9;border-radius:3px;background:#FFF;cursor:default;box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #EBEBEB,0 3px 6px -3px #BBB}.noUi-active{box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #DDD,0 3px 6px -3px #BBB}.noUi-handle:after,.noUi-handle:before{content:"";display:block;position:absolute;height:14px;width:1px;background:#E8E7E6;left:14px;top:6px}.noUi-handle:after{left:17px}.noUi-vertical .noUi-handle:after,.noUi-vertical .noUi-handle:before{width:14px;height:1px;left:6px;top:14px}.noUi-vertical .noUi-handle:after{top:17px}[disabled] .noUi-connect{background:#B8B8B8}[disabled] .noUi-handle,[disabled].noUi-handle,[disabled].noUi-target{cursor:not-allowed}.noUi-pips,.noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.noUi-pips{position:absolute;color:#999}.noUi-value{position:absolute;white-space:nowrap;text-align:center}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{position:absolute;background:#CCC}.noUi-marker-sub{background:#AAA}.noUi-marker-large{background:#AAA}.noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noUi-value-horizontal{-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}.noUi-rtl .noUi-value-horizontal{-webkit-transform:translate(50%,50%);transform:translate(50%,50%)}.noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noUi-value-vertical{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);padding-left:25px}.noUi-rtl .noUi-value-vertical{-webkit-transform:translate(0,50%);transform:translate(0,50%)}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{display:block;position:absolute;border:1px solid #D9D9D9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.noUi-horizontal .noUi-tooltip{-webkit-transform:translate(-50%,0);transform:translate(-50%,0);left:50%;bottom:120%}.noUi-vertical .noUi-tooltip{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);top:50%;right:120%}.noUi-horizontal .noUi-origin>.noUi-tooltip{-webkit-transform:translate(50%,0);transform:translate(50%,0);left:auto;bottom:10px}.noUi-vertical .noUi-origin>.noUi-tooltip{-webkit-transform:translate(0,-18px);transform:translate(0,-18px);top:auto;right:28px} \ No newline at end of file diff --git a/src/assets/technology/CHANNEL.png b/src/assets/technology/CHANNEL.png deleted file mode 100644 index baff7c3156d0c964612b7631a8609ccae8742fae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4871 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 = new Map(); - __setString: any; - __tools: any; - __render2D: any; - __render3D: any; - name: any; - setString: string | undefined; - - /** - * Gets all the components definitions (template type objects) in the library. - * - * @static - * @returns {Array