diff --git a/__test__/Interfere/interfere.test.ts b/__test__/Interfere/interfere.test.ts index abcd4956b..d79a38220 100644 --- a/__test__/Interfere/interfere.test.ts +++ b/__test__/Interfere/interfere.test.ts @@ -1,10 +1,13 @@ import { LoadEntityFromFileData } from "../Utils/LoadEntity.util"; import { Solid3D, checkInterfereTool } from "../../src/Common/InterfereUtil"; +import { ObjectId } from "../../src/DatabaseServices/ObjectId"; -function Check(data: any[], count: number) +function Check(data: any, count: number) { let boards = LoadEntityFromFileData(data) as Solid3D[]; - checkInterfereTool.Check(boards); + for (let i = 0; i < boards.length; i++) + boards[i].objectId = new ObjectId(i); + checkInterfereTool.Check(boards as any[]); expect(checkInterfereTool.objMap.size).toBe(count); } @@ -24,4 +27,9 @@ describe("干涉测试", () => data = [2, "Board", 8, 2, 15731, false, 1, 12, 0, [0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, -17103.964135848066, 173.0236442641158, 3142.826736584199, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -17103.964135848066, -20, 3142.826736584199, 1], 0, 3, 1182, 136.9763557358842, 18, true, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -193.0236442641158, 0, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -193.0236442641158, 0, 0, 1], 0, 2, 4, [193.0236442641158, 0], 0, [330, 0], 0, [330, 1182], 0, [193.0236442641158, 1182], 0, true, 0, 3, 0, 0, 0, 0, 0, 9, 1, "右侧板", "鞋柜", "鞋柜左柜", "", "", "", 0, 1, "三合一", 2, 0, "1", "1", "1", "1", "", "", "", 4, "三合一", "三合一", "三合一", "三合一", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, "Board", 8, 2, 15732, false, 1, 5, 0, [1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, -17256.775064763995, 283, 3142.119629803012, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -18267.25702906688, 274.6553453088989, 3142.119629803012, 1], 0, 3, 59.99999365700023, 153.5180356971141, 18, true, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1010.4819643028859, 0, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1010.4819643028859, 0, 0, 1], 0, 2, 4, [1010.4819643028859, 0], 0, [1164, 0], 0, [1164, 59.99999365700023], 0, [1010.4819643028859, 59.99999365700023], 0, true, 0, 3, 0, 0, 0, 0, 0, 9, 2, "地脚线", "鞋柜", "鞋柜左柜", "", "", "", 1, 0, "地脚线三合一", 2, 0, "1", "1", "1", "1", "", "", "", 4, "地脚线三合一", "地脚线三合一", "地脚线三合一", "地脚线三合一", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true]; Check(data, 1); }); + test("五金孔", () => + { + let data = { "file": [2, "Board", 8, 2, 9087, false, 1, 11, 0, [0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 36291.119983889046, -362.1228211863199, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 36291.119983889046, -362.1228211863199, 0, 1], 0, 3, 1148, 450, 18, 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, 4, [0, 0], 0, [450, 0], 0, [450, 1148], 0, [0, 1148], 0, true, 4, 3, 20, 20, 8.80000000000291, false, "Circle", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 10, 10, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 324.2271826086958, -614.5869582319652, 0, 1], 0, 1, 10, 0, 4, 0, 0, 0, 0, 0, [0, -1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 36300.31998388904, -282.1228211863199, 167.6515268497169, 1], 3, 20, 20, 8.80000000000291, false, "Circle", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 10, 10, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 324.2271826086958, -614.5869582319652, 0, 1], 0, 1, 10, 0, 4, 0, 0, 0, 0, 0, [0, -1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 36300.31998388904, -212.12282118631998, 167.6515268497169, 1], 3, 20, 20, 8.80000000000291, false, "Circle", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 10, 10, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 324.2271826086958, -614.5869582319652, 0, 1], 0, 1, 10, 0, 4, 0, 0, 0, 0, 0, [0, -1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 36300.31998388904, -142.12282118631992, 167.6515268497169, 1], 3, 20, 20, 8.80000000000291, false, "Circle", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 10, 10, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 324.2271826086958, -614.5869582319652, 0, 1], 0, 1, 10, 0, 3, 0, 0, 0, 0, 0, [0, -1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 36300.31998388904, -72.12282118631992, 167.6515268497169, 1], 3, 0, 0, 0, 0, 0, 9, 1, "立板", "主卧", "下柜", "", "", "", 0, 0, "三合一", 2, 0, "1", "1", "1", "1", "", "", "", 4, "三合一", "三合一", "三合一", "三合一", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, "HardwareCompositeEntity", 1, 8, 2, 9088, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 34201.81915615466, -362.1228211863199, -606.142083904032, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 36309.119983889046, -362.1228211863199, 117.6515268497169, 1], 0, 5, "ExtrudeHole", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 2107.3008277343833, 350, 743.7936107537489, 1], 0, 0, true, [1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 2102.3008277343833, 450, 743.7936107537489, 1], 0, 5, 350, 0, 0, 2, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1783.8728901982536, -737.2996364928794, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1783.8728901982536, -737.2996364928794, 0, 1], 0, 2, 4, [1783.8728901982536, 737.2996364928794], 0, [1803.8728901982536, 737.2996364928794], 0, [1803.8728901982536, 817.2996364928794], 0, [1783.8728901982536, 817.2996364928794], 0, true, 3, true, "ExtrudeHole", 8, 2, 0, false, 0, 7, 0, [0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 2107.500827734383, 290, 773.7936107537489, 1], 0, 0, true, [0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 2107.500827734383, 290, 773.7936107537489, 1], 0, 5, 9, 0, 0, 2, "Circle", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 10, 10, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 324.2271826086958, -614.5869582319652, 0, 1], 0, 1, 10, 3, true, "ExtrudeHole", 8, 2, 0, false, 0, 7, 0, [0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 2107.500827734383, 220, 773.7936107537489, 1], 0, 0, true, [0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 2107.500827734383, 220, 773.7936107537489, 1], 0, 5, 9, 0, 0, 2, "Circle", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 10, 10, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 324.2271826086958, -614.5869582319652, 0, 1], 0, 1, 10, 4, true, "ExtrudeHole", 8, 2, 0, false, 0, 7, 0, [0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 2107.500827734383, 149.99999999999994, 773.7936107537489, 1], 0, 0, true, [0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 2107.500827734383, 149.99999999999994, 773.7936107537489, 1], 0, 5, 9, 0, 0, 2, "Circle", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 10, 10, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 324.2271826086958, -614.5869582319652, 0, 1], 0, 1, 10, 4, true, "ExtrudeHole", 8, 2, 0, false, 0, 7, 0, [0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 2107.500827734383, 80, 773.7936107537489, 1], 0, 0, true, [0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 2107.500827734383, 80, 773.7936107537489, 1], 0, 5, 9, 0, 0, 2, "Circle", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 10, 10, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 324.2271826086958, -614.5869582319652, 0, 1], 0, 1, 10, 4, true, 3, "无类型", false, false, "", "", "铰链", "主卧", "下柜", "L*W*H*100", "W*0.001*15", "X-1", "晨丰", "晨丰", "{W}*{L}", "{W*0.001}", "", "米", 0, true, 1, 0], "basePt": { "x": 36291.119983889046, "y": -362.1228211863199, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] }; + Check(data, 0); + }); }); diff --git a/src/Add-on/DrawDrilling/DrawDrillingTool.ts b/src/Add-on/DrawDrilling/DrawDrillingTool.ts index 5851a6d51..e46d6f948 100644 --- a/src/Add-on/DrawDrilling/DrawDrillingTool.ts +++ b/src/Add-on/DrawDrilling/DrawDrillingTool.ts @@ -238,7 +238,7 @@ export class DrawDrillingTool extends Singleton } else { - console.error(key + "没缓存"); + console.error(key + "没缓存,可能已经被删除"); return false; } if (!ens || ens.length === 0) return false; diff --git a/src/Add-on/interfere.ts b/src/Add-on/interfere.ts index f7fcf9863..4b9bd7cab 100644 --- a/src/Add-on/interfere.ts +++ b/src/Add-on/interfere.ts @@ -8,19 +8,18 @@ import { PromptStatus } from '../Editor/PromptResult'; import { userConfig } from '../Editor/UserConfig'; import { RenderType } from '../GraphicsSystem/RenderType'; import { InterfereModal } from '../UI/Components/Modal/InterfereModal'; -import { ExtrudeHole } from './../DatabaseServices/3DSolid/ExtrudeHole'; import { SweepSolid } from './../DatabaseServices/3DSolid/SweepSolid'; import { Command } from './../Editor/CommandMachine'; import { AppToaster } from './../UI/Components/Toaster'; - -//| CylinderHole | ExtrudeHole +import { HardwareCompositeEntity } from '../DatabaseServices/Hardware/HardwareCompositeEntity'; +import { ExtrudeHole } from '../DatabaseServices/3DSolid/ExtrudeHole'; export class Interfere implements Command { async exec() { const Filter = { - filterTypes: [ExtrudeHole, ExtrudeSolid, SweepSolid] + filterTypes: [HardwareCompositeEntity, ExtrudeSolid, SweepSolid] }; let enRes = await app.Editor.GetSelection({ @@ -30,8 +29,9 @@ export class Interfere implements Command if (enRes.Status === PromptStatus.Cancel) return; - let ens = enRes.SelectSet.SelectEntityList as Solid3D[]; - checkInterfereTool.Check(ens); + let selectEnts = enRes.SelectSet.SelectEntityList as (HardwareCompositeEntity | ExtrudeSolid | SweepSolid)[]; + + checkInterfereTool.Check(selectEnts); let objMap = checkInterfereTool.objMap; if (objMap.size === 0) diff --git a/src/Common/InterfereUtil.ts b/src/Common/InterfereUtil.ts index e5043bd4d..74c2e74c6 100644 --- a/src/Common/InterfereUtil.ts +++ b/src/Common/InterfereUtil.ts @@ -11,6 +11,8 @@ import { Box3Ext } from "../Geometry/Box"; import { ColorMaterial } from "./ColorPalette"; import { TemplateWineRackRecord } from "../DatabaseServices/Template/ProgramTempate/TemplateWineRackRecord"; import { TemplateLatticeRecord } from "../DatabaseServices/Template/ProgramTempate/TemplateLatticeRecord"; +import { Board } from "../DatabaseServices/Entity/Board"; +import { HardwareCompositeEntity } from "../DatabaseServices/Hardware/HardwareCompositeEntity"; export type Solid3D = ExtrudeSolid | SweepSolid | ExtrudeHole; @@ -18,8 +20,25 @@ export class CheckInterfereTool { entitySet: Set = new Set(); objMap: Map = new Map(); - Check(ens: Solid3D[]) + GetEntitys(selectEnts: (HardwareCompositeEntity | ExtrudeSolid | SweepSolid)[]) { + let ens: Solid3D[] = []; + for (let en of selectEnts) + { + if (en instanceof HardwareCompositeEntity) + { + let es = en.GetAllEntity(false, e => e instanceof ExtrudeHole || e instanceof ExtrudeSolid || e instanceof SweepSolid) as Solid3D[]; + es.forEach(e => e.TempData = { Id: en.Id }); + ens.push(...es); + } + else + ens.push(en); + } + return ens; + } + Check(selectEnts: (HardwareCompositeEntity | ExtrudeSolid | SweepSolid)[]) + { + let ens = this.GetEntitys(selectEnts); let entitySet = this.entitySet; let objMap = this.objMap; entitySet.clear(); @@ -43,6 +62,23 @@ export class CheckInterfereTool for (let j = i + 1; j < ens.length; j++) { let e2 = ens[j]; + + if (e2.TempData && e2.TempData.Id === e1.TempData?.Id) continue; + + if (e1 instanceof Board) + { + let id = e2.Id ?? e2.TempData.Id; + if (e1.RelevanceMeats.includes(id) || e1.RelevanceKnifs.includes(id) || e1.RelativeHardware.includes(id)) continue; + } + if (!e1.Id && e1.TempData?.Id) + { + let orgEn = e1.TempData.Id.Object; + if (orgEn instanceof HardwareCompositeEntity) + { + if (orgEn.RelevanceBoards.includes(e2.Id)) continue; + } + } + if (e2.Template && (e2.Template.Object instanceof TemplateWineRackRecord || e2.Template.Object instanceof TemplateLatticeRecord)) continue; if (!obb1.intersectsOBB(e2.OBB)) @@ -148,6 +184,8 @@ export class CheckInterfereTool { if (en instanceof ExtrudeSolid) { + if (!en.Id) + en.CheckContourCurve(); return en.CSG; } else diff --git a/src/DatabaseServices/3DSolid/ExtrudeHole.ts b/src/DatabaseServices/3DSolid/ExtrudeHole.ts index 2b2d3c2f8..6d564e3b4 100644 --- a/src/DatabaseServices/3DSolid/ExtrudeHole.ts +++ b/src/DatabaseServices/3DSolid/ExtrudeHole.ts @@ -173,6 +173,7 @@ export class ExtrudeHole extends Hole private GeneralMeshGeometry() { let extrudeSettings: ExtrudeGeometryOptions = { + curveSegments: 4, //保持和板件圆孔的段数一样 steps: 1, bevelEnabled: false, depth: this.Height,