YanCheng_Metrology/Assets/Scripts/CXX/Devices/计量柜/Device_MeasuringCabinet.cs

201 lines
5.4 KiB
C#

using Sirenix.Utilities;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 计量柜
/// </summary>
public class Device_MeasuringCabinet : Device_Base
{
/// <summary>
/// 当前机柜中安装的三相四线电能表
/// </summary>
public Device_3Phase4WireMeter meteringDevice;
/// <summary>
/// 柜门
/// </summary>
public Device_CabinetDoor cabinetDoor;
/// <summary>
/// 插座
/// </summary>
public Device_Socket socket;
/// <summary>
/// 进电开关
/// </summary>
public Device_Switch inSwitch;
/// <summary>
/// 电能表接线
/// </summary>
public List<Tool_Line> jieXian_screws;
/// <summary>
/// 电能表碰撞
/// </summary>
public BoxCollider dianCollider;
/// <summary>
/// 电能表安装完成后的杂物
/// </summary>
public Device_Sundries sundries;
private void Awake()
{
//添加开关切换回调
inSwitch.AddAction(isOpen =>
{
//刷新带电状态
CheckHasElectricity();
});
//添加螺丝拆装回调
meteringDevice.jieXian_screws.ForEach(screw =>
{
screw.AddAction(isinstalled =>
{
//刷新带电状态
CheckHasElectricity();
});
});
}
/// <summary>
/// 还原计量柜状态
/// </summary>
public void Init()
{
//还原三相四线电能表
meteringDevice.Init(true);
//还原柜门
cabinetDoor.isOpen = false;
cabinetDoor.transform.localEulerAngles = Vector3.zero;
cabinetDoor.transform.Find("计量柜锁2/计量柜锁3").localEulerAngles = Vector3.zero;
//还原插座
//还原进线开关
inSwitch.isOpen = true;
inSwitch.transform.localEulerAngles = new Vector3(0, 0, 0);
//还原电能表接线
jieXian_screws.ForEach(screw =>
{
screw.isConnected = true;
screw.transform.localPosition = new Vector3(screw.transform.localPosition.x, screw.InstallPosY, screw.transform.localPosition.z);
});
//还原杂物
sundries.gameObject.SetActive(false);
//刷新验电状态
CheckHasElectricity();
}
/// <summary>
/// 清空接线的螺丝参数
/// </summary>
public void ClearLineScrew()
{
Debug.Log("清除接线关联的螺丝");
jieXian_screws.ForEach(a =>
{
a.screws.Clear();
});
}
/// <summary>
/// 设置接线的螺丝参数
/// </summary>
public void SetLineScrew()
{
Debug.Log("接线重新关联螺丝");
jieXian_screws.ForEach(a =>
{
a.screws = meteringDevice.jieXian_screws.FindAll(b => b.gameObject.name.StartsWith(a.gameObject.name));
});
}
/// <summary>
/// 刷新电能表螺丝带电状态
/// </summary>
public void CheckHasElectricity()
{
Debug.Log("带电状态刷新");
//进线螺丝是否带电
jieXian_screws.ForEach(a =>
{
if (!inSwitch.isOpen)
{
//开关关闭不带电
a.screws.ForEach(b => b.hasElectricity = false);
}
else
{
//开关打开--线接上--螺丝拧上带电
if (!a.isConnected)
{
a.screws.ForEach(b => b.hasElectricity = false);
}
else
{
a.screws.ForEach(b =>
{
//安装了则带电
b.hasElectricity = b.isInstall;
});
}
}
});
}
private void Update()
{
//是否可以触发能表的拆卸或安装电
if (meteringDevice == null)
{
dianCollider.enabled = true;
}
else
{
//电能表固定螺丝拆掉了,线拆掉了
if (!meteringDevice.fix_screw_left.isInstall && !meteringDevice.fix_screw_right.isInstall && jieXian_screws.TrueForAll(a => !a.isConnected))
{
dianCollider.enabled = true;
}
else
{
dianCollider.enabled = false;
}
}
//安装或拆除电能表
if (Input.GetMouseButtonDown(0))
{
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out RaycastHit hit))
{
if (hit.collider == dianCollider)
{
if (meteringDevice == null)
{
//安装电能表
if (LiveSceneManager.Instance.currentTool != null && LiveSceneManager.Instance.currentTool.GetComponent<Device_3Phase4WireMeter>() != null)
{
meteringDevice = LiveSceneManager.Instance.currentTool.GetComponent<Device_3Phase4WireMeter>();
meteringDevice.Add();
//接线关联螺丝
SetLineScrew();
//刷新带电状态
CheckHasElectricity();
}
}
else
{
//拆下电能表
meteringDevice.Remove();
//情况接线关联螺丝
ClearLineScrew();
sundries.gameObject.SetActive(true);
}
}
}
}
}
}