Compare commits
	
		
			35 Commits
		
	
	
		
			time-condu
			...
			deep-plotl
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 043d6aa9c3 | ||
|   | ecfab8f7f3 | ||
|   | 05c38c37aa | ||
|   | ce78925119 | ||
|   | 26aca0f433 | ||
|   | 41259bbd40 | ||
|   | 580640ff47 | ||
|   | a4aec5d492 | ||
|   | 00b3f3ac0b | ||
|   | c185f77a15 | ||
|   | 0dff431f4a | ||
|   | 61d238a097 | ||
|   | f9deb80350 | ||
|   | 021d730814 | ||
|   | ae62b15abf | ||
|   | ba41c1a30e | ||
|   | b9a85d9c4d | ||
|   | 80eab8bad1 | ||
|   | b2d8d640ae | ||
|   | 56e6fa66c2 | ||
|   | 9fa4707c82 | ||
|   | 7e2cfa36de | ||
|   | aaa60a1545 | ||
|   | 717231fed2 | ||
|   | 7fb2bc9729 | ||
|   | addeb635e9 | ||
|   | 608d63a7b0 | ||
|   | 10679e5f4f | ||
|   | 38b8f03b1a | ||
|   | 779a42c28c | ||
|   | 80c2504768 | ||
|   | 80359e3f16 | ||
|   | 66aa4f099f | ||
|   | aa6c6cb88b | ||
|   | 4e5cc840d7 | 
| @@ -2,7 +2,9 @@ | ||||
|   "name": "openmct", | ||||
|   "version": "1.0.0-snapshot", | ||||
|   "description": "The Open MCT core platform", | ||||
|   "dependencies": {}, | ||||
|   "dependencies": { | ||||
|     "plotly.js-dist": "^1.54.1" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "angular": "1.7.9", | ||||
|     "angular-route": "1.4.14", | ||||
| @@ -53,7 +55,7 @@ | ||||
|     "marked": "^0.3.5", | ||||
|     "mini-css-extract-plugin": "^0.4.1", | ||||
|     "minimist": "^1.1.1", | ||||
|     "moment": "^2.11.1", | ||||
|     "moment": "^2.25.3", | ||||
|     "moment-duration-format": "^2.2.2", | ||||
|     "moment-timezone": "^0.5.21", | ||||
|     "node-bourbon": "^4.2.3", | ||||
|   | ||||
| @@ -252,6 +252,7 @@ define([ | ||||
|         // Plugin's that are installed by default | ||||
|  | ||||
|         this.install(this.plugins.Plot()); | ||||
|         this.install(this.plugins.PlotlyPlot()); | ||||
|         this.install(this.plugins.TelemetryTable()); | ||||
|         this.install(PreviewPlugin.default()); | ||||
|         this.install(LegacyIndicatorsPlugin()); | ||||
|   | ||||
| @@ -69,7 +69,6 @@ export default class ConditionClass extends EventEmitter { | ||||
|             console.log('no data received'); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         this.criteria.forEach(criterion => { | ||||
|             if (this.isAnyOrAllTelemetry(criterion)) { | ||||
|                 criterion.getResult(datum, this.conditionManager.telemetryObjects); | ||||
|   | ||||
| @@ -57,6 +57,7 @@ export default class ConditionManager extends EventEmitter { | ||||
|             endpoint, | ||||
|             this.telemetryReceived.bind(this, endpoint) | ||||
|         ); | ||||
|         // TODO check if this is needed | ||||
|         this.updateConditionTelemetry(); | ||||
|     } | ||||
|  | ||||
|   | ||||
							
								
								
									
										35
									
								
								src/plugins/plotlyPlot/PlotlyTelemetryProvider.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/plugins/plotlyPlot/PlotlyTelemetryProvider.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| export default class PlotlyTelemetryProvider { | ||||
|     constructor(openmct) { | ||||
|         this.openmct = openmct; | ||||
|     } | ||||
|  | ||||
|     isTelemetryObject(domainObject) { | ||||
|         return domainObject.type === 'plotlyPlot'; | ||||
|     } | ||||
|  | ||||
|     supportsRequest(domainObject) { | ||||
|         return domainObject.type === 'plotlyPlot'; | ||||
|     } | ||||
|  | ||||
|     supportsSubscribe(domainObject) { | ||||
|         return domainObject.type === 'plotlyPlot'; | ||||
|     } | ||||
|  | ||||
|     request(domainObject) { | ||||
|         // let conditionManager = this.getConditionManager(domainObject); | ||||
|  | ||||
|         // return conditionManager.requestLADConditionSetOutput() | ||||
|         //     .then(latestOutput => { | ||||
|         //         return latestOutput; | ||||
|         //     }); | ||||
|     } | ||||
|  | ||||
|     subscribe(domainObject, callback) { | ||||
|         // let conditionManager = this.getConditionManager(domainObject); | ||||
|  | ||||
|         // conditionManager.on('conditionSetResultUpdated', callback); | ||||
|  | ||||
|         // return this.destroyConditionManager.bind(this, this.openmct.objects.makeKeyString(domainObject.identifier)); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										73
									
								
								src/plugins/plotlyPlot/PlotlyViewProvider.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								src/plugins/plotlyPlot/PlotlyViewProvider.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2019, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| import PlotlyViewLayout from './components/PlotlyViewLayout.vue'; | ||||
| import Vue from 'vue'; | ||||
|  | ||||
| export default function PlotlyViewProvider(openmct) { | ||||
|     return { | ||||
|         key: 'plotlyPlot', | ||||
|         name: 'Plotly Plot', | ||||
|         cssClass: 'icon-plot-overlay', | ||||
|         canView: function (domainObject) { | ||||
|             return domainObject.type === 'plotlyPlot'; | ||||
|         }, | ||||
|         canEdit: function (domainObject) { | ||||
|             return domainObject.type === 'plotlyPlot'; | ||||
|         }, | ||||
|         view: function (domainObject, objectPath) { | ||||
|             let component; | ||||
|  | ||||
|             return { | ||||
|                 show: function (element, isEditing) { | ||||
|                     component =  new Vue({ | ||||
|                         provide: { | ||||
|                             openmct, | ||||
|                             domainObject, | ||||
|                             objectPath | ||||
|                         }, | ||||
|                         el: element, | ||||
|                         components: { | ||||
|                             PlotlyViewLayout | ||||
|                         }, | ||||
|                         data() { | ||||
|                             return { | ||||
|                                 isEditing | ||||
|                             } | ||||
|                         }, | ||||
|                         template: '<plotly-view-layout :isEditing="isEditing"></plotly-view-layout>' | ||||
|                     }); | ||||
|                 }, | ||||
|                 onEditModeChange: function (isEditing) { | ||||
|                     component.isEditing = isEditing; | ||||
|                 }, | ||||
|                 destroy: function (element) { | ||||
|                     component.$destroy(); | ||||
|                     component = undefined; | ||||
|                 } | ||||
|             }; | ||||
|         }, | ||||
|         priority: function () { | ||||
|             return 1; | ||||
|         } | ||||
|     }; | ||||
| } | ||||
							
								
								
									
										138
									
								
								src/plugins/plotlyPlot/components/PlotlyViewLayout.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								src/plugins/plotlyPlot/components/PlotlyViewLayout.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | ||||
| <template> | ||||
| <div class="l-view-section"></div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Plotly from 'plotly.js-dist'; | ||||
| import moment from 'moment' | ||||
|  | ||||
| export default { | ||||
|     inject: ['openmct', 'domainObject', 'objectPath'], | ||||
|     data: function () { | ||||
|  | ||||
|         return { | ||||
|             telemetryObjects: [] | ||||
|             // currentDomainObject: this.domainObject | ||||
|         } | ||||
|     }, | ||||
|     mounted() { | ||||
|         this.composition = this.openmct.composition.get(this.domainObject); | ||||
|         this.composition.on('add', this.addTelemetry); | ||||
|         this.composition.load(); | ||||
|  | ||||
|         this.metadata = this.openmct.telemetry.getMetadata(this.domainObject); | ||||
|  | ||||
|         console.log('this.metadata', this.metadata); | ||||
|  | ||||
|         // this.keystring = this.openmct.objects.makeKeyString(this.domainObject.identifier); | ||||
|         // this.subscribe(this.domainObject); | ||||
|         this.plotElement = document.querySelector('.l-view-section'); | ||||
|         // Plotly.newPlot(this.plotElement, [{ | ||||
|         //     x: [1, 2, 3, 4, 5], | ||||
|         //     y: [1, 2, 4, 8, 16] | ||||
|         // }], this.getLayout(), {displayModeBar: false}); | ||||
|  | ||||
|     }, | ||||
|     methods: { | ||||
|         getLayout() { | ||||
|             return { | ||||
|                 hovermode: 'compare', | ||||
|                 hoverdistance: -1, | ||||
|                 autosize: "true", | ||||
|                 showlegend: false, | ||||
|                 font: { | ||||
|                     family: "'Helvetica Neue', Helvetica, Arial, sans-serif", | ||||
|                     size: "12px", | ||||
|                     color: "#666" | ||||
|                 }, | ||||
|                 xaxis: { | ||||
|                     // title: this.plotAxisTitle.xAxisTitle, | ||||
|                     zeroline: false | ||||
|                 }, | ||||
|                 yaxis: { | ||||
|                     // title: this.plotAxisTitle.yAxisTitle, | ||||
|                     zeroline: false | ||||
|                 }, | ||||
|                 margin: { | ||||
|                     l: 20, | ||||
|                     r: 10, | ||||
|                     b: 20, | ||||
|                     t: 10 | ||||
|                 }, | ||||
|                 paper_bgcolor: 'transparent', | ||||
|                 plot_bgcolor: 'transparent' | ||||
|             } | ||||
|         }, | ||||
|         addTelemetry(telemetryObject) { | ||||
|             return this.openmct.telemetry.request(telemetryObject) | ||||
|                 .then(telemetryData => { | ||||
|                     this.createPlot(telemetryData, telemetryObject); | ||||
|                 }, () => {console.log(error)}); | ||||
|         }, | ||||
|         formatDatumX(datum) { | ||||
|             let timestamp = moment.utc(datum.utc).format('YYYY-MM-DD hh:mm:ss.ms'); | ||||
|             return timestamp; | ||||
|         }, | ||||
|         formatDatumY(datum) { | ||||
|             return datum.sin; | ||||
|         }, | ||||
|         createPlot(telemetryData, telemetryObject) { | ||||
|             let x = [], | ||||
|                 y = []; | ||||
|  | ||||
|             telemetryData.forEach((datum, index) => { | ||||
|                 x.push(this.formatDatumX(datum)); | ||||
|                 y.push(this.formatDatumY(datum)); | ||||
|             }) | ||||
|              | ||||
|             let data = [{ | ||||
|                 x, | ||||
|                 y, | ||||
|                 mode: 'line' | ||||
|             }]; | ||||
|             var layout = { | ||||
|                 title:'Line and Scatter Plot' | ||||
|             }; | ||||
|             Plotly.newPlot( | ||||
|                 this.plotElement, | ||||
|                 data, | ||||
|                 this.getLayout() | ||||
|             ) | ||||
|  | ||||
|             this.subscribe(telemetryObject); | ||||
|         }, | ||||
|         subscribe(domainObject) { | ||||
|             // this.date = '' | ||||
|             // this.openmct.objects.get(this.keystring) | ||||
|             //     .then((object) => { | ||||
|             //         const metadata = this.openmct.telemetry.getMetadata(this.domainObject); | ||||
|             //         console.log('metadata', metadata); | ||||
|             //         // this.timeKey = this.openmct.time.timeSystem().key; | ||||
|             //         // this.timeFormat = this.openmct.telemetry.getValueFormatter(metadata.value(this.timeKey)); | ||||
|             //         // // this.imageFormat = this.openmct.telemetry.getValueFormatter(metadata.valuesForHints(['image'])[0]); | ||||
|             //         // this.unsubscribe = this.openmct.telemetry | ||||
|             //         //     .subscribe(this.domainObject, (datum) => { | ||||
|             //         //         this.updateHistory(datum); | ||||
|             //         //         this.updateValues(datum); | ||||
|             //         //     }); | ||||
|  | ||||
|             //         // this.requestHistory(this.openmct.time.bounds()); | ||||
|             //     }); | ||||
|  | ||||
|             this.openmct.telemetry.subscribe(domainObject, (datum) => { | ||||
|                 this.updateData(datum) | ||||
|             }) | ||||
|         }, | ||||
|         updateData(datum) { | ||||
|             Plotly.extendTraces( | ||||
|                 this.plotElement, | ||||
|                 { | ||||
|                     x: [[this.formatDatumX(datum)]], | ||||
|                     y: [[this.formatDatumY(datum)]] | ||||
|                 }, | ||||
|                 [0] | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										2
									
								
								src/plugins/plotlyPlot/components/plotly.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								src/plugins/plotlyPlot/components/plotly.scss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| .plot svg { | ||||
| } | ||||
							
								
								
									
										20
									
								
								src/plugins/plotlyPlot/plugin.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/plugins/plotlyPlot/plugin.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| import PlotlyViewProvider from './PlotlyViewProvider.js'; | ||||
| import PlotlyTelemetryProvider from './PlotlyTelemetryProvider.js'; | ||||
|  | ||||
| export default function () { | ||||
|     return function install(openmct) { | ||||
|         openmct.objectViews.addProvider(new PlotlyViewProvider(openmct)); | ||||
|         openmct.telemetry.addProvider(new PlotlyTelemetryProvider(openmct)); | ||||
|  | ||||
|         openmct.types.addType('plotlyPlot', { | ||||
|             name: "Plotly Plot", | ||||
|             description: "Simple plot rendered by plotly.js", | ||||
|             creatable: true, | ||||
|             cssClass: 'icon-plot-overlay', | ||||
|             initialize: function (domainObject) { | ||||
|                 domainObject.composition = []; | ||||
|                 domainObject.telemetry = {}; | ||||
|             } | ||||
|         }); | ||||
|     }; | ||||
| } | ||||
| @@ -34,6 +34,7 @@ define([ | ||||
|     './URLIndicatorPlugin/URLIndicatorPlugin', | ||||
|     './telemetryMean/plugin', | ||||
|     './plot/plugin', | ||||
|     './plotlyPlot/plugin', | ||||
|     './telemetryTable/plugin', | ||||
|     './staticRootPlugin/plugin', | ||||
|     './notebook/plugin', | ||||
| @@ -66,6 +67,7 @@ define([ | ||||
|     URLIndicatorPlugin, | ||||
|     TelemetryMean, | ||||
|     PlotPlugin, | ||||
|     PlotlyPlotPlugin, | ||||
|     TelemetryTablePlugin, | ||||
|     StaticRootPlugin, | ||||
|     Notebook, | ||||
| @@ -171,8 +173,8 @@ define([ | ||||
|     plugins.ExampleImagery = ExampleImagery; | ||||
|     plugins.ImageryPlugin = ImageryPlugin; | ||||
|     plugins.Plot = PlotPlugin; | ||||
|     plugins.PlotlyPlot = PlotlyPlotPlugin.default; | ||||
|     plugins.TelemetryTable = TelemetryTablePlugin; | ||||
|  | ||||
|     plugins.SummaryWidget = SummaryWidget; | ||||
|     plugins.TelemetryMean = TelemetryMean; | ||||
|     plugins.URLIndicator = URLIndicatorPlugin; | ||||
|   | ||||
| @@ -18,6 +18,7 @@ | ||||
| @import "../plugins/folderView/components/list-item.scss"; | ||||
| @import "../plugins/folderView/components/list-view.scss"; | ||||
| @import "../plugins/imagery/components/imagery-view-layout.scss"; | ||||
| @import "../plugins/plotlyPlot/components/plotly.scss"; | ||||
| @import "../plugins/telemetryTable/components/table-row.scss"; | ||||
| @import "../plugins/telemetryTable/components/telemetry-filter-indicator.scss"; | ||||
| @import "../plugins/tabs/components/tabs.scss"; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user