📄 maplayer.cpp
字号:
//////////////////////////////////////////////////////
//
// NRDB Pro - Spatial database and mapping application
//
// Copyright (c) 1989-2004 Richard D. Alexander
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// NRDB Pro is part of the Natural Resources Database Project
//
// Homepage: http://www.nrdb.co.uk/
// Users' Forum: http://nrdb.mypalawan.info/
//
#include "stdafx.h"
#include <strstrea.h>
#include "nrdb.h"
#include "maplayer.h"
#include "viewmap.h"
#include "importodbc.h"
#include "bdimportexport.h"
#include "dlgprogress.h"
#include "mainfrm.h"
#include "comboboxsymbol.h"
#include "dlgaddoverlay.h"
#include "docmap.h"
///////////////////////////////////////////////////////////////////////////////
CString CMapLayerArray::m_sError;
double CMapLayoutArray::m_dLayoutVersion;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CMapLayerObj::CMapLayerObj()
{
m_pMapObject = NULL;
m_nDataType = 0;
m_lFeature = 0;
m_dValue = AFX_RFX_DOUBLE_PSEUDO_NULL;
m_dX = 0;
m_dY = 0;
m_rect = CRect(0,0,0,0);
m_lDate = 0;
}
CMapLayerObj::CMapLayerObj(CMapLayerObj& rSrc)
{
m_nDataType = rSrc.m_nDataType;
m_lFeature = rSrc.m_lFeature;
m_dValue = rSrc.m_dValue;
m_lDate = rSrc.m_lDate;
m_pMapObject = NULL;
}
CMapLayerObj::~CMapLayerObj()
{
FreeMem();
};
void CMapLayerObj::FreeMem()
{
if (m_pMapObject == NULL) return;
if (m_nDataType == BDMAPLINES)
{
delete ((CLongLines*)m_pMapObject);
}
else if (m_nDataType == BDCOORD)
{
delete ((CCoord*)m_pMapObject);
}
else if (m_nDataType == BDIMAGE)
{
delete ((CImageFile*)m_pMapObject);
}
m_pMapObject = NULL;
};
/////////////////////////////////////////////////////////////////////////////
CMapLayer::CMapLayer(BOOL bMapLines)
{
// Initialise variables
m_lFType = 0;
m_pQuery = NULL;
m_bExtentChecked = FALSE;
m_bOnLoad = FALSE;
// Set best fit as the default for map lines
if (bMapLines) m_prop.m_nTextPos = BestFit;
}
/////////////////////////////////////////////////////////////////////////////
CMapLayer::CMapLayer(CMapLayer& rSrc)
{
m_lFType = rSrc.m_lFType;
m_aAttr.Copy(rSrc.m_aAttr);
m_prop = rSrc.m_prop;
if (rSrc.m_pQuery == NULL) m_pQuery = NULL;
else m_pQuery = new CQuery(*rSrc.m_pQuery);
m_alFeatures.Copy(rSrc.m_alFeatures);
m_bExtentChecked = FALSE;
m_bOnLoad = FALSE;
}
/////////////////////////////////////////////////////////////////////////////
CMapStyle::CMapStyle()
{
m_crLine = RGB(0,0,0);
m_crFill = RGB(64,64,64);
m_nPattern = BS_SOLID;
m_nHatch = 0;
m_nLineStyle = PS_SOLID;
m_nLineWidth = 1;
m_nSymbol = CComboBoxSymbol::circle;
m_dSymSize = 1;
}
CMapProperties::CMapProperties()
{
m_colorText = RGB(0,0,0);
m_bOverlap = FALSE;
m_bScaleFont = FALSE;
m_nTextPos = CMapLayer::BestFit;
m_bBestFitSym = FALSE;
m_bShowLayerName = TRUE;
m_bVisible = TRUE;
m_nSepColour = 0;
m_bRangeColour = FALSE;
m_bAutoColour = FALSE;
m_bAutoSize = FALSE;
m_bPolygon = TRUE;
m_dAutoMin = 0;
m_dAutoMax = 0;
memset(&m_logfont,0,sizeof(LOGFONT));
m_logfont.lfHeight = -11;
m_logfont.lfPitchAndFamily = 18;
m_logfont.lfCharSet = NRDB_CHARSET;
strcpy(m_logfont.lfFaceName, BDString(IDS_DEFAULTFONT));
memset(&m_logfontC,0,sizeof(LOGFONT));
m_logfontC.lfHeight = -8;
m_logfontC.lfPitchAndFamily = 12;
m_logfontC.lfCharSet = NRDB_CHARSET;
strcpy(m_logfontC.lfFaceName, BDString(IDS_DEFAULTFONT));
}
/////////////////////////////////////////////////////////////////////////////
// Copy the map property attributes
//
CMapStyle::CMapStyle(CMapStyle& rSrc)
{
*this = rSrc;
}
CMapStyle& CMapStyle::operator=(const CMapStyle& rSrc)
{
m_crLine = rSrc.m_crLine;
m_crFill = rSrc.m_crFill;
m_nPattern = rSrc.m_nPattern;
m_nHatch = rSrc.m_nHatch;
m_nLineStyle = rSrc.m_nLineStyle;
m_nLineWidth = rSrc.m_nLineWidth;
m_nSymbol = rSrc.m_nSymbol;
m_dSymSize = rSrc.m_dSymSize;
return *this;
}
BOOL CMapStyle::operator==(const CMapStyle& rSrc)
{
return m_crLine == rSrc.m_crLine &&
m_crFill == rSrc.m_crFill &&
m_nPattern == rSrc.m_nPattern &&
m_nHatch == rSrc.m_nHatch &&
m_nLineStyle == rSrc.m_nLineStyle &&
m_nLineWidth == rSrc.m_nLineWidth &&
m_nSymbol == rSrc.m_nSymbol &&
m_dSymSize == rSrc.m_dSymSize;
}
///////////////////////////////////////////////////////////////////////////////
void CMapStyle::AsXML(CXMLObj* pXMLStyle)
{
CXMLObj *pXMLObj = NULL;
pXMLStyle->m_sName = "style";
// Brush
pXMLStyle = pXMLStyle->m_pChild = new CXMLObj;
pXMLStyle->m_sName = "brushstyle";
pXMLObj = pXMLStyle->m_pChild = new CXMLObj;
pXMLObj->m_sName = "pattern";
pXMLObj->m_sValue.Format("%i", m_nPattern);
pXMLObj = pXMLObj->m_pNext = new CXMLObj;
pXMLObj->m_sName = "hatch";
pXMLObj->m_sValue.Format("%i", m_nHatch);
pXMLObj = pXMLObj->m_pNext = new CXMLObj;
pXMLObj->m_sName = "colour";
pXMLObj->m_sValue.Format("%i", m_crFill);
// Line
pXMLStyle = pXMLStyle->m_pNext = new CXMLObj;
pXMLStyle->m_sName = "linestyle";
pXMLObj = pXMLStyle->m_pChild = new CXMLObj;
pXMLObj->m_sName = "line";
pXMLObj->m_sValue.Format("%i", m_nLineStyle);
pXMLObj = pXMLObj->m_pNext = new CXMLObj;
pXMLObj->m_sName = "width";
pXMLObj->m_sValue.Format("%i", m_nLineWidth);
pXMLObj = pXMLObj->m_pNext = new CXMLObj;
pXMLObj->m_sName = "colour";
pXMLObj->m_sValue.Format("%i", m_crLine);
// Symbol
pXMLStyle = pXMLStyle->m_pNext = new CXMLObj;
pXMLStyle->m_sName = "symbolstyle";
pXMLObj = pXMLStyle->m_pChild = new CXMLObj;
pXMLObj->m_sName = "symbol";
pXMLObj->m_sValue.Format("%i", m_nSymbol);
pXMLObj = pXMLObj->m_pNext = new CXMLObj;
pXMLObj->m_sName = "size";
pXMLObj->m_sValue.Format("%lf", m_dSymSize);
}
///////////////////////////////////////////////////////////////////////////////
//
// Converts an xml object to a map style object
//
BOOL CMapStyle::XMLAs(CXMLObj* pXMLObj)
{
BOOL bOK = TRUE;
m_nLineStyle = pXMLObj->GetInteger("linestyle", "line");
m_nLineWidth = pXMLObj->GetInteger("linestyle", "width");
m_crLine = pXMLObj->GetInteger("linestyle", "colour");
m_crFill = pXMLObj->GetInteger("brushstyle", "colour");
m_nPattern = pXMLObj->GetInteger("brushstyle", "pattern");
m_nHatch = pXMLObj->GetInteger("brushstyle", "hatch");
m_nSymbol = pXMLObj->GetInteger("symbolstyle", "symbol");
m_dSymSize = pXMLObj->GetDouble("symbolstyle", "size");
return bOK;
}
///////////////////////////////////////////////////////////////////////////////
CString CMapStyle::AsString()
{
CString s;
s.Format("%li,%li,%li,%li,%li,%li,%li,%lf", m_crFill, m_crLine, m_nLineStyle,
m_nLineWidth, m_nPattern, m_nHatch, m_nSymbol, m_dSymSize);
return s;
}
BOOL CMapStyle::StringAs(CString s)
{
if (sscanf(s, "%li, %li,%li,%li,%li,%li,%li,%lf", &m_crFill, &m_crLine, &m_nLineStyle,
&m_nLineWidth, &m_nPattern, &m_nHatch, &m_nSymbol, &m_dSymSize) == 8)
{
// Skip passed
for (int i = 0; i < 8; i++)
{
int j = s.Find(',');
s = s.Mid(j+1);
}
return TRUE;
}
return FALSE;
};
/////////////////////////////////////////////////////////////////////////////
BOOL CStyleSchemes::XMLAs(CXMLObj* pXMLObj)
{
CMapStyle style;
BOOL bOK = TRUE;
RemoveAll();
if (pXMLObj->m_sName == "styleschemes")
{
CXMLObj *pXMLScheme = pXMLObj->m_pChild;
while (pXMLScheme != NULL && bOK)
{
if (pXMLScheme->m_sName == "stylescheme")
{
CStyleScheme scheme;
scheme.m_sName = pXMLScheme->GetAttr("name");
CXMLObj *pXMLStyle = pXMLScheme->m_pChild;
while (pXMLStyle != NULL && bOK)
{
if (pXMLStyle->m_sName == "style")
{
if (style.XMLAs(pXMLStyle))
{
scheme.m_aStyle.Add(style);
} else
{
bOK = FALSE;
}
}
pXMLStyle = pXMLStyle->m_pNext;
}
Add(scheme);
}
pXMLScheme = pXMLScheme->m_pNext;
}
}
return bOK;
}
///////////////////////////////////////////////////////////////////////////////
CMapGrid::CMapGrid()
{
memset(&m_logfont,0,sizeof(LOGFONT));
m_logfont.lfHeight = -8;
m_logfont.lfPitchAndFamily = 18;
m_logfont.lfCharSet = NRDB_CHARSET;
strcpy(m_logfont.lfFaceName, BDString(IDS_DEFAULTFONT));
m_nType = defaultgrid;
m_nDegLat = 1;
m_nMinLat = 0;
m_nSecLat = 0;
m_nDegLng = 1;
m_nMinLng = 0;
m_nSecLng = 0;
m_style.m_crLine = RGB(166,202,240);
}
///////////////////////////////////////////////////////////////////////////////
CMapGrid::CMapGrid(CMapGrid& rSrc)
{
m_logfont = rSrc.m_logfont;
m_style = rSrc.m_style;
m_nType = rSrc.m_nType;
m_nDegLat = rSrc.m_nDegLat;
m_nMinLat = rSrc.m_nMinLat;
m_nSecLat = rSrc.m_nSecLat;
m_nDegLng = rSrc.m_nDegLng;
m_nMinLng = rSrc.m_nMinLng;
m_nSecLng = rSrc.m_nSecLng;
}
///////////////////////////////////////////////////////////////////////////////
CMapProperties::CMapProperties(CMapProperties& rSrc)
{
*this = rSrc;
}
CMapProperties& CMapProperties::operator=(CMapProperties& rSrc)
{
m_sName = rSrc.m_sName;
m_colorText = rSrc.m_colorText;
m_bOverlap = rSrc.m_bOverlap;
m_nTextPos = rSrc.m_nTextPos;
m_sComment = rSrc.m_sComment;
m_bAutoColour = rSrc.m_bAutoColour;
m_bAutoSize = rSrc.m_bAutoSize;
m_bPolygon = rSrc.m_bPolygon;
m_bScaleFont = rSrc.m_bScaleFont;
m_bBestFitSym = rSrc.m_bBestFitSym;
m_bShowLayerName = rSrc.m_bShowLayerName;
m_bVisible = rSrc.m_bVisible;
m_nSepColour = rSrc.m_nSepColour;
m_bRangeColour = rSrc.m_bRangeColour;
m_dAutoMin = rSrc.m_dAutoMin;
m_dAutoMax = rSrc.m_dAutoMax;
m_logfont = rSrc.m_logfont;
m_logfontC = rSrc.m_logfontC;
m_aColourFeature.Copy(rSrc.m_aColourFeature);
m_aRangeColour = rSrc.m_aRangeColour;
(CMapStyle&)*this = (CMapStyle&)rSrc;
return *this;
}
/////////////////////////////////////////////////////////////////////////////
CMapLayoutObj::CMapLayoutObj()
{
m_rect = CRect(-1,-1,-1,-1);
memset(&m_logfont,0,sizeof(LOGFONT));
m_logfont.lfHeight = -12;
m_logfont.lfPitchAndFamily = 18;
m_logfont.lfCharSet = NRDB_CHARSET;
m_nType = CMapLayout::none;
}
CMapLayoutObj& CMapLayoutObj::operator=(const class CMapLayoutObj& rSrc)
{
m_rect = rSrc.m_rect;
m_style = rSrc.m_style;
m_logfont = rSrc.m_logfont;
m_nType = rSrc.m_nType;
m_sImageFile = rSrc.m_sImageFile;
m_sText = rSrc.m_sText;
return *this;
}
CMapLayoutObj::CMapLayoutObj(const CMapLayoutObj& rSrc)
{
*this = rSrc;
}
/////////////////////////////////////////////////////////////////////////////
CString CMapLayoutObj::GetTypeDesc()
{
if (m_nType == CMapLayout::map) return BDString(IDS_MAP);
if (m_nType == CMapLayout::legend) return BDString(IDS_LEGEND);
if (m_nType == CMapLayout::title) return BDString(IDS_TITLE);
if (m_nType == CMapLayout::arrow) return BDString(IDS_NORTHARROW);
if (m_nType == CMapLayout::source) return BDString(IDS_COMMENTS);
if (m_nType == CMapLayout::scalebar) return BDString(IDS_SCALEBAR);
if (m_nType == CMapLayout::projection) return BDString(IDS_PROJECTION);
if (m_nType == CMapLayout::box) return BDString(IDS_BORDER);
if (m_nType == CMapLayout::picture) return BDString(IDS_IMAGE);
if (m_nType == CMapLayout::text) return BDString(IDS_TEXT);
if (m_nType == CMapLayout::scale) return BDString(IDS_SCALE);
ASSERT(FALSE);
return "";
}
/////////////////////////////////////////////////////////////////////////////
CMapLayout::CMapLayout()
{
CMapLayoutObj layoutobj;
layoutobj.m_nType = map;
layoutobj.m_style.m_crLine = RGB(0,0,64);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -