bool wxGISDisplay::CanDraw(OGREnvelope &Env) { if(!IsDoubleEquil(m_dAngleRad, 0.0)) { RotateEnvelope(Env, -m_dAngleRad, m_dRotatedBoundsCenterX, m_dRotatedBoundsCenterY); } return Env.Contains(m_CurrentBoundsRotated) || m_CurrentBoundsRotated.Contains(Env) || Env.Intersects(m_CurrentBoundsRotated); }
bool wxGISDrawingLayer::Draw(wxGISEnumDrawPhase DrawPhase, ITrackCancel* const pTrackCancel) { wxCHECK_MSG(m_pDisplay, false, wxT("Display pointer is NULL")); wxCriticalSectionLocker lock(m_CritSect); OGREnvelope stDisplayExtentRotated = m_pDisplay->GetBounds(true); OGREnvelope stFeatureDatasetExtentRotated = m_oLayerExtent; //rotate featureclass extent if (!IsDoubleEquil(m_pDisplay->GetRotate(), 0.0)) { wxRealPoint dfCenter = m_pDisplay->GetBoundsCenter(); RotateEnvelope(stFeatureDatasetExtentRotated, m_pDisplay->GetRotate(), dfCenter.x, dfCenter.y);//dCenterX, dCenterY); } //if envelopes don't intersect exit if (!stDisplayExtentRotated.Intersects(stFeatureDatasetExtentRotated)) return false; //get intersect envelope to fill vector data OGREnvelope stDrawBounds = stDisplayExtentRotated; stDrawBounds.Intersect(stFeatureDatasetExtentRotated); if (!stDrawBounds.IsInit()) return false; IProgressor* pProgress = NULL; if (NULL != pTrackCancel) { pProgress = pTrackCancel->GetProgressor(); } if (NULL != pProgress) { pProgress->SetRange(m_aoShapes.size()); } //draw shapes for (size_t i = 0; i < m_aoShapes.size(); ++i) { if (NULL != pProgress) { pProgress->SetValue(i); } if (pTrackCancel != NULL && !pTrackCancel->Continue()) return true; if (m_aoShapes[i] != NULL) { m_aoShapes[i]->Draw(m_pDisplay); } } //draw enumGISShapeStateSelected //draw enumGISShapeStateRotated //draw enumGISShapeStatePoints return true; }