From f65c8ebabe74656f754fb5025ae22575376e03b2 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 21 Oct 2026 06:56:08 +0000 Subject: [PATCH] feat: replace 2 m placeholder with station pattern table from the workbook (Task 5) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Source: RAG 지보패턴현황_20260918.xlsx, sheet 참고_지보패턴현황, 당진방향 table (4+740..5+500, 42 contiguous rows). Lining pattern (M column) per station now drives the lining colour and the viewer readout. Daesan table kept as reference only (WL-4 there, not applied). Drawing patterns E-1, E-2, RP-2, WL-3 are in neither table and stay [미확정]. Co-Authored-By: Claude Haiku 5.5 Claude-Session: https://claude.ai/code/session_01A5Cun3RHQKna9qxE6ybZ4A --- data/pattern_stations_daesan_ref.csv | 43 + data/pattern_stations_dangjin.csv | 48 + data/verify_skeleton.json | 21 +- model/tunnel_skeleton.glb | Bin 2201764 -> 2201764 bytes model/tunnel_skeleton_meta.json | 1811 ++------------------------ scripts/build_skeleton.py | 18 +- scripts/extract_pattern_table.py | 48 + scripts/make_pattern_doc.py | 56 + viewer/index.html | 2 +- 9 files changed, 311 insertions(+), 1736 deletions(-) create mode 100644 data/pattern_stations_daesan_ref.csv create mode 100644 data/pattern_stations_dangjin.csv create mode 100644 scripts/extract_pattern_table.py create mode 100644 scripts/make_pattern_doc.py diff --git a/data/pattern_stations_daesan_ref.csv b/data/pattern_stations_daesan_ref.csv new file mode 100644 index 0000000..7305ea7 --- /dev/null +++ b/data/pattern_stations_daesan_ref.csv @@ -0,0 +1,43 @@ +direction,source_row,sta_from,sta_to,length_m,lining_pattern,excavation,excavation_inherited,method,remark +대산,13,4740.85,4758.85,18,P-3,NP-6,False,"상·하 +반단면", +대산,14,4758.85,4768.85,10,WL-4,NP-5,False,, +대산,15,4768.85,4792.85,24,WL-2,NP-5,True,, +대산,16,4792.85,4839.85,47,D-2,NP-4,False,, +대산,17,4839.85,4848.85,9,D-1,NP-4,True,, +대산,18,4848.85,4857.85,9,C-2,NP-4,True,전단면, +대산,19,4857.85,4862.85,5,C-1,C-1,False,, +대산,20,4862.85,4868.85,6,B-2,B-2,False,, +대산,21,4868.85,4874.85,6,B-1,B-1,False,, +대산,22,4874.85,4908.85,34,A,A,False,, +대산,23,4908.85,4916.67,7.819999999999709,B-1,B-1,False,, +대산,24,4916.67,4936.67,20,RP-1,RP-1,False,,"대인용 + 연결통로 접속부" +대산,25,4936.67,4946.85,10.180000000000291,C-1,C-1,False,, +대산,26,4946.85,4965.85,19,C-2,C-2,False,, +대산,27,4965.85,4979.85,14,C-1,C-1,False,, +대산,28,4979.85,4987.950000000001,8.100000000000364,B-2,B-2,False,, +대산,29,4987.950000000001,4995.950000000001,8,B-1,B-1,False,, +대산,30,4995.950000000001,5107.2300000000005,111.27999999999975,A,A,False,, +대산,31,5107.2300000000005,5127.2300000000005,20,RP-1,RP-1,False,,"차량용 + 연결통로 접속부" +대산,32,5127.2300000000005,5139.450000000001,12.220000000000255,B-1,B-1,False,, +대산,33,5139.450000000001,5163.450000000001,24,B-2,B-2,False,, +대산,34,5163.450000000001,5205.450000000001,42,C-1,C-1,False,, +대산,35,5205.450000000001,5235.450000000001,30,B-2,B-2,False,, +대산,36,5235.450000000001,5279.35,43.899999999999636,B-1,B-1,False,, +대산,37,5279.35,5296.67,17.31999999999971,A,A,False,, +대산,38,5296.67,5316.67,20,RP-1,RP-1,False,,"대인용 + 연결통로 접속부" +대산,39,5316.67,5355.35,38.68000000000029,A,A,False,, +대산,40,5355.35,5362.35,7,B-1,B-1,False,, +대산,41,5362.35,5376.35,14,B-2,B-2,False,, +대산,42,5376.35,5382.35,6,WL-2,WL-2,False,상·하 반단면, +대산,43,5382.35,5388.35,6,C-1,C-1,False,전단면, +대산,44,5388.35,5398.35,10,C-2,C-2,False,, +대산,45,5398.35,5445.35,47,D-1,NP-4,False,"상·하 +반단면", +대산,46,5445.35,5458.35,13,WL-2,NP-5,False,, +대산,47,5458.35,5464.35,6,P-2,NP-6,False,, +대산,48,5464.35,5491.29,26.9399999999996,P-3,NP-6,True,, +대산,49,5491.29,5496.29,5,개착부,NP-6,True,,개착부 diff --git a/data/pattern_stations_dangjin.csv b/data/pattern_stations_dangjin.csv new file mode 100644 index 0000000..7b85cbc --- /dev/null +++ b/data/pattern_stations_dangjin.csv @@ -0,0 +1,48 @@ +direction,source_row,sta_from,sta_to,length_m,lining_pattern,excavation,excavation_inherited,method,remark +당진,55,4740.0,4745.0,5,개착부,,True,,개착부 +당진,56,4745.0,4763.0,18,P-3,NP-6,False,"상·하 +반단면", +당진,57,4763.0,4785.0,22,WL-2,NP-5,False,, +당진,58,4785.0,4796.0,11,WL-1,NP-5,True,, +당진,59,4796.0,4839.0,43,D-2,NP-4,False,, +당진,60,4839.0,4848.0,9,D-1,NP-4,True,, +당진,61,4848.0,4857.0,9,C-2,NP-4,True,전단면, +당진,62,4857.0,4862.0,5,C-1,NP-4,True,, +당진,63,4862.0,4867.0,5,B-2,B-2,False,, +당진,64,4867.0,4873.0,6,B-1,B-1,False,, +당진,65,4873.0,4907.0,34,A,A,False,, +당진,66,4907.0,4915.0,8,B-1,B-1,False,, +당진,67,4915.0,4920.0,5,B-2,B-2,False,, +당진,68,4920.0,4940.0,20,RP-1,B-2,True,,"대인용 + 연결통로 접속부" +당진,69,4940.0,4988.0,48,C-1,C-1,False,, +당진,70,4988.0,4998.0,10,B-2,B-2,False,, +당진,71,4998.0,5006.0,8,B-1,B-1,False,, +당진,72,5006.0,5019.0,13,B-2,B-2,False,, +당진,73,5019.0,5025.0,6,B-1,B-1,False,, +당진,74,5025.0,5110.0,85,A,A,False,, +당진,75,5110.0,5130.0,20,RP-1,A,True,,"차량용 + 연결통로 접속부" +당진,76,5130.0,5140.0,10,B-1,B-1,False,, +당진,77,5140.0,5157.0,17,B-2,B-2,False,, +당진,78,5157.0,5204.0,47,C-1,C-1,False,, +당진,79,5204.0,5211.0,7,B-2,B-2,False,, +당진,80,5211.0,5221.0,10,B-1,B-1,False,, +당진,81,5221.0,5259.0,38,A,A,False,, +당진,82,5259.0,5279.0,20,B-1,B-1,False,, +당진,83,5279.0,5300.0,21,A,A,False,, +당진,84,5300.0,5320.0,20,RP-1,A,True,,"대인용 + 연결통로 접속부" +당진,85,5320.0,5357.0,37,A,A,False,, +당진,86,5357.0,5363.0,6,B-1,B-1,False,, +당진,87,5363.0,5377.0,14,B-2,B-2,False,, +당진,88,5377.0,5390.0,13,C-1,C-1,False,, +당진,89,5390.0,5399.0,9,C-2,C-2,False,, +당진,90,5399.0,5406.0,7,D-1,NP-4,False,"상·하 +반단면", +당진,91,5406.0,5427.0,21,D-2,NP-4,True,, +당진,92,5427.0,5446.0,19,D-1,NP-4,True,, +당진,93,5446.0,5462.0,16,WL-2,NP-5,False,, +당진,94,5462.0,5468.0,6,P-2,NP-6,False,, +당진,95,5468.0,5495.0,27,P-3,NP-6,True,, +당진,96,5495.0,5500.0,5,개착부,NP-6,True,,개착부 diff --git a/data/verify_skeleton.json b/data/verify_skeleton.json index e79825d..2dd2f72 100644 --- a/data/verify_skeleton.json +++ b/data/verify_skeleton.json @@ -6,15 +6,22 @@ "road_z_5480_m": 67.311, "plan_chord_length_total_m (4+700..5+500)": 799.905, "station_range_modelled": "4745 .. 5480 (ring step 1.0 m, 736 rings)", - "pattern_zones (2 m, placeholder)": 368, + "pattern_zones (지보패턴표 당진방향)": 42, "pattern_coverage_all_stations": true, "pattern_counts": { - "NP-4AD-1-D-2": 62, - "NP-4BD-1-D-2": 62, - "NP-5AE-1-WL-4": 61, - "NP-5BE-1-WL-4": 61, - "NP-6A": 61, - "NP-6B": 61 + "A": 5, + "B-1": 8, + "B-2": 7, + "C-1": 4, + "C-2": 2, + "D-1": 3, + "D-2": 2, + "P-2": 1, + "P-3": 2, + "RP-1": 3, + "WL-1": 1, + "WL-2": 2, + "개착부": 2 }, "glb_bytes": 2201764, "glb_reload_geometries": 5 diff --git a/model/tunnel_skeleton.glb b/model/tunnel_skeleton.glb index 4e2098d926481b058f7d6077b4aed398ab800691..678eadbca12472e80dbd971af8e25a28a18d8f2a 100644 GIT binary patch delta 41870 zcmeHQ-D@0G6en4&RqMxKj9=AgsnqRG$y#Y6ZG8}xz682ZTgp};!b%#5$%;jyLQdG2 zq{0SCU3Lhq5SwhQD}gB16{Pkh5Amse^s(<2^gp!X38U58G;_PX7Zv=1h~>E3p9ywE;X zXm4Xw|Hc^iG45w@1W5{K*(BO} zRU}#UE7)Jw0bzeZ@=UYRmJR#MIw0&Hwud(^AMr0sK;VDb4hZ}Y{+HAM z;vexZsR8u=uKoY{(OES&GZQ|jNg+$~=hW)zNMKMi4;y%v0@vJtaF$KMRcE9E)P(I! zQ~>subwJqPgck=d1Mx3QKsEkfT%J(HQa)mke}NOT=T#;*X9i@dpn&C&v6cj@0GUx^ zFySnl4B0Vg1z>+!2Za5Ddajx05dX3S1pb%pfWZIYe@P7>{t^F@8bJS#{$El982_6Y z#|PyQ#J{BX&nfi(K|R;Za~S_ij((B3s zZo1Gz=|QKf+gfsx-PT3#OO}ofe4tK!aYhQZw%{|=# zt#dPBZIAtVHS2UGtdf&VScUbMRP5Go{m$@Ss}%cpDdSv=vydBc7P9V=jQuln+UbgO zfyp=*`1jb!%C$Y#iMGm(J=WW84qsR3^5}=^++Cc_(`&b<}_pv%!^s<|{ z8QM(_!7lpxX2+=amYUD}Rq2RZr`UZqI~-kI7+04T3sN9$!IR&YRI0pc7-YIYpXHJ9 z7Wu0HnOCW=3XoxY`V!8vVSiZ%g#G<`tl9e!|FQ%G{+I25!2jTXNev+W5&w5JF#hvp zb+IxVDSCnk{Pp**?v>}*koMR@UwgGOJR1@|wXb81Q$IQ{^R>b>K6Nyfhg4ImCahXE z)23VTUOM>QCH2Pqk5V9Q!EcqWgz$QSF{|W=t-Okyh1nd$-SLm^U*s%8AQc}b#XF0x zr-pMM_#gZ)sR6`)IB~5@!H9oJ@5lJBKK^sXIdvhQj}$#Y1pbm6**rO-mQ}fR&nXfb zxs=AYyjvOETb+Hec~a08%8u2VYWvKSr5Y!y?wGL7keDAOp1Jz6#pg`b`&8r44$sKj z0gvx zi2qvrSEnUJJ%6Gnh(Mm`(fTXMHq2`oY}w>UHQBLZFi*PMOk(tGWhGI~uX--myuG3` zOT5TadqHRjt5)?_qw=y@?{&5*;^nx;*9`kuGECaSs|%dXFNDYTPC+-OF!LO?cf$5g zk{Uq#n~CF~)QtF-^nPsbhWJPPOKJeydzl~8`(aeXe?adywBJ-l`~AlyYIU7hq9p#npK& zUd{aX4t|Ap;d}8ryZP7I#n)$QpCw<-_Tl;??)s|Zt|Xl0Wb(j?U7laXHue)KXKl$z zxzCG%&0@u0uK0bn=4YF&-PU0X*g9=pwr*RGt=HCP>$eTq25m!L#UG5%dq?@;p3jTA z!}fekH=p4zdloLA`joYAe7d{S zC}mnUM}GP1@pknvAFR{K&-7{lSyJcLq=7pMYQdox&45QM#iOI-wK(k5w8_ zZtw(8=mbxc29z5-!4o>c6Qu#=22b#WPVhu&K)JyaJfRajQ5sNg@B~lj1W%L(lp8$3 z6FR{Yr2*vzPw<3J@I+}qxxo`Wp%Xk&8c=TV1W)J$Pm~6f8$7`iI>8gA0p$iy@PtnA zL}@^|!4o{86FgBGP;T%9Pv`_slm?U=Ji!w>!4stcc6Qu#=22b#WPVhu&K)JyaJfRajQ5sNg@B~lj1W%L(lp8$3 z6FR{Yr2*vzPw<3J@I+}qxxo`Wp%Xk&8c=TV1W)J$Pm~6f8$7`iI>8gA0p$iy@PtnA tL}@^|`9GeN)1eXDsBO#^vW?rqwh7y$ZORt0P1|N{v$m+04$Yn2e*?vM3qAk< diff --git a/model/tunnel_skeleton_meta.json b/model/tunnel_skeleton_meta.json index 4f8641a..467f07a 100644 --- a/model/tunnel_skeleton_meta.json +++ b/model/tunnel_skeleton_meta.json @@ -28,1854 +28,225 @@ "ring_step_m": 1.0, "ring_points": 43, "first_station": 4745, - "pattern_status": "PLACEHOLDER: 2 m 임의 배정. 실제 측점 구간 아님 (사용자 결정 2026-10-21). data/pattern_zones_placeholder.csv 를 수정 후 재빌드", + "pattern_status": "지보패턴: 엑셀 참고_지보패턴현황 당진방향 표(4+740~5+500, 42행, 빈틈 없음) 적용. 출처 data/pattern_stations_dangjin.csv (사용자 결정 2026-10-21)", "patterns": [ + { + "from": 4740, + "to": 4745, + "pattern": "개착부" + }, { "from": 4745, - "to": 4747, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4747, - "to": 4749, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4749, - "to": 4751, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4751, - "to": 4753, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4753, - "to": 4755, - "pattern": "NP-6A" - }, - { - "from": 4755, - "to": 4757, - "pattern": "NP-6B" - }, - { - "from": 4757, - "to": 4759, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4759, - "to": 4761, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4761, "to": 4763, - "pattern": "NP-5AE-1-WL-4" + "pattern": "P-3" }, { "from": 4763, - "to": 4765, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4765, - "to": 4767, - "pattern": "NP-6A" - }, - { - "from": 4767, - "to": 4769, - "pattern": "NP-6B" - }, - { - "from": 4769, - "to": 4771, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4771, - "to": 4773, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4773, - "to": 4775, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4775, - "to": 4777, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4777, - "to": 4779, - "pattern": "NP-6A" - }, - { - "from": 4779, - "to": 4781, - "pattern": "NP-6B" - }, - { - "from": 4781, - "to": 4783, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4783, "to": 4785, - "pattern": "NP-4BD-1-D-2" + "pattern": "WL-2" }, { "from": 4785, - "to": 4787, - "pattern": "NP-5AE-1-WL-4" + "to": 4796, + "pattern": "WL-1" }, { - "from": 4787, - "to": 4789, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4789, - "to": 4791, - "pattern": "NP-6A" - }, - { - "from": 4791, - "to": 4793, - "pattern": "NP-6B" - }, - { - "from": 4793, - "to": 4795, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4795, - "to": 4797, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4797, - "to": 4799, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4799, - "to": 4801, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4801, - "to": 4803, - "pattern": "NP-6A" - }, - { - "from": 4803, - "to": 4805, - "pattern": "NP-6B" - }, - { - "from": 4805, - "to": 4807, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4807, - "to": 4809, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4809, - "to": 4811, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4811, - "to": 4813, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4813, - "to": 4815, - "pattern": "NP-6A" - }, - { - "from": 4815, - "to": 4817, - "pattern": "NP-6B" - }, - { - "from": 4817, - "to": 4819, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4819, - "to": 4821, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4821, - "to": 4823, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4823, - "to": 4825, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4825, - "to": 4827, - "pattern": "NP-6A" - }, - { - "from": 4827, - "to": 4829, - "pattern": "NP-6B" - }, - { - "from": 4829, - "to": 4831, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4831, - "to": 4833, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4833, - "to": 4835, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4835, - "to": 4837, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4837, + "from": 4796, "to": 4839, - "pattern": "NP-6A" + "pattern": "D-2" }, { "from": 4839, - "to": 4841, - "pattern": "NP-6B" + "to": 4848, + "pattern": "D-1" }, { - "from": 4841, - "to": 4843, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4843, - "to": 4845, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4845, - "to": 4847, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4847, - "to": 4849, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4849, - "to": 4851, - "pattern": "NP-6A" - }, - { - "from": 4851, - "to": 4853, - "pattern": "NP-6B" - }, - { - "from": 4853, - "to": 4855, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4855, + "from": 4848, "to": 4857, - "pattern": "NP-4BD-1-D-2" + "pattern": "C-2" }, { "from": 4857, - "to": 4859, - "pattern": "NP-5AE-1-WL-4" + "to": 4862, + "pattern": "C-1" }, { - "from": 4859, - "to": 4861, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4861, - "to": 4863, - "pattern": "NP-6A" - }, - { - "from": 4863, - "to": 4865, - "pattern": "NP-6B" - }, - { - "from": 4865, + "from": 4862, "to": 4867, - "pattern": "NP-4AD-1-D-2" + "pattern": "B-2" }, { "from": 4867, - "to": 4869, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4869, - "to": 4871, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4871, "to": 4873, - "pattern": "NP-5BE-1-WL-4" + "pattern": "B-1" }, { "from": 4873, - "to": 4875, - "pattern": "NP-6A" - }, - { - "from": 4875, - "to": 4877, - "pattern": "NP-6B" - }, - { - "from": 4877, - "to": 4879, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4879, - "to": 4881, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4881, - "to": 4883, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4883, - "to": 4885, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4885, - "to": 4887, - "pattern": "NP-6A" - }, - { - "from": 4887, - "to": 4889, - "pattern": "NP-6B" - }, - { - "from": 4889, - "to": 4891, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4891, - "to": 4893, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4893, - "to": 4895, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4895, - "to": 4897, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4897, - "to": 4899, - "pattern": "NP-6A" - }, - { - "from": 4899, - "to": 4901, - "pattern": "NP-6B" - }, - { - "from": 4901, - "to": 4903, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4903, - "to": 4905, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4905, "to": 4907, - "pattern": "NP-5AE-1-WL-4" + "pattern": "A" }, { "from": 4907, - "to": 4909, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4909, - "to": 4911, - "pattern": "NP-6A" - }, - { - "from": 4911, - "to": 4913, - "pattern": "NP-6B" - }, - { - "from": 4913, "to": 4915, - "pattern": "NP-4AD-1-D-2" + "pattern": "B-1" }, { "from": 4915, - "to": 4917, - "pattern": "NP-4BD-1-D-2" + "to": 4920, + "pattern": "B-2" }, { - "from": 4917, - "to": 4919, - "pattern": "NP-5AE-1-WL-4" + "from": 4920, + "to": 4940, + "pattern": "RP-1" }, { - "from": 4919, - "to": 4921, - "pattern": "NP-5BE-1-WL-4" + "from": 4940, + "to": 4988, + "pattern": "C-1" }, { - "from": 4921, - "to": 4923, - "pattern": "NP-6A" + "from": 4988, + "to": 4998, + "pattern": "B-2" }, { - "from": 4923, - "to": 4925, - "pattern": "NP-6B" + "from": 4998, + "to": 5006, + "pattern": "B-1" }, { - "from": 4925, - "to": 4927, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4927, - "to": 4929, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4929, - "to": 4931, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4931, - "to": 4933, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4933, - "to": 4935, - "pattern": "NP-6A" - }, - { - "from": 4935, - "to": 4937, - "pattern": "NP-6B" - }, - { - "from": 4937, - "to": 4939, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4939, - "to": 4941, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4941, - "to": 4943, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4943, - "to": 4945, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4945, - "to": 4947, - "pattern": "NP-6A" - }, - { - "from": 4947, - "to": 4949, - "pattern": "NP-6B" - }, - { - "from": 4949, - "to": 4951, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4951, - "to": 4953, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4953, - "to": 4955, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4955, - "to": 4957, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4957, - "to": 4959, - "pattern": "NP-6A" - }, - { - "from": 4959, - "to": 4961, - "pattern": "NP-6B" - }, - { - "from": 4961, - "to": 4963, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4963, - "to": 4965, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4965, - "to": 4967, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4967, - "to": 4969, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4969, - "to": 4971, - "pattern": "NP-6A" - }, - { - "from": 4971, - "to": 4973, - "pattern": "NP-6B" - }, - { - "from": 4973, - "to": 4975, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4975, - "to": 4977, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4977, - "to": 4979, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4979, - "to": 4981, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4981, - "to": 4983, - "pattern": "NP-6A" - }, - { - "from": 4983, - "to": 4985, - "pattern": "NP-6B" - }, - { - "from": 4985, - "to": 4987, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4987, - "to": 4989, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 4989, - "to": 4991, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 4991, - "to": 4993, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 4993, - "to": 4995, - "pattern": "NP-6A" - }, - { - "from": 4995, - "to": 4997, - "pattern": "NP-6B" - }, - { - "from": 4997, - "to": 4999, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 4999, - "to": 5001, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5001, - "to": 5003, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5003, - "to": 5005, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5005, - "to": 5007, - "pattern": "NP-6A" - }, - { - "from": 5007, - "to": 5009, - "pattern": "NP-6B" - }, - { - "from": 5009, - "to": 5011, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5011, - "to": 5013, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5013, - "to": 5015, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5015, - "to": 5017, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5017, + "from": 5006, "to": 5019, - "pattern": "NP-6A" + "pattern": "B-2" }, { "from": 5019, - "to": 5021, - "pattern": "NP-6B" - }, - { - "from": 5021, - "to": 5023, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5023, "to": 5025, - "pattern": "NP-4BD-1-D-2" + "pattern": "B-1" }, { "from": 5025, - "to": 5027, - "pattern": "NP-5AE-1-WL-4" + "to": 5110, + "pattern": "A" }, { - "from": 5027, - "to": 5029, - "pattern": "NP-5BE-1-WL-4" + "from": 5110, + "to": 5130, + "pattern": "RP-1" }, { - "from": 5029, - "to": 5031, - "pattern": "NP-6A" + "from": 5130, + "to": 5140, + "pattern": "B-1" }, { - "from": 5031, - "to": 5033, - "pattern": "NP-6B" - }, - { - "from": 5033, - "to": 5035, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5035, - "to": 5037, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5037, - "to": 5039, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5039, - "to": 5041, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5041, - "to": 5043, - "pattern": "NP-6A" - }, - { - "from": 5043, - "to": 5045, - "pattern": "NP-6B" - }, - { - "from": 5045, - "to": 5047, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5047, - "to": 5049, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5049, - "to": 5051, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5051, - "to": 5053, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5053, - "to": 5055, - "pattern": "NP-6A" - }, - { - "from": 5055, - "to": 5057, - "pattern": "NP-6B" - }, - { - "from": 5057, - "to": 5059, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5059, - "to": 5061, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5061, - "to": 5063, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5063, - "to": 5065, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5065, - "to": 5067, - "pattern": "NP-6A" - }, - { - "from": 5067, - "to": 5069, - "pattern": "NP-6B" - }, - { - "from": 5069, - "to": 5071, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5071, - "to": 5073, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5073, - "to": 5075, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5075, - "to": 5077, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5077, - "to": 5079, - "pattern": "NP-6A" - }, - { - "from": 5079, - "to": 5081, - "pattern": "NP-6B" - }, - { - "from": 5081, - "to": 5083, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5083, - "to": 5085, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5085, - "to": 5087, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5087, - "to": 5089, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5089, - "to": 5091, - "pattern": "NP-6A" - }, - { - "from": 5091, - "to": 5093, - "pattern": "NP-6B" - }, - { - "from": 5093, - "to": 5095, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5095, - "to": 5097, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5097, - "to": 5099, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5099, - "to": 5101, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5101, - "to": 5103, - "pattern": "NP-6A" - }, - { - "from": 5103, - "to": 5105, - "pattern": "NP-6B" - }, - { - "from": 5105, - "to": 5107, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5107, - "to": 5109, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5109, - "to": 5111, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5111, - "to": 5113, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5113, - "to": 5115, - "pattern": "NP-6A" - }, - { - "from": 5115, - "to": 5117, - "pattern": "NP-6B" - }, - { - "from": 5117, - "to": 5119, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5119, - "to": 5121, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5121, - "to": 5123, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5123, - "to": 5125, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5125, - "to": 5127, - "pattern": "NP-6A" - }, - { - "from": 5127, - "to": 5129, - "pattern": "NP-6B" - }, - { - "from": 5129, - "to": 5131, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5131, - "to": 5133, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5133, - "to": 5135, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5135, - "to": 5137, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5137, - "to": 5139, - "pattern": "NP-6A" - }, - { - "from": 5139, - "to": 5141, - "pattern": "NP-6B" - }, - { - "from": 5141, - "to": 5143, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5143, - "to": 5145, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5145, - "to": 5147, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5147, - "to": 5149, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5149, - "to": 5151, - "pattern": "NP-6A" - }, - { - "from": 5151, - "to": 5153, - "pattern": "NP-6B" - }, - { - "from": 5153, - "to": 5155, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5155, + "from": 5140, "to": 5157, - "pattern": "NP-4BD-1-D-2" + "pattern": "B-2" }, { "from": 5157, - "to": 5159, - "pattern": "NP-5AE-1-WL-4" + "to": 5204, + "pattern": "C-1" }, { - "from": 5159, - "to": 5161, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5161, - "to": 5163, - "pattern": "NP-6A" - }, - { - "from": 5163, - "to": 5165, - "pattern": "NP-6B" - }, - { - "from": 5165, - "to": 5167, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5167, - "to": 5169, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5169, - "to": 5171, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5171, - "to": 5173, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5173, - "to": 5175, - "pattern": "NP-6A" - }, - { - "from": 5175, - "to": 5177, - "pattern": "NP-6B" - }, - { - "from": 5177, - "to": 5179, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5179, - "to": 5181, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5181, - "to": 5183, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5183, - "to": 5185, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5185, - "to": 5187, - "pattern": "NP-6A" - }, - { - "from": 5187, - "to": 5189, - "pattern": "NP-6B" - }, - { - "from": 5189, - "to": 5191, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5191, - "to": 5193, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5193, - "to": 5195, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5195, - "to": 5197, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5197, - "to": 5199, - "pattern": "NP-6A" - }, - { - "from": 5199, - "to": 5201, - "pattern": "NP-6B" - }, - { - "from": 5201, - "to": 5203, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5203, - "to": 5205, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5205, - "to": 5207, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5207, - "to": 5209, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5209, + "from": 5204, "to": 5211, - "pattern": "NP-6A" + "pattern": "B-2" }, { "from": 5211, - "to": 5213, - "pattern": "NP-6B" - }, - { - "from": 5213, - "to": 5215, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5215, - "to": 5217, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5217, - "to": 5219, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5219, "to": 5221, - "pattern": "NP-5BE-1-WL-4" + "pattern": "B-1" }, { "from": 5221, - "to": 5223, - "pattern": "NP-6A" - }, - { - "from": 5223, - "to": 5225, - "pattern": "NP-6B" - }, - { - "from": 5225, - "to": 5227, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5227, - "to": 5229, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5229, - "to": 5231, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5231, - "to": 5233, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5233, - "to": 5235, - "pattern": "NP-6A" - }, - { - "from": 5235, - "to": 5237, - "pattern": "NP-6B" - }, - { - "from": 5237, - "to": 5239, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5239, - "to": 5241, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5241, - "to": 5243, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5243, - "to": 5245, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5245, - "to": 5247, - "pattern": "NP-6A" - }, - { - "from": 5247, - "to": 5249, - "pattern": "NP-6B" - }, - { - "from": 5249, - "to": 5251, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5251, - "to": 5253, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5253, - "to": 5255, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5255, - "to": 5257, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5257, "to": 5259, - "pattern": "NP-6A" + "pattern": "A" }, { "from": 5259, - "to": 5261, - "pattern": "NP-6B" - }, - { - "from": 5261, - "to": 5263, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5263, - "to": 5265, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5265, - "to": 5267, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5267, - "to": 5269, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5269, - "to": 5271, - "pattern": "NP-6A" - }, - { - "from": 5271, - "to": 5273, - "pattern": "NP-6B" - }, - { - "from": 5273, - "to": 5275, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5275, - "to": 5277, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5277, "to": 5279, - "pattern": "NP-5AE-1-WL-4" + "pattern": "B-1" }, { "from": 5279, - "to": 5281, - "pattern": "NP-5BE-1-WL-4" + "to": 5300, + "pattern": "A" }, { - "from": 5281, - "to": 5283, - "pattern": "NP-6A" + "from": 5300, + "to": 5320, + "pattern": "RP-1" }, { - "from": 5283, - "to": 5285, - "pattern": "NP-6B" - }, - { - "from": 5285, - "to": 5287, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5287, - "to": 5289, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5289, - "to": 5291, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5291, - "to": 5293, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5293, - "to": 5295, - "pattern": "NP-6A" - }, - { - "from": 5295, - "to": 5297, - "pattern": "NP-6B" - }, - { - "from": 5297, - "to": 5299, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5299, - "to": 5301, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5301, - "to": 5303, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5303, - "to": 5305, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5305, - "to": 5307, - "pattern": "NP-6A" - }, - { - "from": 5307, - "to": 5309, - "pattern": "NP-6B" - }, - { - "from": 5309, - "to": 5311, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5311, - "to": 5313, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5313, - "to": 5315, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5315, - "to": 5317, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5317, - "to": 5319, - "pattern": "NP-6A" - }, - { - "from": 5319, - "to": 5321, - "pattern": "NP-6B" - }, - { - "from": 5321, - "to": 5323, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5323, - "to": 5325, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5325, - "to": 5327, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5327, - "to": 5329, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5329, - "to": 5331, - "pattern": "NP-6A" - }, - { - "from": 5331, - "to": 5333, - "pattern": "NP-6B" - }, - { - "from": 5333, - "to": 5335, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5335, - "to": 5337, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5337, - "to": 5339, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5339, - "to": 5341, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5341, - "to": 5343, - "pattern": "NP-6A" - }, - { - "from": 5343, - "to": 5345, - "pattern": "NP-6B" - }, - { - "from": 5345, - "to": 5347, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5347, - "to": 5349, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5349, - "to": 5351, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5351, - "to": 5353, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5353, - "to": 5355, - "pattern": "NP-6A" - }, - { - "from": 5355, + "from": 5320, "to": 5357, - "pattern": "NP-6B" + "pattern": "A" }, { "from": 5357, - "to": 5359, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5359, - "to": 5361, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5361, "to": 5363, - "pattern": "NP-5AE-1-WL-4" + "pattern": "B-1" }, { "from": 5363, - "to": 5365, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5365, - "to": 5367, - "pattern": "NP-6A" - }, - { - "from": 5367, - "to": 5369, - "pattern": "NP-6B" - }, - { - "from": 5369, - "to": 5371, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5371, - "to": 5373, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5373, - "to": 5375, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5375, "to": 5377, - "pattern": "NP-5BE-1-WL-4" + "pattern": "B-2" }, { "from": 5377, - "to": 5379, - "pattern": "NP-6A" + "to": 5390, + "pattern": "C-1" }, { - "from": 5379, - "to": 5381, - "pattern": "NP-6B" - }, - { - "from": 5381, - "to": 5383, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5383, - "to": 5385, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5385, - "to": 5387, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5387, - "to": 5389, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5389, - "to": 5391, - "pattern": "NP-6A" - }, - { - "from": 5391, - "to": 5393, - "pattern": "NP-6B" - }, - { - "from": 5393, - "to": 5395, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5395, - "to": 5397, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5397, + "from": 5390, "to": 5399, - "pattern": "NP-5AE-1-WL-4" + "pattern": "C-2" }, { "from": 5399, - "to": 5401, - "pattern": "NP-5BE-1-WL-4" + "to": 5406, + "pattern": "D-1" }, { - "from": 5401, - "to": 5403, - "pattern": "NP-6A" - }, - { - "from": 5403, - "to": 5405, - "pattern": "NP-6B" - }, - { - "from": 5405, - "to": 5407, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5407, - "to": 5409, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5409, - "to": 5411, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5411, - "to": 5413, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5413, - "to": 5415, - "pattern": "NP-6A" - }, - { - "from": 5415, - "to": 5417, - "pattern": "NP-6B" - }, - { - "from": 5417, - "to": 5419, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5419, - "to": 5421, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5421, - "to": 5423, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5423, - "to": 5425, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5425, + "from": 5406, "to": 5427, - "pattern": "NP-6A" + "pattern": "D-2" }, { "from": 5427, - "to": 5429, - "pattern": "NP-6B" + "to": 5446, + "pattern": "D-1" }, { - "from": 5429, - "to": 5431, - "pattern": "NP-4AD-1-D-2" + "from": 5446, + "to": 5462, + "pattern": "WL-2" }, { - "from": 5431, - "to": 5433, - "pattern": "NP-4BD-1-D-2" + "from": 5462, + "to": 5468, + "pattern": "P-2" }, { - "from": 5433, - "to": 5435, - "pattern": "NP-5AE-1-WL-4" + "from": 5468, + "to": 5495, + "pattern": "P-3" }, { - "from": 5435, - "to": 5437, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5437, - "to": 5439, - "pattern": "NP-6A" - }, - { - "from": 5439, - "to": 5441, - "pattern": "NP-6B" - }, - { - "from": 5441, - "to": 5443, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5443, - "to": 5445, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5445, - "to": 5447, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5447, - "to": 5449, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5449, - "to": 5451, - "pattern": "NP-6A" - }, - { - "from": 5451, - "to": 5453, - "pattern": "NP-6B" - }, - { - "from": 5453, - "to": 5455, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5455, - "to": 5457, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5457, - "to": 5459, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5459, - "to": 5461, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5461, - "to": 5463, - "pattern": "NP-6A" - }, - { - "from": 5463, - "to": 5465, - "pattern": "NP-6B" - }, - { - "from": 5465, - "to": 5467, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5467, - "to": 5469, - "pattern": "NP-4BD-1-D-2" - }, - { - "from": 5469, - "to": 5471, - "pattern": "NP-5AE-1-WL-4" - }, - { - "from": 5471, - "to": 5473, - "pattern": "NP-5BE-1-WL-4" - }, - { - "from": 5473, - "to": 5475, - "pattern": "NP-6A" - }, - { - "from": 5475, - "to": 5477, - "pattern": "NP-6B" - }, - { - "from": 5477, - "to": 5479, - "pattern": "NP-4AD-1-D-2" - }, - { - "from": 5479, - "to": 5480, - "pattern": "NP-4BD-1-D-2" + "from": 5495, + "to": 5500, + "pattern": "개착부" } ], "open": [ "4+700~4+745 and 5+480~5+500 excluded ([미확정])", - "pattern zones (03-003~008) pending Task 5", + "지보패턴 측점표 적용(당진). 도면 E-1~2, RP-2, WL-3~4 는 당진 표에 없어 [미확정]. 대산 표 WL-4(4+758.85~4+768.85)는 참고만 [확인 필요]", "lining reference recorded (meta.lining_reference, 04-004~009); sheet-to-station mapping [미확정]", - "[CONFLICT DETECTED] lining sheets print R1=6.892 m, standard section R1=6,982 mm (model keeps 6.982) - user check" + "[확정 2026-10-21] R1 6,982 mm 유지 (사용자 결정). 라이닝 도면 6장의 R1 6.892 m 표기는 확인 대상 오기로 기록", + "pattern-group to excavation-pattern mapping: user explanation conflicts with filename (WL-4) - re-confirm [확인 필요]" ], "lining_reference": { "source": "C0060304-004..009 (콘크리트라이닝구조도)", diff --git a/scripts/build_skeleton.py b/scripts/build_skeleton.py index 22859df..4af832c 100644 --- a/scripts/build_skeleton.py +++ b/scripts/build_skeleton.py @@ -80,11 +80,13 @@ def ring_world(R, s): P = np.column_stack([x - ORIGIN[0] + xs * nx, y - ORIGIN[1] + xs * ny, zr + zs]) return P -PAL = {"NP-4AD-1-D-2": (231, 111, 81, 255), "NP-4BD-1-D-2": (244, 162, 97, 255), - "NP-5AE-1-WL-4": (233, 196, 106, 255), "NP-5BE-1-WL-4": (138, 177, 125, 255), - "NP-6A": (42, 157, 143, 255), "NP-6B": (38, 70, 83, 255)} -ZONES = [(int(r["seg_from"]), int(r["seg_to"]), r["pattern"], r["status"]) - for r in csv.DictReader(open(f"{ROOT}/data/pattern_zones_placeholder.csv", encoding="utf-8"))] +PAL = {"A": (42, 157, 143, 255), "B-1": (231, 111, 81, 255), "B-2": (244, 162, 97, 255), + "C-1": (233, 196, 106, 255), "C-2": (138, 177, 125, 255), "D-1": (38, 70, 83, 255), + "D-2": (100, 130, 160, 255), "P-2": (190, 110, 140, 255), "P-3": (150, 90, 60, 255), + "RP-1": (80, 170, 200, 255), "WL-1": (200, 200, 120, 255), "WL-2": (120, 90, 170, 255), + "개착부": (170, 170, 170, 255)} +ZONES = [(int(float(r["sta_from"])), int(float(r["sta_to"])), r["lining_pattern"], "엑셀 지보패턴표(당진방향)") + for r in csv.DictReader(open(f"{ROOT}/data/pattern_stations_dangjin.csv", encoding="utf-8"))] def pattern_of(sta): for a, b, pat, _ in ZONES: @@ -168,7 +170,7 @@ checks["road_z_5480_m"] = round(float(np.interp(S1, dg_s, dg_v)), 3) L_chord = float(np.sum([math.dist(cn[i, 1:], cn[i + 1, 1:]) for i in range(len(cn) - 1)])) checks["plan_chord_length_total_m (4+700..5+500)"] = round(L_chord, 3) checks["station_range_modelled"] = f"{S0} .. {S1} (ring step {DS} m, {len(stations)} rings)" -checks["pattern_zones (2 m, placeholder)"] = len(ZONES) +checks["pattern_zones (지보패턴표 당진방향)"] = len(ZONES) checks["pattern_coverage_all_stations"] = bool(all(pattern_of(x) in PAL for x in stations)) checks["pattern_counts"] = {k: sum(1 for z in ZONES if z[2] == k) for k in PAL} checks["glb_bytes"] = int(__import__("os").path.getsize(glb)) @@ -188,9 +190,9 @@ meta = { "superelevation sign convention assumed (z += S/100 * x, x = left of tangent)"], "layers": [p.metadata["name"] for p in parts], "ring_step_m": DS, "ring_points": int(parts[0].metadata["ring_points"]), "first_station": S0, - "pattern_status": "PLACEHOLDER: 2 m 임의 배정. 실제 측점 구간 아님 (사용자 결정 2026-10-21). data/pattern_zones_placeholder.csv 를 수정 후 재빌드", + "pattern_status": "지보패턴: 엑셀 참고_지보패턴현황 당진방향 표(4+740~5+500, 42행, 빈틈 없음) 적용. 출처 data/pattern_stations_dangjin.csv (사용자 결정 2026-10-21)", "patterns": [{"from": a, "to": b, "pattern": pat} for a, b, pat, _ in ZONES], - "open": ["4+700~4+745 and 5+480~5+500 excluded ([미확정])", "pattern zones (03-003~008) pending Task 5", + "open": ["4+700~4+745 and 5+480~5+500 excluded ([미확정])", "지보패턴 측점표 적용(당진). 도면 E-1~2, RP-2, WL-3~4 는 당진 표에 없어 [미확정]. 대산 표 WL-4(4+758.85~4+768.85)는 참고만 [확인 필요]", "lining reference recorded (meta.lining_reference, 04-004~009); sheet-to-station mapping [미확정]", "[확정 2026-10-21] R1 6,982 mm 유지 (사용자 결정). 라이닝 도면 6장의 R1 6.892 m 표기는 확인 대상 오기로 기록", "pattern-group to excavation-pattern mapping: user explanation conflicts with filename (WL-4) - re-confirm [확인 필요]"] } diff --git a/scripts/extract_pattern_table.py b/scripts/extract_pattern_table.py new file mode 100644 index 0000000..c261cda --- /dev/null +++ b/scripts/extract_pattern_table.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +"""Extract the 당진방향 station pattern table from 참고_지보패턴현황 (read-only). +Rows 55..96 of the sheet: C=start STA, G=end STA, J=length, M=lining pattern +(지보패턴), O=실시설계 excavation class (blank = continues the row above), +Q=굴착공법, T=비고. Also extracts the 대산방향 table (rows 13..49) for reference. +Usage: extract_pattern_table.py """ +import csv, os, sys +import openpyxl + +SRC, OUT = sys.argv[1], sys.argv[2] +wb = openpyxl.load_workbook(SRC, read_only=True, data_only=True) +ws = wb["참고_지보패턴현황"] +rows = {r: row for r, row in enumerate(ws.iter_rows(min_row=1, max_row=114, max_col=33, values_only=True), start=1)} + + +def table(r0, r1, tag): + out, last_o = [], None + for r in range(r0, r1 + 1): + row = rows[r] + try: + a, b = float(row[2]), float(row[6]) + except (TypeError, ValueError): + continue + m = (row[12] or "").strip() if isinstance(row[12], str) else row[12] + o_raw = row[14] + o = o_raw if o_raw not in (None, "") else last_o + last_o = o + remark = (row[19] or "") if isinstance(row[19], str) else "" + out.append({"direction": tag, "source_row": r, "sta_from": a, "sta_to": b, + "length_m": row[9], "lining_pattern": m or ("개착부" if "개착" in remark else ""), + "excavation": o or "", "excavation_inherited": o_raw in (None, ""), + "method": (row[16] or "") if isinstance(row[16], str) else "", + "remark": remark}) + return out + + +south = table(55, 96, "당진") +north = table(13, 49, "대산") +os.makedirs(OUT, exist_ok=True) +cols = list(south[0].keys()) +for name, data in [("pattern_stations_dangjin.csv", south), ("pattern_stations_daesan_ref.csv", north)]: + with open(os.path.join(OUT, name), "w", encoding="utf-8", newline="") as fh: + w = csv.DictWriter(fh, fieldnames=cols) + w.writeheader() + w.writerows(data) +print("dangjin rows", len(south), "range", south[0]["sta_from"], "->", south[-1]["sta_to"]) +print("daesan rows", len(north), "range", north[0]["sta_from"], "->", north[-1]["sta_to"]) +print("blank lining pattern rows (dangjin):", [(d["source_row"], d["remark"]) for d in south if not d["lining_pattern"]]) diff --git a/scripts/make_pattern_doc.py b/scripts/make_pattern_doc.py new file mode 100644 index 0000000..c150086 --- /dev/null +++ b/scripts/make_pattern_doc.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +"""Render the station-by-station lining pattern report (DOC/03_설계) from the +CSVs written by extract_pattern_table.py. Values are read, not typed. +Usage: make_pattern_doc.py """ +import csv +import json +import sys + +DJ, DS, LS, OUT = sys.argv[1:5] +dj = list(csv.DictReader(open(DJ, encoding="utf-8"))) +ds = list(csv.DictReader(open(DS, encoding="utf-8"))) +lin = json.load(open(LS, encoding="utf-8"))["sheets"] +drawing_groups = sorted({g["group"] for s in lin for g in s["pattern_details"] if g["group"]}) +dj_names = {r["lining_pattern"] for r in dj} +ds_names = {r["lining_pattern"] for r in ds} +# Drawing group labels (read from the sheet notes, 04-004..009) -> member patterns. +# Explicit table: the labels mix letter ranges (A~C-2) and number ranges (WL-1~2). +DRAWING_MEMBERS = {"A~C-2": ["A", "B-1", "B-2", "C-1", "C-2"], "D-1~2": ["D-1", "D-2"], + "E-1~2": ["E-1", "E-2"], "WL-1~2": ["WL-1", "WL-2"], "WL-1~2,RP-1~2": ["WL-1", "WL-2", "RP-1", "RP-2"], + "WL-3~4": ["WL-3", "WL-4"], "P-2~3": ["P-2", "P-3"], "RP-1~2": ["RP-1", "RP-2"]} +members = set() +for g in drawing_groups: + members |= set(DRAWING_MEMBERS.get(g, [g])) +missing_dj = sorted(m for m in members if m not in dj_names) +only_ds = sorted(m for m in missing_dj if m in ds_names) +none_any = sorted(m for m in missing_dj if m not in ds_names) +L = ["# 측점별 콘크리트 라이닝 지보패턴표 (당진방향) (초안)\n", + "| 버전 | 일자 | 변경 내용 |", "|---|---|---|", + "| v0.1.00 | 2026-10-21 | 최초 작성. 엑셀 `참고_지보패턴현황` 당진방향 표를 측점별로 정리 (사용자 결정: 모델 placeholder 대체) |\n", + "## 1. 출처와 범위", + "- 원본: `RAG/03_터널명(대산2터널)/지보패턴현황_20260918.xlsx`, 시트 `참고_지보패턴현황`, 당진방향 표 (원본 행 55~96)", + f"- 행 {len(dj)}개, 측점 {dj[0]['sta_from']} ~ {dj[-1]['sta_to']}, 빈틈 없음 (각 행 끝 = 다음 행 시작)", + "- 모델 적용 범위 4+745 ~ 5+480 은 이 표로 전 구간 덮임 (735 m)", + "- 지보패턴(M열) = 라이닝 패턴, 실시설계(O열) = 굴착 등급. 실시설계 칸이 빈 행은 위 행의 값을 이어 받음 (병합 셀 해석, [추론])\n", + "## 2. 측점별 표", + "| 측점 from | 측점 to | 연장(m) | 지보패턴 | 실시설계 | 굴착공법 | 비고 |", + "|---|---|---|---|---|---|---|"] +def sta(x): + v = int(float(x)); return f"{v // 1000}+{v % 1000:03d}" +for r in dj: + exc = r["excavation"] + (" (이어받음)" if r["excavation_inherited"] == "True" and r["excavation"] else "") + L.append(f"| {sta(r['sta_from'])} | {sta(r['sta_to'])} | {float(r['length_m']):g} | {r['lining_pattern']} | {exc} | {r['method'].replace(chr(10), ' ')} | {r['remark']} |") +L += ["", "## 3. 도면과 표의 대응", + f"- 라이닝 도면(04-004~009)의 패턴 {len(members)}개 중 당진 표에 있는 것: {len(members) - len(missing_dj)}개", + f"- 당진 표에 없고 대산 표에만 있는 것: {', '.join(only_ds) if only_ds else '없음'} (대산 표 값 참고만, 적용 안 함 — 아래 4항)", + f"- 두 표 모두 없는 것: {', '.join(none_any) if none_any else '없음'} → 측점 지정 불가, [미확정]\n", + "## 4. 확인 필요 (HITL)", + "- [확인 필요] 대산방향 표의 WL-4 (4+758.85~4+768.85, NP-5) 를 당진 측점에 적용할지. 두 방향이 별도 튜브라는 점은 [추론]이며 확인되지 않았다. 당진 표는 같은 측점에 WL-2/WL-1 을 보여 준다.", + "- [확인 필요] 말씀하신 `NP-5BE-1-WL-4` 의 풀이 (NP-5B 의 E-1 ~ WL-4). 당진 NP-5 구간은 WL-2·WL-1 뿐이고, E-1 은 두 표 어디에도 없다.", + "- [확인 필요] 엑셀 `개요2`·`1` 시트: 굴착 등급은 NP-4/5/6 (A·B 접미사 포함), 괄호 안은 지보 하위 패턴이라는 표기. 이 해석은 엑셀 표기와 일치하는 것으로 보이나 도면 명칭 대응은 확정하지 않았다.\n", + "## 5. 적용 결과 (골격 모델)", + "- placeholder 2 m 구간은 폐기하고 이 표로 대체 (사용자 결정 2026-10-21)", + "- 뷰어의 라이닝 클릭 값: 측점, 지보패턴(본 표), 라이닝 사양 (C0060304-004~009)", + ""] +open(OUT, "w", encoding="utf-8").write("\n".join(L)) +print("written", OUT, "rows", len(dj), "drawing groups", len(members), "missing in dangjin", missing_dj) diff --git a/viewer/index.html b/viewer/index.html index a6e11e0..dba635c 100644 --- a/viewer/index.html +++ b/viewer/index.html @@ -121,7 +121,7 @@ renderer.domElement.addEventListener('pointerup', (e) => { const sta = M.first_station + ring * M.ring_step_m; const z = M.patterns.find((z) => sta >= z.from && sta < z.to); const km = Math.floor(sta / 1000), m = Math.round(sta % 1000); - extra = '\n측점: ' + km + '+' + String(m).padStart(3, '0') + '\n패턴: ' + (z ? z.pattern : '-') + ' (임의 배정, 실제 구간 아님)' + (M.lining_reference ? '\n라이닝 상세: ' + M.lining_reference.summary : ''); + extra = '\n측점: ' + km + '+' + String(m).padStart(3, '0') + '\n패턴: ' + (z ? z.pattern : '-') + ' (엑셀 지보패턴표, 당진방향)' + (M.lining_reference ? '\n라이닝 상세: ' + M.lining_reference.summary : ''); } info.textContent = (INFO[key] || key) + extra + '\n교차점: x=' + hit.point.x.toFixed(2) + ' y=' + hit.point.y.toFixed(2) + ' z=' + hit.point.z.toFixed(2) + ' (m, 모델 좌표)'; }