SourceCode/Bond/Servo/CCjPage2.cpp
@@ -440,43 +440,29 @@
        m_grid.SetPortAllocated(p, !checked, _T(""));
        GetDlgItem(btnID[p])->EnableWindow(checked);
    }
    // Keep one material type across all selected ports.
    int syncMat = CCarrierSlotGrid::MAT_G1;
    bool hasSyncMat = false;
    for (int p = 0; p < kPortCount && !hasSyncMat; ++p) {
    // 物料类型按 Port 维度独立统一,不跨 Port 联动。
    for (int p = 0; p < kPortCount; ++p) {
        if (!pCurrent->selectedPorts[p]) continue;
        int syncMat = m_grid.GetSlotMaterialType(p, 0);
        for (int s = 0; s < kSlotCount; ++s) {
            if (m_grid.GetSlotChecked(p, s)) {
                syncMat = m_grid.GetSlotMaterialType(p, s);
                hasSyncMat = true;
                break;
            }
        }
        SyncMaterialInPort(p, syncMat);
    }
    if (!hasSyncMat) {
        for (int p = 0; p < kPortCount; ++p) {
            if (!pCurrent->selectedPorts[p]) continue;
            syncMat = m_grid.GetSlotMaterialType(p, 0);
            hasSyncMat = true;
            break;
        }
    }
    SyncMaterialAcrossSelectedPorts(syncMat);
    EnsureWarpDefaults(*pCurrent);
}
void CCjPage2::SyncMaterialAcrossSelectedPorts(int material)
void CCjPage2::SyncMaterialInPort(int port, int material)
{
    if (m_pContext == nullptr) return;
    if (port < 0 || port >= kPortCount) return;
    const int mat = NormalizeMaterial(material);
    PJWarp* pCurrent = (PJWarp*)m_pContext;
    for (int p = 0; p < kPortCount; ++p) {
        if (!pCurrent->selectedPorts[p]) continue;
        for (int s = 0; s < kSlotCount; ++s) {
            m_grid.SetSlotMaterialType(p, s, mat, FALSE);
        }
    for (int s = 0; s < kSlotCount; ++s) {
        m_grid.SetSlotMaterialType(port, s, mat, FALSE);
    }
}
@@ -531,9 +517,10 @@
void CCjPage2::OnGridMatChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
    auto* nm = reinterpret_cast<CSG_MAT_CHANGE*>(pNMHDR);
    const int port = nm->port;
    const int mat = nm->material; // 1/2
    SyncMaterialAcrossSelectedPorts(mat);
    SyncMaterialInPort(port, mat);
    ContentChanged(0);
    *pResult = 0;