import { CADFactory } from "../../src/DatabaseServices/CADFactory"; import { CADFile } from "../../src/DatabaseServices/CADFile"; import { Region } from "../../src/DatabaseServices/Region"; import { BoolOpeartionType } from "../../src/GraphicsSystem/BoolOperateUtils"; CADFactory.RegisterObject(Region); function loadFile(data) { let file = new CADFile(); file.Data = data let regs: Region[] = []; for (let i = 0; i < file.Data.length; i++) { let reg = file.ReadObject(undefined) as Region; regs.push(reg); } return regs.filter(r => r instanceof Region); } //没有洞 test('2没有洞的面域,相交', () => { let data = [["Region", 1, 1, 4, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-2.8550724637681157, -3.3478260869565215], 0, [1.4347826086956512, -3.3478260869565215], 0, [1.4347826086956512, -0.304347826086957], 0, [-2.8550724637681157, -0.304347826086957], 0, [-2.8550724637681157, -3.3478260869565215], 0, false], 0], ["Region", 1, 1, 6, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-1.4492753623188404, -4.695652173913043], 0, [2.2753623188405787, -4.695652173913043], 0, [2.2753623188405787, -1.434782608695652], 0, [-1.4492753623188404, -1.434782608695652], 0, [-1.4492753623188404, -4.695652173913043], 0, false], 0]]; let regs: Region[] = loadFile(data); expect(regs.length).toBe(2); regs[0].BooleanOper(regs[1], BoolOpeartionType.Intersection); expect(regs[0].ShapeManager.ShapeList.length).toBe(1); regs = loadFile(data); regs[0].BooleanOper(regs[1], BoolOpeartionType.Union); expect(regs[0].ShapeManager.ShapeList.length).toBe(1); regs = loadFile(data); regs[0].BooleanOper(regs[1], BoolOpeartionType.Union); expect(regs[0].ShapeManager.ShapeList.length).toBe(1); }); test('2面域,大的包含小的', () => { let data = [["Region", 1, 1, 9, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-1.8800742693409744, -12.621788424068765], 0, [6.005662808022923, -12.621788424068765], 0, [6.005662808022923, -8.540226017191973], 0, [-1.8800742693409744, -8.540226017191973], 0, [-1.8800742693409744, -12.621788424068765], 0, false], 0], ["Region", 1, 1, 10, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-0.03742716332378216, -11.254663151862458], 0, [3.9450681948424067, -11.254663151862458], 0, [3.9450681948424067, -9.53089650429799], 0, [-0.03742716332378216, -9.53089650429799], 0, [-0.03742716332378216, -11.254663151862458], 0, false], 0]]; let regs = loadFile(data); testBool(regs[0], regs[1], 1, 0, 1, 0, 1, 1); testBool(regs[1], regs[0], 1, 0, 1, 0, 0, 0); }) test('2没有洞的面域,不相交', () => { let data = [["Region", 1, 1, 13, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-4.711014253295126, -24.920368119197704], 0, [5.1917279358166155, -24.920368119197704], 0, [5.1917279358166155, -16.88167151862464], 0, [-4.711014253295126, -16.88167151862464], 0, [-4.711014253295126, -24.920368119197704], 0, false], 0], ["Region", 1, 1, 14, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [7.948962035530085, -25.735888064183378], 0, [14.084778764469913, -25.735888064183378], 0, [14.084778764469913, -19.716574184527214], 0, [7.948962035530085, -19.716574184527214], 0, [7.948962035530085, -25.735888064183378], 0, false], 0]]; let regs: Region[] = loadFile(data); expect(regs.length).toBe(2); regs[0].BooleanOper(regs[1], BoolOpeartionType.Intersection); expect(regs[0].ShapeManager.ShapeList.length).toBe(0); regs = loadFile(data); regs[0].BooleanOper(regs[1], BoolOpeartionType.Union); expect(regs[0].ShapeManager.ShapeList.length).toBe(2); regs = loadFile(data); regs[0].BooleanOper(regs[1], BoolOpeartionType.Subtract); expect(regs[0].ShapeManager.ShapeList.length).toBe(1); }); test("多无洞面域,互相相交", () => { let data = [["Region", 1, 1, 60, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-0.8607930519232294, -2.5865143049017547], 0, [4.439811998377018, -2.5865143049017547], 0, [4.439811998377018, 1.1818845980460777], 0, [-0.8607930519232294, 1.1818845980460777], 0, [-0.8607930519232294, -2.5865143049017547], 0, false], 0], ["Region", 1, 1, 4, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-2.8550724637681157, -3.3478260869565215], 0, [1.4347826086956512, -3.3478260869565215], 0, [1.4347826086956512, -0.304347826086957], 0, [-2.8550724637681157, -0.304347826086957], 0, [-2.8550724637681157, -3.3478260869565215], 0, false], 0], ["Region", 1, 1, 6, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-1.4492753623188404, -4.695652173913043], 0, [2.2753623188405787, -4.695652173913043], 0, [2.2753623188405787, -1.434782608695652], 0, [-1.4492753623188404, -1.434782608695652], 0, [-1.4492753623188404, -4.695652173913043], 0, false], 0]]; let regs = loadFile(data); expect(regs.length).toBe(3); testRegionsBool(regs, 1, 0, 1, 0, 1, 0); }) test("多无洞面域,互不相交", () => { let data = [["Region", 1, 1, 13, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-4.711014253295126, -24.920368119197704], 0, [5.1917279358166155, -24.920368119197704], 0, [5.1917279358166155, -16.88167151862464], 0, [-4.711014253295126, -16.88167151862464], 0, [-4.711014253295126, -24.920368119197704], 0, false], 0], ["Region", 1, 1, 14, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [7.948962035530085, -25.735888064183378], 0, [14.084778764469913, -25.735888064183378], 0, [14.084778764469913, -19.716574184527214], 0, [7.948962035530085, -19.716574184527214], 0, [7.948962035530085, -25.735888064183378], 0, false], 0], ["Region", 1, 1, 16, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-14.225413611461313, -24.182516740401145], 0, [-8.90511682750716, -24.182516740401145], 0, [-8.90511682750716, -16.609831536962744], 0, [-14.225413611461313, -16.609831536962744], 0, [-14.225413611461313, -24.182516740401145], 0, false], 0]]; let regs = loadFile(data); expect(regs.length).toBe(3); testRegionsBool(regs, 3, 0, 0, 0, 1, 0); }) test('2面域,各有一个洞,不相交', () => { let data = [["Region", 1, 1, 21, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-22.59187156135242, -39.71001649292836], 0, [-10.261209993169047, -39.71001649292836], 0, [-10.261209993169047, -32.47907298072205], 0, [-22.59187156135242, -32.47907298072205], 0, [-22.59187156135242, -39.71001649292836], 0, false], 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-19.318918182143253, -36.28483272398853], 0, [-14.523660905627494, -36.28483272398853], 0, [-14.523660905627494, -34.38195285235529], 0, [-19.318918182143253, -34.38195285235529], 0, [-19.318918182143253, -36.28483272398853], 0, false]], ["Region", 1, 1, 22, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-6.759911029363891, -42.52627870294555], 0, [4.048446641512894, -42.52627870294555], 0, [4.048446641512894, -34.9147592164126], 0, [-6.759911029363891, -34.9147592164126], 0, [-6.759911029363891, -42.52627870294555], 0, false], 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-3.7153032347507127, -40.69951402617764], 0, [1.308299626361034, -40.69951402617764], 0, [1.308299626361034, -37.42656064696847], 0, [-3.7153032347507127, -37.42656064696847], 0, [-3.7153032347507127, -40.69951402617764], 0, false]]]; let regs = loadFile(data); testBool(regs[0], regs[1], 2, 2, 0, 0, 1, 1); }) test('2面域,各有一个洞,相交', () => { let data = [["Region", 1, 1, 22, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-6.759911029363891, -42.52627870294555], 0, [4.048446641512894, -42.52627870294555], 0, [4.048446641512894, -34.9147592164126], 0, [-6.759911029363891, -34.9147592164126], 0, [-6.759911029363891, -42.52627870294555], 0, false], 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-3.7153032347507127, -40.69951402617764], 0, [1.308299626361034, -40.69951402617764], 0, [1.308299626361034, -37.42656064696847], 0, [-3.7153032347507127, -37.42656064696847], 0, [-3.7153032347507127, -40.69951402617764], 0, false]], ["Region", 1, 1, 31, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-1.081717492410313, -43.85068309360228], 0, [15.009034702120339, -43.85068309360228], 0, [15.009034702120339, -32.98143326683323], 0, [-1.081717492410313, -32.98143326683323], 0, [-1.081717492410313, -43.85068309360228], 0, false], 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [6.484132877203438, -41.29321254612721], 0, [12.345002881833807, -41.29321254612721], 0, [12.345002881833807, -36.81763908804584], 0, [6.484132877203438, -36.81763908804584], 0, [6.484132877203438, -41.29321254612721], 0, false]]]; let regs = loadFile(data); testBool(regs[0], regs[1], 1, 2, 1, 0, 1, 0); testBool(regs[1], regs[0], 1, 2, 1, 0, 2, 1); }) test('2面域,包含关系,小的有洞', () => { let data = [["Region", 1, 1, 36, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-15.04124423071174, -72.72878802550831], 0, [12.451564154645265, -72.72878802550831], 0, [12.451564154645265, -54.08056528350259], 0, [-15.04124423071174, -54.08056528350259], 0, [-15.04124423071174, -72.72878802550831], 0, false], 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-9.286935498892833, -69.21226602273008], 0, [9.041603424678508, -69.21226602273008], 0, [9.041603424678508, -59.08894510564126], 0, [-9.286935498892833, -59.08894510564126], 0, [-9.286935498892833, -69.21226602273008], 0, false]], ["Region", 1, 1, 38, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-22.180849509079643, -77.41748402921259], 0, [19.591169433013167, -77.41748402921259], 0, [19.591169433013167, -48.32625655168367], 0, [-22.180849509079643, -48.32625655168367], 0, [-22.180849509079643, -77.41748402921259], 0, false], 0]]; let regs = loadFile(data); expect(regs.length).toBe(2); testBool(regs[1], regs[0], 1, 0, 1, 1, 2, 1); testBool(regs[0], regs[1], 1, 0, 1, 1, 0, 0); }) test('2面域,包含关系,大的有洞被小的包含,小的有洞', () => { let data = [["Region", 1, 1, 41, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-46.60469323746657, -127.77834155990918], 0, [24.855296309899348, -127.77834155990918], 0, [24.855296309899348, -89.28840982040936], 0, [-46.60469323746657, -89.28840982040936], 0, [-46.60469323746657, -127.77834155990918], 0, false], 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-24.077640165123658, -113.60569227598484], 0, [3.6709152749808487, -113.60569227598484], 0, [3.6709152749808487, -102.26757284884535], 0, [-24.077640165123658, -102.26757284884535], 0, [-24.077640165123658, -113.60569227598484], 0, false]], ["Region", 1, 1, 46, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-59.58385626590253, -133.178866865994], 0, [39.83354881627835, -133.178866865994], 0, [39.83354881627835, -84.72332489316635], 0, [-59.58385626590253, -84.72332489316635], 0, [-59.58385626590253, -133.178866865994], 0, false], 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-15.723236376705094, -111.24855692139529], 0, [-1.5207499363935426, -111.24855692139529], 0, [-1.5207499363935426, -105.60933436421276], 0, [-15.723236376705094, -105.60933436421276], 0, [-15.723236376705094, -111.24855692139529], 0, false]]]; let regs = loadFile(data); expect(regs.length).toBe(2); testBool(regs[0], regs[1], 1, 1, 1, 1, 0, 0); testBool(regs[1], regs[0], 1, 1, 1, 1, 2, 2); }) test('2面域,各有洞,形状和洞都相交', () => { let data = [["Region", 1, 1, 51, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-55.41885848474738, -244.74737129761687], 0, [79.76223873944839, -244.74737129761687], 0, [79.76223873944839, -181.20070166231113], 0, [-55.41885848474738, -181.20070166231113], 0, [-55.41885848474738, -244.74737129761687], 0, false], 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-27.689402643886723, -225.97221890536744], 0, [58.38744986211828, -225.97221890536744], 0, [58.38744986211828, -196.79852057279527], 0, [-27.689402643886723, -196.79852057279527], 0, [-27.689402643886723, -225.97221890536744], 0, false]], ["Region", 1, 1, 53, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-15.846614211852472, -278.5426456036658], 0, [52.032782898587726, -278.5426456036658], 0, [52.032782898587726, -158.95936728995414], 0, [-15.846614211852472, -158.95936728995414], 0, [-15.846614211852472, -278.5426456036658], 0, false], 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [3.2173866787392393, -273.0545241351621], 0, [37.87920647981508, -273.0545241351621], 0, [37.87920647981508, -164.1586402601155], 0, [3.2173866787392393, -164.1586402601155], 0, [3.2173866787392393, -273.0545241351621], 0, false]]]; let regs = loadFile(data); expect(regs.length).toBe(2); testBool(regs[0], regs[1], 1, 5, 4, 0, 4, 0); testBool(regs[1], regs[0], 1, 5, 4, 0, 4, 0); }) test("多都有洞面域,互不相交", () => { let data = [["Region", 1, 1, 21, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-22.59187156135242, -39.71001649292836], 0, [-10.261209993169047, -39.71001649292836], 0, [-10.261209993169047, -32.47907298072205], 0, [-22.59187156135242, -32.47907298072205], 0, [-22.59187156135242, -39.71001649292836], 0, false], 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-19.318918182143253, -36.28483272398853], 0, [-14.523660905627494, -36.28483272398853], 0, [-14.523660905627494, -34.38195285235529], 0, [-19.318918182143253, -34.38195285235529], 0, [-19.318918182143253, -36.28483272398853], 0, false]], ["Region", 1, 1, 22, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-6.759911029363891, -42.52627870294555], 0, [4.048446641512894, -42.52627870294555], 0, [4.048446641512894, -34.9147592164126], 0, [-6.759911029363891, -34.9147592164126], 0, [-6.759911029363891, -42.52627870294555], 0, false], 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-3.7153032347507127, -40.69951402617764], 0, [1.308299626361034, -40.69951402617764], 0, [1.308299626361034, -37.42656064696847], 0, [-3.7153032347507127, -37.42656064696847], 0, [-3.7153032347507127, -40.69951402617764], 0, false]], ["Region", 1, 1, 57, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-32.341023130284626, -29.89099796417434], 0, [-20.945903228429888, -29.89099796417434], 0, [-20.945903228429888, -23.98549786905254], 0, [-32.341023130284626, -23.98549786905254], 0, [-32.341023130284626, -29.89099796417434], 0, false], 1, ["Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-28.59810053478489, -28.809709214363306], 0, [-22.276720151274237, -28.809709214363306], 0, [-22.276720151274237, -25.73219508028575], 0, [-28.59810053478489, -25.73219508028575], 0, [-28.59810053478489, -28.809709214363306], 0, false]]]; let regs = loadFile(data); expect(regs.length).toBe(3); testRegionsBool(regs, 3, 3, 0, 0, 1, 1); }) function testRegion(reg) { if (reg) { let shapeCount = reg.ShapeManager.ShapeList.length; let holeCount = reg.ShapeManager.ShapeList.map(s => s.Holes.length).reduce((c1, c2) => c1 + c2, 0); return { shapeCount, holeCount }; } else return { shapeCount: 0, holeCount: 0 } } function testBool(reg1, reg2, uShapeCount, uHoleCount, iShapeCount, iHoleCount, sShapeCount, sHoleCount) { let a = reg1.Clone() as Region; a.BooleanOper(reg2, BoolOpeartionType.Union); let shapeCount1 = testRegion(a).shapeCount; let holeCount1 = testRegion(a).holeCount; let b = reg1.Clone() as Region; b.BooleanOper(reg2, BoolOpeartionType.Intersection); let shapeCount2 = testRegion(b).shapeCount; let holeCount2 = testRegion(b).holeCount; let c = reg1.Clone() as Region; c.BooleanOper(reg2, BoolOpeartionType.Subtract); let shapeCount3 = testRegion(c).shapeCount; let holeCount3 = testRegion(c).holeCount; expect(shapeCount1).toBe(uShapeCount); expect(holeCount1).toBe(uHoleCount); expect(shapeCount2).toBe(iShapeCount); expect(holeCount2).toBe(iHoleCount); expect(shapeCount3).toBe(sShapeCount); expect(holeCount3).toBe(sHoleCount); } function RegionsBoolOperate(reg: Region[], boolType: BoolOpeartionType): Region | undefined { let regs = reg.map(r => r.Clone() as Region); let firstReg = regs[0]; for (let i = 1; i < regs.length; i++) { if (firstReg.ShapeManager.ShapeCount) { firstReg.BooleanOper(regs[i], boolType); } } return firstReg; } function testRegionsBool(regs, uShapeCount, uHoleCount, iShapeCount, iHoleCount, sShapeCount, sHoleCount) { let unionReg = RegionsBoolOperate(regs, BoolOpeartionType.Union); let shapeCount1 = testRegion(unionReg).shapeCount; let holeCount1 = testRegion(unionReg).holeCount; let intReg = RegionsBoolOperate(regs, BoolOpeartionType.Intersection); let shapeCount2 = testRegion(intReg).shapeCount; let holeCount2 = testRegion(intReg).holeCount; let subReg = RegionsBoolOperate(regs, BoolOpeartionType.Subtract); let shapeCount3 = testRegion(subReg).shapeCount; let holeCount3 = testRegion(subReg).holeCount; expect(shapeCount1).toBe(uShapeCount); expect(holeCount1).toBe(uHoleCount); expect(shapeCount2).toBe(iShapeCount); expect(holeCount2).toBe(iHoleCount); expect(shapeCount3).toBe(sShapeCount); expect(holeCount3).toBe(sHoleCount); }