// private string getWeldersStatus<T>(CBlocksBase<T> group) where T : class, IMyTerminalBlock
    // {
    //   if (!group.isAssignable<IMyShipWelder>()) { return ""; }
    //   string result = "";
    //   int connected = 0;
    //   foreach (IMyShipWelder block in group.blocks())
    //   {
    //     if (block.IsConnected) { connected++; }
    //   }
    //   result += $"Connected: {connected} ";
    //   return result;
    // }

    public void showStatus <T>(CBlocksBase <T> group, int position) where T : class, IMyTerminalBlock
    {
        string result = $"[{group.subtypeName()}] {group.purpose()} ";

        if (!group.empty())
        {
            result += $"({group.count()}) "
                      + getPistonsStatus <T>(group)
                      + getConnectorsStatus <T>(group)
                      + getMergersStatus <T>(group)
                      + getProjectorsStatus <T>(group)
                      //  + getDrillsStatus<T>(group)
                      + getRotorsStatus <T>(group)
                      + getGyroStatus <T>(group)
                      + getBatteryesStatus <T>(group)
                      + getGasTanksStatus <T>(group)
                      + getPowerProducersStatus <T>(group)
                      + getInvertoryesStatus <T>(group)
                      + getFunctionaBlocksStatus <T>(group)
            ;
        }
        else
        {
            result += "Таких блоков нет";
        }
        echo_at(result, position);
    }
    private string getGyroStatus <T>(CBlocksBase <T> group) where T : class, IMyTerminalBlock
    {
        if (!group.isAssignable <IMyGyro>())
        {
            return("");
        }
        string result = "";
        float  yaw    = 0;
        float  pitch  = 0;
        float  roll   = 0;

        foreach (IMyGyro block in group.blocks())
        {
            yaw   += Math.Abs(block.Yaw);
            pitch += Math.Abs(block.Pitch);
            roll  += Math.Abs(block.Roll);
        }
        result += $"YPR: {yaw/group.count():f4}:{pitch/group.count():f4}:{roll/group.count():f4} ";
        return(result);
    }
    private string getGasTanksStatus <T>(CBlocksBase <T> group) where T : class, IMyTerminalBlock
    {
        if (!group.isAssignable <IMyGasTank>())
        {
            return("");
        }
        string result      = "";
        float  capacity    = 0;
        double filledRatio = 0;

        foreach (IMyGasTank block in group.blocks())
        {
            capacity    += block.Capacity;
            filledRatio += block.FilledRatio;
        }
        result += $"Capacity: {toHumanReadable(capacity, EHRUnit.Volume)} "
                  + $"Filled: {filledRatio/group.count()*100:f2}% ";
        return(result);
    }