|
@@ -2,6 +2,7 @@ import 'dart:ui';
|
|
|
import 'dart:math' as math;
|
|
|
|
|
|
import 'package:fis_measure/interfaces/date_types/point.dart';
|
|
|
+import 'package:fis_measure/interfaces/date_types/rect_region.dart';
|
|
|
import 'package:fis_measure/interfaces/enums/items.dart';
|
|
|
import 'package:fis_measure/interfaces/process/items/item.dart';
|
|
|
import 'package:fis_measure/interfaces/process/items/item_metas.dart';
|
|
@@ -15,9 +16,7 @@ class Ray extends MeasureItem<RayFeature> {
|
|
|
double _initializeAngle = 0;
|
|
|
double _initializeAngleVal = 0;
|
|
|
bool _switchInitialAngle = false;
|
|
|
- Ray(ItemMeta meta, IMeasureItem? parent) : super(meta, parent) {
|
|
|
- initializeAngle = 45;
|
|
|
- }
|
|
|
+ Ray(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
|
|
|
|
|
|
double get initializeAngle => _initializeAngle;
|
|
|
set initializeAngle(double value) {
|
|
@@ -105,30 +104,65 @@ class RayFeature extends MeasureItemFeature {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ RectRegion get viewRegion => hostVisualArea!.viewport!.area.layoutRegion!;
|
|
|
+
|
|
|
@override
|
|
|
void paint(Canvas canvas, Size size) {
|
|
|
if (innerPoints.isEmpty) return;
|
|
|
-
|
|
|
+ final curItemName = refItem.displayName;
|
|
|
final offset = convert2ViewPoint(size, point).toOffset();
|
|
|
- final left = Offset(0, offset.dy);
|
|
|
- final right = Offset(size.width, offset.dy);
|
|
|
-
|
|
|
- // final center = Offset(size.width / 2, size.height / 2);
|
|
|
- // if (angle != 0) {
|
|
|
- // canvas.save();
|
|
|
- // canvas.translate(center.dx, center.dy);
|
|
|
- // final rotateRad = angle * math.pi / 180;
|
|
|
- // canvas.rotate(rotateRad);
|
|
|
- // canvas.translate(-center.dx, -center.dy);
|
|
|
- // }
|
|
|
-
|
|
|
- canvas.drawDashLine(left, right, 1, 10, paintPan);
|
|
|
-
|
|
|
- // if (angle != 0) {
|
|
|
- // canvas.restore();
|
|
|
- // }
|
|
|
-
|
|
|
- var idText = '$id.${refItem.displayName}';
|
|
|
- drawCustomId(canvas, size, right, idText);
|
|
|
+ final rect = Rect.fromLTWH(
|
|
|
+ viewRegion.left * size.width,
|
|
|
+ viewRegion.top * size.height,
|
|
|
+ viewRegion.width * size.width,
|
|
|
+ viewRegion.height * size.height);
|
|
|
+ List<Offset> twoPoint = [const Offset(0, 0), const Offset(0, 0)];
|
|
|
+ final idText = '$id.${refItem.displayName}';
|
|
|
+ switch (curItemName) {
|
|
|
+ case "Baseline":
|
|
|
+ twoPoint = calcLinePoint(rect, offset, 0);
|
|
|
+ drawCustomId(canvas, size, twoPoint[1], idText);
|
|
|
+ break;
|
|
|
+ case "Line α":
|
|
|
+ twoPoint = calcLinePoint(rect, offset, angle);
|
|
|
+ drawCustomId(canvas, size, twoPoint[1], idText);
|
|
|
+ break;
|
|
|
+ case "Line β":
|
|
|
+ twoPoint = calcLinePoint(rect, offset, 180 - angle);
|
|
|
+ drawCustomId(canvas, size, twoPoint[0], idText);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ print("Unkonw name RayFeature: $curItemName");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ canvas.drawDashLine(twoPoint[0], twoPoint[1], 1, 10, paintPan);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Offset> calcLinePoint(Rect rect, Offset innerPoint, double angle) {
|
|
|
+ List<Offset> twoPoint = [const Offset(0, 0), const Offset(0, 0)];
|
|
|
+ if (!rect.contains(innerPoint)) return twoPoint;
|
|
|
+ final tan = math.tan(angle * math.pi / 180);
|
|
|
+ final x = innerPoint.dx;
|
|
|
+ final y = innerPoint.dy;
|
|
|
+ final d1 = x - y / tan;
|
|
|
+ twoPoint[0] = Offset(d1, 0);
|
|
|
+ final d2 = (rect.height - y) / tan + x;
|
|
|
+ twoPoint[1] = Offset(d2, rect.height);
|
|
|
+ if (angle <= 90) {
|
|
|
+ if (d1 < rect.left) {
|
|
|
+ twoPoint[0] = Offset(rect.left, y - tan * (x - rect.left));
|
|
|
+ }
|
|
|
+ if (d2 > rect.right) {
|
|
|
+ twoPoint[1] = Offset(rect.right, y + tan * (rect.right - x));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (d1 > rect.right) {
|
|
|
+ twoPoint[0] = Offset(rect.right, y - tan * (x - rect.right));
|
|
|
+ }
|
|
|
+ if (d2 < rect.left) {
|
|
|
+ twoPoint[1] = Offset(rect.left, y + tan * (rect.left - x));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return twoPoint;
|
|
|
}
|
|
|
}
|