aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs175
1 files changed, 141 insertions, 34 deletions
diff --git a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
index 09f6758..6e39e9a 100644
--- a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
@@ -126,6 +126,25 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
126 m_console.Commands.AddCommand( 126 m_console.Commands.AddCommand(
127 "Objects", 127 "Objects",
128 false, 128 false,
129 "show object pos",
130 "show object pos <start-coord> to <end-coord>",
131 "Show details of scene objects within the given area.",
132 "Each component of the coord is comma separated. There must be no spaces between the commas.\n"
133 + "If you don't care about the z component you can simply omit it.\n"
134 + "If you don't care about the x or y components then you can leave them blank (though a comma is still required)\n"
135 + "If you want to specify the maxmimum value of a component then you can use ~ instead of a number\n"
136 + "If you want to specify the minimum value of a component then you can use -~ instead of a number\n"
137 + "e.g.\n"
138 + "show object pos 20,20,20 to 40,40,40\n"
139 + "show object pos 20,20 to 40,40\n"
140 + "show object pos ,20,20 to ,40,40\n"
141 + "show object pos ,,30 to ,,~\n"
142 + "show object pos ,,-~ to ,,30",
143 HandleShowObjectByPos);
144
145 m_console.Commands.AddCommand(
146 "Objects",
147 false,
129 "show part uuid", 148 "show part uuid",
130 "show part uuid <UUID>", 149 "show part uuid <UUID>",
131 "Show details of a scene object parts with the given UUID", HandleShowPartByUuid); 150 "Show details of a scene object parts with the given UUID", HandleShowPartByUuid);
@@ -138,6 +157,25 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
138 "Show details of scene object parts with the given name.", 157 "Show details of scene object parts with the given name.",
139 "If --regex is specified then the name is treatead as a regular expression", 158 "If --regex is specified then the name is treatead as a regular expression",
140 HandleShowPartByName); 159 HandleShowPartByName);
160
161 m_console.Commands.AddCommand(
162 "Objects",
163 false,
164 "show part pos",
165 "show part pos <start-coord> to <end-coord>",
166 "Show details of scene object parts within the given area.",
167 "Each component of the coord is comma separated. There must be no spaces between the commas.\n"
168 + "If you don't care about the z component you can simply omit it.\n"
169 + "If you don't care about the x or y components then you can leave them blank (though a comma is still required)\n"
170 + "If you want to specify the maxmimum value of a component then you can use ~ instead of a number\n"
171 + "If you want to specify the minimum value of a component then you can use -~ instead of a number\n"
172 + "e.g.\n"
173 + "show object pos 20,20,20 to 40,40,40\n"
174 + "show object pos 20,20 to 40,40\n"
175 + "show object pos ,20,20 to ,40,40\n"
176 + "show object pos ,,30 to ,,~\n"
177 + "show object pos ,,-~ to ,,30",
178 HandleShowPartByPos);
141 } 179 }
142 180
143 public void RemoveRegion(Scene scene) 181 public void RemoveRegion(Scene scene)
@@ -150,6 +188,43 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
150// m_log.DebugFormat("[OBJECTS COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); 188// m_log.DebugFormat("[OBJECTS COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName);
151 } 189 }
152 190
191 private void OutputSogsToConsole(Predicate<SceneObjectGroup> searchPredicate)
192 {
193 List<SceneObjectGroup> sceneObjects = m_scene.GetSceneObjectGroups().FindAll(searchPredicate);
194
195 StringBuilder sb = new StringBuilder();
196
197 foreach (SceneObjectGroup so in sceneObjects)
198 {
199 AddSceneObjectReport(sb, so);
200 sb.Append("\n");
201 }
202
203 sb.AppendFormat("{0} object(s) found in {1}\n", sceneObjects.Count, m_scene.Name);
204
205 m_console.OutputFormat(sb.ToString());
206 }
207
208 private void OutputSopsToConsole(Predicate<SceneObjectPart> searchPredicate)
209 {
210 List<SceneObjectGroup> sceneObjects = m_scene.GetSceneObjectGroups();
211 List<SceneObjectPart> parts = new List<SceneObjectPart>();
212
213 sceneObjects.ForEach(so => parts.AddRange(Array.FindAll<SceneObjectPart>(so.Parts, searchPredicate)));
214
215 StringBuilder sb = new StringBuilder();
216
217 foreach (SceneObjectPart part in parts)
218 {
219 AddScenePartReport(sb, part);
220 sb.Append("\n");
221 }
222
223 sb.AppendFormat("{0} parts found in {1}\n", parts.Count, m_scene.Name);
224
225 m_console.OutputFormat(sb.ToString());
226 }
227
153 private void HandleShowObjectByUuid(string module, string[] cmd) 228 private void HandleShowObjectByUuid(string module, string[] cmd)
154 { 229 {
155 if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) 230 if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
@@ -200,36 +275,54 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
200 275
201 string name = mainParams[3]; 276 string name = mainParams[3];
202 277
203 List<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>(); 278 Predicate<SceneObjectGroup> searchPredicate;
204 Action<SceneObjectGroup> searchAction;
205 279
206 if (useRegex) 280 if (useRegex)
207 { 281 {
208 Regex nameRegex = new Regex(name); 282 Regex nameRegex = new Regex(name);
209 searchAction = so => { if (nameRegex.IsMatch(so.Name)) { sceneObjects.Add(so); }}; 283 searchPredicate = so => nameRegex.IsMatch(so.Name);
210 } 284 }
211 else 285 else
212 { 286 {
213 searchAction = so => { if (so.Name == name) { sceneObjects.Add(so); }}; 287 searchPredicate = so => so.Name == name;
214 } 288 }
215 289
216 m_scene.ForEachSOG(searchAction); 290 OutputSogsToConsole(searchPredicate);
291 }
217 292
218 if (sceneObjects.Count == 0) 293 private void HandleShowObjectByPos(string module, string[] cmdparams)
294 {
295 if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
296 return;
297
298 if (cmdparams.Length < 5)
219 { 299 {
220 m_console.OutputFormat("No objects with name {0} found in {1}", name, m_scene.RegionInfo.RegionName); 300 m_console.OutputFormat("Usage: show object pos <start-coord> to <end-coord>");
221 return; 301 return;
222 } 302 }
223 303
224 StringBuilder sb = new StringBuilder(); 304 string rawConsoleStartVector = cmdparams[3];
305 Vector3 startVector;
225 306
226 foreach (SceneObjectGroup so in sceneObjects) 307 if (!ConsoleUtil.TryParseConsoleMinVector(rawConsoleStartVector, out startVector))
227 { 308 {
228 AddSceneObjectReport(sb, so); 309 m_console.OutputFormat("Error: Start vector {0} does not have a valid format", rawConsoleStartVector);
229 sb.Append("\n"); 310 return;
230 } 311 }
231 312
232 m_console.OutputFormat(sb.ToString()); 313 string rawConsoleEndVector = cmdparams[5];
314 Vector3 endVector;
315
316 if (!ConsoleUtil.TryParseConsoleMaxVector(rawConsoleEndVector, out endVector))
317 {
318 m_console.OutputFormat("Error: End vector {0} does not have a valid format", rawConsoleEndVector);
319 return;
320 }
321
322 Predicate<SceneObjectGroup> searchPredicate
323 = so => Util.IsInsideBox(so.AbsolutePosition, startVector, endVector);
324
325 OutputSogsToConsole(searchPredicate);
233 } 326 }
234 327
235 private void HandleShowPartByUuid(string module, string[] cmd) 328 private void HandleShowPartByUuid(string module, string[] cmd)
@@ -264,6 +357,38 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
264 m_console.OutputFormat(sb.ToString()); 357 m_console.OutputFormat(sb.ToString());
265 } 358 }
266 359
360 private void HandleShowPartByPos(string module, string[] cmdparams)
361 {
362 if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
363 return;
364
365 if (cmdparams.Length < 5)
366 {
367 m_console.OutputFormat("Usage: show part pos <start-coord> to <end-coord>");
368 return;
369 }
370
371 string rawConsoleStartVector = cmdparams[3];
372 Vector3 startVector;
373
374 if (!ConsoleUtil.TryParseConsoleMinVector(rawConsoleStartVector, out startVector))
375 {
376 m_console.OutputFormat("Error: Start vector {0} does not have a valid format", rawConsoleStartVector);
377 return;
378 }
379
380 string rawConsoleEndVector = cmdparams[5];
381 Vector3 endVector;
382
383 if (!ConsoleUtil.TryParseConsoleMaxVector(rawConsoleEndVector, out endVector))
384 {
385 m_console.OutputFormat("Error: End vector {0} does not have a valid format", rawConsoleEndVector);
386 return;
387 }
388
389 OutputSopsToConsole(sop => Util.IsInsideBox(sop.AbsolutePosition, startVector, endVector));
390 }
391
267 private void HandleShowPartByName(string module, string[] cmdparams) 392 private void HandleShowPartByName(string module, string[] cmdparams)
268 { 393 {
269 if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) 394 if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
@@ -282,37 +407,19 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
282 407
283 string name = mainParams[3]; 408 string name = mainParams[3];
284 409
285 List<SceneObjectPart> parts = new List<SceneObjectPart>(); 410 Predicate<SceneObjectPart> searchPredicate;
286
287 Action<SceneObjectGroup> searchAction;
288 411
289 if (useRegex) 412 if (useRegex)
290 { 413 {
291 Regex nameRegex = new Regex(name); 414 Regex nameRegex = new Regex(name);
292 searchAction = so => so.ForEachPart(sop => { if (nameRegex.IsMatch(sop.Name)) { parts.Add(sop); } }); 415 searchPredicate = sop => nameRegex.IsMatch(sop.Name);
293 } 416 }
294 else 417 else
295 { 418 {
296 searchAction = so => so.ForEachPart(sop => { if (sop.Name == name) { parts.Add(sop); } }); 419 searchPredicate = sop => sop.Name == name;
297 } 420 }
298 421
299 m_scene.ForEachSOG(searchAction); 422 OutputSopsToConsole(searchPredicate);
300
301 if (parts.Count == 0)
302 {
303 m_console.OutputFormat("No parts with name {0} found in {1}", name, m_scene.RegionInfo.RegionName);
304 return;
305 }
306
307 StringBuilder sb = new StringBuilder();
308
309 foreach (SceneObjectPart part in parts)
310 {
311 AddScenePartReport(sb, part);
312 sb.Append("\n");
313 }
314
315 m_console.OutputFormat(sb.ToString());
316 } 423 }
317 424
318 private StringBuilder AddSceneObjectReport(StringBuilder sb, SceneObjectGroup so) 425 private StringBuilder AddSceneObjectReport(StringBuilder sb, SceneObjectGroup so)