static Carrier CreateCarrierFromElm(XElement carrierElm) {
string carrierId = carrierElm.Attribute("CarrierID").Value;
string loadPurposeType = carrierElm.Attribute("LoadPurposeType").Value;
string loadPortId = carrierElm.Attribute("LoadPortID").Value;
XElement mSlotsElm = carrierElm.Element("MeasurementSlots");
if (mSlotsElm == null) {
return new Carrier {
Id = carrierId,
LoadPurposeType = loadPurposeType,
LoadPortId = loadPortId,
SlotMap = from slotElm in carrierElm.Element("SlotMap").Elements("Slot")
select new SlotInfo {
SlotNo = (byte)(int)slotElm.Attribute("SlotNo"),
WaferID = slotElm.Value,
}
};
}
var mSlots = (from slotElm in mSlotsElm.Elements("MeasurementSlot")
select (byte)(int)slotElm.Attribute("SlotNo")).ToList();
var slotmap = (from slotElm in carrierElm.Element("SlotMap").Elements("Slot")
select new {
SlotNo = (byte)(int)slotElm.Attribute("SlotNo"),
WaferID = slotElm.Value,
}).ToList();
var selected = new Dictionary<byte, byte>(mSlots.Count);//<實際slot,帳上slot>
foreach (var mslot in mSlots) {
//尋找實際量測slot
if (slotmap.FindIndex(s => s.SlotNo == mslot) != -1
&& !selected.ContainsKey(mslot)) {
selected[mslot] = mslot;
} else {
for (byte up = (byte)(mslot - 1), down = (byte)(mslot + 1); up > 0 || down <= 25; up--, down++) {
if (slotmap.FindIndex(s => s.SlotNo == up) != -1
&& !selected.ContainsKey(up)) {
selected[up] = mslot;
break;
}
if (slotmap.FindIndex(s => s.SlotNo == down) != -1
&& !selected.ContainsKey(down)) {
selected[down] = mslot;
break;
}
}
}
}
return new Carrier {
Id = carrierId,
LoadPurposeType = loadPurposeType,
LoadPortId = loadPortId,
SlotMap = (from s in slotmap
select new SlotInfo {
SlotNo = s.SlotNo,
WaferID = s.WaferID,
Measure = selected.ContainsKey(s.SlotNo)
}).ToList(),
_MeasurementSlots = selected
};
}
}