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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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
        }