!2718 修复: 圆弧板的干涉问题

pull/2597/MERGE
张子涵 5 months ago committed by ChenX
parent e0375ca989
commit e202a6a07b

@ -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);
});
});

@ -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 ? <ExtrudeSolid>e1.Clone() : (<ExtrudeHole>e1).Convert2ExtrudeSolid(),
t2 === 1 ? <ExtrudeSolid>e2.Clone() : (<ExtrudeHole>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 ? <ExtrudeSolid>e1.Clone() : (<ExtrudeHole>e1).Convert2ExtrudeSolid(),
// t2 === 1 ? <ExtrudeSolid>e2.Clone() : (<ExtrudeHole>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<number[]>();
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);

Loading…
Cancel
Save