DrawZdmAll.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. include("scripts/Common/DrawingUtils.js");
  2. include("scripts/Common/FileCTR.js");
  3. include("scripts/Common/FileDMX.js");
  4. include("scripts/Common/FileZDM.js");
  5. // 纵断面,地面线CTR
  6. // 有纵断面,画竖曲线半径和坡度
  7. // 有地面线才画设计高程,地面高程,里程桩号
  8. // 有CTR,才画桥梁,隧道
  9. function DrawZdmAll(ratio) {
  10. this.ratio = ratio || 10.0;
  11. }
  12. DrawZdmAll.prototype.applyPainting = function (layer, dmxFile, zdmFile, ctrFile, isCertCsv) {
  13. // 图层
  14. var layername = layer || getLayername("ZDM", zdmFile);
  15. addLayerToView(layername, "white", "CONTINUOUS", RLineweight.Weight025, 0);
  16. setCurrentLayer(layername);
  17. // qsTr("地面线文件") + " (*.dmx);"
  18. var fileDMX = new FileDMX(dmxFile, this.ratio);
  19. fileDMX.applyOperation();
  20. var dmxData = fileDMX.getArrayData();
  21. // qsTr("纵断面文件") + " (*.zdm);"
  22. var DrawZdmAll = new FileZDM(zdmFile, this.ratio);
  23. // 线绘图在生成CSV文件
  24. DrawZdmAll.applyOperation();
  25. if (isCertCsv) {
  26. DrawZdmAll.saveCsvFile();
  27. }
  28. var zdmData = DrawZdmAll.getZDMArray();
  29. // qsTr("桥梁 隧道") + " (*.ctr);"
  30. var fileCTR = new FileCTR(ctrFile, this.ratio);
  31. fileCTR.applyBridge(zdmData, dmxData, new RColor(31, 57, 197));
  32. fileCTR.applyTunnel(zdmData, new RColor(255, 255, 0));
  33. // 以下开始绘画表格数据
  34. var extreme_dmx = this.getExtremePosition(zdmData.length > 0 ? zdmData : dmxData);
  35. addPolylinetoView([extreme_dmx[0], extreme_dmx[2]], false, false, 0, new RColor(255, 255, 0));
  36. addPolylinetoView([extreme_dmx[1], extreme_dmx[3]], false, false, 0, new RColor(255, 255, 0));
  37. var startPoint = extreme_dmx[2];
  38. var endPoint = extreme_dmx[3];
  39. var text_width = 260;
  40. addPolylinetoView([[startPoint[0] - text_width, startPoint[1]], endPoint], false, false, 0, new RColor(255, 255, 0));
  41. var array = new Array();
  42. array.push({ name: "R", "space": 60, text: "竖曲线半径 (m)" });
  43. array.push({ name: "SJGC", "space": 100, text: "设计高程 (m)" });
  44. array.push({ name: "DMGC", "space": 100, text: "地面高程 (m)" });
  45. // array.push({ name: "PDPC", "space": 100, text: "坡度 (%) 坡长 (m)" });
  46. array.push({ name: "BLZH", "space": 120, text: "百里桩号 (m)" });
  47. for (var i = 0; i < array.length; i++) {
  48. var item = array[i];
  49. var space = (item.space || 100);
  50. var text = (item.text || "").toString();
  51. addPolylinetoView([[startPoint[0] - text_width, startPoint[1] - space * (i + 1)], [endPoint[0], endPoint[1] - space * (i + 1)]], false, false, 0, new RColor(255, 255, 0));
  52. addSimpleTextToView(text, [startPoint[0] - text_width + 50, startPoint[1] - space * (i + 1) + 50], 15, 0, "宋体", RS.VAlignTop, RS.HAlignLeft, false, false, 0);
  53. switch (item.name) {
  54. case "R":
  55. DrawZdmAll.applyRadius([startPoint[0], startPoint[1] - space * i], space);
  56. break;
  57. case "SJGC":
  58. this.applyHeightMileage(dmxData, [startPoint[0], startPoint[1] - space * i], space);
  59. break;
  60. case "DMGC":
  61. this.applyHeightMileage(zdmData, [startPoint[0], startPoint[1] - space * i], space);
  62. break;
  63. case "PDPC":
  64. DrawZdmAll.applySlope([startPoint[0], startPoint[1] - space * i], space);
  65. break;
  66. case "BLZH":
  67. this.applyMileage(zdmData, [startPoint[0], startPoint[1] - space * i], space);
  68. break;
  69. }
  70. if (i == array.length - 1) {
  71. addPolylinetoView([startPoint, [startPoint[0], startPoint[1] - space * (i + 1)]], false, false, 0, new RColor(255, 255, 0));
  72. addPolylinetoView([endPoint, [endPoint[0], endPoint[1] - space * (i + 1)]], false, false, 0, new RColor(255, 255, 0));
  73. }
  74. }
  75. // 居中显示
  76. var di = getAssignDocumentInterface(0);
  77. if (!isNull(di)) {
  78. di.autoZoom();
  79. }
  80. return true;
  81. }
  82. DrawZdmAll.prototype.applyHeightMileage = function (arrayData, startPoint, spacetext) {
  83. var space = 50;
  84. var spaceDistance = 0;
  85. for (var i = 0; i < arrayData.length; i++) {
  86. if (i != 0) {
  87. spaceDistance = spaceDistance + (arrayData[i][0] - arrayData[i - 1][0]);
  88. }
  89. if (i != 0 && spaceDistance < space) {
  90. // 不足最小间距
  91. continue;
  92. }
  93. spaceDistance = 0;
  94. var text = (round((arrayData[i][1]) * 100) / 100).toString();
  95. addSimpleTextToView(text, [arrayData[i][0], startPoint[1] - spacetext + 30], 15, 90, "宋体", RS.VAlignTop, RS.HAlignLeft, false, false, 0);
  96. }
  97. }
  98. DrawZdmAll.prototype.applyMileage = function (arrayData, startPoint, space) {
  99. spaceDistance = 0;
  100. var bailiDistance = 0;
  101. var tenBailiDistance = 0;
  102. for (var i = 0; i < arrayData.length; i++) {
  103. if (i != 0) {
  104. spaceDistance = spaceDistance + (arrayData[i][0] - arrayData[i - 1][0]);
  105. bailiDistance = bailiDistance + (arrayData[i][0] - arrayData[i - 1][0]);
  106. tenBailiDistance = tenBailiDistance + (arrayData[i][0] - arrayData[i - 1][0]);
  107. }
  108. if (i == 0 || spaceDistance >= 50) {
  109. // 绘制桩号 必须满足最小间距
  110. spaceDistance = 0;
  111. var text = (round((arrayData[i][0] % 1000) * 1000) / 1000).toString();
  112. addSimpleTextToView(text, [arrayData[i][0], startPoint[1] - 50], 15, 90, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 0);
  113. }
  114. if (i == 0) {
  115. var x = arrayData[i][0];
  116. addSimpleTextToView("K" + (Math.floor(arrayData[i][0] / 1000) * 1000).toString(), [x, startPoint[1] - space + 10], 15, 90, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 0);
  117. addPolylinetoView([[x, startPoint[1] - space], [x, startPoint[1] - space + 5]], false, false, 0, new RColor(255, 255, 0));
  118. } else if (tenBailiDistance > 1000) {
  119. // 千里标 K
  120. tenBailiDistance = tenBailiDistance % 1000;
  121. bailiDistance = bailiDistance % 100;
  122. var x = Math.floor(arrayData[i][0] / 1000) * 1000;
  123. addSimpleTextToView("K" + Math.floor(arrayData[i][0] / 1000).toString(), [x, startPoint[1] - space + 10], 15, 90, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 0);
  124. addPolylinetoView([[x, startPoint[1] - space], [x, startPoint[1] - space - 5]], false, false, 0, new RColor(255, 255, 0));
  125. } else if (bailiDistance > 100) {
  126. // 百里标
  127. bailiDistance = bailiDistance % 100;
  128. var x = Math.floor(arrayData[i][0] / 100) * 100;
  129. addSimpleTextToView(Math.floor(arrayData[i][0] / 100).toString(), [x, startPoint[1] - space + 10], 15, 90, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 0);
  130. addPolylinetoView([[x, startPoint[1] - space], [x, startPoint[1] - space + 5]], false, false, 0, new RColor(255, 255, 0));
  131. }
  132. }
  133. }
  134. DrawZdmAll.prototype.getExtremePosition = function (array) {
  135. var len = array.length;
  136. if (len == 0) {
  137. EAction.handleUserMessage("extreme data is empty...");
  138. return [[0, 0], [0, 0], [0, 0], [0, 0]];
  139. }
  140. var y_min = array[0][1];
  141. var y_max = array[0][1];
  142. for (var i = 0; i < len; i++) {
  143. y_min = Math.min(array[i][1], y_min);
  144. y_max = Math.max(array[i][1], y_max);
  145. }
  146. var padding = 0;
  147. var verPadding = 40
  148. return [
  149. // 左上
  150. [array[0][0] - padding, y_max + verPadding],
  151. // 右上
  152. [array[len - 1][0] + padding, y_max + verPadding],
  153. // 左下
  154. [array[0][0] - padding, y_min - verPadding],
  155. // 右下
  156. [array[len - 1][0] + padding, y_min - verPadding],
  157. ];
  158. };