Line data Source code
1 : /******************************************************************************* 2 : * Project: OGR CAD Driver 3 : * Purpose: Implements driver based on libopencad 4 : * Author: Alexandr Borzykh, mush3d at gmail.com 5 : * Author: Dmitry Baryshnikov, polimax@mail.ru 6 : * Language: C++ 7 : ******************************************************************************* 8 : * The MIT License (MIT) 9 : * 10 : * Copyright (c) 2016 Alexandr Borzykh 11 : * Copyright (c) 2016, NextGIS 12 : * 13 : * SPDX-License-Identifier: MIT 14 : *******************************************************************************/ 15 : #ifndef OGR_CAD_H_INCLUDED 16 : #define OGR_CAD_H_INCLUDED 17 : 18 : // gdal headers 19 : #include "ogrsf_frmts.h" 20 : 21 : // libopencad headers 22 : #include "cadgeometry.h" 23 : #include "opencad_api.h" 24 : 25 : #include <set> 26 : 27 : class OGRCADLayer final : public OGRLayer 28 : { 29 : GDALDataset *m_poDS = nullptr; 30 : OGRFeatureDefn *poFeatureDefn; 31 : OGRSpatialReference *poSpatialRef; 32 : GIntBig nNextFID; 33 : CADLayer &poCADLayer; 34 : int nDWGEncoding; 35 : 36 : public: 37 : OGRCADLayer(GDALDataset *poDS, CADLayer &poCADLayer, 38 : OGRSpatialReference *poSR, int nEncoding); 39 : ~OGRCADLayer(); 40 : 41 : void ResetReading() override; 42 : OGRFeature *GetNextFeature() override; 43 : OGRFeature *GetFeature(GIntBig nFID) override; 44 : GIntBig GetFeatureCount(int /* bForce */) override; 45 : 46 0 : OGRSpatialReference *GetSpatialRef() override 47 : { 48 0 : return poSpatialRef; 49 : } 50 : 51 8 : OGRFeatureDefn *GetLayerDefn() override 52 : { 53 8 : return poFeatureDefn; 54 : } 55 : 56 : std::set<CPLString> asFeaturesAttributes; 57 : int TestCapability(const char *) override; 58 : 59 1 : GDALDataset *GetDataset() override 60 : { 61 1 : return m_poDS; 62 : } 63 : }; 64 : 65 : class GDALCADDataset final : public GDALDataset 66 : { 67 : CPLString osCADFilename; 68 : CADFile *poCADFile; 69 : // vector 70 : OGRCADLayer **papoLayers; 71 : int nLayers; 72 : // raster 73 : double adfGeoTransform[6]; 74 : GDALDataset *poRasterDS; 75 : mutable OGRSpatialReference *poSpatialReference; 76 : 77 : public: 78 : GDALCADDataset(); 79 : virtual ~GDALCADDataset(); 80 : 81 : int Open(GDALOpenInfo *poOpenInfo, CADFileIO *pFileIO, 82 : long nSubRasterLayer = -1, long nSubRasterFID = -1); 83 : 84 5 : int GetLayerCount() override 85 : { 86 5 : return nLayers; 87 : } 88 : 89 : OGRLayer *GetLayer(int) override; 90 : int TestCapability(const char *) override; 91 : virtual char **GetFileList() override; 92 : const OGRSpatialReference *GetSpatialRef() const override; 93 : virtual CPLErr GetGeoTransform(double *) override; 94 : virtual int GetGCPCount() override; 95 : const OGRSpatialReference *GetGCPSpatialRef() const override; 96 : virtual const GDAL_GCP *GetGCPs() override; 97 : virtual int CloseDependentDatasets() override; 98 : 99 : protected: 100 : const char *GetPrjFilePath() const; 101 : void FillTransform(CADImage *pImage, double dfUnits); 102 : int GetCadEncoding() const; 103 : 104 : private: 105 : CPL_DISALLOW_COPY_ASSIGN(GDALCADDataset) 106 : }; 107 : 108 : CPLString CADRecode(const CPLString &sString, int CADEncoding); 109 : 110 : #endif