diff --git a/gluepyter/glue_session.py b/gluepyter/glue_session.py index f20e673..c4b7d54 100644 --- a/gluepyter/glue_session.py +++ b/gluepyter/glue_session.py @@ -267,6 +267,19 @@ def _viewer_factory( pass except Exception as e: widget = ErrorWidget(e, __file__) + elif ( + view_type == "glue_vispy_viewers.scatter.scatter_viewer.VispyScatterViewer" + ): + try: + widget = self.app.scatter3d(data=viewer_data) + for key, value in viewer_state.items(): + try: + setattr(widget.state, key, value) + except Exception: + pass + except Exception as e: + widget = ErrorWidget(e, __file__) + return widget def _read_view_state( diff --git a/src/commands.ts b/src/commands.ts index 97f9926..e0785f9 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -10,6 +10,8 @@ export namespace CommandIDs { export const new2DScatter = 'glue-control:new-2d-scatter-viewer'; + export const new3DScatter = 'glue-control:new-3d-scatter-viewer'; + export const newTable = 'glue-control:new-table-viewer'; export const openControlPanel = 'glue-control:open-control-panel'; diff --git a/src/leftPanel/data/datasetsWidget.tsx b/src/leftPanel/data/datasetsWidget.tsx index 01eadea..78fec0e 100644 --- a/src/leftPanel/data/datasetsWidget.tsx +++ b/src/leftPanel/data/datasetsWidget.tsx @@ -32,6 +32,7 @@ export class DatasetsWidget extends ReactWidget { viewerSubmenu.title.iconClass = 'fa fa-caret-right'; viewerSubmenu.addItem({ command: CommandIDs.new1DHistogram }); viewerSubmenu.addItem({ command: CommandIDs.new2DScatter }); + viewerSubmenu.addItem({ command: CommandIDs.new3DScatter }); viewerSubmenu.addItem({ command: CommandIDs.new2DImage }); viewerSubmenu.addItem({ command: CommandIDs.newTable }); this._menu.addItem({ type: 'submenu', submenu: viewerSubmenu }); diff --git a/src/leftPanel/plugin.ts b/src/leftPanel/plugin.ts index ef19cc3..b5cdf78 100644 --- a/src/leftPanel/plugin.ts +++ b/src/leftPanel/plugin.ts @@ -53,7 +53,7 @@ function addCommands( commands.addCommand(CommandIDs.new2DScatter, { label: '2D Scatter', - iconClass: 'fa fa-circle', + iconClass: 'fa fa-chart-line', execute: (args?: INewViewerArgs) => { if (!controlModel.sharedModel) { return; @@ -81,6 +81,36 @@ function addCommands( } }); + commands.addCommand(CommandIDs.new3DScatter, { + label: '3D Scatter', + iconClass: 'fa fa-chart-line', + execute: (args?: INewViewerArgs) => { + if (!controlModel.sharedModel) { + return; + } + + const tabs = Object.keys(controlModel.sharedModel.tabs); + const focusedTab = controlModel.sharedModel.getSelectedTab() || 1; + const layer = args?.dataset || controlModel.selectedDataset; + + if (focusedTab === 0) { + return; + } + + controlModel.sharedModel.setTabItem(tabs[focusedTab - 1], UUID.uuid4(), { + _type: 'glue_vispy_viewers.scatter.scatter_viewer.VispyScatterViewer', + pos: args?.position || [0, 0], + session: 'Session', + size: args?.size || [600, 400], + state: { + values: { + layer + } + } + }); + } + }); + commands.addCommand(CommandIDs.new2DImage, { label: '2D Image', iconClass: 'fa fa-image', diff --git a/src/schemas/glue.schema.json b/src/schemas/glue.schema.json index 0395cce..eb05473 100644 --- a/src/schemas/glue.schema.json +++ b/src/schemas/glue.schema.json @@ -57,7 +57,10 @@ "items": { "anyOf": [ { - "$ref": "./viewers/scatter.schema.json" + "$ref": "./viewers/3dscatter.schema.json" + }, + { + "$ref": "./viewers/2dscatter.schema.json" }, { "$ref": "./viewers/histogram.schema.json" diff --git a/src/schemas/viewers/scatter.schema.json b/src/schemas/viewers/2dscatter.schema.json similarity index 100% rename from src/schemas/viewers/scatter.schema.json rename to src/schemas/viewers/2dscatter.schema.json diff --git a/src/schemas/viewers/3dscatter.schema.json b/src/schemas/viewers/3dscatter.schema.json new file mode 100644 index 0000000..ff84078 --- /dev/null +++ b/src/schemas/viewers/3dscatter.schema.json @@ -0,0 +1,42 @@ +{ + "type": "object", + "description": "Viewer::Scatter", + "title": "IGlueScatterViewer", + "required": ["_type", "layers", "pos", "session", "size", "state"], + "additionalProperties": false, + "properties": { + "_type": { + "const": "glue_vispy_viewers.scatter.scatter_viewer.VispyScatterViewer" + }, + "layers": { + "type": "array", + "items": { + "type": "object" + } + }, + "pos": { + "type": "array", + "items": { + "type": "number" + } + }, + "session": { + "type": "string" + }, + "size": { + "type": "array", + "items": { + "type": "number" + } + }, + "state": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object" + } + } + } + } +} diff --git a/src/viewPanel/sessionWidget.ts b/src/viewPanel/sessionWidget.ts index cd31c9f..167b24f 100644 --- a/src/viewPanel/sessionWidget.ts +++ b/src/viewPanel/sessionWidget.ts @@ -101,6 +101,7 @@ export class SessionWidget extends BoxPanel { const items: IDict = { Histogram: CommandIDs.new1DHistogram, '2D Scatter': CommandIDs.new2DScatter, + '3D Scatter': CommandIDs.new3DScatter, '2D Image': CommandIDs.new2DImage, Table: CommandIDs.newTable };