diff --git a/__test__/Interfere/interfere.test.ts b/__test__/Interfere/interfere.test.ts index 14f2684c8..323a86e40 100644 --- a/__test__/Interfere/interfere.test.ts +++ b/__test__/Interfere/interfere.test.ts @@ -106,4 +106,25 @@ describe("干涉测试", () => { "file": [2, "Board", 10, 2, 278, 0, 1, 4, 71, [0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2245.0804020100513, 20, 335.6783919596659, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 2245.0804020100513, 20, 335.6783919596659, 1], 0, 0, 1, 3, 875, 420, 18, false, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 634.0000000009315, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 10, [420, -634.0000000009315], 0, [420, 240.99999999906845], 0, [0, 240.99999999906845], 0, [0, 75.99999999999977], 0, [18, 75.99999999999977], 0, [18, 75.99999999999977], 0, [36, 75.99999999999977], 0, [36.00000000000002, 2.9999999999997726], 0, [1.8947806286936004e-14, 3], 0, [0, -634.0000000009315], 0, true, 1, 3, 805, 9, 10, true, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [9, 0], 0, [9, 805], 0, [0, 805], 0, true, 0, 3, 6, 1.5, 1, 0, 0, [0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2245.0804020100513, 413, 395.6783919596659, 1], 3, 0, 0, 0, 0, 0, 10, 1, "@右侧板切角处封边", "餐边柜", "10", "福人-L3002", "颗粒板", "福人L3002", 2, 1, "三合一", 2, 10, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, "0.5", "0.5", "0.5", "0.5", "", "", "", 10, "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", true, true, 0, 6, 261, 2, 3, 650, 651, 652, 3, 653, 654, 655, 279, 2, 3, 666, 667, 668, 3, 669, 670, 671, 298, 2, 3, 674, 675, 676, 3, 677, 678, 679, 307, 2, 3, 682, 683, 684, 3, 685, 686, 687, 342, 2, 3, 690, 691, 692, 3, 693, 694, 695, 344, 4, 3, 698, 699, 700, 3, 701, 702, 703, 1, 704, 1, 705, 0, 0, 0, 0, 0, 0, true, 0, 0, "Board", 10, 2, 633, 0, 1, 4, 71, [1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 1760.0804020100513, 422, 395.6783919596659, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1760.0804020100513, 422, 395.6783919596659, 1], 0, 0, 1, 3, 805, 495, 9, true, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [495, 0], 0, [495, 805], 0, [0, 805], 0, [0, 0], 0, true, 0, 3, 6, 1.5, 1, 0, 0, 10, 2, "薄背板", "餐边柜", "10", "福人-L3002", "颗粒板", "福人L3002", 2, 0, "不排", 2, 0, "0.5", "0.5", "0.5", "0.5", "", "", "", 4, "不排", "不排", "不排", "不排", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, 0, 0], "basePt": { "x": 1760.0804020100513, "y": 20, "z": 335.6783919596659 }, "ucs": [1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1] }; await Check(d, 0); }); + + test('圆弧板干涉检查1', async () => + { + let d = + { "file": [2, "Board", 10, 2, 179, 0, 1, 1, 71, [0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 2421.597549375847, 1015.8006398516147, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 2421.597549375847, 1015.8006398516147, 0, 1], 0, 0, 1, 3, 473.04302442919106, 92.81484890811642, 18, false, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, -158.94697836655112, 4599.433812615176, 0, 1], 0, 0, 1, 2, 5, [0, 441.04302442919106], 0, [0, 0], 0, [92.8148489081164, 0], 0, [92.8148489081164, 473.04302442919106], 0, [32, 473.04302442919106], 0.41421356237309503, true, 0, 3, 0, 0, 0, 0, 0, 19, 0, "层板", "", "", "", "", "", 0, 0, "三合一", 2, 3, 1, 1, 1, "1", "1", "1", "1", "", "", "", 5, "三合一", "三合一", "三合一", "三合一", "三合一", true, true, 0, 1, 102, 4, 4, 180, 181, 182, 183, 4, 184, 185, 186, 187, 3, 190, 191, 192, 3, 193, 194, 195, 0, 0, 0, 0, 0, 0, true, 0, 0, null, 0, 0, "", "", "", "", 3, { "description": "" }, { "description": "" }, { "description": "" }, false, 0, "", "Board", 10, 2, 102, 0, 1, 2, 71, [0.8887586237162988, -0.4583755106568311, 0, 0, 0, 0, 1, 0, -0.4583755106568311, -0.8887586237162988, 0, 0, 1948.554524377891, 1259.771648513914, 0, 1], 0, 0, 1, [0.8887586237162988, -0.4583755106568311, 0, 0, 0, 0, 1, 0, -0.4583755106568311, -0.8887586237162988, 0, 0, 1948.554524377891, 1259.771648513914, 0, 1], 0, 0, 1, 3, 1200, 731.55385, 18, true, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [731.55385, 0], 0, [731.55385, 1200], 0, [0, 1200], 0, true, 0, 3, 0, 0, 0, 0, 0, 19, 0, "圆弧板", "", "", "", "", "", 0, 0, "三合一", 2, 0, "1", "1", "1", "1", "", "", "", 4, "三合一", "三合一", "三合一", "三合一", true, true, 0, 1, 179, 4, 4, 180, 181, 182, 183, 4, 184, 185, 186, 187, 3, 190, 191, 192, 3, 193, 194, 195, 0, 0, 0, 0, 0, 0, true, 0, 0, null, 0, 0, "", "", "", "", 0, false, 0, "Polyline", 10, 2, 0, 0, 0, 8, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [0.8887586237162985, -0.45837551065683096, 0, 0, -0.45837551065683096, -0.8887586237162985, 0, 0, 0, 0, -0.9999999999999998, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [97.16231934002498, 188.3910619264607], -0.41421356237309476, [140.27061163996515, 202.16332154436375], 0, [532.2514030313268, 0], 0, false, 0, 0, true, 2, -1, 0, 6, 6, 2, 0, 0, 0, 3, 0, 1, 78.53982, 6, 6, 2, 0, 0, 0, 3, 0], "basePt": { "x": 1831.7874698204685, "y": 813.1832386224994, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] }; + await Check(d, 0); + }); + + test('圆弧板干涉检查2', async () => + { + let d = + { "file": [2, "Board", 10, 2, 102, 0, 1, 2, 71, [0.8887586237162988, -0.4583755106568311, 0, 0, 0, 0, 1, 0, -0.4583755106568311, -0.8887586237162988, 0, 0, 1948.554524377891, 1259.771648513914, 0, 1], 0, 0, 1, [0.8887586237162988, -0.4583755106568311, 0, 0, 0, 0, 1, 0, -0.4583755106568311, -0.8887586237162988, 0, 0, 1948.554524377891, 1259.771648513914, 0, 1], 0, 0, 1, 3, 1200, 731.55385, 18, true, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [731.55385, 0], 0, [731.55385, 1200], 0, [0, 1200], 0, true, 0, 3, 0, 0, 0, 0, 0, 19, 0, "圆弧板", "", "", "", "", "", 0, 0, "三合一", 2, 0, "1", "1", "1", "1", "", "", "", 4, "三合一", "三合一", "三合一", "三合一", true, true, 0, 1, 179, 2, 4, 358, 359, 360, 361, 4, 362, 363, 364, 365, 0, 0, 0, 0, 0, 0, true, 0, 0, null, 0, 0, "", "", "", "", 0, false, 0, "Polyline", 10, 2, 0, 0, 0, 8, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [0.8887586237162985, -0.45837551065683096, 0, 0, -0.45837551065683096, -0.8887586237162985, 0, 0, 0, 0, -0.9999999999999998, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [97.16231934002498, 188.3910619264607], -0.41421356237309476, [140.27061163996515, 202.16332154436375], 0, [532.2514030313268, 0], 0, false, 0, 0, true, 2, -1, 0, 6, 6, 2, 0, 0, 0, 3, 0, 1, 78.53982, 6, 6, 2, 0, 0, 0, 3, 0, "Board", 10, 2, 179, 0, 1, 1, 71, [0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 2418.63837864963, 1015.8006398516147, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 2418.63837864963, 1015.8006398516147, 0, 1], 0, 0, 1, 3, 473.04302442919106, 92.81484890811642, 18, false, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, -158.94697836655112, 4599.433812615176, 0, 1], 0, 0, 1, 2, 5, [0, 441.04302442919106], 0, [0, 0], 0, [92.8148489081164, 0], 0, [92.8148489081164, 473.04302442919106], 0, [32, 473.04302442919106], 0.41421356237309503, true, 0, 3, 0, 0, 0, 0, 0, 19, 0, "层板", "", "", "", "", "", 0, 0, "三合一", 2, 3, 1, 1, 1, "1", "1", "1", "1", "", "", "", 5, "三合一", "三合一", "三合一", "三合一", "三合一", true, true, 0, 1, 102, 2, 4, 358, 359, 360, 361, 4, 362, 363, 364, 365, 0, 0, 0, 0, 0, 0, true, 0, 0, null, 0, 0, "", "", "", "", 3, { "description": "" }, { "description": "" }, { "description": "" }, false, 0, ""], "basePt": { "x": 1831.7874698204685, "y": 813.1832386224994, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] }; + await Check(d, 1); + }); + + test('圆弧板干涉检查3', async () => + { + let d = + { "file": [3, "Board", 10, 2, 358, 0, 1, 2, 71, [0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 3730.7096330325576, 2724.3225088479735, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3730.7096330325576, 2724.3225088479735, 0, 1], 0, 0, 1, 3, 800, 500, 18, false, "Polyline", 10, 2, 0, 0, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 5, [0, 0], 0, [292.0662700106652, 0], 0.41421356237309503, [500, 207.93372998933478], 0, [500, 800], 0, [0, 800], 0, true, 0, 3, 0, 0, 0, 0, 0, 19, 0, "层板", "", "", "", "", "", 0, 0, "三合一", 2, 3, 0, 0, 0, "0", "0", "0", "0", "", "", "", 5, "三合一", "三合一", "三合一", "三合一", "三合一", true, true, 1, "1", "1", 2, 359, 5, 4, 361, 362, 363, 364, 4, 365, 366, 367, 368, 3, 371, 372, 373, 3, 374, 375, 376, 3, 377, 378, 379, 360, 4, 3, 383, 384, 385, 3, 386, 387, 388, 4, 391, 392, 393, 394, 4, 395, 396, 397, 398, 0, 0, 0, 0, 0, 0, true, 0, 0, null, 0, 0, "", "", "", "", 3, { "description": "" }, { "description": "" }, { "description": "" }, false, 0, "", "Board", 10, 2, 359, 0, 1, 2, 71, [0.8479983040050879, -0.52999894000318, 0, 0, 0, 0, 1, 0, -0.52999894000318, -0.8479983040050879, 0, 0, 2930.7096330325576, 3224.3225088479735, 3.0809133022557944e-11, 1], 0, 0, 1, [0.8479983040050879, -0.52999894000318, 0, 0, 0, 0, 1, 0, -0.52999894000318, -0.8479983040050879, 0, 0, 2930.7096330325576, 3224.3225088479735, 3.0809133022557944e-11, 1], 0, 0, 1, 3, 1200, 1336, 18, true, "Polyline", 10, 2, 0, 0, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [1336, 0], 0, [1336, 1200], 0, [0, 1200], 0, true, 0, 3, 0, 0, 0, 0, 0, 19, 0, "圆弧板", "", "", "", "", "", 0, 0, "三合一", 2, 0, "1", "1", "1", "1", "", "", "", 4, "三合一", "三合一", "三合一", "三合一", true, true, 0, 1, 358, 5, 4, 361, 362, 363, 364, 4, 365, 366, 367, 368, 3, 371, 372, 373, 3, 374, 375, 376, 3, 377, 378, 379, 0, 0, 0, 0, 0, 0, true, 0, 0, null, 0, 0, "", "", "", "", 0, false, 0, "Polyline", 10, 2, 0, 0, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [0.8479983040050879, -0.52999894000318, 0, 0, -0.52999894000318, -0.8479983040050879, 0, 0, 0, 0, -1, 0, -1443.3438319990282, 583.0261051057685, 781.3702416451415, 1], 0, 0, 1, 2, 3, [0, -5.684341886080802e-14], 0, [264.9994700015901, 423.9991520025436], 0, [943.3981132056601, 0], 0, false, 0, 0, true, 1, -1, 0, 6, 6, 2, 0, 0, 0, 3, 0, "Board", 10, 2, 360, 0, 1, 2, 71, [-0.8479983040050879, 0.5299989400031802, 0, 0, 0, 0, 1, 0, 0.5299989400031802, 0.8479983040050879, 0, 0, 3730.7096298449096, 2724.3225088479735, 3.0809133022557944e-11, 1], 0, 0, 1, [-0.8479983040050879, 0.5299989400031802, 0, 0, 0, 0, 1, 0, 0.5299989400031802, 0.8479983040050879, 0, 0, 3730.7096298449096, 2724.3225088479735, 3.0809133022557944e-11, 1], 0, 0, 1, 3, 1200, 1239.02841, 18, true, "Polyline", 10, 2, 0, 0, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [1239.02841, 0], 0, [1239.02841, 1200], 0, [0, 1200], 0, true, 0, 3, 0, 0, 0, 0, 0, 19, 0, "圆弧板", "", "", "", "", "", 0, 0, "三合一", 2, 0, "1", "1", "1", "1", "", "", "", 4, "三合一", "三合一", "三合一", "三合一", true, true, 0, 1, 358, 4, 3, 383, 384, 385, 3, 386, 387, 388, 4, 391, 392, 393, 394, 4, 395, 396, 397, 398, 0, 0, 0, 0, 0, 0, true, 0, 0, null, 0, 0, "", "", "", "", 0, false, 0, "Polyline", 10, 2, 0, 0, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [-0.8479983040050879, 0.5299989400031802, 0, 0, 0.5299989400031802, 0.8479983040050879, 0, 0, 0, 0, -1, 0, 1913.9665411401543, -1266.7111130584567, 781.3702416451415, 1], 0, 0, 1, 2, 4, [0, 0], 0, [154.7948135163351, 247.6717016261362], -0.41421356237309503, [441.32692037799757, 313.79449551728925], 0, [943.3981132056606, -5.684341886080802e-14], 0, false, 0, 0, true, 2, -1, 0, 6, 6, 2, 0, 0, 0, 3, 0, 1, 354.89587, 6, 6, 2, 0, 0, 0, 3, 0], "basePt": { "x": 2679.9006452701487, "y": 2338.682052343912, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] }; + await Check(d, 0); + }); }); diff --git a/src/Common/InterfereUtil.ts b/src/Common/InterfereUtil.ts index 61f197b14..af635556e 100644 --- a/src/Common/InterfereUtil.ts +++ b/src/Common/InterfereUtil.ts @@ -1,5 +1,8 @@ import { Geom3 } from "@jscad/modeling/src/geometries/types"; -import { Box3, Material, Mesh } from "three"; +import measureBoundingBox from "@jscad/modeling/src/measurements/measureBoundingBox"; +// @ts-ignore jscad中没有scission的ts声明文件 +import { scission } from "@jscad/modeling/src/operations/booleans"; +import { Box3, Material, Mesh, Vector3 } from "three"; import { ExtrudeHole } from "../DatabaseServices/3DSolid/ExtrudeHole"; import { SweepSolid } from "../DatabaseServices/3DSolid/SweepSolid"; import { Board } from "../DatabaseServices/Entity/Board"; @@ -130,31 +133,35 @@ export class CheckInterfereTool if (!obb1.intersectsOBB(obb2)) continue; - function EntityTypeCode(ext: Entity): 0 | 1 | 2 - { - if (ext instanceof ExtrudeSolid) - return 1; - else if (ext instanceof ExtrudeHole) - return 2; - else - return 0; - } - let t1 = EntityTypeCode(e1); - let t2 = EntityTypeCode(e2); - - //#I2DXNO - if (t1 > 0 && t2 > 0) - { - let [b1, b2] = [t1 === 1 ? e1.Clone() : (e1).Convert2ExtrudeSolid(), - t2 === 1 ? e2.Clone() : (e2).Convert2ExtrudeSolid()]; - - b1.ClearDraw(); - b2.ClearDraw(); - - if (!b1.Subtract([b2], []) && !b1.IsErase - && !b2.Subtract([b1], []) && !b2.IsErase) - continue; - } + // function EntityTypeCode(ext: Entity): 0 | 1 | 2 + // { + // //在target不为圆弧板是才做Subtract,因为圆弧板的板件切割存在问题(板厚被改成了一个很小的值,导致圆弧板build错误) + // if (ext instanceof Board && ext.IsArcBoard) + // return 0; + + // if (ext instanceof ExtrudeSolid) + // return 1; + // else if (ext instanceof ExtrudeHole) + // return 2; + // else + // return 0; + // } + // let t1 = EntityTypeCode(e1); + // let t2 = EntityTypeCode(e2); + + // //#I2DXNO + // if (t1 > 0 && t2 > 0) + // { + // let [b1, b2] = [t1 === 1 ? e1.Clone() : (e1).Convert2ExtrudeSolid(), + // t2 === 1 ? e2.Clone() : (e2).Convert2ExtrudeSolid()]; + + // b1.ClearDraw(); + // b2.ClearDraw(); + + // if (!b1.Subtract([b2], []) && !b1.IsErase + // && !b2.Subtract([b1], []) && !b2.IsErase) + // continue; + // } let csg1 = this.GetCSG(e1); let csg2 = this.GetCSG(e2); @@ -165,6 +172,7 @@ export class CheckInterfereTool } let interCsg = CSGIntersect(csg1, csg2, e1.OCSInv.multiply(e2.OCSNoClone)); + // 先判断交集是否围城一个实体,再判断该实体是否造成干涉 let planeSet = new Set(); let f = new FuzzyFactory; for (let polygon of interCsg.polygons) @@ -172,11 +180,19 @@ export class CheckInterfereTool if (planeSet.size >= 4)//最少4个面围成一个三维实体 { - let geo = CSG2Geometry2(interCsg); - geo.computeBoundingBox(); - if (!BoxIsSolid(geo.boundingBox, 0.1)) + /** 分裂的相交部分集 */ + const pieces: Geom3[] = scission(interCsg); + + if (!pieces.some(p => + { + const [min, max] = measureBoundingBox(p); + const box = new Box3(new Vector3(min[0], min[1], min[2]), new Vector3(max[0], max[1], max[2])); + let isSolid = BoxIsSolid(box, 0.2); + return isSolid; + })) continue; + let geo = CSG2Geometry2(interCsg); geo.applyMatrix4(e1.OCSNoClone); let mesh = new Mesh(geo, this._MeshMaterial); entitySet.add(e1);