//-------------------------------------------------------------------------------------------------- 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); }
//-------------------------------------------------------------------------------------------------- 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); }
//-------------------------------------------------------------------------------------------------- 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)); }
//-------------------------------------------------------------------------------------------------- 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; } }