#include "sifshellset.h" #include "slices.h" CSIFShellSetGeomIter *CSIFShell::AllocateGeomIter() { return (new CSIFShellGeomIter); } VOID CSIFShell::OutputLSIF(INT_32 iPrecisionExp) { CComponent *pComponent; CListIter ListIterComponents; ListIterComponents.Init(m_pLEDSGeometry->GetListComponents()); pComponent = ListIterComponents.PeekFirst(); while (pComponent) { if ((pComponent->GetType() == ctOuter) && (pComponent->GetContour()) && (pComponent->GetFirstID()) && !(pComponent->GetContainer())) { pComponent->Output(iPrecisionExp); } pComponent = ListIterComponents.PeekNext(); } } VOID CSIFShellGeomIter::Init(CSIFShellSet *pCSIFShellSet) { m_pCSIFShell = (CSIFShell *)pCSIFShellSet; m_uiNumPeeks = 0; } // To eliminate having to define a separate PeekFirst function CLEDSGeometry *CSIFShellGeomIter::PeekNext() { if (m_uiNumPeeks == 0) { m_uiNumPeeks = 1; return m_pCSIFShell->GetGeometry(); } else { return NULL; } } CSIFShellSetGeomIter *CSIFBoolean::AllocateGeomIter() { return (new CSIFBooleanGeomIter); } VOID CSIFBoolean::OutputLSIF(INT_32 iPrecisionExp) { CListIter ListIterBooleanArgs; CSIFShellSet *pCurShellSet; // (A difference with empty first arg will return 0 for NumArgs // regardless of other args, and a union with any empty args will // return 0, so won't print output for these cases.) if (NumArgs() == 0) return; if (NumArgs() > 1) { switch (m_btOperationType) { case btUnion: StartUnionOutput(); break; case btIntersection: StartIntersectionOutput(); break; case btDifference: StartDifferenceOutput(); break; } } ListIterBooleanArgs.Init(m_pCListArgs); pCurShellSet = ListIterBooleanArgs.PeekFirst(); while (pCurShellSet) { pCurShellSet->OutputLSIF(iPrecisionExp); pCurShellSet = ListIterBooleanArgs.PeekNext(); } if (NumArgs() > 1) { EndConstructOutput(); } } BOOL CSIFBoolean::LayerEmpty() { CListIter ListIterBooleanArgs; CSIFShellSet *pCurShellSet; ListIterBooleanArgs.Init(m_pCListArgs); pCurShellSet = ListIterBooleanArgs.PeekFirst(); if (!pCurShellSet ) return TRUE; if ((pCurShellSet->LayerEmpty()) && (m_btOperationType == btDifference)) return TRUE; while (pCurShellSet) { if (!pCurShellSet->LayerEmpty()) return FALSE; pCurShellSet = ListIterBooleanArgs.PeekNext(); } return TRUE; } // Return number of meaningful non-empty boolean arguments/operators. // If boolean is a difference and first arg is empty, return 0. // If boolean is an intersection and any arg is empty, return 0. UINT_32 CSIFBoolean::NumArgs() { CListIter ListIterBooleanArgs; CSIFShellSet *pCurShellSet; UINT_32 iNumArgs = 0; ListIterBooleanArgs.Init(m_pCListArgs); pCurShellSet = ListIterBooleanArgs.PeekFirst(); if (!pCurShellSet ) return 0; if ((pCurShellSet->LayerEmpty()) && (m_btOperationType == btDifference)) return 0; while (pCurShellSet) { if (!pCurShellSet->LayerEmpty()) { iNumArgs++; } else if (m_btOperationType == btIntersection) { return 0; } pCurShellSet = ListIterBooleanArgs.PeekNext(); } return iNumArgs; } VOID CSIFBooleanGeomIter::Init(CSIFShellSet *pSIFShellSet) { CSIFBoolean *pSIFBoolean = (CSIFBoolean *)pSIFShellSet; m_ListIterBooleanArgs.Init(pSIFBoolean->GetArgs()); m_pCurShellSet = m_ListIterBooleanArgs.PeekFirst(); if (m_pCurShellSet) { m_pCurShellSetIter = m_pCurShellSet->AllocateGeomIter(); m_pCurShellSetIter->Init(m_pCurShellSet); } } CLEDSGeometry *CSIFBooleanGeomIter::PeekNext() { CLEDSGeometry *pGeometry; if (m_pCurShellSet == NULL) return NULL; pGeometry = m_pCurShellSetIter->PeekNext(); if (pGeometry != NULL) { return pGeometry; } else { m_pCurShellSet = m_ListIterBooleanArgs.PeekNext(); if (m_pCurShellSet) { m_pCurShellSetIter = m_pCurShellSet->AllocateGeomIter(); m_pCurShellSetIter->Init(m_pCurShellSet); return PeekNext(); } else { return NULL; } } }