0000983: Draft wires, rectanges and polygons now have a chamfer property

This commit is contained in:
Yorik van Havre 2013-02-25 23:26:42 -03:00
parent 3a04f6491b
commit 62dc05ffd9
2 changed files with 44 additions and 12 deletions

View File

@ -2887,6 +2887,7 @@ class _Rectangle(_DraftObject):
obj.addProperty("App::PropertyDistance","Length","Base","Length of the rectangle")
obj.addProperty("App::PropertyDistance","Height","Base","Height of the rectange")
obj.addProperty("App::PropertyDistance","FilletRadius","Base","Radius to use to fillet the corners")
obj.addProperty("App::PropertyDistance","ChamferSize","Base","Size of the chamfer to give to the corners")
obj.Length=1
obj.Height=1
@ -2905,6 +2906,11 @@ class _Rectangle(_DraftObject):
p3 = Vector(p1.x+fp.Length,p1.y+fp.Height,p1.z)
p4 = Vector(p1.x,p1.y+fp.Height,p1.z)
shape = Part.makePolygon([p1,p2,p3,p4,p1])
if "ChamferSize" in fp.PropertiesList:
if fp.ChamferSize != 0:
w = DraftGeomUtils.filletWire(shape,fp.ChamferSize,chamfer=True)
if w:
shape = w
if "FilletRadius" in fp.PropertiesList:
if fp.FilletRadius != 0:
w = DraftGeomUtils.filletWire(shape,fp.FilletRadius)
@ -2989,6 +2995,7 @@ class _Wire(_DraftObject):
obj.addProperty("App::PropertyVector","End","Base",
"The end point of this line")
obj.addProperty("App::PropertyDistance","FilletRadius","Base","Radius to use to fillet the corners")
obj.addProperty("App::PropertyDistance","ChamferSize","Base","Size of the chamfer to give to the corners")
obj.Closed = False
def execute(self, fp):
@ -3076,6 +3083,11 @@ class _Wire(_DraftObject):
edges.append(Part.Line(lp,p).toShape())
lp = p
shape = Part.Wire(edges)
if "ChamferSize" in fp.PropertiesList:
if fp.ChamferSize != 0:
w = DraftGeomUtils.filletWire(shape,fp.ChamferSize,chamfer=True)
if w:
shape = w
if "FilletRadius" in fp.PropertiesList:
if fp.FilletRadius != 0:
w = DraftGeomUtils.filletWire(shape,fp.FilletRadius)
@ -3132,6 +3144,7 @@ class _Polygon(_DraftObject):
obj.addProperty("App::PropertyDistance","Radius","Base","Radius of the control circle")
obj.addProperty("App::PropertyEnumeration","DrawMode","Base","How the polygon must be drawn from the control circle")
obj.addProperty("App::PropertyDistance","FilletRadius","Base","Radius to use to fillet the corners")
obj.addProperty("App::PropertyDistance","ChamferSize","Base","Size of the chamfer to give to the corners")
obj.DrawMode = ['inscribed','circumscribed']
obj.FacesNumber = 3
obj.Radius = 1
@ -3157,6 +3170,11 @@ class _Polygon(_DraftObject):
pts.append(Vector(delta*math.cos(ang),delta*math.sin(ang),0))
pts.append(pts[0])
shape = Part.makePolygon(pts)
if "ChamferSize" in fp.PropertiesList:
if fp.ChamferSize != 0:
w = DraftGeomUtils.filletWire(shape,fp.ChamferSize,chamfer=True)
if w:
shape = w
if "FilletRadius" in fp.PropertiesList:
if fp.FilletRadius != 0:
w = DraftGeomUtils.filletWire(shape,fp.FilletRadius)

View File

