#include "MyVisitorRemoveColours.h" #include "Visitor\VisitorTransfo.h" #include "Visitor\VisitorContainer.h" #include "Connectors\TransfoConnector.h" #include "assert.h" const int nbColors = 76; static const int gColors[nbColors] = { 0xa60000, 0xffd0bf, 0xe5ac39, 0xa3d936, 0x00ffcc, 0x80d5ff, 0x0000f2, 0xd940ff, 0x8c0025, 0xe53939, 0xff6600, 0xf2da79, 0x598040, 0x008c70, 0x006dcc, 0x0000d9, 0x912699, 0xa65369, 0xcc6666, 0xe57e39, 0x998a4d, 0xb4e6ac, 0xbffff2, 0x4d7599, 0x110080, 0xf200c2, 0xcc99a7, 0xf22000, 0x7f4620, 0xbfb300, 0x008011, 0x7ca69d, 0x0066ff, 0xaaa3d9, 0xff80e5, 0x806068, 0x997873, 0xff8800, 0x7f7700, 0x00e63d, 0x36ced9, 0xa3b8d9, 0x853df2, 0xa6297c, 0xe56739, 0xcc8533, 0xf2eeb6, 0x53a669, 0x23858c, 0x0036cc, 0x4d238c, 0xe6acd2, 0x994526, 0x99754d, 0xe2f200, 0x608068, 0x0099bf, 0x264599, 0x6b4d99, 0x7f0044, 0xd9896c, 0xe6cbac, 0xacbf60, 0x39e67e, 0x99c2cc, 0x4d6199, 0x77698c, 0xcc669c, 0x8c5946, 0x7f5500, 0x858c69, 0x6cd9b5, 0x0099e6, 0x8091ff, 0xb073e6, 0xe5397e }; float extractRedAndFloatIt(int i) { int v = i & 0xFF0000; return v * 1 / (float)0xFF0000; } float extractGreenAndFloatIt(int i) { int v = i & 0x00FF00; return v * 1 / (float)0x00FF00; } float extractBlueAndFloatIt(int i) { int v = i & 0x0000FF; return v * 1 / (float)0x0000FF; } struct rgb { float r, g, b; }; rgb getNextColor() { static int iIndexColour = 0; int iColour = gColors[iIndexColour]; float r, g, b; r = extractRedAndFloatIt(iColour); g = extractGreenAndFloatIt(iColour); b = extractBlueAndFloatIt(iColour); // loop if (iIndexColour++ == nbColors) { iIndexColour = 0; } rgb color; color.r = r; color.g = g; color.b = b; return color; } //###################################################################################################################### // Color creation A3DStatus createRGBColor(A3DUns32& uiIndexRgbColor, A3DDouble dRed, A3DDouble dGreen, A3DDouble dBlue) { A3DStatus iRet = A3D_SUCCESS; A3DGraphRgbColorData sData; A3D_INITIALIZE_DATA(A3DGraphRgbColorData, sData); sData.m_dRed = dRed; sData.m_dGreen = dGreen; sData.m_dBlue = dBlue; iRet = A3DGlobalInsertGraphRgbColor(&sData, &uiIndexRgbColor); return iRet; } A3DStatus setGraphicsColor(A3DRootBaseWithGraphicsData* pOutRootBaseWithGraphics, A3DDouble dRed, A3DDouble dGreen, A3DDouble dBlue, A3DDouble dAlpha) { A3DStatus iRet = A3D_SUCCESS; //Create a style color A3DUns32 uiColorIndex = 0; CHECK_RET(createRGBColor(uiColorIndex, dRed, dGreen, dBlue)); A3DUns32 uiStyleIndex = 0; A3DGraphStyleData sStyleData; A3D_INITIALIZE_DATA(A3DGraphStyleData, sStyleData); sStyleData.m_bMaterial = false; sStyleData.m_bVPicture = false; sStyleData.m_dWidth = 0.1; // default sStyleData.m_bIsTransparencyDefined = true; sStyleData.m_ucTransparency = (A3DUns8)(dAlpha * 255.0); sStyleData.m_bSpecialCulling = false; sStyleData.m_bBackCulling = false; sStyleData.m_uiRgbColorIndex = uiColorIndex; CHECK_RET(A3DGlobalInsertGraphStyle(&sStyleData, &uiStyleIndex)); A3DGraphicsData sGraphicsDataRef; A3D_INITIALIZE_DATA(A3DGraphicsData, sGraphicsDataRef); A3DGraphicsGet(pOutRootBaseWithGraphics->m_pGraphics, &sGraphicsDataRef); A3DGraphicsData sGraphicsData; A3D_INITIALIZE_DATA(A3DGraphicsData, sGraphicsData); sGraphicsData.m_uiLayerIndex = sGraphicsDataRef.m_uiLayerIndex; sGraphicsData.m_uiStyleIndex = uiStyleIndex; sGraphicsData.m_usBehaviour = sGraphicsDataRef.m_usBehaviour; sGraphicsData.m_usBehaviour |= kA3DGraphicsSonHeritColor; sGraphicsData.m_usBehaviour |= kA3DGraphicsSonHeritLayer; sGraphicsData.m_usBehaviour |= kA3DGraphicsSonHeritLinePattern; sGraphicsData.m_usBehaviour |= kA3DGraphicsSonHeritLineWidth; sGraphicsData.m_usBehaviour |= kA3DGraphicsSonHeritTransparency; sGraphicsData.m_usBehaviour |= kA3DGraphicsSonHeritShow; A3DGraphicsGet(NULL, &sGraphicsDataRef); A3DGraphics * pGraphics = NULL; CHECK_RET(A3DGraphicsCreate(&sGraphicsData, &pGraphics)); pOutRootBaseWithGraphics->m_pGraphics = pGraphics; return iRet; } A3DStatus setEntityColor(A3DEntity* inEntity, A3DDouble dRed, A3DDouble dGreen, A3DDouble dBlue, A3DDouble dAlpha) { A3DStatus iRet = A3D_SUCCESS; A3DRootBaseWithGraphicsData sBaseWithGraphicsData; A3D_INITIALIZE_DATA(A3DRootBaseWithGraphicsData, sBaseWithGraphicsData); CHECK_RET(A3DRootBaseWithGraphicsGet(inEntity, &sBaseWithGraphicsData)); CHECK_RET(setGraphicsColor(&sBaseWithGraphicsData, dRed, dGreen, dBlue, dAlpha)); CHECK_RET(A3DRootBaseWithGraphicsSet(inEntity, &sBaseWithGraphicsData)); return iRet; } A3DStatus eraseColour(A3DEntity * pe) { A3DStatus iRet = A3D_SUCCESS; bool b = A3DEntityIsBaseWithGraphicsType(pe); A3DRootBaseWithGraphicsData rbwgData; A3D_INITIALIZE_DATA(A3DRootBaseWithGraphicsData, rbwgData); iRet = A3DRootBaseWithGraphicsGet(pe, &rbwgData); if (rbwgData.m_pGraphics != NULL) { A3DGraphicsData sGraphicsDataOriginal; A3D_INITIALIZE_DATA(A3DGraphicsData, sGraphicsDataOriginal); A3DGraphicsGet(rbwgData.m_pGraphics, &sGraphicsDataOriginal); A3DRootBaseWithGraphicsData fakeGraphics; A3D_INITIALIZE_DATA(A3DRootBaseWithGraphicsData, fakeGraphics); // this entity has an attached graphics object // let's remove this A3DGraphicsData sGraphicsData; A3D_INITIALIZE_DATA(A3DGraphicsData, sGraphicsData); sGraphicsData.m_uiStyleIndex = A3D_DEFAULT_STYLE_INDEX; sGraphicsData.m_usBehaviour = sGraphicsDataOriginal.m_usBehaviour; sGraphicsData.m_usBehaviour |= kA3DGraphicsSonHeritColor; CHECK_RET(A3DGraphicsCreate(&sGraphicsData, &(fakeGraphics.m_pGraphics))); A3DStatus iRet = A3DRootBaseWithGraphicsSet(pe, &fakeGraphics); setEntityColor(pe, 0.7, 0.7, 0.7, 1); } return iRet; } MyVisitorRemoveColours::~MyVisitorRemoveColours() { } A3DStatus MyVisitorRemoveColours::visitEnter(const A3DProductOccurrenceConnector& sConnector) { // Store the name of the product occurrence for later use m_PO = sConnector.GetA3DEntity(); A3DRootBaseData sData; A3D_INITIALIZE_DATA(A3DRootBaseData, sData); if (CALL_A3D_FCTION(A3DRootBaseGet, (sConnector.GetA3DEntity(), &sData)) == A3D_SUCCESS) { m_POName = sData.m_pcName; } eraseColour(sConnector.GetA3DEntity()); if (m_bColorPos) { rgb newColor = getNextColor(); setEntityColor(sConnector.GetA3DEntity(), newColor.r, newColor.g, newColor.b, 1); } return A3D_SUCCESS; } A3DStatus MyVisitorRemoveColours::visitLeave(const A3DProductOccurrenceConnector& sConnector) { A3DStatus iRet = A3D_SUCCESS; if (m_bColorFaces && m_topoRefs.size() != 0) { A3DAsmProductOccurrenceData poData; A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, poData); CHECK_RET(A3DAsmProductOccurrenceGet(m_PO, &poData)); poData.m_ppEntityReferences = new A3DMiscEntityReference*[m_topoRefs.size()]; poData.m_uiEntityReferenceSize = m_topoRefs.size(); for (int i = 0; i < poData.m_uiEntityReferenceSize; i++) { A3DMiscEntityReferenceData refData; A3D_INITIALIZE_DATA(A3DMiscEntityReferenceData, refData); refData.m_pEntity = m_topoRefs[i]; A3DMiscEntityReference * ref; CHECK_RET(A3DMiscEntityReferenceCreate(&refData, &ref)); poData.m_ppEntityReferences[i] = ref; rgb newColor = getNextColor(); setEntityColor(ref, newColor.r, newColor.g, newColor.b, 1); } CHECK_RET(A3DAsmProductOccurrenceEdit(&poData, m_PO)); CHECK_RET(A3DAsmProductOccurrenceGet(m_PO, &poData)); m_topoRefs.clear(); } return iRet; } A3DStatus MyVisitorRemoveColours::visitEnter(const A3DPartConnector& sConnector) { //eraseColour(sConnector.GetA3DEntity()); if (m_bColorParts) { rgb newColor = getNextColor(); setEntityColor(sConnector.GetA3DEntity(), newColor.r, newColor.g, newColor.b, 1); } return A3D_SUCCESS; } A3DStatus MyVisitorRemoveColours::visitEnter(const A3DBrepDataConnector& sConnector) { A3DStatus iRet = A3D_SUCCESS; // Here we try to set a Ref to override the color of the face A3DMiscReferenceOnTopologyData sReferenceOnTopoData; A3D_INITIALIZE_DATA(A3DMiscReferenceOnTopologyData, sReferenceOnTopoData); A3DUns32 indexes[1]; A3DUns32 nbFaces = 0; A3DTopoFace** ppFaces = NULL; A3DTopoBrepDataGetFaces(sConnector.GetA3DEntity(), &nbFaces, &ppFaces); for (int i = 0; i < nbFaces; i++) { indexes[0] = i; sReferenceOnTopoData.m_eTopoItemType = kA3DTypeTopoFace; // kA3DTypeTessFace / kA3DTypeTessEdge / kA3DTypeTessVertex; sReferenceOnTopoData.m_pBrepData = sConnector.GetA3DEntity(); sReferenceOnTopoData.m_uiSize = 1; sReferenceOnTopoData.m_puiAdditionalIndexes = indexes; A3DMiscReferenceOnTopology* pReferenceOnTopoItem; iRet = A3DMiscReferenceOnTopologyCreate(&sReferenceOnTopoData, &pReferenceOnTopoItem); m_topoRefs.push_back(pReferenceOnTopoItem); } return iRet; } A3DStatus MyVisitorRemoveColours::visitLeave(const A3DBrepDataConnector& sConnector) { return A3D_SUCCESS; } A3DStatus MyVisitorRemoveColours::visitEnter(const A3DFaceConnector& sConnector) { m_uiFaceCounter++; return A3D_SUCCESS; } A3DStatus MyVisitorRemoveColours::visitLeave(const A3DFaceConnector& sConnector) { m_uiFaceCounter--; return A3D_SUCCESS; } A3DStatus MyVisitorRemoveColours::visitEnter(const A3DTessDataConnector& sConnector) { //A3DStatus iRet = eraseColour(sConnector.GetA3DEntity()); unsigned uNbFaces = sConnector.FacesSize(); for (unsigned uFace = 0; uFace < uNbFaces; uFace++) { bool b = sConnector.GetTess3DData()->m_psFaceTessData[uFace].m_puiStyleIndexes != 0; if (b) { // We detected some colors in tessellation, not straighforward to remove currently. } } return A3D_SUCCESS; } A3DStatus MyVisitorRemoveColours::visitLeave(const A3DTessDataConnector& sConnector) { return A3D_SUCCESS; } A3DStatus MyVisitorRemoveColours::visitEnter(const A3DWireTessDataConnector& sConnector) { //A3DStatus iRet = eraseColour(sConnector.GetA3DEntity()); return A3D_SUCCESS; } A3DStatus MyVisitorRemoveColours::visitLeave(const A3DWireTessDataConnector& sConnector) { return A3D_SUCCESS; } A3DStatus MyVisitorRemoveColours::visitEnter(const A3DFaceTessDataConnector& sConnector) { if (m_bColorFaces) { //eraseColour(sConnector.GetTessDataConnector()->GetA3DEntity()); rgb newColor = getNextColor(); setEntityColor(sConnector.GetTessDataConnector()->GetA3DEntity(), newColor.r, newColor.g, newColor.b, 1); } return A3D_SUCCESS; } A3DStatus MyVisitorRemoveColours::visitLeave(const A3DFaceTessDataConnector& sConnector) { return A3D_SUCCESS; } A3DStatus MyVisitorRemoveColours::visitEnter(const A3DRiConnector& sConnector) { //eraseColour(sConnector.GetA3DEntity()); if (m_bColorRis) { eraseColour(sConnector.GetA3DEntity()); rgb newColor = getNextColor(); setEntityColor(sConnector.GetA3DEntity(), newColor.r, newColor.g, newColor.b, 1); } return A3D_SUCCESS; } A3DStatus MyVisitorRemoveColours::visitLeave(const A3DRiConnector& sConnector) { return A3D_SUCCESS; }