//--------------------------------------------------------------------------------------------------

        public override bool OnMouseMove(MouseEventData data)
        {
            if (!IsFinished)
            {
                EnsureMarker();

                ProcessMouseInput(data);

                _Marker.SetComponent(new Geom_CartesianPoint(ElSLib.Value(Point.X, Point.Y, _SketchEditorTool.Sketch.Plane)));
                WorkspaceController.Workspace.AisContext.RecomputePrsOnly(_Marker, false);
                WorkspaceController.Invalidate();

                UpdateMergeMarker();

                return(base.OnMouseMove(data));
            }
            return(false);
        }
        //--------------------------------------------------------------------------------------------------

        #endregion

        #region Screen Space Conversions

        public bool ScreenToPoint(int screenX, int screenY, out Pnt resultPnt)
        {
            try
            {
                var    viewPlane = GetViewPlane();
                double x = 0, y = 0, z = 0;
                V3dView.Convert(screenX, screenY, ref x, ref y, ref z);
                Pnt   convertedPoint        = new Pnt(x, y, z);
                Pnt2d convertedPointOnPlane = ProjLib.Project(viewPlane, convertedPoint);

                resultPnt = ElSLib.Value(convertedPointOnPlane.X, convertedPointOnPlane.Y, viewPlane);
                return(true);
            }
            catch (Exception)
            {
                Debug.Assert(false);
            }

            resultPnt = Pnt.Origin;
            return(false);
        }
Exemple #3
0
        //--------------------------------------------------------------------------------------------------

        void ProcessMouseInput(MouseEventData data)
        {
            // Get new point from parameters
            double u = 0, v = 0;

            ElSLib.Parameters(_SketchEditorTool.Sketch.Plane, data.PointOnPlane, ref u, ref v);
            var sketchPoint = new Pnt2d(u, v);

            Point = Snap(sketchPoint);

            // Recalculate point on working plane
            if (_SketchEditorTool.Sketch.Plane.Location.IsEqual(WorkspaceController.Workspace.WorkingPlane.Location, 0.00001))
            {
                PointOnWorkingPlane = Point;
            }
            else
            {
                ElSLib.Parameters(WorkspaceController.Workspace.WorkingPlane, _SketchEditorTool.Sketch.Plane.Location, ref u, ref v);
                PointOnWorkingPlane = Point.Translated(new Vec2d(u, v));
            }
        }
        public static bool SnapToGrid(Pnt2d point, Sketch sketch, out Pnt2d snapPoint, out double distance)
        {
            var workspace = InteractiveContext.Current.WorkspaceController.Workspace;

            if (workspace.V3dViewer.Grid().IsActive())
            {
                double u = 0, v = 0;
                ElSLib.Parameters(sketch.Plane, workspace.WorkingPlane.Location, ref u, ref v);
                var wpOffset      = new XY(u, v);
                var coordOnWp     = point.ToXY() - wpOffset;
                var flipY         = new XY(1, -1);
                var snapCoordOnWp = workspace.ComputeGridPoint(coordOnWp * flipY) * flipY;
                snapPoint = (snapCoordOnWp + wpOffset).ToPnt();
                distance  = point.Distance(snapPoint);
                return(true);
            }

            snapPoint = new Pnt2d();
            distance  = 0;
            return(false);
        }
