// ************************************************************ // FindShapeAtScreenPoint // ************************************************************ LayerShape CMapView::FindShapeAtScreenPoint(CPoint point, LayerSelector selector) { double pixX = point.x; double pixY = point.y; double prjX, prjY; this->PixelToProj(pixX, pixY, &prjX, &prjY); std::vector<int> layers; if (SelectLayerHandles(selector, layers)) { return FindShapeAtProjPoint(prjX, prjY, layers); } return LayerShape(); }
// ************************************************************ // FindShapeCore // ************************************************************ LayerShape CMapView::FindShapeAtProjPoint(double prjX, double prjY, std::vector<int>& layers) { IShapefile * sf = NULL; for (int i = (int)layers.size() - 1; i >= 0; i--) { CComPtr<IShapefile> sf = NULL; sf.Attach(GetShapefile(layers[i])); if (sf) { double tol = 0.0; ShpfileType type = ShapefileHelper::GetShapeType2D(sf); if (type == SHP_MULTIPOINT || type == SHP_POINT || type == SHP_POLYLINE) tol = GetMouseTolerance(ToleranceSelect); SelectMode mode = type == SHP_POLYGON ? INCLUSION : INTERSECTION; long shapeIndex; if (SelectionHelper::SelectSingleShape(sf, Extent(prjX, prjY, tol), mode, shapeIndex)) { return LayerShape(layers[i], shapeIndex); } } } return LayerShape(); }
void CCLayerSorter::createGraphNodes(LayerList::iterator first, LayerList::iterator last) { #if !defined( NDEBUG ) LOG(CCLayerSorter, "Creating graph nodes:\n"); #endif float minZ = FLT_MAX; float maxZ = -FLT_MAX; for (LayerList::const_iterator it = first; it < last; it++) { m_nodes.append(GraphNode(it->get())); GraphNode& node = m_nodes.at(m_nodes.size() - 1); CCRenderSurface* renderSurface = node.layer->renderSurface(); if (!node.layer->drawsContent() && !renderSurface) continue; #if !defined( NDEBUG ) LOG(CCLayerSorter, "Layer %d (%d x %d)\n", node.layer->debugID(), node.layer->bounds().width(), node.layer->bounds().height()); #endif TransformationMatrix drawTransform; float layerWidth, layerHeight; if (renderSurface) { drawTransform = renderSurface->drawTransform(); layerWidth = 0.5 * renderSurface->contentRect().width(); layerHeight = 0.5 * renderSurface->contentRect().height(); } else { drawTransform = node.layer->drawTransform(); layerWidth = 0.5 * node.layer->bounds().width(); layerHeight = 0.5 * node.layer->bounds().height(); } FloatPoint3D c1 = drawTransform.mapPoint(FloatPoint3D(-layerWidth, layerHeight, 0)); FloatPoint3D c2 = drawTransform.mapPoint(FloatPoint3D(layerWidth, layerHeight, 0)); FloatPoint3D c3 = drawTransform.mapPoint(FloatPoint3D(layerWidth, -layerHeight, 0)); FloatPoint3D c4 = drawTransform.mapPoint(FloatPoint3D(-layerWidth, -layerHeight, 0)); node.shape = LayerShape(c1, c2, c3, c4); maxZ = max(c4.z(), max(c3.z(), max(c2.z(), max(maxZ, c1.z())))); minZ = min(c4.z(), min(c3.z(), min(c2.z(), min(minZ, c1.z())))); } if (last - first) m_zRange = fabsf(maxZ - minZ); }
void CCLayerSorter::createGraphNodes(LayerList::iterator first, LayerList::iterator last) { #if !defined( NDEBUG ) LOG(CCLayerSorter, "Creating graph nodes:\n"); #endif float minZ = FLT_MAX; float maxZ = -FLT_MAX; for (LayerList::const_iterator it = first; it < last; it++) { m_nodes.append(GraphNode(*it)); GraphNode& node = m_nodes.at(m_nodes.size() - 1); CCRenderSurface* renderSurface = node.layer->renderSurface(); if (!node.layer->drawsContent() && !renderSurface) continue; #if !defined( NDEBUG ) LOG(CCLayerSorter, "Layer %d (%d x %d)\n", node.layer->debugID(), node.layer->bounds().width(), node.layer->bounds().height()); #endif TransformationMatrix drawTransform; float layerWidth, layerHeight; if (renderSurface) { drawTransform = renderSurface->drawTransform(); layerWidth = renderSurface->contentRect().width(); layerHeight = renderSurface->contentRect().height(); } else { drawTransform = node.layer->drawTransform(); layerWidth = node.layer->bounds().width(); layerHeight = node.layer->bounds().height(); } node.shape = LayerShape(layerWidth, layerHeight, drawTransform); maxZ = max(maxZ, node.shape.transformOrigin.z()); minZ = min(minZ, node.shape.transformOrigin.z()); } m_zRange = fabsf(maxZ - minZ); }