Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from PyQt4 import QtCore, QtGui
- import DraftGeomUtils
- import Draft
- from FreeCAD import Vector,Base
- def makeCurves(name,edges,reverse=False):
- curvelist = ""
- sorted_edges = DraftGeomUtils.sortEdges(edges)
- #curvelist += '#another test after sorted_edges \n'
- def isSameVertex(V1, V2):#borrowed from yorik's DraftGeomUtils.py- thanks yorik!
- ''' Test if vertexes have same coordinates with precision 10E(-precision)'''
- if round(V1.X-V2.X,1)==0 and round(V1.Y-V2.Y,1)==0 and round(V1.Z-V2.Z,1)==0 :
- return True
- else :
- return False
- start=sorted_edges[0]
- end=sorted_edges[-1]
- startingZ = start.Vertexes[0].Z
- #set starting depth to same Z as starting curve element
- #form.lineEditStartDepth.setText(str(start.Vertexes[0].Z))
- curvelist += str(name) +" = area.Curve()\n"
- if isSameVertex(start.Vertexes[0],end.Vertexes[1]) :
- curvelist += '#closed path\n'
- path = 'closedpath'
- else:
- curvelist += '#open path\n'
- path = 'openpath'
- if path == 'openpath' :
- curvelist += str(name) +".append(area.Point(" + str(start.Vertexes[0].X) + "," + str(start.Vertexes[0].Y)+ "))\n"
- for s in sorted_edges:
- #edges.append(s)
- if (isinstance(s.Curve,Part.Circle)):
- mp = DraftGeomUtils.findMidpoint(s)
- ce = s.Curve.Center
- tang1 = s.Curve.tangent(s.ParameterRange[0]) ; tang2 = s.Curve.tangent(s.ParameterRange[1])
- 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]))
- if cross1[2] > 0:
- direct = '1 ' #we seem to be working in a rh system in FreeCAD
- else:
- direct = '-1 '
- curvelist += str(name) +".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"
- elif (isinstance(s.Curve,Part.Line)):
- curvelist += str(name) +".append(area.Point( "+str(s.Vertexes[-1].Point[0])+", " +str(s.Vertexes[-1].Point[1])+ "))\n"
- else:
- pass
- #export curve elements to heekscnc
- #to reverse the curve:
- #curvelist += "curve.append(area.Point(" + str(end.Vertexes[0].X) + "," + str(end.Vertexes[0].Y) + "))"
- if path == 'closedpath':
- curvelist += str(name) +".append(area.Point(" + str(start.Vertexes[1].X) + "," + str(start.Vertexes[1].Y)+ "))\n"
- if reverse:
- curvelist += str(name) +".Reverse()\n"
- #form.textEditCurve.append(curvelist)
- #clipboard = QtGui.QApplication.clipboard()
- #clipboard.setText(curvelist)
- return curvelist
- def selObj():
- faces = []
- objs = []
- sel = FreeCADGui.Selection.getSelectionEx()
- for s in sel:
- objs.append(s.Object)
- for e in s.SubElementNames:
- if "Face" in e:
- faces.append(int(e[4:])-1)
- d1 = Draft.makeShape2DView(objs[0],facenumbers=faces)
- d1.ProjectionMode = "Individual Faces"
- zlevel = s.SubObjects[0].BoundBox.ZMax
- d1.Placement.move(Vector(0,0,zlevel))
- d1.Label = "Profile"
- App.activeDocument().recompute()
- name = d1.Base.Name + str(d1.FaceNumbers[0])
- faceEdges = d1.Shape.Edges
- wires = DraftGeomUtils.findWiresOld(faceEdges)
- return name, wires
- def findZ(wire):
- Zmax = wire[0].BoundBox.ZMax
- Zmin = wire[0].BoundBox.ZMin
- return Zmin, Zmax
- def makeProfiles(name,wires):
- curvelist = ""
- if len(wires)>1:
- #find outside wire
- outside = wires[0]
- biggest = wires[0].BoundBox.DiagonalLength
- for w in wires:
- if w.BoundBox.DiagonalLength >= biggest:
- biggest = w.BoundBox.DiagonalLength
- outside = w
- # else:
- # #return
- # print 'not biggest'
- wires.remove(outside)
- inside = wires
- clList = []
- index = 0
- #print 'outside edge'
- #print (makeCurves((name+str(index)), outside.Edges))
- curvelist += str(makeCurves((name+str(index)), outside.Edges))
- index +=1
- for w in inside:
- #print '#pocket'
- curvelist +="#inside edge\n"
- #print (makeCurves((name+str(index)), w.Edges,False))
- curvelist += str(makeCurves((name+str(index)), w.Edges,False))
- index +=1
- else:
- #print (makeCurves((name+str(0)), wires[0].Edges))
- curvelist +=str(makeCurves((name+str(0)), wires[0].Edges))
- zmin, zmax = findZ(wires)
- #curvelist += "clearance = float(" + str(zmax+1.0) + ")\n"
- #curvelist += "start_depth = float("+ str(zmax) + ")\n"
- #curvelist += "final_depth = float("+ str(zmin) + ")\n"
- return curvelist
- #if you change the Base sketch geometry, select the Profile and run it again:
- #a=FreeCAD.ActiveDocument.getObjectsByLabel(d1.Base.Name)[0]
- name, wires = selObj()
- curvelist=makeProfiles(name,wires)
- clipboard = QtGui.QApplication.clipboard()
- clipboard.setText(curvelist)
Add Comment
Please, Sign In to add comment