基本概念
Make的模型分为定义和使用两部分:
- 通过make.Default.register函数来定义模型
- 通过make.Default.load函数来加载使用模型
每一个模型在定义时,要给一个全局唯一不会重复的id来标识。推荐格式举例:
- twaver.idc.rack
- mycompany.product.id001
只要id不重复即可。Make内置模型均以twaver开头,因此不要使用以twaver开头的id。
定义模型
make.Default.register函数定义如下:
make.Default.register(id, createFunction)
其中,id变量是要注册的模型的id,需保证全局唯一。如果id已经存在,则会覆盖旧的模型注册,并用console.log给出警告信息;createFunction是创建模型的函数,它是定义了如何创建模型,make会调用这个函数来生成具体的模型对象。createFunction最后必须return模型结果。
下面代码定义了一个最简单的模型:
1 2 3 4 5 |
make.Default.register('my_name', function(){ var node = new twaver.Node(); node.setSize(200, 100); return node; }); |
直接返回基本类型
register函数的createFunction参数也可以直接使用基本类型,例如字符串、数字等。此时load模型时将直接返回这个数值。
1 2 3 4 5 6 7 8 |
//注册资源 make.Default.register('my_name', '赛瓦软件'); //.... //加载并使用资源 var myName = make.Default.load('my_name'); //myName将等于'赛瓦软件' |
加载模型
make.Default.load(object, callback)
其中:
- object:必选。要加载的模型对象,object可以为string,json对象或者数组(数组里包含的又可以是string或json对象),string表示模型的id,比如:’twaver.idc.rack’;json对象是一个包含id的json对象,比如:{id:’twaver.idc.rack’, position: [100,0,100]},;数组就是多个模型对象
- callback:可选。模型返回时的回调函数,主要用于异步加载时使用
下面的代码直接加载my_node模型并放入DataBox中:
1 2 |
var node = make.Default.load('my_node'); network.getDataBox().addByDescendant(node); |
批量调用多个模型
object参数可以是多个模型id的数组,用来批量加载多个模型。返回的object则是一个模型实例的数组。
下面代码直接返回了’my_node1′, ‘my_node2’, ‘my_node3’ 三个模型,返回值在object数组中。
1 2 3 4 5 6 |
var json = ['my_node1', 'my_node2', 'my_node3']; var object = make.Default.load(json); var object1 = object[0]; var object2 = object[1]; var object3 = object[2]; |
object参数也可以是多个模型的json对象数组,每个json对象带了加载的参数,加载的参数是在注册的方法中提供了。返回值也是一个模型实例的数组。
比如:
1 2 3 4 5 6 |
var json = [{id:'my_node1', name: 'node1'}, {id: 'my_node2', name: 'node2'} , {id:'my_node3', name: 'node3'}]; var object = make.Default.load(json); var object1 = object[0]; var object2 = object[1]; var object3 = object[2]; |
object参数还可以是多个模型的数组,数组中包含模型的id或json对象,返回值也是一个模型实例的数组
比如:
1 2 3 4 5 6 |
var json = ['my_node1', {id: 'my_node2', name: 'node2'}, 'my_node3']; var object = make.Default.load(json); var object1 = object[0]; var object2 = object[1]; var object3 = object[2]; |
在批量加载模型的情况下,callback参数的意义依旧不变。批量返回的结果object对象将会被传递给callback回调。
异步返回模型
有时,模型需要从文件、网络等处进行异步加载并创建,需要异步方式完成,无法直接return结果对象。此时,load函数无法直接获得模型结果,只能通过callback来获得。
假设id为’twaver.idc.building_001’这个模型是异步加载,则可以通过下面的代码进行加载:
1 2 3 |
make.Default.load('twaver.idc.building_001', null, function(building){ network3d.getDataBox().addByDescendant(building); }); |
下面是一个场景的json格式数据,通过load方法可以将快速加载模型到场景中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
var jsonObject= [ { "id": "twaver.idc.wall", "data": [ [ -380, 400 ], [ 380, 400 ], [ 380, -2.6743 ], [ 26.7928, -2.6743 ], [ 26.7928, -400 ], [ -380, -400 ], [ -380, 400 ] ], "children": [ { "id": "twaver.idc.door", "width": 100, "position": [ 302.344, 10, 400 ] } ] }, { "id": "twaver.idc.innerWall", "position": [ -762.921, 0, 12.257 ], "data": [ [ 0, -520 ], [ 0, 520 ] ] }, { "id": "twaver.idc.innerWall", "position": [ 736.7721, 0, 12.257 ], "data": [ [ 0, -520.0224 ], [ 0, 520.0224 ] ] }, { "id": "twaver.idc.floor", "position": [ -13.074, 0, 12.257 ], "data": [ [ -749.84655, -520.0224 ], [ 749.84655, -520.0224 ], [ 749.84655, 520.0224 ], [ -749.84655, 520.0224 ], [ -749.84655, -520.0224 ] ] }, { "id": "twaver.idc.rack", "width": 60, "height": "42U", "depth": 80, "position": [ -317.2831, "floor-top", 105.6503 ] }, { "id": "twaver.idc.rack", "width": 60, "height": "42U", "depth": 80, "position": [ -253.2077, "floor-top", 107.176 ] }, { "id": "twaver.idc.rack", "width": 60, "height": "42U", "depth": 80, "position": [ -189.1323, "floor-top", 107.176 ] }, { "id": "twaver.idc.rack", "width": 60, "height": "42U", "depth": 80, "position": [ -123.531, "floor-top", 110.227 ] }, { "id": "twaver.idc.headerRack", "width": 60, "height": "42U", "depth": 80, "position": [ -59.455, "floor-top", 111.7528 ] }, { "id": "twaver.idc.airCondition", "position": [ 323.471, "floor-top", 43.1006 ] }, { "id": "twaver.idc.rack", "width": 60, "height": "47U", "depth": 80, "position": [ -253.2076, "floor-top", -182.686 ] }, { "id": "twaver.idc.rack", "width": 60, "height": "47U", "depth": 80, "position": [ -190.658, "floor-top", -182.689 ] }, { "id": "twaver.idc.rack", "width": 60, "height": "47U", "depth": 80, "position": [ -128.109, "floor-top", -181.163 ] }, { "id": "twaver.idc.airCondition", "position": [ -321.856, "floor-top", -353.557 ] }, { "id": "twaver.idc.rack", "width": 60, "height": "47U", "depth": 80, "position": [ -62.5072, "floor-top", -179.6378 ] } ]; var object3d = make.Default.load(jsonObject); for(var i = 0; i < object3d.length; i++){ var obj = object3d[i]; network.getDataBox().addByDescendant(obj); } |
运行效果如下: