void EventManagerDragSample_Loaded(object sender, RoutedEventArgs e) { _eventManager = new Ab3d.Utilities.EventManager3D(Viewport3D1); // When using EventManager3D from Ab3d.PowerToys inside DXEngine, // it is recommended to set the CustomEventsSourceElement to the DXViewportView or its parent element (for example ViewportBorder). // If this is not done, then EventManager3D tries to find the DXViewportView and when found uses it as an element that used to subscribe to mouse events. _eventManager.CustomEventsSourceElement = ViewportBorder; // Exclude TransparentPlaneVisual3D from hit testing _eventManager.RegisterExcludedVisual3D(TransparentPlaneVisual3D); var multiEventSource3D = new Ab3d.Utilities.MultiVisualEventSource3D(); multiEventSource3D.TargetVisuals3D = new Visual3D[] { LowerBoxVisual3D, PassageBoxVisual3D, UpperBoxVisual3D }; multiEventSource3D.IsDragSurface = true; _eventManager.RegisterEventSource3D(multiEventSource3D); var eventSource3D = new Ab3d.Utilities.VisualEventSource3D(); eventSource3D.TargetVisual3D = MovableBoxVisual3D; eventSource3D.Name = "Movable"; eventSource3D.MouseEnter += new Ab3d.Common.EventManager3D.Mouse3DEventHandler(eventSource3D_MouseEnter); eventSource3D.MouseLeave += new Ab3d.Common.EventManager3D.Mouse3DEventHandler(eventSource3D_MouseLeave); eventSource3D.MouseClick += new Ab3d.Common.EventManager3D.MouseButton3DEventHandler(movableEventSource3D_MouseClick); eventSource3D.MouseDrag += new Ab3d.Common.EventManager3D.MouseDrag3DEventHandler(movableEventSource3D_MouseDrag); _eventManager.RegisterEventSource3D(eventSource3D); }
public ModelDecoratorSample() { InitializeComponent(); // Use EventManager3D to subscribe to MouseMove and MouseLeave events on RobotArmModel _eventManager3D = new Ab3d.Utilities.EventManager3D(MainViewport); var visualEventSource3D = new VisualEventSource3D(RobotArmModel); // RobotArmModel is a source of events visualEventSource3D.MouseMove += VisualEventSource3DOnMouseMove; visualEventSource3D.MouseLeave += VisualEventSource3DOnMouseLeave; _eventManager3D.RegisterEventSource3D(visualEventSource3D); // !!! IMPORTANT !!! // We need to exclude ModelDecorator from events // otherwise when mouse would be over line drawin with ModelDecorator we would get a MouseLeave event _eventManager3D.RegisterExcludedVisual3D(ModelDecorator); }
private void SetModel(Model3D model) { Point3D center; double size; GetModelCenterAndSize(model, out center, out size); Camera1.TargetPosition = center; Camera1.Distance = size * 2; if (!(PreserveModelColorCheckBox.IsChecked ?? false)) { if (model.IsFrozen) { model = model.Clone(); } Ab3d.Utilities.ModelUtils.ChangeMaterial(model, new DiffuseMaterial(Brushes.White), newBackMaterial: null); } _rootModel = model; OriginalModelVisual.Content = model; SelectObject(null); var modelEventSource3D = new ModelEventSource3D(model); modelEventSource3D.MouseLeave += ModelEventSource3DOnMouseLeave; modelEventSource3D.MouseMove += ModelEventSource3DOnMouseMove; _eventManager3D.ResetEventSources3D(); _eventManager3D.RegisterEventSource3D(modelEventSource3D); // Exclude WireframeVisual from hit testing _eventManager3D.RegisterExcludedVisual3D(WireframeVisual); }
private void CreateSceneObjects() { for (int y = 0; y < 5; y++) { for (int x = 0; x < 6; x++) { var boxVisual3D = new Ab3d.Visuals.BoxVisual3D() { CenterPosition = new Point3D(40 * x - 100, 6, y * 40 - 80), Size = new Size3D(10, 10, 10), Material = _standardMaterial }; SelectionRootModelVisual3D.Children.Add(boxVisual3D); } } // Use EventManager3D to handle clicking on selected boxes var eventManager3D = new Ab3d.Utilities.EventManager3D(MainViewport); var multiVisualEventSource3D = new MultiVisualEventSource3D(SelectionRootModelVisual3D.Children); multiVisualEventSource3D.MouseEnter += delegate(object sender, Mouse3DEventArgs e) { Mouse.OverrideCursor = Cursors.Hand; var hitBoxVisual3D = e.HitObject as Ab3d.Visuals.BoxVisual3D; if (hitBoxVisual3D != null) { _wireBoxVisual3D.CenterPosition = hitBoxVisual3D.CenterPosition; _wireBoxVisual3D.Size = hitBoxVisual3D.Size; MainViewport.Children.Add(_wireBoxVisual3D); } }; multiVisualEventSource3D.MouseLeave += delegate(object sender, Mouse3DEventArgs e) { Mouse.OverrideCursor = null; if (_wireBoxVisual3D != null) { MainViewport.Children.Remove(_wireBoxVisual3D); } }; multiVisualEventSource3D.MouseClick += delegate(object sender, MouseButton3DEventArgs e) { if (_selectedBoxVisual3D != null) { _selectedBoxVisual3D.Material = _standardMaterial; } var hitBoxVisual3D = e.HitObject as Ab3d.Visuals.BoxVisual3D; if (hitBoxVisual3D != null) { hitBoxVisual3D.Material = _selectedMaterial; _selectedBoxVisual3D = hitBoxVisual3D; if (_wireBoxVisual3D != null) { MainViewport.Children.Remove(_wireBoxVisual3D); } MoveCameraTo(hitBoxVisual3D); } else { _selectedBoxVisual3D = null; } }; eventManager3D.RegisterEventSource3D(multiVisualEventSource3D); // Exclude _wireBoxVisual3D from receiving mouse events eventManager3D.RegisterExcludedVisual3D(_wireBoxVisual3D); }
private void SelectObject(Ab3d.UIElements.BoxUIElement3D selectedBox) { // Deselect currently selected model if (_selectedBoxModel != null) { // Set material back to normal _selectedBoxModel.Material = _normalMaterial; _selectedBoxModel.BackMaterial = null; // Allow hit testing again - so user can select that object again _selectedBoxModel.IsHitTestVisible = true; // IMPORTANT !!! // When ModelMoverVisual3D is used with EventManager3D // we also need to remove the _selectedBoxModel from hit-testing. // This way user will be able to click on the movable arrows that lie inside the _selectedBoxModel (otherwise the _selectedBoxModel will receive the clicks) _eventManager.RemoveExcludedVisual3D(_selectedBoxModel); _selectedBoxModel = null; } _selectedBoxModel = selectedBox; if (_selectedBoxModel == null) { return; } // Prevent hit-testing in selected model // This will allow clicking on the parts of move arrows that are inside the selected model // Note that IsHitTestVisible is available only on models derived from UIElement3D (if you need that on GeometryModel3D or ModelVisual3D, then use ModelUIElement3D as parent of your model) _selectedBoxModel.IsHitTestVisible = false; // IMPORTANT !!! // When ModelMoverVisual3D is used with EventManager3D // we also need to remove the _selectedBoxModel from hit-testing. // This way user will be able to click on the movable arrows that lie inside the _selectedBoxModel (otherwise the _selectedBoxModel will receive the clicks) _eventManager.RegisterExcludedVisual3D(_selectedBoxModel); // Change material to semi-transparent Silver _selectedBoxModel.Material = _selectedMaterial; _selectedBoxModel.BackMaterial = _selectedMaterial; // We also set BackMaterial so the inner side of boxes will be visible // To render the transpant object correctly, we need to sort the objects so that the transparent objects are rendered after other objects // We can use the TransparencySorter from Ab3d.PowerToys // Note that it is also possible to use TransparencySorter with many advanced features - see the Model3DTransparencySortingSample for more info TransparencySorter.SimpleSort(SceneObjectsContainer.Children); // In our simple case (we have only one transparent object), we could also manually "sort" the objects with moving the transparent object to the back of the Children collection: //SceneObjectsContainer.Children.Remove(_selectedBoxVisual3D); //SceneObjectsContainer.Children.Add(_selectedBoxVisual3D); if (_modelMover == null) { SetupModelMover(); } #if !USE_GENERIC_MODEL3D _modelMover.Position = _selectedBoxModel.CenterPosition; #else _startMovePosition = GetSelectedModelCenter(); _modelMover.Position = _startMovePosition; #endif // Tell ModelDecoratorVisual3D which Model3D to show SelectedModelDecorator.TargetModel3D = _selectedBoxModel.Model; // NOTE: // When the 3D models are organized into hierarchy of models with using different ModelVisual3D or Model3DGroup objects, // you also need to so specify the SelectedModelDecorator.RootModelVisual3D in order to get the correct position of the TargetModel3D }