add changes to Waterline
This commit is contained in:
@@ -1419,28 +1419,17 @@ class ObjectSurface(PathOp.ObjectOp):
|
||||
#TODO: test if this works
|
||||
facets = M.Mesh.Facets.Points
|
||||
else:
|
||||
facets = Path.getFacets(M.Shape)
|
||||
|
||||
stl = ocl.STLSurf()
|
||||
|
||||
facets = Path.getFacets(M.Shape)
|
||||
|
||||
if self.modelSTLs[m] is True:
|
||||
stl = ocl.STLSurf()
|
||||
|
||||
if obj.Algorithm == 'OCL Dropcutter':
|
||||
for tri in facets:
|
||||
t = ocl.Triangle(ocl.Point(tri[0][0], tri[0][1], tri[0][2]),
|
||||
ocl.Point(tri[1][0], tri[1][1], tri[1][2]),
|
||||
ocl.Point(tri[2][0], tri[2][1], tri[2][2]))
|
||||
stl.addTriangle(t)
|
||||
self.modelSTLs[m] = stl
|
||||
elif obj.Algorithm == 'OCL Waterline':
|
||||
for tri in facets:
|
||||
t = ocl.Triangle(ocl.Point(tri[0][0], tri[0][1], tri[0][2] + obj.DepthOffset.Value),
|
||||
ocl.Point(tri[1][0], tri[1][1], tri[1][2] + obj.DepthOffset.Value),
|
||||
ocl.Point(tri[2][0], tri[2][1], tri[2][2] + obj.DepthOffset.Value))
|
||||
stl.addTriangle(t)
|
||||
self.modelSTLs[m] = stl
|
||||
for tri in facets:
|
||||
t = ocl.Triangle(ocl.Point(tri[0][0], tri[0][1], tri[0][2]),
|
||||
ocl.Point(tri[1][0], tri[1][1], tri[1][2]),
|
||||
ocl.Point(tri[2][0], tri[2][1], tri[2][2]))
|
||||
stl.addTriangle(t)
|
||||
self.modelSTLs[m] = stl
|
||||
return
|
||||
|
||||
def _makeSafeSTL(self, JOB, obj, mdlIdx, faceShapes, voidShapes):
|
||||
|
||||
@@ -1404,24 +1404,18 @@ class ObjectWaterline(PathOp.ObjectOp):
|
||||
|
||||
# PathLog.debug(f" -self.modelTypes[{m}] == 'M'")
|
||||
if self.modelTypes[m] == 'M':
|
||||
mesh = M.Mesh
|
||||
#TODO: test if this works
|
||||
facets = M.Mesh.Facets.Points
|
||||
else:
|
||||
# base.Shape.tessellate(0.05) # 0.5 original value
|
||||
mesh = MeshPart.meshFromShape(Shape=M.Shape,
|
||||
LinearDeflection=obj.LinearDeflection.Value,
|
||||
AngularDeflection=obj.AngularDeflection.Value,
|
||||
Relative=False)
|
||||
facets = Path.getFacets(M.Shape)
|
||||
|
||||
if self.modelSTLs[m] is True:
|
||||
stl = ocl.STLSurf()
|
||||
|
||||
for f in mesh.Facets:
|
||||
p = f.Points[0]
|
||||
q = f.Points[1]
|
||||
r = f.Points[2]
|
||||
t = ocl.Triangle(ocl.Point(p[0], p[1], p[2] + obj.DepthOffset.Value),
|
||||
ocl.Point(q[0], q[1], q[2] + obj.DepthOffset.Value),
|
||||
ocl.Point(r[0], r[1], r[2] + obj.DepthOffset.Value))
|
||||
for tri in facets:
|
||||
t = ocl.Triangle(ocl.Point(tri[0][0], tri[0][1], tri[0][2] + obj.DepthOffset.Value),
|
||||
ocl.Point(tri[1][0], tri[1][1], tri[1][2] + obj.DepthOffset.Value),
|
||||
ocl.Point(tri[2][0], tri[2][1], tri[2][2] + obj.DepthOffset.Value))
|
||||
stl.addTriangle(t)
|
||||
self.modelSTLs[m] = stl
|
||||
return
|
||||
@@ -1494,11 +1488,7 @@ class ObjectWaterline(PathOp.ObjectOp):
|
||||
voidEnv = PathUtils.getEnvelope(partshape=voidComp, depthparams=self.depthParams) # Produces .Shape
|
||||
fuseShapes.append(voidEnv)
|
||||
|
||||
f0 = fuseShapes.pop(0)
|
||||
if len(fuseShapes) > 0:
|
||||
fused = f0.fuse(fuseShapes)
|
||||
else:
|
||||
fused = f0
|
||||
fused = Part.makeCompound(fuseShapes)
|
||||
|
||||
if self.showDebugObjects is True:
|
||||
T = FreeCAD.ActiveDocument.addObject('Part::Feature', 'safeSTLShape')
|
||||
@@ -1506,20 +1496,13 @@ class ObjectWaterline(PathOp.ObjectOp):
|
||||
T.purgeTouched()
|
||||
self.tempGroup.addObject(T)
|
||||
|
||||
# Extract mesh from fusion
|
||||
meshFuse = MeshPart.meshFromShape(Shape=fused,
|
||||
LinearDeflection=obj.LinearDeflection.Value,
|
||||
AngularDeflection=obj.AngularDeflection.Value,
|
||||
Relative=False)
|
||||
# time.sleep(0.2)
|
||||
facets = Path.getFacets(fused)
|
||||
|
||||
stl = ocl.STLSurf()
|
||||
for f in meshFuse.Facets:
|
||||
p = f.Points[0]
|
||||
q = f.Points[1]
|
||||
r = f.Points[2]
|
||||
t = ocl.Triangle(ocl.Point(p[0], p[1], p[2]),
|
||||
ocl.Point(q[0], q[1], q[2]),
|
||||
ocl.Point(r[0], r[1], r[2]))
|
||||
for tri in facets:
|
||||
t = ocl.Triangle(ocl.Point(tri[0][0], tri[0][1], tri[0][2]),
|
||||
ocl.Point(tri[1][0], tri[1][1], tri[1][2]),
|
||||
ocl.Point(tri[2][0], tri[2][1], tri[2][2]))
|
||||
stl.addTriangle(t)
|
||||
|
||||
self.safeSTLs[mdlIdx] = stl
|
||||
@@ -1800,7 +1783,7 @@ class ObjectWaterline(PathOp.ObjectOp):
|
||||
|
||||
ep = FreeCAD.Vector(v2[0], v2[1], 0.0) # end point
|
||||
cp = FreeCAD.Vector(v1[0], v1[1], 0.0) # check point (first / middle point)
|
||||
iC = self.isPointOnLine(sp, ep, cp)
|
||||
iC = sp.isOnLine(ep, cp)
|
||||
if iC is True:
|
||||
inLine.append('BRK')
|
||||
chkGap = True
|
||||
@@ -1906,7 +1889,7 @@ class ObjectWaterline(PathOp.ObjectOp):
|
||||
|
||||
cp = FreeCAD.Vector(v1[0], v1[1], 0.0) # check point (start point of segment)
|
||||
ep = FreeCAD.Vector(v2[0], v2[1], 0.0) # end point
|
||||
iC = self.isPointOnLine(sp, ep, cp)
|
||||
iC = sp.isOnLine(ep, cp)
|
||||
if iC is True:
|
||||
inLine.append('BRK')
|
||||
chkGap = True
|
||||
@@ -2713,7 +2696,7 @@ class ObjectWaterline(PathOp.ObjectOp):
|
||||
else:
|
||||
optimize = False
|
||||
|
||||
if not optimize or not self.isPointOnLine(FreeCAD.Vector(prev.x, prev.y, prev.z), FreeCAD.Vector(nxt.x, nxt.y, nxt.z), FreeCAD.Vector(pnt.x, pnt.y, pnt.z)):
|
||||
if not optimize or not FreeCAD.Vector(prev.x, prev.y, prev.z).isOnLine(FreeCAD.Vector(nxt.x, nxt.y, nxt.z), FreeCAD.Vector(pnt.x, pnt.y, pnt.z)):
|
||||
output.append(Path.Command('G1', {'X': pnt.x, 'Y': pnt.y, 'F': self.horizFeed}))
|
||||
|
||||
# Rotate point data
|
||||
@@ -3341,26 +3324,6 @@ class ObjectWaterline(PathOp.ObjectOp):
|
||||
|
||||
return (useOfst, usePat, clearLastLayer)
|
||||
|
||||
# Support functions for both dropcutter and waterline operations
|
||||
def isPointOnLine(self, strtPnt, endPnt, pointP):
|
||||
'''isPointOnLine(strtPnt, endPnt, pointP) ... Determine if a given point is on the line defined by start and end points.'''
|
||||
tolerance = 1e-6
|
||||
vectorAB = endPnt - strtPnt
|
||||
vectorAC = pointP - strtPnt
|
||||
crossproduct = vectorAB.cross(vectorAC)
|
||||
dotproduct = vectorAB.dot(vectorAC)
|
||||
|
||||
if crossproduct.Length > tolerance:
|
||||
return False
|
||||
|
||||
if dotproduct < 0:
|
||||
return False
|
||||
|
||||
if dotproduct > vectorAB.Length * vectorAB.Length:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def resetOpVariables(self, all=True):
|
||||
'''resetOpVariables() ... Reset class variables used for instance of operation.'''
|
||||
self.holdPoint = None
|
||||
|
||||
Reference in New Issue
Block a user