@@ -5,14 +5,13 @@ export default class DataHelper {
5
5
* Checks if the "Autodesk.DataVisualization" extension has already been loaded and loads it otherwise.
6
6
*
7
7
* @param {Autodesk.Viewing.GuiViewer3D } viewer Instance of Forge Viewer
8
- * @returns {Object } Reference to Autodesk.DataVisualization.Core
8
+ * @returns {Object } Reference to Autodesk.DataVisualization extension.
9
9
*/
10
- async checkExtension ( viewer ) {
10
+ async getExtension ( viewer ) {
11
11
if ( Autodesk && Autodesk . DataVisualization . Core && Autodesk . DataVisualization . Core . SurfaceShadingData ) {
12
- return Autodesk . DataVisualization . Core ;
12
+ return await viewer . getExtension ( " Autodesk.DataVisualization" ) ;
13
13
} else {
14
- await viewer . loadExtension ( "Autodesk.DataVisualization" , { useInternal : true } ) ;
15
- return Autodesk . DataVisualization . Core ;
14
+ return await viewer . loadExtension ( "Autodesk.DataVisualization" ) ;
16
15
}
17
16
}
18
17
@@ -60,89 +59,111 @@ export default class DataHelper {
60
59
@returns {SurfaceShadingData }
61
60
*/
62
61
async createShadingData ( viewer , model , rawData ) {
63
- let ns = await this . checkExtension ( viewer ) ;
64
-
62
+ let dataVizExt = await this . getExtension ( viewer ) ;
63
+ const ns = Autodesk . DataVisualization . Core ;
65
64
const {
66
65
SurfaceShadingData,
67
66
SurfaceShadingPoint,
68
67
SurfaceShadingNode,
69
68
SurfaceShadingGroup,
70
69
} = ns ;
71
70
72
- let shadingData = new SurfaceShadingData ( ) ;
71
+ const create = async ( ) => {
72
+ let shadingData = new SurfaceShadingData ( ) ;
73
73
74
- /**
75
- * Creates a {@link SurfaceShadingNode} corresponding to item.
76
- *
77
- * @param {Object } item
78
- */
79
- function createNode ( item ) {
80
- let node = new SurfaceShadingNode ( item . id , item . dbIds ) ;
74
+ /**
75
+ * Creates a {@link SurfaceShadingNode} corresponding to item.
76
+ *
77
+ * @param {Object } item
78
+ */
79
+ function createNode ( item ) {
80
+ let node = new SurfaceShadingNode ( item . id , item . dbIds ) ;
81
81
82
- item . sensors . forEach ( ( sensor ) => {
83
- let shadingPoint = new SurfaceShadingPoint ( sensor . id , sensor . position , sensor . sensorTypes , sensor . name , { styleId : sensor . styleId || sensor . type } ) ;
82
+ item . sensors . forEach ( ( sensor ) => {
83
+ let shadingPoint = new SurfaceShadingPoint ( sensor . id , sensor . position , sensor . sensorTypes , sensor . name , { styleId : sensor . styleId || sensor . type } ) ;
84
84
85
- // If the position is not specified, derive it from the center of Geometry
86
- if ( sensor . dbId != undefined && sensor . position == null ) {
87
- shadingPoint . positionFromDBId ( model , sensor . dbId ) ;
88
- }
89
- node . addPoint ( shadingPoint ) ;
90
- } ) ;
85
+ // If the position is not specified, derive it from the center of Geometry
86
+ if ( sensor . dbId != undefined && sensor . position == null ) {
87
+ shadingPoint . positionFromDBId ( model , sensor . dbId ) ;
88
+ }
89
+ node . addPoint ( shadingPoint ) ;
90
+ } ) ;
91
91
92
- return node ;
93
- }
92
+ return node ;
93
+ }
94
94
95
- /**
96
- * Creates a {@link SurfaceShadingGroup} corresponding to item.
97
- *
98
- * @param {Object } item
99
- */
100
- function createGroup ( item ) {
101
- let group = new SurfaceShadingGroup ( item . id ) ;
102
-
103
- item . children . forEach ( ( child ) => {
104
- if ( child . children ) {
105
- group . addChild ( createGroup ( child ) ) ;
95
+ /**
96
+ * Creates a {@link SurfaceShadingGroup} corresponding to item.
97
+ *
98
+ * @param {Object } item
99
+ */
100
+ function createGroup ( item ) {
101
+ let group = new SurfaceShadingGroup ( item . id ) ;
102
+
103
+ item . children . forEach ( ( child ) => {
104
+ if ( child . children ) {
105
+ group . addChild ( createGroup ( child ) ) ;
106
+ } else {
107
+ group . addChild ( createNode ( child ) ) ;
108
+ }
109
+ } ) ;
110
+ return group ;
111
+ }
112
+
113
+ rawData . forEach ( ( item ) => {
114
+ if ( item . children ) {
115
+ shadingData . addChild ( createGroup ( item ) ) ;
106
116
} else {
107
- group . addChild ( createNode ( child ) ) ;
117
+ shadingData . addChild ( createNode ( item ) ) ;
108
118
}
109
119
} ) ;
110
- return group ;
111
- }
112
120
113
- rawData . forEach ( ( item ) => {
114
- if ( item . children ) {
115
- shadingData . addChild ( createGroup ( item ) ) ;
116
- } else {
117
- shadingData . addChild ( createNode ( item ) ) ;
118
- }
119
- } ) ;
121
+ return shadingData ;
122
+ }
120
123
121
- return shadingData ;
124
+ // Ensure that instance tree has loaded.
125
+ await this . waitForInstanceTree ( dataVizExt , model ) ;
126
+ return create ( ) ;
122
127
}
123
128
124
-
125
129
/**
126
130
* Uses the {@link ModelStructureInfo} to construct {@link SurfaceShadingData}
127
131
*
132
+ * @param {GuiViewer3D } Viewer instance used to retrieve dataViz extension.
128
133
* @param {Model } model Model loaded in viewer
129
134
* @param {Device[] } deviceList List of devices to be mapped to loaded rooms.
130
135
*/
131
- async createShadingGroupByFloor ( model , deviceList ) {
132
- const structureInfo = new Autodesk . DataVisualization . Core . ModelStructureInfo ( model ) ;
133
- /**
134
- * We have a custom type here for the UI in {@link constructDeviceTree}
135
- */
136
- let shadingData = await structureInfo . generateSurfaceShadingData ( deviceList ) ;
137
-
138
- return shadingData ;
136
+ async createShadingGroupByFloor ( viewer , model , deviceList ) {
137
+ let dataVizExt = await this . getExtension ( viewer ) ;
138
+
139
+ const getShadingData = async ( ) => {
140
+ const structureInfo = new Autodesk . DataVisualization . Core . ModelStructureInfo ( model ) ;
141
+ /**
142
+ * We have a custom type here for the UI in {@link constructDeviceTree}
143
+ */
144
+
145
+ let shadingData = await structureInfo . generateSurfaceShadingData ( deviceList ) ;
146
+ return shadingData ;
147
+ }
148
+
149
+ // Ensure that instance tree has loaded.
150
+ await this . waitForInstanceTree ( dataVizExt , model ) ;
151
+ return getShadingData ( ) ;
152
+ }
153
+
154
+
155
+ async waitForInstanceTree ( dataVizExt , model ) {
156
+ if ( dataVizExt . waitForInstanceTree ) {
157
+ await dataVizExt . waitForInstanceTree ( model ) ;
158
+ }
139
159
}
140
160
141
161
142
162
/**
143
163
* Constructs a device tree used to load the device UI.
144
164
*
145
- * @param {LevelRoomsMap } shadingData The level-to-room map.
165
+ * @param {SurfaceShadingData } shadingData The SurfaceShadingData, generally the output of {@link createShadingGroupByFloor} or
166
+ * {@link createShadingData}.
146
167
* @param {boolean } usingFullTree When true, constructs a deviceTree that contains all non-empty SurfaceShadingGroups,
147
168
* intermediate SurfaceShadingNodes, and SurfaceShading Points. When false, skips intermediate SurfaceShadingNodes.
148
169
*
@@ -199,13 +220,8 @@ export default class DataHelper {
199
220
}
200
221
return shadingData . children . map ( item => ( { id : item . id , name : item . name , propIds : [ ] , children : traverse ( item ) . filter ( i => i ) . flat ( ) } ) ) ;
201
222
}
202
-
203
-
204
-
205
223
}
206
224
207
-
208
-
209
225
}
210
226
211
227
0 commit comments