private void buttonExtExcel_Click(object sender, EventArgs e) { Forms.ExportForm frm = new Forms.ExportForm(); frm.Init(new string[] { "All", "Stars only", "Planets only", //2 "Exploration List Stars", //3 "Exploration List Planets", //4 "Sold Exploration Data", // 5 }); if (frm.ShowDialog(FindForm()) == DialogResult.OK) { BaseUtils.CSVWrite csv = new BaseUtils.CSVWrite(); csv.SetCSVDelimiter(frm.Comma); try { using (System.IO.StreamWriter writer = new System.IO.StreamWriter(frm.Path)) { if (frm.SelectedIndex == 5) { int count; List <HistoryEntry> data = HistoryList.FilterByJournalEvent(discoveryform.history.ToList(), "Sell Exploration Data", out count); data = (from he in data where he.EventTimeLocal >= frm.StartTime && he.EventTimeLocal <= frm.EndTime orderby he.EventTimeUTC descending select he).ToList(); List <HistoryEntry> scans = HistoryList.FilterByJournalEvent(discoveryform.history.ToList(), "Scan", out count); if (frm.IncludeHeader) { writer.Write(csv.Format("Time")); writer.Write(csv.Format("System")); writer.Write(csv.Format("Star type")); writer.Write(csv.Format("Planet type", false)); writer.WriteLine(); } foreach (HistoryEntry he in data) { JournalSellExplorationData jsed = he.journalEntry as JournalSellExplorationData; if (jsed == null || jsed.Discovered == null) { continue; } foreach (String system in jsed.Discovered) { writer.Write(csv.Format(jsed.EventTimeLocal)); writer.Write(csv.Format(system)); EDStar star = EDStar.Unknown; EDPlanet planet = EDPlanet.Unknown; foreach (HistoryEntry scanhe in scans) { JournalScan scan = scanhe.journalEntry as JournalScan; if (scan.BodyName.Equals(system, StringComparison.OrdinalIgnoreCase)) { star = scan.StarTypeID; planet = scan.PlanetTypeID; break; } } writer.Write(csv.Format((star != EDStar.Unknown) ? Enum.GetName(typeof(EDStar), star) : "")); writer.Write(csv.Format((planet != EDPlanet.Unknown) ? Enum.GetName(typeof(EDPlanet), planet) : "", false)); writer.WriteLine(); } } } else { List <JournalScan> scans = null; if (frm.SelectedIndex < 3) { var entries = JournalEntry.GetByEventType(JournalTypeEnum.Scan, EDCommander.CurrentCmdrID, frm.StartTime, frm.EndTime); scans = entries.ConvertAll(x => (JournalScan)x); } else { ExplorationSetClass currentExplorationSet = new ExplorationSetClass(); string file = currentExplorationSet.DialogLoad(FindForm()); if (file != null) { scans = new List <JournalScan>(); foreach (string system in currentExplorationSet.Systems) { List <long> edsmidlist = SystemClassDB.GetEdsmIdsFromName(system); if (edsmidlist.Count > 0) { for (int ii = 0; ii < edsmidlist.Count; ii++) { List <JournalScan> sysscans = EDSMClass.GetBodiesList((int)edsmidlist[ii]); if (sysscans != null) { scans.AddRange(sysscans); } } } } } else { return; } } bool ShowStars = frm.SelectedIndex < 2 || frm.SelectedIndex == 3; bool ShowPlanets = frm.SelectedIndex == 0 || frm.SelectedIndex == 2 || frm.SelectedIndex == 4; List <JournalSAAScanComplete> mappings = ShowPlanets ? JournalEntry.GetByEventType(JournalTypeEnum.SAAScanComplete, EDCommander.CurrentCmdrID, frm.StartTime, frm.EndTime) .ConvertAll(x => (JournalSAAScanComplete)x) : null; if (frm.IncludeHeader) { // Write header writer.Write(csv.Format("Time")); writer.Write(csv.Format("BodyName")); writer.Write(csv.Format("Estimated Value")); writer.Write(csv.Format("DistanceFromArrivalLS")); if (ShowStars) { writer.Write(csv.Format("StarType")); writer.Write(csv.Format("StellarMass")); writer.Write(csv.Format("AbsoluteMagnitude")); writer.Write(csv.Format("Age MY")); writer.Write(csv.Format("Luminosity")); } writer.Write(csv.Format("Radius")); writer.Write(csv.Format("RotationPeriod")); writer.Write(csv.Format("SurfaceTemperature")); if (ShowPlanets) { writer.Write(csv.Format("TidalLock")); writer.Write(csv.Format("TerraformState")); writer.Write(csv.Format("PlanetClass")); writer.Write(csv.Format("Atmosphere")); writer.Write(csv.Format("Iron")); writer.Write(csv.Format("Silicates")); writer.Write(csv.Format("SulphurDioxide")); writer.Write(csv.Format("CarbonDioxide")); writer.Write(csv.Format("Nitrogen")); writer.Write(csv.Format("Oxygen")); writer.Write(csv.Format("Water")); writer.Write(csv.Format("Argon")); writer.Write(csv.Format("Ammonia")); writer.Write(csv.Format("Methane")); writer.Write(csv.Format("Hydrogen")); writer.Write(csv.Format("Helium")); writer.Write(csv.Format("Volcanism")); writer.Write(csv.Format("SurfaceGravity")); writer.Write(csv.Format("SurfacePressure")); writer.Write(csv.Format("Landable")); writer.Write(csv.Format("EarthMasses")); writer.Write(csv.Format("IcePercent")); writer.Write(csv.Format("RockPercent")); writer.Write(csv.Format("MetalPercent")); } // Common orbital param writer.Write(csv.Format("SemiMajorAxis")); writer.Write(csv.Format("Eccentricity")); writer.Write(csv.Format("OrbitalInclination")); writer.Write(csv.Format("Periapsis")); writer.Write(csv.Format("OrbitalPeriod")); writer.Write(csv.Format("AxialTilt")); if (ShowPlanets) { writer.Write(csv.Format("Carbon")); writer.Write(csv.Format("Iron")); writer.Write(csv.Format("Nickel")); writer.Write(csv.Format("Phosphorus")); writer.Write(csv.Format("Sulphur")); writer.Write(csv.Format("Arsenic")); writer.Write(csv.Format("Chromium")); writer.Write(csv.Format("Germanium")); writer.Write(csv.Format("Manganese")); writer.Write(csv.Format("Selenium")); writer.Write(csv.Format("Vanadium")); writer.Write(csv.Format("Zinc")); writer.Write(csv.Format("Zirconium")); writer.Write(csv.Format("Cadmium")); writer.Write(csv.Format("Mercury")); writer.Write(csv.Format("Molybdenum")); writer.Write(csv.Format("Niobium")); writer.Write(csv.Format("Tin")); writer.Write(csv.Format("Tungsten")); writer.Write(csv.Format("Antimony")); writer.Write(csv.Format("Polonium")); writer.Write(csv.Format("Ruthenium")); writer.Write(csv.Format("Technetium")); writer.Write(csv.Format("Tellurium")); writer.Write(csv.Format("Yttrium")); } writer.WriteLine(); } foreach (JournalScan je in scans) { JournalScan scan = je as JournalScan; if (ShowPlanets == false) // Then only show stars. { if (String.IsNullOrEmpty(scan.StarType)) { continue; } } if (ShowStars == false) // Then only show planets { if (String.IsNullOrEmpty(scan.PlanetClass)) { continue; } } writer.Write(csv.Format(scan.EventTimeUTC)); writer.Write(csv.Format(scan.BodyName)); if (string.IsNullOrEmpty(scan.PlanetClass)) { writer.Write(csv.Format(scan.EstimateScanValue(false, false))); } else { var map = mappings.FirstOrDefault(m => m.BodyName == scan.BodyName); if (map == null) { writer.Write(csv.Format(scan.EstimateScanValue(false, false))); } else { writer.Write(csv.Format(scan.EstimateScanValue(true, map.ProbesUsed <= map.EfficiencyTarget))); } } writer.Write(csv.Format(scan.DistanceFromArrivalLS)); if (ShowStars) { writer.Write(csv.Format(scan.StarType)); writer.Write(csv.Format((scan.nStellarMass.HasValue) ? scan.nStellarMass.Value : 0)); writer.Write(csv.Format((scan.nAbsoluteMagnitude.HasValue) ? scan.nAbsoluteMagnitude.Value : 0)); writer.Write(csv.Format((scan.nAge.HasValue) ? scan.nAge.Value : 0)); writer.Write(csv.Format(scan.Luminosity)); } writer.Write(csv.Format(scan.nRadius.HasValue ? scan.nRadius.Value : 0)); writer.Write(csv.Format(scan.nRotationPeriod.HasValue ? scan.nRotationPeriod.Value : 0)); writer.Write(csv.Format(scan.nSurfaceTemperature.HasValue ? scan.nSurfaceTemperature.Value : 0)); if (ShowPlanets) { writer.Write(csv.Format(scan.nTidalLock.HasValue ? scan.nTidalLock.Value : false)); writer.Write(csv.Format((scan.TerraformState != null) ? scan.TerraformState : "")); writer.Write(csv.Format((scan.PlanetClass != null) ? scan.PlanetClass : "")); writer.Write(csv.Format((scan.Atmosphere != null) ? scan.Atmosphere : "")); writer.Write(csv.Format(scan.GetAtmosphereComponent("Iron"))); writer.Write(csv.Format(scan.GetAtmosphereComponent("Silicates"))); writer.Write(csv.Format(scan.GetAtmosphereComponent("SulphurDioxide"))); writer.Write(csv.Format(scan.GetAtmosphereComponent("CarbonDioxide"))); writer.Write(csv.Format(scan.GetAtmosphereComponent("Nitrogen"))); writer.Write(csv.Format(scan.GetAtmosphereComponent("Oxygen"))); writer.Write(csv.Format(scan.GetAtmosphereComponent("Water"))); writer.Write(csv.Format(scan.GetAtmosphereComponent("Argon"))); writer.Write(csv.Format(scan.GetAtmosphereComponent("Ammonia"))); writer.Write(csv.Format(scan.GetAtmosphereComponent("Methane"))); writer.Write(csv.Format(scan.GetAtmosphereComponent("Hydrogen"))); writer.Write(csv.Format(scan.GetAtmosphereComponent("Helium"))); writer.Write(csv.Format((scan.Volcanism != null) ? scan.Volcanism : "")); writer.Write(csv.Format(scan.nSurfaceGravity.HasValue ? scan.nSurfaceGravity.Value : 0)); writer.Write(csv.Format(scan.nSurfacePressure.HasValue ? scan.nSurfacePressure.Value : 0)); writer.Write(csv.Format(scan.nLandable.HasValue ? scan.nLandable.Value : false)); writer.Write(csv.Format((scan.nMassEM.HasValue) ? scan.nMassEM.Value : 0)); writer.Write(csv.Format(scan.GetCompositionPercent("Ice"))); writer.Write(csv.Format(scan.GetCompositionPercent("Rock"))); writer.Write(csv.Format(scan.GetCompositionPercent("Metal"))); } // Common orbital param writer.Write(csv.Format(scan.nSemiMajorAxis.HasValue ? scan.nSemiMajorAxis.Value : 0)); writer.Write(csv.Format(scan.nEccentricity.HasValue ? scan.nEccentricity.Value : 0)); writer.Write(csv.Format(scan.nOrbitalInclination.HasValue ? scan.nOrbitalInclination.Value : 0)); writer.Write(csv.Format(scan.nPeriapsis.HasValue ? scan.nPeriapsis.Value : 0)); writer.Write(csv.Format(scan.nOrbitalPeriod.HasValue ? scan.nOrbitalPeriod.Value : 0)); writer.Write(csv.Format(scan.nAxialTilt.HasValue ? scan.nAxialTilt : null)); if (ShowPlanets) { writer.Write(csv.Format(scan.GetMaterial("Carbon"))); writer.Write(csv.Format(scan.GetMaterial("Iron"))); writer.Write(csv.Format(scan.GetMaterial("Nickel"))); writer.Write(csv.Format(scan.GetMaterial("Phosphorus"))); writer.Write(csv.Format(scan.GetMaterial("Sulphur"))); writer.Write(csv.Format(scan.GetMaterial("Arsenic"))); writer.Write(csv.Format(scan.GetMaterial("Chromium"))); writer.Write(csv.Format(scan.GetMaterial("Germanium"))); writer.Write(csv.Format(scan.GetMaterial("Manganese"))); writer.Write(csv.Format(scan.GetMaterial("Selenium"))); writer.Write(csv.Format(scan.GetMaterial("Vanadium"))); writer.Write(csv.Format(scan.GetMaterial("Zinc"))); writer.Write(csv.Format(scan.GetMaterial("Zirconium"))); writer.Write(csv.Format(scan.GetMaterial("Cadmium"))); writer.Write(csv.Format(scan.GetMaterial("Mercury"))); writer.Write(csv.Format(scan.GetMaterial("Molybdenum"))); writer.Write(csv.Format(scan.GetMaterial("Niobium"))); writer.Write(csv.Format(scan.GetMaterial("Tin"))); writer.Write(csv.Format(scan.GetMaterial("Tungsten"))); writer.Write(csv.Format(scan.GetMaterial("Antimony"))); writer.Write(csv.Format(scan.GetMaterial("Polonium"))); writer.Write(csv.Format(scan.GetMaterial("Ruthenium"))); writer.Write(csv.Format(scan.GetMaterial("Technetium"))); writer.Write(csv.Format(scan.GetMaterial("Tellurium"))); writer.Write(csv.Format(scan.GetMaterial("Yttrium"))); } writer.WriteLine(); } } writer.Close(); if (frm.AutoOpen) { System.Diagnostics.Process.Start(frm.Path); } } } catch { ExtendedControls.MessageBoxTheme.Show(FindForm(), "Failed to write to " + frm.Path, "Export Failed", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } }
// Width: Nodes are allowed 2 widths // Height: Nodes are allowed 1.5 Heights. 0 = top, 1/2/3/4 = image, 5 = bottom. // offset: pass in horizonal offset, return back middle of image // aligndown : if true, compensate for drawing normal size images and ones 1.5 by shifting down the image and the label by the right amounts // labelvoff : any additional compensation for label pos // return right bottom of area used from curpos Point DrawNode(List <ExtPictureBox.ImageElement> pc, StarScan.ScanNode sn, MaterialCommoditiesList curmats, HistoryList hl, Image notscanned, Point curpos, Size size, ref int offset, bool aligndown = false, int labelvoff = 0, bool toplevel = false) { string tip; Point endpoint = curpos; int quarterheight = size.Height / 4; int alignv = aligndown ? quarterheight : 0; JournalScan sc = sn.ScanData; //System.Diagnostics.Debug.WriteLine("Node " + sn.ownname + " " + curpos + " " + size + " hoff " + offset + " EDSM " + ((sc!= null) ? sc.IsEDSMBody.ToString() : "")); if (sc != null && (!sc.IsEDSMBody || CheckEDSM)) // if got one, and its our scan, or we are showing EDSM { tip = sc.DisplayString(historicmatlist: curmats, currentmatlist: hl.GetLast?.MaterialCommodity); if (sn.type == StarScan.ScanNodeType.ring) { } else if (sc.IsStar && toplevel) { var starLabel = sn.customname ?? sn.ownname; var habZone = sc.GetHabZoneStringLs(); if (!string.IsNullOrEmpty(habZone)) { starLabel += $" ({habZone})"; } endpoint = CreateImageLabel(pc, sc.GetStarTypeImage(), new Point(curpos.X + offset, curpos.Y + alignv), // WE are basing it on a 1/4 + 1 + 1/4 grid, this is not being made bigger, move off size, starLabel, tip, alignv + labelvoff, sc.IsEDSMBody, false); // and the label needs to be a quarter height below it.. offset += size.Width / 2; // return the middle used was this.. } else //else not a top-level star { bool indicatematerials = sc.HasMaterials && !ShowMaterials; bool valuable = sc.EstimateScanValue(sn.IsMapped, sn.WasMappedEfficiently) > 50000; Image nodeimage = sc.IsStar ? sc.GetStarTypeImage() : sc.GetPlanetClassImage(); if (ImageRequiresAnOverlay(sc, indicatematerials, valuable)) { Bitmap bmp = new Bitmap(size.Width * 2, quarterheight * 6); using (Graphics g = Graphics.FromImage(bmp)) { g.DrawImage(nodeimage, size.Width / 2, quarterheight, size.Width, size.Height); if (sc.IsLandable) { g.DrawImage(Icons.Controls.Scan_Bodies_Landable, new Rectangle(quarterheight, 0, quarterheight * 6, quarterheight * 6)); } if (sc.HasRings) { g.DrawImage(sc.Rings.Count() > 1 ? Icons.Controls.Scan_Bodies_RingGap : Icons.Controls.Scan_Bodies_RingOnly, new Rectangle(-2, quarterheight, size.Width * 2, size.Height)); } if (ShowOverlays) { int overlaystotal = (sc.Terraformable ? 1 : 0) + (sc.HasMeaningfulVolcanism ? 1 : 0) + (valuable ? 1 : 0) + (sn.IsMapped ? 1 : 0); int ovsize = (overlaystotal > 1) ? quarterheight : (quarterheight * 3 / 2); int pos = 0; if (sc.Terraformable) { g.DrawImage(Icons.Controls.Scan_Bodies_Terraformable, new Rectangle(0, pos, ovsize, ovsize)); pos += ovsize + 1; } if (sc.HasMeaningfulVolcanism) //this renders below the terraformable icon if present { g.DrawImage(Icons.Controls.Scan_Bodies_Volcanism, new Rectangle(0, pos, ovsize, ovsize)); pos += ovsize + 1; } if (valuable) { g.DrawImage(Icons.Controls.Scan_Bodies_HighValue, new Rectangle(0, pos, ovsize, ovsize)); pos += ovsize + 1; } if (sn.IsMapped) { g.DrawImage(Icons.Controls.Scan_Bodies_Mapped, new Rectangle(0, pos, ovsize, ovsize)); } } if (indicatematerials) { Image mm = Icons.Controls.Scan_Bodies_MaterialMore; g.DrawImage(mm, new Rectangle(bmp.Width - mm.Width, bmp.Height - mm.Height, mm.Width, mm.Height)); } } var nodeLabel = sn.customname ?? sn.ownname; if (sn.ScanData.IsLandable && sn.ScanData.nSurfaceGravity != null) { nodeLabel += $" ({(sn.ScanData.nSurfaceGravity / JournalScan.oneGee_m_s2):N2}g)"; } endpoint = CreateImageLabel(pc, bmp, curpos, new Size(bmp.Width, bmp.Height), nodeLabel, tip, labelvoff, sc.IsEDSMBody); offset = size.Width; // return that the middle is now this } else { endpoint = CreateImageLabel(pc, nodeimage, new Point(curpos.X + offset, curpos.Y + alignv), size, sn.customname ?? sn.ownname, tip, alignv + labelvoff, sc.IsEDSMBody, false); offset += size.Width / 2; } if (sc.HasMaterials && ShowMaterials) { Point matpos = new Point(endpoint.X + 4, curpos.Y); Point endmat = CreateMaterialNodes(pc, sc, curmats, hl, matpos, materialsize); endpoint = new Point(Math.Max(endpoint.X, endmat.X), Math.Max(endpoint.Y, endmat.Y)); // record new right point.. } } } else if (sn.type == StarScan.ScanNodeType.belt) { if (sn.BeltData != null) { tip = sn.BeltData.RingInformationMoons(true); } else { tip = sn.ownname + Environment.NewLine + Environment.NewLine + "No scan data available".Tx(this, "NSD"); } if (sn.children != null && sn.children.Count != 0) { foreach (StarScan.ScanNode snc in sn.children.Values) { if (snc.ScanData != null) { tip += "\n\n" + snc.ScanData.DisplayString(); } } } endpoint = CreateImageLabel(pc, Icons.Controls.Scan_Bodies_Belt, new Point(curpos.X, curpos.Y + alignv), new Size(size.Width, size.Height), sn.ownname, tip, alignv + labelvoff, false, false); offset += size.Width; } else { if (sn.type == StarScan.ScanNodeType.barycentre) { tip = string.Format("Barycentre of {0}".Tx(this, "BC"), sn.ownname); } else { tip = sn.ownname + Environment.NewLine + Environment.NewLine + "No scan data available".Tx(this, "NSD"); } endpoint = CreateImageLabel(pc, notscanned, new Point(curpos.X + offset, curpos.Y + alignv), size, sn.customname ?? sn.ownname, tip, alignv + labelvoff, false, false); offset += size.Width / 2; // return the middle used was this.. } return(endpoint); }