Add "dump object uuid" console command. This allows any object in the scene to be serialized and dumped to XML for debug purposes.

0.7.4-extended
Justin Clark-Casey (justincc) 2012-10-24 02:05:28 +01:00
parent 636994eea6
commit 35ab31fb5f
2 changed files with 168 additions and 91 deletions

View File

@ -32,26 +32,28 @@ using System.Reflection;
using log4net; using log4net;
using OpenMetaverse; using OpenMetaverse;
public class ConsoleUtil namespace OpenSim.Framework.Console
{ {
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public class ConsoleUtil
{
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary> /// <summary>
/// Used by modules to display stock co-ordinate help, though possibly this should be under some general section /// Used by modules to display stock co-ordinate help, though possibly this should be under some general section
/// rather than in each help summary. /// rather than in each help summary.
/// </summary> /// </summary>
public const string CoordHelp public const string CoordHelp
= @"Each component of the coord is comma separated. There must be no spaces between the commas. = @"Each component of the coord is comma separated. There must be no spaces between the commas.
If you don't care about the z component you can simply omit it. If you don't care about the z component you can simply omit it.
If you don't care about the x or y components then you can leave them blank (though a comma is still required) If you don't care about the x or y components then you can leave them blank (though a comma is still required)
If you want to specify the maxmimum value of a component then you can use ~ instead of a number If you want to specify the maxmimum value of a component then you can use ~ instead of a number
If you want to specify the minimum value of a component then you can use -~ instead of a number If you want to specify the minimum value of a component then you can use -~ instead of a number
e.g. e.g.
delete object pos 20,20,20 to 40,40,40 delete object pos 20,20,20 to 40,40,40
delete object pos 20,20 to 40,40 delete object pos 20,20 to 40,40
delete object pos ,20,20 to ,40,40 delete object pos ,20,20 to ,40,40
delete object pos ,,30 to ,,~ delete object pos ,,30 to ,,~
delete object pos ,,-~ to ,,30"; delete object pos ,,-~ to ,,30";
public const string MinRawConsoleVectorValue = "-~"; public const string MinRawConsoleVectorValue = "-~";
public const string MaxRawConsoleVectorValue = "~"; public const string MaxRawConsoleVectorValue = "~";
@ -59,6 +61,27 @@ delete object pos ,,-~ to ,,30";
public const string VectorSeparator = ","; public const string VectorSeparator = ",";
public static char[] VectorSeparatorChars = VectorSeparator.ToCharArray(); public static char[] VectorSeparatorChars = VectorSeparator.ToCharArray();
/// <summary>
/// Try to parse a console UUID from the console.
/// </summary>
/// <remarks>
/// Will complain to the console if parsing fails.
/// </remarks>
/// <returns></returns>
/// <param name='console'></param>
/// <param name='rawUuid'></param>
/// <param name='uuid'></param>
public static bool TryParseConsoleUuid(ICommandConsole console, string rawUuid, out UUID uuid)
{
if (!UUID.TryParse(rawUuid, out uuid))
{
console.OutputFormat("{0} is not a valid uuid", rawUuid);
return false;
}
return true;
}
/// <summary> /// <summary>
/// Convert a minimum vector input from the console to an OpenMetaverse.Vector3 /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3
/// </summary> /// </summary>
@ -124,8 +147,9 @@ delete object pos ,,-~ to ,,30";
string semiDigestedConsoleVector = string.Join(VectorSeparator, semiDigestedComponents.ToArray()); string semiDigestedConsoleVector = string.Join(VectorSeparator, semiDigestedComponents.ToArray());
// m_log.DebugFormat("[CONSOLE UTIL]: Parsing {0} into OpenMetaverse.Vector3", semiDigestedConsoleVector); // m_log.DebugFormat("[CONSOLE UTIL]: Parsing {0} into OpenMetaverse.Vector3", semiDigestedConsoleVector);
return Vector3.TryParse(semiDigestedConsoleVector, out vector); return Vector3.TryParse(semiDigestedConsoleVector, out vector);
} }
}
} }

View File

@ -27,10 +27,12 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Xml;
using log4net; using log4net;
using Mono.Addins; using Mono.Addins;
using NDesk.Options; using NDesk.Options;
@ -41,6 +43,7 @@ using OpenSim.Framework.Console;
using OpenSim.Framework.Monitoring; using OpenSim.Framework.Monitoring;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using OpenSim.Region.Framework.Scenes.Serialization;
namespace OpenSim.Region.CoreModules.World.Objects.Commands namespace OpenSim.Region.CoreModules.World.Objects.Commands
{ {
@ -181,6 +184,16 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
"Show details of scene object parts within the given area.", "Show details of scene object parts within the given area.",
ConsoleUtil.CoordHelp, ConsoleUtil.CoordHelp,
HandleShowPartByPos); HandleShowPartByPos);
m_console.Commands.AddCommand(
"Objects",
false,
"dump object uuid",
"dump object uuid <UUID>",
"Dump the formatted serialization of the given object to the file <UUID>.xml",
"e.g. dump object uuid c1ed6809-cc24-4061-a4c2-93082a2d1f1d will dump serialization to c1ed6809-cc24-4061-a4c2-93082a2d1f1d.xml\n"
+ "To locate the UUID in the first place, you need to use the other show object commands",
HandleDumpObjectByUuid);
} }
public void RemoveRegion(Scene scene) public void RemoveRegion(Scene scene)
@ -447,6 +460,46 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
OutputSopsToConsole(searchPredicate, true); OutputSopsToConsole(searchPredicate, true);
} }
private void HandleDumpObjectByUuid(string module, string[] cmdparams)
{
if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
return;
if (cmdparams.Length < 4)
{
m_console.OutputFormat("Usage: dump object uuid <uuid>");
return;
}
UUID objectUuid;
if (!ConsoleUtil.TryParseConsoleUuid(m_console, cmdparams[3], out objectUuid))
return;
SceneObjectGroup so = m_scene.GetSceneObjectGroup(objectUuid);
if (so == null)
{
// m_console.OutputFormat("No part found with uuid {0}", objectUuid);
return;
}
string fileName = string.Format("{0}.xml", objectUuid);
if (File.Exists(fileName))
{
m_console.OutputFormat("File {0} already exists. Please move or remove it.", fileName);
return;
}
using (XmlTextWriter xtw = new XmlTextWriter(fileName, Encoding.UTF8))
{
xtw.Formatting = Formatting.Indented;
SceneObjectSerializer.ToOriginalXmlFormat(so, xtw, true);
}
m_console.OutputFormat("Object dumped to file {0}", fileName);
}
/// <summary> /// <summary>
/// Append a scene object report to an input StringBuilder /// Append a scene object report to an input StringBuilder
/// </summary> /// </summary>