[GRASS-SVN] r32132 - in grass/trunk/gui/wxpython: gui_modules vdigit
svn_grass at osgeo.org
svn_grass at osgeo.org
Wed Jul 16 10:50:30 EDT 2008
Author: martinl
Date: 2008-07-16 10:50:30 -0400 (Wed, 16 Jul 2008)
New Revision: 32132
Modified:
grass/trunk/gui/wxpython/gui_modules/vdigit.py
grass/trunk/gui/wxpython/vdigit/driver.cpp
grass/trunk/gui/wxpython/vdigit/driver.h
Log:
wxGUI/vdigit: fill valid areas (closed boundary + centroid)
Modified: grass/trunk/gui/wxpython/gui_modules/vdigit.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/vdigit.py 2008-07-16 12:38:34 UTC (rev 32131)
+++ grass/trunk/gui/wxpython/gui_modules/vdigit.py 2008-07-16 14:50:30 UTC (rev 32132)
@@ -1563,6 +1563,11 @@
UserSettings.Get(group='vdigit', key='symbolVertex', subkey='color')[1],
UserSettings.Get(group='vdigit', key='symbolVertex', subkey='color')[2],
255).GetRGB(),
+ UserSettings.Get(group='vdigit', key='symbolArea', subkey='enabled'),
+ wx.Color(UserSettings.Get(group='vdigit', key='symbolArea', subkey='color')[0],
+ UserSettings.Get(group='vdigit', key='symbolArea', subkey='color')[1],
+ UserSettings.Get(group='vdigit', key='symbolArea', subkey='color')[2],
+ 255).GetRGB(),
UserSettings.Get(group='vdigit', key='symbolDirection', subkey='enabled'),
wx.Color(UserSettings.Get(group='vdigit', key='symbolDirection', subkey='color')[0],
UserSettings.Get(group='vdigit', key='symbolDirection', subkey='color')[1],
@@ -1975,6 +1980,7 @@
(_("Node (one line)"), "symbolNodeOne"),
(_("Node (two lines)"), "symbolNodeTwo"),
(_("Vertex"), "symbolVertex"),
+ (_("Area (closed boundary + centroid)"), "symbolArea"),
(_("Direction"), "symbolDirection"),)
def OnChangeCategoryMode(self, event):
Modified: grass/trunk/gui/wxpython/vdigit/driver.cpp
===================================================================
--- grass/trunk/gui/wxpython/vdigit/driver.cpp 2008-07-16 12:38:34 UTC (rev 32131)
+++ grass/trunk/gui/wxpython/vdigit/driver.cpp 2008-07-16 14:50:30 UTC (rev 32132)
@@ -119,6 +119,34 @@
region.box.W, region.box.E, region.box.S, region.box.N);
dc->BeginDrawing();
+
+ if (settings.area.enabled) {
+ /* draw area fills first */
+ int area;
+ struct ilist *listAreas, *listCentroids;
+ BOUND_BOX areaBox;
+
+ listAreas = Vect_new_list();
+ listCentroids = Vect_new_list();
+
+ Vect_select_areas_by_box(mapInfo, &(region.box),
+ listAreas);
+
+ for (int i = 0; i < listAreas->n_values; i++) {
+ area = listAreas->value[i];
+ /* check for other centroids -- only area with one centroid is valid */
+ Vect_get_area_box(mapInfo, area, &areaBox);
+
+ if(Vect_select_lines_by_box(mapInfo, &areaBox,
+ GV_CENTROID, listCentroids) == 1) {
+ DrawArea(area);
+ }
+ }
+
+ Vect_destroy_list(listAreas);
+ Vect_destroy_list(listCentroids);
+ }
+
for (int i = 0; i < listLines->n_values; i++) {
DrawLine(listLines->value[i]);
}
@@ -132,27 +160,67 @@
}
/**
+ \brief Draw area fill
+
+ \param area area id
+
+ \return 1 on success
+ \return -1 on failure (vector object is dead, etc.)
+*/
+int DisplayDriver::DrawArea(int area)
+{
+ double x, y, z;
+ struct line_pnts *points;
+
+ if (!dc || !Vect_area_alive (mapInfo, area))
+ return -1;
+
+ points = Vect_new_line_struct();
+
+ // get boundary points
+ Vect_get_area_points(mapInfo, area, points);
+
+ // convert EN -> xy
+ wxPoint wxPoints[points->n_points];
+
+ for (int i = 0; i < points->n_points; i++) {
+ Cell2Pixel(points->x[i], points->y[i], points->z[i],
+ &x, &y, &z);
+ wxPoints[i] = wxPoint((int) x, (int) y);
+ }
+
+ // draw polygon
+ dc->SetBrush(wxBrush(settings.area.color));
+ dc->SetPen(wxPen(settings.area.color));
+ dc->DrawPolygon(points->n_points, wxPoints);
+
+ Vect_destroy_line_struct(points);
+
+ return 1;
+}
+
+/**
\brief Draw selected vector objects to the device
\param[in] line id
+
\return 1 on success
\return -1 on failure (vector object is dead, etc.)
*/
int DisplayDriver::DrawLine(int line)
{
- if (!dc || !Vect_line_alive (mapInfo, line))
- return -1;
-
- int dcId; // 0 | 1 | segment id
- int type; // line type
+ int dcId; // 0 | 1 | segment id
+ int type; // line type
double x, y, z; // screen coordinates
- bool draw; // draw object ?
-
+ bool draw; // draw object ?
wxPen *pen;
-
+
pen = NULL;
draw = false;
+ if (!dc || !Vect_line_alive (mapInfo, line))
+ return -1;
+
// read line
type = Vect_read_line (mapInfo, points, cats, line);
@@ -260,19 +328,19 @@
if (dcId > 0 && drawSegments) {
dcId = 2; // first segment
for (size_t i = 0; i < pointsScreen->GetCount() - 1; dcId += 2) {
- wxPoint *point_beg = (wxPoint *) pointsScreen->Item(i)->GetData();
- wxPoint *point_end = (wxPoint *) pointsScreen->Item(++i)->GetData();
-
- // set bounds for line
- // wxRect rect (*point_beg, *point_end);
- // dc->SetIdBounds(startId, rect);
-
- dc->SetId(dcId); // set unique id & set bbox for each segment
- dc->SetPen(*pen);
- wxRect rect (*point_beg, *point_end);
- dc->SetIdBounds(dcId, rect);
- dc->DrawLine(point_beg->x, point_beg->y,
- point_end->x, point_end->y);
+ wxPoint *point_beg = (wxPoint *) pointsScreen->Item(i)->GetData();
+ wxPoint *point_end = (wxPoint *) pointsScreen->Item(++i)->GetData();
+
+ // set bounds for line
+ // wxRect rect (*point_beg, *point_end);
+ // dc->SetIdBounds(startId, rect);
+
+ dc->SetId(dcId); // set unique id & set bbox for each segment
+ dc->SetPen(*pen);
+ wxRect rect (*point_beg, *point_end);
+ dc->SetIdBounds(dcId, rect);
+ dc->DrawLine(point_beg->x, point_beg->y,
+ point_end->x, point_end->y);
}
}
else {
@@ -281,6 +349,7 @@
wxPoint *point_beg = (wxPoint *) pointsScreen->Item(i)->GetData();
wxPoints[i] = *point_beg;
}
+
dc->DrawLines(pointsScreen->GetCount(), wxPoints);
if (!IsSelected(line) && settings.direction.enabled) {
@@ -687,6 +756,7 @@
bool eNodeOne, unsigned long cNodeOne,
bool eNodeTwo, unsigned long cNodeTwo,
bool eVertex, unsigned long cVertex,
+ bool eArea, unsigned long cArea,
bool eDirection, unsigned long cDirection,
int lineWidth)
{
@@ -724,6 +794,9 @@
settings.vertex.enabled = eVertex;
settings.vertex.color.Set(cVertex);
+ settings.area.enabled = eArea;
+ settings.area.color.Set(cArea);
+
settings.direction.enabled = eDirection;
settings.direction.color.Set(cDirection);
Modified: grass/trunk/gui/wxpython/vdigit/driver.h
===================================================================
--- grass/trunk/gui/wxpython/vdigit/driver.h 2008-07-16 12:38:34 UTC (rev 32131)
+++ grass/trunk/gui/wxpython/vdigit/driver.h 2008-07-16 14:50:30 UTC (rev 32132)
@@ -107,6 +107,8 @@
symbol vertex;
+ symbol area;
+
symbol direction;
int lineWidth; // screen units
@@ -145,6 +147,8 @@
int DrawLineNodes(int);
int DrawDirectionArrow();
+ int DrawArea(int);
+
/* debug */
void PrintIds();
@@ -207,6 +211,7 @@
bool, unsigned long,
bool, unsigned long,
bool, unsigned long,
+ bool, unsigned long,
int);
};
More information about the grass-commit
mailing list