DrawPM copy.js 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  1. // 传入文件名和颜色绘制PM视图
  2. function DrawPM() {
  3. this.newEntityData = new Array();
  4. this.newFZEntityData = new Array();
  5. this.ratio = 1.0;
  6. this.csvData = new Array();
  7. this.csvCoor = new Array();
  8. this.csvR = new Array();
  9. this.csvls = new Array();
  10. //圆心坐标
  11. this.centerO = new Array();
  12. this.CurHuanheTArr = new Array();
  13. this.primePointArr = new Array();
  14. // 里程距离(用于计算百里标和公里标)
  15. this.mileage = 0.0;
  16. }
  17. DrawPM.includeBasePath = includeBasePath;
  18. /** 外部调用入口
  19. * fileName 要加载的文件名称 需为PM文件
  20. * colorIndex 线的颜色
  21. * 0-优化后;1-初始PM文件;2-csv转pm;3-调整;4-表格手动输入
  22. */
  23. DrawPM.prototype.interface = function(fileName, colorIndex){
  24. this.fileName = fileName;
  25. this.colorIndex = colorIndex;
  26. var ok = this.readTxt(this.fileName);
  27. if (ok) {
  28. EAction.handleUserMessage("sucessful load!");
  29. var tmp = RSettings.getStringValue("OpenDisplayFile/PMFile", "");
  30. RSettings.setValue("OpenDisplayFile/PMFile", tmp + "," + this.fileName);
  31. }
  32. else {
  33. EAction.handleUserMessage("fail load!");
  34. }
  35. }
  36. DrawPM.prototype.applyOperation = function (preview) {
  37. var di = getAssignDocumentInterface(1);
  38. // 添加图层
  39. var layername = this.fileName;
  40. addLayerToView(layername.toString(), "white", "CONTINUOUS", RLineweight.Weight025,1);
  41. setCurrentLayer(layername.toString());
  42. var colorReady = new Array(
  43. [new RColor(255, 0, 0),new RColor(255, 0, 0),new RColor(160, 32, 240),new RColor(0, 255, 0)],
  44. [new RColor(128, 0, 128),new RColor(77, 255, 77),new RColor(200, 96, 255),new RColor(160, 32, 240)],
  45. [new RColor(255, 153, 77),new RColor(255, 153, 77),new RColor(128, 255, 255),new RColor(0, 255, 255)],
  46. [new RColor(77, 255, 255),new RColor(77, 255, 255),new RColor(255, 255, 128),new RColor(255, 255, 0)],
  47. [new RColor(148, 121, 253),new RColor(148, 121, 253),new RColor(255, 192, 128),new RColor(255, 165, 0)]
  48. );
  49. // var colorIndex = Math.floor(Math.random() * colorReady.length);
  50. var selectedArray = colorReady[this.colorIndex];
  51. var YQXColor = selectedArray[0];
  52. var ZXColor = selectedArray[1];
  53. var HHQXColor = selectedArray[2];
  54. var FZXColor = selectedArray[3];
  55. var jdIndx = 1;
  56. var lastType = 0;
  57. for (var i = 0; i < this.newEntityData.length; i++) {
  58. if (1 == this.newEntityData[i][8]) {
  59. var TempEntityData = new Array();
  60. TempEntityData.push([this.newEntityData[i][0], this.newEntityData[i][1]]);
  61. TempEntityData.push([this.newEntityData[i][2], this.newEntityData[i][3]]);
  62. addPolylinetoView(TempEntityData, false, false, 1, ZXColor);
  63. // EAction.handleUserMessage(this.newEntityData[i].toString());
  64. this.mileage_line(
  65. lastType,
  66. new Array(this.newEntityData[i][0], this.newEntityData[i][1]),
  67. new Array(this.newEntityData[i][2], this.newEntityData[i][3]),
  68. ZXColor, true
  69. );
  70. }
  71. else if (3 == this.newEntityData[i][8]) {
  72. //-1:右曲线,1:左曲线 其中右曲线因为是逆时针(角度由大到小),需要画出对应的反向弧 lyz
  73. // EAction.handleUserMessage(this.newEntityData[i].toString());
  74. if (1 == this.newEntityData[i][7]) {
  75. addArctoView(this.newEntityData[i][0], this.newEntityData[i][1], this.newEntityData[i][4],
  76. this.newEntityData[i][5], this.newEntityData[i][6], false, 1, YQXColor);
  77. }
  78. else if (-1 == this.newEntityData[i][7]) {
  79. addArctoView(this.newEntityData[i][0], this.newEntityData[i][1], this.newEntityData[i][4],
  80. this.newEntityData[i][5], this.newEntityData[i][6], true, 1, YQXColor);
  81. }
  82. this.mileage_circle(
  83. lastType,
  84. new Array(this.newEntityData[i][0], this.newEntityData[i][1]),
  85. this.newEntityData[i][4],
  86. this.newEntityData[i][5],
  87. this.newEntityData[i][6],
  88. true,
  89. YQXColor,
  90. true
  91. );
  92. }
  93. else {
  94. //-1:右曲线,1:左曲线 其中右曲线因为是逆时针(角度由大到小),需要画出对应的反向弧 lyz
  95. // EAction.handleUserMessage(this.newEntityData[i].toString());
  96. if (1 == this.newEntityData[i][7]) {
  97. addArctoView(this.newEntityData[i][0], this.newEntityData[i][1], this.newEntityData[i][4],
  98. this.newEntityData[i][5], this.newEntityData[i][6], false, 1, HHQXColor);
  99. }
  100. else if (-1 == this.newEntityData[i][7]) {
  101. addArctoView(this.newEntityData[i][0], this.newEntityData[i][1], this.newEntityData[i][4],
  102. this.newEntityData[i][5], this.newEntityData[i][6], true, 1, HHQXColor);
  103. }
  104. this.mileage_circle(
  105. lastType,
  106. new Array(this.newEntityData[i][0], this.newEntityData[i][1]),
  107. this.newEntityData[i][4],
  108. this.newEntityData[i][5],
  109. this.newEntityData[i][6],
  110. true,
  111. YQXColor,
  112. lastType != this.newEntityData[i][8]
  113. );
  114. }
  115. lastType = this.newEntityData[i][8];
  116. }
  117. //绘制辅助线,1为辅助线起点,2为焦点点,3为辅助线终点
  118. for (var i = 0; i < this.newFZEntityData.length;) {
  119. var TempLineData = new Array();
  120. if (i < this.newFZEntityData.length && this.newFZEntityData[i][2] == 1) {
  121. TempLineData.push([this.newFZEntityData[i][0], this.newFZEntityData[i][1]]);
  122. }
  123. if (i + 1 < this.newFZEntityData.length && this.newFZEntityData[i + 1][2] == 2) {
  124. TempLineData.push([this.newFZEntityData[i + 1][0], this.newFZEntityData[i + 1][1]]);
  125. addCircleToView(this.newFZEntityData[i + 1][0], this.newFZEntityData[i + 1][1], 0.5, 1, FZXColor);
  126. }
  127. if (i + 2 < this.newFZEntityData.length && this.newFZEntityData[i + 2][2] == 3) {
  128. TempLineData.push([this.newFZEntityData[i + 2][0], this.newFZEntityData[i + 2][1]]);
  129. }
  130. // 计算角度
  131. this.calDeg([this.newFZEntityData[i][0], this.newFZEntityData[i][1]], [this.newFZEntityData[i + 1][0], this.newFZEntityData[i + 1][1]],
  132. [this.newFZEntityData[i + 2][0], this.newFZEntityData[i + 2][1]], jdIndx);
  133. jdIndx = jdIndx + 1;
  134. addPolylinetoView(TempLineData, false, false, 1, FZXColor);
  135. i = i + 3;
  136. }
  137. // this.drawPrimeTxt();
  138. // EAction.handleUserMessage("fileIndex: " + this.fileIndex);
  139. // EAction.handleUserMessage("csvCoor: " + this.csvCoor.toString());
  140. // EAction.handleUserMessage("csvls: " + this.csvls.toString());
  141. // EAction.handleUserMessage("csvR: " + this.csvR.toString());
  142. EAction.handleUserMessage("save csv file start!");
  143. // var fname = this.fileName.substring(0,this.fileName.lastIndexOf("."))+".csv";
  144. var fname = RSettings.getStringValue("OpenProject/Current", RSettings.getDocumentsLocation()) + "/JD_R_ls.csv";
  145. var file = new QFile(fname);
  146. if ( file.exists())
  147. {
  148. //如果文件存在执行的操作,此处为空,因为文件不可能存在
  149. }
  150. file.open( makeQIODeviceOpenMode(QIODevice.WriteOnly, QIODevice.Text));
  151. var out = new QTextStream(file);
  152. //写表头
  153. out.writeString("JD_x,JD_y,R,ls\n");
  154. //写数据
  155. for(i = 0;i < this.csvCoor.length; i++)
  156. {
  157. if(i == 0 || i == this.csvCoor.length-1){
  158. out.writeString(this.csvCoor[i][0]+","+this.csvCoor[i][1]+","+0+","+0+"\n");
  159. }
  160. else{
  161. out.writeString(this.csvCoor[i][0]+","+this.csvCoor[i][1]+","+this.csvR[i-1]+","+this.csvls[i-1]+"\n");
  162. }
  163. }
  164. out.flush();
  165. //写完数据需要关闭文件
  166. file.close();
  167. EAction.handleUserMessage("save csv file success!");
  168. // var di = getAssignDocumentInterface(1);
  169. if (!isNull(di)) {
  170. // di.regenerateScenes();
  171. di.autoZoom();
  172. }
  173. // op.addObject(shapeToEntity(doc, line));
  174. return true;
  175. };
  176. DrawPM.prototype.readTxt = function (file) {
  177. var reader = new QFile(file);
  178. var flags = makeQIODeviceOpenMode(QIODevice.ReadOnly, QIODevice.Text);
  179. if (!reader.open(flags)) {
  180. EAction.handleUserWarning("cannot open file: " + file);
  181. return;
  182. }
  183. //每次都去文件中的一行,然后输出读取到的字符串lyz
  184. var ts = new QTextStream(reader);
  185. setUtf8Codec(ts);
  186. //定义初始值 lyz
  187. var pLineNo = 0;
  188. var LineStartPointX = 0.0;
  189. var LineStartPointY = 0.0;
  190. var CurCurveStartPointX = 0.0;
  191. var CurCurveStartPointY = 0.0;
  192. var CurCurveEndPointX = 0.0;
  193. var CurCurveEndPointY = 0.0;
  194. var CurCurveZ = 0;
  195. var CurCurveS = 0.0;
  196. var CurCurveRO = 0.0;
  197. var CurCurveRD = 0.0;
  198. var CurCurveType = 0;
  199. var CurCurveStartZH = 0.0;
  200. var CurCurveEndZH = 0.0;
  201. var CurCurveStartAngle = 0.0;
  202. var CurCurveEndAngle = 0.0;
  203. var CurHuanheT = 0.0;
  204. var CurCurveCenterPointX = 0.0;
  205. var CurCurveCenterPointY = 0.0;
  206. var DeltaS = 5.0;//缓和曲线取样点间隔
  207. var TempFZData = new Array();//临时辅助线 liyz
  208. //当读取出现错误(返回 -1)或者读取到的字符数为 0 时,结束读取 lyz
  209. do {
  210. var textLine = ts.readLine().trim();
  211. //EAction.handleUserWarning(textLine);
  212. textLine = textLine.replace(/[\t]+/g, " ").replace(/[\s]+/g, " ");
  213. textLine = textLine.replace(/\r\n/g, "");
  214. //EAction.handleUserMessage(textLine);
  215. var fields = textLine.split(" "); // Reserved: ',&[' & ';&['
  216. if (fields.length < 4 || pLineNo < 1 /*|| pLineNo >10*/) { // With two extra fields >
  217. pLineNo++;
  218. continue;
  219. } // End with two extra
  220. if (pLineNo == 1) {
  221. // EAction.handleUserMessage("LineCurveTotalNum: " + fields[0]);
  222. }
  223. else if (pLineNo == 2) {
  224. // EAction.handleUserMessage("LineStartLinkMode: " + fields[0]);
  225. // EAction.handleUserMessage("LineStartZH: " + fields[1]);
  226. // EAction.handleUserMessage("LineStartXY: " + fields[4] + "," + fields[5]);
  227. //添加线路起点坐标 lyz
  228. LineStartPointX = parseFloat(fields[4]);
  229. LineStartPointY = parseFloat(fields[5]);
  230. //用曲线入口X1,Y1作为起始位置 lyz
  231. CurCurveStartPointX = parseFloat(fields[4]);
  232. CurCurveStartPointY = parseFloat(fields[5]);
  233. //用桩号/公里标作为起始位置 lyz
  234. // CurCurveStartPointX = parseFloat(fields[1]);
  235. // CurCurveStartPointY = 0.0;
  236. this.csvCoor.push([fields[4], fields[5]]);
  237. }
  238. else if ((pLineNo - 3) % 3 == 0) {
  239. // EAction.handleUserMessage("Curve Z: " + fields[0]);
  240. // EAction.handleUserMessage("Curve S: " + fields[2]);
  241. // EAction.handleUserMessage("Curve T: " + fields[3]);
  242. // EAction.handleUserMessage("Curve RO: " + fields[4]);
  243. // EAction.handleUserMessage("Curve RD: " + fields[5]);
  244. // EAction.handleUserMessage("Curve Type: " + fields[6]);
  245. CurCurveZ = parseInt(fields[0]);
  246. CurCurveS = Math.abs(parseFloat(fields[2]));
  247. CurHuanheT = parseFloat(fields[3]);
  248. CurCurveRO = parseFloat(fields[4]);
  249. CurCurveRD = parseFloat(fields[5]);
  250. CurCurveType = parseInt(fields[6]);
  251. }
  252. else if ((pLineNo - 3) % 3 == 1) {
  253. //EAction.handleUserMessage("Curve Z:" + fields[0]);
  254. //EAction.handleUserMessage("Curve S:" + fields[2]);
  255. //EAction.handleUserMessage("Curve RO:" + fields[2]);
  256. //EAction.handleUserMessage("Curve RD:" + fields[2]);
  257. }
  258. else if ((pLineNo - 3) % 3 == 2) {
  259. // EAction.handleUserMessage("Curve StartZH: " + fields[0]);
  260. // EAction.handleUserMessage("Curve EndZH: " + fields[1]);
  261. // EAction.handleUserMessage("Curve StartAngle: " + fields[2]);
  262. // EAction.handleUserMessage("Curve EndAngle: " + fields[3]);
  263. CurCurveStartZH = parseFloat(fields[0]);
  264. CurCurveEndZH = parseFloat(fields[1]);
  265. CurCurveStartAngle = parseFloat(fields[2]);
  266. CurCurveEndAngle = parseFloat(fields[3]);
  267. if (1 == CurCurveType) {
  268. //确定直线的起始和终止点 lyz
  269. CurCurveEndPointX = CurCurveStartPointX + Math.abs(CurCurveS) * Math.cos(CurCurveStartAngle);
  270. CurCurveEndPointY = CurCurveStartPointY + Math.abs(CurCurveS) * Math.sin(CurCurveStartAngle);
  271. this.newEntityData.push([CurCurveStartPointX / parseFloat(this.ratio), CurCurveStartPointY / parseFloat(this.ratio),
  272. CurCurveEndPointX / parseFloat(this.ratio), CurCurveEndPointY / parseFloat(this.ratio), 0,
  273. 0, 0, CurCurveZ, CurCurveType]);
  274. }
  275. else if (21 == CurCurveType || 22 == CurCurveType) {
  276. ////确定直缓和及缓和直曲线的起始和终止点 lyz
  277. //var CurCurveStartAngleByCenter = 0.0;
  278. //var CurCurveEndAngleByCenter = 0.0;
  279. //var TempCurveR = Math.abs(CurCurveS) / Math.abs(CurCurveEndAngle - CurCurveStartAngle);
  280. //if (CurCurveZ == 1) {
  281. // CurCurveStartAngleByCenter = rad2deg(CurCurveStartAngle) - 90;
  282. // CurCurveEndAngleByCenter = rad2deg(CurCurveEndAngle) - 90;
  283. //} else if (CurCurveZ == -1) {
  284. // CurCurveStartAngleByCenter = rad2deg(CurCurveStartAngle) + 90;
  285. // CurCurveEndAngleByCenter = rad2deg(CurCurveEndAngle) + 90;
  286. //}
  287. //CurCurveCenterPointX = CurCurveStartPointX - TempCurveR * Math.cos(deg2rad(CurCurveStartAngleByCenter));
  288. //CurCurveCenterPointY = CurCurveStartPointY - TempCurveR * Math.sin(deg2rad(CurCurveStartAngleByCenter));
  289. //CurCurveEndPointX = CurCurveCenterPointX + TempCurveR * Math.cos(deg2rad(CurCurveEndAngleByCenter));
  290. //CurCurveEndPointY = CurCurveCenterPointY + TempCurveR * Math.sin(deg2rad(CurCurveEndAngleByCenter));
  291. //this.newEntityData.push([CurCurveCenterPointX / parseFloat(this.ratio), CurCurveCenterPointY / parseFloat(this.ratio), 0, 0, TempCurveR / parseFloat(this.ratio),
  292. // CurCurveStartAngleByCenter, CurCurveEndAngleByCenter, CurCurveZ, CurCurveType]);
  293. this.CurHuanheTArr.push(CurHuanheT);
  294. if (CurCurveZ == 1) {
  295. CurCurveStartAngleByCenter = rad2deg(CurCurveStartAngle) - 90;
  296. CurCurveEndAngleByCenter = rad2deg(CurCurveEndAngle) - 90;
  297. } else if (CurCurveZ == -1) {
  298. CurCurveStartAngleByCenter = rad2deg(CurCurveStartAngle) + 90;
  299. CurCurveEndAngleByCenter = rad2deg(CurCurveEndAngle) + 90;
  300. }
  301. var CurCurveDeltaR = Math.abs(CurCurveRD - CurCurveRO);
  302. // EAction.handleUserMessage("Curve CurCurveDeltaR: " + CurCurveDeltaR.toString());
  303. var TempStartPointX = CurCurveStartPointX;
  304. var TempStartPointY = CurCurveStartPointY;
  305. var TempEndPointX = 0;
  306. var TempEndPointY = 0;
  307. var TempCenterPointX = 0;
  308. var TempCenterPointY = 0;
  309. var TempStartAngleByCenter = CurCurveStartAngleByCenter;
  310. var TempEndAngleByCenter = 0.0;
  311. var TempCurveR = 0;
  312. //插值求解缓和曲线:计算每个分段曲线(用圆弧或者线段都可以,此处用圆弧)的半径、起始角度、终止角度及圆心,再将分段曲线拟合成缓和曲线,liyz
  313. for (var j = 0; j < CurCurveS; j = j + DeltaS) {
  314. if (21 == CurCurveType) {
  315. TempCurveR = CurCurveRO - (j / CurCurveS) * CurCurveDeltaR;
  316. }
  317. else {
  318. TempCurveR = CurCurveRO + (j / CurCurveS) * CurCurveDeltaR;
  319. }
  320. // EAction.handleUserMessage("Curve TempCurveR: " + TempCurveR.toString());
  321. if (1 == CurCurveZ) {
  322. TempEndAngleByCenter = TempStartAngleByCenter + rad2deg(DeltaS / TempCurveR);
  323. }
  324. else {
  325. TempEndAngleByCenter = TempStartAngleByCenter - rad2deg(DeltaS / TempCurveR);
  326. }
  327. TempCenterPointX = TempStartPointX - TempCurveR * Math.cos(deg2rad(TempStartAngleByCenter));
  328. TempCenterPointY = TempStartPointY - TempCurveR * Math.sin(deg2rad(TempStartAngleByCenter));
  329. TempEndPointX = TempCenterPointX + TempCurveR * Math.cos(deg2rad(TempEndAngleByCenter));
  330. TempEndPointY = TempCenterPointY + TempCurveR * Math.sin(deg2rad(TempEndAngleByCenter));
  331. this.newEntityData.push([TempCenterPointX / parseFloat(this.ratio), TempCenterPointY / parseFloat(this.ratio), 0, 0, TempCurveR / parseFloat(this.ratio),
  332. TempStartAngleByCenter, TempEndAngleByCenter, CurCurveZ, CurCurveType]);
  333. //存储临时辅助线数据
  334. if (21 == CurCurveType && j == 0) {
  335. TempFZData.push([TempStartPointX, TempStartPointY, CurCurveStartAngle, 1, CurCurveZ]);
  336. this.csvls.push(Math.abs(CurCurveS));
  337. }
  338. else if (22 == CurCurveType && j + DeltaS >= CurCurveS) {
  339. TempFZData.push([TempEndPointX, TempEndPointY, CurCurveEndAngle, 3, CurCurveZ]);
  340. }
  341. TempStartPointX = TempEndPointX;
  342. TempStartPointY = TempEndPointY;
  343. TempStartAngleByCenter = TempEndAngleByCenter;
  344. if (j + DeltaS >= CurCurveS) {
  345. CurCurveEndPointX = TempEndPointX;
  346. CurCurveEndPointY = TempEndPointY;
  347. }
  348. }
  349. }
  350. else if (3 == CurCurveType) {
  351. //确定圆曲线的起始和终止点 lyz
  352. var CurCurveStartAngleByCenter = 0.0;
  353. var CurCurveEndAngleByCenter = 0.0;
  354. if (CurCurveZ == 1) {
  355. CurCurveStartAngleByCenter = rad2deg(CurCurveStartAngle) - 90;
  356. CurCurveEndAngleByCenter = rad2deg(CurCurveEndAngle) - 90;
  357. } else if (CurCurveZ == -1) {
  358. CurCurveStartAngleByCenter = rad2deg(CurCurveStartAngle) + 90;
  359. CurCurveEndAngleByCenter = rad2deg(CurCurveEndAngle) + 90;
  360. }
  361. CurCurveCenterPointX = CurCurveStartPointX - CurCurveRO * Math.cos(deg2rad(CurCurveStartAngleByCenter));
  362. CurCurveCenterPointY = CurCurveStartPointY - CurCurveRO * Math.sin(deg2rad(CurCurveStartAngleByCenter));
  363. CurCurveEndPointX = CurCurveCenterPointX + CurCurveRO * Math.cos(deg2rad(CurCurveEndAngleByCenter));
  364. CurCurveEndPointY = CurCurveCenterPointY + CurCurveRO * Math.sin(deg2rad(CurCurveEndAngleByCenter));
  365. this.newEntityData.push([CurCurveCenterPointX / parseFloat(this.ratio), CurCurveCenterPointY / parseFloat(this.ratio), 0, 0, CurCurveRO / parseFloat(this.ratio),
  366. CurCurveStartAngleByCenter, CurCurveEndAngleByCenter, CurCurveZ, CurCurveType]);
  367. var Rl = abs(deg2rad(CurCurveEndAngleByCenter - CurCurveStartAngleByCenter) * CurCurveRO);
  368. this.centerO.push([CurCurveCenterPointX, CurCurveCenterPointY, Rl, (CurCurveEndAngleByCenter - CurCurveStartAngleByCenter)]);
  369. this.csvR.push(CurCurveRO);
  370. }
  371. CurCurveStartPointX = CurCurveEndPointX;
  372. CurCurveStartPointY = CurCurveEndPointY;
  373. // this.primePointArr.push([CurCurveType, CurCurveStartPointX, CurCurveStartPointY, CurCurveEndZH, CurCurveEndAngle]);
  374. }
  375. // EAction.handleUserMessage("\n");
  376. pLineNo++;
  377. }
  378. while (!ts.atEnd());
  379. //处理辅助线点信息 liyz
  380. for (var j = 0; j < TempFZData.length - 1; j++) {
  381. if (1 == TempFZData[j][3] && 3 == TempFZData[j + 1][3]) {
  382. this.newFZEntityData.push([TempFZData[j][0] / parseFloat(this.ratio), TempFZData[j][1] / parseFloat(this.ratio), TempFZData[j][3]]);
  383. //计算辅助线交点值 liyz
  384. var k_1 = Math.tan(TempFZData[j][2]);
  385. var b_1 = TempFZData[j][1] - TempFZData[j][0] * k_1;
  386. var k_2 = Math.tan(TempFZData[j + 1][2]);
  387. var b_2 = TempFZData[j + 1][1] - TempFZData[j + 1][0] * k_2;
  388. var TempJDX = (b_2 - b_1) / (k_1 - k_2);
  389. var TempJDY = k_1 * TempJDX + b_1;
  390. this.newFZEntityData.push([TempJDX / parseFloat(this.ratio), TempJDY / parseFloat(this.ratio), 2]);
  391. this.csvCoor.push([TempJDX / parseFloat(this.ratio), TempJDY / parseFloat(this.ratio)]);
  392. this.newFZEntityData.push([TempFZData[j + 1][0] / parseFloat(this.ratio), TempFZData[j + 1][1] / parseFloat(this.ratio), TempFZData[j + 1][3]]);
  393. }
  394. }
  395. this.csvCoor.push([CurCurveEndPointX, CurCurveEndPointY]);
  396. // EAction.handleUserMessage("newFZEntityData: " + this.newFZEntityData.toString());
  397. this.applyOperation();
  398. reader.close();
  399. return true;
  400. };
  401. DrawPM.prototype.calDeg = function (A, B, C, jdIndx) {
  402. var JD_x = B[0];
  403. var JD_y = B[1];
  404. var C_x = this.centerO[jdIndx - 1][0];
  405. var C_y = this.centerO[jdIndx - 1][1];
  406. // 计算向量AB与x轴的夹角
  407. var angleRad = Math.atan2(JD_y - C_y, JD_x - C_x);
  408. // 将弧度转换为角度
  409. var angleDeg = rad2deg(angleRad);
  410. // 保证角度在0到360度之间
  411. if (angleDeg < 0) {
  412. angleDeg += 360.0;
  413. }
  414. // 相对JD的向圆心的偏移量
  415. var drift_x = Math.cos(deg2rad(angleDeg));
  416. var drift_y = Math.sin(deg2rad(angleDeg));
  417. // JD文本的旋转角度
  418. var angle_vertical = 0;
  419. if (0 <= angleDeg && angleDeg < 90) {
  420. drift_x = - Math.abs(drift_x);
  421. drift_y = - Math.abs(drift_y);
  422. angle_vertical = - (90 - angleDeg % 90);
  423. } else if (90 <= angleDeg && angleDeg < 180) {
  424. drift_x = Math.abs(drift_x);
  425. drift_y = - Math.abs(drift_y);
  426. angle_vertical = angleDeg % 90;
  427. } else if (180 <= angleDeg && angleDeg < 270) {
  428. drift_x = Math.abs(drift_x);
  429. drift_y = Math.abs(drift_y);
  430. angle_vertical = - (90 - angleDeg % 90);
  431. } else {
  432. drift_x = - Math.abs(drift_x);
  433. drift_y = Math.abs(drift_y);
  434. angle_vertical = angleDeg % 90;
  435. }
  436. if (angleDeg > 180) {
  437. // 标注文本方向始终是JD向内的方向
  438. angle_vertical = angle_vertical + 180;
  439. }
  440. // 交点和圆心的的连线
  441. // addLineToView([JD_x, JD_y], [C_x, C_y], 1);
  442. // EAction.handleUserMessage("jdIndx: " + jdIndx.toString() + ", angleDeg:" + angleDeg.toString() + ",angleDeg % 90:" + (angleDeg % 90).toString()+ ",angle_vertical:" + angle_vertical.toString());
  443. // JD标注
  444. addSimpleTextToView("JD" + jdIndx.toString(), [JD_x - 20 * drift_x -10, JD_y - 20 * drift_y], 15, angle_vertical, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 1);
  445. // 圆心和JD连接与圆的交叉点
  446. var cross_x = C_x - this.csvR[jdIndx - 1] * drift_x;
  447. var cross_y = C_y - this.csvR[jdIndx - 1] * drift_y;
  448. // 标注和交叉点的距离
  449. var distance = 150;
  450. var angle = this.centerO[jdIndx - 1][3];
  451. var textArray = new Array();
  452. textArray.push("JD" + jdIndx.toString());
  453. // textArray.push("az-" + this.centerO[jdIndx - 1][3].toString());
  454. var deg = Math.floor(angle);
  455. var min = Math.floor((angle - deg) * 60);
  456. var sec = Math.floor(((angle - deg) * 60 - min) * 60);
  457. textArray.push("az-" + deg.toString() + "°" + min.toString() + "'" + sec.toString() + "''");
  458. textArray.push("R-" + this.csvR[jdIndx - 1].toString());
  459. textArray.push("l-" + this.csvls[jdIndx - 1].toString());
  460. textArray.push("T-" + (round(this.CurHuanheTArr[jdIndx - 1] * 1000) / 1000).toString());
  461. textArray.push("L-" + (round(this.centerO[jdIndx - 1][2] * 1000) / 1000).toString());
  462. for (var i = 0; i < textArray.length; i++) {
  463. var text_x = (distance + 25 * i) * drift_x + cross_x;
  464. var text_y = (distance + 25 * i) * drift_y + cross_y;
  465. addSimpleTextToView(textArray[i], [text_x, text_y], 15, angle_vertical, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 1);
  466. }
  467. return true;
  468. };
  469. DrawPM.prototype.drawPrimeTxt = function(){
  470. var digree = rad2deg(this.primePointArr[i][4]) + 90;
  471. if(1 == this.primePointArr[i][0]){
  472. addSimpleTextToView("ZH +"+(this.primePointArr[i][3] % 1000).toString(),[this.primePointArr[i][1]+1, this.primePointArr[i][2]],
  473. 15,digree,"Standard",RS.VAlignTop,RS.HAlignLeft,false,false,1);
  474. }else if(21 == this.primePointArr[i][0]){
  475. addSimpleTextToView("HY +"+(this.primePointArr[i][3] % 1000).toString(),[this.primePointArr[i][1]+1, this.primePointArr[i][2]],
  476. 15,digree,"Standard",RS.VAlignTop,RS.HAlignLeft,false,false,1);
  477. }else if(3 == this.primePointArr[i][0]){
  478. addSimpleTextToView("YH +"+(this.primePointArr[i][3] % 1000).toString(),[this.primePointArr[i][1]+1, this.primePointArr[i][2]],
  479. 15,digree,"Standard",RS.VAlignTop,RS.HAlignLeft,false,false,1);
  480. }else{
  481. addSimpleTextToView("HZ +" + (this.primePointArr[i][3] % 1000).toString(),[this.primePointArr[i][1]+1, this.primePointArr[i][2]],
  482. 15,digree,"Standard",RS.VAlignTop,RS.HAlignLeft,false,false,1);
  483. }
  484. // // type,x,y,zh,angle
  485. // for(var i = 0; i < this.primePointArr.length; i++){
  486. // var digree = rad2deg(this.primePointArr[i][4]) + 90;
  487. // var zdx = this.primePointArr[i][1] + 160 * Math.sin(digree);
  488. // var zdy = this.primePointArr[i][2] + 160 * Math.cos(digree);
  489. // // addLineToView([this.primePointArr[i][1], this.primePointArr[i][2]],[zdx, zdy],0);
  490. // if(1 == this.primePointArr[i][0]){
  491. // addSimpleTextToView("ZH +"+this.primePointArr[i][3].toString(),[this.primePointArr[i][1]+1, this.primePointArr[i][2]],
  492. // 10,digree,"Standard",RS.VAlignTop,RS.HAlignLeft,false,false,0);
  493. // }else if(21 == this.primePointArr[i][0]){
  494. // addSimpleTextToView("HY +"+this.primePointArr[i][3].toString(),[this.primePointArr[i][1]+1, this.primePointArr[i][2]],
  495. // 10,digree,"Standard",RS.VAlignTop,RS.HAlignLeft,false,false,0);
  496. // }else if(3 == this.primePointArr[i][0]){
  497. // addSimpleTextToView("YH +"+this.primePointArr[i][3].toString(),[this.primePointArr[i][1]+1, this.primePointArr[i][2]],
  498. // 10,digree,"Standard",RS.VAlignTop,RS.HAlignLeft,false,false,0);
  499. // }else{
  500. // addSimpleTextToView("HZ +"+this.primePointArr[i][3].toString(),[this.primePointArr[i][1]+1, this.primePointArr[i][2]],
  501. // 10,digree,"Standard",RS.VAlignTop,RS.HAlignLeft,false,false,0);
  502. // }
  503. // }
  504. // return true;
  505. };
  506. DrawPM.prototype.compute_offset = function(origin, target){
  507. var origin_x = origin[0];
  508. var origin_y = origin[1];
  509. var target_x = target[0];
  510. var target_y = target[1];
  511. // 计算向量AB与x轴的夹角
  512. var angleRad = Math.atan2(origin_y - target_y, origin_x - target_x);
  513. // 将弧度转换为角度
  514. var angleDeg = rad2deg(angleRad);
  515. // 保证角度在0到360度之间
  516. if (angleDeg < 0) {
  517. angleDeg += 360.0;
  518. }
  519. // target向origin偏移量
  520. var drift_x = Math.cos(deg2rad(angleDeg));
  521. var drift_y = Math.sin(deg2rad(angleDeg));
  522. // JD文本的旋转角度
  523. var vertical_angle = 0;
  524. var vertical_drift_x = 0;
  525. var vertical_drift_y = 0;
  526. if (0 <= angleDeg && angleDeg < 90) {
  527. drift_x = -Math.abs(drift_x);
  528. drift_y = -Math.abs(drift_y);
  529. vertical_angle = -(90 - (angleDeg % 90));
  530. vertical_drift_x = Math.abs(Math.cos(deg2rad(vertical_angle)));
  531. vertical_drift_y = - Math.abs(Math.sin(deg2rad(vertical_angle)));
  532. } else if (90 <= angleDeg && angleDeg < 180) {
  533. drift_x = Math.abs(drift_x);
  534. drift_y = -Math.abs(drift_y);
  535. vertical_angle = angleDeg % 90;
  536. vertical_drift_x = Math.abs(Math.cos(deg2rad(vertical_angle)));
  537. vertical_drift_y = Math.abs(Math.sin(deg2rad(vertical_angle)));
  538. } else if (180 <= angleDeg && angleDeg < 270) {
  539. drift_x = Math.abs(drift_x);
  540. drift_y = Math.abs(drift_y);
  541. vertical_angle = -(90 - (angleDeg % 90));
  542. vertical_drift_x = Math.abs(Math.cos(deg2rad(vertical_angle)));
  543. vertical_drift_y = - Math.abs(Math.sin(deg2rad(vertical_angle)));
  544. } else {
  545. drift_x = -Math.abs(drift_x);
  546. drift_y = Math.abs(drift_y);
  547. vertical_angle = angleDeg % 90;
  548. vertical_drift_x = Math.abs(Math.cos(deg2rad(vertical_angle)));
  549. vertical_drift_y = Math.abs(Math.sin(deg2rad(vertical_angle)));
  550. }
  551. return new Array(drift_x, drift_y, angleDeg, vertical_drift_x, vertical_drift_y, vertical_angle);
  552. }
  553. DrawPM.prototype.mileage_line = function (CurCurveType,origin, target, ZXColor, isPrime) {
  554. var origin_x = origin[0];
  555. var origin_y = origin[1];
  556. var target_x = target[0];
  557. var target_y = target[1];
  558. var distance = Math.sqrt(Math.pow(target_x - origin_x, 2) + Math.pow(target_y - origin_y, 2));
  559. var distanceNext = 100 - (this.mileage % 100);
  560. if(isPrime && 0 !== this.mileage){
  561. var angle_prime = this.compute_offset(origin, target)[5];
  562. if (1 == CurCurveType) {
  563. addSimpleTextToView("ZH +" + (round(this.mileage % 1000 * 1000) / 1000).toString(), [origin_x, origin_y], 15, angle_prime + 90, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 1);
  564. } else if (21 == CurCurveType) {
  565. addSimpleTextToView("HY +" + (round(this.mileage % 1000 * 1000) / 1000).toString(), [origin_x, origin_y], 15, angle_prime + 90, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 1);
  566. } else if (3 == CurCurveType) {
  567. addSimpleTextToView("YH +" + (round(this.mileage % 1000 * 1000) / 1000).toString(), [origin_x, origin_y], 15, angle_prime + 90, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 1);
  568. } else {
  569. addPolylinetoView(new Array([origin_x, origin_y], [origin_x + 150 * Math.cos(deg2rad(angle_prime)), origin_y + 150 * Math.sin(deg2rad(angle_prime))]), false, false, 1, ZXColor);
  570. var origin_text_x = origin_x + 18 * Math.abs(Math.cos(deg2rad(angle_prime + 90))) + 15 * Math.cos(deg2rad(angle_prime));
  571. var origin_text_y = origin_y + 18 * Math.abs(Math.sin(deg2rad(angle_prime + 90))) + 15 * Math.sin(deg2rad(angle_prime));
  572. addSimpleTextToView("HZ +" + (round(this.mileage % 1000 * 1000) / 1000).toString(), [origin_text_x, origin_text_y], 15, angle_prime, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 1);
  573. }
  574. }
  575. if (distance < distanceNext) {
  576. // 不足下一个百米标的位置直接返回
  577. this.mileage += distance;
  578. return;
  579. }
  580. this.mileage += distanceNext;
  581. var offset = this.compute_offset(origin, target);
  582. var offset_x = offset[0];
  583. var offset_y = offset[1];
  584. var angle = offset[2];
  585. var offset_vertical_x = offset[3];
  586. var offset_vertical_y = offset[4];
  587. var angle_vertical = offset[5];
  588. // 下一个百米标的坐标
  589. var x = origin_x + distanceNext * offset_x;
  590. var y = origin_y + distanceNext * offset_y;
  591. // addPolylinetoView(new Array([x, y], [x - 20 * offset_vertical_x, y - 20 * offset_vertical_y]), false, false, 0, ZXColor);
  592. // addPolylinetoView(new Array([x, y], [x + 20 * offset_vertical_x, y + 20 * offset_vertical_y]), false, false, 0, ZXColor);
  593. var text = this.mileage % 1000 == 0 ? "K " + this.mileage / 1000 : (this.mileage / 100)% 10;
  594. // EAction.handleUserMessage("--mileage_line: " + this.mileage.toString() + ", angle: " + angle.toString() + ", angle_vertical: " + angle_vertical.toString());
  595. // EAction.handleUserMessage("--mileage_line: offset_vertical_x: " + offset_vertical_x.toString() + ", offset_vertical_y: " + offset_vertical_y.toString());
  596. addPolylinetoView(new Array([x, y], [x + 10 * offset_vertical_x, y + 10 * offset_vertical_y]), false, false, 1, ZXColor);
  597. addSimpleTextToView(text.toString(), [x + 20 * offset_vertical_x, y + 20 * offset_vertical_y], 15, angle_vertical, "Standard" , RS.VAlignTop, RS.HAlignLeft, false, false, 1);
  598. // var isReverse = angle > 90 && angle < 270;
  599. // addPolylinetoView(new Array([x, y], [x + (isReverse?1:-1) * 10 * offset_vertical_x, y + (isReverse?1:-1) * 10 * offset_vertical_y]), false, false, 0, ZXColor);
  600. // addSimpleTextToView(text.toString(), [x + (isReverse?1:-1) * 20 * offset_vertical_x, y + (isReverse?1:-1) * 20 * offset_vertical_y], 15, isReverse ? angle-90 : angle, "Standard" , RS.VAlignTop, RS.HAlignLeft, false, false, 0);
  601. this.mileage_line(CurCurveType,new Array(x, y), target, ZXColor, false);
  602. };
  603. DrawPM.prototype.mileage_circle = function (CurCurveType, center, radius, startAngle, endAngle, reversed, ZXColor,isPrime) {
  604. var center_x = center[0];
  605. var center_y = center[1];
  606. var angle_gap = startAngle - endAngle;
  607. var distance = radius * deg2rad(Math.abs(angle_gap));
  608. var distanceNext = 100 - (this.mileage % 100);
  609. if (isPrime && 0 !== this.mileage) {
  610. var prime_offset_x = Math.abs(Math.cos(deg2rad(startAngle)));
  611. var prime_offset_y = Math.abs(Math.sin(deg2rad(startAngle)));
  612. var tmp_startAngle = (startAngle + 360) % 360;
  613. if (tmp_startAngle <= 90) {
  614. prime_offset_x = prime_offset_x;
  615. prime_offset_y = prime_offset_y;
  616. } else if (tmp_startAngle > 90 && tmp_startAngle <= 180) {
  617. prime_offset_x = - prime_offset_x;
  618. prime_offset_y = prime_offset_y;
  619. } else if (tmp_startAngle > 180 && tmp_startAngle <= 270) {
  620. prime_offset_x = - prime_offset_x;
  621. prime_offset_y = - prime_offset_y;
  622. } else {
  623. prime_offset_x = prime_offset_x;
  624. prime_offset_y = - prime_offset_y;
  625. }
  626. var prime_x = center_x + radius * prime_offset_x;
  627. var prime_y = center_y + radius * prime_offset_y;
  628. var angle_prime = this.compute_offset(new Array(prime_x, prime_y), new Array(center_x, center_y))[5];
  629. var reverse_prime = angle_prime > 0 && angle_prime < 90;
  630. var angle_prime_text = reverse_prime ? angle_prime - 90 : angle_prime + 90;
  631. // EAction.handleUserMessage("---mileage: " + this.mileage.toString()+",angle_prime_text:"+angle_prime_text.toString());
  632. addPolylinetoView(new Array([prime_x, prime_y], [prime_x + 150 * Math.cos(deg2rad(angle_prime_text)), prime_y + 150 * Math.sin(deg2rad(angle_prime_text))]), false, false, 1, ZXColor);
  633. var prime_text_x = prime_x + 18 * Math.abs(Math.cos(deg2rad(angle_prime_text + 90))) + 15 * Math.cos(deg2rad(angle_prime_text));
  634. var prime_text_y = prime_y + 18 * Math.abs(Math.sin(deg2rad(angle_prime_text + 90))) + 15 * Math.sin(deg2rad(angle_prime_text));
  635. if(1 == CurCurveType){
  636. addSimpleTextToView("ZH +" + (round(this.mileage % 1000 * 1000) / 1000).toString(), [prime_text_x, prime_text_y], 15, angle_prime_text, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 1);
  637. }else if (21 == CurCurveType) {
  638. addSimpleTextToView("HY +" + (round(this.mileage % 1000 * 1000) / 1000).toString(), [prime_text_x, prime_text_y], 15, angle_prime_text , "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 1);
  639. } else if (3 == CurCurveType) {
  640. addSimpleTextToView("YH +" + (round(this.mileage % 1000 * 1000) / 1000).toString(), [prime_text_x, prime_text_y], 15, angle_prime_text , "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 1);
  641. } else {
  642. addSimpleTextToView("HZ +" + (round(this.mileage % 1000 * 1000) / 1000).toString(), [prime_text_x, prime_text_y], 15, angle_prime_text , "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 1);
  643. }
  644. }
  645. if (distance < distanceNext) {
  646. // 不足下一个百米标的位置直接返回
  647. this.mileage += distance;
  648. return;
  649. }
  650. this.mileage += distanceNext;
  651. var newAngle = startAngle + (angle_gap > 0 ? -1 : 1) * rad2deg(distanceNext / radius);
  652. var new_offset_x = Math.abs(Math.cos(deg2rad(newAngle)));
  653. var new_offset_y = Math.abs(Math.sin(deg2rad(newAngle)));
  654. // 计算坐标偏移方向
  655. var tmp_angle = (newAngle + 360 ) % 360;
  656. if(tmp_angle <= 90){
  657. new_offset_x = new_offset_x;
  658. new_offset_y = new_offset_y;
  659. } else if(tmp_angle > 90 && tmp_angle <= 180){
  660. new_offset_x = - new_offset_x;
  661. new_offset_y = new_offset_y;
  662. }else if(tmp_angle > 180 && tmp_angle <= 270){
  663. new_offset_x = - new_offset_x;
  664. new_offset_y = - new_offset_y;
  665. }else{
  666. new_offset_x = new_offset_x;
  667. new_offset_y = - new_offset_y;
  668. }
  669. var new_x = center_x + radius * new_offset_x;
  670. var new_y = center_y + radius * new_offset_y;
  671. // 开始画线
  672. var offset = this.compute_offset(new Array(new_x, new_y), new Array(center_x, center_y));
  673. var offset_x = offset[0];
  674. var offset_y = offset[1];
  675. var angle = offset[3];
  676. var angle_vertical = offset[5];
  677. // addPolylinetoView(new Array([new_x, new_y], [new_x - 20 * offset_x, new_y - 20 * offset_y]), false, false, 0, ZXColor);
  678. // addPolylinetoView(new Array([new_x, new_y], [new_x + 20 * offset_x, new_y + 20 * offset_y]), false, false, 0, ZXColor);
  679. var text = this.mileage % 1000 == 0 ? "K " + this.mileage / 1000 : (this.mileage / 100) % 10;
  680. var isReverse = tmp_angle > 90 && tmp_angle < 270;
  681. // EAction.handleUserMessage("--mileage_circle: " + this.mileage.toString() + ", tmp_angle: " + tmp_angle.toString() + ",angle: " + angle.toString() + ", angle_vertical: " + angle_vertical.toString());
  682. // EAction.handleUserMessage("--mileage_circle: offset_x: " + offset_x.toString() + ", offset_y: " + offset_y.toString());
  683. addPolylinetoView(new Array([new_x, new_y], [ new_x + (isReverse?1:-1) * 10 * offset_x, new_y + (isReverse?1:-1) *10 * offset_y]), false, false, 1, ZXColor);
  684. addSimpleTextToView(text.toString(), [new_x + (isReverse?1:-1) *20 * offset_x, new_y + (isReverse?1:-1) *20 * offset_y], 15, isReverse?tmp_angle-180:tmp_angle, "Standard" , RS.VAlignTop, RS.HAlignLeft, false, false, 1);
  685. // addPolylinetoView(new Array([new_x, new_y], [new_x + 10 * offset_x, new_y + 10 * offset_y]), false, false, 0, ZXColor);
  686. // addSimpleTextToView(text.toString(), [new_x + 20 * offset_x, new_y + 20 * offset_y], 15, isReverse ? angle_vertical + 270 :angle_vertical-90, "Standard" , RS.VAlignTop, RS.HAlignLeft, false, false, 0);
  687. this.mileage_circle(CurCurveType, center, radius, newAngle, endAngle, reversed, ZXColor, false);
  688. };