|
|
@ -39,17 +39,17 @@ export class Command_OpenCabinet implements Command
|
|
|
|
});
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
let OK = false;
|
|
|
|
let canOpen = false;
|
|
|
|
let DrawerEns: Entity[] = [];
|
|
|
|
let drawerEns: Entity[] = [];
|
|
|
|
let DoorEns: Entity[] = [];
|
|
|
|
let doorEns: Entity[] = [];
|
|
|
|
let DoorGroups: Entity[][] = [];
|
|
|
|
let doorGroups: Entity[][] = [];
|
|
|
|
|
|
|
|
|
|
|
|
while (!OK)
|
|
|
|
while (!canOpen)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (this._MoveDrawerObjs.length > 0 || this._MoveDoorObjs.length > 0) //判断之前是否开过门板、抽屉
|
|
|
|
if (this._MoveDrawerObjs.length > 0 || this._MoveDoorObjs.length > 0) //判断之前是否开过门板、抽屉
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Log("关闭门板、抽屉");
|
|
|
|
Log("关闭门板、抽屉");
|
|
|
|
OK = true;
|
|
|
|
canOpen = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -71,24 +71,24 @@ export class Command_OpenCabinet implements Command
|
|
|
|
let holes: Entity[] = [];
|
|
|
|
let holes: Entity[] = [];
|
|
|
|
for (let ent of ss.SelectSet.SelectEntityList)
|
|
|
|
for (let ent of ss.SelectSet.SelectEntityList)
|
|
|
|
if (IsDoor(ent) && ent.Template)
|
|
|
|
if (IsDoor(ent) && ent.Template)
|
|
|
|
DoorEns.push(ent);
|
|
|
|
doorEns.push(ent);
|
|
|
|
else if (IsHandle(ent))
|
|
|
|
else if (IsHandle(ent))
|
|
|
|
handles.push(ent);
|
|
|
|
handles.push(ent);
|
|
|
|
else if (IsDrawer(ent) || IsLattice(ent))
|
|
|
|
else if (IsDrawer(ent) || IsLattice(ent))
|
|
|
|
DrawerEns.push(ent);
|
|
|
|
drawerEns.push(ent);
|
|
|
|
else if (ent instanceof Hole)
|
|
|
|
else if (ent instanceof Hole)
|
|
|
|
holes.push(ent);
|
|
|
|
holes.push(ent);
|
|
|
|
|
|
|
|
|
|
|
|
//拉手、排钻 绑定门板 获得门板组 二维刀路
|
|
|
|
//拉手、排钻 绑定门板 获得门板组 二维刀路
|
|
|
|
this.GetDoorGroups(DoorEns, handles, holes, DoorGroups);
|
|
|
|
this.GetDoorGroups(doorEns, handles, holes, doorGroups);
|
|
|
|
|
|
|
|
|
|
|
|
//门板组 设置旋转方向 旋转点
|
|
|
|
//门板组 设置旋转方向 旋转点
|
|
|
|
this.SetDoorGroupRotate(DoorGroups);
|
|
|
|
this.SetDoorGroupRotate(doorGroups);
|
|
|
|
|
|
|
|
|
|
|
|
let boxDrawerMap: Map<Box3, Entity[]> = new Map();
|
|
|
|
let boxDrawerMap: Map<Box3, Entity[]> = new Map();
|
|
|
|
|
|
|
|
|
|
|
|
//拉手、排钻 绑定抽屉 获取抽屉组
|
|
|
|
//拉手、排钻 绑定抽屉 获取抽屉组
|
|
|
|
this.GetDrawerMap(DrawerEns, handles, holes, boxDrawerMap);
|
|
|
|
this.GetDrawerMap(drawerEns, handles, holes, boxDrawerMap);
|
|
|
|
|
|
|
|
|
|
|
|
//抽屉组 设置方向
|
|
|
|
//抽屉组 设置方向
|
|
|
|
this.SetDrawerDirection(boxDrawerMap);
|
|
|
|
this.SetDrawerDirection(boxDrawerMap);
|
|
|
@ -96,10 +96,10 @@ export class Command_OpenCabinet implements Command
|
|
|
|
|
|
|
|
|
|
|
|
if (this._MoveDoorObjs.length === 0 && this._MoveDrawerObjs.length === 0) return;
|
|
|
|
if (this._MoveDoorObjs.length === 0 && this._MoveDrawerObjs.length === 0) return;
|
|
|
|
|
|
|
|
|
|
|
|
this.DoMove(OK); //动起来
|
|
|
|
this.DoMove(canOpen); //动起来
|
|
|
|
|
|
|
|
|
|
|
|
//开启门板抽屉后,限制使用其他功能,
|
|
|
|
//开启门板抽屉后,限制使用其他功能,
|
|
|
|
while (!OK)
|
|
|
|
while (!canOpen)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
userConfig.isOpenCabinet = true;
|
|
|
|
userConfig.isOpenCabinet = true;
|
|
|
|
AppToaster.show({
|
|
|
|
AppToaster.show({
|
|
|
@ -134,11 +134,11 @@ export class Command_OpenCabinet implements Command
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private GetDrawerMap(DrawerEns: Entity[], handles: Entity[], holes: Entity[], boxDrawerMap: Map<Box3, Entity[]>)
|
|
|
|
private GetDrawerMap(drawerEns: Entity[], handles: Entity[], holes: Entity[], boxDrawerMap: Map<Box3, Entity[]>)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for (let i = 0; i < DrawerEns.length; i++)
|
|
|
|
for (let i = 0; i < drawerEns.length; i++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let ens = DrawerEns[i].Template.Object as TemplateRecord;
|
|
|
|
let ens = drawerEns[i].Template.Object as TemplateRecord;
|
|
|
|
while (ens.Name !== "抽屉空间" && ens.Name !== "格子抽")
|
|
|
|
while (ens.Name !== "抽屉空间" && ens.Name !== "格子抽")
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (ens.Parent)
|
|
|
|
if (ens.Parent)
|
|
|
@ -154,8 +154,8 @@ export class Command_OpenCabinet implements Command
|
|
|
|
for (let en of ens.AllEntitys)
|
|
|
|
for (let en of ens.AllEntitys)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//删除重复节省资源
|
|
|
|
//删除重复节省资源
|
|
|
|
if (DrawerEns.includes(en) && DrawerEns[i] !== en)
|
|
|
|
if (drawerEns.includes(en) && drawerEns[i] !== en)
|
|
|
|
DrawerEns.splice(DrawerEns.indexOf(en), 1);
|
|
|
|
drawerEns.splice(drawerEns.indexOf(en), 1);
|
|
|
|
else if (handles.includes(en))
|
|
|
|
else if (handles.includes(en))
|
|
|
|
handles.splice(handles.indexOf(en), 1);
|
|
|
|
handles.splice(handles.indexOf(en), 1);
|
|
|
|
else if (holes.includes(en))
|
|
|
|
else if (holes.includes(en))
|
|
|
@ -196,17 +196,17 @@ export class Command_OpenCabinet implements Command
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private GetDoorGroups(DoorEns: Entity[], handles: Entity[], holes: Entity[], DoorGroups: Entity[][])
|
|
|
|
private GetDoorGroups(doorEns: Entity[], handles: Entity[], holes: Entity[], doorGroups: Entity[][])
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for (let i = 0; i < DoorEns.length; i++)
|
|
|
|
for (let i = 0; i < doorEns.length; i++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let ens = DoorEns[i].Template.Object as TemplateRecord;
|
|
|
|
let ens = doorEns[i].Template.Object as TemplateRecord;
|
|
|
|
let doorGroup: Entity[] = ens.Entitys;
|
|
|
|
let doorGroup: Entity[] = ens.Entitys;
|
|
|
|
for (let en of ens.Entitys)
|
|
|
|
for (let en of ens.Entitys)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//删除重复节省资源
|
|
|
|
//删除重复节省资源
|
|
|
|
if (DoorEns.includes(en) && DoorEns[i] !== en)
|
|
|
|
if (doorEns.includes(en) && doorEns[i] !== en)
|
|
|
|
DoorEns.splice(DoorEns.indexOf(en), 1);
|
|
|
|
doorEns.splice(doorEns.indexOf(en), 1);
|
|
|
|
else if (handles.includes(en))
|
|
|
|
else if (handles.includes(en))
|
|
|
|
handles.splice(handles.indexOf(en), 1);
|
|
|
|
handles.splice(handles.indexOf(en), 1);
|
|
|
|
else if (holes.includes(en))
|
|
|
|
else if (holes.includes(en))
|
|
|
@ -219,7 +219,7 @@ export class Command_OpenCabinet implements Command
|
|
|
|
//手动添加的把手跟随门板
|
|
|
|
//手动添加的把手跟随门板
|
|
|
|
arrayRemoveIf(handles, (handle) => IsEntityBelongToDoor(enBox, ocsInv, doorGroup, handle));
|
|
|
|
arrayRemoveIf(handles, (handle) => IsEntityBelongToDoor(enBox, ocsInv, doorGroup, handle));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
DoorGroups.push(doorGroup);
|
|
|
|
doorGroups.push(doorGroup);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function IsEntityBelongToDoor(enBox: Box3Ext, ocsInv: Matrix4, doorGroup: Entity[], en: Entity)
|
|
|
|
function IsEntityBelongToDoor(enBox: Box3Ext, ocsInv: Matrix4, doorGroup: Entity[], en: Entity)
|
|
|
@ -234,9 +234,9 @@ export class Command_OpenCabinet implements Command
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private DoMove(OK: boolean)
|
|
|
|
private DoMove(canOpen: boolean)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let dis = OK ? -1 : 1;
|
|
|
|
let dis = canOpen ? -1 : 1;
|
|
|
|
this._Timer = setInterval(() =>
|
|
|
|
this._Timer = setInterval(() =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (this._Count === MOVECOUNT)
|
|
|
|
if (this._Count === MOVECOUNT)
|
|
|
@ -244,7 +244,7 @@ export class Command_OpenCabinet implements Command
|
|
|
|
clearInterval(this._Timer);
|
|
|
|
clearInterval(this._Timer);
|
|
|
|
this._Timer = undefined;
|
|
|
|
this._Timer = undefined;
|
|
|
|
this._Count = 0;
|
|
|
|
this._Count = 0;
|
|
|
|
if (OK)
|
|
|
|
if (canOpen)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
this._MoveDoorObjs.length = 0;
|
|
|
|
this._MoveDoorObjs.length = 0;
|
|
|
|
this._MoveDrawerObjs.length = 0;
|
|
|
|
this._MoveDrawerObjs.length = 0;
|
|
|
@ -302,19 +302,19 @@ export class Command_OpenCabinet implements Command
|
|
|
|
obj.updateMatrixWorld(true);
|
|
|
|
obj.updateMatrixWorld(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private SetDoorGroupRotate(DoorGroups: Entity[][])
|
|
|
|
private SetDoorGroupRotate(doorGroups: Entity[][])
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let boxDoorMap: Map<Box3, Entity[]> = new Map();
|
|
|
|
let boxDoorMap: Map<Box3, Entity[]> = new Map();
|
|
|
|
if (DoorGroups.length > 0)
|
|
|
|
if (doorGroups.length > 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for (let i = 0; i < DoorGroups.length; i++)
|
|
|
|
for (let i = 0; i < doorGroups.length; i++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let osc = (DoorGroups[i][0] as Entity).SpaceOCSInv;
|
|
|
|
let osc = (doorGroups[i][0] as Entity).SpaceOCSInv;
|
|
|
|
let brBox = new Box3;
|
|
|
|
let brBox = new Box3;
|
|
|
|
for (let en of DoorGroups[i])
|
|
|
|
for (let en of doorGroups[i])
|
|
|
|
if ((!IsHandle(en) || en instanceof Hole) && !(en instanceof Curve)) //门把手不记录box 影响旋转点 但跟随旋转 (AllEntity中包含曲线类型需要过滤)
|
|
|
|
if ((!IsHandle(en) || en instanceof Hole) && !(en instanceof Curve)) //门把手不记录box 影响旋转点 但跟随旋转 (AllEntity中包含曲线类型需要过滤)
|
|
|
|
brBox.union((en as Entity).GetBoundingBoxInMtx(osc));
|
|
|
|
brBox.union((en as Entity).GetBoundingBoxInMtx(osc));
|
|
|
|
boxDoorMap.set(brBox, DoorGroups[i]);
|
|
|
|
boxDoorMap.set(brBox, doorGroups[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (let [box, br] of boxDoorMap)
|
|
|
|
for (let [box, br] of boxDoorMap)
|
|
|
|