2024-08-29 17:45:39 +08:00
|
|
|
import 'package:cpnav/pages/real/realController.dart';
|
2024-08-27 18:08:05 +08:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:get/get.dart';
|
|
|
|
import 'package:scence_map/controllers/controller.dart';
|
2024-08-28 17:56:53 +08:00
|
|
|
import 'package:scence_map/record_entity.dart';
|
2024-08-27 18:08:05 +08:00
|
|
|
import 'package:scence_map/scence_map.dart';
|
|
|
|
|
|
|
|
import '../../service/pile/device_type.dart';
|
|
|
|
|
2024-08-28 17:56:53 +08:00
|
|
|
final ScenceMapController mapcontroller = Get.put(ScenceMapController());
|
2024-08-27 18:08:05 +08:00
|
|
|
|
|
|
|
// 对点 瞄准器
|
|
|
|
class SightController extends GetxController {
|
|
|
|
var isNomal = true.obs;
|
|
|
|
//左下圆
|
|
|
|
var sightOffset = const Offset(3, 3).obs;
|
|
|
|
var sightOffsetInit = const Offset(0, 0).obs;
|
|
|
|
var sightInit = const Offset(0, 0).obs;
|
2024-08-28 17:56:53 +08:00
|
|
|
// var lastSightOffset = const Offset(0, 0).obs; // 新增变量,用于存储上一次手指离开时的位置
|
|
|
|
var isCardVisible = false.obs; // 控制卡片是否可见
|
|
|
|
RecordEntity? selectedPilePoint;
|
2024-08-27 18:08:05 +08:00
|
|
|
|
|
|
|
var initDx = 0.0.obs;
|
|
|
|
var isFirst = true.obs;
|
|
|
|
var visualList = [].obs;
|
|
|
|
var plot = 2.0.obs;
|
|
|
|
var scale = 0.75.obs;
|
|
|
|
reset() {
|
|
|
|
sightOffset.value = const Offset(3, 3);
|
|
|
|
sightOffsetInit.value = const Offset(0, 0);
|
|
|
|
sightInit.value = const Offset(0, 0);
|
|
|
|
|
|
|
|
initDx.value = 0.0;
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class SightView extends GetView<SightController> {
|
|
|
|
const SightView({super.key});
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
final size = MediaQuery.of(context).size;
|
|
|
|
MediaQueryData mediaQueryData =
|
|
|
|
MediaQueryData.fromView(WidgetsBinding.instance.window); //获取当前屏幕信息
|
|
|
|
final orientation = mediaQueryData.orientation; //获得设备方向
|
|
|
|
final deviceType = getDeviceType(context);
|
|
|
|
double rectWidth = size.height / 2;
|
|
|
|
if (!controller.isNomal.value) {
|
|
|
|
rectWidth = size.width;
|
|
|
|
} else {
|
|
|
|
if (orientation == Orientation.landscape) {
|
|
|
|
rectWidth = size.width / 2;
|
|
|
|
if (deviceType == DeviceType.mobile) {
|
|
|
|
rectWidth = size.height - 5;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
rectWidth = size.height / 2;
|
|
|
|
if (deviceType == DeviceType.mobile) {
|
|
|
|
rectWidth = size.width - 5;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool isDarkMode = Theme.of(context).brightness == Brightness.dark;
|
|
|
|
|
2024-08-28 17:56:53 +08:00
|
|
|
return Stack(
|
|
|
|
children: [
|
|
|
|
CustomPaint(
|
|
|
|
//绘制瞄准器
|
|
|
|
size: Size(rectWidth, rectWidth),
|
|
|
|
painter: DrawCicle(controller, 0, 0, isDarkMode),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
);
|
2024-08-27 18:08:05 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class DrawCicle extends CustomPainter {
|
2024-08-28 17:56:53 +08:00
|
|
|
final SightController sight;
|
2024-08-27 18:08:05 +08:00
|
|
|
final double tiltX;
|
|
|
|
final double tiltY;
|
|
|
|
final bool isDarkMode;
|
2024-08-28 17:56:53 +08:00
|
|
|
|
|
|
|
DrawCicle(this.sight, this.tiltX, this.tiltY, this.isDarkMode);
|
2024-08-27 18:08:05 +08:00
|
|
|
final _paint = Paint(); //创建一个画笔并配置其属性
|
|
|
|
Path path = Path();
|
|
|
|
|
|
|
|
List<IconData> icons = [
|
|
|
|
Icons.arrow_drop_up,
|
|
|
|
Icons.arrow_drop_down,
|
|
|
|
Icons.arrow_left,
|
|
|
|
Icons.arrow_right
|
|
|
|
];
|
|
|
|
List<Offset> iconOffset = [];
|
|
|
|
|
|
|
|
List<String> text = ["", "", "", ""]; //['前移', '后移', '左移', '右移'];
|
|
|
|
@override
|
|
|
|
void paint(Canvas canvas, size) {
|
|
|
|
_paint
|
|
|
|
..strokeWidth = 2
|
|
|
|
..style = PaintingStyle.stroke
|
|
|
|
..color = const Color.fromARGB(255, 183, 183, 162);
|
|
|
|
|
|
|
|
double rectWidth = (size.height / 2 - 5).roundToDouble();
|
2024-08-28 17:56:53 +08:00
|
|
|
if (!sight.isNomal.value) {
|
2024-08-27 18:08:05 +08:00
|
|
|
} else {}
|
|
|
|
|
|
|
|
path.moveTo(0, rectWidth + 5);
|
|
|
|
path.lineTo(size.height, rectWidth + 5);
|
|
|
|
path.moveTo(rectWidth + 5, 0);
|
|
|
|
path.lineTo(rectWidth + 5, size.height);
|
|
|
|
canvas.drawPath(path, _paint);
|
|
|
|
// 总长 2m
|
2024-08-28 17:56:53 +08:00
|
|
|
double step = (rectWidth / sight.plot.value / 10).roundToDouble();
|
2024-08-27 18:08:05 +08:00
|
|
|
canvas.translate(rectWidth + 5, rectWidth + 5);
|
|
|
|
for (var i = 0; i < 21; i++) {
|
|
|
|
if (i % 10 == 0) {
|
|
|
|
double line = 7;
|
|
|
|
canvas.drawLine(Offset(0, i * step), Offset(line, i * step), _paint);
|
|
|
|
canvas.drawLine(Offset(i * step, 0), Offset(i * step, line), _paint);
|
|
|
|
canvas.drawLine(Offset(0, -i * step), Offset(line, -i * step), _paint);
|
|
|
|
canvas.drawLine(Offset(-i * step, 0), Offset(-i * step, line), _paint);
|
|
|
|
drawText(canvas, Offset(line, i * step), i ~/ 10);
|
|
|
|
drawText(canvas, Offset(line, -i * step), (-i ~/ 10));
|
|
|
|
if (i ~/ 10 != 0) {
|
|
|
|
drawText(canvas, Offset(i * step, line), i ~/ 10);
|
|
|
|
drawText(canvas, Offset(-i * step, line), (-i ~/ 10));
|
|
|
|
}
|
|
|
|
} else if (i % 5 == 0) {
|
|
|
|
double line = 5;
|
|
|
|
canvas.drawLine(Offset(0, i * step), Offset(line, i * step), _paint);
|
|
|
|
canvas.drawLine(Offset(i * step, 0), Offset(i * step, line), _paint);
|
|
|
|
canvas.drawLine(Offset(0, -i * step), Offset(line, -i * step), _paint);
|
|
|
|
canvas.drawLine(Offset(-i * step, 0), Offset(-i * step, line), _paint);
|
|
|
|
} else {
|
|
|
|
double line = 3;
|
|
|
|
canvas.drawLine(Offset(0, i * step), Offset(line, i * step), _paint);
|
|
|
|
canvas.drawLine(Offset(i * step, 0), Offset(i * step, line), _paint);
|
|
|
|
canvas.drawLine(Offset(0, -i * step), Offset(line, -i * step), _paint);
|
|
|
|
canvas.drawLine(Offset(-i * step, 0), Offset(-i * step, line), _paint);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
canvas.translate(-(rectWidth + 5), -(rectWidth + 5));
|
|
|
|
|
|
|
|
canvas.translate(rectWidth + 5, rectWidth + 5);
|
2024-08-28 17:56:53 +08:00
|
|
|
// if (sight.selectedRecord.value != Offset(2, 2)) {
|
|
|
|
// drawPoint(canvas);
|
2024-08-27 18:08:05 +08:00
|
|
|
// }
|
|
|
|
|
2024-08-28 17:56:53 +08:00
|
|
|
// // 绘制水平仪
|
|
|
|
// double x = real.tiltX.value; //
|
|
|
|
// double y = real.tiltY.value; //
|
|
|
|
// print("----${real.centerX.value},${real.centerY.value}");
|
|
|
|
// if (real.tiltX.value == 0 || real.tiltY.value == 0) {
|
|
|
|
// x = 0;
|
|
|
|
// y = 0;
|
|
|
|
// }
|
|
|
|
// _paint.color = Colors.red;
|
|
|
|
// canvas.drawCircle(Offset(x * step * 10, y * step * 10), 10, _paint);
|
|
|
|
// canvas.translate(-(rectWidth + 5), -(rectWidth + 5));
|
2024-08-27 18:08:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
drawText(Canvas canvas, Offset offset, int i, [bool isShow = true]) {
|
|
|
|
TextPainter textPainter = TextPainter(
|
|
|
|
text: TextSpan(
|
|
|
|
text: isShow ? "$i m" : "$i",
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 12, color: isDarkMode ? Colors.white : Colors.black)),
|
|
|
|
textDirection: TextDirection.ltr,
|
|
|
|
textAlign: TextAlign.left);
|
|
|
|
textPainter.layout();
|
|
|
|
|
|
|
|
textPainter.paint(canvas, offset);
|
|
|
|
}
|
|
|
|
|
2024-08-28 17:56:53 +08:00
|
|
|
drawPoint(Canvas canvas) {
|
|
|
|
canvas.drawCircle(Offset.zero, 20, Paint()..color = Colors.grey);
|
|
|
|
// drawText(canvas, pos - const Offset(20, 10), i, false);
|
|
|
|
}
|
2024-08-27 18:08:05 +08:00
|
|
|
|
2024-08-28 17:56:53 +08:00
|
|
|
// drawRect(Canvas canvas, double rectWidth) {
|
|
|
|
// double x = item.dx - real.centerX.value;
|
|
|
|
// double y = item.dy - real.centerY.value;
|
|
|
|
// Offset center = Offset(x, y);
|
|
|
|
// canvas.drawRect(
|
|
|
|
// Rect.fromCenter(center: center, width: rectWidth, height: rectWidth),
|
|
|
|
// _paint);
|
2024-08-27 18:08:05 +08:00
|
|
|
// }
|
|
|
|
|
2024-08-28 17:56:53 +08:00
|
|
|
@override
|
|
|
|
bool shouldRepaint(covariant CustomPainter oldDelegate) => true;
|
|
|
|
}
|
2024-08-27 18:08:05 +08:00
|
|
|
|
2024-08-28 17:56:53 +08:00
|
|
|
class DevicePointer extends StatelessWidget {
|
|
|
|
// final DeviceItemController item;
|
|
|
|
// DevicePointer(this.item);
|
|
|
|
DevicePointer();
|
2024-08-27 18:08:05 +08:00
|
|
|
|
|
|
|
@override
|
2024-08-28 17:56:53 +08:00
|
|
|
Widget build(BuildContext context) {
|
|
|
|
// double carWidth = item.width / controller.pixel2MeterRatio;
|
|
|
|
// double carHeight = item.height / controller.pixel2MeterRatio;
|
|
|
|
|
|
|
|
return Stack(
|
|
|
|
alignment: Alignment.center,
|
|
|
|
children: [
|
|
|
|
SizedBox(
|
|
|
|
width: 60.0, // 设置图像的宽度
|
|
|
|
height: 60.0, // 设置图像的高度
|
|
|
|
child: Image.asset(
|
|
|
|
"images/navi_pointer.png",
|
|
|
|
errorBuilder: (context, error, stackTrace) {
|
|
|
|
return Text('无法加载图片');
|
|
|
|
},
|
|
|
|
),
|
|
|
|
),
|
|
|
|
|
|
|
|
// Obx(() {
|
|
|
|
// Offset offset = controller.xy2Screen(
|
|
|
|
// gnsscontroller.pilerCenter.X, gnsscontroller.pilerCenter.Y);
|
|
|
|
|
|
|
|
// return Positioned(
|
|
|
|
// left: offset.dx,
|
|
|
|
// top: offset.dy,
|
|
|
|
// child: Transform(
|
|
|
|
// transform: Matrix4.identity()
|
|
|
|
// ..rotateZ(-controller.rotation.value),
|
|
|
|
// child: Column(
|
|
|
|
// children: [Text("设备:${item.name}")],
|
|
|
|
// ),
|
|
|
|
// ),
|
|
|
|
// );
|
|
|
|
// }),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
2024-08-27 18:08:05 +08:00
|
|
|
}
|