@ -1348,7 +1348,7 @@ def arcFromSpline(edge):
# Fillet code graciously donated by Jacques-Antoine Gaudin
def fillet(lEdges,r):
def fillet(lEdges,r,chamfer=False):
''' Take a list of two Edges & a float as argument,
Returns a list of sorted edges describing a round corner'''
@ -1363,7 +1363,7 @@ def fillet(lEdges,r):
else :
raise Exception("Edge's curve must be either Line or Arc")
return existingCurveType
rndEdges = lEdges[0:2]
rndEdges = sortEdges(rndEdges)
@ -1387,6 +1387,11 @@ def fillet(lEdges,r):
U2 = lVertexes[2].Point.sub(lVertexes[1].Point) ; U2.normalize()
alpha = U1.getAngle(U2)
if chamfer:
# correcting r value so the size of the chamfer = r
beta = math.pi - alpha/2
r = (r/2)/math.cos(beta)
if round(alpha,precision()) == 0 or round(alpha - math.pi,precision()) == 0: # Edges have same direction
print "DraftGeomUtils.fillet : Warning : edges have same direction. Did nothing"
return rndEdges
@ -1406,8 +1411,10 @@ def fillet(lEdges,r):
if (dToTangent>lEdges[0].Length) or (dToTangent>lEdges[1].Length) :
print "DraftGeomUtils.fillet : Error : radius value ", r," is too high"
return rndEdges
rndEdges[1] = Part.Edge(Part.Arc(arcPt1,arcPt2,arcPt3))
if chamfer:
rndEdges[1] = Part.Edge(Part.Line(arcPt1,arcPt3))
else:
rndEdges[1] = Part.Edge(Part.Arc(arcPt1,arcPt2,arcPt3))
rndEdges[0] = Part.Edge(Part.Line(lVertexes[0].Point,arcPt1))
rndEdges += [Part.Edge(Part.Line(arcPt3,lVertexes[2].Point))]
@ -1497,7 +1504,10 @@ def fillet(lEdges,r):
rndEdges[not arcFirst] = arcAsEdge
rndEdges[arcFirst] = lineAsEdge
rndEdges[1:1] = [Part.Edge(Part.Arc(arcPt[- arcFirst],arcPt[1],arcPt[- myTrick]))]
if chamfer:
rndEdges[1:1] = [Part.Edge(Part.Line(arcPt[- arcFirst],arcPt[- myTrick]))]
else:
rndEdges[1:1] = [Part.Edge(Part.Arc(arcPt[- arcFirst],arcPt[1],arcPt[- myTrick]))]
return rndEdges
@ -1596,30 +1606,34 @@ def fillet(lEdges,r):
rndEdges[0] = arcAsEdge[0]
rndEdges[1] = arcAsEdge[1]
rndEdges[1:1] = [Part.Edge(Part.Arc(arcPt[0],arcPt[1],arcPt[2]))]
if chamfer:
rndEdges[1:1] = [Part.Edge(Part.Line(arcPt[0],arcPt[2]))]
else:
rndEdges[1:1] = [Part.Edge(Part.Arc(arcPt[0],arcPt[1],arcPt[2]))]
return rndEdges
def filletWire(aWire,r,makeClosed=True):
''' Fillets each angle of a wire with r as radius value'''
def filletWire(aWire,r,chamfer=False):
''' Fillets each angle of a wire with r as radius value
if chamfer is true, a chamfer is made instead and r is the
size of the chamfer'''
edges = aWire.Edges
edges = sortEdges(edges)
filEdges = [edges[0]]
for i in range(len(edges)-1):
result = fillet([filEdges[-1],edges[i+1]],r)
result = fillet([filEdges[-1],edges[i+1]],r,chamfer)
if len(result)>2:
filEdges[-1:] = result[0:3]
else :
filEdges[-1:] = result[0:2]
if isReallyClosed(aWire) and makeClosed :
result = fillet([filEdges[-1],filEdges[0]],r)
if isReallyClosed(aWire):
result = fillet([filEdges[-1],filEdges[0]],r,chamfer)
if len(result)>2:
filEdges[-1:] = result[0:2]
filEdges[0] = result[2]
return Part.Wire(filEdges)
# circle functions *********************************************************
def getBoundaryAngles(angle,alist):