import { Factory } from "../../src/DatabaseServices/CADFactory"; import { Curve } from "../../src/DatabaseServices/Entity/Curve"; import { Polyline } from "../../src/DatabaseServices/Entity/Polyline"; import "../Utils/jest.util"; import { LoadEntityFromFileData } from "../Utils/LoadEntity.util"; Factory(Polyline); function loadFile(data) { return LoadEntityFromFileData(data) as Curve[]; } function EntityToMatchSnapshot(ens: Curve[]) { expect(ens.length).toMatchSnapshot(); for (let c of ens) { expect(c.Length).toMatchNumberSnapshot(); } } function testOffset(pl: Curve, dis: number) { let cus = pl.GetOffsetCurves(dis); EntityToMatchSnapshot(cus); } test('圆弧被压扁时', () => { let pl = loadFile( { "file": [1, "Polyline", 8, 2, 154, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 377.4539113436276, 1247.0593462341237, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 2, 6, [0, 0], 0, [19.763395114298646, 0], 0, [19.763395114298646, -77.16333081989751], 0, [620.8495708336222, 2], 0, [12.422828246409608, 2], 0.07998201834820468, [0, 0], 0, false], "basePt": { "x": 377.4539113436276, "y": 1169.8960154142262, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] } )[0] as Polyline; testOffset(pl, -1); }); //会产生一个全圆,和上面的结果差不多 test('圆弧被压扁时2', () => { let pl = loadFile( { "file": [1, "Polyline", 8, 2, 119, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1154.2238497367207, 104.14208322448218, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1154.2238497367207, 104.14208322448218, 0, 1], 0, 2, 60, [612.3014131291516, 516.3528702447977], 0.015806718902080345, [620.7943305625928, 607.0727250842237], 0.015085580217079377, [623.5388275982333, 693.9909315240145], 0.018559911555977058, [619.7184915236674, 800.899678859206], 0.014694123780868687, [611.0748359644397, 885.1634608721657], 0, [610.5937664221115, 885.5638696907919], 0.048351140222397095, [591.8736546167333, 974.856452029918], 0, [589.108411721164, 976.3352094794792], 0.12312867730767327, [549.49737942662, 1070.8379195719986], 0.17558566194791864, [493.1989814833556, 1105.1070499123898], 0, [493.1989814768517, 1106.8145087542505], 0.016687098951025527, [486.7752303851114, 1106.1799845700543], 0.016686934361763963, [480.3515429184599, 1106.814499939058], 0, [480.3515429184599, 1105.1070579994375], 0.1738513267498107, [424.462475564043, 1071.3443793295373], 0.14452030487651513, [385.51999664149616, 987.8692829759501], 0, [381.82742116645204, 985.894619916155], 0.05688790122446251, [362.1606942638914, 899.9341132066843], 0.06913430034215114, [358.36535846878064, 891.585241437522], 0.011951758276873363, [349.5455822495776, 813.8344631655293], 0.016079714858141424, [343.5599042095864, 708.741352103413], 0.012454880979067107, [343.57381445093506, 627.19890258108], 0.0353850507118894, [348.29886924626226, 547.5274109585339], 0, [347.91466794653746, 547.093379771549], 0.07426058357128477, [361.42189294407046, 461.28835523391433], 0, [360.0426715873188, 459.9156011573379], -0.06548790279458117, [360.2851152549719, 357.8786506661694], -0.04227753631212227, [346.33055464305374, 293.3324195844309], -0.056172333674162495, [311.43200724979914, 212.96070379493364], 0, [310.93871631800266, 212.88779827664194], -0.00793399669319285, [307.68508259066056, 206.58515476883855], -0.005919522217160536, [302.8230350758758, 198.70136235145944], 0, [303.28820964677647, 198.77011229634067], -0.07174730482095937, [263.3699447771607, 148.97924018587022], 0, [262.7596522831348, 149.10538038282925], -0.14255049355605404, [182.21024773410883, 113.61003285764781], -0.14077658798903714, [87.93677094888172, 136.03287484008467], 0, [88.19488827221956, 135.1956938030656], -0.04513801259751311, [45.780586931621485, 162.3898499135038], 0.39782128974410047, [-2.044548087593359, 147.4569370104155], 0, [-0.7859749528631816, 146.03276259253875], 0.2472291990501607, [-14.776371068260916, 124.25265858503285], 0.20695219839929455, [1.4915436378485722, 75.92120642684569], 0.013652847267144727, [12.194646194062642, 64.9005592146319], 0.11991101226154251, [126.7108106504181, -2.8175183289565666], 0.06970856590582382, [203.83456674596607, -14.959526923127044], 0.08482062762366688, [297.5168107124458, -0.5828301821931063], 0.08326244171921664, [379.7311114468818, 43.0216754773393], 0, [379.91321780220164, 40.48338437162393], 0.02592982720348706, [445.5507141763875, 108.87936972502882], 0, [445.5627415862375, 108.83630788084449], 0.0027506827909016085, [450.4676088733669, 114.61323114391712], 0.0021728799018758123, [455.5907752184968, 120.69112944801714], 0, [455.5706646369793, 120.76313155754232], 0.032323516875440585, [507.4200586291239, 193.05207203810642], 0.03636742975664602, [554.0598955470364, 281.58061383017815], 0.022695347458021323, [576.4724738949936, 339.9187895342726], 0, [577.3097360534697, 338.5946377731411], 0.02676041600254321, [600.1759496398608, 437.5240861303753], 0.01676422580319205, [614.3076343013773, 533.1181808392147], 0, false], "basePt": { "x": 1139.2238497367207, "y": 89.14208311646485, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] } )[0] as Polyline; testOffset(pl, -15); }); test('由于点在线内错误导致的偏移错误', () => { let pl = loadFile( [2, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 2, 12, [964.1726917869288, 2166.0000000029972], 0, [81.82735810056852, 2166], 0.3415531568154667, [40.20999509376975, 2133.8164270510624], 0.05489447350760577, [0.000024946672056103125, 1768.2989623206213], 0, [0.00002495866783647216, 437.7012596801617], 0.04953932502193947, [40.21532578137385, 32.163083246120095], 0.3414157136434686, [81.8273581160156, 2.9976945370435715e-9], 0, [964.172691799029, 0], 0.3414157138387472, [1005.7847240515422, 32.16308280570047], 0.049539325021327685, [1046.0000249832037, 437.7009488243086], 0, [1046.0000249590144, 1768.2987401249993], 0.054894473508189726, [1005.7900548890677, 2133.8164267602974], 0.3415531571190822, true, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 2, 10, [1050.0000249590144, 1768.298295468967], 0, [1050.0000249836708, 1768.2987401250723], 0.0548944072866294, [1009.6943012621955, 2134.6864039197217], 0.008757597397914658, [1009.6614374965075, 2134.8226060220663], 0.3415531571190834, [964.1726917869152, 2170.0000000029972], 0, [81.82735810055493, 2170], 0.3415531568154657, [36.33861249020625, 2134.8226063277452], 0.008757508805047694, [36.30574877822974, 2134.6864044689264], 0.054894407325456196, [-3.999975077955014, 1768.2989623205858], 0, [-3.99997505332794, 1768.2985179293778], 0, false] )[0] as Polyline; testOffset(pl, 4); testOffset(pl, -4); }); test('产生小圆弧', () => { let d = { "file": [1, "Polyline", 10, 2, 100, 0, 1, 3, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1493.5460401813875, 698.3323670493448, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -2574.702333375179, -968.9007395665551, 0, 1], 0, 0, 1, 2, 5, [-530, -400.0046078520204], 0, [0, 0], 0, [-250, 0], 0.41569289652442754, [-530, -280], 0, [-530, -400.0046078520204], 0, false], "basePt": { "x": 963.5451505016722, "y": 298.32775919732444, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] }; let pl = loadFile(d.file)[0] as Polyline; let pls = pl.GetOffsetCurves(-1)[0]; expect(pls.EndParam).toMatchNumberSnapshot(0); expect(pls.Length).toMatchNumberSnapshot(5); }); test('尖角化文档', () => { let d = { "file": [22, "Arc", 10, 2, 100, 0, 1, 1, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 612.3489562292762, 1276.4192942638308, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 612.3489562292762, 1276.4192942638308, 0, 1], 0, 0, 1, 2, 554.3740810429213, 4.803124089117446, 0.9420313933899384, 1, "Arc", 10, 2, 101, 0, 1, 1, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1089.9106782723047, 1884.098195143212, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1089.9106782723047, 1884.098195143212, 0, 1], 0, 0, 1, 2, 219.86303368944365, 3.9521362227289285, 3.5399764901601127, 1, "Arc", 10, 2, 102, 0, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 948.7575615797596, 1864.132465288415, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 948.7575615797596, 1864.132465288415, 0, 1], 0, 0, 1, 2, 89.71470329728743, 3.9572085555536427, 5.210501558572323, 0, "Arc", 10, 2, 103, 0, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 4438.41124666784, 906.6293114291364, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 4438.41124666784, 906.6293114291364, 0, 1], 0, 0, 1, 2, 3557.030126597525, 2.891979491156536, 3.1180853302614966, 0, "Arc", 10, 2, 104, 0, 1, 8, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 612.3489562292762, 1276.4192942638308, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 612.3489562292762, 1276.4192942638308, 0, 1], 0, 0, 1, 2, 584.3740810429213, 4.803124089117446, 0.9420313933899384, 1, "Arc", 10, 2, 105, 0, 1, 8, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1089.9106782723047, 1884.098195143212, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1089.9106782723047, 1884.098195143212, 0, 1], 0, 0, 1, 2, 249.86303368944365, 3.9521362227289285, 3.5399764901601127, 1, "Circle", 10, 2, 106, 0, 1, 6, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 851.3916442434202, 1809.66563499364, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -12454.851921270643, 1417.557471431336, 0, 1], 0, 0, 1, 1, 11.332807117935072, "Text", 10, 2, 107, 0, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 546.2194097508764, 1730.1757045499514, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 546.2194097508764, 1730.1757045499514, 0, 1], 0, 0, 1, 1, "尖角化:\n红色为原曲线,灰色为偏移后的曲线.\n粉色的交点因为上方的圆弧反向延长,所以被舍弃,\n如果我们往蓝色交点延伸,那么就会造成偏移错误.", 10, 0, "songti", 10, "Line", 10, 2, 108, 0, 1, 1, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -12454.851921270643, 1417.557471431336, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -12454.851921270643, 1417.557471431336, 0, 1], 0, 0, 1, 1, [13182.39247370293, 114.85071877224863, 0], [13239.706035081284, 209.983432896864, 0], "Line", 10, 2, 109, 0, 1, 1, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -12454.851921270643, 1417.557471431336, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -12454.851921270643, 1417.557471431336, 0, 1], 0, 0, 1, 1, [13239.706035081284, 209.983432896864, 0], [13263.87910178508, 103.93384993827638, 0], "Line", 10, 2, 110, 0, 1, 8, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 727.5405524322869, 1532.4081902035846, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -12454.851921270643, 1417.557471431336, 0, 1], 0, 0, 1, 1, [-25.69686830347858, 15.481310002505523, 0], [31.6166930748757, 110.6140241271209, 0], "Line", 10, 2, 111, 0, 1, 8, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 784.8541138106411, 1627.5409043282, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -12454.851921270643, 1417.557471431336, 0, 1], 0, 0, 1, 1, [29.249754388332345, 6.667223426752164, 0], [53.42282109212783, -99.38235953183546, 0], "Text", 10, 2, 112, 0, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 680.3640835426195, 1463.3979836459741, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 680.3640835426195, 1463.3979836459741, 0, 1], 0, 0, 1, 1, "尖角化:仅在这种情况下允许连接\n因为圆的特性,所以这个是对的.", 10, 0, "songti", 10, "Line", 10, 2, 113, 0, 1, 3, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 912.7952244357875, 452.0364529636016, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 912.7952244357875, 452.0364529636016, 0, 1], 0, 0, 1, 1, [-23.347824191196196, 0, 0], [152.56897186214883, 0, 0], "Arc", 10, 2, 114, 0, 1, 3, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 954.9354755510558, 180.52673133225449, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 954.9354755510558, 180.52673133225449, 0, 1], 0, 0, 1, 2, 279.2959307753637, 3.795173024083316, 1.8074754005306746, 1, "Arc", 10, 2, 115, 0, 1, 8, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 954.9354755510558, 180.52673133225449, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 954.9354755510558, 180.52673133225449, 0, 1], 0, 0, 1, 2, 269.2959307753637, 3.795173024083316, 1.8074754005306746, 1, "Line", 10, 2, 116, 0, 1, 8, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 889.4474002445913, 452.0364529636016, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 912.7952244357875, 452.0364529636016, 0, 1], 0, 0, 1, 1, [0, -10, 0], [175.91679605334502, -10, 0], "Arc", 10, 2, 117, 0, 1, 3, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 224.1119842870703, 260.0651615445943, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 224.1119842870703, 260.0651615445943, 0, 1], 0, 0, 1, 2, 279.2959307753637, 4.71238898038469, 0.7599528605119648, 1, "Line", 10, 2, 118, 0, 1, 3, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 224.1119842870703, -19.230769230769283, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 224.1119842870703, -19.230769230769283, 0, 1], 0, 0, 1, 1, [202.4528183026996, 471.69934371019394, 0], [355.0217901648484, 471.69934371019383, 0], "Arc", 10, 2, 119, 0, 1, 3, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 224.1119842870703, 260.0651615445943, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 224.1119842870703, 260.0651615445943, 0, 1], 0, 0, 1, 2, 249.29593077536367, 4.71238898038469, 0.7599528605119648, 1, "Line", 10, 2, 120, 0, 1, 3, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 426.5648025897699, 452.46857447942455, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 224.1119842870703, -19.230769230769283, 0, 1], 0, 0, 1, 1, [-2.2354513437568925e-14, -30, 0], [152.5689718621488, -30.000000000000114, 0], "Circle", 10, 2, 121, 0, 1, 5, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1073.9726927662487, 1634.7439968178157, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -12454.851921270643, 1417.557471431336, 0, 1], 0, 0, 1, 1, 17.719640253387112], "basePt": { "x": -55.18394648829337, "y": -19.230769230769397, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] }; loadFile(d.file); expect(true).toBeTruthy(); });