- in LeadInOutLib LeadIn e Out sono entrambi nella direzione del lato adiacente migliore
This commit is contained in:
+44
-38
@@ -46,6 +46,23 @@ function LeadInOutLib.CalculateLeadInOut( sLeadInOutType, Parameters)
|
||||
LeadOut.dCompLength = 0
|
||||
|
||||
if sLeadInOutType == 'Perpendicular' then
|
||||
|
||||
if bIsStartClosed and bIsEndClosed then
|
||||
LeadIn.dStartAddLength = -LeadInOut.dToolMarkLength
|
||||
LeadOut.dEndAddLength = -LeadInOut.dToolMarkLength
|
||||
elseif bIsStartClosed then
|
||||
LeadIn.dStartAddLength = -LeadInOut.dToolMarkLength
|
||||
-- eventuale correzione per accorciamento maggiore di larghezza tasca
|
||||
LeadOut.dEndAddLength = max( -LeadIn.dStartAddLength - Edge.dLength + 10 * BeamData.CUT_EXTRA, BeamData.CUT_EXTRA)
|
||||
elseif bIsEndClosed then
|
||||
LeadOut.dEndAddLength = -LeadInOut.dToolMarkLength
|
||||
-- eventuale correzione per accorciamento maggiore di larghezza tasca
|
||||
LeadIn.dStartAddLength = max( -LeadOut.dEndAddLength - Edge.dLength + 10 * BeamData.CUT_EXTRA, BeamData.CUT_EXTRA)
|
||||
else
|
||||
LeadIn.dStartAddLength = LeadInOut.dAddedLengthOpenFace
|
||||
LeadOut.dEndAddLength = LeadInOut.dAddedLengthOpenFace
|
||||
end
|
||||
|
||||
-- informazioni lati adiacenti
|
||||
local nCurrentEdgeIndex = Edge.id + 1
|
||||
local nPreviousEdgeIndex = ( nCurrentEdgeIndex == 1 and #Face.Edges) or nCurrentEdgeIndex - 1
|
||||
@@ -56,56 +73,45 @@ function LeadInOutLib.CalculateLeadInOut( sLeadInOutType, Parameters)
|
||||
-- frame solidale al lato di lavoro (X lungo il lato, Y normale al lato)
|
||||
local frEdge = Frame3d( Edge.ptStart, Face.vtN, Edge.vtEdge)
|
||||
|
||||
-- direzione lati adiacenti nel frame solidale al lato di lavoro
|
||||
local vtEdgeNextLoc = Vector3d( EdgeNext.vtEdge)
|
||||
vtEdgeNextLoc:toLoc( frEdge)
|
||||
local vtEdgePreviousInvLoc = Vector3d( -EdgePrevious.vtEdge)
|
||||
vtEdgePreviousInvLoc:toLoc( frEdge)
|
||||
|
||||
-- profondità di lavoro proiettata sui lati adiacenti
|
||||
local dDepthToMachinePrevious = dDepthToMachine / abs( vtEdgePreviousInvLoc:getY())
|
||||
local dDepthToMachineNext = dDepthToMachine / abs( vtEdgeNextLoc:getY())
|
||||
|
||||
-- punti di inizio e fine lavorazione alla profondità di lavoro reale
|
||||
local ptStartAtDepth = Edge.ptStart + Edge.vtN * ( Edge.dElevation - dDepthToMachine)
|
||||
local ptEndAtDepth = Edge.ptEnd + Edge.vtN * ( Edge.dElevation - dDepthToMachine)
|
||||
local ptStartAtDepth = Edge.ptStart + Edge.vtN * ( Edge.dElevation - dDepthToMachine) + -Edge.vtEdge * LeadIn.dStartAddLength
|
||||
local ptEndAtDepth = Edge.ptEnd + Edge.vtN * ( Edge.dElevation - dDepthToMachine) + Edge.vtEdge * LeadOut.dEndAddLength
|
||||
|
||||
-- tra le direzioni dei due lati adiacenti, si sceglie la migliore da cui attaccare, ossia quella più vicina alla perpendicolare al lato
|
||||
local dCosAngleStart = -EdgePrevious.vtEdge * Edge.vtN
|
||||
local dCosAngleEnd = EdgeNext.vtEdge * Edge.vtN
|
||||
local vtLeadInOut
|
||||
if dCosAngleStart > dCosAngleEnd then
|
||||
vtLeadInOut = Vector3d( -EdgePrevious.vtEdge)
|
||||
else
|
||||
vtLeadInOut = Vector3d( EdgeNext.vtEdge)
|
||||
end
|
||||
|
||||
-- direzione nel frame solidale al lato di lavoro
|
||||
local vtLeadInOuttLoc = Vector3d( vtLeadInOut)
|
||||
vtLeadInOuttLoc:toLoc( frEdge)
|
||||
|
||||
-- distanza dai punti di inizio e fine lavorazione reali al pezzo, nelle direzioni dei lati adiacenti
|
||||
-- TODO bisogna controllare bOk???
|
||||
-- il box si espande in tutte le direzioni per contemplare la sicurezza CUT_SIC (minimo 1 per non far fallire l'intersezione)
|
||||
-- TODO bisogna controllare bOk??? IntersectionType??
|
||||
local b3BoxPartExpanded = BBox3d( Part.b3Part)
|
||||
b3BoxPartExpanded:expand( BeamData.CUT_SIC)
|
||||
local bOkStart, IntersectionTypeStart, PartDistanceStart = EgtLineBoxInters( ptStartAtDepth, -EdgePrevious.vtEdge, b3BoxPartExpanded)
|
||||
local bOkEnd, IntersectionTypeEnd, PartDistanceEnd = EgtLineBoxInters( ptEndAtDepth, EdgeNext.vtEdge, b3BoxPartExpanded)
|
||||
local dDistanceToPartStart = #IntersectionTypeStart > 0 and PartDistanceStart[#PartDistanceStart] or ( dDepthToMachinePrevious + BeamData.COLL_SIC)
|
||||
local dDistanceToPartEnd = #IntersectionTypeEnd > 0 and PartDistanceEnd[#PartDistanceEnd] or ( dDepthToMachineNext + BeamData.COLL_SIC)
|
||||
b3BoxPartExpanded:expand( max( BeamData.CUT_SIC, 1))
|
||||
local bOkStart, IntersectionTypeStart, PartDistanceStart = EgtLineBoxInters( ptStartAtDepth, vtLeadInOut, b3BoxPartExpanded)
|
||||
local bOkEnd, IntersectionTypeEnd, PartDistanceEnd = EgtLineBoxInters( ptEndAtDepth, vtLeadInOut, b3BoxPartExpanded)
|
||||
local dDistanceToPartStart = PartDistanceStart[#PartDistanceStart] or BeamData.CUT_SIC
|
||||
local dDistanceToPartEnd = PartDistanceEnd[#PartDistanceEnd] or BeamData.CUT_SIC
|
||||
|
||||
-- componenti dell'attacco con aggiunta la sicurezza
|
||||
LeadIn.dPerpDistance = max( dDistanceToPartStart * vtEdgePreviousInvLoc:getY(), dDepthToMachine)
|
||||
LeadIn.dTangentDistance = max( dDistanceToPartStart, dDepthToMachinePrevious) * -abs( vtEdgePreviousInvLoc:getX())
|
||||
LeadOut.dPerpDistance = max( dDistanceToPartEnd * vtEdgeNextLoc:getY(), dDepthToMachine)
|
||||
LeadOut.dTangentDistance = max( dDistanceToPartEnd, dDepthToMachineNext) * vtEdgeNextLoc:getX()
|
||||
LeadIn.dPerpDistance = dDistanceToPartStart * vtLeadInOuttLoc:getY()
|
||||
LeadIn.dTangentDistance = dDistanceToPartStart * -vtLeadInOuttLoc:getX()
|
||||
LeadOut.dPerpDistance = dDistanceToPartEnd * vtLeadInOuttLoc:getY()
|
||||
LeadOut.dTangentDistance = dDistanceToPartEnd * vtLeadInOuttLoc:getX()
|
||||
|
||||
elseif sLeadInOutType == 'Tangent' then
|
||||
LeadIn.dTangentDistance = Tool.dDiameter / 2 + BeamData.CUT_SIC
|
||||
LeadOut.dTangentDistance = Tool.dDiameter / 2 + BeamData.CUT_SIC
|
||||
end
|
||||
|
||||
if bIsStartClosed and bIsEndClosed then
|
||||
LeadIn.dStartAddLength = -LeadInOut.dToolMarkLength
|
||||
LeadOut.dEndAddLength = -LeadInOut.dToolMarkLength
|
||||
elseif bIsStartClosed then
|
||||
LeadIn.dStartAddLength = -LeadInOut.dToolMarkLength
|
||||
-- eventuale correzione per accorciamento maggiore di larghezza tasca
|
||||
LeadOut.dEndAddLength = max( -LeadIn.dStartAddLength - Edge.dLength + 10 * BeamData.CUT_EXTRA, BeamData.CUT_EXTRA)
|
||||
elseif bIsEndClosed then
|
||||
LeadOut.dEndAddLength = -LeadInOut.dToolMarkLength
|
||||
-- eventuale correzione per accorciamento maggiore di larghezza tasca
|
||||
LeadIn.dStartAddLength = max( -LeadOut.dEndAddLength - Edge.dLength + 10 * BeamData.CUT_EXTRA, BeamData.CUT_EXTRA)
|
||||
else
|
||||
LeadIn.dStartAddLength = LeadInOut.dAddedLengthOpenFace
|
||||
LeadOut.dEndAddLength = LeadInOut.dAddedLengthOpenFace
|
||||
end
|
||||
|
||||
LeadIn.dTotalLength = sqrt( LeadIn.dPerpDistance ^ 2 + LeadIn.dTangentDistance ^ 2)
|
||||
LeadOut.dTotalLength = sqrt( LeadOut.dPerpDistance ^ 2 + LeadOut.dTangentDistance ^ 2)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user