gcode预览测试
This commit is contained in:
@@ -7,18 +7,11 @@ from PyQt6.QtWidgets import (QWidget, QHBoxLayout, QVBoxLayout,
|
||||
from PyQt6.QtCore import Qt, QTimer, QThread, pyqtSignal, QUrl, QObject, pyqtProperty, QRectF, QSize
|
||||
from PyQt6.QtGui import QColor, QPen, QPainter, QPainterPath, QFont, QLinearGradient, QBrush
|
||||
from utils.config_parse import ConfigParse
|
||||
import sys
|
||||
import os
|
||||
from utils.gcode_viewer import GCodeViewerWidget
|
||||
|
||||
|
||||
def get_gcode_dir():
|
||||
config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "config.json")
|
||||
try:
|
||||
with open(config_path, "r", encoding="utf-8") as f:
|
||||
config = json.load(f)
|
||||
return config.get("GCODE_DIR", "/home/lhye200/.octoprint/uploads")
|
||||
except:
|
||||
return "/home/lhye200/.octoprint/uploads"
|
||||
|
||||
GCODE_DIR = get_gcode_dir()
|
||||
|
||||
# ── 状态主题色 ──────────────────────────────────────────
|
||||
STATUS_COLORS = {
|
||||
@@ -138,52 +131,6 @@ class TempGauge(QWidget):
|
||||
p.drawText(0, h - 20, w, 20, Qt.AlignmentFlag.AlignCenter, self._label)
|
||||
|
||||
|
||||
# ── GCode 2D 预览(暂注释,待开发)─────────────────────
|
||||
# class GCode2DPreviewWidget(QGraphicsView):
|
||||
# def __init__(self, parent=None):
|
||||
# super().__init__(parent)
|
||||
# self.scene = QGraphicsScene(self)
|
||||
# self.setScene(self.scene)
|
||||
# self.setStyleSheet("background-color: #111111; border-radius: 5px; border: 1px solid #666;")
|
||||
# self.setRenderHint(QPainter.RenderHint.Antialiasing)
|
||||
# self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
|
||||
# self.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
|
||||
# self.scale(1, -1)
|
||||
#
|
||||
# def draw_paths(self, lines_data):
|
||||
# self.scene.clear()
|
||||
# bounding_rect = QRectF()
|
||||
# for color_str, data in lines_data.items():
|
||||
# points = data.get("points", [])
|
||||
# line_width = data.get("line_width", 2)
|
||||
# if not points:
|
||||
# continue
|
||||
# path = QPainterPath()
|
||||
# if isinstance(points[0][0], (int, float)):
|
||||
# path.moveTo(float(points[0][0]), float(points[0][1]))
|
||||
# for pt in points[1:]:
|
||||
# path.lineTo(float(pt[0]), float(pt[1]))
|
||||
# else:
|
||||
# for line_pts in points:
|
||||
# if not line_pts:
|
||||
# continue
|
||||
# path.moveTo(float(line_pts[0][0]), float(line_pts[0][1]))
|
||||
# for pt in line_pts[1:]:
|
||||
# path.lineTo(float(pt[0]), float(pt[1]))
|
||||
# path_item = QGraphicsPathItem(path)
|
||||
# pen_color = QColor(color_str) if QColor.isValidColor(color_str) else QColor("white")
|
||||
# pen = QPen(pen_color)
|
||||
# pen.setWidth(int(line_width))
|
||||
# pen.setCosmetic(True)
|
||||
# path_item.setPen(pen)
|
||||
# self.scene.addItem(path_item)
|
||||
# bounding_rect = bounding_rect.united(path.boundingRect())
|
||||
# if bounding_rect.width() < 1 or bounding_rect.height() < 1:
|
||||
# bounding_rect = QRectF(0, 0, 220, 220)
|
||||
# bounding_rect.adjust(-10, -10, 10, 10)
|
||||
# self.scene.setSceneRect(bounding_rect)
|
||||
# self.fitInView(self.scene.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio)
|
||||
|
||||
|
||||
# ── 状态页面 ────────────────────────────────────────────
|
||||
class StatusPage(QWidget):
|
||||
@@ -193,6 +140,7 @@ class StatusPage(QWidget):
|
||||
|
||||
self.file_name = "None"
|
||||
self.progress = 0.0
|
||||
self.filepos = 0
|
||||
self.display_name = "None"
|
||||
self.state = "Unknown"
|
||||
self.print_time = 0
|
||||
@@ -205,6 +153,7 @@ class StatusPage(QWidget):
|
||||
self.config_parser = ConfigParse()
|
||||
self.config_parser.config_changed.connect(self._on_config_changed)
|
||||
self.gcode_dir = self.config_parser.gcode_dir
|
||||
self._loaded_file = None
|
||||
|
||||
self.init_ui()
|
||||
self.timer = QTimer(self)
|
||||
@@ -222,6 +171,7 @@ class StatusPage(QWidget):
|
||||
job = data.get("job", {})
|
||||
self.file_name = job.get("job", {}).get("file", {}).get("name", "None")
|
||||
self.progress = job.get("progress", {}).get("completion", 0) or 0
|
||||
self.filepos = job.get("progress", {}).get("filepos", 0) or 0
|
||||
self.display_name = job.get("job", {}).get("file", {}).get("display_name", "None")
|
||||
self.state = status.get("state", {}).get("text", "Offline")
|
||||
self.print_time = job.get("progress", {}).get("printTime", 0) or 0
|
||||
@@ -336,10 +286,8 @@ class StatusPage(QWidget):
|
||||
right_layout = QVBoxLayout(right_frame)
|
||||
right_layout.setContentsMargins(6, 6, 6, 6)
|
||||
|
||||
placeholder = QLabel("GCode 预览\n⚙ 待开发")
|
||||
placeholder.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
placeholder.setStyleSheet("color: #666666; font-size: 24px; font-weight: 600; border: none;")
|
||||
right_layout.addWidget(placeholder)
|
||||
self.gcode_viewer = GCodeViewerWidget()
|
||||
right_layout.addWidget(self.gcode_viewer)
|
||||
|
||||
main_layout.addWidget(left_frame, 2)
|
||||
main_layout.addWidget(right_frame, 3)
|
||||
@@ -405,6 +353,22 @@ class StatusPage(QWidget):
|
||||
self._tool_gauge.set_value(self.tool_temp_actual, self.tool_temp_target)
|
||||
self._bed_gauge.set_value(self.bed_temp_actual, self.bed_temp_target)
|
||||
|
||||
# G-code 模型加载与进度更新
|
||||
if self.file_name and self.file_name != "None":
|
||||
if self.file_name != self._loaded_file:
|
||||
gcode_path = os.path.join(self.gcode_dir, self.file_name)
|
||||
if os.path.exists(gcode_path):
|
||||
try:
|
||||
self.gcode_viewer.load_gcode(gcode_path)
|
||||
self._loaded_file = self.file_name
|
||||
except Exception as e:
|
||||
print("Failed to load G-code:", e)
|
||||
|
||||
# 使用 filepos 替代进度百分比进行精准的偏移量层级更新
|
||||
if self._loaded_file == self.file_name:
|
||||
is_printing = self.state.startswith("Printing") or self.state.startswith("Paused")
|
||||
self.gcode_viewer.update_by_filepos(self.filepos, is_printing)
|
||||
|
||||
|
||||
|
||||
#TODO: Better Gcode Parser, this one is too slow for large files, need to optimize or use a separate thread to load
|
||||
|
||||
Reference in New Issue
Block a user