太空工程师-脚本-库存整理

此脚本用于将库存物品分类整理,目前支持[矿]、[锭]、[组件]、[工具]、[弹药]这几种分类。
整理过程中会排除“氢氧制造机”、“反应堆”、“炮塔”、精炼机与组装机的输入容器。
使用方法:
1.要整理库存的容器需要管道连接;
2.所有物品会根据箱子名称的"[分类名称]“进行转移;
3.如果LCD面板名称带有”[汇总]“标记,则显示矿和锭的汇总信息;
4.如果某个容器名称带有”[禁]“,则不参与库存整理;
5.如果某个发电设备名称带有”[发电]",则会纳入发电管理,当检测到某电池的电量低于50%时启动发电。
在这里插入图片描述

public Program()
{
	// Run Main() every 100 ticks, or about 1.3s
    Runtime.UpdateFrequency = UpdateFrequency.Update100;
}
//排除需要抽取的容器
string[] filterBlockNames={"MyObjectBuilder_OxygenGenerator","MyObjectBuilder_Reactor","MyObjectBuilder_LargeMissileTurret","MyObjectBuilder_LargeGatlingTurret","MyObjectBuilder_InteriorTurret","MyObjectBuilder_TurretControlBlock","MyObjectBuilder_OxygenTank"};
//工具类型名称
string[] typeids_tool={"MyObjectBuilder_PhysicalGunObject","MyObjectBuilder_GasContainerObject","MyObjectBuilder_OxygenContainerObject"};

Dictionary<string,string> nameMap=new Dictionary<string,string>{
	{"Uranium","铀"},
	{"Stone","石头"},
	{"Gold","黄金"},
	{"Iron","铁"},
	{"Magnesium","镁"},
	{"Silver","银"},
	{"Nickel","镍"},
	{"Platinum","铂"},
	{"Silicon","硅"},
	{"Cobalt","钴"},
	{"Ice","冰"},
	{"Scrap","废金属"}
};