Exemple #5
0
        //--------------------------------------------------------------------------------------------------

        void UpdateTrihedron()
        {
            if (!Points.Any())
            {
                return;
            }

            // Calc Center
            var center = new XY();

            Points.ForEach(i => center.Add(_Sketch.Points[i].Coord));
            center.Divide(Points.Count);
            _Center2D = center.ToPnt();

            //Debug.WriteLine("MoveSketchPointAction - Center {0} {1}", center.X(), center.Y());

            // Project center point onto sketch plane
            var center3D = ElSLib.Value(center.X, center.Y, _Sketch.Plane);
            //Debug.WriteLine("MoveSketchPointAction - Center3D {0} {1} {2}", center3D.X(), center3D.Y(), center3D.Z());

            // Use plane from sketch, but translate it to center position
            var plane = _Sketch.Plane;

            plane.Location = center3D;
            _GizmoPlane    = new Geom_Plane(plane);
            _GeomPlane     = new Geom_Plane(plane);

            // Create Gizmo
            if (Gizmo == null)
            {
                Gizmo = new AIS_TranslationGizmo2D(_GizmoPlane);
                Gizmo.SetLength(100);
                WorkspaceController.Workspace.AisContext.Display(Gizmo, false);
            }
            else
            {
                Gizmo.SetComponent(_GeomPlane);
                WorkspaceController.Workspace.AisContext.Redisplay(Gizmo, false);
            }
        }
        //--------------------------------------------------------------------------------------------------

        double?_ProcessMouseInputForAxis(MouseEventData data, out double distance)
        {
            var planeDir = WorkspaceController.ActiveViewport.GetRightDirection();

            planeDir.Cross(_Axis.Direction);
            //Console.WriteLine("PlaneDir: {0:0.00} | {1:0.00} | {2:0.00}", planeDir.X(), planeDir.Y(), planeDir.Z());
            var plane = new Pln(new Ax3(_Axis.Location, planeDir, _Axis.Direction));

            var snapInfo  = WorkspaceController.SnapHandler.Snap(data);
            var snapPoint = WorkspaceController.SnapHandler.SnapOnPlane(snapInfo, plane);

            if (snapPoint != null)
            {
                // Point snapped
                var extrema = new Extrema_ExtPC(ElSLib.Value(snapPoint.Value.X, snapPoint.Value.Y, plane), new GeomAdaptor_Curve(new Geom_Line(_Axis)), 1.0e-10);
                if (extrema.IsDone() && extrema.NbExt() >= 1)
                {
                    var value = extrema.Point(1).Parameter();
                    distance = snapInfo.Point.Distance(_Axis.Location);
                    return(value);
                }
            }
            else
            {
                Pnt convertedPoint;
                if (WorkspaceController.ActiveViewport.ScreenToPoint(plane, Convert.ToInt32(data.ScreenPoint.X), Convert.ToInt32(data.ScreenPoint.Y), out convertedPoint))
                {
                    var extrema = new Extrema_ExtPC(convertedPoint, new GeomAdaptor_Curve(new Geom_Line(_Axis)), 1.0e-10);
                    if (extrema.IsDone() && extrema.NbExt() >= 1)
                    {
                        var value = extrema.Point(1).Parameter();
                        distance = convertedPoint.Distance(_Axis.Location);
                        return(value);
                    }
                }
            }
            distance = 0;
            return(null);
        }
        //--------------------------------------------------------------------------------------------------

        public static Pnt Value(this Pln pln, Pnt2d uv)
        {
            return(ElSLib.Value(uv.X, uv.Y, pln));
        }
Exemple #8
0
        //--------------------------------------------------------------------------------------------------

        void ProcessMouseInput(MouseEventData data)
        {
            SelectedSegment     = null;
            SelectedPointIndex  = -1;
            SelectedElementType = Sketch.ElementType.None;

            var element = _SketchEditorTool.Elements.FindOwner(data.DetectedAisInteractives.FirstOrDefault());

            if (element == null)
            {
                return;
            }

            if (element is SketchEditorSegmentElement segmentElement)
            {
                //
                // Segment
                //
                var segment = segmentElement.Segment;
                if (!SketchUtils.CanSplitSegment(_SketchEditorTool.Sketch, segment))
                {
                    return;
                }

                var curve = segment.CachedCurve ?? segment.MakeCurve(_SketchEditorTool.Sketch.Points);
                if (curve == null)
                {
                    return;
                }

                // Get new point from parameters
                double u = 0, v = 0;
                ElSLib.Parameters(_SketchEditorTool.Sketch.Plane, data.PointOnPlane, ref u, ref v);
                var sketchPoint  = new Pnt2d(u, v);
                var pointOnCurve = new Geom2dAPI_ProjectPointOnCurve(sketchPoint, curve);

                if (pointOnCurve.NbPoints() < 1)
                {
                    return;
                }

                SelectedParameter   = pointOnCurve.LowerDistanceParameter();
                SelectedSegment     = segment;
                _SelectedPoint      = _SketchEditorTool.Sketch.Plane.Value(curve.Value(SelectedParameter));
                SelectedElementType = Sketch.ElementType.Segment;
            }
            else if (element is SketchEditorPointElement pointElement)
            {
                //
                // Point
                //
                var pointIndex = pointElement.PointIndex;
                if (!SketchUtils.CanSplitPoint(_SketchEditorTool.Sketch, pointIndex))
                {
                    return;
                }

                SelectedPointIndex  = pointIndex;
                _SelectedPoint      = _SketchEditorTool.Sketch.Plane.Value(_SketchEditorTool.Sketch.Points[pointIndex]);
                SelectedElementType = Sketch.ElementType.Point;
            }
        }