PlotPanel.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. /**
  2. *
  3. * Class: SuperMap.Plotting.PlotPanel
  4. * 标绘面板类。
  5. *
  6. */
  7. SuperMap.Plotting.PlotPanel = new SuperMap.Class({
  8. /**
  9. * Constant: EVENT_TYPES
  10. * {Array(String)}
  11. *
  12. * 此类支持的事件类型:
  13. * - *initializeCompleted* 标绘面板初始化成功触发该事件。
  14. * - *initializeFailed* 标绘面板初始化失败触发该事件。
  15. */
  16. EVENT_TYPES: ["initializeCompleted", "initializeFailed"],
  17. /**
  18. * APIProperty: events
  19. * {<SuperMap.Events>} 在 getLibInfosFailed 类中处理所有事件的对象,支持两种事件 processCompleted 、processFailed ,服务端成功返回查询结果时触发 processCompleted 事件,服务端返回查询结果失败时触发 processFailed 事件。
  20. *
  21. * 例如:
  22. * (start code)
  23. * var myService = new SuperMap.REST.getLibInfosFailed(url);
  24. * myService.events.on({
  25. * "processCompleted": getLibInfosComplted,
  26. * "processFailed": getLibInfosFailed
  27. * }
  28. * );
  29. * function getLibInfosComplted(getLibInfosCompltedEventArgs){//todo};
  30. * function getLibInfosFailed(getLibInfosFailedEventArgs){//todo};
  31. * (end)
  32. */
  33. events: null,
  34. /**
  35. * APIProperty: eventListeners
  36. * {Object} 监听器对象,在构造函数中设置此参数(可选),对 GetLibInfosService 支持的两个事件 processCompleted 、processFailed 进行监听,相当于调用 SuperMap.Events.on(eventListeners)。
  37. */
  38. eventListeners: null,
  39. /**
  40. * Property: serverUrl
  41. * {String}标绘服务URI
  42. */
  43. serverUrl: null,
  44. /**
  45. * Property: map
  46. * {SuperMap.Map}
  47. */
  48. map: null,
  49. /**
  50. * Property: drawFeature
  51. * {<SuperMap.Control.DrawFeature>} 绘制控件
  52. */
  53. drawFeature: null,
  54. /**
  55. * Property: isInializeOK
  56. * 标号库初始化是否完成。
  57. */
  58. isInializeOK: false,
  59. /**
  60. * Constructor: SuperMap.Plotting.PlotPanel
  61. * 标号库管理类。
  62. *
  63. * Parameters:
  64. * div - {String} 标绘面板div
  65. * url - {String} 标绘服务url
  66. * map - {<SuperMap.Map>}
  67. *
  68. * Returns:
  69. * {<SuperMap.Plotting.PlotPanel>} 结果类型对象。
  70. */
  71. initialize : function(div, url, map){
  72. if(url){
  73. this.serverUrl = url;
  74. }
  75. if(map && map !== null){
  76. this.map = map;
  77. }
  78. this.events = new SuperMap.Events(
  79. this, null, this.EVENT_TYPES, true
  80. );
  81. if (this.eventListeners instanceof Object) {
  82. this.events.on(this.eventListeners);
  83. }
  84. var plotPanel = document.getElementById(div);
  85. var treeNodeStyle = document.createElement("div");
  86. //treeNodeStyle.style = "height: 50%; width: 100%; font-size: 16px; border: 1px solid #617775;overflow: scroll";
  87. treeNodeStyle.style.height = '50%';
  88. treeNodeStyle.style.width = '100%';
  89. treeNodeStyle.style.border = '1px solid #617775';
  90. treeNodeStyle.style.overflow ='scroll';
  91. var treeNode = document.createElement("div");
  92. treeNode.id = "tree";
  93. treeNode.className = "ztree";
  94. var iconNodeStyle = document.createElement("div");
  95. //iconNodeStyle.style = "height: 50%; width: 100%";
  96. iconNodeStyle.style.height = '50%';
  97. iconNodeStyle.style.width = '100%';
  98. this.iconNode = document.createElement("div");
  99. this.iconNode.id = "icon";
  100. //this.iconNode.style = "height: 100%; width: 100%; overflow: scroll;border: 1px solid #617775;";
  101. this.iconNode.style.height = '100%';
  102. this.iconNode.style.width = '100%';
  103. this.iconNode.style.border = '1px solid #617775';
  104. this.iconNode.style.overflow ='scroll';
  105. treeNodeStyle.appendChild(treeNode);
  106. iconNodeStyle.appendChild(this.iconNode);
  107. plotPanel.appendChild(treeNodeStyle);
  108. plotPanel.appendChild(iconNodeStyle);
  109. },
  110. isInitializeOK: function(){
  111. return this.isInializeOK;
  112. },
  113. setDrawFeature: function(drawFeature){
  114. this.drawFeature = drawFeature;
  115. },
  116. /**
  117. * APIMethod: initializeAsync
  118. * 初始化标绘面板。
  119. */
  120. initializeAsync : function(){
  121. function beforeClickTreeNode(treeId, treeNode){
  122. var tree = $.fn.zTree.getZTreeObj(treeId);
  123. if (treeNode.isParent) {
  124. tree.expandNode(treeNode);
  125. return false;
  126. } else {
  127. me.iconNode.innerHTML = "";
  128. me.createDrawNodes(treeNode, me.iconNode);
  129. }
  130. }
  131. var me = this;
  132. var plotting = SuperMap.Plotting.getInstance(this.map, this.serverUrl);
  133. var symbolLibManager = plotting.getSymbolLibManager();
  134. var setting = {
  135. view: {
  136. dblClickExpand: false,
  137. showLine: true,
  138. selectedMulti: false
  139. },
  140. data: {
  141. simpleData: {
  142. enable:true,
  143. idKey: "id",
  144. pIdKey: "pId",
  145. rootPId: 0
  146. }
  147. },
  148. callback: {
  149. beforeClick: beforeClickTreeNode
  150. }
  151. };
  152. if(symbolLibManager.isInitializeOK()){
  153. var symbolTreeData = this.analysisSymbolTree(symbolLibManager);
  154. $.fn.zTree.init($("#tree"), setting, symbolTreeData);
  155. this.isInitializeOK = true;
  156. this.events.triggerEvent("initializeCompleted");
  157. } else {
  158. function initializeCompleted(result){
  159. if(result.libIDs.length !== 0){
  160. var symbolTreeData = this.analysisSymbolTree(symbolLibManager);
  161. $.fn.zTree.init($("#tree"), setting, symbolTreeData);
  162. this.isInitializeOK = true;
  163. this.events.triggerEvent("initializeCompleted");
  164. }
  165. }
  166. symbolLibManager.events.on({"initializeCompleted": initializeCompleted,
  167. scope: this});
  168. symbolLibManager.initializeAsync();
  169. }
  170. },
  171. createDrawNodes: function(treeNode, iconNode){
  172. drawNodeClick = function(){
  173. if(me.map !== null){
  174. var controls = me.map.controls;
  175. for(var i = 0; i < controls.length; i++){
  176. if(controls[i].CLASS_NAME === "SuperMap.Control.PlottingEdit"){
  177. controls[i].deactivate();
  178. }
  179. }
  180. }
  181. if(me.drawFeature === null){
  182. me.drawFeature = me.getDrawControl();
  183. }
  184. if(me.drawFeature !== null){
  185. me.drawFeature.handler.libID = this.libID;
  186. me.drawFeature.handler.symbolCode = this.symbolCode;
  187. me.drawFeature.handler.serverUrl = this.serverUrl;
  188. me.drawFeature.deactivate();
  189. me.drawFeature.activate();
  190. }
  191. }
  192. var me = this;
  193. var drawData = treeNode.drawData.drawNodes;
  194. var table = document.createElement("table");
  195. table.style.height = "100%";
  196. table.style.width = "100%";
  197. var i = 0;
  198. var rowLength = (drawData.length%3 === 0) ? drawData.length/3 : drawData.length/3+1;
  199. for(var j = 0; j < rowLength; j++){
  200. var tr = document.createElement("tr");
  201. for(var k = 0; k < 3; k++){
  202. if(drawData[i]){
  203. //存储菜单信息
  204. var td = document.createElement("td");
  205. var drawNode = document.createElement("div");
  206. drawNode.onclick = drawNodeClick;
  207. drawNode.style.textAlign = "center";
  208. drawNode.id = drawData[i].libID+ ""+ drawData[i].symbolCode;
  209. drawNode.libID = drawData[i].libID;
  210. drawNode.symbolCode = drawData[i].symbolCode;
  211. drawNode.serverUrl = treeNode.drawData.serverUrl;
  212. //图片
  213. var img = document.createElement("img");
  214. img.src = drawData[i].icon;
  215. //文本
  216. var text = document.createElement("div");
  217. text.innerHTML = drawData[i].symbolName;
  218. drawNode.appendChild(img);
  219. drawNode.appendChild(text);
  220. td.appendChild(drawNode);
  221. tr.appendChild(td);
  222. }
  223. i++;
  224. }
  225. table.appendChild(tr);
  226. }
  227. iconNode.appendChild(table);
  228. },
  229. analysisSymbolTree: function(symbolLibManager) {
  230. var treeData = [];
  231. var idIndex = this.addBasicCellTreeNodes(treeData);
  232. var idIndex1 = this.addNew(treeData);
  233. for(var i = 0; i < symbolLibManager.getSymbolLibNumber(); i++){
  234. var symbolLib = symbolLibManager.getSymbolLibByIndex(i);
  235. //console.log(symbolLib.libID);
  236. var rootSymbolInfo = symbolLib.getRootSymbolInfo();
  237. var rootSymbolIconUrl = symbolLib.getRootSymbolIconUrl();
  238. if(rootSymbolInfo.symbolNodeType === "SYMBOL_GROUP"){
  239. var rootNode = new Object();
  240. rootNode.id = idIndex+i;
  241. rootNode.pId = 0;
  242. rootNode.name = rootSymbolInfo.symbolName;
  243. rootNode.fullName = rootSymbolInfo.symbolName +"/";
  244. treeData.push(rootNode);
  245. idIndex = this.innerAnalysisSymbolTree(rootSymbolInfo.childNodes, treeData, rootNode, rootSymbolIconUrl);
  246. }
  247. }
  248. return treeData;
  249. },
  250. addBasicCellTreeNodes: function(treeData){
  251. var cellRootNode = new Object();
  252. cellRootNode.id = 1;
  253. cellRootNode.pId = 0;
  254. cellRootNode.name = "基本标号";
  255. cellRootNode.fullName = "BasicCell" +"/";
  256. cellRootNode.drawData = {serverUrl:this.serverUrl, drawNodes:[]};
  257. treeData.push(cellRootNode);
  258. var symbolCode = [24, 28, 29, 31, 34, 410, 32, 590, 360, 390, 400, 350, 26, 370, 380, 44, 48, 320
  259. , 1019, 1022,1024,321,1023,1025
  260. ,1013, 1014, 1016, 1017,1026, 1028
  261. ,1001, 1003, 1004];
  262. var symbolName = ["折线", "平行四边形", "圆", "椭圆", "注记", "正多边形", "多边形", "贝赛尔曲线", "闭合贝赛尔曲线"
  263. , "集结地", "大括号", "梯形", "矩形", "弓形", "扇形", "弧线", "平行线", "注记指示框"
  264. , "同心圆", "组合圆","标注框","多角标注框","自由线", "节点链"
  265. , "跑道形", "八字形", "箭头线", "沿线注记","线型标注", "铁丝网"
  266. , "对象间连线", "多边形区域","扇形区域"];
  267. var cellId = cellRootNode.id + 1;
  268. for(var i = 0; i < symbolCode.length; i++){
  269. var drawCellNode = {
  270. id: cellId++,
  271. pId: 0,
  272. icon:"images/" + cellRootNode.fullName + symbolCode[i] + ".png",
  273. symbolCode: symbolCode[i],
  274. libID: 0,
  275. symbolName: symbolName[i]
  276. };
  277. cellRootNode.drawData.drawNodes.push(drawCellNode);
  278. }
  279. return cellId;
  280. },
  281. addNew: function(treeData){
  282. var cellRootNode = new Object();
  283. cellRootNode.id = 1;
  284. cellRootNode.pId = 0;
  285. cellRootNode.name = "航线对象";
  286. cellRootNode.drawData = {serverUrl:this.serverUrl, drawNodes:[]};
  287. treeData.push(cellRootNode);
  288. var symbolCode = [1005,1006,1007];
  289. var symbolName = ["航线1","航线2","航线3"];
  290. var cellId = cellRootNode.id + 1;
  291. for(var i = 0; i < symbolCode.length; i++){
  292. var drawCellNode = {
  293. id: cellId++,
  294. pId: 0,
  295. icon:"images/BasicCell/RouteIcon/" + symbolCode[i] + ".png",
  296. symbolCode: symbolCode[i],
  297. libID: 0,
  298. symbolName: symbolName[i]
  299. };
  300. cellRootNode.drawData.drawNodes.push(drawCellNode);
  301. }
  302. return cellId;
  303. },
  304. innerAnalysisSymbolTree: function(childSymbolInfos, treeData, parentNode, rootSymbolIconUrl){
  305. var drawData = [];
  306. var treeNodeId = parentNode.id+1;
  307. for(var i = 0; i < childSymbolInfos.length; i++){
  308. if(childSymbolInfos[i].symbolNodeType === "SYMBOL_GROUP"){
  309. var treeNode = new Object();
  310. treeNode.id = treeNodeId++;
  311. treeNode.pId = parentNode.id;
  312. treeNode.name = childSymbolInfos[i].symbolName;
  313. treeNode.fullName = parentNode.fullName + childSymbolInfos[i].symbolName+"/";
  314. treeData.push(treeNode);
  315. treeNodeId = this.innerAnalysisSymbolTree(childSymbolInfos[i].childNodes, treeData, treeNode, rootSymbolIconUrl);
  316. } else if(childSymbolInfos[i].symbolNodeType === "SYMBOL_NODE"){
  317. var drawNode = new Object();
  318. drawNode.id = treeNodeId++;
  319. drawNode.pId = parentNode.id;
  320. drawNode.icon = rootSymbolIconUrl + parentNode.fullName + childSymbolInfos[i].symbolCode + ".png";
  321. drawNode.symbolCode = childSymbolInfos[i].symbolCode;
  322. drawNode.libID = childSymbolInfos[i].libID;
  323. drawNode.symbolName = childSymbolInfos[i].symbolName + "_" + childSymbolInfos[i].symbolCode;
  324. drawData.push(drawNode);
  325. }
  326. }
  327. if(drawData.length !== 0){
  328. parentNode.drawData = {serverUrl:this.serverUrl, drawNodes:drawData};
  329. }
  330. return treeNodeId;
  331. },
  332. getDrawControl: function(){
  333. var plotLayers = map.getLayersByClass("SuperMap.Layer.PlottingLayer");
  334. var editPlottingLayer = null;
  335. for(var i = 0; i < plotLayers.length; i ++){
  336. if(plotLayers[i].isEditable === true){
  337. editPlottingLayer = plotLayers[i];
  338. break;
  339. }
  340. }
  341. if(editPlottingLayer === null){
  342. return null;
  343. }
  344. var controls = map.controls;
  345. for(var j = 0; j < controls.length; j++){
  346. if(controls[j].CLASS_NAME === "SuperMap.Control.DrawFeature"
  347. && editPlottingLayer === controls[j].layer && controls[j].handler
  348. && controls[j].handler.CLASS_NAME === "SuperMap.Handler.GraphicObject"){
  349. return controls[j];
  350. }
  351. }
  352. return null;
  353. },
  354. CLASS_NAME: "SuperMap.Plotting.PlotPanel"
  355. });