import 'package:fis_measure/interfaces/date_types/int_size.dart'; import 'package:fis_measure/interfaces/process/workspace/point_info.dart'; import 'package:fis_measure/process/items/item.dart'; import 'package:fis_measure/process/items/item_feature.dart'; import 'package:fis_measure/process/workspace/measure_data_controller.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; mixin AutoSnapMixin<T extends MeasureItemFeature> on MeasureItem<T> { final measureData = Get.find<MeasureDataController>(); bool _isSmartMove = false; bool _isAutoSnap = true; double _snapThreshold = 10.0; bool snapState = false; /// 是否启动智能定位 bool get isSmartMove => _isSmartMove; set isSmartMove(bool value) { if (value != _isSmartMove) { _isSmartMove = value; } } bool get isAutoSnap => _isAutoSnap; set isAutoSnap(bool val) { if (val != _isAutoSnap) { _isAutoSnap = val; } } /// 自动结束阈值 pixel double get snapThreshold => measureData.getAutoSnapDistance(); set snapThreshold(double val) { if (val != _snapThreshold) { _snapThreshold = val; } } /// 自动结束检测 bool checkAutoSnap(PointInfo current, [bool autoFinishFeature = true]) { if (feature == null || feature!.innerPoints.length < 3) { isSmartMove = false; return _syncState(false); } // final viewport = feature!.hostVisualArea!.viewport!; if (isAutoSnap == false) return false; final pixelSize = application.displaySize; final p1 = feature!.innerPoints.first.scale2Size(pixelSize); final p2 = current.scale2Size(pixelSize); final length = (p1 - p2).length; if (length > snapThreshold * 2.0 && !isSmartMove) { isSmartMove = true; } if (length < snapThreshold && isSmartMove) { feature!.innerPoints.last = feature!.innerPoints.first.clone(); /// 此处的最后一个点,方便计算,但是绘制时要剔除 // feature!.innerPoints.removeLast(); HapticFeedback.heavyImpact(); if (autoFinishFeature) { doCalculate(); doFeatureFinish(); } isSmartMove = false; return _syncState(true); } else { return _syncState(false); } } bool _syncState(bool isSnap) { snapState = isSnap; return snapState; } }