/SketchModeller/SketchModeller.Modelling/Properties/Services/PrimitivesConverter/PrimitivesConverter.cs

https://bitbucket.org/alexshtf/sketchmodeller · C# · 93 lines · 76 code · 17 blank · 0 comment · 1 complexity · 22ceb20788250acdf9d3d545724ab609 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Windows.Media.Media3D;
  5. using SketchModeller.Infrastructure.Data;
  6. using SketchModeller.Infrastructure.Services;
  7. using NewConverterKey = System.Tuple<System.Type, System.Type>;
  8. namespace SketchModeller.Modelling.Services.PrimitivesConverter
  9. {
  10. class PrimitivesConverter : IPrimitivesConverter
  11. {
  12. private Dictionary<NewConverterKey, INewConverter> newConvertersRegistry;
  13. private Dictionary<Type, ISnappedConverter> snappedConvertersRegistry;
  14. public PrimitivesConverter()
  15. {
  16. newConvertersRegistry = new Dictionary<NewConverterKey, INewConverter>();
  17. snappedConvertersRegistry = new Dictionary<Type, ISnappedConverter>();
  18. RegisterConverter(new SnappedConeConverter());
  19. RegisterConverter(new SnappedCylinderConverter());
  20. RegisterConverter(new ConeConeConverter());
  21. RegisterConverter(new ConeCylinderConverter());
  22. RegisterConverter(new CylinderConeConverter());
  23. RegisterConverter(new CylinderCylinderConverter());
  24. }
  25. public NewPrimitive SnappedToNew(SnappedPrimitive source)
  26. {
  27. return snappedConvertersRegistry[GetKey(source)].Convert(source);
  28. }
  29. public NewPrimitive NewToNew(NewPrimitive source, Type targetType, Vector3D moveVector)
  30. {
  31. return newConvertersRegistry[GetKey(source, targetType)].Convert(source, moveVector);
  32. }
  33. public void ApplyMovement(NewPrimitive source, NewPrimitive target, Vector3D moveVector)
  34. {
  35. newConvertersRegistry[GetKey(source, target)].ApplyMovement(source, target, moveVector);
  36. }
  37. public Type[] GetTargetTypes(NewPrimitive source)
  38. {
  39. var query =
  40. from key in newConvertersRegistry.Keys
  41. where key.Item1 == source.GetType()
  42. select key.Item2;
  43. return query.ToArray();
  44. }
  45. private void RegisterConverter(INewConverter newConverter)
  46. {
  47. newConvertersRegistry.Add(GetKey(newConverter), newConverter);
  48. }
  49. private void RegisterConverter(ISnappedConverter snappedConverter)
  50. {
  51. snappedConvertersRegistry.Add(GetKey(snappedConverter), snappedConverter);
  52. }
  53. #region GetKey methods
  54. private static NewConverterKey GetKey(INewConverter converter)
  55. {
  56. return Tuple.Create(converter.SourceType, converter.TargetType);
  57. }
  58. private static NewConverterKey GetKey(NewPrimitive source, Type targetType)
  59. {
  60. return Tuple.Create(source.GetType(), targetType);
  61. }
  62. private static NewConverterKey GetKey(NewPrimitive source, NewPrimitive target)
  63. {
  64. return Tuple.Create(source.GetType(), target.GetType());
  65. }
  66. private static Type GetKey(ISnappedConverter converter)
  67. {
  68. return converter.SnappedType;
  69. }
  70. private static Type GetKey(SnappedPrimitive source)
  71. {
  72. return source.GetType();
  73. }
  74. #endregion
  75. }
  76. }