zhanghaijun %!s(int64=2) %!d(string=hai) anos
pai
achega
695cf0c694
Modificáronse 4 ficheiros con 381 adicións e 3 borrados
  1. 1 0
      .gitignore
  2. 175 0
      project/示例/JD_R_ls.pm
  3. 3 3
      scripts/Common/DrawZdmAll.js
  4. 202 0
      scripts/Common/FileCTRCSV.js

+ 1 - 0
.gitignore

@@ -6,6 +6,7 @@ python/**/*.spec
 project/示例/*.csv
 project/*.csv
 project/**/para.ini
+!project/**/诸城南-五莲北.*
 
 ## ------ 超过20MB的文件 --- start ---
 plugins/script/qtscript_widgets.pdb

+ 175 - 0
project/示例/JD_R_ls.pm

@@ -0,0 +1,175 @@
+HINTCAD5.83_PM_SHUJU_PM
+	57	NULL	NULL	0.00000000
+	1	0	3.3900044110333973	0	491554.96610369	3969992.51251148
+	1	0.00000000	194.55128430	0.00000000	9999.00000000	9999.00000000	1
+491554.96610369	3969992.51251148	491460.67642133	3969968.59585713	491366.38673896	3969944.67920278	0.00000000	0.00000000
+0.00000000	194.55128430	3.39000441	3.39000441
+	-1	0.00000000	-450.00000000	1643.16767252	9999.00000000	6000.00000000	21
+491366.38673896	3969944.67920278	491147.95536706	3969890.72410840	490928.87836562	3969839.50739855	489672.76911409	3975706.55005655
+194.55128430	644.55128430	3.39000441	3.35250441
+	-1	0.00000000	-488.75116976	0.00000000	6000.00000000	6000.00000000	3
+490928.87836562	3969839.50739855	490688.94235758	3969793.22687119	490447.32090398	3969756.75430164	489672.76911409	3975706.55005655
+644.55128430	1133.30245406	3.35250441	3.27104588
+	-1	0.00000000	-450.00000000	1643.16767252	6000.00000000	9999.00000000	22
+490447.32090398	3969756.75430164	490223.71398440	3969731.89812646	489999.80149836	3969709.83877385	0.00000000	0.00000000
+1133.30245406	1583.30245406	3.27104588	3.23354588
+	1	0.00000000	1469.44934259	0.00000000	9999.00000000	9999.00000000	1
+489999.80149836	3969709.83877385	489960.67793468	3969706.23106188	488536.56016796	3969574.90849762	0.00000000	0.00000000
+1583.30245406	3052.75179665	3.23354588	3.23354588
+	-1	0.00000000	-590.00000000	2172.55609824	9999.00000000	8000.00000000	21
+488536.56016796	3969574.90849762	488242.65003269	3969549.62608677	487948.46679161	3969527.96062496	487508.06369605	3977515.82924643
+3052.75179665	3642.75179665	3.23354588	3.19667088
+	-1	0.00000000	-561.32823232	0.00000000	8000.00000000	8000.00000000	3
+487948.46679161	3969527.96062496	487668.01475150	3969517.42851537	487387.36586446	3969516.73979606	487508.06369605	3977515.82924643
+3642.75179665	4204.08002897	3.19667088	3.12650485
+	-1	0.00000000	-590.00000000	2172.55609824	8000.00000000	9999.00000000	22
+487387.36586446	3969516.73979606	487092.55164581	3969526.62655746	486797.86570983	3969540.13829483	0.00000000	0.00000000
+4204.08002897	4794.08002897	3.12650485	3.08962985
+	1	0.00000000	918.28792011	0.00000000	9999.00000000	9999.00000000	1
+486797.86570983	3969540.13829483	487209.94187522	3969518.70637035	485880.81726036	3969587.83363554	0.00000000	0.00000000
+4794.08002897	5712.36794908	3.08962985	3.08962985
+	-1	0.00000000	-410.00000000	2123.67605816	9999.00000000	11000.00000000	21
+485880.81726036	3969587.83363554	485676.12880801	3969599.11694378	485471.51716849	3969611.67152636	486247.46300867	3980584.26958027
+5712.36794908	6122.36794908	3.08962985	3.07099349
+	-1	0.00000000	-374.53654793	0.00000000	11000.00000000	11000.00000000	3
+485471.51716849	3969611.67152636	485284.83686283	3969626.47095421	485098.43554680	3969644.44618628	486247.46300867	3980584.26958027
+6122.36794908	6496.90449702	3.07099349	3.03694471
+	-1	0.00000000	-410.00000000	2123.67605816	11000.00000000	9999.00000000	22
+485098.43554680	3969644.44618628	484894.76893449	3969667.75823469	484691.24833440	3969692.33547837	0.00000000	0.00000000
+6496.90449702	6906.90449702	3.03694471	3.01830835
+	1	0.00000000	1663.58389885	0.00000000	9999.00000000	9999.00000000	1
+484691.24833440	3969692.33547837	484458.68995935	3969721.15242041	483040.29085316	3969896.91011917	0.00000000	0.00000000
+6906.90449702	8570.48839587	3.01830835	3.01830835
+	-1	0.00000000	-470.00000000	2167.94833887	9999.00000000	10000.00000000	21
+483040.29085316	3969896.91011917	482807.19086483	3969926.72148360	482574.33658482	3969958.35745989	484036.91436637	3979850.82258418
+8570.48839587	9040.48839587	3.01830835	2.99480835
+	-1	0.00000000	-740.15018145	0.00000000	10000.00000000	10000.00000000	3
+482574.33658482	3969958.35745989	482209.32607920	3970019.24485261	481846.81826534	3970093.59556672	484036.91436637	3979850.82258418
+9040.48839587	9780.63857731	2.99480835	2.92079333
+	-1	0.00000000	-470.00000000	2167.94833887	10000.00000000	9999.00000000	22
+481846.81826534	3970093.59556672	481618.15026620	3970147.75179336	481389.90866774	3970203.69904301	0.00000000	0.00000000
+9780.63857731	10250.63857731	2.92079333	2.89729333
+	1	0.00000000	4794.85869599	0.00000000	9999.00000000	9999.00000000	1
+481389.90866774	3970203.69904301	479879.56432430	3970580.19514798	476737.42351633	3971363.46273899	0.00000000	0.00000000
+10250.63857731	15045.49727331	2.89729333	2.89729333
+	1	0.00000000	-410.00000000	2123.67605816	9999.00000000	11000.00000000	21
+476737.42351633	3971363.46273899	476538.35830239	3971412.42921902	476338.99540988	3971460.15738322	473877.71723350	3960739.05157548
+15045.49727331	15455.49727331	2.89729333	2.91592969
+	1	0.00000000	-453.96691181	0.00000000	11000.00000000	11000.00000000	3
+476338.99540988	3971460.15738322	476117.25860942	3971508.65947241	475894.56825504	3971552.57606836	473877.71723350	3960739.05157548
+15455.49727331	15909.46418511	2.91592969	2.95719941
+	1	0.00000000	-410.00000000	2123.67605816	11000.00000000	9999.00000000	22
+475894.56825504	3971552.57606836	475692.70550990	3971588.28282815	475490.62209724	3971622.73525763	0.00000000	0.00000000
+15909.46418511	16319.46418511	2.95719941	2.97583578
+	1	0.00000000	6914.80943256	0.00000000	9999.00000000	9999.00000000	1
+475490.62209724	3971622.73525763	472709.09972265	3972088.06120629	468670.58874247	3972763.67107023	0.00000000	0.00000000
+16319.46418511	23234.27361767	2.97583578	2.97583578
+	-1	0.00000000	-470.00000000	2167.94833887	9999.00000000	10000.00000000	21
+468670.58874247	3972763.67107023	468438.96475399	3972803.35292970	468207.66372491	3972844.84732282	470088.95464117	3982666.29041894
+23234.27361767	23704.27361767	2.97583578	2.95233578
+	-1	0.00000000	-1549.86039485	0.00000000	10000.00000000	10000.00000000	3
+468207.66372491	3972844.84732282	467452.97787165	3973019.96334025	466714.11357259	3973252.97815575	470088.95464117	3982666.29041894
+23704.27361767	25254.13401253	2.95233578	2.79734974
+	-1	0.00000000	-470.00000000	2167.94833887	10000.00000000	9999.00000000	22
+466714.11357259	3973252.97815575	466493.85389378	3973334.87824493	466274.23790021	3973418.50322551	0.00000000	0.00000000
+25254.13401253	25724.13401253	2.79734974	2.77384974
+	1	0.00000000	9349.91911464	0.00000000	9999.00000000	9999.00000000	1
+466274.23790021	3973418.50322551	463076.83648432	3974650.36220940	457549.44346887	3976779.89424431	0.00000000	0.00000000
+25724.13401253	35074.05312717	2.77384974	2.77384974
+	1	0.00000000	-410.00000000	2123.67605816	9999.00000000	11000.00000000	21
+457549.44346887	3976779.89424431	457357.92229801	3976852.99907781	457165.95323954	3976924.91167168	453403.31095302	3966588.44597869
+35074.05312717	35484.05312717	2.77384974	2.79248610
+	1	0.00000000	-322.47678106	0.00000000	11000.00000000	11000.00000000	3
+457165.95323954	3976924.91167168	457014.04217128	3976978.95221732	456861.35532759	3977030.76033438	453403.31095302	3966588.44597869
+35484.05312717	35806.52990823	2.79248610	2.82180217
+	1	0.00000000	-410.00000000	2123.67605816	11000.00000000	9999.00000000	22
+456861.35532759	3977030.76033438	456666.15991172	3977093.38852444	456470.57653348	3977154.80365066	0.00000000	0.00000000
+35806.52990823	36216.52990823	2.82180217	2.84043854
+	1	0.00000000	842.81093595	0.00000000	9999.00000000	9999.00000000	1
+456470.57653348	3977154.80365066	456613.81347450	3977110.31407700	455665.69648235	3977404.80040472	0.00000000	0.00000000
+36216.52990823	37059.34084418	2.84043854	2.84043854
+	1	0.00000000	-670.00000000	2165.64078277	9999.00000000	7000.00000000	21
+455665.69648235	3977404.80040472	455344.99948247	3977501.61318032	455022.82670707	3977593.28661083	453268.64702939	3970816.64631808
+37059.34084418	37729.34084418	2.84043854	2.88829567
+	1	0.00000000	-2404.53175738	0.00000000	7000.00000000	7000.00000000	3
+455022.82670707	3977593.28661083	453838.82755552	3977793.38560465	452638.05007870	3977788.18470525	453268.64702939	3970816.64631808
+37729.34084418	40133.87260156	2.88829567	3.23180023
+	1	0.00000000	-670.00000000	2165.64078277	7000.00000000	9999.00000000	22
+452638.05007870	3977788.18470525	452305.26763984	3977750.03810056	451973.10693142	3977706.58073013	0.00000000	0.00000000
+40133.87260156	40803.87260156	3.23180023	3.27965736
+	1	0.00000000	8578.98017193	0.00000000	9999.00000000	9999.00000000	1
+451973.10693142	3977706.58073013	449604.40964934	3977377.45331473	443475.76263000	3976525.88575958	0.00000000	0.00000000
+40803.87260156	49382.85277349	3.27965736	3.27965736
+	1	0.00000000	-590.00000000	2172.55609824	9999.00000000	8000.00000000	21
+443475.76263000	3976525.88575958	443183.82914698	3976483.49225293	442892.45439738	3976437.51479258	444284.84448745	3968559.61851010
+49382.85277349	49972.85277349	3.27965736	3.31653236
+	1	0.00000000	-2067.36790889	0.00000000	8000.00000000	8000.00000000	3
+442892.45439738	3976437.51479258	441888.98461403	3976192.43280435	440925.45888326	3975820.09565445	444284.84448745	3968559.61851010
+49972.85277349	52040.22068239	3.31653236	3.57495335
+	1	0.00000000	-590.00000000	2172.55609824	8000.00000000	9999.00000000	22
+440925.45888326	3975820.09565445	440660.07589364	3975691.31273481	440396.28253073	3975559.26944799	0.00000000	0.00000000
+52040.22068239	52630.22068239	3.57495335	3.61182835
+	1	0.00000000	605.10536531	0.00000000	9999.00000000	9999.00000000	1
+440396.28253073	3975559.26944799	441585.29172542	3976163.59816562	439856.85438150	3975285.09837923	0.00000000	0.00000000
+52630.22068239	53235.32604770	3.61182835	3.61182835
+	-1	0.00000000	-670.00000000	2165.64078277	9999.00000000	7000.00000000	21
+439856.85438150	3975285.09837923	439557.02197926	3975135.70022051	439254.87001242	3974991.11977924	436385.35207994	3981375.93511198
+53235.32604770	53905.32604770	3.61182835	3.56397121
+	-1	0.00000000	-1776.75778754	0.00000000	7000.00000000	7000.00000000	3
+439254.87001242	3974991.11977924	438423.66041034	3974679.27205672	437559.66501887	3974475.13884493	436385.35207994	3981375.93511198
+53905.32604770	55682.08383523	3.56397121	3.31014866
+	-1	0.00000000	-670.00000000	2165.64078277	7000.00000000	9999.00000000	22
+437559.66501887	3974475.13884493	437228.20070977	3974426.86124290	436895.97848404	3974383.87668760	0.00000000	0.00000000
+55682.08383523	56352.08383523	3.31014866	3.26229152
+	1	0.00000000	2589.22981366	0.00000000	9999.00000000	9999.00000000	1
+436895.97848404	3974383.87668760	437170.78446552	3974417.20747239	434325.58601515	3974072.11783237	0.00000000	0.00000000
+56352.08383523	58941.31364890	3.26229152	3.26229152
+	1	0.00000000	-670.00000000	2165.64078277	9999.00000000	7000.00000000	21
+434325.58601515	3974072.11783237	433993.36378943	3974029.13327707	433661.89948033	3973980.85567504	434836.21239880	3967080.05940446
+58941.31364890	59611.31364890	3.26229152	3.31014865
+	1	0.00000000	-3044.01648168	0.00000000	7000.00000000	7000.00000000	3
+433661.89948033	3973980.85567504	432200.90460640	3973565.05359994	430864.00553814	3972843.87521105	434836.21239880	3967080.05940446
+59611.31364890	62655.33013057	3.31014865	3.74500817
+	1	0.00000000	-670.00000000	2165.64078277	7000.00000000	9999.00000000	22
+430864.00553814	3972843.87521105	430592.82314653	3972647.25520812	430324.78984059	3972446.31385807	0.00000000	0.00000000
+62655.33013057	63325.33013057	3.74500817	3.79286530
+	1	0.00000000	727.64917181	0.00000000	9999.00000000	9999.00000000	1
+430324.78984059	3972446.31385807	431814.97569040	3973582.15508104	429746.08102144	3972005.21362017	0.00000000	0.00000000
+63325.33013057	64052.97930239	3.79286530	3.79286530
+	1	0.00000000	-670.00000000	2165.64078277	9999.00000000	7000.00000000	21
+429746.08102144	3972005.21362017	429481.28515221	3971800.02486098	429219.82143040	3971590.65428700	433724.68451016	3966232.83676190
+64052.97930239	64722.97930239	3.79286530	3.84072244
+	1	0.00000000	-769.28432517	0.00000000	7000.00000000	7000.00000000	3
+429219.82143040	3971590.65428700	428932.36284444	3971335.15486254	428659.37016030	3971064.25379397	433724.68451016	3966232.83676190
+64722.97930239	65492.26362756	3.84072244	3.95062021
+	1	0.00000000	-670.00000000	2165.64078277	7000.00000000	9999.00000000	22
+428659.37016030	3971064.25379397	428434.04308687	3970816.40903400	428212.68104108	3970564.97688820	0.00000000	0.00000000
+65492.26362756	66162.26362756	3.95062021	3.99847735
+	1	0.00000000	3169.20138391	0.00000000	9999.00000000	9999.00000000	1
+428212.68104108	3970564.97688820	427867.49766070	3970166.54423768	426137.50316255	3968169.67436362	0.00000000	0.00000000
+66162.26362756	69331.46501147	3.99847735	3.99847735
+	1	0.00000000	-220.00000000	1624.80768093	9999.00000000	12000.00000000	21
+426137.50316255	3968169.67436362	426065.60285542	3968086.42580064	425993.95749409	3968002.95819897	435135.27908950	3960228.88336794
+69331.46501147	69551.46501147	3.99847735	4.00764402
+	1	0.00000000	-66.83992551	0.00000000	12000.00000000	12000.00000000	3
+425993.95749409	3968002.95819897	425972.34219914	3967977.46953063	425950.79797302	3967951.92076334	435135.27908950	3960228.88336794
+69551.46501147	69618.30493698	4.00764402	4.01321401
+	1	0.00000000	-220.00000000	1624.80768093	12000.00000000	9999.00000000	22
+425950.79797302	3967951.92076334	425880.39037434	3967867.40645462	425810.24111882	3967782.67712467	0.00000000	0.00000000
+69618.30493698	69838.30493698	4.01321401	4.02238068
+	1	0.00000000	454.44054961	0.00000000	9999.00000000	9999.00000000	1
+425810.24111882	3967782.67712467	425826.92379168	3967802.88996961	425520.96990185	3967432.19406350	0.00000000	0.00000000
+69838.30493698	70292.74548659	4.02238068	4.02238068
+	-1	0.00000000	-100.00000000	670.82039325	9999.00000000	4500.00000000	21
+425520.96990185	3967432.19406350	425489.07141214	3967393.69108317	425457.03068694	3967355.30669747	422018.48815687	3970258.13725894
+70292.74548659	70392.74548659	4.02238068	4.01126957
+	-1	0.00000000	-151.66924165	0.00000000	4500.00000000	4500.00000000	3
+425457.03068694	3967355.30669747	425407.62584879	3967297.77483165	425357.25853739	3967241.08367221	422018.48815687	3970258.13725894
+70392.74548659	70544.41472823	4.01126957	3.97756529
+	-1	0.00000000	-100.00000000	670.82039325	4500.00000000	9999.00000000	22
+425357.25853739	3967241.08367221	425323.53035170	3967204.17325867	425289.66552526	3967167.38784484	0.00000000	0.00000000
+70544.41472823	70644.41472823	3.97756529	3.96645418
+	1	0.00000000	639.80756392	0.00000000	9999.00000000	9999.00000000	1
+425289.66552526	3967167.38784484	425072.56004845	3966932.43329253	424855.45457164	3966697.47874022	0.00000000	0.00000000
+70644.41472823	71284.22229215	3.96645418	3.96645418
+	0	0.00000000	0.00000000	0.00000000	0.00000000	0

