[mapguide-commits] r7738 - in branches/2.4/MgDev/Server/src: Services/Mapping UnitTesting
svn_mapguide at osgeo.org
svn_mapguide at osgeo.org
Mon Aug 5 10:02:10 PDT 2013
Author: jng
Date: 2013-08-05 10:02:09 -0700 (Mon, 05 Aug 2013)
New Revision: 7738
Modified:
branches/2.4/MgDev/Server/src/Services/Mapping/LegendPlotUtil.cpp
branches/2.4/MgDev/Server/src/Services/Mapping/icons.h
branches/2.4/MgDev/Server/src/UnitTesting/TestRenderingService.cpp
Log:
#2334: Backport to 2.4
Modified: branches/2.4/MgDev/Server/src/Services/Mapping/LegendPlotUtil.cpp
===================================================================
--- branches/2.4/MgDev/Server/src/Services/Mapping/LegendPlotUtil.cpp 2013-08-05 16:56:37 UTC (rev 7737)
+++ branches/2.4/MgDev/Server/src/Services/Mapping/LegendPlotUtil.cpp 2013-08-05 17:02:09 UTC (rev 7738)
@@ -79,8 +79,8 @@
const double legendSpacing = bitmapPixelHeight / bitmapDpi + 0.005;
const double defaultLegendMargin = 0.1; // inch
-const double legendFontHeightMeters = 0.002;
-const double legendTextVertAdjust = 0.07; // inch
+const double legendFontHeightMeters = 0.003;
+const double legendTextVertAdjust = 0.06; // inch
// Static helper method to draw a PNG icon. Calling Renderer::ProcessRaster
@@ -156,6 +156,9 @@
RS_LineStroke lineStroke;
dr.ProcessPolyline(&lb, lineStroke);
+ //Pad left at the top-level
+ legendOffsetX += (defaultLegendMargin * convertUnits);
+
//And then do the content.
BuildLegendContent(map, dMapScale, legendSpec, legendOffsetX, legendOffsetY, dr, convertUnits);
}
@@ -169,6 +172,10 @@
textDef.halign() = RS_HAlignment_Left;
textDef.valign() = RS_VAlignment_Base;
+ //for convenience compute legend bitmap size in plot units (inches, mm, pixels, whatever)
+ double dIconWidth = ((double)bitmapPixelWidth / bitmapDpi)*convertUnits;
+ double dIconHeight = ((double)bitmapPixelHeight / bitmapDpi)*convertUnits;
+
// Get the layer info
double x = legendOffsetX + legendSpec->GetMarginLeft();
double y = legendOffsetY + legendSpec->GetPaperHeight() - legendSpec->GetMarginTop() - legendFontHeightMeters*M_TO_IN*convertUnits;
@@ -179,57 +186,6 @@
// Add legend entries for layers that do not belong to a group
ProcessLayersForLegend(map, scale, NULL, x, y, textDef, dr, legendSpec, legendOffsetY, convertUnits);
-
- // do layer groups
- Ptr<MgLayerGroupCollection> mggroups = map->GetLayerGroups();
- Ptr<MgLayerCollection> layers = map->GetLayers();
-
- // iterate over groups and draw each group's layers
- for (int k = 0; k < mggroups->GetCount(); k++)
- {
- Ptr<MgLayerGroup> mggroup = mggroups->GetItem(k);
-
- // Count number of visible layers in this group.
- bool hasVisibleLayers = false;
- for (int l = 0; l < layers->GetCount(); l++)
- {
- Ptr<MgLayerBase> layer = layers->GetItem(l);
- Ptr<MgLayerGroup> layerGroup = layer->GetGroup();
- if ((layer->IsVisible()) && (layerGroup.p == mggroup.p))
- {
- hasVisibleLayers = true;
- break;
- }
- }
- if (!hasVisibleLayers)
- continue;
-
- if (mggroup == NULL)
- {
- throw new MgNullReferenceException(L"MgLegendPlotUtil.AddLegendElement", __LINE__, __WFILE__, NULL, L"", NULL);
- }
- Ptr<MgLayerGroup> mgparent = mggroup->GetGroup();
-
- double indent = 0;
- while (mgparent)
- {
- indent += MgPrintLayout::GroupIndent;
- mgparent = mgparent->GetGroup();
- }
-
- x = legendOffsetX + (defaultLegendMargin + indent)*convertUnits;
-
- RS_LabelInfo info(x, y + legendTextVertAdjust*convertUnits, textDef);
- dr.ProcessLabelGroup(&info, 1, mggroup->GetLegendLabel(), RS_OverpostType_All, false, NULL, 0.0);
-
- y -= legendSpacing*convertUnits;
-
- if (y < legendSpec->GetMarginBottom())
- break;
-
- // Process the layers
- ProcessLayersForLegend(map, scale, mggroup, x, y, textDef, dr, legendSpec, legendOffsetY, convertUnits);
- }
}
@@ -254,6 +210,28 @@
//bottom of the legend -- where we stop drawing
double bottomLimit = legendOffsetY + legendSpec->GetMarginBottom();
+ if (NULL != mggroup)
+ {
+ x = startX - initialMarginX;
+ // use group icon
+ RS_Bounds b2(x, y, x + dIconWidth, y + dIconHeight);
+ DrawPNG(&dr, (unsigned char*)LAYER_GROUP_ICON, sizeof(LAYER_GROUP_ICON), bitmapPixelWidth, bitmapPixelHeight, b2);
+
+ // Add the group legend label.
+ RS_LabelInfo info(x + dIconWidth + (defaultLegendMargin * convertUnits), y + legendTextVertAdjust*convertUnits, textDef);
+ dr.ProcessLabelGroup(&info, 1, mggroup->GetLegendLabel(), RS_OverpostType_All, false, NULL, 0.0);
+
+ // Indent for children
+ x += initialMarginX;
+
+ //move y cursor down one line
+ y -= verticalDelta;
+
+ if (y < bottomLimit)
+ {
+ return;
+ }
+ }
// build the list of layers that need to be processed
Ptr<MgLayerCollection> layers = map->GetLayers();
for (int i = 0; i < layers->GetCount(); i++)
@@ -410,6 +388,25 @@
break;
}
}
+
+ //Process child groups of this legend
+ Ptr<MgLayerGroupCollection> groups = map->GetLayerGroups();
+ for (int i = 0; i < groups->GetCount(); i++)
+ {
+ Ptr<MgLayerGroup> group = groups->GetItem(i);
+ if (!group->GetDisplayInLegend())
+ continue;
+
+ Ptr<MgLayerGroup> groupParent = group->GetGroup();
+ if (groupParent.p == mggroup)
+ {
+ ProcessLayersForLegend(map, mapScale, group, startX + initialMarginX, y, textDef, dr, legendSpec, legendOffsetY, convertUnits);
+ if (y < bottomLimit)
+ {
+ break;
+ }
+ }
+ }
}
Modified: branches/2.4/MgDev/Server/src/Services/Mapping/icons.h
===================================================================
--- branches/2.4/MgDev/Server/src/Services/Mapping/icons.h 2013-08-05 16:56:37 UTC (rev 7737)
+++ branches/2.4/MgDev/Server/src/Services/Mapping/icons.h 2013-08-05 17:02:09 UTC (rev 7738)
@@ -125,4 +125,26 @@
0x82
};
+//lc_group.png
+const unsigned char LAYER_GROUP_ICON[] = {
+0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
+0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x08,0x06,0x00,0x00,0x00,0x1f,0xf3,0xff,
+0x61,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,
+0x00,0x04,0x67,0x41,0x4d,0x41,0x00,0x00,0xb1,0x8f,0x0b,0xfc,0x61,0x05,0x00,0x00,
+0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0e,0xc3,0x00,0x00,0x0e,0xc3,0x01,0xc7,
+0x6f,0xa8,0x64,0x00,0x00,0x00,0x1a,0x74,0x45,0x58,0x74,0x53,0x6f,0x66,0x74,0x77,
+0x61,0x72,0x65,0x00,0x50,0x61,0x69,0x6e,0x74,0x2e,0x4e,0x45,0x54,0x20,0x76,0x33,
+0x2e,0x35,0x2e,0x31,0x30,0x30,0xf4,0x72,0xa1,0x00,0x00,0x00,0x84,0x49,0x44,0x41,
+0x54,0x38,0x4f,0x63,0xf8,0xff,0xff,0x3f,0x45,0x18,0xab,0x20,0x29,0x18,0x4c,0x1c,
+0x5c,0xd3,0xf2,0xbf,0x39,0x92,0x13,0x03,0x83,0xc4,0x91,0x15,0x63,0xc3,0x60,0x02,
+0xa4,0xf8,0xff,0xdb,0x5e,0x0c,0x8c,0x6e,0x20,0x32,0x86,0x19,0x8e,0x6a,0xc0,0x75,
+0x4b,0x54,0xfc,0xa6,0x03,0xc3,0x50,0x10,0xbe,0xb4,0x25,0xe2,0x7f,0xa2,0x21,0x0b,
+0x61,0x03,0x90,0x6d,0xc4,0x86,0x31,0x0c,0xc0,0x50,0x80,0x66,0x20,0x0c,0x5f,0xde,
+0x62,0x89,0xdd,0x05,0xe8,0x9a,0x40,0x0a,0xb1,0xe1,0x1d,0xb3,0x35,0xf0,0x1b,0x80,
+0x4d,0x13,0x32,0x1e,0xee,0x06,0xc0,0x14,0x10,0xc2,0x28,0x06,0x80,0x52,0x15,0x48,
+0x80,0x14,0xbc,0x61,0x46,0x23,0xc2,0x00,0x4a,0x30,0x56,0x41,0xe2,0xf1,0x7f,0x06,
+0x00,0x36,0x20,0xae,0xaf,0x57,0x56,0xf5,0x08,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,
+0x44,0xae,0x42,0x60,0x82
+};
+
#endif
Modified: branches/2.4/MgDev/Server/src/UnitTesting/TestRenderingService.cpp
===================================================================
--- branches/2.4/MgDev/Server/src/UnitTesting/TestRenderingService.cpp 2013-08-05 16:56:37 UTC (rev 7737)
+++ branches/2.4/MgDev/Server/src/UnitTesting/TestRenderingService.cpp 2013-08-05 17:02:09 UTC (rev 7738)
@@ -590,20 +590,44 @@
Ptr<MgLayerGroupCollection> layerGroups = map->GetLayerGroups();
Ptr<MgLayerCollection> layers = map->GetLayers();
- Ptr<MgResourceIdentifier> resId = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
+ Ptr<MgResourceIdentifier> resId = new MgResourceIdentifier(L"Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
+ Ptr<MgResourceIdentifier> ldfRail = new MgResourceIdentifier(L"Library://UnitTests/Layers/Rail.LayerDefinition");
- Ptr<MgLayerGroup> group = new MgLayerGroup(L"Can't see me");
- group->SetLegendLabel(L"Can't see me");
+ Ptr<MgLayerGroup> group = new MgLayerGroup(L"Test Group");
+ group->SetLegendLabel(L"Test Group");
group->SetDisplayInLegend(true);
layerGroups->Add(group);
+ Ptr<MgLayerGroup> group1 = new MgLayerGroup(L"Nest top level");
+ group1->SetLegendLabel(L"Nest top level");
+ group1->SetDisplayInLegend(true);
+ layerGroups->Add(group1);
+
+ Ptr<MgLayerGroup> group2 = new MgLayerGroup(L"Nest child");
+ group2->SetLegendLabel(L"Nest child (Nest top level)");
+ group2->SetDisplayInLegend(true);
+ group2->SetGroup(group1);
+ layerGroups->Add(group2);
+
+ Ptr<MgLayerGroup> group3 = new MgLayerGroup(L"Not visible in legend");
+ group3->SetLegendLabel(L"Not visible in legend");
+ group3->SetDisplayInLegend(false);
+ layerGroups->Add(group3);
+
Ptr<MgLayer> layer = new MgLayer(resId, m_svcResource);
- layer->SetName(L"MyParcels");
- layer->SetLegendLabel(L"Parcels");
+ layer->SetName(L"HydroPolygons");
+ layer->SetLegendLabel(L"HydroPolygons (Test Group)");
layer->SetGroup(group);
layer->SetDisplayInLegend(true);
+ Ptr<MgLayer> layer2 = new MgLayer(ldfRail, m_svcResource);
+ layer2->SetName(L"RailUnderNestedGroup");
+ layer2->SetLegendLabel(L"Rail (Nest Child)");
+ layer2->SetGroup(group2);
+ layer2->SetDisplayInLegend(true);
+
layers->Add(layer);
+ layers->Add(layer2);
//Re-draw at 75k. Layer group should not be there because it has no visible layers
map->SetViewScale(75000.0);
More information about the mapguide-commits
mailing list