public void Main(string argument, UpdateType updateSource){
	var blocks=new List<IMyTerminalBlock>();
	//找出有库存的方块
	GridTerminalSystem.GetBlocksOfType<IMyTerminalBlock>(blocks,block=>block.HasInventory&&!filterBlockNames.Contains(block.BlockDefinition.TypeIdString)&&!block.DisplayNameText.Contains("[禁]"));
	Echo($"block count:{blocks.Count}");
	var DictOre=new Dictionary<string,double>();
	
	if(blocks.Count==0){
		return;
	}
	var lcds=new List<IMyTextPanel>();
	GridTerminalSystem.GetBlocksOfType<IMyTextPanel>(lcds,d=>d.DisplayNameText.Contains("[汇总]"));
	//矿箱子
	var block_ores=blocks.Where(d=>d.DisplayNameText.Contains("[矿]")).ToList();
	//锭箱子
	var block_ingots=blocks.Where(d=>d.DisplayNameText.Contains("[锭]")).ToList();
	//组件箱子
	var block_components=blocks.Where(d=>d.DisplayNameText.Contains("[组件]")).ToList();
	//工具箱子
	var block_tools=blocks.Where(d=>d.DisplayNameText.Contains("[工具]")).ToList();
	//弹药箱子
	var block_ammos=blocks.Where(d=>d.DisplayNameText.Contains("[弹药]")).ToList();
	if(block_ores.Count==0&&block_ingots.Count==0&&block_components.Count==0&&block_tools.Count==0&&block_ammos.Count==0){
		return;
	}
	var names_block_ores=block_ores.Select(d=>d.Name);
	var names_block_ingots=block_ingots.Select(d=>d.Name);
	var names_block_components=block_components.Select(d=>d.Name);
	var names_block_tools=block_tools.Select(d=>d.Name);
	var names_block_ammos=block_ammos.Select(d=>d.Name);
	//开始整理库存
	foreach(var block in blocks){
		Echo($"blockName:{block.DisplayNameText}");
		IMyInventory current_Inventory=null;
		//
		if(block.InventoryCount>1){
			//精炼机和组装机取输出容器
			current_Inventory=block.GetInventory(1);
		}else{//普通方块取默认容器
			current_Inventory=block.GetInventory();
		}
		if(!(current_Inventory.CurrentVolume.RawValue>0L)){
			continue;
		}
		var items_ore=new List<MyInventoryItem>();
		var items_ingot=new List<MyInventoryItem>();
		var items_component=new List<MyInventoryItem>();
		var items_tool=new List<MyInventoryItem>();
		var items_ammo=new List<MyInventoryItem>();
		if(!names_block_ores.Contains(block.Name)){
			//取出矿
			current_Inventory.GetItems(items_ore,d=>d.Type.TypeId=="MyObjectBuilder_Ore");
		}
		if(!names_block_ingots.Contains(block.Name)){
			//取出锭
			current_Inventory.GetItems(items_ingot,d=>d.Type.TypeId=="MyObjectBuilder_Ingot");
		}
		if(!names_block_components.Contains(block.Name)){
			//取出零件
			current_Inventory.GetItems(items_component,d=>d.Type.TypeId=="MyObjectBuilder_Component");
		}
		if(!names_block_tools.Contains(block.Name)){
			//取出武器和工具
			current_Inventory.GetItems(items_tool,d=>typeids_tool.Contains(d.Type.TypeId));
		}
		if(!names_block_ammos.Contains(block.Name)){
			//取出弹药
			current_Inventory.GetItems(items_ammo,d=>d.Type.TypeId=="MyObjectBuilder_AmmoMagazine");
		}
		//统计矿和锭的数量
		if(lcds.Count>0){
			for(int i=0;i<block.InventoryCount;i++){
				var inventory=block.GetInventory(i);
				var items_oreAndIngot=new List<MyInventoryItem>();
				inventory.GetItems(items_oreAndIngot,d=>d.Type.TypeId=="MyObjectBuilder_Ore"||d.Type.TypeId=="MyObjectBuilder_Ingot");
				foreach(var item in items_oreAndIngot){
					var amount=double.Parse(item.Amount.ToString());
					if(DictOre.ContainsKey(item.Type.SubtypeId)){
						DictOre[item.Type.SubtypeId]+=amount;
					}else{
						DictOre.Add(item.Type.SubtypeId,amount);
					}
				}
			}
		}

		TransferItem(items_ore,block,current_Inventory,block_ores);
		TransferItem(items_ingot,block,current_Inventory,block_ingots);
		TransferItem(items_component,block,current_Inventory,block_components);
		TransferItem(items_tool,block,current_Inventory,block_tools);
		TransferItem(items_ammo,block,current_Inventory,block_ammos);
	}
	//矿物库存信息输出到LCD
	if(DictOre.Count>0){
		//汇总信息输出
		var info=new StringBuilder();
		foreach(var k in DictOre.Keys){
			var msg=$"{nameMap[k]}:{DictOre[k]:N}kg";
			info.AppendLine(msg);
		}
		var info_str=info.ToString();
		foreach(var lcd in lcds){
			lcd.WritePublicText(info_str);
		}
	}
	//发电管理
	var batteries=new List<IMyBatteryBlock>();
	var powerBlocks=new List<IMyPowerProducer>();
	GridTerminalSystem.GetBlocksOfType<IMyBatteryBlock>(batteries);
	GridTerminalSystem.GetBlocksOfType<IMyPowerProducer>(powerBlocks,d=>d.DisplayNameText.Contains("[发电]"));
	if(powerBlocks.Count>0){
		var needpower=false;
		foreach(var bat in batteries){
			if((bat.CurrentStoredPower/bat.MaxStoredPower)<0.5){
				needpower=true;
				break;
			}
		}
		foreach(var power in powerBlocks){
			Echo($"发电设备:{power.DisplayNameText} 开关:{needpower}");
			power.Enabled=needpower;
		}
	}
}
//转移物品
void TransferItem(List<MyInventoryItem> items,IMyTerminalBlock fromBlock,IMyInventory current_Inventory,List<IMyTerminalBlock> toBlocks){
	if(items.Count==0){
		return;
	}
	foreach(var block_c in toBlocks){
		if(block_c.Name==fromBlock.Name){
			continue;
		}
		var inventory=block_c.GetInventory();
		
		foreach(var item in items){
			if(inventory.IsFull){
				break;
			}
			current_Inventory.TransferItemTo(inventory,item);
		}
	}
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Sentinel-2a是欧洲航天局计划的一颗多光谱卫星,旨在为地球观测提供高分辨率的遥感图像数据。对于Sentinel-2a数据的处理,主要包括以下几个步骤。 首先是数据获取。可以通过欧空局的Sentinel数据下载站点或其他相关的数据获取平台下载Sentinel-2a数据。获取的数据通常以压缩文件的形式提供,需要解压后才能进行后续处理。 接下来是数据预处理。数据预处理的目的是对原始图像进行校正和去除无效数据,以提高数据的质量和可用性。预处理包括大气校正、大气校正修复、辐射校正等步骤,这些步骤可以减少大气、云、阴影等因素对图像的干扰。 然后是数据解译和分类。解译和分类是将图像进行分类和提取信息的过程,可以根据需求将图像分成不同的类别,如土地利用类型、植被覆盖度等。这一步骤需要借助专业的遥感软件和算法进行。 最后是数据分析和应用。通过对处理后的Sentinel-2a数据进行分析,可以获得一些对农业、环境、城市规划等领域有用的信息。例如,可以通过监测植被指数来评估植被的生长状况;还可以使用NDVI指数来推测农作物的健康状况等等。这些分析结果可以作为决策和规划的依据。 总之,对于Sentinel-2a数据的处理涉及数据获取、预处理、解译分类、数据分析等环节。这些处理步骤可以帮助我们提取有用的信息并为决策和规划提供支持。 ### 回答2: Sentinel-2a是欧空局(ESA)在Copernicus计划中推出的一颗卫星,用于地球观测和环境监测。它具有多光谱传感器(MSI),可获取高分辨率的遥感图像数据。 处理Sentinel-2a数据首先需要进行预处理。预处理包括数据去噪、几何校正和大气校正等步骤,以提高数据质量和减少噪音。几何校正是将图像校准到地球表面上的实际位置和尺度,以确保图像的几何特征准确。大气校正是为了消除大气条件对数据的影响,以获取更准确的地表反射率。 完成预处理后,可以进行其他的图像处理和分析。对Sentinel-2a数据进行分类可以帮助我们了解地表覆盖类型和变化。分类方法可以包括监督分类和无监督分类。监督分类需要人工提供一些标记样本来训练分类器,然后使用分类器对整个图像进行分类。无监督分类不需要样本标记,它依靠图像中相似的像素值进行分类。分类结果可以在地图上显示出不同的地表覆盖类型,如森林、农田和城市等。 除了分类外,还可以利用Sentinel-2a数据进行植被指数计算和变化检测。植被指数是衡量植被状况的指标,如归一化植被指数(NDVI)和差异植被指数(DVI)。这些指数可以用来评估植被的生长和变化情况。变化检测是通过对多个时间点的Sentinel-2a图像进行比较来检测地表变化,从而了解地貌的演变和环境变化。 综上所述,Sentinel-2a数据处理涉及预处理、分类、植被指数计算和变化检测等步骤。这些处理可以提供宝贵的地面信息来监测环境变化和支持各种应用,如农业、森林管理和城市规划等。 ### 回答3: Sentinel-2A是欧洲太空局(ESA)推出的一颗多光谱遥感卫星,它可以提供高分辨率的地表观测数据。对于处理Sentinel-2A数据,有以下几个主要步骤: 1. 数据获取:首先需要从ESA的数据存档中获取Sentinel-2A卫星的原始数据。这些数据以图像的形式提供,通常以多个波段的栅格图像文件的形式进行存储。 2. 数据预处理:在进行进一步的分析之前,需要对原始数据进行预处理。这包括校正和校准,以纠正图像中的各种不完美。例如,可以进行大气校正、几何校正、辐射校准等处理,以提高数据的质量和可用性。 3. 特征提取:一旦进行了预处理,可以开始进行特征提取。这包括对图像进行分类、分割和分类等,以提取感兴趣的地表特征。例如,可以提取土地利用类型、植被覆盖度、水体边界等信息。 4. 数据分析:处理Sentinel-2A数据的一个重要目标是进行空间和时间分析。利用多个时间点的数据,可以进行变化检测、监测和模拟等分析。这有助于理解地表变化、环境状况和生态系统动态等。 5. 数据可视化:最后,对处理后的数据进行可视化可以更好地展示结果。通过制作地图、图表和可视化产品,可以更方便地传达和理解Sentinel-2A数据的分析结果。 总的来说,处理Sentinel-2A数据涉及数据获取、预处理、特征提取、数据分析和数据可视化等步骤。这些处理有助于我们更好地理解地表的状态、变化和动态,并为环境管理、资源调查和决策支持提供基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值