Index: ogr/ogrsf_frmts/dxf/drv_dxf.html
===================================================================
--- ogr/ogrsf_frmts/dxf/drv_dxf.html (revision 0)
+++ ogr/ogrsf_frmts/dxf/drv_dxf.html (revision 0)
@@ -0,0 +1,15 @@
+
+
+DXF
+
+
+
+
+DXF
+
+ This is DXF driver.
+ Currently it has only write capabilities. The driver use dxflib (free open source cross platform library, see http://www.ribbonsoft.com/dxflib.html).
+ DXF files produced by driver tested with AutoCAD2004 on point, line and polygon features with attributes.
+
+
+
Index: ogr/ogrsf_frmts/dxf/ogr_dxf.cpp
===================================================================
--- ogr/ogrsf_frmts/dxf/ogr_dxf.cpp (revision 0)
+++ ogr/ogrsf_frmts/dxf/ogr_dxf.cpp (revision 0)
@@ -0,0 +1,525 @@
+/******************************************************************************
+ * Project: OpenGIS Simple Features Reference Implementation
+ * Purpose: Private definitions for OGR DXF Driver.
+ * Author: Bishop (aka Barishnikov Dmitry), polimax@mail.ru
+ *
+ ******************************************************************************
+ * Copyright (c) 2008, Bishop
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ****************************************************************************/
+#include "ogr_dxf.h"
+#include "cpl_conv.h"
+
+void RegisterOGRDXF()
+{
+ OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( new OGRDXFDriver( "DXF" ) );
+}
+
+//////////////////////////////////////////////////////////////////////////////////////
+//OGRDXFDriver
+//////////////////////////////////////////////////////////////////////////////////////
+
+OGRDataSource *OGRDXFDriver::Open( const char * pszFilename, int bUpdate )
+{
+ if( EQUAL(CPLGetExtension(pszFilename),"dxf") )
+ {
+ }
+ return NULL;
+}
+
+OGRDataSource *OGRDXFDriver::CreateDataSource( const char * pszName, char **papszOptions )
+{
+ OGRDXFDataSource *poDS = new OGRDXFDataSource( osOutClass );
+ if( !poDS->Create( pszName, papszOptions ) )
+ {
+ delete poDS;
+ poDS = NULL;
+ }
+ return poDS;
+}
+
+int OGRDXFDriver::TestCapability( const char * pszCap )
+
+{
+ if( EQUAL(pszCap,ODrCCreateDataSource) )
+ return TRUE;
+ else if( EQUAL(pszCap,ODrCDeleteDataSource) )
+ return TRUE;
+ else
+ return FALSE;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////
+//OGRDXFDataSource
+//////////////////////////////////////////////////////////////////////////////////////
+
+OGRDXFDataSource::OGRDXFDataSource( const char *pszOutClass ) : dw(NULL)
+{
+ osOutClass = pszOutClass;
+
+ nLayers = 0;
+ papoLayers = NULL;
+
+ preAll = setlocale( LC_ALL, ".ACP" );
+ preNum = setlocale(LC_NUMERIC, "");
+}
+
+OGRDXFDataSource::~OGRDXFDataSource()
+{
+
+ dw = dxf.out(osFilename, exportVersion);
+ dxf.writeHeader(*dw);
+
+ dw->dxfString(9, "$EXTMIN");
+ dw->dxfReal(10, sExtent.MinX);
+ dw->dxfReal(20, sExtent.MinY);
+
+ dw->dxfString(9, "$EXTMAX");
+ dw->dxfReal(10, sExtent.MaxX);
+ dw->dxfReal(20, sExtent.MaxY);
+
+ dw->dxfString(9, "$ATTMODE");
+ dw->dxfInt(70, 2);
+
+ //$LIMMIN
+ //$LIMMAX
+
+ dw->sectionEnd();
+
+ dw->sectionTables();
+ //dxf.writeVPort(*dw); //tested in AutoCAD2004 - error
+
+ dw->tableLineTypes(25);
+ dxf.writeLineType(*dw, DL_LineTypeData("BYBLOCK", 0));
+ dxf.writeLineType(*dw, DL_LineTypeData("BYLAYER", 0));
+ dxf.writeLineType(*dw, DL_LineTypeData("CONTINUOUS", 0));
+ //dxf.writeLineType(*dw, DL_LineTypeData("ACAD_ISO02Wl00", 0)); //tested in AutoCAD2004 - error
+ //dxf.writeLineType(*dw, DL_LineTypeData("ACAD_ISO03Wl00", 0)); //tested in AutoCAD2004 - error
+ //dxf.writeLineType(*dw, DL_LineTypeData("ACAD_ISO04Wl00", 0)); //tested in AutoCAD2004 - error
+ //dxf.writeLineType(*dw, DL_LineTypeData("ACAD_ISO05Wl00", 0)); //tested in AutoCAD2004 - error
+ dxf.writeLineType(*dw, DL_LineTypeData("BORDER", 0));
+ dxf.writeLineType(*dw, DL_LineTypeData("BORDER2", 0));
+ dxf.writeLineType(*dw, DL_LineTypeData("BORDERX2", 0));
+ dxf.writeLineType(*dw, DL_LineTypeData("CENTER", 0));
+ dxf.writeLineType(*dw, DL_LineTypeData("CENTER2", 0));
+ ////dxf.writeLineType(*dw, DL_LineTypeData("CENTERX2", 0)); //tested in AutoCAD2004 - error
+ //dxf.writeLineType(*dw, DL_LineTypeData("DASKDOT", 0)); //tested in AutoCAD2004 - error
+ //dxf.writeLineType(*dw, DL_LineTypeData("DASKDOT2", 0)); //tested in AutoCAD2004 - error
+ ////dxf.writeLineType(*dw, DL_LineTypeData("DASbnx>TX2", 0)); //tested in AutoCAD2004 - error
+ //dxf.writeLineType(*dw, DL_LineTypeData("DASKED", 0)); //tested in AutoCAD2004 - error
+ //dxf.writeLineType(*dw, DL_LineTypeData("DASKED2", 0)); //tested in AutoCAD2004 - error
+ //dxf.writeLineType(*dw, DL_LineTypeData("DASKEDX2", 0)); //tested in AutoCAD2004 - error
+ //dxf.writeLineType(*dw, DL_LineTypeData("DIVIDE", 0)); //tested in AutoCAD2004 - error
+ ////dxf.writeLineType(*dw, DL_LineTypeData("DlviDE2", 0)); //tested in AutoCAD2004 - error
+ ////dxf.writeLineType(*dw, DL_LineTypeData("DlviDEX2", 0)); //tested in AutoCAD2004 - error
+ //dxf.writeLineType(*dw, DL_LineTypeData("DOT", 0)); //tested in AutoCAD2004 - error
+ ////dxf.writeLineType(*dw, DL_LineTypeData("DOT2il", 0)); //tested in AutoCAD2004 - error
+ //dxf.writeLineType(*dw, DL_LineTypeData("DCTX2", 0)); //tested in AutoCAD2004 - error
+
+ dw->tableEnd();
+
+ dw->tableLayers(GetLayerCount() + 1);
+ dxf.writeLayer(*dw, DL_LayerData("0", 0), DL_Attributes("", DL_Codes::black, 100, "CONTINUOUS"));
+ for(int i = 0; i < GetLayerCount(); i++)
+ {
+ const char* szLayerName = GetLayer(i)->GetLayerDefn()->GetName();
+ dxf.writeLayer(*dw, DL_LayerData(szLayerName, 0), DL_Attributes("", DL_Codes::black, 100, "CONTINUOUS"));
+ }
+ dw->tableEnd();
+ ///////////////////////////////////////////////
+ //this block not affect in AutoCAD2004 opening
+ //included from the program manual of dxflib
+ //
+ //dxf.writeStyle(*dw);
+ //dxf.writeView(*dw);
+ //dxf.writeUcs(*dw);
+
+ //dw->tableAppid(1);
+ //dw->tableAppidEntry(0x12);
+ //dw->dxfString(2, "ACAD");
+ //dw->dxfInt(70, 0);
+ //dw->tableEnd();
+
+ //dxf.writeDimStyle(*dw, arrowSize, extensionLineExtension, extensionLineOffset, dimensionGap, dimensionTextSize);
+
+ //dxf.writeBlockRecord(*dw);
+ //dw->tableEnd();
+ //
+ //end block
+ dw->sectionEnd();
+
+
+
+ dw->sectionBlocks();
+
+ for(int i = 0; i < GetLayerCount(); i++)
+ {
+ OGRDXFLayer* pDXFLayer = dynamic_cast(GetLayer(i));
+ if(pDXFLayer == NULL)
+ continue;
+ pDXFLayer->WriteBlocks(&dxf, dw, i);
+ }
+
+ dw->sectionEnd();
+
+ dw->sectionEntities();
+ for(int i = 0; i < GetLayerCount(); i++)
+ {
+ OGRDXFLayer* pDXFLayer = dynamic_cast(GetLayer(i));
+ if(pDXFLayer == NULL)
+ continue;
+ pDXFLayer->WriteEntities(&dxf, dw, i);
+ }
+ dw->sectionEnd();
+
+ //dxf.writeObjects(*dw); //tested in AutoCAD2004 - not needed?
+ //dxf.writeObjectsEnd(*dw); //tested in AutoCAD2004 - not needed?
+
+ if(dw != NULL)
+ {
+ dw->dxfEOF();
+ dw->close();
+ delete dw;
+ }
+ setlocale( LC_ALL, preAll );
+ setlocale(LC_NUMERIC, preNum);
+}
+
+int OGRDXFDataSource::Create( const char *pszFilename, char **papszOptionsIn )
+{
+ osFilename = pszFilename;
+
+ const char *pszVersion = CSLFetchNameValue( papszOptionsIn, "VERSION" );
+ if( pszVersion == NULL )
+ exportVersion = DL_Codes::AC1009;
+ else if( EQUAL(pszVersion,"9" ) )
+ exportVersion = DL_Codes::AC1009;
+ else if( EQUAL(pszVersion,"15" ) )
+ exportVersion = DL_Codes::AC1015;
+
+
+ return TRUE;
+}
+
+int OGRDXFDataSource::TestCapability( const char * pszCap )
+{
+ if( EQUAL(pszCap,ODsCCreateLayer) )
+ return TRUE;
+ else
+ return FALSE;
+}
+
+OGRLayer *OGRDXFDataSource::GetLayer( int iLayer )
+{
+ if( iLayer < 0 || iLayer >= nLayers )
+ return NULL;
+ else
+ return papoLayers[iLayer];
+}
+
+OGRLayer *OGRDXFDataSource::CreateLayer( const char *pszLayerName, OGRSpatialReference *,
+ OGRwkbGeometryType, char ** papszLayerOptions )
+{
+ OGRDXFLayer *poLayer = new OGRDXFLayer( pszLayerName, papszLayerOptions, this );
+ papoLayers = (OGRDXFLayer **)CPLRealloc(papoLayers, sizeof(void*) * ++nLayers );
+ papoLayers[nLayers-1] = poLayer;
+ return poLayer;
+}
+
+void OGRDXFDataSource::ExtendExtent( OGRGeometry * poGeometry )
+{
+ if( poGeometry == NULL ) return;
+ OGREnvelope sThisEnvelope;
+ poGeometry->getEnvelope( &sThisEnvelope );
+ sExtent.Merge( sThisEnvelope );
+}
+
+//////////////////////////////////////////////////////////////////////////////////////
+//OGRDXFLayer
+//////////////////////////////////////////////////////////////////////////////////////
+
+OGRDXFLayer::OGRDXFLayer( const char *pszLayerName, char **papszOptionsIn,
+ OGRDXFDataSource *poDSIn )
+{
+ poDS = poDSIn;
+ papszOptions = CSLDuplicate( papszOptionsIn );
+
+/* -------------------------------------------------------------------- */
+/* Create the starting OGRFeatureDefn. */
+/* -------------------------------------------------------------------- */
+ poFeatureDefn = new OGRFeatureDefn( pszLayerName );
+ poFeatureDefn->Reference();
+ pos = 0;
+}
+
+OGRDXFLayer::~OGRDXFLayer()
+{
+ for(size_t i = 0; i < m_pFeatures.size(); i++)
+ {
+ delete m_pFeatures[i];
+ }
+ poFeatureDefn->Release();
+}
+
+void OGRDXFLayer::ResetReading()
+{
+ pos = 0;
+}
+
+OGRFeature *OGRDXFLayer::GetNextFeature()
+{
+ if(pos >= m_pFeatures.size())
+ return NULL;
+ return m_pFeatures[pos]->Clone();
+}
+
+int OGRDXFLayer::TestCapability( const char *pszCap )
+{
+ if( EQUAL(pszCap,OLCSequentialWrite) )
+ return TRUE;
+
+ else if( EQUAL(pszCap,OLCCreateField) )
+ return TRUE;
+
+ else
+ return FALSE;
+}
+
+OGRErr OGRDXFLayer::CreateField( OGRFieldDefn *poField, int bApproxOK )
+{
+ poFeatureDefn->AddFieldDefn( poField );
+ return OGRERR_NONE;
+}
+
+OGRErr OGRDXFLayer::WriteEntity( DL_Dxf* dxf, DL_WriterA* dw,OGRGeometry * poGeom, const char* lpszLayerName )
+{
+ switch( wkbFlatten(poGeom->getGeometryType()) )
+ {
+ case wkbPoint:
+ {
+ OGRPoint *poOGRPoint = (OGRPoint *) poGeom;
+ dxf->writePoint(*dw, DL_PointData(poOGRPoint->getX(), poOGRPoint->getY(), poOGRPoint->getZ()),
+ DL_Attributes(lpszLayerName, 256, -1, "BYLAYER"));
+
+ }
+ break;
+ case wkbLineString:
+ {
+ OGRLineString *poLine = (OGRLineString *) poGeom;
+ // Add a 2d polyline with vertices.
+
+ int i;
+ dxf->writePolyline(*dw, DL_PolylineData(poLine->getNumPoints(), 0, 0, 0),
+ DL_Attributes(lpszLayerName, 256, -1, "BYLAYER"));
+
+ for (i = 0; i < poLine->getNumPoints(); i++)
+ {
+ dxf->writeVertex(*dw, DL_VertexData(poLine->getX(i), poLine->getY(i), poLine->getZ(i)));
+ }
+ dxf->writePolylineEnd(*dw);
+ }
+ break;
+ case wkbPolygon:
+ {
+ OGRPolygon *poPoly = (OGRPolygon *) poGeom;
+ int iRing;
+ OGRErr eErr;
+
+ for( iRing = -1; iRing < poPoly->getNumInteriorRings(); iRing++ )
+ {
+ OGRLinearRing *poRing;
+
+ if( iRing == -1 )
+ poRing = poPoly->getExteriorRing();
+ else
+ poRing = poPoly->getInteriorRing( iRing );
+
+ if( iRing == -1 )
+ eErr = WriteEntity( dxf, dw, poRing, lpszLayerName );
+ else
+ eErr = WriteEntity( dxf, dw, poRing, lpszLayerName );
+ if( eErr != OGRERR_NONE )
+ return eErr;
+ }
+ }
+ break;
+ case wkbGeometryCollection:
+ case wkbMultiPolygon:
+ case wkbMultiPoint:
+ case wkbMultiLineString:
+ {
+ OGRGeometryCollection *poColl = (OGRGeometryCollection *) poGeom;
+ int iSubGeom;
+ OGRErr eErr;
+
+ for( iSubGeom=0; iSubGeom < poColl->getNumGeometries(); iSubGeom++ )
+ {
+ OGRGeometry *poGeom = poColl->getGeometryRef( iSubGeom );
+
+ if( iSubGeom == 0 )
+ eErr = WriteEntity( dxf, dw, poGeom, lpszLayerName );
+ else
+ eErr = WriteEntity( dxf, dw, poGeom, lpszLayerName );
+
+ if( eErr != OGRERR_NONE )
+ return eErr;
+ }
+ }
+ break;
+ default:
+ return OGRERR_FAILURE;
+ }
+ return OGRERR_NONE;
+}
+
+OGRErr OGRDXFLayer::WriteBlocks( DL_Dxf* dxf, DL_WriterA* dw, int pos )
+{
+ for(size_t i = 0; i < m_pFeatures.size(); i++)
+ {
+ CPLString str;
+ str.Printf("BLK%d_%d", pos, i);
+ dw->dxfString(0, "BLOCK"); //begin block
+ dw->dxfString(8, GetLayerDefn()->GetName()); //layer name
+ dw->dxfString(2, str.c_str()); //begin named block
+ dw->dxfInt(70, 2); //
+ dw->coord(10, 0, 0);
+
+
+ OGRGeometry* poGeom = m_pFeatures[i]->GetGeometryRef();
+ WriteEntity(dxf, dw, poGeom, GetLayerDefn()->GetName());
+
+ //attdef
+ for(int j = 0; j < m_pFeatures[i]->GetFieldCount(); j++)
+ {
+ OGRFieldDefn* FieldDef = m_pFeatures[i]->GetFieldDefnRef(j);
+ dw->dxfString(0, "ATTDEF"); //attributes definition
+ dw->dxfString(8, GetLayerDefn()->GetName()); //layer name
+ dw->coord(10, 0, 0);
+ dw->dxfReal(40, 0.2);
+ dw->dxfString(1, ""); //
+ dw->dxfString(3, ""); //
+ dw->dxfString(2, FieldDef->GetNameRef()); //field name
+ dw->dxfInt(70, 1);
+ }
+ dw->dxfString(0, "ENDBLK"); //end block
+ dw->dxfString(8, GetLayerDefn()->GetName()); //layer name
+ }
+ return OGRERR_NONE;
+}
+
+OGRErr OGRDXFLayer::CreateFeature( OGRFeature *poFeature )
+{
+ OGRGeometry *poGeom = poFeature->GetGeometryRef();
+ OGRErr eErr;
+
+ if( poGeom == NULL )
+ return OGRERR_FAILURE;
+
+ m_pFeatures.push_back(poFeature->Clone());
+
+/* -------------------------------------------------------------------- */
+/* Keep track of file extents. */
+/* -------------------------------------------------------------------- */
+ poDS->ExtendExtent( poGeom );
+
+ return OGRERR_NONE;
+}
+
+OGRErr OGRDXFLayer::WriteEntities( DL_Dxf* dxf, DL_WriterA* dw, int pos )
+{
+ for(size_t i = 0; i < m_pFeatures.size(); i++)
+ {
+ CPLString str;
+ str.Printf("BLK%d_%d", pos, i);
+ dw->dxfString(0, "INSERT"); //insert
+ dw->dxfString(2, str.c_str()); //begin block
+ dw->dxfString(8, GetLayerDefn()->GetName()); //layer name
+ dw->dxfInt(66, 1); //Variable attributes-follow flag (optional; default = 0); if the value of attributes-follow flag is 1, a series of attribute entities is expected to follow the insert, terminated by a seqend entity
+ dw->coord(10, 0, 0);
+ double x,y;
+
+
+ OGRGeometry* poGeom = m_pFeatures[i]->GetGeometryRef();
+ switch( wkbFlatten(poGeom->getGeometryType()) )
+ {
+ case wkbPoint:
+ {
+ OGRPoint *poOGRPoint = (OGRPoint *) poGeom;
+ x = poOGRPoint->getX();
+ y = poOGRPoint->getY();
+ }
+ break;
+ case wkbLineString:
+ {
+ OGRLineString *poLine = (OGRLineString *) poGeom;
+ // Add a 2d polyline with vertices.
+
+ OGREnvelope pEnv;
+ poLine->getEnvelope(&pEnv);
+ x = pEnv.MinX + (pEnv.MaxX - pEnv.MinX) / 2;
+ y = pEnv.MinY + (pEnv.MaxY - pEnv.MinY) / 2;
+ }
+ break;
+ case wkbPolygon:
+ {
+ OGRPolygon *poPoly = (OGRPolygon *) poGeom;
+
+ OGREnvelope pEnv;
+ poPoly->getEnvelope(&pEnv);
+ x = pEnv.MinX + (pEnv.MaxX - pEnv.MinX) / 2;
+ y = pEnv.MinY + (pEnv.MaxY - pEnv.MinY) / 2;
+ }
+ break;
+ case wkbGeometryCollection:
+ case wkbMultiPolygon:
+ case wkbMultiPoint:
+ case wkbMultiLineString:
+ {
+ OGRGeometryCollection *poColl = (OGRGeometryCollection *) poGeom;
+
+ OGREnvelope pEnv;
+ poColl->getEnvelope(&pEnv);
+ x = pEnv.MinX + (pEnv.MaxX - pEnv.MinX) / 2;
+ y = pEnv.MinY + (pEnv.MaxY - pEnv.MinY) / 2;
+ }
+ break;
+ default:
+ return OGRERR_FAILURE;
+ }
+ //attdef
+ for(int j = 0; j < m_pFeatures[i]->GetFieldCount(); j++)
+ {
+ OGRFieldDefn* FieldDef = m_pFeatures[i]->GetFieldDefnRef(j);
+ dw->dxfString(0, "ATTRIB"); //attributes definition
+ dw->dxfString(8, GetLayerDefn()->GetName()); //layer name
+ dw->coord(10, x, y);
+ dw->dxfReal(40, 0.2);
+ dw->dxfString(1, m_pFeatures[i]->GetFieldAsString(j)); //
+ dw->dxfString(2, FieldDef->GetNameRef()); //field name
+ dw->dxfInt(70, 1);
+ y -= 0.3;
+ }
+ dw->dxfString(0, "SEQEND"); //end seq
+ dw->dxfString(8, GetLayerDefn()->GetName()); //layer name
+ dw->dxfInt(62, 7);
+ }
+ return OGRERR_NONE;
+}
+
Index: ogr/ogrsf_frmts/dxf/ogr_dxf.h
===================================================================
--- ogr/ogrsf_frmts/dxf/ogr_dxf.h (revision 0)
+++ ogr/ogrsf_frmts/dxf/ogr_dxf.h (revision 0)
@@ -0,0 +1,115 @@
+/******************************************************************************
+ * Project: OpenGIS Simple Features Reference Implementation
+ * Purpose: Private definitions for OGR DXF Driver.
+ * Author: Bishop (aka Barishnikov Dmitry), polimax@mail.ru
+ *
+ ******************************************************************************
+ * Copyright (c) 2008, Bishop
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ****************************************************************************/
+
+#pragma once
+
+#include "ogrsf_frmts.h"
+#include "cpl_string.h"
+#include "dl_dxf.h"
+#include
+
+/************************************************************************/
+/* OGRDXFLayer */
+/************************************************************************/
+
+class OGRDXFDataSource;
+
+class OGRDXFLayer : public OGRLayer
+{
+protected:
+ OGRFeatureDefn *poFeatureDefn;
+ OGRDXFDataSource *poDS;
+ char **papszOptions;
+ std::vector m_pFeatures;
+ int pos;
+public:
+ OGRErr WriteBlocks( DL_Dxf* dxf, DL_WriterA* dw, int pos );
+ OGRErr WriteEntities( DL_Dxf* dxf, DL_WriterA* dw, int pos );
+ OGRErr WriteEntity( DL_Dxf* dxf, DL_WriterA* dw,OGRGeometry * poGeom, const char* lpszLayerName );
+ OGRDXFLayer( const char *pszLayerName, char **papszOptions, OGRDXFDataSource *poDS );
+ virtual ~OGRDXFLayer();
+ virtual void ResetReading();
+ virtual OGRFeature *GetNextFeature();
+ OGRFeatureDefn *GetLayerDefn() { return poFeatureDefn; }
+ virtual int TestCapability( const char *pszCap );
+ virtual OGRErr CreateField( OGRFieldDefn *poField, int bApproxOK = TRUE );
+ virtual OGRErr CreateFeature( OGRFeature *poFeature );
+};
+
+/************************************************************************/
+/* OGRDXFDataSource */
+/************************************************************************/
+
+class OGRDXFDataSource : public OGRDataSource
+{
+private:
+ friend class OGRDXFLayer;
+
+ OGRDXFLayer **papoLayers;
+ int nLayers;
+ CPLString osFilename;
+ CPLString osOutClass;
+ //char **papszOptions;
+ OGREnvelope sExtent;
+ void ExtendExtent( OGRGeometry * );
+
+ public:
+ OGRDXFDataSource( const char *pszOutClass );
+ ~OGRDXFDataSource();
+ int Create( const char *pszFilename, char **papszOptions );
+ const char *GetName(){ return osFilename; };
+ int GetLayerCount() { return nLayers; }
+ OGRLayer *GetLayer( int iLayer );
+ virtual OGRLayer *CreateLayer( const char *pszLayerName, OGRSpatialReference * = NULL,
+ OGRwkbGeometryType = wkbUnknown, char ** = NULL );
+ int TestCapability( const char * );
+private:
+ DL_Dxf dxf;
+ DL_WriterA *dw;
+ char* preAll;
+ char* preNum;
+ DL_Codes::version exportVersion;
+};
+
+/************************************************************************/
+/* OGRDXFDriver */
+/************************************************************************/
+
+class OGRDXFDriver : public OGRSFDriver
+{
+private:
+ CPLString osOutClass;
+public:
+ OGRDXFDriver( const char *pszName ){ osOutClass = pszName; };
+ virtual ~OGRDXFDriver(){};
+ virtual const char *GetName(){ return osOutClass; };
+ virtual OGRDataSource *Open( const char * pszFilename, int bUpdate );
+ virtual OGRDataSource *CreateDataSource( const char *pszFilename, char **papszOptions = NULL );
+ virtual OGRErr DeleteDataSource( const char *pszName ){return OGRERR_NONE;};
+ virtual int TestCapability( const char * pszCap );
+};
+
Index: ogr/ogrsf_frmts/dxf/GNUmakefile
===================================================================
--- ogr/ogrsf_frmts/dxf/GNUmakefile (revision 0)
+++ ogr/ogrsf_frmts/dxf/GNUmakefile (revision 0)
@@ -0,0 +1,17 @@
+
+
+include ../../../GDALmake.opt
+
+OBJ = ogr_dxf.o dl_dxf.o dl_writer_ascii.o
+
+CPPFLAGS := -I.. -I../.. $(GDAL_INCLUDE) $(CPPFLAGS) -DOGR
+
+default: $(O_OBJ:.o=.$(OBJ_EXT))
+
+clean:
+ rm -f *.o $(O_OBJ)
+
+$(O_OBJ): ogr_dxf.h dl_attributes.h dl_codes.h \
+ dl_creationadapter.h dl_creationinterface.h dl_dxf.h \
+ dl_entities.h dl_exception.h dl_extrusion.h \
+ dl_writer_ascii.h dl_writer.h
\ No newline at end of file
Index: ogr/ogrsf_frmts/generic/ogrregisterall.cpp
===================================================================
--- ogr/ogrsf_frmts/generic/ogrregisterall.cpp (revision 15528)
+++ ogr/ogrsf_frmts/generic/ogrregisterall.cpp (working copy)
@@ -149,5 +149,6 @@
#ifdef GEOCONCEPT_ENABLED
RegisterOGRGeoconcept();
#endif
+ RegisterOGRDXF();
} /* OGRRegisterAll */
Index: ogr/ogrsf_frmts/GNUmakefile
===================================================================
--- ogr/ogrsf_frmts/GNUmakefile (revision 15528)
+++ ogr/ogrsf_frmts/GNUmakefile (working copy)
@@ -2,7 +2,7 @@
include ../../GDALmake.opt
SUBDIRS-yes := \
- generic avc bna csv dgn geojson gml gmt mem kml \
+ generic avc bna csv dgn dxf geojson gml gmt mem kml \
mitab ntf gpx rec s57 sdts shape tiger vrt \
geoconcept xplane
Index: ogr/ogrsf_frmts/ogrsf_frmts.h
===================================================================
--- ogr/ogrsf_frmts/ogrsf_frmts.h (revision 15528)
+++ ogr/ogrsf_frmts/ogrsf_frmts.h (working copy)
@@ -343,6 +343,7 @@
void CPL_DLL RegisterOGRIngres();
void CPL_DLL RegisterOGRXPlane();
void CPL_DLL RegisterOGRNAS();
+void CPL_DLL RegisterOGRDXF();
CPL_C_END