- aggiunta verifica start ed end dowel

- aggiunti dowel a pezzi che intersecano gli split
- aggiunti nomi superfici dei pezzi
This commit is contained in:
Emmanuele Sassi
2024-01-02 14:46:44 +01:00
parent 04853e26fe
commit 051eadb6e9
5 changed files with 214 additions and 41 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
+4
View File
@@ -176,6 +176,7 @@ WIN_PRF_TYPE = 'Type'
WIN_PRF_MAIN = 'Main'
WIN_PRF_START = 'Start'
WIN_PRF_END = 'End'
WIN_PRF_SPLIT = 'Split'
WIN_PROFILETYPE = 'ProfileType'
WIN_SEPARATIONTYPE = 'SeparationType'
@@ -195,6 +196,9 @@ WIN_FILLDELTA = 'FillDelta'
WIN_MAINGUIDE = 'MainGuide'
WIN_STARTGUIDE = 'StartGuide'
WIN_ENDGUIDE = 'EndGuide'
WIN_SRF_MAIN = 'MainSurface'
WIN_SRF_START = 'StartSurface'
WIN_SRF_END = 'EndSurface'
WIN_BOTTOMRAIL = 'BottomRail'
+210 -41
View File
@@ -1526,6 +1526,7 @@ function WinCalculate.MakeSolidByExtrusion(nGeoId, nOutlineId, nMainProfileId, n
-- recupero outline del profilo Main e lo estrudo
local nMainOutlineId = EgtGetFirstNameInGroup( nMainProfileId, WIN_SECTION)
local nMainExtrusionId = EgtSurfTmSwept( nSolidLayerId, nMainOutlineId, nGuideId, false, WIN_SURF_APPROX)
EgtSetName( nMainExtrusionId, WIN_SRF_MAIN)
-- posiziono il profilo Start
local nRefStartProfileId = EgtGetFirstNameInGroup( nStartProfileId, WIN_REF)
local b3RefStartProfile = EgtGetBBoxGlob(nRefStartProfileId, GDB_BB.STANDARD)
@@ -1596,13 +1597,14 @@ function WinCalculate.MakeSolidByExtrusion(nGeoId, nOutlineId, nMainProfileId, n
nOutStartProfileId = EgtGetFirstNameInGroup( nStartProfileId, sStartProfileType)
end
local nStartExtrusionId = EgtSurfTmSwept( nSolidLayerId, nOutStartProfileId, nStartGuideId, false, WIN_SURF_APPROX)
EgtSetName( nStartExtrusionId, WIN_SRF_START)
-- taglio estrusi per ottenere solido
local nExtrCopyId = EgtCopy( nMainExtrusionId, nSolidLayerId)
EgtSurfTmCut( nMainExtrusionId, nStartExtrusionId, true, false)
EgtSurfTmCut( nStartExtrusionId, nExtrCopyId, true, false)
-- creo fori per spine su Start
local nDowelLayerId = EgtGroup( nPartId)
EgtSetName( nDowelLayerId, 'Dowel')
EgtSetName( nDowelLayerId, WIN_DOWEL)
local nPrevOutlineId, nEndOutlineId = GetPrevNextOutline( nProfileType, nOutlineId, nOutlineLayerId)
local sOutlineName = EgtGetName( nOutlineId)
local sPrevOutlineName = EgtGetName( nPrevOutlineId)
@@ -1673,26 +1675,29 @@ function WinCalculate.MakeSolidByExtrusion(nGeoId, nOutlineId, nMainProfileId, n
if not dEnd then
dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd')
end
local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId)
EgtSetColor( nDowelId, Color3d( 128, 128, 128))
local nLeftGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_LEFT)
local ptDowelCenter = EgtCP( nDowelId)
local vtParaStartPoint = EgtSV( nOutlineId)
-- posiziono i fori e gli assegno estrusione e spessore
EgtMove( nDowelId, ( EgtSP( nLeftGeoId) - ptDowelCenter) * vtParaStartPoint * vtParaStartPoint + vtParaStartPoint * dStart)
-- EgtMove( nDowelId, Point3d( ptDowelCenter:getX(), EgtSP( nLeftGeoId):getY(), ptDowelCenter:getZ()) - ptDowelCenter + vtParaStartPoint * dStart)
EgtModifyCurveExtrusion( nDowelId, vtParaStartPoint)
EgtModifyCurveThickness( nDowelId, dEnd - dStart)
-- creo solido di estrusione
local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtParaStartPoint * ( dEnd - dStart + 1))
EgtMove( nDowelExtrusionId, - vtParaStartPoint)
EgtInvertSurf( nDowelExtrusionId)
-- taglio estrusi per ottenere solido
local nDowelExtrCopyId = EgtCopy( nDowelExtrusionId, nSolidLayerId)
EgtSurfTmCut( nDowelExtrusionId, nStartExtrusionId, true, false)
EgtSurfTmCut( nStartExtrusionId, nDowelExtrCopyId, true, false)
EgtErase( nDowelExtrCopyId)
nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*')
-- verifico che start ed end abbiano dei valori
if dStart and dEnd then
local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId)
EgtSetColor( nDowelId, Color3d( 128, 128, 128))
local nLeftGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_LEFT)
local ptDowelCenter = EgtCP( nDowelId)
local vtParaStartPoint = EgtSV( nOutlineId)
-- posiziono i fori e gli assegno estrusione e spessore
EgtMove( nDowelId, ( EgtSP( nLeftGeoId) - ptDowelCenter) * vtParaStartPoint * vtParaStartPoint + vtParaStartPoint * dStart)
-- EgtMove( nDowelId, Point3d( ptDowelCenter:getX(), EgtSP( nLeftGeoId):getY(), ptDowelCenter:getZ()) - ptDowelCenter + vtParaStartPoint * dStart)
EgtModifyCurveExtrusion( nDowelId, vtParaStartPoint)
EgtModifyCurveThickness( nDowelId, dEnd - dStart)
-- creo solido di estrusione
local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtParaStartPoint * ( dEnd - dStart + 1))
EgtMove( nDowelExtrusionId, - vtParaStartPoint)
EgtInvertSurf( nDowelExtrusionId)
-- taglio estrusi per ottenere solido
local nDowelExtrCopyId = EgtCopy( nDowelExtrusionId, nSolidLayerId)
EgtSurfTmCut( nDowelExtrusionId, nStartExtrusionId, true, false)
EgtSurfTmCut( nStartExtrusionId, nDowelExtrCopyId, true, false)
EgtErase( nDowelExtrCopyId)
end
nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*')
end
end
-- posiziono il profilo End
@@ -1759,6 +1764,7 @@ function WinCalculate.MakeSolidByExtrusion(nGeoId, nOutlineId, nMainProfileId, n
nOutEndProfileId = EgtGetFirstNameInGroup( nEndProfileId, sEndProfileType)
end
local nEndExtrusionId = EgtSurfTmSwept( nSolidLayerId, nOutEndProfileId, nEndGuideId, false, WIN_SURF_APPROX)
EgtSetName( nEndExtrusionId, WIN_SRF_END)
-- taglio estrusi per ottenere solido
EgtSurfTmCut( nMainExtrusionId, nEndExtrusionId, true, false)
EgtSurfTmCut( nEndExtrusionId, nExtrCopyId, true, false)
@@ -1828,24 +1834,27 @@ function WinCalculate.MakeSolidByExtrusion(nGeoId, nOutlineId, nMainProfileId, n
if not dEnd then
dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd')
end
local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId)
EgtSetColor( nDowelId, Color3d( 128, 128, 128))
local nRightGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_RIGHT)
local ptDowelCenter = EgtCP( nDowelId)
local vtParaEndPoint = EgtEV( nOutlineId)
-- posiziono i fori e gli assegno estrusione e spessore
EgtMove( nDowelId, ( EgtSP( nRightGeoId) - ptDowelCenter) * vtParaEndPoint * vtParaEndPoint - vtParaEndPoint * dStart)
EgtModifyCurveExtrusion( nDowelId, - vtParaEndPoint)
EgtModifyCurveThickness( nDowelId, dEnd - dStart)
-- creo solido di estrusione
local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, - vtParaEndPoint * ( dEnd - dStart + 1))
EgtMove( nDowelExtrusionId, vtParaEndPoint)
EgtInvertSurf( nDowelExtrusionId)
-- taglio estrusi per ottenere solido
local nDowelExtrCopyId = EgtCopy( nDowelExtrusionId, nSolidLayerId)
EgtSurfTmCut( nDowelExtrusionId, nEndExtrusionId, true, false)
EgtSurfTmCut( nEndExtrusionId, nDowelExtrCopyId, true, false)
EgtErase( nDowelExtrCopyId)
-- verifico che start ed end abbiano dei valori
if dStart and dEnd then
local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId)
EgtSetColor( nDowelId, Color3d( 128, 128, 128))
local nRightGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_RIGHT)
local ptDowelCenter = EgtCP( nDowelId)
local vtParaEndPoint = EgtEV( nOutlineId)
-- posiziono i fori e gli assegno estrusione e spessore
EgtMove( nDowelId, ( EgtSP( nRightGeoId) - ptDowelCenter) * vtParaEndPoint * vtParaEndPoint - vtParaEndPoint * dStart)
EgtModifyCurveExtrusion( nDowelId, - vtParaEndPoint)
EgtModifyCurveThickness( nDowelId, dEnd - dStart)
-- creo solido di estrusione
local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, - vtParaEndPoint * ( dEnd - dStart + 1))
EgtMove( nDowelExtrusionId, vtParaEndPoint)
EgtInvertSurf( nDowelExtrusionId)
-- taglio estrusi per ottenere solido
local nDowelExtrCopyId = EgtCopy( nDowelExtrusionId, nSolidLayerId)
EgtSurfTmCut( nDowelExtrusionId, nEndExtrusionId, true, false)
EgtSurfTmCut( nEndExtrusionId, nDowelExtrCopyId, true, false)
EgtErase( nDowelExtrCopyId)
end
nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*')
end
end
@@ -1854,7 +1863,167 @@ function WinCalculate.MakeSolidByExtrusion(nGeoId, nOutlineId, nMainProfileId, n
end
-- funzione che posiziona i fori delle spine degli split, li estrude e crea il solido
function WinCalculate.AddSplitDowelToExtrusion(nGeoId, nOutlineId, nMainProfileId, nStartProfileId, nEndProfileId, nProfileType, nSolidLayerId, nAreaType)
function WinCalculate.AddSplitDowelToExtrusion(nOutlineId, nProfileFrameLayerId, nFrameProfileLayerId, nProfileType, nPartId, nSolidLayerId)
-- recupero l'area di cui fa parte il pezzo
local sOutlineName2 = EgtGetName( nOutlineId)
local nOutlineLayerId = EgtGetParent( nOutlineId)
local nAreaLayerId = EgtGetParent( nOutlineLayerId)
-- se profilo Bottom con BottomRail, esco
if nProfileType == WIN_PRF.BOTTOM then
local nBaseOutlineLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_AREAOUTLINE)
local nBottomRailId = EgtGetInfo( nBaseOutlineLayerId, WIN_BOTTOMRAIL, 'i')
if nBottomRailId and nBottomRailId == 1 then
return
end
end
-- verifico la presenza di eventuali Split
local nSplitLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_SPLIT)
if not nSplitLayerId then
return
end
local nSplitId = EgtGetFirstInGroup( nSplitLayerId)
-- se presenti, verifico se intersecano l'outline che sto analizzando
local ptInters = EgtIP( nOutlineId, nSplitId, EgtSP( nSplitId))
if not ptInters then
return
end
-- se interseca, recupero il profilo dello split
local sSplitProfileType = EgtGetInfo( nSplitId, WIN_PROFILETYPE)
local nOrigSplitProfileId = EgtGetFirstNameInGroup( nProfileFrameLayerId, sSplitProfileType)
-- creo copia del profilo
local nSplitProfileId = EgtCopy( nOrigSplitProfileId, nFrameProfileLayerId)
local sSplitProfileType = EgtGetName( nOrigSplitProfileId)
EgtSetInfo( nSplitProfileId, WIN_PRF_TYPE, sSplitProfileType)
EgtSetName( nSplitProfileId, WIN_PRF_SPLIT)
-- recupero intersezione con lato In
local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO)
local nGeoInId = EgtGetFirstNameInGroup(nGeoLayerId, WIN_GEO_IN)
local ptIntersIn = EgtIP( nGeoInId, nSplitId, EgtSP( nSplitId))
-- recupero frame del profilo
local nSplitProfileFrameId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_SECTIONFRAME)
local frInvertSplitProfile = EgtFR( nSplitProfileFrameId)
frInvertSplitProfile:invert()
-- lo applico a tutte le geometrie del profilo
EgtTransform( EgtGetAllInGroup( nSplitProfileId), frInvertSplitProfile)
-- assegno come riferimento del profilo il punto di intersezione
EgtChangeGroupFrame( nSplitProfileId, Frame3d( ptIntersIn, - EgtSV( nSplitId)))
-- e lo porto nel sistema di riferimento corretto
-- recupero profondita' start e end dei dowel
-- ne disegno la superficie
-- recupero solido del pezzo
local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID)
local nMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN)
-- creo fori per spine su Split
local nDowelLayerId = EgtGetFirstNameInGroup( nPartId, WIN_DOWEL)
local nPrevOutlineId, nEndOutlineId = GetPrevNextOutline( nProfileType, nOutlineId, nOutlineLayerId)
local sOutlineName = EgtGetName( nOutlineId)
local sPrevOutlineName = EgtGetName( nPrevOutlineId)
SplitJointType = WIN_PART_JNT.FULL
if SplitJointType == WIN_PART_JNT.ANGLED then
elseif SplitJointType == WIN_PART_JNT.FULL then
-- recupero profondita' d'inizio e fine
local sStart = WIN_DWL_TOPPERPSTART
local sEnd = WIN_DWL_TOPPERPEND
if nProfileType == WIN_PRF.BOTTOM then
sStart = WIN_DWL_BOTTOMPERPSTART
sEnd = WIN_DWL_BOTTOMPERPEND
elseif nProfileType == WIN_PRF.BOTTOMRAIL then
sStart = WIN_DWL_RAILBOTTOMPERPSTART
sEnd = WIN_DWL_RAILBOTTOMPERPEND
end
-- recupero profondita' d'inizio e fine
--local sStart = EgtIf( sOutlineName == WIN_BOTTOM, WIN_DWL_BOTTOMPERPSTART, WIN_DWL_TOPPERPSTART)
--local sEnd = EgtIf( sOutlineName == WIN_BOTTOM, WIN_DWL_BOTTOMPERPEND, WIN_DWL_TOPPERPEND)
-- ciclo sui fori trovati
local nOrigDowelId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_DOWEL .. '*')
while nOrigDowelId do
local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd')
if not dStart then
dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPSTART, 'd')
end
local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd')
if not dEnd then
dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPEND, 'd')
end
local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId)
EgtSetColor( nDowelId, Color3d( 128, 128, 128))
local nInGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN)
local ptDowelCenter = EgtCP( nDowelId)
local vtPerpStartPoint = EgtSV( nOutlineId)
vtPerpStartPoint:rotate( Z_AX(), 90)
-- posiziono i fori e gli assegno estrusione e spessore
EgtMove( nDowelId, ( EgtSP( nInGeoId) - ptDowelCenter) * vtPerpStartPoint * vtPerpStartPoint - vtPerpStartPoint * dStart)
-- EgtMove( nDowelId, Point3d( ptDowelCenter:getX(), EgtSP( nInGeoId):getY(), ptDowelCenter:getZ()) - ptDowelCenter - vtPerpStartPoint * dStart)
EgtModifyCurveExtrusion( nDowelId, - vtPerpStartPoint)
EgtModifyCurveThickness( nDowelId, dEnd - dStart)
-- creo solido di estrusione
local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, - vtPerpStartPoint * ( dEnd - dStart + 1))
EgtMove( nDowelExtrusionId, vtPerpStartPoint)
EgtInvertSurf( nDowelExtrusionId)
-- taglio estrusi per ottenere solido
EgtSurfTmCut( nMainExtrusionId, nDowelExtrusionId, true, false)
-- EgtSurfTmCut( nDowelExtrusionId, nExtrCopyId, true, false)
nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*')
end
elseif SplitJointType == WIN_PART_JNT.SHORT then
-- recupero profondita' d'inizio e fine
local sStart = WIN_DWL_TOPPARASTART
local sEnd = WIN_DWL_TOPPARAEND
if sOutlineName == WIN_BOTTOM then
sStart = WIN_DWL_BOTTOMPARASTART
sEnd = WIN_DWL_BOTTOMPARAEND
elseif sOutlineName == WIN_SPLIT then
local sStartType = EgtGetInfo( nSplitProfileId, WIN_PRF_TYPE)
if ( sStartType and sStartType == WIN_RAIL_BOTTOM) or sPrevOutlineName == WIN_SPLIT then
sStart = WIN_DWL_RAILBOTTOMPARASTART
sEnd = WIN_DWL_RAILBOTTOMPARAEND
end
elseif sPrevOutlineName == WIN_BOTTOM then
sStart = WIN_DWL_BOTTOMPARASTART
sEnd = WIN_DWL_BOTTOMPARAEND
end
--local sStart = EgtIf( sOutlineName == WIN_BOTTOM or sPrevOutlineName == WIN_BOTTOM or sOutlineName == WIN_BOTTOMRAIL, WIN_DWL_BOTTOMPARASTART, WIN_DWL_TOPPARASTART)
--local sEnd = EgtIf( sOutlineName == WIN_BOTTOM or sPrevOutlineName == WIN_BOTTOM or sOutlineName == WIN_BOTTOMRAIL, WIN_DWL_BOTTOMPARAEND, WIN_DWL_TOPPARAEND)
-- ciclo sui fori trovati
local nOrigDowelId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_DOWEL .. '*')
while nOrigDowelId do
local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd')
if not dStart then
dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARASTART, 'd')
end
local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd')
if not dEnd then
dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd')
end
local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId)
EgtSetColor( nDowelId, Color3d( 128, 128, 128))
local nLeftGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_LEFT)
local ptDowelCenter = EgtCP( nDowelId)
local vtParaStartPoint = EgtSV( nOutlineId)
-- posiziono i fori e gli assegno estrusione e spessore
EgtMove( nDowelId, ( EgtSP( nLeftGeoId) - ptDowelCenter) * vtParaStartPoint * vtParaStartPoint + vtParaStartPoint * dStart)
-- EgtMove( nDowelId, Point3d( ptDowelCenter:getX(), EgtSP( nLeftGeoId):getY(), ptDowelCenter:getZ()) - ptDowelCenter + vtParaStartPoint * dStart)
EgtModifyCurveExtrusion( nDowelId, vtParaStartPoint)
EgtModifyCurveThickness( nDowelId, dEnd - dStart)
-- creo solido di estrusione
local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtParaStartPoint * ( dEnd - dStart + 1))
EgtMove( nDowelExtrusionId, - vtParaStartPoint)
EgtInvertSurf( nDowelExtrusionId)
-- taglio estrusi per ottenere solido
local nDowelExtrCopyId = EgtCopy( nDowelExtrusionId, nSolidLayerId)
EgtSurfTmCut( nDowelExtrusionId, nMainExtrusionId, true, false)
EgtSurfTmCut( nMainExtrusionId, nDowelExtrCopyId, true, false)
EgtErase( nDowelExtrCopyId)
nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*')
end
end
end
@@ -2271,7 +2440,7 @@ function WinCalculate.CalcFrameSolid(nPartId, nOutlineId, nGeoId, nOutlineLayerI
-- nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i')
-- until not nAreaId or ( nAreaType ~= WIN_AREATYPES.SPLIT and nAreaType ~= WIN_AREATYPES.NULL)
--
-- WinCalculate.AddSplitDowelToExtrusion(nGeoId, nOutlineId, nProfileType, nSolidLayerId, nAreaType)
WinCalculate.AddSplitDowelToExtrusion( nOutlineId, nProfileFrameLayerId, nFrameProfileLayerId, nProfileType, nPartId, nSolidLayerId)
end
-- funzione che crea il solido del Fill