auto_snap.dart 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import 'package:fis_measure/interfaces/date_types/int_size.dart';
  2. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  3. import 'package:fis_measure/process/items/item.dart';
  4. import 'package:fis_measure/process/items/item_feature.dart';
  5. import 'package:fis_measure/process/workspace/measure_data_controller.dart';
  6. import 'package:flutter/services.dart';
  7. import 'package:get/get.dart';
  8. mixin AutoSnapMixin<T extends MeasureItemFeature> on MeasureItem<T> {
  9. final measureData = Get.find<MeasureDataController>();
  10. bool _isSmartMove = false;
  11. bool _isAutoSnap = true;
  12. double _snapThreshold = 10.0;
  13. bool snapState = false;
  14. /// 是否启动智能定位
  15. bool get isSmartMove => _isSmartMove;
  16. set isSmartMove(bool value) {
  17. if (value != _isSmartMove) {
  18. _isSmartMove = value;
  19. }
  20. }
  21. bool get isAutoSnap => _isAutoSnap;
  22. set isAutoSnap(bool val) {
  23. if (val != _isAutoSnap) {
  24. _isAutoSnap = val;
  25. }
  26. }
  27. /// 自动结束阈值 pixel
  28. double get snapThreshold => measureData.getAutoSnapDistance();
  29. set snapThreshold(double val) {
  30. if (val != _snapThreshold) {
  31. _snapThreshold = val;
  32. }
  33. }
  34. /// 自动结束检测
  35. bool checkAutoSnap(PointInfo current, [bool autoFinishFeature = true]) {
  36. if (feature == null || feature!.innerPoints.length < 3) {
  37. isSmartMove = false;
  38. return _syncState(false);
  39. }
  40. // final viewport = feature!.hostVisualArea!.viewport!;
  41. if (isAutoSnap == false) return false;
  42. final pixelSize = application.displaySize;
  43. final p1 = feature!.innerPoints.first.scale2Size(pixelSize);
  44. final p2 = current.scale2Size(pixelSize);
  45. final length = (p1 - p2).length;
  46. if (length > snapThreshold * 2.0 && !isSmartMove) {
  47. isSmartMove = true;
  48. }
  49. if (length < snapThreshold && isSmartMove) {
  50. feature!.innerPoints.last = feature!.innerPoints.first.clone();
  51. /// 此处的最后一个点,方便计算,但是绘制时要剔除
  52. // feature!.innerPoints.removeLast();
  53. HapticFeedback.heavyImpact();
  54. if (autoFinishFeature) {
  55. doCalculate();
  56. doFeatureFinish();
  57. }
  58. isSmartMove = false;
  59. return _syncState(true);
  60. } else {
  61. return _syncState(false);
  62. }
  63. }
  64. bool _syncState(bool isSnap) {
  65. snapState = isSnap;
  66. return snapState;
  67. }
  68. }