diff --git a/src/qgisapp.cpp b/src/qgisapp.cpp index 64b3b9f0297..28d92e437c5 100644 --- a/src/qgisapp.cpp +++ b/src/qgisapp.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -40,7 +41,7 @@ #include "xpm/qgis.xpm" QgisApp::QgisApp (QWidget * parent, const char *name, WFlags fl): -QgisAppBase (parent, name, fl) + QgisAppBase (parent, name, fl) { QPixmap icon; icon = QPixmap (qgis_xpm); @@ -102,6 +103,7 @@ QgisApp::addLayer () } qApp->processEvents(); mapCanvas->render2(); + statusBar()->message(mapCanvas->extent().stringRep()); } @@ -117,9 +119,16 @@ void QgisApp::zoomIn () { /* QWMatrix m = mapCanvas->worldMatrix(); - m.scale( 2.0, 2.0 ); - mapCanvas->setWorldMatrix( m ); - */ + m.scale( 2.0, 2.0 ); + mapCanvas->setWorldMatrix( m ); + */ + // scale the extent + QgsRect ext = mapCanvas->extent(); + ext.scale(0.5); + mapCanvas->setExtent(ext); + statusBar()->message(ext.stringRep()); + mapCanvas->clear(); + mapCanvas->render2(); } @@ -127,115 +136,119 @@ void QgisApp::zoomOut () { /* QWMatrix m = mapCanvas->worldMatrix(); - m.scale( 0.5, 0.5 ); - mapCanvas->setWorldMatrix( m ); - */ + m.scale( 0.5, 0.5 ); + mapCanvas->setWorldMatrix( m ); + */ +} +void QgisApp::zoomFull(){ + mapCanvas->zoomFullExtent(); } void QgisApp::readWKB (const char *connInfo, QStringList tables) { - PgCursor pgc (connInfo, "testcursor"); - // get "endianness" - char *chkEndian = new char[4]; - memset (chkEndian, '\0', 4); - chkEndian[0] = 0xE8; - int *ce = (int *) chkEndian; - bool isNDR = (232 == *ce); - /* if(*ce != 232) - cout << "Big endian" << endl; - else - cout << "Little endian" << endl; - */ - QStringList::Iterator it = tables.begin (); - while (it != tables.end ()) - { +// PgCursor pgc (connInfo, "testcursor"); +// // get "endianness" +// char *chkEndian = new char[4]; +// memset (chkEndian, '\0', 4); +// chkEndian[0] = 0xE8; +// int *ce = (int *) chkEndian; +// bool isNDR = (232 == *ce); +// /* if(*ce != 232) +// cout << "Big endian" << endl; +// else +// cout << "Little endian" << endl; +// */ +// QStringList::Iterator it = tables.begin (); +// while (it != tables.end ()) +// { - // get the extent of the layer - QString esql = "select extent(the_geom) from " + *it; - PgDatabase *pd = new PgDatabase (connInfo); - int result = pd->ExecTuplesOk ((const char *) esql); - QString extent = pd->GetValue (0, 0); - // parse out the x and y values - extent = extent.right (extent.length () - extent.find ("BOX3D(") - 6); - QStringList coordPairs = QStringList::split (",", extent); - QStringList x1y1 = QStringList::split (" ", coordPairs[0]); - QStringList x2y2 = QStringList::split (" ", coordPairs[1]); - double x1 = x1y1[0].toDouble (); - double y1 = x1y1[1].toDouble (); - double x2 = x2y2[0].toDouble (); - double y2 = x2y2[1].toDouble (); - double xMu = x2 - x1; - double yMu = y2 - y1; - int subordinantAxisLength; +// // get the extent of the layer +// QString esql = "select extent(the_geom) from " + *it; +// PgDatabase *pd = new PgDatabase (connInfo); +// int result = pd->ExecTuplesOk ((const char *) esql); +// QString extent = pd->GetValue (0, 0); +// // parse out the x and y values +// extent = extent.right (extent.length () - extent.find ("BOX3D(") - 6); +// QStringList coordPairs = QStringList::split (",", extent); +// QStringList x1y1 = QStringList::split (" ", coordPairs[0]); +// QStringList x2y2 = QStringList::split (" ", coordPairs[1]); +// double x1 = x1y1[0].toDouble (); +// double y1 = x1y1[1].toDouble (); +// double x2 = x2y2[0].toDouble (); +// double y2 = x2y2[1].toDouble (); +// double xMu = x2 - x1; +// double yMu = y2 - y1; +// int subordinantAxisLength; - // determine the dominate direction for the mapcanvas - if (mapCanvas->width () > mapCanvas->height ()) - { - subordinantAxisLength = mapCanvas->height (); - scaleFactor = yMu / subordinantAxisLength; - mapWindow = new QRect (x1, y1, xMu, xMu); - } - else - { - subordinantAxisLength = mapCanvas->width (); - scaleFactor = xMu / subordinantAxisLength; - mapWindow = new QRect (x1, y1, yMu, yMu); - } +// // determine the dominate direction for the mapcanvas +// if (mapCanvas->width () > mapCanvas->height ()) +// { +// subordinantAxisLength = mapCanvas->height (); +// scaleFactor = yMu / subordinantAxisLength; +// mapWindow = new QRect (x1, y1, xMu, xMu); +// } +// else +// { +// subordinantAxisLength = mapCanvas->width (); +// scaleFactor = xMu / subordinantAxisLength; +// mapWindow = new QRect (x1, y1, yMu, yMu); +// } - const char *xtent = (const char *) extent; - string sql = "select asbinary(the_geom,"; - if (isNDR) - sql += "'NDR'"; - else - sql += "'XDR'"; - sql += ") as features from "; - sql += *it++; - cout << sql.c_str () << endl; - pgc.Declare (sql.c_str (), true); - int res = pgc.Fetch (); - cout << "Number of binary records: " << pgc.Tuples () << endl; - bool setExtent = true; - // process each record - QPainter paint; +// const char *xtent = (const char *) extent; +// string sql = "select asbinary(the_geom,"; +// if (isNDR) +// sql += "'NDR'"; +// else +// sql += "'XDR'"; +// sql += ") as features from "; +// sql += *it++; +// cout << sql.c_str () << endl; +// pgc.Declare (sql.c_str (), true); +// int res = pgc.Fetch (); +// cout << "Number of binary records: " << pgc.Tuples () << endl; +// bool setExtent = true; +// // process each record +// QPainter paint; - paint.begin (mapCanvas); - paint.setWindow (*mapWindow); - QRect v = paint.viewport (); - int d = QMIN (v.width (), v.height ()); - paint.setViewport (v.left () + (v.width () - d) / 2, - v.top () + (v.height () - d) / 2, d, d); +// paint.begin (mapCanvas); +// paint.setWindow (*mapWindow); +// QRect v = paint.viewport (); +// int d = QMIN (v.width (), v.height ()); +// paint.setViewport (v.left () + (v.width () - d) / 2, +// v.top () + (v.height () - d) / 2, d, d); - paint.setPen (Qt::red); +// paint.setPen (Qt::red); - for (int idx = 0; idx < pgc.Tuples (); idx++) - { - cout << "Size of this record: " << pgc.GetLength (idx, 0) << endl; - // allocate memory for the item - char *feature = new char[pgc.GetLength (idx, 0) + 1]; - memset (feature, '\0', pgc.GetLength (idx, 0) + 1); - memcpy (feature, pgc.GetValue (idx, 0), pgc.GetLength (idx, 0)); +// for (int idx = 0; idx < pgc.Tuples (); idx++) +// { +// cout << "Size of this record: " << pgc.GetLength (idx, 0) << endl; +// // allocate memory for the item +// char *feature = new char[pgc.GetLength (idx, 0) + 1]; +// memset (feature, '\0', pgc.GetLength (idx, 0) + 1); +// memcpy (feature, pgc.GetValue (idx, 0), pgc.GetLength (idx, 0)); - cout << "Endian is: " << (int) feature[0] << endl; - cout << "Geometry type is: " << (int) feature[1] << endl; - // print the x,y coordinates - double *x = (double *) (feature + 5); - double *y = (double *) (feature + 5 + sizeof (double)); - cout << "x,y: " << setprecision (16) << *x << ", " << *y << endl; - QPoint pt = paint.xForm (QPoint ((int) *x, (int) *y)); - cout << "Plotting " << *x << ", " << *y << " at " << pt. - x () << ", " << pt.y () << endl; - paint.drawRect ((int) *x, mapWindow->bottom () - (int) *y, 15000, - 15000); - // free it - delete[]feature; - } - paint.end (); - } +// cout << "Endian is: " << (int) feature[0] << endl; +// cout << "Geometry type is: " << (int) feature[1] << endl; +// // print the x,y coordinates +// double *x = (double *) (feature + 5); +// double *y = (double *) (feature + 5 + sizeof (double)); +// cout << "x,y: " << setprecision (16) << *x << ", " << *y << endl; +// QPoint pt = paint.xForm (QPoint ((int) *x, (int) *y)); +// cout << "Plotting " << *x << ", " << *y << " at " << pt. +// x () << ", " << pt.y () << endl; +// paint.drawRect ((int) *x, mapWindow->bottom () - (int) *y, 15000, +// 15000); +// // free it +// delete[]feature; +// } +// paint.end (); +// } + } @@ -243,13 +256,13 @@ void QgisApp::drawPoint (double x, double y) { QPainter paint; - QWMatrix mat (scaleFactor, 0, 0, scaleFactor, 0, 0); + // QWMatrix mat (scaleFactor, 0, 0, scaleFactor, 0, 0); paint.begin (mapCanvas); // paint.setWorldMatrix(mat); paint.setWindow (*mapWindow); paint.setPen (Qt::blue); - paint.drawPoint (x, y); + paint.drawPoint ((int)x, (int)y); paint.end (); } diff --git a/src/qgisapp.h b/src/qgisapp.h index 6422b3b5f54..a08766df198 100644 --- a/src/qgisapp.h +++ b/src/qgisapp.h @@ -41,6 +41,8 @@ public: void zoomOut(); //! Zoom int void zoomIn(); + //! Zoom to full extent + void zoomFull(); //! Read Well Known Binary stream from PostGIS void readWKB(const char *, QStringList tables); //! Draw a point on the map canvas diff --git a/src/qgisappbase.ui b/src/qgisappbase.ui index 06127a7cac9..4552ae000d8 100644 --- a/src/qgisappbase.ui +++ b/src/qgisappbase.ui @@ -86,6 +86,7 @@ + @@ -185,6 +186,17 @@ Refresh + + + actionZoomFullExtent + + + image6 + + + Zoom to full extent + + @@ -205,6 +217,9 @@ 789c759649531c490c85effc8a0e74734cc85595595b4cccc1066f98d52bf6c41cb23668f6a5b10d13f3df27f55e81a11bfae1083ea4cc94944ab59f3f9bec6e6f4c9e3d5fba9c85d9b49db4fbe162f2acbb3a3ebefefb9fbffe5d5aceb249fc49bd9b64cb7f2c2defcc26ed64f3f4a437d03a8224f818cb17706a02ef809d095c824b9371507065827d1b1c4cb00bb831810fc09d09e7af1ac7c32a9eaf3fc169e6931cfe87e0cc04fbaf918bd17f00fbd48ff1d7b79c7ad8b7c959cdf8f466e486f1c9393837c1be0b2eeef6afc82e4d5af823dfb434c1fe96ecb2d13e05d726d8bf92b396f94b060e26d87bb273633d184fe3fa6440fe01dc9a606fc86e48195f4bf629391c833b13ec7b645fa4b83f3d03f7be66fc81e70f26d8af8daddc4901fbd12d67e807edc8ae19eb2be43ce17e82fbccf0813d90f334657f7c067b13f83b38378107729170bda0be5965c27e3b643fd6575e816b13ecebe4a2cd18cf7b7030c1fe8e5c0c19ee43f7c9f10291bf6c815b13ecdfc8e5e0b87f49ae52c7fe9981bb2a73bcdf0d706f02339ec184f53fc89573ec97cb911bcffe3d1879f0a8bf7e24872467bf7d3076499e64bc7fe4e7d2ca3b9ed792eb3e67fdf19e5d2c98637e811c8a9cf95d8c5ce5ec97376017f3657e87e4c615bc2ff49ff38d1f79059c9bc0e8075714dd98af0797550c0076bc6f5799c0e82717eaccb31e29b8318191bf6b4dd80ffdedba581fda0b639f98c017e4d28ffbe33d631cb07f4fc965e2585f47ae0bd64bf0ded19ee41cec4c60bc1f9f9bc0a8572c4631ded716b94e3df3bf223745c9f8d06fbe34c17e422e3bc6af2fc9d19ff317f3ce5726bc47bc8f58fe66cc1ff3ccb726f06b7067823fea9b2726ecbf42ae72cffbfd04c600841def33cf9baea41dfd9f9726ec87f996f726f8e3bcc2b5b1c3c09b23bb8af5c17c297cb4f37cac8fcd37facb1ab83281d12f4530818fc86d31faa35e456702e33d15bd098cfa158309e765e4180fee47101fc637eb8bf784f4f87d83fe2e6b13d6e3fecbae6d2ace63ccd32a3581f1de309ef8de8ec86d57737ff41bae8ff1e3fba0aa4d60ccdbaa3381319feac604c679f83a65ff246067c2796be42e04e41fd05f2137c11ffd1d0613fc316f9ba44f1b7edfbd00677dd2b0fee4dc04c67b6b2a13fc67e43e6b78ff980f4dddfb86f303fdd4f47dde327ff43f9e2fe3c5bc6e9bbe6e397ff17edbbe6f5bee87f7dff921363018f3303ef7a4e3fb42fedd30b88ee761dec62fcb5bc63c1df031de993d948a066db4d54e7b1d1edae6fd754ff775aa077aa8477aac277aaa677afe947ff4bed04b9de995fe88bfffd45f7aad435c71f384ff7ef47ea12f75257add45127fbfd1d545ffb8e3545fe96b7da36f1772bae1fa07feefe2ee6bfa7e3ec7db5316fcd7754337754bb71ff3ff1d4f8cef5c77f4837ed44ffa59bfe857ddbd1fff23fedff4bb269a6aa64ebde65a68a9d5786a2d3a5f4f1d44244823ad74d26b2977bb47ef3dd997e97c3db1e2400ee568cefb584ee454cee47cbe9e71c5855ccaec81f795fc909ff24baee586673ca88f9d71dffb85bc9415599557f23aae786367ccddef9db7bc9577b216e33893f7b22e1bd17b53b664fbb1fee4ee71ff9df8ef837c944ff259bed85fb47ecaff2ea6afb22bdfe4fb427dea27fc1349e3fed9a2ffe28ae8edc44b2e8594f3fe5cf17b0de277b1f255ace6bd9deec71f5456838460bea189ff01684317ba5895f2717fdb35f461101ff6c27e984a15fd0f1ec6b9581fd90e87328deb8ec2f1624ecbfffdb9f43f0b1c269c + + 789c8d96db521c390c86ef798a297497da52667abadbeddada8b104242c2100810205b7ba1b6bb399f860142b6f6dd57fe6526a9307b981f427d23d9966559cecb178383adc9e0c5cba5db99cc4ec2201ccb74f022de5d5c3cfefec76f7f2e2d17c5407f46d578502cffb2b4bc3d1b84c1e6d5659780260a34c427b13c80db24d84fc02129315f261ec524d8d364548c9360ff04f62ac17cb789c7a324f01d38b9c35fcec1b5ca81cfc04ed580afc05e85f9e89b71537a9bef1a2ce3be44fc2ce05665f1067050215e41bce3a8b2fddf1837ded7f06fc19daa07c7c4e55085f56825735d225eda058f942d5ec9ec3213b8283560f83f1afb46309eb19f729c04fbe99c4bf091b1f782f9f83d181ff0f59c2bf867bbafc538dbbd88ad6ff15449188ffc6ab42eefe735b84902bf32f69d58fe7ab04fc2f8a339db7977604982ddc60795d5cb57e3d605abaf0a1c55761e164f6c2580c5f2df27c1fe21713594716bf13799ebd6f6b70e2ec4b596cf637029c1ec8cf8aa4665fe35d827c14e73b67afb0c6e93c0bd713b0a96ff1d704882fd63e668cce61f55b6bf7789eba196a7c55f808b24d84bf0b8f205ea99a6c66d65eb09f25d3749b03f18b73158bd7ab0a8bfeddfe66f5de1ac9e70ffea9004decf1c8df98bb1e61ffb6567acd7c7f283faadfbba77d62f38b11baaec3ee2beb95112e6f773c6fe04f74da3299cc587f9d375b7f804fd06e568f5db1987265afde0bc5da5c27d15dc1757abac7f5c80d3c7f2730f6e347e5b6f15ec9d383bff4363df78cbc75be3b60f960f9b4f54960f8bbf754d1e7f903964fbd058cbddea03fdc245d739bb3f164feffac6fa15eaa519051fadffa05ef5707501706d1c479de513fdb57141b2ff61e6182dfe11b891c6ee2b6f8245ed16ef46e63ecf67f62e09f1617d5f3485f56342bff7b596af9d47ccac1b026f83bd5e5fdbcf41e6a6b3f850efbe8d7587f367c4e7a31482f579621c7df6473f55abb3fe486b606d089dd51fce47aa183abb9f782f440b5e8c517fd274a3ceee2bea597c70d64f08ef91b4b1cfe3f7c0c1fbdceff78dbba18d67d4a3f46dd9da796e19ebfc966fd4473bd2f8ccbe61dc156667bc6f6dd16a89c09f8dc353ff43bd68379068f91b83459f5b3b9f2de3aeec2c3ed47babf5152c5f6799abccebc69debec3cf19eb551cad2e2dd31eeeaded65bcbec32a3df8571e733a3dfeaec7db4fed41aebfcb6bf37e0ba8bbdf533f4f3a0a7d5db79a33f85d0f5bddd4ff4b3d025c1be6d1c7dee2f66efa3443b1fcc1f35badef27b9f79dcdbfd467eb5da626ff584f745abc3e57a9919f7458e0ffd2f467d4e6c7ee43b6a34deee27ea5d4ff7e9bee13dd7ff0c14797dd44f57693cb6bfbdcca5c5c3e8df5d8acfce03efa966a3b1f518fda7c727f1f6ec494c2cdc72e0c8ddf76f7fd4777feef9888ff9844ff98ccff9822ff9ea9ffdf99a6f78cab73ce33bbee707fdf72b3ff2b7c5fefc8a57d4fe9a57f5f70daff15b7ec7ebfacd0abf5fe87fc41fe0bd8a111b3ce14dfec85bbccd9f9efbf30eefea5c33de83f767dee7033ee42f3cd411232e9ef91ff1984bae54c97b4bbd6b76dcb0e70d62a205fea724d46ac41b1428724d1df57444c74a4c273ffbd3299dd1395de81e0fe812de57744d3734a55bdea567f1d39de661aa71e81ee99e1ee82b3dd2377aa563a7b4b2283ff49a56e90dadd15b7a47ebf45ee7fe401b74ce239a2cf4dfa48fbca2316dd1367da27b3ea41df55ea15d9ad0dea2f3a5cfb44f0774485fa8550d694445f2e6551a53b9b07e76a8a29a1c35e485854468222d8d7584e3f6b97f9204aaf45276d2cb91ae59cab18e3be1553995b345fe3f4b479ceb880bb9e40bb99ae773625978fafba3d4ff5caee546a6fc28b74ffef3f99ef9a7efb006cb547fff239ebcc65d1e71cff1fff8cfd77830ff7f8fe7c9a26711ff7bbf3f6bf9af5f97fe06b3c5625f + @@ -243,6 +258,12 @@ QgisAppBase drawLayers() + + actionZoomFullExtent + activated() + QgisAppBase + zoomFull() + qgisappbase.ui.h @@ -255,6 +276,7 @@ zoomOut() init() drawLayers() + zoomFull() diff --git a/src/qgisappbase.ui.h b/src/qgisappbase.ui.h index 6d4334418b1..cab4ef07893 100644 --- a/src/qgisappbase.ui.h +++ b/src/qgisappbase.ui.h @@ -53,3 +53,9 @@ void QgisAppBase::drawLayers() { } + + +void QgisAppBase::zoomFull() +{ + +} \ No newline at end of file diff --git a/src/qgsmapcanvas.cpp b/src/qgsmapcanvas.cpp index 3816d5aa294..a72668b6b48 100644 --- a/src/qgsmapcanvas.cpp +++ b/src/qgsmapcanvas.cpp @@ -36,6 +36,7 @@ void QgsMapCanvas::addLayer(QgsMapLayer *lyr){ // update extent if warranted if(layers.size() == 1){ fullExtent = lyr->extent(); + currentExtent = fullExtent; } // set zpos to something... @@ -44,8 +45,8 @@ void QgsMapCanvas::addLayer(QgsMapLayer *lyr){ void QgsMapCanvas::render2(){ QPainter *paint = new QPainter(); paint->begin(this); - currentExtent = fullExtent; - QRect v = paint->viewport(); + //currentExtent = fullExtent; + QRect v = rect();// paint->viewport(); // calculate the translation and scaling parameters double muppX, muppY; muppY = currentExtent.height()/height(); @@ -109,3 +110,21 @@ void QgsMapCanvas::render(){ void QgsMapCanvas::paintEvent(QPaintEvent *pe){ render2(); } +QgsRect QgsMapCanvas::extent(){ + return currentExtent; +} +void QgsMapCanvas::setExtent(QgsRect r){ + currentExtent = r; +} +void QgsMapCanvas::clear(){ + QPainter *p = new QPainter(); + p->begin(this); + p->eraseRect(this->rect()); + p->end(); + +} +void QgsMapCanvas::zoomFullExtent(){ + currentExtent = fullExtent; + clear(); + render2(); +} diff --git a/src/qgsmapcanvas.h b/src/qgsmapcanvas.h index 514505894ca..6733615d55e 100644 --- a/src/qgsmapcanvas.h +++ b/src/qgsmapcanvas.h @@ -44,7 +44,11 @@ public: */ void render(); void render2(); + void clear(); double mupp(); + QgsRect extent(); + void setExtent(QgsRect ); + void zoomFullExtent(); private: void paintEvent(QPaintEvent *pe); //! map containing the layers by name diff --git a/src/qgsrect.cpp b/src/qgsrect.cpp index a8023c315ff..628b6fc0452 100644 --- a/src/qgsrect.cpp +++ b/src/qgsrect.cpp @@ -48,6 +48,15 @@ void QgsRect::normalize(){ ymax = temp; } } +void QgsRect::scale(double scaleFactor){ + // scale from the center + double centerX = xmin + width()/2; + double centerY = ymin + height()/2; + xmin = centerX - (width()*scaleFactor)/2; + xmax = xmin + width()*scaleFactor; + ymin = centerY - (height()*scaleFactor)/2; + ymax = ymin + height()*scaleFactor; +} QString QgsRect::stringRep() const{ QString tmp; QString rep = tmp.setNum(xmin);; diff --git a/src/qgsrect.h b/src/qgsrect.h index 8440279751e..587d982df3c 100644 --- a/src/qgsrect.h +++ b/src/qgsrect.h @@ -37,6 +37,8 @@ class QgsRect{ double width() const; //! Height of the rectangle double height() const; + //! Scale the rectangle around its center point + void scale(double); //! returns string representation of form xmin,ymin xmax,ymax QString stringRep() const; /*! Comparison operator