用于FreeCad的XYZ点云生成曲线的宏

把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创建宏,复制上面代码后,可以正常运行。

运行界面如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值