PMOptimize - 副本.js 40 KB

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