Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: DXF Translator 4 : * Purpose: Implements OGRDXFDriver. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2009, Frank Warmerdam <warmerdam@pobox.com> 9 : * 10 : * Permission is hereby granted, free of charge, to any person obtaining a 11 : * copy of this software and associated documentation files (the "Software"), 12 : * to deal in the Software without restriction, including without limitation 13 : * the rights to use, copy, modify, merge, publish, distribute, sublicense, 14 : * and/or sell copies of the Software, and to permit persons to whom the 15 : * Software is furnished to do so, subject to the following conditions: 16 : * 17 : * The above copyright notice and this permission notice shall be included 18 : * in all copies or substantial portions of the Software. 19 : * 20 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 21 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26 : * DEALINGS IN THE SOFTWARE. 27 : ****************************************************************************/ 28 : 29 : #include "ogr_dxf.h" 30 : #include "cpl_conv.h" 31 : 32 : /************************************************************************/ 33 : /* OGRDXFDriverIdentify() */ 34 : /************************************************************************/ 35 : 36 42811 : static int OGRDXFDriverIdentify(GDALOpenInfo *poOpenInfo) 37 : 38 : { 39 42811 : if (poOpenInfo->fpL == nullptr || poOpenInfo->nHeaderBytes == 0) 40 40234 : return FALSE; 41 2577 : if (EQUAL(CPLGetExtension(poOpenInfo->pszFilename), "dxf")) 42 196 : return TRUE; 43 2381 : const char *pszIter = (const char *)poOpenInfo->pabyHeader; 44 2381 : bool bFoundZero = false; 45 2381 : int i = 0; // Used after for. 46 752375 : for (; pszIter[i]; i++) 47 : { 48 750001 : if (pszIter[i] == '0') 49 : { 50 30755 : int j = i - 1; // Used after for. 51 32401 : for (; j >= 0; j--) 52 : { 53 32399 : if (pszIter[j] != ' ') 54 30753 : break; 55 : } 56 30755 : if (j < 0 || pszIter[j] == '\n' || pszIter[j] == '\r') 57 : { 58 7 : bFoundZero = true; 59 7 : break; 60 : } 61 : } 62 : } 63 2381 : if (!bFoundZero) 64 2374 : return FALSE; 65 7 : i++; 66 8 : while (pszIter[i] == ' ') 67 1 : i++; 68 10 : while (pszIter[i] == '\n' || pszIter[i] == '\r') 69 3 : i++; 70 7 : if (!STARTS_WITH_CI(pszIter + i, "SECTION")) 71 5 : return FALSE; 72 2 : i += static_cast<int>(strlen("SECTION")); 73 2 : return pszIter[i] == '\n' || pszIter[i] == '\r'; 74 : } 75 : 76 : /************************************************************************/ 77 : /* Open() */ 78 : /************************************************************************/ 79 : 80 99 : static GDALDataset *OGRDXFDriverOpen(GDALOpenInfo *poOpenInfo) 81 : 82 : { 83 99 : if (!OGRDXFDriverIdentify(poOpenInfo)) 84 0 : return nullptr; 85 : 86 99 : OGRDXFDataSource *poDS = new OGRDXFDataSource(); 87 : 88 99 : if (!poDS->Open(poOpenInfo->pszFilename)) 89 : { 90 1 : delete poDS; 91 1 : poDS = nullptr; 92 : } 93 : 94 99 : return poDS; 95 : } 96 : 97 : /************************************************************************/ 98 : /* Create() */ 99 : /************************************************************************/ 100 : 101 : static GDALDataset * 102 45 : OGRDXFDriverCreate(const char *pszName, CPL_UNUSED int nBands, 103 : CPL_UNUSED int nXSize, CPL_UNUSED int nYSize, 104 : CPL_UNUSED GDALDataType eDT, char **papszOptions) 105 : { 106 45 : OGRDXFWriterDS *poDS = new OGRDXFWriterDS(); 107 : 108 45 : if (poDS->Open(pszName, papszOptions)) 109 44 : return poDS; 110 : else 111 : { 112 1 : delete poDS; 113 1 : return nullptr; 114 : } 115 : } 116 : 117 : /************************************************************************/ 118 : /* RegisterOGRDXF() */ 119 : /************************************************************************/ 120 : 121 1520 : void RegisterOGRDXF() 122 : 123 : { 124 1520 : if (GDALGetDriverByName("DXF") != nullptr) 125 301 : return; 126 : 127 1219 : GDALDriver *poDriver = new GDALDriver(); 128 : 129 1219 : poDriver->SetDescription("DXF"); 130 1219 : poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); 131 1219 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE_LAYER, "YES"); 132 1219 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "AutoCAD DXF"); 133 1219 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "dxf"); 134 1219 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/dxf.html"); 135 1219 : poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES"); 136 1219 : poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); 137 : 138 1219 : poDriver->SetMetadataItem( 139 : GDAL_DMD_CREATIONOPTIONLIST, 140 : "<CreationOptionList>" 141 : " <Option name='HEADER' type='string' description='Template header " 142 : "file' default='header.dxf'/>" 143 : " <Option name='TRAILER' type='string' description='Template trailer " 144 : "file' default='trailer.dxf'/>" 145 : " <Option name='FIRST_ENTITY' type='int' description='Identifier of " 146 : "first entity'/>" 147 1219 : "</CreationOptionList>"); 148 : 149 1219 : poDriver->SetMetadataItem(GDAL_DS_LAYER_CREATIONOPTIONLIST, 150 1219 : "<LayerCreationOptionList/>"); 151 : 152 1219 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 153 1219 : poDriver->SetMetadataItem(GDAL_DCAP_FEATURE_STYLES, "YES"); 154 1219 : poDriver->SetMetadataItem(GDAL_DCAP_FEATURE_STYLES_READ, "YES"); 155 1219 : poDriver->SetMetadataItem(GDAL_DCAP_FEATURE_STYLES_WRITE, "YES"); 156 1219 : poDriver->SetMetadataItem(GDAL_DCAP_MULTIPLE_VECTOR_LAYERS, "YES"); 157 : 158 1219 : poDriver->pfnOpen = OGRDXFDriverOpen; 159 1219 : poDriver->pfnIdentify = OGRDXFDriverIdentify; 160 1219 : poDriver->pfnCreate = OGRDXFDriverCreate; 161 : 162 1219 : GetGDALDriverManager()->RegisterDriver(poDriver); 163 : }