Browse Source

修正测量目标超出区域的问题 #0011937 #0011930 #0011931

gavin.chen 2 years ago
parent
commit
555ffdc430

+ 12 - 0
lib/process/items/item.dart

@@ -188,6 +188,18 @@ abstract class MeasureItem<T extends MeasureItemFeature> extends IMeasureItem {
     calculator?.calculate();
   }
 
+  /// 拖动目标是否超出区域
+  @protected
+  bool isMoveTargetOutOfRange(PointInfo args) {
+    if (args.hostVisualArea == null) {
+      return false;
+    }
+    if (args.hostVisualArea!.displayRegion.containsPoint(args)) {
+      return false;
+    }
+    return true;
+  }
+
   @protected
   bool onExecuteMouse(PointInfo args);
   @protected

+ 10 - 4
lib/process/primitives/ellipse.dart

@@ -86,15 +86,21 @@ class Ellipse extends AreaItemAbstract {
       }
       if (args.pointType == PointInfoType.touchMove) {
         if (isFirstPointMove) {
-          DPoint newStartPoint = args;
+          PointInfo newStartPoint = args;
           newStartPoint.addOffset(0, -0.2);
+          if (isMoveTargetOutOfRange(newStartPoint)) return true;
           for (var element in f.innerPoints) {
             element.update(newStartPoint);
           }
         } else {
-          DPoint newPoint = currPointLastPosition
-              .clone()
-              .addVector(args - touchStartPosition);
+          PointInfo newPoint = PointInfo.fromOffset(
+              currPointLastPosition
+                  .clone()
+                  .addVector(args - touchStartPosition)
+                  .toOffset(),
+              args.pointType);
+          newPoint.hostVisualArea = args.hostVisualArea;
+          if (isMoveTargetOutOfRange(newPoint)) return true;
           f.innerPoints[f.activeIndex] = newPoint;
           f.adjustPoints(newPoint);
         }

+ 2 - 8
lib/process/primitives/location.dart

@@ -77,14 +77,8 @@ class Location extends MeasureItem<LocationFeature> {
         doCalculate();
       }
       if (args.pointType == PointInfoType.touchMove) {
-        // 判断偏移后的点是否超出范围,如果超出,取消偏移
-        if (args.hostVisualArea!.displayRegion
-            .containsPoint(args.clone().addVector(DVector(0, -0.2)))) {
-          args.addOffset(0, -0.2);
-        } else {
-          // 如果高度超出则贴边
-          args.y = args.hostVisualArea!.displayRegion.top;
-        }
+        args.addOffset(0, -0.2);
+        if (isMoveTargetOutOfRange(args)) return true;
         feature?.point = args;
         doCalculate();
       }

+ 2 - 0
lib/process/primitives/multi_method/multiple_trace.dart

@@ -97,6 +97,7 @@ class MultiTrace extends TraceItemAbstract {
           touchState.touchOffset = Offset.zero;
           break; // 按下立即抬起无事发生
         case PointInfoType.touchMove:
+          if (isMoveTargetOutOfRange(args)) return true;
           isFirstPointMove = true;
           final pixelSize = application.displaySize;
           touchState.touchOffset =
@@ -121,6 +122,7 @@ class MultiTrace extends TraceItemAbstract {
         PointInfo newPoint = PointInfo.fromOffset(
             startPoint!.clone().addVector(args - touchStartPosition).toOffset(),
             startPoint!.pointType);
+        if (isMoveTargetOutOfRange(newPoint)) return true;
         feature?.adopt(newPoint);
         doCalculate();
       }

+ 2 - 0
lib/process/primitives/polyline.dart

@@ -92,6 +92,7 @@ class Polyline extends AreaItemAbstract with AutoSnapMixin {
           feature?.innerPoints.first = args;
           break; // 按下立即抬起无事发生
         case PointInfoType.touchMove:
+          if (isMoveTargetOutOfRange(args)) return true;
           isFirstPointNeedOffset = true;
           feature?.innerPoints.first = args;
           break;
@@ -119,6 +120,7 @@ class Polyline extends AreaItemAbstract with AutoSnapMixin {
         f.innerPoints.add(lastStartPoint);
       }
       if (args.pointType == PointInfoType.touchMove) {
+        if (isMoveTargetOutOfRange(args)) return true;
         isOtherPointNeedOffset = true;
         f.innerPoints.last = newPoint;
       }

+ 2 - 0
lib/process/primitives/polyline_angle.dart

@@ -79,6 +79,7 @@ class PolylineAngle extends MeasureItem<PolylineAngleFeature> {
           feature?.innerPoints.first = args;
           break; // 按下立即抬起无事发生
         case PointInfoType.touchMove:
+          if (isMoveTargetOutOfRange(args)) return true;
           isFirstPointNeedOffset = true;
           feature?.innerPoints.first = args;
           break;
@@ -110,6 +111,7 @@ class PolylineAngle extends MeasureItem<PolylineAngleFeature> {
         f.innerPoints.add(lastStartPoint);
       }
       if (args.pointType == PointInfoType.touchMove) {
+        if (isMoveTargetOutOfRange(args)) return true;
         isOtherPointNeedOffset = true;
         f.innerPoints.last = newPoint;
       }

+ 10 - 2
lib/process/primitives/ray.dart

@@ -90,10 +90,18 @@ class Ray extends MeasureItem<RayFeature> {
       if (args.pointType == PointInfoType.touchMove) {
         isNeedFinish = false;
         if (isFirstTouch) {
+          if (isMoveTargetOutOfRange(args)) return true;
           feature?.point = args;
         } else {
-          feature?.point =
-              lastLinePosition.clone().addVector(args - touchStartPoint);
+          PointInfo newPoint = PointInfo.fromOffset(
+              lastLinePosition
+                  .clone()
+                  .addVector(args - touchStartPoint)
+                  .toOffset(),
+              args.pointType);
+          newPoint.hostVisualArea = args.hostVisualArea;
+          if (isMoveTargetOutOfRange(newPoint)) return true;
+          feature?.point = newPoint;
         }
         doCalculate();
       }

+ 11 - 2
lib/process/primitives/spline.dart

@@ -93,6 +93,8 @@ class Spline extends AreaItemAbstract with AutoSnapMixin {
           feature?.innerPoints.first = args;
           break; // 按下立即抬起无事发生
         case PointInfoType.touchMove:
+          if (isMoveTargetOutOfRange(args)) return true;
+
           isFirstPointNeedOffset = true;
           feature?.innerPoints.first = args;
           break;
@@ -101,8 +103,13 @@ class Spline extends AreaItemAbstract with AutoSnapMixin {
       }
     } else if (state == ItemStates.running) {
       if (feature == null) return false;
-      DPoint newPoint =
-          lastStartPoint.clone().addVector(args - splineTouchStartPoint);
+      PointInfo newPoint = PointInfo.fromOffset(
+          lastStartPoint
+              .clone()
+              .addVector(args - splineTouchStartPoint)
+              .toOffset(),
+          args.pointType);
+      newPoint.hostVisualArea = args.hostVisualArea;
       final f = feature!;
       if (args.pointType == PointInfoType.touchUp) {
         if (!isOtherPointNeedOffset) {
@@ -120,6 +127,8 @@ class Spline extends AreaItemAbstract with AutoSnapMixin {
         f.innerPoints.add(lastStartPoint);
       }
       if (args.pointType == PointInfoType.touchMove) {
+        if (isMoveTargetOutOfRange(newPoint)) return true;
+
         isOtherPointNeedOffset = true;
         f.innerPoints.last = newPoint;
       }

+ 10 - 3
lib/process/primitives/straightline.dart

@@ -110,6 +110,7 @@ class StraightLine extends MeasureItem<StraightLineFeature> {
         case PointInfoType.touchMove:
           isFirstPointMove = true;
           args.addOffset(0, -0.2); // 添加偏移
+          if (isMoveTargetOutOfRange(args)) return true;
           feature?.startPoint = args;
           feature?.endPoint = args;
           break;
@@ -130,11 +131,17 @@ class StraightLine extends MeasureItem<StraightLineFeature> {
           secondTouchStartPoint = args;
           break;
         case PointInfoType.touchMove:
+          PointInfo newPoint = PointInfo.fromOffset(
+              firstTouchStartPoint!
+                  .clone()
+                  .addVector(args - secondTouchStartPoint!)
+                  .toOffset(),
+              args.pointType);
+          newPoint.hostVisualArea = args.hostVisualArea;
+          if (isMoveTargetOutOfRange(newPoint)) return true;
           isSecondPointMove = true;
           doCalculate();
-          feature?.endPoint = firstTouchStartPoint!
-              .clone()
-              .addVector(args - secondTouchStartPoint!);
+          feature?.endPoint = newPoint;
           break;
         case PointInfoType.touchUp:
           if (!isSecondPointMove) {

+ 3 - 0
lib/process/primitives/trace.dart

@@ -65,6 +65,7 @@ class Trace extends AreaItemAbstract with AutoSnapMixin {
           break; // 按下立即抬起无事发生
         case PointInfoType.touchMove:
           isFirstPointNeedOffset = true;
+          if (isMoveTargetOutOfRange(args)) return true;
           feature?.innerPoints.first = args;
           break;
         default:
@@ -85,6 +86,8 @@ class Trace extends AreaItemAbstract with AutoSnapMixin {
                 .addVector(args - traceTouchStartPoint)
                 .toOffset(),
             startPoint!.pointType);
+        newPoint.hostVisualArea = args.hostVisualArea;
+        if (isMoveTargetOutOfRange(newPoint)) return true;
         feature?.adopt(newPoint);
         doCalculate();
         checkAutoSnap(newPoint);

+ 11 - 2
lib/process/primitives/twoline_angle.dart

@@ -79,6 +79,8 @@ class TwolineAngle extends MeasureItem<TwolineAngleFeature> {
           feature?.innerPoints.first = args;
           break; // 按下立即抬起无事发生
         case PointInfoType.touchMove:
+          if (isMoveTargetOutOfRange(args)) return true;
+
           isFirstPointNeedOffset = true;
           feature?.innerPoints.first = args;
           break;
@@ -91,8 +93,13 @@ class TwolineAngle extends MeasureItem<TwolineAngleFeature> {
         args.addOffset(0, -0.2);
       }
       if (feature == null) return false;
-      DPoint newPoint =
-          lastStartPoint.clone().addVector(args - splineTouchStartPoint);
+      PointInfo newPoint = PointInfo.fromOffset(
+          lastStartPoint
+              .clone()
+              .addVector(args - splineTouchStartPoint)
+              .toOffset(),
+          args.pointType);
+      newPoint.hostVisualArea = args.hostVisualArea;
       if (args.pointType == PointInfoType.touchUp) {
         if (!isOtherPointNeedOffset) {
           f.innerPoints.last = args;
@@ -115,6 +122,8 @@ class TwolineAngle extends MeasureItem<TwolineAngleFeature> {
         }
       }
       if (args.pointType == PointInfoType.touchMove) {
+        if (isMoveTargetOutOfRange(newPoint)) return true;
+
         isOtherPointNeedOffset = true;
         f.innerPoints.last = newPoint;
       }