diff --git a/src/Add-on/DrawBoard/DrawDoorDrawer/DrawDoorTool.ts b/src/Add-on/DrawBoard/DrawDoorDrawer/DrawDoorTool.ts index e92a38f11..a32388e2a 100644 --- a/src/Add-on/DrawBoard/DrawDoorDrawer/DrawDoorTool.ts +++ b/src/Add-on/DrawBoard/DrawDoorDrawer/DrawDoorTool.ts @@ -609,13 +609,16 @@ export class DrawDoorTool const isHandle = IsHandle(ironware); const isHinge = IsHinge(ironware); - const xNormal = new Vector3().setFromMatrixColumn(ironware.OCSNoClone, 0); + const XNormal = new Vector3().setFromMatrixColumn(ironware.OCSNoClone, 0); const ZNormal = new Vector3().setFromMatrixColumn(ironware.OCSNoClone, 2); for (let otherEnt of allOtherEntitys) { const isDoor = IsDoor(otherEnt); + //是把手时 不是门板跳过 + if (isHandle && !isDoor) continue; + if (otherEnt instanceof Board) { let br = otherEnt as Board; @@ -645,7 +648,7 @@ export class DrawDoorTool //铰链避让 if (this.hingeSet.has(ironware.Id))//如果是铰链 { - if (isParallelTo(xNormal, br.Normal)) + if (isParallelTo(XNormal, br.Normal)) { if (!parseTypedHinges.has(ironware.Id)) { @@ -1197,27 +1200,39 @@ export function IsBoxAndEntitysIntersect(checkEnts: Entity[], intersectEnts: Ent } else { - let newCheckEnt = checkEnt.Clone() as Solid3D; - if (parentcheckEntOCS) newCheckEnt.ApplyMatrix(parentcheckEntOCS); + let newCheckEnt = checkEnt as Solid3D; + if (parentcheckEntOCS) + { + newCheckEnt = newCheckEnt.Clone(); + newCheckEnt.ApplyMatrix(parentcheckEntOCS); + } + + let backParentIntersectEntOCS = new Matrix4().getInverse(parentIntersectEntOCS ?? new Matrix4); + let backTranslate = new Matrix4().setPosition(translate?.clone()?.negate() ?? new Vector3); for (let intersectEnt of intersectEnts) { if (intersectEnt instanceof HardwareCompositeEntity) { let ocs = intersectEnt.OCS; - if (parentIntersectEntOCS) ocs = new Matrix4().multiplyMatrices(parentIntersectEntOCS, ocs); + if (parentIntersectEntOCS) + ocs = new Matrix4().multiplyMatrices(parentIntersectEntOCS, ocs); let ents = intersectEnt.Entitys.filter(ent => ent instanceof ExtrudeHole || ent instanceof SweepSolid || ent instanceof ExtrudeSolid || ent instanceof HardwareCompositeEntity); if (IsBoxAndEntitysIntersect([newCheckEnt], ents, ZNormal, isDoor, translate, ocs)) return true; } else { - let ent = intersectEnt.Clone() as Solid3D; + let ent = intersectEnt as Solid3D; if (parentIntersectEntOCS) ent.ApplyMatrix(parentIntersectEntOCS); if (translate) ent.ApplyMatrix(new Matrix4().setPosition(translate)); + let entOBB = ent.OBB; + + if (translate) ent.ApplyMatrix(backTranslate); + if (parentIntersectEntOCS) ent.ApplyMatrix(backParentIntersectEntOCS); let obb = getFuzzOBB(newCheckEnt.OBB, ZNormal, parentIntersectEntOCS, newCheckEnt instanceof ExtrudeSolid, isDoor); - if (obb.intersectsOBB(ent.OBB)) + if (obb.intersectsOBB(entOBB)) return true; } }