CGraphElement::CGraphElement() { m_LineColor = m_PointColor = RGB(255, 255, 255); m_nType = Solid; m_nLineWidth = 0 ; m_nSymbol = Nosym; m_bSolid = VARIANT_TRUE; m_nPointSize = 0 ; m_bShow = VARIANT_TRUE; // Added by A. Hofmann min = max = CElementPoint(0,0); InitializeCriticalSection(&m_CritSectionForPlot); }
CGraphElement::CGraphElement(int id/*=0*/) { bIsPlotAvailable = FALSE ; m_LineColor = m_PointColor = RGB(0,0,0); m_nType = Solid; m_nWidth = 0 ; m_nSymbol = Nosym; m_bSolid = TRUE; m_nSize = 0 ; m_bShow = TRUE; // Added by A. Hofmann const int TXT_LEN = 128; OLECHAR szText[ TXT_LEN ]; _snwprintf(szText, TXT_LEN, L"Element-%d",id); m_strName = szText; min = max = CElementPoint(0,0); }
STDMETHODIMP CGraphElement::Plot(VARIANT newXVals, VARIANT newYVals) { LONG lXBound, uXBound, lYBound, uYBound; SAFEARRAY* psaXVals, *psaYVals; HRESULT hr; //usually from VBScript the arrays are coming packed in by ref variants hr = GetArrayFromVariant(&newXVals, &psaXVals); if(FAILED(hr)) { return hr; } hr = GetArrayFromVariant(&newYVals, &psaYVals); if(FAILED(hr)) { return hr; } hr = SafeArrayGetLBound(psaXVals, 1, &lXBound); if(FAILED(hr)) { return hr; } hr = SafeArrayGetUBound(psaYVals, 1, &uXBound); if(FAILED(hr)) { return hr; } hr = SafeArrayGetLBound(psaXVals, 1, &lYBound); if(FAILED(hr)) { return hr; } hr = SafeArrayGetUBound(psaYVals, 1, &uYBound); if(FAILED(hr)) { return hr; } if(uXBound - lXBound != uYBound - lYBound) { return AtlReportError(GUID_NULL, L"Array with same size expected", IID_NULL, E_INVALIDARG); } int i, nCount; min = max = CElementPoint(0,0); nCount = m_PointList.GetSize(); EnterCriticalSection(&m_CritSectionForPlot); m_PointList.RemoveAll(); LeaveCriticalSection(&m_CritSectionForPlot); if(m_pCtrl && nCount) { m_pCtrl->OnPlotDeleted(); //current element does not have any points anymore } nCount = uXBound - lXBound + 1; VARTYPE typeX, typeY; SafeArrayGetVartype(psaXVals, &typeX); SafeArrayGetVartype(psaYVals, &typeY); for(i=0; i< nCount; i++) { double x ,y; hr = GetDoubleElement(typeX, psaXVals, i, &x); if(FAILED(hr)) { break; } hr = GetDoubleElement(typeY, psaYVals, i, &y); if(FAILED(hr)) { break; } CElementPoint point(x, y); m_PointList.Add(point); if(min.x > point.x) { min.x = point.x ; } if(min.y > point.y) { min.y = point.y ; } if(max.x < point.x) { max.x = point.x ; } if(max.y < point.y) { max.y = point.y ; } if(m_pCtrl) { m_pCtrl->UpdateAutoRange(x, y, i == 0); //TRUE only for first added point } } if(m_pCtrl) //redraw once for all added points { m_pCtrl->Refresh(FALSE); } return hr; }