Advertisement
danfalck

profile_op1.py

Jan 13th, 2012
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 19.20 KB | None | 0 0
  1. # FreeCAD to HeeksCNC curve profile module  
  2. # (c) 2011 Dan Falck LGPL
  3. import os
  4. import time
  5. import math
  6. from draftlibs import fcvec,fcgeo
  7. from FreeCAD import Vector,Base,Part
  8. import FreeCADGui
  9. import FreeCAD
  10. import FreeCAD as App
  11. import FreeCADGui as Gui
  12. from PyQt4 import QtGui,QtCore
  13. #from PySide import QtGui,QtCore
  14.  
  15. class MyLineEdit(QtGui.QLineEdit):
  16.     pass
  17.  
  18. class TaskWatcher:
  19.     def __init__(self):
  20.         self.commands = ["Part_Box", "Part_Sphere", "Part_Cylinder"]
  21.         self.title = "Create primitives"
  22.         self.icon = "Part_Sphere"
  23.         self.widgets = [MyLineEdit()]
  24.         self.widgets[0].setText("Line edit inside task box")
  25.         self.pushButton_test = QtGui.QPushButton()
  26.     def shouldShow(self):
  27.         return App.ActiveDocument is not None
  28.  
  29. class TaskLineEdit:
  30.     def __init__(self):
  31.         self.widgets = [MyLineEdit()]
  32.         self.widgets[0].setText("Line edit with no task box")
  33.     def shouldShow(self):
  34.         return True
  35.  
  36. class TaskWatcherFilter:
  37.     def __init__(self):
  38.         self.commands = ["Sketcher_NewSketch", "PartDesign_Fillet", "PartDesign_Chamfer"]
  39.         self.filter = "SELECT Part::Feature SUBELEMENT Face COUNT 1"
  40.         self.title = "Face tools"
  41.         self.icon = "Part_Box"
  42.     def shouldShow(self):
  43.         return App.ActiveDocument is not None
  44.  
  45.  
  46. class TaskPanelCurves:
  47.     def __init__(self):
  48.         #self.ui = App.getResourceDir() + "src/Mod/TemplatePyMod/TaskPanel.ui"
  49.         self.ui = "/home/danfalck/Documents/freecad/curve_output/TaskPanelCurve.ui"
  50.  
  51.     def accept(self):
  52.         return True
  53.  
  54.     def reject(self):
  55.         return True
  56.  
  57.     def clicked(self, index):
  58.         pass
  59.  
  60.     def open(self):
  61.         pass
  62.  
  63.     def needsFullSpace(self):
  64.         return False
  65.  
  66.     def isAllowedAlterSelection(self):
  67.         return True
  68.  
  69.     def isAllowedAlterView(self):
  70.         return True
  71.  
  72.     def isAllowedAlterDocument(self):
  73.         return True
  74.  
  75.     def getStandardButtons(self):
  76.         return int(QtGui.QDialogButtonBox.Ok)
  77.  
  78.     def helpRequested(self):
  79.         pass
  80.  
  81.     def setupUi(self):
  82.         mw = self.getMainWindow()
  83.         form = mw.findChild(QtGui.QWidget, "TaskPanel")
  84.  
  85. #comments in header
  86.         form.textEditHeaderComments = form.findChild(QtGui.QTextEdit, "textEditHeaderComments")
  87. #fixture offset combo
  88.         form.comboBoxFixtureOffsets = form.findChild(QtGui.QComboBox, "comboBoxFixtureOffsets")
  89.         form.comboBoxFixtureOffsets.addItems(['G54.1','G54.2','G54.3']) #add additional items to list this way
  90.         form.comboBoxFixtureOffsets.setCurrentIndex(0)
  91.  
  92. #tool number combo
  93.         form.comboBoxToolSelect =form.findChild(QtGui.QComboBox,"comboBoxToolSelect")
  94. #tool diameter
  95.         form.lineEditToolDaimeter = form.findChild(QtGui.QLineEdit,"lineEditToolDaimeter")
  96.         form.lineEditToolDaimeter.setText('6.35') #read from config file later
  97.  
  98. #cut mode combo
  99.         form.comboBoxCutMode =form.findChild(QtGui.QComboBox,"comboBoxCutMode")
  100. #tool on side combo
  101.         form.comboBoxToolSide =form.findChild(QtGui.QComboBox,"comboBoxToolSide")
  102. #add curves pushbutton
  103.         form.pushButtonAddCurves = form.findChild(QtGui.QPushButton, "pushButtonAddCurves")
  104. #clear path pushbutton
  105.         form.pushButtonReset = form.findChild(QtGui.QPushButton, "pushButtonReset")
  106. #curve path textEdit
  107.         form.textEditCurve = form.findChild(QtGui.QTextEdit, "textEditCurve")
  108. #reverse path pushbutton
  109.         form.pushButtonReverse = form.findChild(QtGui.QPushButton, "pushButtonReverse")
  110. #start point pushbutton
  111.         form.pushButtonStartPoint = form.findChild(QtGui.QPushButton, "pushButtonStartPoint")
  112. #start point entry box
  113.         form.lineEditStartPoint = form.findChild(QtGui.QLineEdit,"lineEditStartPoint")
  114. #end point pushbutton
  115.         form.pushButtonEndPoint = form.findChild(QtGui.QPushButton, "pushButtonEndPoint")
  116. #end point entry box
  117.         form.lineEditEndPoint = form.findChild(QtGui.QLineEdit, "lineEditEndPoint")
  118. #extend before start lineedit
  119.         form.lineEditExtendStart = form.findChild(QtGui.QLineEdit,"lineEditExtendStart")
  120.         form.lineEditExtendStart.setText('2.0') #read from config file later
  121. #extend after end lineedig
  122.         form.lineEditExtendEnd = form.findChild(QtGui.QLineEdit,"lineEditExtendEnd")
  123.         form.lineEditExtendEnd.setText('2.0') #read from config file later
  124. #auto roll on
  125.         form.checkBoxAutoRollOn = form.findChild(QtGui.QCheckBox, "checkBoxAutoRollOn")
  126. #auto roll off
  127.         form.checkBoxAutoRollOff = form.findChild(QtGui.QCheckBox, "checkBoxAutoRollOff")
  128. #roll on and off radius'
  129.         form.lineEditRollRadius = form.findChild(QtGui.QLineEdit,"lineEditRollRadius")
  130.         form.lineEditRollRadius.setText('2.0') #read from config file later
  131. #lead in length
  132.         form.lineEditLeadIn = form.findChild(QtGui.QLineEdit, "lineEditLeadIn")
  133.         form.lineEditLeadIn.setText('2.0') #read from config file later
  134. #lead out length
  135.         form.lineEditLeadOut = form.findChild(QtGui.QLineEdit, "lineEditLeadOut")
  136.         form.lineEditLeadOut.setText('2.0') #read from config file later
  137. #extra offset
  138.         form.lineEditExtraOffset = form.findChild(QtGui.QLineEdit, "lineEditExtraOffset")
  139.         form.lineEditExtraOffset.setText('0.0') #read from config file later
  140. #absolute incremental mode
  141.         form.comboBoxAbsInc = form.findChild(QtGui.QComboBox, "comboBoxAbsInc")
  142. #clearance height
  143.         form.lineEditClearanceHt = form.findChild(QtGui.QLineEdit, "lineEditClearanceHt")
  144.         form.lineEditClearanceHt.setText('50.0') #read from config file later
  145. #safety space
  146.         form.lineEditSafetySpace = form.findChild(QtGui.QLineEdit, "lineEditSafetySpace")
  147.         form.lineEditSafetySpace.setText('5.0') #read from config file later
  148. #start depth
  149.         form.lineEditStartDepth = form.findChild(QtGui.QLineEdit,"lineEditStartDepth")
  150.         form.lineEditStartDepth.setText('0.0') #read from config file later
  151. #final depth
  152.         form.lineEditFinalDepth = form.findChild(QtGui.QLineEdit,"lineEditFinalDepth")
  153.         form.lineEditFinalDepth.setText('-5.0') #read from config file later
  154. #step down
  155.         form.lineEditStepDown = form.findChild(QtGui.QLineEdit,"lineEditStepDown")
  156.         form.lineEditStepDown.setText('1.0') #read from config file later
  157. #feedrate horizontal
  158.         form.lineEditHorizFeed = form.findChild(QtGui.QLineEdit,"lineEditHorizFeed")
  159.         form.lineEditHorizFeed.setText('650') #read from config file later
  160. #feedrate vertical
  161.         form.lineEditVerticalFeed = form.findChild(QtGui.QLineEdit,"lineEditVerticalFeed")
  162.         form.lineEditVerticalFeed.setText('400') #read from config file later
  163. #spindle speed
  164.         form.lineEditSpindleSpeed = form.findChild(QtGui.QLineEdit,"lineEditSpindleSpeed")
  165.         form.lineEditSpindleSpeed.setText('2400') #read from config file later
  166. #comments in footer
  167.         form.textEditFooterComments = form.findChild(QtGui.QTextEdit, "textEditFooterComments")
  168. #post button
  169.         form.pushButtonPostToFile = form.findChild(QtGui.QPushButton, "pushButtonPostToFile")
  170.  
  171.         self.form = form
  172.  
  173.         #Connect Signals and Slots
  174.  
  175.         QtCore.QObject.connect(form.pushButtonAddCurves, QtCore.SIGNAL("clicked()"), self.make_curves)
  176.  
  177.         QtCore.QObject.connect(form.pushButtonReset, QtCore.SIGNAL("clicked()"), self.resetPath)
  178.  
  179.         QtCore.QObject.connect(form.pushButtonReverse, QtCore.SIGNAL("clicked()"), self.reversePath)
  180.  
  181.         QtCore.QObject.connect(form.pushButtonPostToFile, QtCore.SIGNAL("clicked()"), self.print_it)
  182.  
  183.     def getMainWindow(self):
  184.         "returns the main window"
  185.         # using QtGui.qApp.activeWindow() isn't very reliable because if another
  186.         # widget than the mainwindow is active (e.g. a dialog) the wrong widget is
  187.         # returned
  188.         toplevel = QtGui.qApp.topLevelWidgets()
  189.         for i in toplevel:
  190.             if i.metaObject().className() == "Gui::MainWindow":
  191.                 return i
  192.         raise Exception("No main window found")
  193.  
  194.     def printFixtureIndex(self):
  195.         '''a bug in qt prevents us from just getting the currentIndex from a combobox'''
  196. #        text2 = str(self.comboBoxFixtureOffsets.itemData(self.form.comboBoxFixtureOffsets.currentIndex(),2))+'\n'
  197. #        FreeCAD.Console.PrintMessage(text2)
  198. #        text = str(self.form.comboBoxFixtureOffsets.currentText()+'\n')
  199. #        FreeCAD.Console.PrintMessage(text)
  200. #        fixture = str(self.form.comboBoxFixtureOffsets.currentText())
  201. #        index =  (self.form.comboBoxFixtureOffsets.findText(fixture))
  202. #        FreeCAD.Console.PrintMessage(str(index))
  203.         fixture = str(self.form.comboBoxFixtureOffsets.currentText())
  204.         index =  self.form.comboBoxFixtureOffsets.findText(fixture)
  205. #        FreeCAD.Console.PrintMessage('workplane('+str(index+1)+')\n')
  206.         return ('workplane('+str(index+1)+')\n')
  207.  
  208.  
  209.     def printToolOnSide(self):
  210.         toolside =  (self.form.comboBoxToolSide.currentText())
  211. #        FreeCAD.Console.PrintMessage('tool_side =\''+str(toolside)+'\'\n')
  212.         return ('tool_side =\''+str(toolside)+'\'\n')
  213.  
  214.     def print_it(self):
  215.         collector = ''
  216.         headerinfo = '''
  217. import sys
  218. sys.path.insert(0,'/usr/lib/heekscnc/')
  219. import math
  220. import area
  221. area.set_units(1)
  222. import kurve_funcs
  223. from nc.nc import *
  224. import nc.emc2b
  225. output('/tmp/test.tap')
  226. program_begin(123, 'Test program')
  227. absolute()
  228. metric()
  229.  
  230. '''
  231.         FreeCAD.Console.PrintMessage(headerinfo)
  232.         collector+=headerinfo
  233.         FreeCAD.Console.PrintMessage('comment(\''+ str(self.form.textEditHeaderComments.toPlainText())+'\')\n')
  234.         collector+=('comment(\''+ str(self.form.textEditHeaderComments.toPlainText())+'\')\n')
  235.  
  236.         FreeCAD.Console.PrintMessage(self.printFixtureIndex())
  237.         collector+=(self.printFixtureIndex())
  238.  
  239.         FreeCAD.Console.PrintMessage(self.form.textEditCurve.toPlainText())
  240.         collector+=str(self.form.textEditCurve.toPlainText())
  241.  
  242.         FreeCAD.Console.PrintMessage('tool_diameter = float('+str(self.form.lineEditToolDaimeter.displayText())+')\n')
  243.         collector+=('tool_diameter = float('+str(self.form.lineEditToolDaimeter.displayText())+')\n')
  244.  
  245.         FreeCAD.Console.PrintMessage(self.printToolOnSide())
  246.         collector+=(self.printToolOnSide())
  247.  
  248.         FreeCAD.Console.PrintMessage('flush_nc()\n')
  249.         collector+= ('flush_nc()\n')
  250.  
  251.         FreeCAD.Console.PrintMessage('clearance = float('+str(self.form.lineEditClearanceHt.displayText())+')\n')
  252.         collector+=('clearance = float('+str(self.form.lineEditClearanceHt.displayText())+')\n')
  253.  
  254.         FreeCAD.Console.PrintMessage('rapid_safety_space = float('+str(self.form.lineEditSafetySpace.displayText())+')\n')
  255.         collector+=('rapid_safety_space = float('+str(self.form.lineEditSafetySpace.displayText())+')\n')
  256.  
  257.         FreeCAD.Console.PrintMessage('roll_on = ' + '\'auto\'\n')
  258.         collector+=('roll_on = ' + '\'auto\'\n')
  259.  
  260.         FreeCAD.Console.PrintMessage('roll_off = ' + '\'auto\'\n')
  261.         collector+=('roll_off = ' + '\'auto\'\n')
  262.  
  263.         FreeCAD.Console.PrintMessage('roll_radius = '+str(self.form.lineEditRollRadius.displayText())+'\n')
  264.         collector+=('roll_radius = '+str(self.form.lineEditRollRadius.displayText())+'\n')
  265.  
  266.         FreeCAD.Console.PrintMessage('lead_in_line_len= '+str(self.form.lineEditLeadIn.displayText())+'\n')
  267.         collector+=('lead_in_line_len= '+str(self.form.lineEditLeadIn.displayText())+'\n')
  268.  
  269.         FreeCAD.Console.PrintMessage('lead_out_line_len= '+str(self.form.lineEditLeadOut.displayText())+'\n')
  270.         collector+=('lead_out_line_len= '+str(self.form.lineEditLeadOut.displayText())+'\n')
  271.  
  272.         FreeCAD.Console.PrintMessage('extend_at_start='+str(self.form.lineEditExtendStart.displayText())+'\n')
  273.         collector+=('extend_at_start='+str(self.form.lineEditExtendStart.displayText())+'\n')
  274.  
  275.         FreeCAD.Console.PrintMessage('extend_at_end='+str(self.form.lineEditExtendEnd.displayText())+'\n')
  276.         collector+=('extend_at_end='+str(self.form.lineEditExtendEnd.displayText())+'\n')
  277.  
  278.         FreeCAD.Console.PrintMessage('offset_extra = '+str(self.form.lineEditExtraOffset.displayText())+'\n')
  279.         collector+=('offset_extra = '+str(self.form.lineEditExtraOffset.displayText())+'\n')
  280.  
  281.         FreeCAD.Console.PrintMessage('start_depth = float('+str(self.form.lineEditStartDepth.displayText())+')\n')
  282.         collector+=('start_depth = float('+str(self.form.lineEditStartDepth.displayText())+')\n')
  283.  
  284.         FreeCAD.Console.PrintMessage('final_depth = float('+str(self.form.lineEditFinalDepth.displayText())+')\n')
  285.         collector+=('final_depth = float('+str(self.form.lineEditFinalDepth.displayText())+')\n')
  286.  
  287.         FreeCAD.Console.PrintMessage('step_down = float('+str(self.form.lineEditStepDown.displayText())+')\n')
  288.         collector+=('step_down = float('+str(self.form.lineEditStepDown.displayText())+')\n')
  289.  
  290.         FreeCAD.Console.PrintMessage('feedrate_hv('+str(self.form.lineEditHorizFeed.displayText())+','+str(self.form.lineEditVerticalFeed.displayText())+')\n')
  291.         collector+=('feedrate_hv('+str(self.form.lineEditHorizFeed.displayText())+','+str(self.form.lineEditVerticalFeed.displayText())+')\n')
  292.  
  293.         #FreeCAD.Console.PrintMessage('roll_on = '+str(self.form.lineEditVerticalFeed.displayText())+'\n')
  294.  
  295.         FreeCAD.Console.PrintMessage('spindle('+str(self.form.lineEditSpindleSpeed.displayText())+')\n')
  296.         collector+=('spindle('+str(self.form.lineEditSpindleSpeed.displayText())+')\n')
  297.  
  298.         #FreeCAD.Console.PrintMessage('roll_on = '+str(self.form.lineEditRollRadius.displayText())+'\n')
  299.         FreeCAD.Console.PrintMessage('kurve_funcs.profile(curve, tool_side , tool_diameter/2, offset_extra, roll_radius, roll_on, roll_off, rapid_safety_space, clearance, start_depth, step_down, final_depth,extend_at_start,extend_at_end,lead_in_line_len,lead_out_line_len )\n')
  300.         collector+=('kurve_funcs.profile(curve, tool_side , tool_diameter/2, offset_extra, roll_radius, roll_on, roll_off, rapid_safety_space, clearance, start_depth, step_down, final_depth,extend_at_start,extend_at_end,lead_in_line_len,lead_out_line_len )\n')
  301.  
  302.         FreeCAD.Console.PrintMessage("program_end()\n")
  303.         collector+=("program_end()\n")
  304.  
  305.         pyout = '/tmp/post.py'
  306.         FILE = open(pyout,"w")
  307.  
  308.         # Write all the lines at once:
  309.         FILE.writelines(collector)
  310.         FILE.close()
  311.         self.postCode(pyout)
  312.  
  313.  
  314.  
  315.     def postCode(self,postfile):
  316.         if FreeCAD.ActiveDocument.findObjects("Part::Feature","moves"):
  317.             FreeCAD.ActiveDocument.removeObject("moves")
  318.         if FreeCAD.ActiveDocument.findObjects("Part::Feature","rapids"):
  319.             FreeCAD.ActiveDocument.removeObject("rapids")
  320. #        print 'posting code\n'
  321.  
  322. #        print '###############################'
  323. #        print collector
  324.  
  325. #        exec str(collector)
  326. #        pyout = '/tmp/post.py'
  327. #        FILE = open(pyout,"w")
  328.  
  329. #        # Write all the lines at once:
  330. #        FILE.writelines(collector)
  331.  
  332. #        os.system('python /tmp/post.py')
  333. #        eval(str(collector))
  334.         from subprocess import call
  335.         call(["python", postfile])
  336.  
  337. #        cncscript= "/home/danfalck/Documents/freecad/backplot/curve_test.py"
  338. #        call(["python", cncscript])
  339.  
  340.         fin = "/tmp/test.tap"
  341.         fout = "/tmp/test.py"
  342.         call(["/home/danfalck/Documents/freecad/backplot/mill_read.py", fin, fout])
  343.         execfile("/tmp/test.py")
  344.  
  345. ##        os.remove("/tmp/test.py")
  346.  
  347. #        gcodefileSize= os.path.getsize("/tmp/test.tap")
  348. #        if gcodefileSize > 0:
  349. #            execfile("/tmp/test.py")
  350. #        else:
  351. #            print 'file was too small-try again'
  352.  
  353.  
  354.     def resetPath(self):
  355.         self.form.textEditCurve.clear()
  356.  
  357.     def reversePath(self):
  358.         self.form.textEditCurve.append('curve.Reverse()\n')
  359.  
  360.     def testPost(self):
  361.         self.form.listWidgetCurve.addItem('test\n')
  362.  
  363.  
  364.  
  365.     def make_curves(self):
  366.         item = ""
  367.         edges=[]
  368.         s=Gui.Selection.getSelectionEx()
  369.         for i in s:
  370.             for e in i.SubElementNames:
  371.                 edges.append(getattr(i.Object.Shape,e))
  372.  
  373.  
  374.         sorted_edges = []
  375.         sorted_edges = fcgeo.sortEdges(edges)
  376.         #item += '#another test after sorted_edges \n'
  377.         def isSameVertex(V1, V2):#borrowed from yorik's fcgeo.py- thanks yorik!
  378.             ''' Test if vertexes have same coordinates with precision 10E(-precision)'''
  379.             if round(V1.X-V2.X,1)==0 and round(V1.Y-V2.Y,1)==0 and round(V1.Z-V2.Z,1)==0 :
  380.                 return True
  381.             else :
  382.                 return False
  383.  
  384.         start=sorted_edges[0]
  385.         end=sorted_edges[-1]
  386.         startingZ = start.Vertexes[0].Z
  387.         #set starting depth to same Z as starting curve element
  388.         self.form.lineEditStartDepth.setText(str(start.Vertexes[0].Z))
  389.         item += "curve = area.Curve()\n"
  390.         if isSameVertex(start.Vertexes[0],end.Vertexes[1]) :
  391.             item += '#closed path\n'
  392.             path = 'closedpath'
  393.         else:
  394.             item += '#open path\n'
  395.             path = 'openpath'
  396.  
  397.         if path ==  'openpath' :
  398.             item += "curve.append(area.Point(" + str(start.Vertexes[0].X) + "," + str(start.Vertexes[0].Y)+ "))\n"
  399.  
  400.         for s in sorted_edges:
  401.             #edges.append(s)
  402.             if (isinstance(s.Curve,Part.Circle)):
  403.                 mp = fcgeo.findMidpoint(s)
  404.                 ce = s.Curve.Center
  405.                 tang1 = s.Curve.tangent(s.ParameterRange[0]) ; tang2 = s.Curve.tangent(s.ParameterRange[1])
  406.                 cross1 = Vector.cross(Base.Vector(tang1[0][0],tang1[0][1],tang1[0][2]),Base.Vector(tang2[0][0],tang2[0][1],tang2[0][2]))
  407.                 if cross1[2] > 0:
  408.                     direct = '1 ' #we seem to be working in a rh system in FreeCAD
  409.                 else:
  410.                     direct = '-1 '
  411.                 item += "curve.append(area.Vertex("+str(direct)+ ", area.Point( "+ str(s.Vertexes[-1].Point[0])+", "+str(s.Vertexes[-1].Point[1])+ "), area.Point("+str(s.Curve.Center [0])+ ", " + str(s.Curve.Center[1])+ ")))\n"
  412.  
  413.             elif (isinstance(s.Curve,Part.Line)):
  414.                 item += "curve.append(area.Point( "+str(s.Vertexes[-1].Point[0])+", " +str(s.Vertexes[-1].Point[1])+ "))\n"
  415.             else:
  416.                 pass
  417.  
  418.         #export curve elements to heekscnc
  419.         #to reverse the curve:
  420.  
  421.         #item += "curve.append(area.Point(" , end.Vertexes[0].X , "," , end.Vertexes[0].Y, "))"
  422.         if path ==  'closedpath':
  423.             item += "curve.append(area.Point(" + str(start.Vertexes[1].X) + "," + str(start.Vertexes[1].Y)+ "))\n"
  424.             item += "curve.Reverse()"
  425.  
  426.  
  427.         self.form.textEditCurve.append(item)
  428. #        #copy to clipboard at the same time:
  429. #        myClipBoard = QApplication.clipboard()
  430. #        myClipBoard.setText(item,QClipboard.Clipboard)
  431.  
  432.     def addElement(self):
  433.         item=QtGui.QInputDialog.getText(self.form, 'Add item', 'Enter:')
  434.         if item[1]:
  435.             self.form.listWidget.addItem(item[0])
  436.  
  437.  
  438.  
  439.  
  440. def createTask():
  441.     panel1 = TaskPanelCurves()
  442.     Gui.Control.showDialog(panel1)
  443.     panel1.setupUi()
  444.     return panel1
  445.  
  446. #Gui.Control.showDialog([TaskLineEdit(),TaskCalendar()])
  447. #Gui.Control.addTaskWatcher([TaskLineEdit(),TaskWatcherFilter()])
  448. #Gui.Control.clearTaskWatcher()
  449. #Gui.Control.showDialog(TaskCalendar())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement