/// <summary> /// Gets the transform. /// </summary> /// <param name="current"> /// The current. /// </param> /// <param name="model"> /// The model. /// </param> /// <param name="parentTransform"> /// The parent transform. /// </param> /// <returns> /// The transform. /// </returns> private static GeneralTransform3D GetTransform(Model3D current, Model3D model, Transform3D parentTransform) { var currentTransform = Transform3DHelper.CombineTransform(current.Transform, parentTransform); if (current == model) { return(currentTransform); } var mg = current as Model3DGroup; if (mg != null) { foreach (var m in mg.Children) { var result = GetTransform(m, model, currentTransform); if (result != null) { return(result); } } } return(null); }
/// <summary> /// Traverses the visual tree and invokes the specified action on each object of the specified type. /// </summary> /// <typeparam name="T"> /// The type filter. /// </typeparam> /// <param name="visual"> /// The visual. /// </param> /// <param name="transform"> /// The transform. /// </param> /// <param name="action"> /// The action. /// </param> private static void Traverse<T>(Visual3D visual, Transform3D transform, Action<T, Transform3D> action) where T : Model3D { var childTransform = Transform3DHelper.CombineTransform(visual.Transform, transform); var model = GetModel(visual); if (model != null) { TraverseModel(model, childTransform, action); } foreach (var child in GetChildren(visual)) { Traverse(child, childTransform, action); } }
/// <summary> /// Traverses the Model3D tree. Run the specified action for each Model3D. /// </summary> /// <typeparam name="T"> /// </typeparam> /// <param name="model"> /// The model. /// </param> /// <param name="transform"> /// The transform. /// </param> /// <param name="action"> /// The action. /// </param> public static void TraverseModel<T>(Model3D model, Transform3D transform, Action<T, Transform3D> action) where T : Model3D { var mg = model as Model3DGroup; if (mg != null) { var childTransform = Transform3DHelper.CombineTransform(model.Transform, transform); foreach (var m in mg.Children) { TraverseModel(m, childTransform, action); } } var gm = model as T; if (gm != null) { var childTransform = Transform3DHelper.CombineTransform(model.Transform, transform); action(gm, childTransform); } }
/// <summary> /// Finds the bounding box for the specified visual. /// </summary> /// <param name="visual"> /// The visual. /// </param> /// <param name="transform"> /// The transform of the visual. /// </param> /// <returns> /// A <see cref="Rect3D"/>. /// </returns> public static Rect3D FindBounds(Visual3D visual, Transform3D transform) { var bounds = Rect3D.Empty; var childTransform = Transform3DHelper.CombineTransform(visual.Transform, transform); var model = GetModel(visual); if (model != null) { // apply transform var transformedBounds = childTransform.TransformBounds(model.Bounds); if (!double.IsNaN(transformedBounds.X)) { bounds.Union(transformedBounds); } } foreach (var child in GetChildren(visual)) { var b = FindBounds(child, childTransform); bounds.Union(b); } return bounds; }