|
|
|
@ -5,6 +5,7 @@ import { app } from "../../../ApplicationServices/Application";
|
|
|
|
|
import { EBoardKeyList } from "../../../Common/BoardKeyList";
|
|
|
|
|
import { Solid3D } from "../../../Common/InterfereUtil";
|
|
|
|
|
import { DuplicateRecordCloning } from "../../../Common/Status";
|
|
|
|
|
import { safeEval } from "../../../Common/eval";
|
|
|
|
|
import { ExtrudeHole } from "../../../DatabaseServices/3DSolid/ExtrudeHole";
|
|
|
|
|
import { SweepSolid } from "../../../DatabaseServices/3DSolid/SweepSolid";
|
|
|
|
|
import { CADObject } from "../../../DatabaseServices/CADObject";
|
|
|
|
@ -19,6 +20,7 @@ import { TemplateSizeBoard } from "../../../DatabaseServices/Template/ProgramTem
|
|
|
|
|
import { TemplateVisualSpace } from "../../../DatabaseServices/Template/ProgramTempate/TemplateVisualSpace";
|
|
|
|
|
import { GetOnlineTemplate } from "../../../DatabaseServices/Template/TempateUtils";
|
|
|
|
|
import { TemplateRecord } from "../../../DatabaseServices/Template/TemplateRecord";
|
|
|
|
|
import { userConfig } from "../../../Editor/UserConfig";
|
|
|
|
|
import { Box3Ext } from "../../../Geometry/Box";
|
|
|
|
|
import { equaln, isParallelTo } from "../../../Geometry/GeUtils";
|
|
|
|
|
import { OBB } from "../../../Geometry/OBB/obb";
|
|
|
|
@ -39,6 +41,8 @@ import { IsDoor, IsHandle, IsHinge } from "../../HideSelect/HideSelectUtils";
|
|
|
|
|
* */
|
|
|
|
|
const MoveNum: number = 8;
|
|
|
|
|
|
|
|
|
|
export type HingeType = "全盖铰链" | "半盖铰链" | "无盖铰链";
|
|
|
|
|
|
|
|
|
|
export class DrawDoorTool
|
|
|
|
|
{
|
|
|
|
|
/**id模板对应表*/
|
|
|
|
@ -333,7 +337,8 @@ export class DrawDoorTool
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
protected GetHingeTemp(info: IDoorInfo, door: TemplateRecord)
|
|
|
|
|
// hingeTypes[0]绑定左开门或上开门 hingeTypes[1]绑定右开门或下开门
|
|
|
|
|
protected GetHingeTemp(info: IDoorInfo, door: TemplateRecord, hingeTypes: HingeType[])
|
|
|
|
|
{
|
|
|
|
|
if (info.tempInfo.hingeTemp && info.tempInfo.hingeTemp.id && this._idTempMap.has(info.tempInfo.hingeTemp.id))
|
|
|
|
|
{
|
|
|
|
@ -344,6 +349,8 @@ export class DrawDoorTool
|
|
|
|
|
let count = this.option.hingeCount;
|
|
|
|
|
const isLROpen = info.openDir === DoorOpenDir.Left || info.openDir === DoorOpenDir.Right;
|
|
|
|
|
|
|
|
|
|
let hingeName = (info.openDir === DoorOpenDir.Left || info.openDir === DoorOpenDir.Top) ? hingeTypes[0] : hingeTypes[1];
|
|
|
|
|
|
|
|
|
|
let zExpr = "";
|
|
|
|
|
let jlsjExpr = "___JLSJ";
|
|
|
|
|
let jlxjExpr = "___JLXJ";
|
|
|
|
@ -401,8 +408,12 @@ export class DrawDoorTool
|
|
|
|
|
|
|
|
|
|
for (let objId of temp.Objects)
|
|
|
|
|
{
|
|
|
|
|
if (objId.Object instanceof HardwareCompositeEntity)
|
|
|
|
|
let hinge = objId.Object;
|
|
|
|
|
if (hinge instanceof HardwareCompositeEntity)
|
|
|
|
|
{
|
|
|
|
|
hinge.HardwareOption.name = hingeName;
|
|
|
|
|
this.hingeSet.add(objId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
temp.HParam.expr = "0";
|
|
|
|
|
temp.LParam.expr = "0";
|
|
|
|
@ -658,7 +669,7 @@ export class DrawDoorTool
|
|
|
|
|
{
|
|
|
|
|
parseTypedHinges.add(ironware.Id);
|
|
|
|
|
//设置铰链类型
|
|
|
|
|
SetHingeType(br, ironware);
|
|
|
|
|
// SetHingeType(br, ironware);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (isParallelTo(ironware.Normal, br.Normal) || !isDoor)
|
|
|
|
@ -743,11 +754,11 @@ export class DrawDoorTool
|
|
|
|
|
intent: Intent.DANGER,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
SetNoPareTypeHigneName(parseTypedHinges, this.hingeSet);
|
|
|
|
|
// SetNoPareTypeHigneName(parseTypedHinges, this.hingeSet);
|
|
|
|
|
return needUpdate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getSpaceAllBoards(templateEntitys: Entity[])
|
|
|
|
|
getSpaceAllEnts(templateEntitys: Entity[])
|
|
|
|
|
{
|
|
|
|
|
let box = this.spaceParse.SpaceBox.clone().applyMatrix4(this.spaceParse.SpaceOCS);
|
|
|
|
|
|
|
|
|
@ -987,6 +998,25 @@ export class DrawDoorTool
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取铰链类型
|
|
|
|
|
* @param thickness 与空间X向量平行相交板的厚度
|
|
|
|
|
* @param doorExtend 门板延申距离
|
|
|
|
|
* @returns HingeType
|
|
|
|
|
*/
|
|
|
|
|
protected GetHingeType(thickness: number, doorExtend: number): HingeType
|
|
|
|
|
{
|
|
|
|
|
if (!thickness) return "无盖铰链";
|
|
|
|
|
let hingeLidRule = userConfig.hingeLidRule;
|
|
|
|
|
let noLid = safeEval(hingeLidRule.noLid, { BH: thickness });
|
|
|
|
|
let allLid = safeEval(hingeLidRule.allLid, { BH: thickness });
|
|
|
|
|
if (doorExtend - allLid > -1e-3)
|
|
|
|
|
return "全盖铰链";
|
|
|
|
|
else if (doorExtend - noLid < 1e-3)
|
|
|
|
|
return "无盖铰链";
|
|
|
|
|
else
|
|
|
|
|
return "半盖铰链";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -1009,52 +1039,30 @@ export function SetNoPareTypeHigneName(parseTypedHinges: Set<ObjectId<CADObject>
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置铰链的类型(全盖 无盖 半盖)
|
|
|
|
|
* @param br
|
|
|
|
|
* @param ironware
|
|
|
|
|
* @returns void
|
|
|
|
|
*/
|
|
|
|
|
export function SetHingeType(br: Board, ironware: HardwareCompositeEntity): void
|
|
|
|
|
{
|
|
|
|
|
let temp = ironware.Template.Object as TemplateRecord;
|
|
|
|
|
if (temp.AllEntitys.length > 1 && !ironware.HardwareOption.name.includes("铰链")) return;
|
|
|
|
|
let moveValue = temp.GetParam("MOVE")?.value as number;
|
|
|
|
|
let r = temp.GetParam("R")?.value as number;
|
|
|
|
|
if (moveValue === undefined || r === undefined) return;
|
|
|
|
|
if (moveValue < r - br.Thickness / 2 - 1e-3)
|
|
|
|
|
ironware.HardwareOption.name = "全盖铰链";
|
|
|
|
|
else if (moveValue > r - 1e-3)
|
|
|
|
|
ironware.HardwareOption.name = "无盖铰链";
|
|
|
|
|
else
|
|
|
|
|
ironware.HardwareOption.name = "半盖铰链";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//OBB增加10容差
|
|
|
|
|
export function getFuzzOBB(obb: OBB, normalizeZ: Vector3, isParallel: boolean, parentIntersectEntOCS: Matrix4, isExtrudeSolid: boolean): OBB
|
|
|
|
|
export function getFuzzOBB(obb: OBB, normalizeZ: Vector3, parentIntersectEntOCS: Matrix4, isExtrudeSolid: boolean): OBB
|
|
|
|
|
{
|
|
|
|
|
let addSize = isParallel ? new Vector3(0, 0, 10) : new Vector3(-0.1, -0.1, 10);
|
|
|
|
|
let addSize = new Vector3(-0.1, -0.1, 10);
|
|
|
|
|
if (!isExtrudeSolid)
|
|
|
|
|
addSize.applyMatrix4(parentIntersectEntOCS.clone().setPosition(0, 0, 0));
|
|
|
|
|
let halfSizes = obb.halfSizes.add(addSize.applyMatrix4((obb.ocs).clone().setPosition(0, 0, 0)));
|
|
|
|
|
let ocs = obb.ocs.clone();
|
|
|
|
|
let vz = normalizeZ.clone().multiplyScalar(10);
|
|
|
|
|
|
|
|
|
|
if (!isParallel)
|
|
|
|
|
{
|
|
|
|
|
const XNormal = new Vector3().setFromMatrixColumn(ocs, 0).multiplyScalar(0.1);
|
|
|
|
|
const YNormal = new Vector3().setFromMatrixColumn(ocs, 1).multiplyScalar(0.1);
|
|
|
|
|
const ZNormal = new Vector3().setFromMatrixColumn(ocs, 2).multiplyScalar(0.1);
|
|
|
|
|
ocs.elements[12] += XNormal.x;
|
|
|
|
|
ocs.elements[13] += XNormal.y;
|
|
|
|
|
ocs.elements[14] += XNormal.z;
|
|
|
|
|
ocs.elements[12] += YNormal.x;
|
|
|
|
|
ocs.elements[13] += YNormal.y;
|
|
|
|
|
ocs.elements[14] += YNormal.z;
|
|
|
|
|
ocs.elements[12] += ZNormal.x;
|
|
|
|
|
ocs.elements[13] += ZNormal.y;
|
|
|
|
|
ocs.elements[14] += ZNormal.z;
|
|
|
|
|
}
|
|
|
|
|
const XNormal = new Vector3().setFromMatrixColumn(ocs, 0).multiplyScalar(0.1);
|
|
|
|
|
const YNormal = new Vector3().setFromMatrixColumn(ocs, 1).multiplyScalar(0.1);
|
|
|
|
|
const ZNormal = new Vector3().setFromMatrixColumn(ocs, 2).multiplyScalar(0.1);
|
|
|
|
|
ocs.elements[12] += XNormal.x;
|
|
|
|
|
ocs.elements[13] += XNormal.y;
|
|
|
|
|
ocs.elements[14] += XNormal.z;
|
|
|
|
|
|
|
|
|
|
ocs.elements[12] += YNormal.x;
|
|
|
|
|
ocs.elements[13] += YNormal.y;
|
|
|
|
|
ocs.elements[14] += YNormal.z;
|
|
|
|
|
|
|
|
|
|
ocs.elements[12] += ZNormal.x;
|
|
|
|
|
ocs.elements[13] += ZNormal.y;
|
|
|
|
|
ocs.elements[14] += ZNormal.z;
|
|
|
|
|
|
|
|
|
|
ocs.elements[12] -= Math.abs(vz.x);
|
|
|
|
|
ocs.elements[13] -= Math.abs(vz.y);
|
|
|
|
@ -1069,7 +1077,7 @@ export function getFuzzOBB(obb: OBB, normalizeZ: Vector3, isParallel: boolean, p
|
|
|
|
|
* @param ZNormal 铰链Z向量方向
|
|
|
|
|
* @param translate checkEnts偏移
|
|
|
|
|
*/
|
|
|
|
|
export function IsBoxAndEntitysIntersect(checkEnts: Entity[], intersectEnts: Entity[], ZNormal: Vector3, translate?: Vector3, parentIntersectEntOCS?: Matrix4, parentcheckEntOCS?: Matrix4, isParallel?: boolean): boolean
|
|
|
|
|
export function IsBoxAndEntitysIntersect(checkEnts: Entity[], intersectEnts: Entity[], ZNormal: Vector3, translate?: Vector3, parentIntersectEntOCS?: Matrix4, parentcheckEntOCS?: Matrix4): boolean
|
|
|
|
|
{
|
|
|
|
|
for (let checkEnt of checkEnts)
|
|
|
|
|
if (checkEnt instanceof HardwareCompositeEntity)
|
|
|
|
@ -1078,8 +1086,7 @@ export function IsBoxAndEntitysIntersect(checkEnts: Entity[], intersectEnts: Ent
|
|
|
|
|
if (parentcheckEntOCS) ocs = new Matrix4().multiplyMatrices(parentcheckEntOCS, ocs);
|
|
|
|
|
let ents = checkEnt.Entitys.filter(ent => ent instanceof ExtrudeHole || ent instanceof SweepSolid || ent instanceof ExtrudeSolid || ent instanceof HardwareCompositeEntity);
|
|
|
|
|
|
|
|
|
|
//没有碰撞不return 继续检测其他checkEnt
|
|
|
|
|
if (IsBoxAndEntitysIntersect(ents, intersectEnts, ZNormal, translate, undefined, ocs, isParallel))
|
|
|
|
|
if (IsBoxAndEntitysIntersect(ents, intersectEnts, ZNormal, translate, undefined, ocs))
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -1094,7 +1101,7 @@ export function IsBoxAndEntitysIntersect(checkEnts: Entity[], intersectEnts: Ent
|
|
|
|
|
let ocs = intersectEnt.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, translate, ocs, undefined, isParallelTo(new Vector3().setFromMatrixColumn(ocs, 0), newCheckEnt.Normal)))
|
|
|
|
|
if (IsBoxAndEntitysIntersect([newCheckEnt], ents, ZNormal, translate, ocs))
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -1103,7 +1110,7 @@ export function IsBoxAndEntitysIntersect(checkEnts: Entity[], intersectEnts: Ent
|
|
|
|
|
if (parentIntersectEntOCS) ent.ApplyMatrix(parentIntersectEntOCS);
|
|
|
|
|
if (translate) ent.ApplyMatrix(new Matrix4().setPosition(translate));
|
|
|
|
|
|
|
|
|
|
let obb = getFuzzOBB(newCheckEnt.OBB, ZNormal, isParallel, parentIntersectEntOCS, newCheckEnt instanceof ExtrudeSolid);
|
|
|
|
|
let obb = getFuzzOBB(newCheckEnt.OBB, ZNormal, parentIntersectEntOCS, newCheckEnt instanceof ExtrudeSolid);
|
|
|
|
|
if (obb.intersectsOBB(ent.OBB))
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|