Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: OGR Driver for DGN Reader. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2000, Frank Warmerdam (warmerdam@pobox.com) 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #ifndef OGR_DGN_H_INCLUDED 14 : #define OGR_DGN_H_INCLUDED 15 : 16 : #include "dgnlib.h" 17 : #include "ogrsf_frmts.h" 18 : 19 : /************************************************************************/ 20 : /* OGRDGNLayer */ 21 : /************************************************************************/ 22 : 23 : class OGRDGNDataSource; 24 : 25 : class OGRDGNLayer final : public OGRLayer 26 : { 27 : OGRDGNDataSource *m_poDS = nullptr; 28 : OGRFeatureDefn *poFeatureDefn; 29 : 30 : int iNextShapeId; 31 : 32 : DGNHandle hDGN; 33 : int bUpdate; 34 : 35 : char *pszLinkFormat; 36 : 37 : OGRFeature *ElementToFeature(DGNElemCore *, int nRecLevel); 38 : 39 : void ConsiderBrush(DGNElemCore *, const char *pszPen, 40 : OGRFeature *poFeature); 41 : 42 : DGNElemCore **LineStringToElementGroup(const OGRLineString *, int); 43 : DGNElemCore **TranslateLabel(OGRFeature *); 44 : 45 : // Unused: 46 : // int bHaveSimpleQuery; 47 : OGRFeature *poEvalFeature; 48 : 49 : OGRErr CreateFeatureWithGeom(OGRFeature *, const OGRGeometry *); 50 : 51 : public: 52 : OGRDGNLayer(OGRDGNDataSource *poDS, const char *pszName, DGNHandle hDGN, 53 : int bUpdate); 54 : virtual ~OGRDGNLayer(); 55 : 56 : void SetSpatialFilter(OGRGeometry *) override; 57 : 58 1 : virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override 59 : { 60 1 : OGRLayer::SetSpatialFilter(iGeomField, poGeom); 61 1 : } 62 : 63 : void ResetReading() override; 64 : OGRFeature *GetNextFeature() override; 65 : OGRFeature *GetFeature(GIntBig nFeatureId) override; 66 : 67 : virtual GIntBig GetFeatureCount(int bForce = TRUE) override; 68 : virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; 69 : 70 0 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, 71 : int bForce) override 72 : { 73 0 : return OGRLayer::GetExtent(iGeomField, psExtent, bForce); 74 : } 75 : 76 289 : OGRFeatureDefn *GetLayerDefn() override 77 : { 78 289 : return poFeatureDefn; 79 : } 80 : 81 : int TestCapability(const char *) override; 82 : 83 : OGRErr ICreateFeature(OGRFeature *poFeature) override; 84 : 85 : GDALDataset *GetDataset() override; 86 : }; 87 : 88 : /************************************************************************/ 89 : /* OGRDGNDataSource */ 90 : /************************************************************************/ 91 : 92 77 : class OGRDGNDataSource final : public GDALDataset 93 : { 94 : OGRDGNLayer **papoLayers = nullptr; 95 : int nLayers = 0; 96 : 97 : DGNHandle hDGN = nullptr; 98 : 99 : char **papszOptions = nullptr; 100 : 101 : std::string m_osEncoding{}; 102 : 103 : public: 104 : OGRDGNDataSource(); 105 : ~OGRDGNDataSource(); 106 : 107 : bool Open(GDALOpenInfo *poOpenInfo); 108 : void PreCreate(CSLConstList); 109 : 110 : OGRLayer *ICreateLayer(const char *pszName, 111 : const OGRGeomFieldDefn *poGeomFieldDefn, 112 : CSLConstList) override; 113 : 114 47 : int GetLayerCount() override 115 : { 116 47 : return nLayers; 117 : } 118 : 119 : OGRLayer *GetLayer(int) override; 120 : 121 : int TestCapability(const char *) override; 122 : 123 15 : const std::string &GetEncoding() const 124 : { 125 15 : return m_osEncoding; 126 : } 127 : }; 128 : 129 : #endif /* ndef OGR_DGN_H_INCLUDED */