DataWindow :
- arco a 3 centri - migliorie e correzioni varie per gestire correttamente l'arco a 3 centri ( calcolo solidi, strip, outline del fill).
This commit is contained in:
@@ -88,99 +88,120 @@ end
|
||||
------------------------------------- TELAIO -------------------------------------
|
||||
----------------------------------------------------------------------------------
|
||||
-- funzione che crea le curve che definiscono il telaio in base alla geometria richiesta
|
||||
local function CreateFrameCurves( nLayerId, nType, dWidth, dHeight, dVal)
|
||||
|
||||
local function CreateFrameCurves( nLayerId, nType, vDim)
|
||||
|
||||
-- rettangolo
|
||||
if nType == WIN_FRAME_TYPES.RECT then
|
||||
-- telaio rettangolare
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( dWidth, 0, 0))
|
||||
-- vDim[1] larghezza, vDim[2] altezza dei lati verticali
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
||||
EgtSetName( nBottomId, WIN_BOTTOM)
|
||||
local nRightId = EgtLine( nLayerId, Point3d( dWidth, 0, 0), Point3d( dWidth, dHeight, 0))
|
||||
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[2], 0))
|
||||
EgtSetName( nRightId, WIN_RIGHT)
|
||||
local nTopId = EgtLine( nLayerId, Point3d( dWidth, dHeight, 0), Point3d( 0, dHeight, 0))
|
||||
local nTopId = EgtLine( nLayerId, Point3d( vDim[1], vDim[2], 0), Point3d( 0, vDim[2], 0))
|
||||
EgtSetName( nTopId, WIN_TOP)
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, dHeight, 0), ORIG())
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2], 0), ORIG())
|
||||
EgtSetName( nLeftId, WIN_LEFT)
|
||||
|
||||
-- lato top inclinato
|
||||
elseif nType == WIN_FRAME_TYPES.CHAMFER_SIDE then
|
||||
-- dHeight è l'altezza del lato sx, dVal è l'altezza del lato dx
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( dWidth, 0, 0))
|
||||
-- vDim[1] larghezza, vDim[2] altezza del lato sx, vDim[3] altezza del lato dx
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
||||
EgtSetName( nBottomId, WIN_BOTTOM)
|
||||
local nRightId = EgtLine( nLayerId, Point3d( dWidth, 0, 0), Point3d( dWidth, dVal, 0))
|
||||
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[3], 0))
|
||||
EgtSetName( nRightId, WIN_RIGHT)
|
||||
local nTopId = EgtLine( nLayerId, Point3d( dWidth, dVal, 0), Point3d( 0, dHeight, 0))
|
||||
local nTopId = EgtLine( nLayerId, Point3d( vDim[1], vDim[3], 0), Point3d( 0, vDim[2], 0))
|
||||
EgtSetName( nTopId, WIN_TOP)
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, dHeight, 0), ORIG())
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2], 0), ORIG())
|
||||
EgtSetName( nLeftId, WIN_LEFT)
|
||||
|
||||
-- triangular arch
|
||||
elseif nType == WIN_FRAME_TYPES.CHAMFER then
|
||||
-- dHeight è l'altezza dei lati verticali, dVal è l'altezza complessiva della finestra
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( dWidth, 0, 0))
|
||||
-- vDim[1] larghezza, vDim[2] altezza dei lati verticali, vDim[3] altezza complessiva
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
||||
EgtSetName( nBottomId, WIN_BOTTOM)
|
||||
local nRightId = EgtLine( nLayerId, Point3d( dWidth, 0, 0), Point3d( dWidth, dHeight, 0))
|
||||
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[2], 0))
|
||||
EgtSetName( nRightId, WIN_RIGHT)
|
||||
local nTop1Id = EgtLine( nLayerId, Point3d( dWidth, dHeight, 0), Point3d( dWidth / 2, dVal, 0))
|
||||
local nTop2Id = EgtLine( nLayerId, Point3d( dWidth / 2, dVal, 0), Point3d( 0, dHeight, 0))
|
||||
local nTop1Id = EgtLine( nLayerId, Point3d( vDim[1], vDim[2], 0), Point3d( vDim[1] / 2, vDim[3], 0))
|
||||
local nTop2Id = EgtLine( nLayerId, Point3d( vDim[1] / 2, vDim[3], 0), Point3d( 0, vDim[2], 0))
|
||||
EgtSetName( nTop1Id, WIN_TOP)
|
||||
EgtSetName( nTop2Id, WIN_TOP)
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, dHeight, 0), ORIG())
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2], 0), ORIG())
|
||||
EgtSetName( nLeftId, WIN_LEFT)
|
||||
|
||||
-- arco a tutto sesto
|
||||
elseif nType == WIN_FRAME_TYPES.ROUND_ARC then
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( dWidth, 0, 0))
|
||||
-- vDim[1] larghezza, vDim[2] altezza complessiva
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
||||
EgtSetName( nBottomId, WIN_BOTTOM)
|
||||
local nRightId = EgtLine( nLayerId, Point3d( dWidth, 0, 0), Point3d( dWidth, dHeight - 0.5 * dWidth, 0))
|
||||
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[2] - 0.5 * vDim[1], 0))
|
||||
EgtSetName( nRightId, WIN_RIGHT)
|
||||
local nTopId = EgtArcCPA( nLayerId, Point3d( 0.5 * dWidth, dHeight - 0.5 * dWidth, 0), Point3d( dWidth, dHeight - 0.5 * dWidth, 0), 180, 0)
|
||||
local nTopId = EgtArcCPA( nLayerId, Point3d( 0.5 * vDim[1], vDim[2] - 0.5 * vDim[1], 0), Point3d( vDim[1], vDim[2] - 0.5 * vDim[1], 0), 180, 0)
|
||||
EgtSetName( nTopId, WIN_TOP)
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, dHeight - 0.5 * dWidth, 0), ORIG())
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2] - 0.5 * vDim[1], 0), ORIG())
|
||||
EgtSetName( nLeftId, WIN_LEFT)
|
||||
|
||||
-- arco ribassato
|
||||
elseif nType == WIN_FRAME_TYPES.SEGMENTAL_ARC then
|
||||
-- dHeight è l'altezza dei lati verticali, dVal è l'altezza complessiva della finestra
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( dWidth, 0, 0))
|
||||
-- vDim[1] larghezza, vDim[2] altezza dei lati verticali, vDim[3] altezza complessiva
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
||||
EgtSetName( nBottomId, WIN_BOTTOM)
|
||||
local nRightId = EgtLine( nLayerId, Point3d( dWidth, 0, 0), Point3d( dWidth, dHeight, 0))
|
||||
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[2], 0))
|
||||
EgtSetName( nRightId, WIN_RIGHT)
|
||||
local nTopId = EgtArc3P( nLayerId, Point3d( dWidth, dHeight, 0), Point3d( 0.5 * dWidth, dVal, 0), Point3d( 0, dHeight, 0))
|
||||
local nTopId = EgtArc3P( nLayerId, Point3d( vDim[1], vDim[2], 0), Point3d( 0.5 * vDim[1], vDim[3], 0), Point3d( 0, vDim[2], 0))
|
||||
EgtSetName( nTopId, WIN_TOP)
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, dHeight, 0), ORIG())
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2], 0), ORIG())
|
||||
EgtSetName( nLeftId, WIN_LEFT)
|
||||
|
||||
-- arco a tutto sesto
|
||||
|
||||
-- arco a 3 centri
|
||||
elseif nType == WIN_FRAME_TYPES.THREE_CENTERED_ARC then
|
||||
-- vDim[1] larghezza, vDim[2] altezza dei lati verticali, vDim[3] altezza complessiva, vDim[4] raggio di raccordo
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
||||
EgtSetName( nBottomId, WIN_BOTTOM)
|
||||
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[2], 0))
|
||||
EgtSetName( nRightId, WIN_RIGHT)
|
||||
local nTopId = EgtArc3P( nLayerId, Point3d( vDim[1], vDim[2], 0), Point3d( 0.5 * vDim[1], vDim[3], 0), Point3d( 0, vDim[2], 0))
|
||||
EgtSetName( nTopId, WIN_TOP)
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2], 0), ORIG())
|
||||
EgtSetName( nLeftId, WIN_LEFT)
|
||||
|
||||
local nFillet1 = EgtCurveFillet( nLayerId, nRightId, EgtUP( nRightId, 0.9), nTopId, EgtUP( nTopId, 0.1), vDim[4], true)
|
||||
EgtRelocateGlob( nFillet1, nTopId, GDB_IN.BEFORE)
|
||||
EgtSetName( nFillet1, WIN_TOP)
|
||||
local nFillet2 = EgtCurveFillet( nLayerId, nTopId, EgtUP( nTopId, 0.9), nLeftId, EgtUP( nLeftId, 0.1), vDim[4], true)
|
||||
EgtRelocateGlob( nFillet2, nTopId, GDB_IN.AFTER)
|
||||
EgtSetName( nFillet2, WIN_TOP)
|
||||
|
||||
-- arco a sesto acuto
|
||||
elseif nType == WIN_FRAME_TYPES.POINTED_ARC then
|
||||
-- dHeight è l'altezza dei lati verticali, dVal è l'altezza complessiva della finestra
|
||||
-- vDim[1] larghezza, vDim[2] altezza dei lati verticali, vDim[3] altezza complessiva
|
||||
-- verifico che le due altezze abbiano valori sensati per realizzare i due archi
|
||||
if dVal - dHeight < 0.5 * dWidth then
|
||||
if vDim[3] - vDim[2] < 0.5 * vDim[1] then
|
||||
return
|
||||
end
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( dWidth, 0, 0))
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
||||
EgtSetName( nBottomId, WIN_BOTTOM)
|
||||
local nRightId = EgtLine( nLayerId, Point3d( dWidth, 0, 0), Point3d( dWidth, dHeight, 0))
|
||||
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[2], 0))
|
||||
EgtSetName( nRightId, WIN_RIGHT)
|
||||
local nTop1Id = EgtArc2PV( nLayerId, Point3d( dWidth, dHeight, 0), Point3d( 0.5 * dWidth, dVal, 0), Y_AX())
|
||||
local nTop1Id = EgtArc2PV( nLayerId, Point3d( vDim[1], vDim[2], 0), Point3d( 0.5 * vDim[1], vDim[3], 0), Y_AX())
|
||||
EgtSetName( nTop1Id, WIN_TOP)
|
||||
local nTop2Id = EgtArc2PV( nLayerId, Point3d( 0, dHeight, 0), Point3d( 0.5 * dWidth, dVal, 0), Y_AX())
|
||||
local nTop2Id = EgtArc2PV( nLayerId, Point3d( 0, vDim[2], 0), Point3d( 0.5 * vDim[1], vDim[3], 0), Y_AX())
|
||||
EgtInvertCurve( nTop2Id)
|
||||
EgtSetName( nTop2Id, WIN_TOP)
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, dHeight, 0), ORIG())
|
||||
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2], 0), ORIG())
|
||||
EgtSetName( nLeftId, WIN_LEFT)
|
||||
|
||||
-- triangolo
|
||||
elseif nType == WIN_FRAME_TYPES.TRG then
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( dWidth, 0, 0))
|
||||
-- vDim[1] larghezza, vDim[2] altezza complessiva, vDim[3] proiezione del lato left sul bottom
|
||||
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
||||
EgtSetName( nBottomId, WIN_BOTTOM)
|
||||
local nEdge1Id = EgtLine( nLayerId, Point3d( dWidth, 0, 0), Point3d( dVal, dHeight, 0))
|
||||
local nEdge2Id = EgtLine( nLayerId, Point3d( dVal, dHeight, 0), ORIG())
|
||||
local nEdge1Id = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[3], vDim[2], 0))
|
||||
local nEdge2Id = EgtLine( nLayerId, Point3d( vDim[3], vDim[2], 0), ORIG())
|
||||
-- un lato verticale è right/left, un lato inclinato è top
|
||||
if dVal < GEO.EPS_SMALL then
|
||||
if vDim[3] < GEO.EPS_SMALL then
|
||||
EgtSetName( nEdge1Id, WIN_TOP)
|
||||
EgtSetName( nEdge2Id, WIN_LEFT)
|
||||
elseif abs( dVal - dWidth) < GEO.EPS_SMALL then
|
||||
elseif abs( vDim[3] - vDim[1]) < GEO.EPS_SMALL then
|
||||
EgtSetName( nEdge1Id, WIN_RIGHT)
|
||||
EgtSetName( nEdge2Id, WIN_TOP)
|
||||
else
|
||||
@@ -192,7 +213,7 @@ end
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
-- funzione che crea il telaio a partire da una specifica geometria ( rettangolo, chamfer...)
|
||||
function WinCreate.CreateFrame( nType, vJoints, dWidth, dHeight, dHeight2, nAreaNbr)
|
||||
function WinCreate.CreateFrame( nType, vJoints, vDimensions, nAreaNbr)
|
||||
|
||||
-- creo gruppo per telaio
|
||||
local nAreaId = EgtGroup( GDB_ID.ROOT)
|
||||
@@ -204,7 +225,7 @@ function WinCreate.CreateFrame( nType, vJoints, dWidth, dHeight, dHeight2, nArea
|
||||
-- costruisco le curve di outline
|
||||
local nOutlineLayerId = EgtGroup( nAreaId)
|
||||
EgtSetName( nOutlineLayerId, WIN_AREAOUTLINE)
|
||||
CreateFrameCurves( nOutlineLayerId, nType, dWidth, dHeight, dHeight2)
|
||||
CreateFrameCurves( nOutlineLayerId, nType, vDimensions)
|
||||
EgtSetInfo( nAreaId, WIN_FRAME_TYPE, nType)
|
||||
-- imposto tipo giunzioni
|
||||
EgtSetInfo( nOutlineLayerId, WIN_JOINTS, vJoints)
|
||||
@@ -403,11 +424,11 @@ local function AdjustSplitCurve( nSplitId, nCompo, vOutlineCrvs, nOutlineLayerId
|
||||
-- recupero le curve con cui avviene l'intersezione e le salvo come info
|
||||
-- start
|
||||
local dParCrvS = EgtCurveParamAtPoint( nCompo, ptS)
|
||||
if abs( dParCrvS - ceil( dParCrvS)) < GEO.EPS_SMALL then
|
||||
if abs( dParCrvS - ceil( dParCrvS)) < GEO.EPS_ZERO then
|
||||
local nCrv = vOutlineCrvs[ ceil( dParCrvS) + 1]
|
||||
local nOther = EgtGetPrev( nCrv) or EgtGetLastInGroup( nOutlineLayerId)
|
||||
EgtSetInfo( nSplitId, WIN_SPLIT_STARTINTERS, { nOther, nCrv})
|
||||
elseif abs( dParCrvS - floor( dParCrvS)) < GEO.EPS_SMALL then
|
||||
elseif abs( dParCrvS - floor( dParCrvS)) < GEO.EPS_ZERO then
|
||||
local nCrv = vOutlineCrvs[ floor( dParCrvS) + 1]
|
||||
local nOther = EgtGetPrev( nCrv) or EgtGetLastInGroup( nOutlineLayerId)
|
||||
EgtSetInfo( nSplitId, WIN_SPLIT_STARTINTERS, { nOther, nCrv})
|
||||
@@ -419,11 +440,11 @@ local function AdjustSplitCurve( nSplitId, nCompo, vOutlineCrvs, nOutlineLayerId
|
||||
|
||||
-- end
|
||||
local dParCrvE = EgtCurveParamAtPoint( nCompo, ptE)
|
||||
if abs( dParCrvE - ceil( dParCrvE)) < GEO.EPS_SMALL then
|
||||
if abs( dParCrvE - ceil( dParCrvE)) < GEO.EPS_ZERO then
|
||||
local nCrv = vOutlineCrvs[ ceil( dParCrvE) + 1]
|
||||
local nOther = EgtGetPrev( nCrv) or EgtGetLastInGroup( nOutlineLayerId)
|
||||
EgtSetInfo( nSplitId, WIN_SPLIT_ENDINTERS, { nOther, nCrv})
|
||||
elseif abs( dParCrvE - floor( dParCrvE)) < GEO.EPS_SMALL then
|
||||
elseif abs( dParCrvE - floor( dParCrvE)) < GEO.EPS_ZERO then
|
||||
local nCrv = vOutlineCrvs[ floor( dParCrvE) + 1]
|
||||
local nOther = EgtGetPrev( nCrv) or EgtGetLastInGroup( nOutlineLayerId)
|
||||
EgtSetInfo( nSplitId, WIN_SPLIT_ENDINTERS, { nOther, nCrv})
|
||||
|
||||
Reference in New Issue
Block a user