把3D parametric Curve喂给豆包,让它改写这个程序为:打开含有点云XYZ坐标点的文件,然后生成曲线。
原3D parametric Curve宏的作者为:
# Author: Gomez Lucio
# Modified by Laurent Despeyroux on 9th feb 2015
生成的程序用于FreeCad的XYZ点云生成曲线的宏:
import FreeCAD
from PySide import QtGui, QtCore
import Part
import Draft
import os
class XYZCurv(QtGui.QWidget):
def __init__(self):
super(XYZCurv, self).__init__()
self.initUI()
def initUI(self):
self.t0 = QtGui.QLabel("Select Points File:", self)
self.file_button = QtGui.QPushButton("Browse", self)
self.file_button.clicked.connect(self.select_file)
self.file_path_label = QtGui.QLabel("", self)
self.t7 = QtGui.QLabel("Type of Line :", self)
self.op1 = QtGui.QCheckBox(" Polyline", self)
self.poly = False
self.op1.stateChanged.connect(self.polyState)
self.op1.setCheckState(QtCore.Qt.Checked)
self.op2 = QtGui.QCheckBox(" Bspline", self)
self.bsline = False
self.op2.stateChanged.connect(self.bsplineState)
self.t8 = QtGui.QLabel(" Closed Curve", self)
self.op3 = QtGui.QCheckBox("", self)
self.cclose = False
self.op3.stateChanged.connect(self.ccloseState)
self.createbutt = QtGui.QPushButton("Create Curve", self)
self.exitbutt = QtGui.QPushButton("Close", self)
layout = QtGui.QGridLayout()
self.resize(320, 230)
self.setWindowTitle("XYZ Curve ")
layout.addWidget(self.t0, 0, 0)
layout.addWidget(self.file_button, 0, 1)
layout.addWidget(self.file_path_label, 0, 2)
layout.addWidget(self.t7, 1, 0)
layout.addWidget(self.op1, 2, 0)
layout.addWidget(self.op2, 2, 1)
layout.addWidget(self.t8, 3, 0)
layout.addWidget(self.op3, 3, 1)
layout.addWidget(self.createbutt, 4, 0)
layout.addWidget(self.exitbutt, 4, 1)
self.setLayout(layout)
self.show()
QtCore.QObject.connect(self.createbutt, QtCore.SIGNAL("pressed()"), self.draw)
QtCore.QObject.connect(self.exitbutt, QtCore.SIGNAL("pressed()"), self.close)
self.selected_file_path = None
def select_file(self):
file_dialog = QtGui.QFileDialog()
file_dialog.setFileMode(QtGui.QFileDialog.ExistingFile)
if file_dialog.exec_():
self.selected_file_path = file_dialog.selectedFiles()[0]
self.file_path_label.setText(self.selected_file_path)
def ccloseState(self, state):
if state == QtCore.Qt.Checked:
self.cclose = True
else:
self.cclose = False
def bsplineState(self, state):
if state == QtCore.Qt.Checked:
self.bsline = True
self.op1.setCheckState(QtCore.Qt.Unchecked)
else:
self.bsline = False
def polyState(self, state):
if state == QtCore.Qt.Checked:
self.poly = True
self.op2.setCheckState(QtCore.Qt.Unchecked)
else:
self.poly = False
def draw(self):
if not self.selected_file_path:
msgBox = QtGui.QMessageBox()
msgBox.setText("Please select a txt file first!")
msgBox.exec_()
return
points = []
try:
with open(self.selected_file_path, 'r') as file:
for line in file.readlines():
try:
x, y, z = map(float, line.strip().split())
points.append(FreeCAD.Vector(x, y, z))
except ValueError:
continue
except FileNotFoundError:
msgBox = QtGui.QMessageBox()
msgBox.setText(f"File {self.selected_file_path} not found!")
msgBox.exec_()
return
curva = Part.makePolygon(points)
if self.bsline == True:
Draft.makeBSpline(curva, closed=self.cclose, face=False)
if self.poly == True:
Draft.makeWire(curva, closed=self.cclose, face=False)
def close(self):
self.hide()
XYZCurv()
经测试可以在FreeCAD创建宏,复制上面代码后,可以正常运行。
运行界面如下: