protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); mouseDown = false; //使用shift键放大缩小 if (shiftPressed) { rectZoomInteractor.ProcessMouseButtonUp(new CanonicalMouseEventArgs(e), GetInteractionContext()); rectZoomInteractor.Deactivate(); Invalidate(); } else { panInteractor.Deactivate(); // Select entity at mouse location if mouse didn't move // and show entity in property grid. if (mouseClickLocation == e.Location) { Point2D referencePoint = new Point2D(e.X, e.Y); double distance; IList <RenderedEntityInfo> closestEntities = EntitySelector.GetClosestEntities( model, GraphicsConfig.BlackBackgroundCorrectForBackColor, gdiGraphics3D.To2DTransform, referencePoint, out distance ); if (highlightedEntity != null) { IList <IWireframeDrawable> drawables = graphicsCache.GetDrawables(highlightedEntity); IWireframeGraphicsFactory graphicsFactory = null; gdiGraphics3D.UpdateDrawables( highlightedEntity, () => { foreach (IWireframeDrawable drawable in drawables) { drawable.Draw(graphicsFactory); } }, o => graphicsFactory = o ); Invalidate(); highlightedEntity = null; } if (closestEntities.Count > 0) { // Chose the last entity as it is drawn last, so will be on top. highlightedEntity = closestEntities[closestEntities.Count - 1]; IList <IWireframeDrawable> drawables = graphicsCache.GetDrawables(highlightedEntity); WireframeGraphicsFactoryColorChanger graphicsFactoryColorChanger = null; gdiGraphics3D.UpdateDrawables( highlightedEntity, () => { foreach (IWireframeDrawable drawable in drawables) { drawable.Draw(graphicsFactoryColorChanger); } }, o => graphicsFactoryColorChanger = new WireframeGraphicsFactoryColorChanger(o, ColorChanger) ); Invalidate(); DxfEntity entity = highlightedEntity.Entity; OnEntitySelected(new EntityEventArgs(entity)); } } } currentInteractorDrawable = null; }
public virtual void ImageControl_OnMouseUp(object sender, MouseEventArgs e) { base.OnMouseUp(e); mouseDown = false; // Use shift key for rectangle zoom. if (shiftPressed) { DrawReversibleRectangle(mouseClickLocation, lastMouseLocation); Point2D corner1 = new Point2D( Math.Min(mouseClickLocation.X, e.Location.X), Math.Min(mouseClickLocation.Y, e.Location.Y) ); Point2D corner2 = new Point2D( Math.Max(mouseClickLocation.X, e.Location.X), Math.Max(mouseClickLocation.Y, e.Location.Y) ); Vector2D delta = corner2 - corner1; if (!(MathUtil.AreApproxEqual(delta.X, 0d) || MathUtil.AreApproxEqual(delta.Y, 0d))) { Matrix4D oldTo2DTransform = CalculateTo2DTransform1(); // Update scaleFactor double scale = Math.Min(ImageControl.ClientSize.Width / delta.X, ImageControl.ClientSize.Height / delta.Y); scaleFactor *= scale; //// Update translation Point3D screenSpaceCenter = new Point3D(corner1 + 0.5d * delta, 0d); Point3D newModelSpaceCenter = oldTo2DTransform.GetInverse().Transform(new Point3D(corner1 + 0.5d * delta, 0d)); Matrix4D intermediateTo2DTransform = CalculateTo2DTransform1(); intermediateTo2DTransform.TransformTo2D(newModelSpaceCenter); Point3D intermediateScreenSpaceCenter = intermediateTo2DTransform.Transform(newModelSpaceCenter); translation += ( new Point3D(0.5d * ImageControl.ClientSize.Width, 0.5d * ImageControl.ClientSize.Height, 0d) - intermediateScreenSpaceCenter ); CalculateTo2DTransform1(); ImageControl.Invalidate(); shiftPressed = false; } } else { // Select entity at mouse location if mouse didn't move // and show entity in property grid. if (mouseClickLocation == e.Location) { try { Point2D referencePoint = new Point2D(e.X, e.Y); double distance; IList <RenderedEntityInfo> closestEntities = EntitySelector.GetClosestEntities( model, GraphicsConfig.BlackBackgroundCorrectForBackColor, gdiGraphics3D.To2DTransform, referencePoint, out distance ); if (closestEntities.Count > 0) { DxfEntity entity = closestEntities[0].Entity; OnEntitySelected(new EntityEventArgs(entity)); } } catch { } } } }