+ 3 - 3
scripts/Common/DrawZdmAll.js

@@ -1,6 +1,6 @@
 
 include("scripts/Common/DrawingUtils.js");
-include("scripts/Common/FileCTR.js");
+include("scripts/Common/FileCTRCSV.js");
 include("scripts/Common/FileDMX.js");
 include("scripts/Common/FileZDM.js");
 
@@ -20,7 +20,7 @@ DrawZdmAll.prototype.applyPainting = function (layer, dmxFile, zdmFile, ctrFile,
   addLayerToView(layername, "white", "CONTINUOUS", RLineweight.Weight025, 0);
   setCurrentLayer(layername);
   // 如果存在同名的DXF就直接在家DXF,解决ZDM加载慢的问题
-  var dxfFile = dmxFile.replace(/.\w+$/i, ".dxf");
+  var dxfFile = zdmFile.replace(/.\w+$/i, ".dxf");
   var qFile = new QFile(dxfFile);
   if (qFile.exists()) {
     // 绘画到ZDM
@@ -46,7 +46,7 @@ DrawZdmAll.prototype.applyPainting = function (layer, dmxFile, zdmFile, ctrFile,
   }
   var zdmData = drawZdm.getZDMArray();
   // qsTr("桥梁 隧道") + " (*.ctr);"
-  var fileCTR = new FileCTR(ctrFile, this.ratio);
+  var fileCTR = new FileCTRCSV(ctrFile, this.ratio);
   fileCTR.applyBridge(zdmData, dmxData, new RColor(31, 57, 197));
   fileCTR.applyTunnel(zdmData, new RColor(0, 128, 0));
 

+ 202 - 0
scripts/Common/FileCTRCSV.js

@@ -0,0 +1,202 @@
+include("scripts/EAction.js");
+include("scripts/simple.js");
+include("scripts/Common/DrawingUtils.js");
+
+function FileCTRCSV(file, ratio) {
+  // 比例尺
+  this.ratio = ratio || 1.0;
+  // 桥梁数据 {起点、终点、中点}
+  this.bridgeArrayData = new Array();
+  // 隧道数据 {开始、结束}
+  this.tunnelArrayData = new Array();
+  // 图层名称
+  this.layername = "CTR-" + Math.floor(Math.random() * 100);
+  this.readBridgeTxt(file + ".bridge.csv");
+  this.readTunnelTxt(file + ".tunnel.csv");
+}
+// 获取桥梁数据
+FileCTRCSV.prototype.getBridgeArray = function () {
+  return this.bridgeArrayData;
+};
+// 获取隧道数据
+FileCTRCSV.prototype.getTunnelArray = function () {
+  return this.tunnelArrayData;
+};
+// 读取桥梁数据
+FileCTRCSV.prototype.readBridgeTxt = function (file) {
+  var reader = new QFile(file);
+  var flags = makeQIODeviceOpenMode(QIODevice.ReadOnly, QIODevice.Text);
+  if (!reader.open(flags)) {
+    EAction.handleUserWarning("cannot open file: " + file);
+    return false;
+  }
+  EAction.handleUserMessage("Starting to load CTR file: " + file);
+  var ts = new QTextStream(reader);
+  setUtf8Codec(ts);
+  do {
+    var textLine = ts.readLine().trim();
+    textLine = textLine.replace(/[\t]+/g, " ").replace(/[\s]+/g, " ");
+    var fields = textLine.split(",");
+    if (fields < 3) {
+      continue;
+    }
+    if (fields[0].indexOf("桥") == -1) {
+      continue;
+    }
+    qDebug(parseFloat(fields[1]));
+    qDebug(parseFloat(fields[2]));
+    // 桥梁数据:起点、终点、中点
+    this.bridgeArrayData.push([fields[1] / this.ratio, fields[2] / this.ratio, (fields[1] + (fields[2] - fields[1]) * 1 / 2) / this.ratio]);
+  } while (!ts.atEnd());
+  reader.close();
+  return true;
+}
+// 读取隧道数据
+FileCTRCSV.prototype.readTunnelTxt = function (file) {
+  var reader = new QFile(file);
+  var flags = makeQIODeviceOpenMode(QIODevice.ReadOnly, QIODevice.Text);
+  if (!reader.open(flags)) {
+    EAction.handleUserWarning("cannot open file: " + file);
+    return false;
+  }
+  EAction.handleUserMessage("Starting to load CTR file: " + file);
+  var ts = new QTextStream(reader);
+  setUtf8Codec(ts);
+  do {
+    var textLine = ts.readLine().trim();
+    textLine = textLine.replace(/[\t]+/g, " ").replace(/[\s]+/g, " ");
+    var fields = textLine.split(",");
+    if (fields < 3) {
+      continue;
+    }
+    if (fields[0].indexOf("隧道") == -1) {
+      continue;
+    }
+    qDebug(parseFloat(fields[1]));
+    qDebug(parseFloat(fields[2]));
+    // 隧道数据
+    this.tunnelArrayData.push([fields[1] / this.ratio, fields[2] / this.ratio]);
+  } while (!ts.atEnd());
+  reader.close();
+  return true;
+}
+// 绘画桥梁
+FileCTRCSV.prototype.applyBridge = function (zdmArrayData, dmxArrayData, PDColor) {
+  var bridgeArray = this.bridgeArrayData;
+  if (bridgeArray.length == 0) {
+    EAction.handleUserMessage("bridge(CTR) data is empty...");
+    return false;
+  }
+  if (zdmArrayData.length == 0) {
+    EAction.handleUserMessage("DMX data is empty...");
+    return false;
+  }
+  PDColor = PDColor ? PDColor : new RColor(31, 57, 197);
+  for (var a = 0; a < bridgeArray.length; a++) {
+    // 桥梁的开始
+    var bridgeStart = bridgeArray[a][0];
+    // 桥梁的结束
+    var bridgeEnd = bridgeArray[a][1];
+    // 桥梁的中间
+    var bridgeMiddleX = bridgeArray[a][2];
+    for (var b = 0; b < zdmArrayData.length - 1; b++) {
+      var foreNodeX = zdmArrayData[b][0];
+      var foreNodeY = zdmArrayData[b][1];
+      var nextNodeX = zdmArrayData[b + 1][0];
+      var nextNodeY = zdmArrayData[b + 1][1];
+      if (bridgeStart >= foreNodeX && bridgeStart < nextNodeX) {
+        // 开始绘画桥梁
+        var bridgeStartY = this.findIntersection(foreNodeX, foreNodeY, nextNodeX, nextNodeY, bridgeStart).y;
+        addPolylinetoView([[bridgeStart, bridgeStartY - 3], [nextNodeX, nextNodeY - 3]], false, false, 0, PDColor);
+        var dmxPoint = this.findPointByArray(dmxArrayData, bridgeStart);
+        if (dmxPoint) {
+          addPolylinetoView([[bridgeStart, bridgeStartY], [dmxPoint.x, dmxPoint.y]], false, false, 0, PDColor);
+          addPolylinetoView([[bridgeStart, bridgeStartY - 3], [dmxPoint.x, dmxPoint.y]], false, false, 0, PDColor);
+        } else {
+          EAction.handleUserMessage("开始绘画桥梁,未找到地面线上的点, x: " + bridgeStart.toString());
+        }
+      } else if (foreNodeX > bridgeStart && nextNodeX < bridgeEnd) {
+        // 绘画桥梁
+        addPolylinetoView([[foreNodeX, foreNodeY - 3], [nextNodeX, nextNodeY - 3]], false, false, 0, PDColor);
+      } else if (bridgeEnd >= foreNodeX && bridgeEnd < nextNodeX) {
+        // 结束绘画桥梁
+        var bridgeEndY = this.findIntersection(foreNodeX, foreNodeY, nextNodeX, nextNodeY, bridgeEnd).y;
+        addPolylinetoView([[bridgeEnd, bridgeEndY - 3], [foreNodeX, foreNodeY - 3]], false, false, 0, PDColor);
+        var dmxPoint = this.findPointByArray(dmxArrayData, bridgeEnd);
+        if (dmxPoint) {
+          addPolylinetoView([[bridgeEnd, bridgeEndY], [dmxPoint.x, dmxPoint.y]], false, false, 0, PDColor);
+          addPolylinetoView([[bridgeEnd, bridgeEndY - 3], [dmxPoint.x, dmxPoint.y]], false, false, 0, PDColor);
+        } else {
+          EAction.handleUserMessage("结束绘画桥梁,未找到地面线上的点, x: " + bridgeStart.toString());
+        }
+      }
+    }
+    var middleZdm = this.findPointByArray(zdmArrayData, bridgeMiddleX);
+    if (!middleZdm) {
+      EAction.handleUserMessage("绘画桥梁中间,未找到纵断线上的点, bridgeMiddleX: " + bridgeMiddleX.toString());
+      continue;
+    }
+    var middleDmx = this.findPointByArray(dmxArrayData, bridgeMiddleX);
+    if (!middleDmx) {
+      EAction.handleUserMessage("绘画桥梁中间,未找到地面线上的点, bridgeMiddleX: " + bridgeMiddleX.toString());
+      continue;
+    }
+    addPolylinetoView([[middleZdm.x, middleZdm.y - 3], [middleDmx.x, middleDmx.y]], false, false, 0, PDColor);
+    // 里程格式和ZDM里程格式一致
+    // 里程单位是km,格式应该为K000+000.000
+    addSimpleTextToView(formatStake(bridgeMiddleX * this.ratio), [middleZdm.x + 5, middleZdm.y + 2], 10, 90, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 0);
+    addPolylinetoView([[middleZdm.x, middleZdm.y], [middleZdm.x, middleZdm.y + 50]], false, false, 0, PDColor);
+  }
+};
+FileCTRCSV.prototype.applyTunnel = function (zdmArrayData, PDColor) {
+  if (this.tunnelArrayData.length == 0) {
+    EAction.handleUserMessage("tunnel(CTR) data is empty...");
+    return false;
+  }
+  if (zdmArrayData.length == 0) {
+    EAction.handleUserMessage("DMX data is empty...");
+    return false;
+  }
+  for (var i = 0; i < this.tunnelArrayData.length; i++) {
+    var startPoint = this.findPointByArray(zdmArrayData, this.tunnelArrayData[i][0]);
+    if (!startPoint) {
+      EAction.handleUserMessage("隧道开始节点,未找到纵断线上的点, x: " + this.tunnelArrayData[i][0].toString());
+      continue;
+    }
+    var endPoint = this.findPointByArray(zdmArrayData, this.tunnelArrayData[i][1]);
+    if (!endPoint) {
+      EAction.handleUserMessage("隧道结束节点,未找到纵断线上的点, x: " + this.tunnelArrayData[i][1].toString());
+      continue;
+    }
+    addPolylinetoView([[startPoint.x, startPoint.y], [startPoint.x, startPoint.y + 6]], false, false, 0, new RColor(255, 255, 0));
+    addPolylinetoView([[startPoint.x, startPoint.y + 3], [endPoint.x, endPoint.y + 3]], false, false, 0, new RColor(255, 255, 0));
+    addPolylinetoView([[endPoint.x, endPoint.y], [endPoint.x, endPoint.y + 6]], false, false, 0, new RColor(255, 255, 0));
+  }
+}
+
+// 已知两个坐标的点,求指定x垂直线和已知两点的交点
+FileCTRCSV.prototype.findIntersection = function (x1, y1, x2, y2, xVertical) {
+  // 如果两点的x坐标相同,则说明这两点在x=50的线上,交点即为它们之一
+  if (x1 === xVertical) {
+    return { x: x1, y: y1 };
+  } else if (x2 === xVertical) {
+    return { x: x2, y: y2 };
+  }
+  // 计算交点的y坐标
+  const yIntersection = ((xVertical - x1) / (x2 - x1)) * (y2 - y1) + y1;
+  return { x: xVertical, y: yIntersection };
+};
+FileCTRCSV.prototype.findPointByArray = function (pointArray, x) {
+  if (pointArray && pointArray.length > 0) {
+    for (var i = 0; i < pointArray.length - 1; i++) {
+      var foreNodeX = pointArray[i][0];
+      var foreNodeY = pointArray[i][1];
+      var nextNodeX = pointArray[i + 1][0];
+      var nextNodeY = pointArray[i + 1][1];
+      if (x >= foreNodeX && x <= nextNodeX) {
+        return this.findIntersection(foreNodeX, foreNodeY, nextNodeX, nextNodeY, x);
+      }
+    }
+  }
+  return undefined;
+};