#include "stdafx.h"
#include "gdal_version.h"
#include "gdal_priv.h"
#include "gdal.h"
#include <iostream>
#include "ogrsf_frmts.h"
#include "dxf/ogr_dxf.h"
#define DYZ_DEBUG_SWITCH "ON"
#if 1
#define DYZ_TEST_DWG_FILE "D:\\code\\gdal-2.3.0\\x64\\Debug\\renwutu.dxf"
#else
#define DYZ_TEST_DWG_FILE "D:\\code\\gdal-2.3.0\\x64\\Debug\\wolunxiang.dwg"
#endif
int main()
{
GDALAllRegister();
CPLSetConfigOption("CPL_DEBUG", DYZ_DEBUG_SWITCH);
GDALDatasetH hInDS = GDALOpenEx(DYZ_TEST_DWG_FILE, GDAL_OF_VECTOR | GDAL_OF_VERBOSE_ERROR, nullptr, nullptr, nullptr);
//GDALDataset* cInDS = GDALDataset::FromHandle(hInDS);
OGRDXFDataSource* cInDS = (OGRDXFDataSource*)(hInDS);
if (NULL == cInDS)
{
return -1;
}
const char* pcDrvName = cInDS->GetDriverName();
if (NULL != pcDrvName)
{
std::cout << "Driver Name:" << pcDrvName << std::endl;
}
std::map<CPLString, DXFBlockDefinition>& blkMap = cInDS->GetBlockMap();
std::map<CPLString, DXFBlockDefinition>::iterator blkMapIter = blkMap.begin();
for (;blkMap.end() != blkMapIter; ++blkMapIter)
{
std::cout << "first:" << blkMapIter->first << ", second size:" << blkMapIter->second.apoFeatures.size() << std::endl;
std::vector<OGRDXFFeature *>::iterator dxfFtrIter = blkMapIter->second.apoFeatures.begin();
for (;blkMapIter->second.apoFeatures.end() != dxfFtrIter; ++dxfFtrIter)
{
//std::cout << " block name: " << (*dxfFtrIter)->GetBlockName() <<std::endl;
}
}
int nLayerCnt = cInDS->GetLayerCount();
int nLayerIdx = 0;
for (;nLayerIdx < nLayerCnt; ++nLayerIdx)
{
OGRLayer* curLayer = cInDS->GetLayer(nLayerIdx);
GIntBig nFtrCount = curLayer->GetFeatureCount();
OGRDXFLayer* curDxfLayer = new OGRDXFLayer((OGRDXFDataSource*)cInDS);
if (NULL == curDxfLayer)
{
continue;
}
OGRFeature * ftr = curDxfLayer->GetNextFeature();
while (ftr)
{
OGRGeometry * poGeom = ftr->GetGeometryRef();
switch (wkbFlatten(poGeom->getGeometryType()))
{
case wkbPoint:
case wkbPoint25D:
{
OGRPoint* poPS = poGeom->toPoint();
double dfDeltaX = poPS->getX();
double dfDeltaY = poPS->getY();
}
break;
case wkbLineString:
{
OGRLineString* poLS = static_cast<OGRLineString*>(poGeom);
double dfMaxSquaredLength = 0.0;
for (int i = 0; i < poLS->getNumPoints() - 1;i++)
{
double dfDeltaX = poLS->getX(i + 1) - poLS->getX(i);
double dfDeltaY = poLS->getY(i + 1) - poLS->getY(i);
double dfSquaredLength = dfDeltaX * dfDeltaX + dfDeltaY * dfDeltaY;
dfMaxSquaredLength = std::max(dfMaxSquaredLength, dfSquaredLength);
}
}
break;
case wkbPolygon:
{
OGRPolygon* poPoly = static_cast<OGRPolygon*>(poGeom);
for (int i = 0; i < poPoly->getNumInteriorRings();i++)
{
poPoly->getInteriorRing(i);
}
}
break;
case wkbMultiPolygon:
{
OGRMultiPolygon* poMP = static_cast<OGRMultiPolygon*>(poGeom);
for (int i = 0; i < poMP->getNumGeometries();i++)
{
poMP->getGeometryRef(i);
}
}
break;
}
ftr = curDxfLayer->GetNextFeature();
}
delete curDxfLayer;
}
GDALClose(hInDS);
return 0;
}
#include "gdal_version.h"
#include "gdal_priv.h"
#include "gdal.h"
#include <iostream>
#include "ogrsf_frmts.h"
#include "dxf/ogr_dxf.h"
#define DYZ_DEBUG_SWITCH "ON"
#if 1
#define DYZ_TEST_DWG_FILE "D:\\code\\gdal-2.3.0\\x64\\Debug\\renwutu.dxf"
#else
#define DYZ_TEST_DWG_FILE "D:\\code\\gdal-2.3.0\\x64\\Debug\\wolunxiang.dwg"
#endif
int main()
{
GDALAllRegister();
CPLSetConfigOption("CPL_DEBUG", DYZ_DEBUG_SWITCH);
GDALDatasetH hInDS = GDALOpenEx(DYZ_TEST_DWG_FILE, GDAL_OF_VECTOR | GDAL_OF_VERBOSE_ERROR, nullptr, nullptr, nullptr);
//GDALDataset* cInDS = GDALDataset::FromHandle(hInDS);
OGRDXFDataSource* cInDS = (OGRDXFDataSource*)(hInDS);
if (NULL == cInDS)
{
return -1;
}
const char* pcDrvName = cInDS->GetDriverName();
if (NULL != pcDrvName)
{
std::cout << "Driver Name:" << pcDrvName << std::endl;
}
std::map<CPLString, DXFBlockDefinition>& blkMap = cInDS->GetBlockMap();
std::map<CPLString, DXFBlockDefinition>::iterator blkMapIter = blkMap.begin();
for (;blkMap.end() != blkMapIter; ++blkMapIter)
{
std::cout << "first:" << blkMapIter->first << ", second size:" << blkMapIter->second.apoFeatures.size() << std::endl;
std::vector<OGRDXFFeature *>::iterator dxfFtrIter = blkMapIter->second.apoFeatures.begin();
for (;blkMapIter->second.apoFeatures.end() != dxfFtrIter; ++dxfFtrIter)
{
//std::cout << " block name: " << (*dxfFtrIter)->GetBlockName() <<std::endl;
}
}
int nLayerCnt = cInDS->GetLayerCount();
int nLayerIdx = 0;
for (;nLayerIdx < nLayerCnt; ++nLayerIdx)
{
OGRLayer* curLayer = cInDS->GetLayer(nLayerIdx);
GIntBig nFtrCount = curLayer->GetFeatureCount();
OGRDXFLayer* curDxfLayer = new OGRDXFLayer((OGRDXFDataSource*)cInDS);
if (NULL == curDxfLayer)
{
continue;
}
OGRFeature * ftr = curDxfLayer->GetNextFeature();
while (ftr)
{
OGRGeometry * poGeom = ftr->GetGeometryRef();
switch (wkbFlatten(poGeom->getGeometryType()))
{
case wkbPoint:
case wkbPoint25D:
{
OGRPoint* poPS = poGeom->toPoint();
double dfDeltaX = poPS->getX();
double dfDeltaY = poPS->getY();
}
break;
case wkbLineString:
{
OGRLineString* poLS = static_cast<OGRLineString*>(poGeom);
double dfMaxSquaredLength = 0.0;
for (int i = 0; i < poLS->getNumPoints() - 1;i++)
{
double dfDeltaX = poLS->getX(i + 1) - poLS->getX(i);
double dfDeltaY = poLS->getY(i + 1) - poLS->getY(i);
double dfSquaredLength = dfDeltaX * dfDeltaX + dfDeltaY * dfDeltaY;
dfMaxSquaredLength = std::max(dfMaxSquaredLength, dfSquaredLength);
}
}
break;
case wkbPolygon:
{
OGRPolygon* poPoly = static_cast<OGRPolygon*>(poGeom);
for (int i = 0; i < poPoly->getNumInteriorRings();i++)
{
poPoly->getInteriorRing(i);
}
}
break;
case wkbMultiPolygon:
{
OGRMultiPolygon* poMP = static_cast<OGRMultiPolygon*>(poGeom);
for (int i = 0; i < poMP->getNumGeometries();i++)
{
poMP->getGeometryRef(i);
}
}
break;
}
ftr = curDxfLayer->GetNextFeature();
}
delete curDxfLayer;
}
GDALClose(hInDS);
return 0;
}