diff --git a/Designing/WinLib/WinCalculate.lua b/Designing/WinLib/WinCalculate.lua index 5e4611a..a5693e8 100644 --- a/Designing/WinLib/WinCalculate.lua +++ b/Designing/WinLib/WinCalculate.lua @@ -58,50 +58,52 @@ end --------------------------------------------------------------------- -- funzione che trova punto di intersezione fra due curve eventualmente estendendole local function FindIntersectionPoint( nCrv1, nCrv2, ptRef) - local ptInt = EgtIP( nCrv1, nCrv2, ptRef) - if not ptInt then - -- se entrambe linee - if EgtGetType( nCrv1) == GDB_TY.CRV_LINE and EgtGetType( nCrv2) == GDB_TY.CRV_LINE then + local ptInt + -- se archi, cerco intersezioni tra le circonferenze + if EgtGetType( nCrv1) == GDB_TY.CRV_ARC and EgtGetType( nCrv2) == GDB_TY.CRV_ARC then + -- trovo intersezione tra le due circonferenze + local nCircle1 = EgtCircle( GDB_ID.ROOT, EgtCP( nCrv1), EgtArcRadius( nCrv1)) + local nCircle2 = EgtCircle( GDB_ID.ROOT, EgtCP( nCrv2), EgtArcRadius( nCrv2)) + ptInt = EgtIP( nCircle1, nCircle2, ptRef) + EgtModifyCurveStartPoint( nCrv1, ptInt) + EgtModifyCurveEndPoint( nCrv2, ptInt) + EgtErase( nCircle1) + EgtErase( nCircle2) + + elseif EgtGetType( nCrv1) == GDB_TY.CRV_ARC or EgtGetType( nCrv2) == GDB_TY.CRV_ARC then + local nLine = EgtIf( EgtGetType( nCrv1) == GDB_TY.CRV_LINE, nCrv1, nCrv2) + local nArc = EgtIf( nLine == nCrv1, nCrv2, nCrv1) + -- creo circonferenza corrispondente all'arco + local nCircle = EgtCircle( GDB_ID.ROOT, EgtCP( nArc), EgtArcRadius( nArc)) + -- prolungo la linea dal lato opportuno + local dDist1 = dist( EgtSP( nLine), ptRef) + local dDist2 = dist( EgtEP( nLine), ptRef) + if dDist1 < dDist2 then + EgtExtendCurveStartByLen( nLine, 10000) + else + EgtExtendCurveEndByLen( nLine, 10000) + end + -- ricavo il punto di riferimento dalla circonferenza + local ptNewRef = EgtIf( nArc == nCrv2, EgtEP( nArc), EgtSP( nArc)) + -- trovo l'intersezione tra retta e circonferenza + ptInt = EgtIP( nCircle, nLine, ptNewRef) + EgtErase( nCircle) + -- allungo l'arco per arrivare al punto di intersezione + if nArc == nCrv2 then + EgtModifyCurveEndPoint( nArc, ptInt) + else + EgtModifyCurveStartPoint( nArc, ptInt) + end + + else + ptInt = EgtIP( nCrv1, nCrv2, ptRef) + if not ptInt then + -- tento estendendo le curve EgtExtendCurveStartByLen( nCrv1, 10000) EgtExtendCurveEndByLen( nCrv1, 10000) EgtExtendCurveStartByLen( nCrv2, 10000) EgtExtendCurveEndByLen( nCrv2, 10000) ptInt = EgtIP( nCrv1, nCrv2, ptRef) - - -- se entrambi archi - elseif EgtGetType( nCrv1) == GDB_TY.CRV_ARC and EgtGetType( nCrv2) == GDB_TY.CRV_ARC then - -- trovo intersezione tra le due circonferenze - local nCircle1 = EgtCircle( GDB_ID.ROOT, EgtCP( nCrv1), EgtArcRadius( nCrv1)) - local nCircle2 = EgtCircle( GDB_ID.ROOT, EgtCP( nCrv2), EgtArcRadius( nCrv2)) - ptInt = EgtIP( nCircle1, nCircle2, ptRef) - EgtModifyCurveStartPoint( nCrv1, ptInt) - EgtModifyCurveEndPoint( nCrv2, ptInt) - EgtErase( nCircle1) - EgtErase( nCircle2) - - -- se arco e linea - else - local nLine = EgtIf( EgtGetType( nCrv1) == GDB_TY.CRV_LINE, nCrv1, nCrv2) - local nArc = EgtIf( nLine == nCrv1, nCrv2, nCrv1) - -- tento di trovare intersezione prolungando la linea - EgtExtendCurveStartByLen( nLine, 10000) - EgtExtendCurveEndByLen( nLine, 10000) - ptInt = EgtIP( nArc, nLine, ptRef) - if not ptInt then - -- creo circonferenza corrispondente all'arco - local nCircle = EgtCircle( GDB_ID.ROOT, EgtCP( nArc), EgtArcRadius( nArc)) - -- trovo l'intersezione tra retta e circonferenza - local ptDist = EgtIf( nArc == nCrv2, EgtEP( nArc), EgtSP( nArc)) - local _, ptRef = EgtPointCurveDist( ptDist, nLine) - ptInt = EgtIP( nCircle, nLine, ptRef) - EgtErase( nCircle) - -- allungo l'arco per arrivare al punto di intersezione - if nArc == nCrv2 then - EgtModifyCurveEndPoint( nArc, ptInt) - else - EgtModifyCurveStartPoint( nArc, ptInt) - end - end end end @@ -123,12 +125,6 @@ local function TrimAndOrientOrderedCurves( vCrvs, bOrient) local ptInters = FindIntersectionPoint( vCrvs[i], vCrvs[ nPrevIndex], EgtSP( vCrvs[i])) if LastCurveInters then LastCurveInters.EndInters = Point3d( ptInters) - -- se il punto di intersezione รจ lo stesso trovato nell'iterazione precedente cerco una seconda - -- intersezione tra le due curve - if AreSamePointApprox( ptInters, LastCurveInters.StartInters) then - ptInters = FindIntersectionPoint( vCrvs[i], vCrvs[ nPrevIndex], EgtEP( vCrvs[i])) - LastCurveInters.EndInters = Point3d( ptInters) - end end local NewCurveInters = { CurveId = vCrvs[i], StartInters = Point3d( ptInters)} table.insert( IntersCurveList, NewCurveInters) @@ -1999,7 +1995,7 @@ local function CalcGeoRaw( nPartId) -- aggiungo spessore local dDimH = EgtGetInfo( nGeoLayerId, WIN_GEOHEIGHT, 'd') EgtModifyCurveThickness( nCompo, - dDimH) - + -- creo frame ausiliario local vtX = EgtSV( nCompo) local frGeo = Frame3d( EgtSP( nCompo), vtX, Z_AX() ^ vtX, Z_AX()) @@ -4684,17 +4680,19 @@ local function CalcWaterdrip( nPartId, nOutlineId, nAreaId, bDraw) local nCopy1 = EgtCopyGlob( nCrv1, nGrp) EgtExtendCurveStartByLen( nCopy1, 200) EgtExtendCurveEndByLen( nCopy1, 200) - local pt1 = EgtIP( nOutlineId, nCopy1, ORIG()) local nCrv2 = EgtGetFirstNameInGroup( nSplitGeo, WIN_OUT) local nCopy2 = EgtCopyGlob( nCrv2, nGrp) EgtExtendCurveStartByLen( nCopy2, 200) EgtExtendCurveEndByLen( nCopy2, 200) + local pt1 = EgtIP( nOutlineId, nCopy1, ORIG()) local pt2 = EgtIP( nOutlineId, nCopy2, ORIG()) - -- salvo i parametri di intersezione - local dPar1 = EgtCurveParamAtPoint( nOutlineId, pt1, 100 * GEO.EPS_SMALL) - local dPar2 = EgtCurveParamAtPoint( nOutlineId, pt2, 100 * GEO.EPS_SMALL) - table.insert( vParams, dPar1) - table.insert( vParams, dPar2) + if pt1 and pt2 then + -- salvo i parametri di intersezione + local dPar1 = EgtCurveParamAtPoint( nOutlineId, pt1, 100 * GEO.EPS_SMALL) + local dPar2 = EgtCurveParamAtPoint( nOutlineId, pt2, 100 * GEO.EPS_SMALL) + table.insert( vParams, dPar1) + table.insert( vParams, dPar2) + end -- salvo le sue sottoaree per analizzarle local vChildren = EgtGetNameInGroup( vStack[i], WIN_AREA .. '*') or {}