From cc92ad59f2496fc63afca11b96763bd7e4a08bd3 Mon Sep 17 00:00:00 2001 From: Salijoghli <107577102+Salijoghli@users.noreply.github.com> Date: Tue, 6 Jan 2026 15:15:46 +0400 Subject: [PATCH] exporting TPE related information and updated the scene generation code --- AMZ_TPA8_SYSDL_MCM02.csv | 194 +++++++++++ conveyors.csv | 74 ---- generate_csv.lsp | 113 +++++- generate_scene.py | 581 +++++++++++++++++++++++-------- generated_conveyors.tscn | 718 --------------------------------------- skipped_conveyors.txt | 12 - 6 files changed, 735 insertions(+), 957 deletions(-) create mode 100644 AMZ_TPA8_SYSDL_MCM02.csv delete mode 100644 conveyors.csv delete mode 100644 generated_conveyors.tscn delete mode 100644 skipped_conveyors.txt diff --git a/AMZ_TPA8_SYSDL_MCM02.csv b/AMZ_TPA8_SYSDL_MCM02.csv new file mode 100644 index 0000000..8e092e1 --- /dev/null +++ b/AMZ_TPA8_SYSDL_MCM02.csv @@ -0,0 +1,194 @@ +record_type,conveyor_key,sec,included,reason,has_tpe,has_epc,has_vfd,is_last_any,is_last_geom,start_x,start_y,end_x,end_y,tpe_name,tpe_x,tpe_y,tpe_rotation,tpe_distance +CONVEYOR,PS3_1,1,1,GEOMETRY,1,1,1,0,0,3087.489034,3048.565032,3159.132392,3024.713237 +CONVEYOR,PS3_2,2,1,GEOMETRY,1,0,1,0,0,3159.132392,3024.713237,3190.945812,3042.099631 +CONVEYOR,PS3_3,3,1,GEOMETRY,1,0,1,0,0,3190.945812,3042.099631,3478.820696,3249.442902 +CONVEYOR,PS3_5,5,1,GEOMETRY,1,0,1,0,0,3519.577701,3258.530860,4079.105653,3253.674982 +CONVEYOR,PS3_6,6,1,GEOMETRY,1,0,1,0,0,4079.105653,3253.674982,4784.946959,3257.612009 +CONVEYOR,PS3_7,7,1,GEOMETRY,1,0,1,0,0,5985.674639,3259.327631,5985.674639,3259.327631 +CONVEYOR,PS3_9,9,1,GEOMETRY,1,0,1,0,0,6060.483270,3193.853573,6060.789954,2741.579531 +CONVEYOR,PS3_10,10,1,GEOMETRY,1,0,1,0,0,6060.789954,2741.579531,6060.495376,2610.801360 +CONVEYOR,PS3_12,12,1,GEOMETRY,1,1,1,1,1,6007.382954,2569.962296,5948.039145,2529.928635 +CONVEYOR,UL8_1,1,1,GEOMETRY,1,1,1,0,0,632.618127,3188.888389,824.872344,3157.126582 +CONVEYOR,UL8_2,2,1,GEOMETRY,1,1,1,0,0,885.669058,3169.966906,1712.765129,3158.462454 +CONVEYOR,UL8_3,3,1,GEOMETRY,1,0,1,0,0,1712.765129,3158.462454,1817.953869,3155.934504 +CONVEYOR,UL8_5,5,1,GEOMETRY,1,0,1,0,0,1881.702530,3136.323730,1944.426945,3101.149921 +CONVEYOR,UL8_6,6,1,GEOMETRY,1,0,1,0,0,1944.426945,3101.149921,1978.682956,3086.062642 +CONVEYOR,UL8_7,7,1,GEOMETRY,1,0,1,0,0,1978.682956,3086.062642,2007.744900,3063.545268 +CONVEYOR,UL8_8,8,1,GEOMETRY,1,0,1,0,1,2007.744900,3063.545268,2040.663378,3048.333245 +CONVEYOR,UL10_1,1,1,GEOMETRY,1,1,1,0,0,632.900863,3592.147634,823.776601,3561.145597 +CONVEYOR,UL10_2,2,1,GEOMETRY,1,1,1,0,0,874.719154,3570.155999,1720.187324,3564.061477 +CONVEYOR,UL10_3,3,1,GEOMETRY,1,0,1,0,0,1720.187324,3564.061477,2083.996631,3560.766860 +CONVEYOR,UL10_4,4,1,GEOMETRY,1,0,1,0,0,2083.996631,3560.766860,2128.229940,3542.739063 +CONVEYOR,UL10_5,5,1,GEOMETRY,1,0,1,0,0,2128.229940,3542.739063,2164.812356,3542.467143 +CONVEYOR,UL10_6,6,1,GEOMETRY,1,0,1,0,0,2164.812356,3542.467143,2200.090761,3544.785276 +CONVEYOR,UL10_7,7,1,GEOMETRY,1,0,1,0,0,2200.090761,3544.785276,2236.861695,3544.527150 +CONVEYOR,UL10_9,9,1,GEOMETRY,1,0,1,0,1,2309.630704,3563.985881,2358.664691,3592.202752 +CONVEYOR,UL9_3,3,1,GEOMETRY,1,1,1,0,0,551.208873,3355.007428,907.467125,3324.238385 +CONVEYOR,UL9_4,4,1,GEOMETRY,1,1,1,0,0,907.467125,3324.238385,1700.371316,3323.415506 +CONVEYOR,UL9_5,5,1,GEOMETRY,1,0,1,0,0,1700.371316,3323.415506,1826.538319,3321.774338 +CONVEYOR,UL9_7,7,1,GEOMETRY,1,0,1,0,0,1891.501859,3302.098769,2212.651713,3118.960609 +CONVEYOR,UL9_8,8,1,GEOMETRY,1,0,1,0,0,2212.651713,3118.960609,2247.352179,3100.254070 +CONVEYOR,UL9_9,9,1,GEOMETRY,1,0,1,0,0,2247.352179,3100.254070,2277.803935,3081.192233 +CONVEYOR,UL9_10,10,1,GEOMETRY,1,0,1,0,0,2277.803935,3081.192233,2310.374208,3065.368059 +CONVEYOR,UL9_11,11,1,GEOMETRY,1,0,1,0,1,2310.374208,3065.368059,2343.399072,3047.086292 +CONVEYOR,UL11_3,3,1,GEOMETRY,1,1,1,0,0,548.752870,3692.802976,897.324015,3661.485774 +CONVEYOR,UL11_4,4,1,GEOMETRY,1,1,1,0,0,897.324015,3661.485774,1700.480744,3658.222070 +CONVEYOR,UL11_5,5,1,GEOMETRY,1,0,1,0,0,1700.480744,3658.222070,1844.529026,3653.231416 +CONVEYOR,UL11_6,6,1,GEOMETRY,1,0,1,0,0,1844.529026,3653.231416,1879.597360,3657.637923 +CONVEYOR,UL11_7,7,1,GEOMETRY,1,0,1,0,0,1879.597360,3657.637923,1917.029348,3658.582710 +CONVEYOR,UL11_8,8,1,GEOMETRY,1,0,1,0,0,1917.029348,3658.582710,1951.991891,3658.283856 +CONVEYOR,UL11_9,9,1,GEOMETRY,1,0,1,0,0,1951.991891,3658.283856,1988.780120,3658.283856 +CONVEYOR,UL11_10,10,1,GEOMETRY,1,1,1,0,0,2030.764864,3659.578691,2591.455783,3686.635164 +CONVEYOR,UL11_12,12,1,GEOMETRY,1,0,1,0,0,2750.134283,3691.074283,2845.387748,3690.854148 +CONVEYOR,UL11_13,13,1,GEOMETRY,1,0,1,0,0,2845.387748,3690.854148,2953.707982,3688.012958 +CONVEYOR,UL11_14,14,1,GEOMETRY,1,0,1,1,1,2971.430134,3668.918012,3155.997766,3671.874205 +CONVEYOR,UL12_3,3,1,GEOMETRY,1,1,1,0,0,543.627555,3859.294486,905.036450,3826.957213 +CONVEYOR,UL12_4,4,1,GEOMETRY,1,1,1,0,0,905.036450,3826.957213,1742.072614,3827.324144 +CONVEYOR,UL12_5,5,1,GEOMETRY,1,0,1,0,0,1742.072614,3827.324144,1842.084498,3824.815942 +CONVEYOR,UL12_7,7,1,GEOMETRY,1,0,1,0,0,1908.852330,3808.657056,1955.553412,3781.851714 +CONVEYOR,UL12_8,8,1,GEOMETRY,1,0,1,0,0,1955.553412,3781.851714,1986.689623,3761.398031 +CONVEYOR,UL12_9,9,1,GEOMETRY,1,0,1,0,0,1986.689623,3761.398031,2020.048027,3747.625802 +CONVEYOR,UL12_10,10,1,GEOMETRY,1,0,1,0,1,2020.048027,3747.625802,2049.673824,3728.878967 +CONVEYOR,UL7_3,3,1,GEOMETRY,1,1,1,0,0,551.742895,2956.847765,908.026025,2987.966131 +CONVEYOR,UL7_4,4,1,GEOMETRY,1,1,1,0,0,908.026025,2987.966131,1711.113463,2986.840411 +CONVEYOR,UL7_5,5,1,GEOMETRY,1,0,1,0,0,1711.113463,2986.840411,1817.542835,2987.029037 +CONVEYOR,UL7_6,6,1,GEOMETRY,1,0,1,0,0,1817.542835,2987.029037,1857.441282,2972.114781 +CONVEYOR,UL7_7,7,1,GEOMETRY,1,0,1,0,0,1857.441282,2972.114781,1893.692205,2973.612010 +CONVEYOR,UL7_8,8,1,GEOMETRY,1,0,1,0,0,1893.692205,2973.612010,1929.723023,2973.789916 +CONVEYOR,UL7_9,9,1,GEOMETRY,1,0,1,0,0,1929.723023,2973.789916,1965.806948,2973.254470 +CONVEYOR,UL7_10,10,1,GEOMETRY,1,1,1,0,0,1998.130873,2981.527148,2611.835876,2978.598409 +CONVEYOR,UL7_12,12,1,GEOMETRY,1,0,1,0,0,2766.420800,2995.096200,2863.133560,2992.295904 +CONVEYOR,UL7_13,13,1,GEOMETRY,1,0,1,0,0,2863.133560,2992.295904,2970.734203,2992.915446 +CONVEYOR,UL7_14,14,1,GEOMETRY,1,0,1,1,1,2985.330236,2984.624061,3159.803377,2984.151808 +CONVEYOR,PS4_2,2,1,GEOMETRY,1,0,1,0,0,3144.026193,3596.341132,3300.316069,3508.372989 +CONVEYOR,PS4_4,4,1,GEOMETRY,1,0,1,0,0,3310.573165,3523.337000,3352.239313,3524.485575 +CONVEYOR,PS4_5,5,1,GEOMETRY,1,0,1,0,0,3352.239313,3524.485575,4006.352329,3523.358120 +CONVEYOR,PS4_6,6,1,GEOMETRY,1,0,1,0,0,4006.352329,3523.358120,4688.607797,3525.782820 +CONVEYOR,PS4_7,7,1,GEOMETRY,1,0,1,0,0,4688.607797,3525.782820,5611.139091,3525.602719 +CONVEYOR,PS4_8,8,1,GEOMETRY,1,0,1,0,0,5611.139091,3525.602719,6274.851839,3521.438644 +CONVEYOR,PS4_10,10,1,GEOMETRY,1,0,1,0,0,6353.888615,3456.502166,6352.160013,2673.212430 +CONVEYOR,PS4_11,11,1,GEOMETRY,1,0,1,0,0,6352.160013,2673.212430,6349.468358,2155.105517 +CONVEYOR,PS4_12,12,1,GEOMETRY,1,0,1,0,0,6349.468358,2155.105517,6355.840289,1761.029836 +CONVEYOR,PS4_14,14,1,GEOMETRY,1,1,1,1,1,6272.313843,1688.457365,5949.215298,1690.378911 +CONVEYOR,UL11_11,11,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, +CONVEYOR,PS4_1,1,0,VFD_ONLY_BEFORE_GEOM_END,0,1,1,0,0,,,, +CONVEYOR,PS4_3,3,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, +CONVEYOR,PS3_4,4,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, +CONVEYOR,PS4_9,9,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, +CONVEYOR,PS3_8,8,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, +CONVEYOR,PS3_11,11,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, +CONVEYOR,PS4_13,13,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, +CONVEYOR,UL7_11,11,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, +CONVEYOR,UL8_4,4,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, +CONVEYOR,UL8_9,9,0,VFD_ONLY_LAST_MAY_MERGE,0,0,1,1,0,,,, +CONVEYOR,UL9_6,6,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, +CONVEYOR,UL12_6,6,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, +CONVEYOR,UL9_12,12,0,VFD_ONLY_LAST_MAY_MERGE,0,0,1,1,0,,,, +CONVEYOR,UL10_8,8,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, +CONVEYOR,UL10_10,10,0,VFD_ONLY_LAST_MAY_MERGE,0,0,1,1,0,,,, +CONVEYOR,UL12_11,11,0,VFD_ONLY_LAST_MAY_MERGE,0,0,1,1,0,,,, +TPE,PS3_1,,,,,,,,,,,,,PS3_1_TPE1,3159.132392,3024.713237,210.000000,45.785116 +TPE,PS3_5,,,,,,,,,,,,,PS3_5_TPE1,3519.577701,3258.530860,90.000000,45.785116 +TPE,PS3_5,,,,,,,,,,,,,PS3_5_TPE2,4079.105653,3253.674982,90.000000,55.323971 +TPE,PS3_3,,,,,,,,,,,,,PS3_3_TPE1,3478.820696,3249.442902,120.000000,45.785116 +TPE,PS3_2,,,,,,,,,,,,,PS3_2_TPE1,3190.945812,3042.099631,210.000000,45.785116 +TPE,UL7_3,,,,,,,,,,,,,UL7_3_TPE2,908.026025,2987.966131,90.000000,43.000000 +TPE,UL7_3,,,,,,,,,,,,,UL7_3_TPE1,612.253341,3029.621551,0.000000,49.667350 +TPE,UL7_5,,,,,,,,,,,,,UL7_5_TPE1,1817.542835,2987.029037,90.000000,46.605812 +TPE,UL7_6,,,,,,,,,,,,,UL7_6_TPE1,1857.441282,2972.114781,90.000000,62.276218 +TPE,UL7_7,,,,,,,,,,,,,UL7_7_TPE1,1893.692205,2973.612010,90.000000,62.276218 +TPE,UL7_4,,,,,,,,,,,,,UL7_4_TPE1,1711.113463,2986.840411,90.000000,45.064241 +TPE,UL7_8,,,,,,,,,,,,,UL7_8_TPE1,1929.723023,2973.789916,90.000000,62.276218 +TPE,UL7_12,,,,,,,,,,,,,UL7_12_TPE1,2766.420800,2995.096200,90.000000,49.855884 +TPE,UL7_12,,,,,,,,,,,,,UL7_12_TPE2,2863.133560,2992.295904,90.000000,49.242255 +TPE,UL7_13,,,,,,,,,,,,,UL7_13_TPE1,2970.734203,2992.915446,90.000000,49.057934 +TPE,PS3_6,,,,,,,,,,,,,PS3_6_TPE1,4784.946959,3257.612009,90.000000,45.785116 +TPE,PS3_7,,,,,,,,,,,,,PS3_7_TPE1,5985.674639,3259.327631,90.000000,45.785116 +TPE,PS3_9,,,,,,,,,,,,,PS3_9_TPE1,6060.483270,3193.853573,180.000000,45.785116 +TPE,PS3_9,,,,,,,,,,,,,PS3_9_TPE2,6060.789954,2741.579531,180.000000,45.785116 +TPE,PS3_10,,,,,,,,,,,,,PS3_10_TPE1,6060.495376,2610.801360,180.000000,45.785116 +TPE,PS3_12,,,,,,,,,,,,,PS3_12_TPE1,5987.261559,2530.050002,90.000000,45.785116 +TPE,PS3_12,,,,,,,,,,,,,PS3_12_TPE2,5948.039145,2529.928635,90.000000,45.785116 +TPE,UL8_1,,,,,,,,,,,,,UL8_1_TPE1,824.872344,3157.126582,90.000000,43.000000 +TPE,UL8_3,,,,,,,,,,,,,UL8_3_TPE1,1817.953869,3155.934504,90.000000,63.087627 +TPE,UL8_8,,,,,,,,,,,,,UL8_8_TPE1,2040.663378,3048.333245,60.000000,65.489640 +TPE,UL8_7,,,,,,,,,,,,,UL8_7_TPE1,2007.744900,3063.545268,60.000000,65.489640 +TPE,UL8_6,,,,,,,,,,,,,UL8_6_TPE1,1978.682956,3086.062642,60.000000,65.489640 +TPE,UL8_5,,,,,,,,,,,,,UL8_5_TPE2,1944.426945,3101.149921,60.000000,65.489640 +TPE,UL8_5,,,,,,,,,,,,,UL8_5_TPE1,1881.702530,3136.323730,58.094345,65.489640 +TPE,UL9_7,,,,,,,,,,,,,UL9_7_TPE1,1891.501859,3302.098769,60.000000,65.489640 +TPE,UL9_7,,,,,,,,,,,,,UL9_7_TPE2,2212.651713,3118.960609,58.094345,65.489640 +TPE,UL9_8,,,,,,,,,,,,,UL9_8_TPE1,2247.352179,3100.254070,58.094345,65.489640 +TPE,UL9_9,,,,,,,,,,,,,UL9_9_TPE1,2277.803935,3081.192233,58.094345,65.489640 +TPE,UL9_10,,,,,,,,,,,,,UL9_10_TPE1,2310.374208,3065.368059,58.094345,65.489640 +TPE,UL8_2,,,,,,,,,,,,,UL8_2_TPE1,885.669058,3169.966906,270.000000,49.667350 +TPE,UL8_2,,,,,,,,,,,,,UL8_2_TPE2,1712.765129,3158.462454,90.000000,43.000000 +TPE,UL9_3,,,,,,,,,,,,,UL9_3_TPE1,608.834305,3362.234637,0.000000,49.667350 +TPE,UL9_3,,,,,,,,,,,,,UL9_3_TPE2,907.467125,3324.238385,90.000000,43.000000 +TPE,UL9_4,,,,,,,,,,,,,UL9_4_TPE1,1700.371316,3323.415506,90.000000,43.000000 +TPE,UL10_1,,,,,,,,,,,,,UL10_1_TPE1,823.776601,3561.145597,90.000000,43.000000 +TPE,UL10_2,,,,,,,,,,,,,UL10_2_TPE1,874.719154,3570.155999,270.000000,49.667350 +TPE,UL10_2,,,,,,,,,,,,,UL10_2_TPE2,1720.187324,3564.061477,90.000000,43.000000 +TPE,UL10_4,,,,,,,,,,,,,UL10_4_TPE1,2128.229940,3542.739063,90.000000,62.276218 +TPE,UL10_5,,,,,,,,,,,,,UL10_5_TPE1,2164.812356,3542.467143,90.000000,62.276218 +TPE,UL10_6,,,,,,,,,,,,,UL10_6_TPE1,2200.090761,3544.785276,90.000000,62.276218 +TPE,UL10_3,,,,,,,,,,,,,UL10_3_TPE1,2083.996631,3560.766860,90.000000,45.064241 +TPE,UL10_7,,,,,,,,,,,,,UL10_7_TPE1,2236.861695,3544.527150,90.000000,62.276218 +TPE,UL10_9,,,,,,,,,,,,,UL10_9_TPE1,2309.630704,3563.985881,120.000000,63.276200 +TPE,UL10_9,,,,,,,,,,,,,UL10_9_TPE2,2358.664691,3592.202752,120.000000,62.276218 +TPE,UL11_3,,,,,,,,,,,,,UL11_3_TPE1,606.378302,3700.030184,0.000000,49.667350 +TPE,UL11_3,,,,,,,,,,,,,UL11_3_TPE2,897.324015,3661.485774,90.000000,43.000000 +TPE,UL11_5,,,,,,,,,,,,,UL11_5_TPE1,1844.529026,3653.231416,90.000000,49.642395 +TPE,UL11_6,,,,,,,,,,,,,UL11_6_TPE1,1879.597360,3657.637923,90.000000,62.276218 +TPE,UL11_7,,,,,,,,,,,,,UL11_7_TPE1,1917.029348,3658.582710,90.000000,62.276218 +TPE,UL11_4,,,,,,,,,,,,,UL11_4_TPE1,1700.480744,3658.222070,90.000000,45.064241 +TPE,UL11_8,,,,,,,,,,,,,UL11_8_TPE1,1951.991891,3658.283856,90.000000,62.276218 +TPE,UL11_10,,,,,,,,,,,,,UL11_10_TPE1,2030.764864,3659.578691,90.000000,62.276218 +TPE,UL11_10,,,,,,,,,,,,,UL11_10_TPE2,2198.528913,3659.525592,90.000000,62.276218 +TPE,UL11_10,,,,,,,,,,,,,UL11_10_TPE3,2325.765680,3684.433010,270.000000,62.276218 +TPE,UL11_10,,,,,,,,,,,,,UL11_10_TPE4,2487.792623,3686.690780,270.000000,62.276218 +TPE,UL11_10,,,,,,,,,,,,,UL11_10_TPE5,2591.455783,3686.635164,270.000000,62.276218 +TPE,UL11_12,,,,,,,,,,,,,UL11_12_TPE1,2750.134283,3691.074283,270.000000,54.406101 +TPE,UL11_12,,,,,,,,,,,,,UL11_12_TPE2,2845.387748,3690.854148,270.000000,54.406101 +TPE,UL11_13,,,,,,,,,,,,,UL11_13_TPE1,2953.707982,3688.012958,270.000000,47.542783 +TPE,UL12_3,,,,,,,,,,,,,UL12_3_TPE2,905.036450,3826.957213,90.000000,43.000000 +TPE,UL12_4,,,,,,,,,,,,,UL12_4_TPE1,1742.072614,3827.324144,90.000000,43.000000 +TPE,UL12_9,,,,,,,,,,,,,UL12_9_TPE1,2020.048027,3747.625802,58.094345,65.489640 +TPE,UL12_8,,,,,,,,,,,,,UL12_8_TPE1,1986.689623,3761.398031,58.094345,65.489640 +TPE,UL12_7,,,,,,,,,,,,,UL12_7_TPE2,1955.553412,3781.851714,58.094345,65.489640 +TPE,UL12_7,,,,,,,,,,,,,UL12_7_TPE1,1908.852330,3808.657056,58.094345,65.489640 +TPE,PS4_2,,,,,,,,,,,,,PS4_2_TPE1,3144.026193,3596.341132,329.554546,45.785116 +TPE,PS4_2,,,,,,,,,,,,,PS4_2_TPE2,3300.316069,3508.372989,329.554546,45.785116 +TPE,PS4_4,,,,,,,,,,,,,PS4_4_TPE1,3310.573165,3523.337000,90.000000,45.785116 +TPE,PS4_4,,,,,,,,,,,,,PS4_4_TPE2,3352.239313,3524.485575,90.000000,45.785116 +TPE,PS4_5,,,,,,,,,,,,,PS4_5_TPE1,4006.352329,3523.358120,90.000000,45.785116 +TPE,PS4_6,,,,,,,,,,,,,PS4_6_TPE1,4688.607797,3525.782820,90.000000,45.785116 +TPE,PS4_7,,,,,,,,,,,,,PS4_7_TPE1,5611.139091,3525.602719,90.000000,45.785116 +TPE,PS4_8,,,,,,,,,,,,,PS4_8_TPE1,6274.851839,3521.438644,90.000000,45.785116 +TPE,PS4_10,,,,,,,,,,,,,PS4_10_TPE1,6353.888615,3456.502166,180.000000,45.785116 +TPE,PS4_10,,,,,,,,,,,,,PS4_10_TPE2,6352.160013,2673.212430,180.000000,45.785116 +TPE,PS4_11,,,,,,,,,,,,,PS4_11_TPE1,6349.468358,2155.105517,180.000000,45.785116 +TPE,PS4_12,,,,,,,,,,,,,PS4_12_TPE1,6355.840289,1761.029836,180.000000,45.785116 +TPE,UL7_14,,,,,,,,,,,,,UL7_14_PE1,2985.330236,2984.624061,90.000000,62.276218 +TPE,UL7_14,,,,,,,,,,,,,UL7_14_PE2,2995.809571,2984.624061,90.000000,62.276218 +TPE,UL7_14,,,,,,,,,,,,,UL7_14_PE3,3006.611353,2984.624061,90.000000,62.276218 +TPE,UL7_14,,,,,,,,,,,,,UL7_14_PE4,3145.918252,2982.299275,90.000000,62.276218 +TPE,UL7_14,,,,,,,,,,,,,UL7_14_PE5,3159.803377,2984.151808,90.000000,62.276218 +TPE,UL11_14,,,,,,,,,,,,,UL11_14_PE1,2971.430134,3668.918012,90.000000,62.276218 +TPE,UL11_14,,,,,,,,,,,,,UL11_14_PE2,2981.909469,3668.918012,90.000000,62.276218 +TPE,UL11_14,,,,,,,,,,,,,UL11_14_PE3,2992.711251,3668.918012,90.000000,62.276218 +TPE,UL11_14,,,,,,,,,,,,,UL11_14_PE4,3140.122346,3669.955216,90.000000,62.276218 +TPE,UL11_14,,,,,,,,,,,,,UL11_14_PE5,3155.997766,3671.874205,90.000000,62.276218 +TPE,UL7_9,,,,,,,,,,,,,UL7_9_TPE1,1965.806948,2973.254470,90.000000,62.276218 +TPE,UL9_5,,,,,,,,,,,,,UL9_5_TPE1,1826.538319,3321.774338,90.000000,65.052088 +TPE,UL9_11,,,,,,,,,,,,,UL9_11_TPE1,2343.399072,3047.086292,58.094345,65.489640 +TPE,UL11_9,,,,,,,,,,,,,UL11_9_TPE1,1988.780120,3658.283856,90.000000,62.276218 +TPE,UL12_5,,,,,,,,,,,,,UL12_5_TPE1,1842.084498,3824.815942,90.000000,64.845569 +TPE,UL12_10,,,,,,,,,,,,,UL12_10_TPE1,2049.673824,3728.878967,58.094345,65.489640 +TPE,UL7_10,,,,,,,,,,,,,UL7_10_TPE2,2184.282561,2976.023749,90.000000,66.331837 +TPE,UL7_10,,,,,,,,,,,,,UL7_10_TPE4,2488.728147,2977.141287,90.000000,63.585604 +TPE,UL7_10,,,,,,,,,,,,,UL7_10_TPE5,2611.835876,2978.598409,90.000000,62.276218 +TPE,UL7_10,,,,,,,,,,,,,UL7_10_TPE1,1998.130873,2981.527148,90.000000,62.276218 +TPE,UL7_10,,,,,,,,,,,,,UL7_10_TPE3,2334.139704,2978.861146,90.000000,62.276218 +TPE,PS4_14,,,,,,,,,,,,,PS4_14_TPE1,6272.313843,1688.457365,90.000000,45.785116 +TPE,PS4_14,,,,,,,,,,,,,PS4_14_TPE2,5949.215298,1690.378911,90.000000,45.785116 diff --git a/conveyors.csv b/conveyors.csv deleted file mode 100644 index 23d04f9..0000000 --- a/conveyors.csv +++ /dev/null @@ -1,74 +0,0 @@ -conveyor_key,sec,included,reason,has_tpe,has_epc,has_vfd,is_last_any,is_last_geom,start_x,start_y,end_x,end_y -PS1_2,2,1,GEOMETRY,1,0,1,0,0,3182.112871,1751.627960,3307.631353,1679.668896 -PS1_4,4,1,GEOMETRY,1,0,1,0,0,3377.926229,1655.901734,3931.089961,1657.733689 -PS1_5,5,1,GEOMETRY,1,1,1,1,1,3931.089961,1657.733689,4262.417377,1656.646266 -PS2_2,2,1,GEOMETRY,1,0,1,0,0,3099.843745,2245.419901,3140.391285,2223.245100 -PS2_3,3,1,GEOMETRY,1,0,1,0,0,3140.391285,2223.245100,3588.721702,1959.931507 -PS2_5,5,1,GEOMETRY,1,0,1,0,0,3660.544200,1941.885284,4197.937505,1938.160461 -PS2_6,6,1,GEOMETRY,1,1,1,1,1,4197.937505,1938.160461,4259.627698,1938.547503 -UL1_3,3,1,GEOMETRY,1,1,1,0,0,547.290786,1846.090315,902.762889,1810.459399 -UL1_4,4,1,GEOMETRY,1,1,1,0,0,902.762889,1810.459399,1731.526555,1810.217430 -UL1_5,5,1,GEOMETRY,1,0,1,0,0,1731.526555,1810.217430,1839.227859,1809.167581 -UL1_6,6,1,GEOMETRY,1,0,1,0,0,1839.227859,1809.167581,1876.642886,1807.970923 -UL1_7,7,1,GEOMETRY,1,0,1,0,0,1876.642886,1807.970923,1912.482307,1808.027116 -UL1_8,8,1,GEOMETRY,1,0,1,0,0,1912.482307,1808.027116,1948.547333,1806.790209 -UL1_9,9,1,GEOMETRY,1,0,1,0,0,1948.547333,1806.790209,1985.172076,1809.772901 -UL1_10,10,1,GEOMETRY,1,1,1,0,0,2020.869443,1811.538199,2641.029923,1810.100198 -UL1_11,11,1,GEOMETRY,1,0,1,0,0,2641.029923,1810.100198,2803.698247,1810.912459 -UL1_12,12,1,GEOMETRY,1,0,1,0,0,2803.698247,1810.912459,2893.829959,1825.589512 -UL1_13,13,1,GEOMETRY,1,0,1,0,0,2893.829959,1825.589512,3018.129340,1821.502800 -UL1_14,14,1,GEOMETRY,1,0,1,1,1,3034.357601,1826.496682,3281.847811,1820.321611 -UL2_3,3,1,GEOMETRY,1,1,1,0,0,553.975614,2012.630135,903.404869,1978.577931 -UL2_4,4,1,GEOMETRY,1,1,1,0,0,903.404869,1978.577931,1719.423553,1977.802191 -UL2_5,5,1,GEOMETRY,1,0,1,0,0,1719.423553,1977.802191,1822.643168,1978.445929 -UL2_7,7,1,GEOMETRY,1,0,1,0,0,1899.557661,1958.742816,1944.517637,1930.951081 -UL2_8,8,1,GEOMETRY,1,0,1,0,0,1944.517637,1930.951081,1976.150833,1915.448512 -UL2_9,9,1,GEOMETRY,1,0,1,0,0,1976.150833,1915.448512,2008.246923,1897.796075 -UL2_10,10,1,GEOMETRY,1,0,1,0,1,2008.246923,1897.796075,2037.918359,1881.625600 -UL3_1,1,1,GEOMETRY,1,1,1,0,0,633.140086,2120.663545,831.814701,2091.737797 -UL3_2,2,1,GEOMETRY,1,1,1,0,0,878.893221,2098.646563,1861.404040,2089.400325 -UL3_3,3,1,GEOMETRY,1,0,1,0,0,1861.404040,2089.400325,2017.419596,2090.046509 -UL3_5,5,1,GEOMETRY,1,0,1,0,0,2082.236933,2070.328821,2282.772670,1950.214639 -UL3_6,6,1,GEOMETRY,1,0,1,0,0,2282.772670,1950.214639,2315.361086,1932.846138 -UL3_7,7,1,GEOMETRY,1,0,1,0,0,2315.361086,1932.846138,2348.664717,1919.645834 -UL3_8,8,1,GEOMETRY,1,0,1,0,0,2348.664717,1919.645834,2378.129323,1897.913034 -UL3_9,9,1,GEOMETRY,1,0,1,0,1,2378.129323,1897.913034,2408.907201,1881.035163 -UL4_3,3,1,GEOMETRY,1,1,1,0,0,552.788849,2350.626783,905.700382,2315.449436 -UL4_4,4,1,GEOMETRY,1,1,1,0,0,905.700382,2315.449436,1712.101194,2313.812375 -UL4_5,5,1,GEOMETRY,1,0,1,0,0,1712.101194,2313.812375,1819.964891,2317.864418 -UL4_6,6,1,GEOMETRY,1,0,1,0,0,1819.964891,2317.864418,1856.812083,2304.600063 -UL4_7,7,1,GEOMETRY,1,0,1,0,0,1856.812083,2304.600063,1892.551907,2306.435269 -UL4_8,8,1,GEOMETRY,1,0,1,0,0,1892.551907,2306.435269,1928.981908,2306.047462 -UL4_9,9,1,GEOMETRY,1,0,1,0,0,1928.981908,2306.047462,1965.024016,2306.234051 -UL4_10,10,1,GEOMETRY,1,1,1,0,0,2001.418905,2307.809246,2557.362372,2308.264495 -UL4_11,11,1,GEOMETRY,1,0,1,0,0,2557.362372,2308.264495,2718.741165,2320.506810 -UL4_12,12,1,GEOMETRY,1,0,1,0,0,2718.741165,2320.506810,2815.749256,2323.832156 -UL4_13,13,1,GEOMETRY,1,0,1,0,0,2815.749256,2323.832156,2914.786899,2322.882657 -UL4_14,14,1,GEOMETRY,1,0,1,1,1,2925.448433,2318.555436,3138.255794,2321.951658 -UL5_3,3,1,GEOMETRY,1,1,1,0,0,546.894209,2453.798891,903.442508,2479.527764 -UL5_4,4,1,GEOMETRY,1,1,1,0,0,903.442508,2479.527764,1691.840905,2484.924653 -UL5_5,5,1,GEOMETRY,1,0,1,0,0,1691.840905,2484.924653,1789.119716,2480.254441 -UL5_7,7,1,GEOMETRY,1,0,1,0,0,1854.915951,2464.288039,1913.811244,2428.171974 -UL5_8,8,1,GEOMETRY,1,0,1,0,0,1913.811244,2428.171974,1946.027358,2411.078652 -UL5_9,9,1,GEOMETRY,1,0,1,0,0,1946.027358,2411.078652,1976.288196,2392.094872 -UL5_10,10,1,GEOMETRY,1,0,1,0,1,1976.288196,2392.094872,2008.055527,2375.211118 -UL6_1,1,1,GEOMETRY,1,1,1,0,0,633.808413,2684.658977,830.713568,2651.384227 -UL6_2,2,1,GEOMETRY,1,1,1,0,0,889.155446,2663.081118,1706.522553,2653.949825 -UL6_3,3,1,GEOMETRY,1,0,1,0,0,1706.522553,2653.949825,1811.247017,2651.041122 -UL6_5,5,1,GEOMETRY,1,0,1,0,0,1876.189950,2633.114258,2190.222142,2447.433453 -UL6_6,6,1,GEOMETRY,1,0,1,0,0,2190.222142,2447.433453,2221.929865,2428.342256 -UL6_7,7,1,GEOMETRY,1,0,1,0,0,2221.929865,2428.342256,2254.419133,2412.811656 -UL6_8,8,1,GEOMETRY,1,0,1,0,0,2254.419133,2412.811656,2285.596047,2394.811656 -UL6_9,9,1,GEOMETRY,1,0,1,0,1,2285.596047,2394.811656,2315.906936,2377.311656 -UL2_6,6,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, -UL3_4,4,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, -PS1_1,1,0,VFD_ONLY_BEFORE_GEOM_END,0,1,1,0,0,,,, -PS2_4,4,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, -PS1_3,3,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, -PS2_1,1,0,VFD_ONLY_BEFORE_GEOM_END,0,1,1,0,0,,,, -UL5_6,6,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, -UL2_11,11,0,VFD_ONLY_LAST_MAY_MERGE,0,0,1,1,0,,,, -UL3_10,10,0,VFD_ONLY_LAST_MAY_MERGE,0,0,1,1,0,,,, -UL5_11,11,0,VFD_ONLY_LAST_MAY_MERGE,0,0,1,1,0,,,, -UL6_4,4,0,VFD_ONLY_BEFORE_GEOM_END,0,0,1,0,0,,,, -UL6_10,10,0,VFD_ONLY_LAST_MAY_MERGE,0,0,1,1,0,,,, diff --git a/generate_csv.lsp b/generate_csv.lsp index be3fc27..f334800 100644 --- a/generate_csv.lsp +++ b/generate_csv.lsp @@ -42,6 +42,29 @@ (append parts (list cur)) ) +(defun getDynPropVal (blk propName / props p n raw v) + (setq propName (strcase propName)) + (setq v nil) + + (if (= :vlax-true (vla-get-isdynamicblock blk)) + (progn + (setq props (vlax-invoke blk 'GetDynamicBlockProperties)) + (foreach p props + (setq n (strcase (vla-get-propertyname p))) + (if (= n propName) + (progn + (setq raw (vlax-variant-value (vla-get-value p))) + (if (numberp raw) (setq v raw)) + ) + ) + ) + ) + ) + v +) + + + (defun parse-ptag1-anchor (ptag / s parts prefix section third kind idx) (setq s (strcase (vl-string-trim " " ptag))) (if (and s (vl-string-search "_" s)) @@ -96,6 +119,23 @@ nil))) ) +(defun PI () (* 4.0 (atan 1.0))) + +(defun rad->deg (r) + (* r (/ 180.0 (PI))) +) + +(defun tpe-rot-deg (raw / v) + ;; raw may already be degrees in some blocks, or radians in others. + ;; Heuristic: if abs(v) <= ~2π it's radians, else it's degrees. + (setq v raw) + (if (and (numberp v) (<= (abs v) (* 2.0 (PI)))) + (rad->deg v) + v + ) +) + + (defun dist2d (p q / dx dy) (setq dx (- (car p) (car q))) (setq dy (- (cadr p) (cadr q))) @@ -167,6 +207,12 @@ (progn (setq attList (vlax-invoke blk 'GetAttributes)) (setq ptag (getAttVal attList "P_TAG1")) + ;; >>> ADDED: TPE-specific dynamic properties (Custom section) + (setq tpeRotRaw (getDynPropValNum blk "PE ROTATION")) ; numeric + (setq tpeRot (tpe-rot-deg tpeRotRaw)) + (setq tpeDist (getDynPropVal blk "Distance1")) + + (setq parsed (parse-ptag1-anchor ptag)) (if parsed @@ -183,7 +229,7 @@ (setq xy (list (car insPt) (cadr insPt))) (setq entries (cdr (assoc key tpeMap))) (if (not entries) (setq entries '())) - (setq entries (cons (list idx xy) entries)) + (setq entries (cons (list idx xy ptag tpeRot tpeDist) entries)) (setq tpeMap (if (assoc key tpeMap) (subst (cons key entries) (assoc key tpeMap) tpeMap) @@ -323,13 +369,27 @@ ) ;; --- 3) Write CSV --- - (setq outPath (getfiled "Save conveyors CSV" - (strcat (getvar "DWGPREFIX") "conveyors.csv") - "csv" 1)) + (setq outPath + (getfiled + "Save conveyors CSV" + (strcat + (getvar "DWGPREFIX") + (vl-filename-base (getvar "DWGNAME")) + ".csv" + ) + "csv" + 1 + ) + ) + (if outPath (progn (setq fh (open outPath "w")) - (write-line "conveyor_key,sec,included,reason,has_tpe,has_epc,has_vfd,is_last_any,is_last_geom,start_x,start_y,end_x,end_y" fh) + ;; >>> ADDED: record_type + TPE columns + (write-line + "record_type,conveyor_key,sec,included,reason,has_tpe,has_epc,has_vfd,is_last_any,is_last_geom,start_x,start_y,end_x,end_y,tpe_name,tpe_x,tpe_y,tpe_rotation,tpe_distance" + fh) + ;; --- 3A) Geometry conveyors (included=1) --- (foreach kv chainMap @@ -393,9 +453,9 @@ (setq isLastAny (if (= secNum maxAny) 1 0)) (setq isLastGeom (if (= secNum maxGeom) 1 0)) (setq reason "GEOMETRY") - (write-line (strcat + "CONVEYOR," ;; >>> ADDED key "," (itoa secNum) "," (itoa included) "," reason "," (itoa hasT) "," (itoa hasE) "," (itoa hasV) "," @@ -405,6 +465,7 @@ ) fh ) + ) ) @@ -444,6 +505,7 @@ (write-line (strcat + "CONVEYOR," ;; >>> ADDED key "," (itoa secNum) "," (itoa included) "," reason "," (itoa hasT) "," (itoa hasE) "," (itoa hasV) "," @@ -451,9 +513,48 @@ ) fh ) + ) ) ) + + ;; ============================================================ + ;; 3C) TPE records + ;; ============================================================ + ;; record_type = TPE + ;; sec column intentionally left EMPTY + ;; ============================================================ + + (foreach kv tpeMap + (setq key (car kv)) + + (foreach it (cdr kv) + (setq idx (nth 0 it)) + (setq xy (nth 1 it)) + (setq tpeName (nth 2 it)) + (setq tpeRot (nth 3 it)) + (setq tpeDist (nth 4 it)) + + (write-line + (strcat + "TPE," ;; record_type + key "," ;; conveyor_key + "," ;; sec (INTENTIONALLY EMPTY) + ",,,,,,,," ;; conveyor-only fields + "," "," "," ;; start_x,start_y,end_x,end_y empty + tpeName "," ;; tpe_name + (rtos (car xy) 2 6) "," + (rtos (cadr xy) 2 6) "," + (rtos (tpe-rot-deg tpeRot) 2 6) "," ;; tpe_rotation + (if tpeDist (rtos tpeDist 2 6) "") ;; tpe_distance + + ) + fh + ) + ) + ) + + (close fh) (princ (strcat "\nExported conveyors to: " outPath)) diff --git a/generate_scene.py b/generate_scene.py index 8d08cd4..c4dfe72 100644 --- a/generate_scene.py +++ b/generate_scene.py @@ -2,39 +2,76 @@ import csv import math from pathlib import Path +# ----------------------- +# AUTO CSV DISCOVERY +# ----------------------- +SCRIPT_DIR = Path(__file__).resolve().parent +csv_files = list(SCRIPT_DIR.glob("*.csv")) + +if len(csv_files) == 0: + raise RuntimeError("No CSV file found in script directory.") +if len(csv_files) > 1: + raise RuntimeError( + "Multiple CSV files found. Please keep only ONE CSV in the folder:\n" + + "\n".join(f.name for f in csv_files) + ) + +CSV_PATH = csv_files[0] +OUT_TSCN = CSV_PATH.with_suffix(".tscn") + +print(f"Using CSV: {CSV_PATH.name}") +print(f"Generating scene: {OUT_TSCN.name}") + # ----------------------- # CONFIG # ----------------------- -CSV_PATH = "conveyors.csv" -OUT_TSCN = "generated_conveyors.tscn" - SCALE = 0.0254 FIXED_Y = 2.5 STRAIGHT_BELT_ID = "3_38ygf" CURVED_BELT_ID = "1_ef28r" -# Spur / curve tuning -SPUR_TANGENT_NUDGE = 0.0 MIN_CURVE_DEG = 1.0 +MIN_REAL_ROT_DEG = 5.0 # Geometry (must match asset) -CURVE_INNER_RADIUS = 1.815 -BELT_WIDTH = 1.524 +CURVE_INNER_RADIUS = 0.5 +BELT_WIDTH_DEFAULT = 1.524 # default size.z +DEGEN_EPS = 0.001 # meters (true zero-length) + +# Gap stitching tolerance +EPS = 0.05 # meters + +# Straight-run “de-jitter” (alignment) pass +STRAIGHTEN_RUNS = True +STRAIGHTEN_MAX_DEV_DEG = 2.0 # if a "straight run" deviates more than this, skip straightening that run + +# Optional width columns (if you add them to CSV later) +# - *_m assumed meters +# - *_in assumed inches -> meters via SCALE +WIDTH_COLS = [ + ("belt_width_m", 1.0), + ("width_m", 1.0), + ("belt_width_in", SCALE), + ("width_in", SCALE), + ("belt_width", SCALE), # treat as inches by default + ("width", SCALE), +] # ----------------------- # HELPERS # ----------------------- +def rot_deg(rot_y): + return abs(rot_y * 180.0 / math.pi) + def transform_from_points(x1, y1, x2, y2): dx = x2 - x1 dy = y2 - y1 length = math.hypot(dx, dy) * SCALE - mid_x = (x1 + x2) / 2 * SCALE - mid_z = -(y1 + y2) / 2 * SCALE # AutoCAD Y → Godot -Z - - rot_y = math.atan2(-dy, dx) + mid_z = -(y1 + y2) / 2 * SCALE + rot_y = math.atan2(-dy, dx) # AutoCAD +Y becomes Godot -Z return { "length": length, @@ -62,23 +99,17 @@ def unit_fwd(rot_y): def unit_right(rot_y): return -math.sin(rot_y), math.cos(rot_y) -def end_point(conv): - dx, dz = unit_fwd(conv["rot_y"]) - half = conv["length"] / 2 - return ( - conv["pos"][0] + dx * half, - conv["pos"][2] + dz * half - ) - def start_point(conv): dx, dz = unit_fwd(conv["rot_y"]) half = conv["length"] / 2 - return ( - conv["pos"][0] - dx * half, - conv["pos"][2] - dz * half - ) + return (conv["pos"][0] - dx * half, conv["pos"][2] - dz * half) -def add_straight_node(lines, name, rot_y, cx, cz, length): +def end_point(conv): + dx, dz = unit_fwd(conv["rot_y"]) + half = conv["length"] / 2 + return (conv["pos"][0] + dx * half, conv["pos"][2] + dz * half) + +def add_straight_node(lines, name, rot_y, cx, cz, length, width): t = transform3d(rot_y, cx, FIXED_Y, cz) lines.append(f'[node name="{name}" parent="." instance=ExtResource("{STRAIGHT_BELT_ID}")]') lines.append(f"transform = {t}") @@ -88,7 +119,7 @@ def add_straight_node(lines, name, rot_y, cx, cz, length): lines.append("tail_end_leg_enabled = false") lines.append("enable_comms = true") lines.append(f'speed_tag_name = "{name}_OIP"') - lines.append(f"size = Vector3({length:.6f}, 0.5, 1.524)") + lines.append(f"size = Vector3({length:.6f}, 0.5, {width:.6f})") lines.append("") def add_curved_node(lines, name, rot_y, px, pz, angle_deg): @@ -101,22 +132,96 @@ def add_curved_node(lines, name, rot_y, px, pz, angle_deg): lines.append(f'speed_tag_name = "{name}_OIP"') lines.append("") +def angle_between_fwd(a_fwd, b_fwd): + ax, az = a_fwd + bx, bz = b_fwd + cross = ax * bz - az * bx + dot = ax * bx + az * bz + return abs(math.atan2(cross, dot)) + +def rebuild_from_start_end(conv, sx, sz, ex, ez): + length = math.hypot(ex - sx, ez - sz) + + cx = (sx + ex) / 2 + cz = (sz + ez) / 2 + rot_y = math.atan2(ez - sz, ex - sx) + + conv["length"] = length + conv["pos"] = (cx, FIXED_Y, cz) + conv["rot_y"] = rot_y + conv["start"] = (sx, sz) + conv["end"] = (ex, ez) + conv["fwd"] = unit_fwd(rot_y) + +def unit_from_to(ax, az, bx, bz): + dx = bx - ax + dz = bz - az + d = math.hypot(dx, dz) + if d <= 0.0: + return (0.0, 0.0), 0.0 + return (dx / d, dz / d), d + +def get_width_from_row(row): + for col, mul in WIDTH_COLS: + if col in row: + v = str(row[col]).strip() + if v != "": + try: + return float(v) * mul + except ValueError: + pass + return BELT_WIDTH_DEFAULT + +def best_fit_dir(points): + # PCA in 2D: angle = 0.5 * atan2(2*Sxz, Sxx - Szz) + if len(points) < 2: + return (1.0, 0.0) + + mx = sum(x for x, _ in points) / len(points) + mz = sum(z for _, z in points) / len(points) + + sxx = szz = sxz = 0.0 + for x, z in points: + dx = x - mx + dz = z - mz + sxx += dx * dx + szz += dz * dz + sxz += dx * dz + + if sxx == 0.0 and szz == 0.0 and sxz == 0.0: + return (1.0, 0.0) + + ang = 0.5 * math.atan2(2.0 * sxz, (sxx - szz)) + return (math.cos(ang), math.sin(ang)) + +def project_to_line(origin, direction, p): + ox, oz = origin + dx, dz = direction + px, pz = p + t = (px - ox) * dx + (pz - oz) * dz + return (ox + dx * t, oz + dz * t) + # ----------------------- # READ CSV # ----------------------- -straight = {} -vfd_only = [] # included=0 candidates (some will become spurs, others will be chain-continued) +straight = {} # geometry + chain-continued + promoted inline gaps +vfd_only = [] # included=0 with open(CSV_PATH, newline="") as f: reader = csv.DictReader(f) for row in reader: - key = row["conveyor_key"].strip() - included = row["included"].strip() + # ----------------------- + # NEW: only process conveyor rows + # ----------------------- + if row.get("record_type", "CONVEYOR") != "CONVEYOR": + continue + key = row["conveyor_key"].strip() + included = str(row["included"]).strip() prefix, sec = parse_key(key) if included == "1": - if not all(row[c].strip() for c in ("start_x", "start_y", "end_x", "end_y")): + if not all(str(row.get(c, "")).strip() for c in ("start_x", "start_y", "end_x", "end_y")): continue conv = transform_from_points( @@ -125,21 +230,234 @@ with open(CSV_PATH, newline="") as f: float(row["end_x"]), float(row["end_y"]) ) - conv["name"] = key conv["prefix"] = prefix conv["sec"] = sec - + conv["width"] = get_width_from_row(row) straight[key] = conv else: vfd_only.append({"name": key, "prefix": prefix, "sec": sec}) -# Precompute endpoints & directions for geometry straights +# Precompute geometry data for c in straight.values(): c["start"] = start_point(c) c["end"] = end_point(c) c["fwd"] = unit_fwd(c["rot_y"]) +# ----------------------- +# 1.5) Extend geometry-to-geometry gaps (degenerate-aware) +# ----------------------- +by_prefix = {} +for c in straight.values(): + sx, sz = c["start"] + ex, ez = c["end"] + c["degenerate"] = (math.hypot(ex - sx, ez - sz) <= DEGEN_EPS) + + # For degenerate belts, start=end is the anchor location + c["anchor"] = c["start"] + + by_prefix.setdefault(c["prefix"], []).append(c) + +for prefix, items in by_prefix.items(): + items.sort(key=lambda x: x["sec"]) + + i = 0 + while i < len(items) - 1: + a = items[i] + b = items[i + 1] + + # ------------------------------- + # CASE 1: b is degenerate + # First try: rebuild b from a.end -> b.anchor + # ------------------------------- + if b["degenerate"]: + ax, az = a["end"] + bx, bz = b["anchor"] + + to_vec, dist = unit_from_to(ax, az, bx, bz) + if dist > EPS: + if angle_between_fwd(a["fwd"], to_vec) <= math.radians(MIN_CURVE_DEG): + rebuild_from_start_end(b, ax, az, bx, bz) + b["degenerate"] = (b["length"] <= DEGEN_EPS) + i += 1 + continue + + # Fallback: a.end -> next non-degenerate start + j = i + 2 + while j < len(items) and items[j]["degenerate"]: + j += 1 + + if j < len(items): + c = items[j] + if angle_between_fwd(a["fwd"], c["fwd"]) <= math.radians(MIN_CURVE_DEG): + sx, sz = a["end"] + ex, ez = c["start"] + span = math.hypot(ex - sx, ez - sz) + if span > EPS: + rebuild_from_start_end(b, sx, sz, ex, ez) + b["degenerate"] = (b["length"] <= DEGEN_EPS) + + i += 1 + continue + + # ------------------------------- + # CASE 2: normal gap extension + # extend a → b.start + # ------------------------------- + if angle_between_fwd(a["fwd"], b["fwd"]) > math.radians(MIN_CURVE_DEG): + i += 1 + continue # real turn + + dx = b["start"][0] - a["end"][0] + dz = b["start"][1] - a["end"][1] + gap = math.hypot(dx, dz) + + if gap <= EPS: + i += 1 + continue # already touching + + sx, sz = a["start"] + ex, ez = b["start"] + + rebuild_from_start_end(a, sx, sz, ex, ez) + a["degenerate"] = (a["length"] <= DEGEN_EPS) + + i += 1 + +# Normalize flags +for c in straight.values(): + c["degenerate"] = (c["length"] <= DEGEN_EPS) + +# ----------------------- +# 1) Chain-continue VFD-only straights (NO rendering yet) +# ----------------------- +placed_chain = set() +made_progress = True + +while made_progress: + made_progress = False + + for item in vfd_only: + name = item["name"] + if name in straight or name in placed_chain: + continue + + prefix = item["prefix"] + sec = item["sec"] + prev_key = f"{prefix}_{sec-1}" + next_key = f"{prefix}_{sec+1}" + + if prev_key in straight and next_key not in straight: + ref = straight[prev_key] + dx, dz = ref["fwd"] + length = ref["length"] + + sx, sz = ref["end"] + ex, ez = sx + dx * length, sz + dz * length + cx, cz = sx + dx * length / 2, sz + dz * length / 2 + + straight[name] = { + "name": name, + "prefix": prefix, + "sec": sec, + "length": length, + "pos": (cx, FIXED_Y, cz), + "rot_y": ref["rot_y"], + "start": (sx, sz), + "end": (ex, ez), + "fwd": (dx, dz), + "degenerate": (length <= DEGEN_EPS), + "anchor": (sx, sz), + "width": ref.get("width", BELT_WIDTH_DEFAULT), + } + placed_chain.add(name) + made_progress = True + continue + + if next_key in straight and prev_key not in straight: + ref = straight[next_key] + dx, dz = ref["fwd"] + length = ref["length"] + + ex, ez = ref["start"] + sx, sz = ex - dx * length, ez - dz * length + cx, cz = sx + dx * length / 2, sz + dz * length / 2 + + straight[name] = { + "name": name, + "prefix": prefix, + "sec": sec, + "length": length, + "pos": (cx, FIXED_Y, cz), + "rot_y": ref["rot_y"], + "start": (sx, sz), + "end": (ex, ez), + "fwd": (dx, dz), + "degenerate": (length <= DEGEN_EPS), + "anchor": (sx, sz), + "width": ref.get("width", BELT_WIDTH_DEFAULT), + } + placed_chain.add(name) + made_progress = True + continue + +# ----------------------- +# 1.75) Straight-run de-jitter (fix tiny rotations from noisy points) +# ----------------------- +if STRAIGHTEN_RUNS: + by_prefix2 = {} + for c in straight.values(): + by_prefix2.setdefault(c["prefix"], []).append(c) + + for prefix, items in by_prefix2.items(): + items.sort(key=lambda x: x["sec"]) + run_start = 0 + + while run_start < len(items): + run_end = run_start + while run_end + 1 < len(items): + a = items[run_end] + b = items[run_end + 1] + if angle_between_fwd(a["fwd"], b["fwd"]) > math.radians(MIN_CURVE_DEG): + break + run_end += 1 + + # Run is items[run_start : run_end+1] + if run_end - run_start >= 1: + run = items[run_start:run_end + 1] + + # Nodes: start of first, then each end + nodes = [run[0]["start"]] + [seg["end"] for seg in run] + + # Fit direction + d = best_fit_dir(nodes) + + # Orient direction from first -> last + fx, fz = nodes[0] + lx, lz = nodes[-1] + if (lx - fx) * d[0] + (lz - fz) * d[1] < 0: + d = (-d[0], -d[1]) + + # If any segment in this run is way off, skip straightening this run + max_dev = 0.0 + for seg in run: + if seg["length"] > DEGEN_EPS: + max_dev = max(max_dev, angle_between_fwd(seg["fwd"], d)) + + if max_dev <= math.radians(STRAIGHTEN_MAX_DEV_DEG): + origin = nodes[0] + new_nodes = [project_to_line(origin, d, p) for p in nodes] + + # Rebuild each segment from projected nodes + for seg, p0, p1 in zip(run, new_nodes[:-1], new_nodes[1:]): + rebuild_from_start_end(seg, p0[0], p0[1], p1[0], p1[1]) + + run_start = run_end + 1 + + # Final normalize flags after straightening + for c in straight.values(): + c["degenerate"] = (c["length"] <= DEGEN_EPS) + # ----------------------- # WRITE TSCN # ----------------------- @@ -152,157 +470,126 @@ lines.append('') lines.append('[node name="GeneratedConveyors" type="Node3D"]') lines.append('') -# ----------------------- -# 1) Geometry straight conveyors (included=1) -# ----------------------- -for c in straight.values(): - cx, _, cz = c["pos"] - add_straight_node(lines, c["name"], c["rot_y"], cx, cz, c["length"]) +written_straights = set() +for name in sorted(straight.keys()): + c = straight[name] -# ----------------------- -# 2) Spur conveyors (use vfd_only list, but mark those we actually place) -# ----------------------- + # Only skip true zero-length belts + if c["length"] <= DEGEN_EPS: + continue + + cx, _, cz = c["pos"] + width = c.get("width", BELT_WIDTH_DEFAULT) + add_straight_node(lines, name, c["rot_y"], cx, cz, c["length"], width) + written_straights.add(name) + +# Spur logic (kept) placed_spurs = set() for spur in vfd_only: + name = spur["name"] + if name in straight: + continue + prefix = spur["prefix"] sec = spur["sec"] - prev_key = f"{prefix}_{sec-1}" next_key = f"{prefix}_{sec+1}" - # spur needs both neighbors with geometry (or already-added straights later, but at this stage it's fine) if prev_key not in straight or next_key not in straight: continue prev = straight[prev_key] - nxt = straight[next_key] + nxt = straight[next_key] pfx, pfz = prev["fwd"] nfx, nfz = nxt["fwd"] cross = pfx * nfz - pfz * nfx - dot = pfx * nfx + pfz * nfz + dot = pfx * nfx + pfz * nfz delta = math.atan2(cross, dot) angle_deg = abs(delta) * 180.0 / math.pi if angle_deg < MIN_CURVE_DEG: continue - turn_sign = 1.0 if delta > 0 else -1.0 + prev_rot_deg = rot_deg(prev["rot_y"]) + next_rot_deg = rot_deg(nxt["rot_y"]) + # Inline gap (render straight) + if prev_rot_deg < MIN_REAL_ROT_DEG and next_rot_deg < MIN_REAL_ROT_DEG: + sx, sz = prev["end"] + ex, ez = nxt["start"] + + dx = ex - sx + dz = ez - sz + length = math.hypot(dx, dz) + if length < 0.01: + continue + + cx = (sx + ex) / 2 + cz = (sz + ez) / 2 + rot_y = math.atan2(dz, dx) + + width = prev.get("width", BELT_WIDTH_DEFAULT) + + straight[name] = { + "name": name, + "prefix": prefix, + "sec": sec, + "length": length, + "pos": (cx, FIXED_Y, cz), + "rot_y": rot_y, + "start": (sx, sz), + "end": (ex, ez), + "fwd": unit_fwd(rot_y), + "degenerate": (length <= DEGEN_EPS), + "anchor": (sx, sz), + "width": width, + } + + if name not in written_straights and length > DEGEN_EPS: + add_straight_node(lines, name, rot_y, cx, cz, length, width) + written_straights.add(name) + + continue + + # Curved spur placement uses width of prev belt for edge offset + turn_sign = 1.0 if delta > 0 else -1.0 rx, rz = unit_right(prev["rot_y"]) end_x, end_z = prev["end"] - # place along side edge then inward by inner radius (your current spur logic) - edge_x = end_x + rx * (BELT_WIDTH / 2) * turn_sign - edge_z = end_z + rz * (BELT_WIDTH / 2) * turn_sign + prev_width = prev.get("width", BELT_WIDTH_DEFAULT) + edge_x = end_x + rx * (prev_width / 2) * turn_sign + edge_z = end_z + rz * (prev_width / 2) * turn_sign inward_x = -rx * turn_sign inward_z = -rz * turn_sign - place_x = edge_x + inward_x * CURVE_INNER_RADIUS + pfx * SPUR_TANGENT_NUDGE - place_z = edge_z + inward_z * CURVE_INNER_RADIUS + pfz * SPUR_TANGENT_NUDGE + place_x = edge_x + inward_x * CURVE_INNER_RADIUS + place_z = edge_z + inward_z * CURVE_INNER_RADIUS - add_curved_node(lines, spur["name"], prev["rot_y"], place_x, place_z, angle_deg) - placed_spurs.add(spur["name"]) - -# ----------------------- -# 3) VFD-only straight conveyors (CHAIN CONTINUATION) -# Run AFTER spurs. Only place leftovers (not in placed_spurs). -# Also: after we place one, add it to "straight" so multiple missing sections can chain. -# ----------------------- -# Build quick lookup for vfd_only rows by key -vfd_by_key = {s["name"]: s for s in vfd_only} - -placed_chain = set() - -made_progress = True -while made_progress: - made_progress = False - - for spur in vfd_only: - name = spur["name"] - if name in placed_spurs or name in placed_chain: - continue - if name in straight: - continue - - prefix = spur["prefix"] - sec = spur["sec"] - prev_key = f"{prefix}_{sec-1}" - next_key = f"{prefix}_{sec+1}" - - # --- Case A: place AFTER previous (if previous exists, next does NOT exist/placed) --- - if prev_key in straight and next_key not in straight: - ref = straight[prev_key] - dx, dz = ref["fwd"] - length = ref["length"] - - # start at previous end, same direction, same length - sx, sz = ref["end"] - ex, ez = (sx + dx * length, sz + dz * length) - cx, cz = (sx + dx * (length / 2), sz + dz * (length / 2)) - - add_straight_node(lines, name, ref["rot_y"], cx, cz, length) - - # register as a new straight so the chain can continue - newc = { - "name": name, - "prefix": prefix, - "sec": sec, - "length": length, - "pos": (cx, FIXED_Y, cz), - "rot_y": ref["rot_y"], - } - newc["start"] = (sx, sz) - newc["end"] = (ex, ez) - newc["fwd"] = (dx, dz) - - straight[name] = newc - placed_chain.add(name) - made_progress = True - continue - - # --- Case B: place BEFORE next (if next exists, prev does NOT exist/placed) --- - if next_key in straight and prev_key not in straight: - ref = straight[next_key] - dx, dz = ref["fwd"] - length = ref["length"] - - # end at next start, same direction, same length (going backwards) - ex, ez = ref["start"] - sx, sz = (ex - dx * length, ez - dz * length) - cx, cz = (sx + dx * (length / 2), sz + dz * (length / 2)) - - add_straight_node(lines, name, ref["rot_y"], cx, cz, length) - - newc = { - "name": name, - "prefix": prefix, - "sec": sec, - "length": length, - "pos": (cx, FIXED_Y, cz), - "rot_y": ref["rot_y"], - } - newc["start"] = (sx, sz) - newc["end"] = (ex, ez) - newc["fwd"] = (dx, dz) - - straight[name] = newc - placed_chain.add(name) - made_progress = True - continue + add_curved_node(lines, name, prev["rot_y"], place_x, place_z, angle_deg) + placed_spurs.add(name) # ----------------------- # WRITE FILE # ----------------------- -Path(OUT_TSCN).write_text("\n".join(lines), encoding="utf-8") +OUT_TSCN.write_text("\n".join(lines), encoding="utf-8") + +leftovers = [v["name"] for v in vfd_only if v["name"] not in placed_spurs and v["name"] not in straight] + +geom_written = len([k for k, c in straight.items() if c["length"] > DEGEN_EPS]) +geom_degen = [k for k, c in straight.items() if c["length"] <= DEGEN_EPS] -leftovers = [s["name"] for s in vfd_only if s["name"] not in placed_spurs and s["name"] not in placed_chain] print( - f"Generated {len([k for k in straight.keys() if k not in vfd_by_key])} geometry straights, " - f"{len(placed_spurs)} spurs, " - f"{len(placed_chain)} chain-continued VFD-only straights. " - f"Leftovers not placed: {len(leftovers)}" + f"Geometry written: {geom_written - len(placed_chain)}, " + f"chain-continued straights: {len(placed_chain)}, " + f"spurs placed: {len(placed_spurs)}, " + f"leftovers: {len(leftovers)}" ) +if leftovers: + print("Leftovers:", ", ".join(leftovers)) + +if geom_degen: + print("Still degenerate geometry (NOT written):", ", ".join(sorted(geom_degen))) diff --git a/generated_conveyors.tscn b/generated_conveyors.tscn deleted file mode 100644 index 257369a..0000000 --- a/generated_conveyors.tscn +++ /dev/null @@ -1,718 +0,0 @@ -[gd_scene load_steps=3 format=3] - -[ext_resource type="PackedScene" path="res://parts/assemblies/BeltConveyorAssembly.tscn" id="3_38ygf"] -[ext_resource type="PackedScene" path="res://parts/assemblies/CurvedBeltConveyorAssembly.tscn" id="1_ef28r"] - -[node name="GeneratedConveyors" type="Node3D"] - -[node name="PS1_2" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8675449395504647, 0, -0.49735880193315224, 0, 1, 0, 0.49735880193315224, 0, 0.8675449395504647, 82.4197516448, 2.5, -43.5774700712) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "PS1_2_OIP" -size = Vector3(3.674933, 0.5, 1.524) - -[node name="PS1_4" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999945161112113, 0, 0.003311758974397826, 0, 1, 0, -0.003311758974397826, 0, 0.9999945161112113, 92.824505613, 2.5, -42.083169872099994) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "PS1_4_OIP" -size = Vector3(14.050436, 0.5, 1.524) - -[node name="PS1_5" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999946142179093, 0, -0.0032820017024387353, 0, 1, 0, 0.0032820017024387353, 0, 0.9999946142179093, 104.0575431926, 2.5, -42.0926254285) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "PS1_5_OIP" -size = Vector3(8.415762, 0.5, 1.524) - -[node name="PS2_2" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8773678141674687, 0, -0.479818422596505, 0, 1, 0, 0.479818422596505, 0, 0.8773678141674687, 79.250984881, 2.5, -56.7520455127) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "PS2_2_OIP" -size = Vector3(1.173861, 0.5, 1.524) - -[node name="PS2_3" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8622787824202933, 0, -0.5064339062382932, 0, 1, 0, 0.5064339062382932, 0, 0.8622787824202933, 85.4597349349, 2.5, -53.1263429089) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "PS2_3_OIP" -size = Vector3(13.206393, 0.5, 1.524) - -[node name="PS2_5" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999759795503059, 0, -0.006931112638399028, 0, 1, 0, 0.006931112638399028, 0, 0.9999759795503059, 99.8027176535, 2.5, -49.276580961499995) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "PS2_5_OIP" -size = Vector3(13.650118, 0.5, 1.524) - -[node name="PS2_6" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999803192739637, 0, 0.006273839712780541, 0, 1, 0, -0.006273839712780541, 0, 0.9999803192739637, 107.41107807809999, 2.5, -49.2341911428) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "PS2_6_OIP" -size = Vector3(1.566962, 0.5, 1.524) - -[node name="UL1_3" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9950139648061078, 0, -0.0997356999315168, 0, 1, 0, 0.0997356999315168, 0, 0.9950139648061078, 18.4156816725, 2.5, -46.4381813678) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL1_3_OIP" -size = Vector3(9.074236, 0.5, 1.524) - -[node name="UL1_4" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999999573785687, 0, -0.0002919638005547997, 0, 1, 0, 0.0002919638005547997, 0, 0.9999999573785687, 33.4554759388, 2.5, -45.9825957283) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL1_4_OIP" -size = Vector3(21.050598, 0.5, 1.524) - -[node name="UL1_5" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.999952493743362, 0, -0.009747320474448184, 0, 1, 0, 0.009747320474448184, 0, 0.999952493743362, 45.3485810578, 2.5, -45.9661896397) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL1_5_OIP" -size = Vector3(2.735743, 0.5, 1.524) - -[node name="UL1_6" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9994889246433396, 0, -0.03196700666782072, 0, 1, 0, 0.03196700666782072, 0, 0.9994889246433396, 47.1915584615, 2.5, -45.9376590008) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL1_6_OIP" -size = Vector3(0.950828, 0.5, 1.524) - -[node name="UL1_7" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999987708307951, 0, 0.0015679084472148372, 0, 1, 0, -0.0015679084472148372, 0, 0.9999987708307951, 48.121889951099995, 2.5, -45.923175095299996) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL1_7_OIP" -size = Vector3(0.910322, 0.5, 1.524) - -[node name="UL1_8" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9994123906802922, 0, -0.03427642564070694, 0, 1, 0, 0.03427642564070694, 0, 0.9994123906802922, 49.035076427999996, 2.5, -45.908180027499995) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL1_8_OIP" -size = Vector3(0.916590, 0.5, 1.524) - -[node name="UL1_9" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9967002282899721, 0, 0.08117052991521904, 0, 1, 0, -0.08117052991521904, 0, 0.9967002282899721, 49.9582364943, 2.5, -45.930351497) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL1_9_OIP" -size = Vector3(0.933348, 0.5, 1.524) - -[node name="UL1_10" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.999997311695526, 0, -0.0023187500342096348, 0, 1, 0, 0.0023187500342096348, 0, 0.999997311695526, 59.20612194819999, 2.5, -45.9948076419) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL1_10_OIP" -size = Vector3(15.752119, 0.5, 1.524) - -[node name="UL1_11" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.999987533426502, 0, 0.004993294661893442, 0, 1, 0, -0.004993294661893442, 0, 0.999987533426502, 69.14804775900001, 2.5, -45.9868607439) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL1_11_OIP" -size = Vector3(4.131827, 0.5, 1.524) - -[node name="UL1_12" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9869995429660313, 0, 0.1607230605260031, 0, 1, 0, -0.1607230605260031, 0, 0.9869995429660313, 72.3586082162, 2.5, -46.183575031699995) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL1_12_OIP" -size = Vector3(2.319500, 0.5, 1.524) - -[node name="UL1_13" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9994599571489898, 0, -0.03286021995878083, 0, 1, 0, 0.03286021995878083, 0, 0.9994599571489898, 75.0818830973, 2.5, -46.318072362399995) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL1_13_OIP" -size = Vector3(3.158910, 0.5, 1.524) - -[node name="UL1_14" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9996888748277157, 0, -0.02494300594747222, 0, 1, 0, 0.02494300594747222, 0, 0.9996888748277157, 80.2158087324, 2.5, -46.3145923211) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL1_14_OIP" -size = Vector3(6.288208, 0.5, 1.524) - -[node name="UL2_3" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9952852133168667, 0, -0.09699146432959523, 0, 1, 0, 0.09699146432959523, 0, 0.9952852133168667, 18.508732134099997, 2.5, -50.6883424382) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL2_3_OIP" -size = Vector3(8.917547, 0.5, 1.524) - -[node name="UL2_4" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999995481421035, 0, -0.0009506395682917928, 0, 1, 0, 0.0009506395682917928, 0, 0.9999995481421035, 33.309920959399996, 2.5, -50.2460275494) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL2_4_OIP" -size = Vector3(20.726884, 0.5, 1.524) - -[node name="UL2_5" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999805530651744, 0, 0.006236464660995434, 0, 1, 0, -0.006236464660995434, 0, 0.9999805530651744, 44.9842473567, 2.5, -50.244351124) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL2_5_OIP" -size = Vector3(2.621829, 0.5, 1.524) - -[node name="UL2_7" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8506089942191302, 0, -0.5257987627919258, 0, 1, 0, 0.5257987627919258, 0, 0.8506089942191302, 48.8197562846, 2.5, -49.3991124919) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL2_7_OIP" -size = Vector3(1.342548, 0.5, 1.524) - -[node name="UL2_8" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8979644689927908, 0, -0.4400679634175786, 0, 1, 0, 0.4400679634175786, 0, 0.8979644689927908, 49.79248956899999, 2.5, -48.8492748311) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL2_8_OIP" -size = Vector3(0.894783, 0.5, 1.524) - -[node name="UL2_9" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8762206638502454, 0, -0.4819101039009612, 0, 1, 0, 0.4819101039009612, 0, 0.8762206638502454, 50.601851501199995, 2.5, -48.4282062549) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL2_9_OIP" -size = Vector3(0.930406, 0.5, 1.524) - -[node name="UL2_10" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8780689921649024, 0, -0.47853405834748336, 0, 1, 0, 0.47853405834748336, 0, 0.8780689921649024, 51.3862990814, 2.5, -47.998655272499995) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL2_10_OIP" -size = Vector3(0.858309, 0.5, 1.524) - -[node name="UL3_1" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9895668328462597, 0, -0.14407457558716869, 0, 1, 0, 0.14407457558716869, 0, 0.9895668328462597, 18.6049257949, 2.5, -53.49749704339999) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL3_1_OIP" -size = Vector3(5.099540, 0.5, 1.524) - -[node name="UL3_2" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999557211215563, 0, -0.009410408932047861, 0, 1, 0, 0.009410408932047861, 0, 0.9999557211215563, 34.801775214699994, 2.5, -53.1881954776) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL3_2_OIP" -size = Vector3(24.956880, 0.5, 1.524) - -[node name="UL3_3" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999914228893805, 0, 0.0041417565925802435, 0, 1, 0, -0.0041417565925802435, 0, 0.9999914228893805, 49.2610601772, 2.5, -53.0789747918) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL3_3_OIP" -size = Vector3(3.962829, 0.5, 1.524) - -[node name="UL3_5" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8578838473591786, 0, -0.5138436575848861, 0, 1, 0, 0.5138436575848861, 0, 0.8578838473591786, 55.4356219581, 2.5, -51.060901941999994) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL3_5_OIP" -size = Vector3(5.937410, 0.5, 1.524) - -[node name="UL3_6" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8824876952810232, 0, -0.47033548417867427, 0, 1, 0, 0.47033548417867427, 0, 0.8824876952810232, 58.39629870119999, 2.5, -49.3148718679) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL3_6_OIP" -size = Vector3(0.937969, 0.5, 1.524) - -[node name="UL3_7" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9296382309209145, 0, -0.36847355347464555, 0, 1, 0, 0.36847355347464555, 0, 0.9296382309209145, 59.233127698100006, 2.5, -48.9266480444) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL3_7_OIP" -size = Vector3(0.909937, 0.5, 1.524) - -[node name="UL3_8" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8047682926335156, 0, -0.5935890793905632, 0, 1, 0, 0.5935890793905632, 0, 0.8047682926335156, 60.030284308000006, 2.5, -48.4829976236) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL3_8_OIP" -size = Vector3(0.929958, 0.5, 1.524) - -[node name="UL3_9" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8768162540239772, 0, -0.4808255990266744, 0, 1, 0, 0.4808255990266744, 0, 0.8768162540239772, 60.7953638548, 2.5, -47.992642101899996) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL3_9_OIP" -size = Vector3(0.891587, 0.5, 1.524) - -[node name="UL4_3" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9950689105870448, 0, -0.09918600295965033, 0, 1, 0, 0.09918600295965033, 0, 0.9950689105870448, 18.5228132337, 2.5, -59.2591679813) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL4_3_OIP" -size = Vector3(9.008374, 0.5, 1.524) - -[node name="UL4_4" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999979393868175, 0, -0.002030079338077881, 0, 1, 0, 0.002030079338077881, 0, 0.9999979393868175, 33.24608001519999, 2.5, -58.7916249997) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL4_4_OIP" -size = Vector3(20.482623, 0.5, 1.524) - -[node name="UL4_5" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9992951314680424, 0, 0.03753984848488273, 0, 1, 0, -0.03753984848488273, 0, 0.9992951314680424, 44.8572392795, 2.5, -58.8222952711) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL4_5_OIP" -size = Vector3(2.741670, 0.5, 1.524) - -[node name="UL4_6" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9408925721778789, 0, -0.33870513373802713, 0, 1, 0, 0.33870513373802713, 0, 0.9408925721778789, 46.6950675698, 2.5, -58.705298908699994) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL4_6_OIP" -size = Vector3(0.994714, 0.5, 1.524) - -[node name="UL4_7" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9986842389497732, 0, 0.051281486652711435, 0, 1, 0, -0.051281486652711435, 0, 0.9986842389497732, 47.616922673, 2.5, -58.56014871639999) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL4_7_OIP" -size = Vector3(0.908988, 0.5, 1.524) - -[node name="UL4_8" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999433439860244, 0, -0.010644661481103306, 0, 1, 0, 0.010644661481103306, 0, 0.9999433439860244, 48.533479450499996, 2.5, -58.578530683699995) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL4_8_OIP" -size = Vector3(0.925374, 0.5, 1.524) - -[node name="UL4_9" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999865997475034, 0, 0.005176903072933443, 0, 1, 0, -0.005176903072933443, 0, 0.9999865997475034, 49.4538752348, 2.5, -58.575975215099994) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL4_9_OIP" -size = Vector3(0.915482, 0.5, 1.524) - -[node name="UL4_10" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999996647208671, 0, 0.0008188761526801148, 0, 1, 0, -0.0008188761526801148, 0, 0.9999996647208671, 57.8965222179, 2.5, -58.6241365107) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL4_10_OIP" -size = Vector3(14.120969, 0.5, 1.524) - -[node name="UL4_11" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9971349340123079, 0, 0.07564339609159712, 0, 1, 0, -0.07564339609159712, 0, 0.9971349340123079, 67.0065149199, 2.5, -58.7853955735) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL4_11_OIP" -size = Vector3(4.110799, 0.5, 1.524) - -[node name="UL4_12" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9994129903588115, 0, 0.03425893609057608, 0, 1, 0, -0.03425893609057608, 0, 0.9994129903588115, 70.2880283467, 2.5, -58.98310486819999) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL4_12_OIP" -size = Vector3(2.465453, 0.5, 1.524) - -[node name="UL4_13" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999540454520701, 0, -0.009586813028279828, 0, 1, 0, 0.009586813028279828, 0, 0.9999540454520701, 72.7778091685, 2.5, -59.0132781251) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL4_13_OIP" -size = Vector3(2.515672, 0.5, 1.524) - -[node name="UL4_14" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9998726772810103, 0, 0.01595710584362971, 0, 1, 0, -0.01595710584362971, 0, 0.9998726772810103, 77.0090436829, 2.5, -58.934440093800006) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL4_14_OIP" -size = Vector3(5.405995, 0.5, 1.524) - -[node name="UL5_3" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9974065210227826, 0, 0.0719738273348684, 0, 1, 0, -0.0719738273348684, 0, 0.9974065210227826, 18.419276305900002, 2.5, -62.65324851849999) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL5_3_OIP" -size = Vector3(9.079875, 0.5, 1.524) - -[node name="UL5_4" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999765711890427, 0, 0.006845222641044972, 0, 1, 0, -0.006845222641044972, 0, 0.9999765711890427, 32.9600993451, 2.5, -63.0485456959) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL5_4_OIP" -size = Vector3(20.025788, 0.5, 1.524) - -[node name="UL5_5" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9988495791288503, 0, -0.047953292630627475, 0, 1, 0, 0.047953292630627475, 0, 0.9988495791288503, 44.2081998867, 2.5, -63.0577744938) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL5_5_OIP" -size = Vector3(2.473728, 0.5, 1.524) - -[node name="UL5_7" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8524790224883632, 0, -0.522761433368305, 0, 1, 0, 0.522761433368305, 0, 0.8524790224883632, 47.862835376499994, 2.5, -62.1342421651) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL5_7_OIP" -size = Vector3(1.754812, 0.5, 1.524) - -[node name="UL5_8" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8833597213730209, 0, -0.4686956396807836, 0, 1, 0, 0.4686956396807836, 0, 0.8833597213730209, 49.0199502454, 2.5, -61.4584829502) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL5_8_OIP" -size = Vector3(0.926338, 0.5, 1.524) - -[node name="UL5_9" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8471068986537589, 0, -0.5314225270471795, 0, 1, 0, 0.5314225270471795, 0, 0.8471068986537589, 49.813407535799996, 2.5, -61.000303754799994) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL5_9_OIP" -size = Vector3(0.907353, 0.5, 1.524) - -[node name="UL5_10" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8830309487153603, 0, -0.4693147596345664, 0, 1, 0, 0.4693147596345664, 0, 0.8830309487153603, 50.6011652821, 2.5, -60.544786073000004) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL5_10_OIP" -size = Vector3(0.913773, 0.5, 1.524) - -[node name="UL6_1" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9860201232632386, 0, -0.16662627799944335, 0, 1, 0, 0.16662627799944335, 0, 0.9860201232632386, 18.599429158699998, 2.5, -67.76774869079999) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL6_1_OIP" -size = Vector3(5.072301, 0.5, 1.524) - -[node name="UL6_2" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9999376035906048, 0, -0.01117089635967401, 0, 1, 0, 0.01117089635967401, 0, 0.9999376035906048, 32.965110587299996, 2.5, -67.5262929761) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL6_2_OIP" -size = Vector3(20.762420, 0.5, 1.524) - -[node name="UL6_3" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9996145027501965, 0, -0.027764111573710868, 0, 1, 0, 0.027764111573710868, 0, 0.9996145027501965, 44.675673538999995, 2.5, -67.3733850269) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL6_3_OIP" -size = Vector3(2.661027, 0.5, 1.524) - -[node name="UL6_5" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8607868402171976, 0, -0.508965633131445, 0, 1, 0, 0.508965633131445, 0, 0.8607868402171976, 51.6434335684, 2.5, -64.5229559297) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL6_5_OIP" -size = Vector3(9.266426, 0.5, 1.524) - -[node name="UL6_6" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8566984744886353, 0, -0.5158175295672346, 0, 1, 0, 0.5158175295672346, 0, 0.8566984744886353, 56.034330488900004, 2.5, -61.92235150429999) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL6_6_OIP" -size = Vector3(0.940093, 0.5, 1.524) - -[node name="UL6_7" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.9022179251501843, 0, -0.43128043723045956, 0, 1, 0, 0.43128043723045956, 0, 0.9022179251501843, 56.84963227459999, 2.5, -61.482654682399996) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL6_7_OIP" -size = Vector3(0.914665, 0.5, 1.524) - -[node name="UL6_8" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.866025400060552, 0, -0.5000000064499608, 0, 1, 0, 0.5000000064499608, 0, 0.866025400060552, 57.658192786, 2.5, -61.056816062399996) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL6_8_OIP" -size = Vector3(0.914400, 0.5, 1.524) - -[node name="UL6_9" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.866025402838328, 0, -0.5000000016387117, 0, 1, 0, 0.5000000016387117, 0, 0.866025402838328, 58.439087884100005, 2.5, -60.60596606239999) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL6_9_OIP" -size = Vector3(0.889000, 0.5, 1.524) - -[node name="UL2_6" parent="." instance=ExtResource("1_ef28r")] -transform = Transform3D(0.9999805530651744, 0, 0.006236464660995434, 0, 1, 0, -0.006236464660995434, 0, 0.9999805530651744, 46.28856946991197, 2.5, -51.305506118977625) -inner_radius = 1.815 -conveyor_angle = 32.079 -enable_comms = true -speed_tag_name = "UL2_6_OIP" - -[node name="UL3_4" parent="." instance=ExtResource("1_ef28r")] -transform = Transform3D(0.9999914228893805, 0, 0.0041417565925802435, 0, 1, 0, -0.0041417565925802435, 0, 0.9999914228893805, 51.238096468708015, 2.5, -54.14017229690252) -inner_radius = 1.815 -conveyor_angle = 31.158 -enable_comms = true -speed_tag_name = "UL3_4_OIP" - -[node name="PS2_4" parent="." instance=ExtResource("1_ef28r")] -transform = Transform3D(0.8622787824202933, 0, -0.5064339062382932, 0, 1, 0, 0.5064339062382932, 0, 0.8622787824202933, 90.62025632753108, 2.5, -48.87428071991143) -inner_radius = 1.815 -conveyor_angle = 30.029 -enable_comms = true -speed_tag_name = "PS2_4_OIP" - -[node name="PS1_3" parent="." instance=ExtResource("1_ef28r")] -transform = Transform3D(0.8675449395504647, 0, -0.49735880193315224, 0, 1, 0, 0.49735880193315224, 0, 0.8675449395504647, 83.49011754776441, 2.5, -41.750065137053355) -inner_radius = 1.815 -conveyor_angle = 30.015 -enable_comms = true -speed_tag_name = "PS1_3_OIP" - -[node name="UL5_6" parent="." instance=ExtResource("1_ef28r")] -transform = Transform3D(0.9988495791288503, 0, -0.047953292630627475, 0, 1, 0, 0.047953292630627475, 0, 0.9988495791288503, 45.49413560354005, 2.5, -64.05025140822268) -inner_radius = 1.815 -conveyor_angle = 28.769 -enable_comms = true -speed_tag_name = "UL5_6_OIP" - -[node name="UL6_4" parent="." instance=ExtResource("1_ef28r")] -transform = Transform3D(0.9996145027501965, 0, -0.027764111573710868, 0, 1, 0, 0.027764111573710868, 0, 0.9996145027501965, 46.03490984128712, 2.5, -68.38903857019595) -inner_radius = 1.815 -conveyor_angle = 29.004 -enable_comms = true -speed_tag_name = "UL6_4_OIP" - -[node name="PS1_1" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8675449395504647, 0, -0.49735880193315224, 0, 1, 0, 0.49735880193315224, 0, 0.8675449395504647, 79.231582202, 2.5, -45.4052302968) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "PS1_1_OIP" -size = Vector3(3.674933, 0.5, 1.524) - -[node name="PS2_1" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8773678141674687, 0, -0.479818422596505, 0, 1, 0, 0.479818422596505, 0, 0.8773678141674687, 78.221077365, 2.5, -57.31528545810001) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "PS2_1_OIP" -size = Vector3(1.173861, 0.5, 1.524) - -[node name="UL2_11" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8780689921649024, 0, -0.47853405834748336, 0, 1, 0, 0.47853405834748336, 0, 0.8780689921649024, 52.139953555800005, 2.5, -47.5879252075) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL2_11_OIP" -size = Vector3(0.858309, 0.5, 1.524) - -[node name="UL3_10" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8768162540239772, 0, -0.4808255990266744, 0, 1, 0, 0.4808255990266744, 0, 0.8768162540239772, 61.577121956, 2.5, -47.5639441785) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL3_10_OIP" -size = Vector3(0.891587, 0.5, 1.524) - -[node name="UL5_11" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.8830309487153603, 0, -0.4693147596345664, 0, 1, 0, 0.4693147596345664, 0, 0.8830309487153603, 51.4080554895, 2.5, -60.115938721400006) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL5_11_OIP" -size = Vector3(0.913773, 0.5, 1.524) - -[node name="UL6_10" parent="." instance=ExtResource("3_38ygf")] -transform = Transform3D(0.866025402838328, 0, -0.5000000016387117, 0, 1, 0, 0.5000000016387117, 0, 0.866025402838328, 59.208984464699995, 2.5, -60.16146606239999) -right_side_guards_enabled = false -left_side_guards_enabled = false -head_end_leg_enabled = false -tail_end_leg_enabled = false -enable_comms = true -speed_tag_name = "UL6_10_OIP" -size = Vector3(0.889000, 0.5, 1.524) diff --git a/skipped_conveyors.txt b/skipped_conveyors.txt deleted file mode 100644 index 12d0ec4..0000000 --- a/skipped_conveyors.txt +++ /dev/null @@ -1,12 +0,0 @@ -UL2_6 included=0 (no geometry) -UL3_4 included=0 (no geometry) -PS1_1 included=0 (no geometry) -PS2_4 included=0 (no geometry) -PS1_3 included=0 (no geometry) -PS2_1 included=0 (no geometry) -UL5_6 included=0 (no geometry) -UL2_11 included=0 (no geometry) -UL3_10 included=0 (no geometry) -UL5_11 included=0 (no geometry) -UL6_4 included=0 (no geometry) -UL6_10 included=0 (no geometry) \ No newline at end of file