ro-table/Asstes/Resources/Script/FrameWork/GUI/cell/Astrolabe_PlateCell.txt
2025-06-04 05:02:57 +08:00

211 lines
5.3 KiB
Plaintext

local BaseCell = autoImport("BaseCell");
Astrolabe_PlateCell = class("Astrolabe_PlateCell", BaseCell);
autoImport("Astrolabe_PointCell");
Astrolabe_PlateCell.Prefab_Path = ResourcePathHelper.UICell("Astrolabe_PlateCell");
Astrolabe_PlateCell.Line_Path = ResourcePathHelper.UICell("Astrolabe_line");
Astrolabe_PlateCell_Event = {
ClickPoint = "Astrolabe_PlateCell_Event_ClickPoint",
}
Astrolabe_Plate_Bg = {
[0] = "",
[1] = "xingpan_polygon_small",
[2] = "xingpan_polygon_mid",
[3] = "xingpan_polygon_big",
}
local tempV3_1, tempV3_2 = LuaVector3(), LuaVector3();
local tempRot = LuaQuaternion();
function Astrolabe_PlateCell:Init()
self.pointMap = {};
self.lineMap = {};
self.texture = self.gameObject:GetComponent(UITexture);
self.PlateId = self:FindComponent("PlateId", UILabel);
self.PlateId.gameObject:SetActive(ApplicationInfo.IsRunOnEditor());
end
function Astrolabe_PlateCell:SetData(data, priStateMap, bordData)
if(self.data ~= data)then
self.data = data;
self.bordData = bordData;
self.plate = bordData:GetPlateMap();
self:ReDraw();
end
if(self.data)then
local pointDataMap = data:GetPointMap();
for id, cell in pairs(self.pointMap)do
self:UpdatePoint(id, priStateMap, bordData);
end
self.PlateId.text = self.data.id;
end
end
function Astrolabe_PlateCell:Refresh()
if(self.data)then
self:SetData(self.data, nil, self.bordData);
end
end
function Astrolabe_PlateCell:ClearCellMap()
for id, cell in pairs(self.pointMap)do
cell:RemoveEventListener(Astrolabe_PlateData_Event.ClickPoint, self.ClickPoint, self);
AstrolabeCellPool.Instance:AddPointCellToPool(cell);
self.pointMap[id] = nil;
end
end
function Astrolabe_PlateCell.DeleteLine(lineCell)
AstrolabeCellPool.Instance:AddLineCellToPool(lineCell)
end
function Astrolabe_PlateCell:ClearLines()
TableUtility.TableClearByDeleter(self.lineMap, Astrolabe_PlateCell.DeleteLine);
end
function Astrolabe_PlateCell:ReDraw()
self:ClearCellMap();
self:ClearLines();
local data = self.data;
local pointMap = data:GetPointMap();
for _, pointData in pairs(pointMap)do
local pointCell = AstrolabeCellPool.Instance:GetPointCell(self.gameObject);
pointCell:AddEventListener(Astrolabe_PlateData_Event.ClickPoint, self.ClickPoint, self);
self.pointMap[pointData.id] = pointCell;
local innerConnect = pointData:GetInnerConnect();
for i=1,#innerConnect do
local connectId = innerConnect[i];
if(pointMap[connectId])then
self:GetInnerline(pointData, pointMap[connectId], false);
end
end
end
self.gameObject.name = "Plate_" .. data.id;
tempV3_1:Set( data:GetPos_XYZ() );
self.gameObject.transform.localPosition = tempV3_1;
local plateWidth = data.plateWidth;
if(plateWidth == 0)then
self.texture.enabled = false;
else
self.texture.enabled = true;
local name = Astrolabe_Plate_Bg[ plateWidth ];
PictureManager.Instance:SetUI(name, self.texture);
self.texture:MakePixelPerfect();
end
end
function Astrolabe_PlateCell:ClickPoint(pointCell)
self:PassEvent(Astrolabe_PlateCell_Event.ClickPoint, {self, pointCell});
end
function Astrolabe_PlateCell:UpdatePoint(pointid, priStateMap, bordData)
if(self.data == nil)then
return;
end
local pointMap = self.data:GetPointMap();
local pointData = pointMap[pointid];
local cell = self.pointMap[pointData.id];
if(cell)then
cell:SetData(pointData, priStateMap, bordData);
end
local innerConnect = pointData:GetInnerConnect();
for i=1,#innerConnect do
local pointData2 = pointMap[innerConnect[i]];
local lineCell = self:GetInnerline(pointData, pointData2);
lineCell:SetData(pointData, pointData2, priStateMap);
local pointCell2 = self.pointMap[ pointData2.id ];
pointCell2:SetData(pointData2, priStateMap, bordData);
end
end
function Astrolabe_PlateCell:GetInnerline(point1, point2, noCreate)
local lpoint, bpoint;
if(point1.id < point2.id)then
lpoint = point1;
bpoint = point2;
else
lpoint = point2;
bpoint = point1;
end
local cid = lpoint.id .. "_" .. bpoint.id;
local lineCell = self.lineMap[cid];
if(noCreate ~= true and lineCell == nil)then
lineCell = AstrolabeCellPool.Instance:GetLineCell(self.gameObject);
local x1,y1,z1 = lpoint:GetLocalPos_XYZ();
local x2,y2,z2 = bpoint:GetLocalPos_XYZ();
lineCell:ReSetPos(x1,y1,z1, x2,y2,z2);
self.lineMap[cid] = lineCell;
end
return lineCell
end
function Astrolabe_PlateCell:ActiveAttriInfo(b)
for id,pointCell in pairs(self.pointMap)do
pointCell:ActiveAttriInfo(b);
end
end
function Astrolabe_PlateCell:GetPointCellById(id)
return self.pointMap[id];
end
function Astrolabe_PlateCell:SetMaskInfo(maskidMap)
for _,pointCell in pairs(self.pointMap)do
local guid = pointCell.data.guid;
if(maskidMap[guid])then
pointCell:SetMaskType(maskidMap[guid]);
else
pointCell:RemoveMask(nil);
end
end
local p1_mtype, p2_mtype;
for cid,lineCell in pairs(self.lineMap)do
if(lineCell.point1 == nil)then
helplog("SetMaskInfo Error", cid, self.data.id);
end
p1_mtype = maskidMap[ lineCell.point1.guid ];
p2_mtype = maskidMap[ lineCell.point2.guid ];
if(p1_mtype and p2_mtype)then
lineCell:SetMaskType( math.min(p1_mtype, p2_mtype) );
else
lineCell:RemoveMask(nil);
end
end
end
function Astrolabe_PlateCell:OnCreate()
self:Show();
end
function Astrolabe_PlateCell:OnDestroy()
self:ClearCellMap();
self:ClearLines();
self:Hide();
self.data = nil;
self.plate = nil;
self.bordData = nil;
end