⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dgndump.c

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 C
字号:
/****************************************************************************** * $Id: dgndump.c,v 1.11 2003/05/21 03:42:01 warmerda Exp $ * * Project:  Microstation DGN Access Library * Purpose:  Temporary low level DGN dumper application. * Author:   Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2000, Avenza Systems Inc, http://www.avenza.com/ * * 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. ****************************************************************************** * * $Log: dgndump.c,v $ * Revision 1.11  2003/05/21 03:42:01  warmerda * Expanded tabs * * Revision 1.10  2002/11/11 20:33:56  warmerda * add support for reporting extents * * Revision 1.9  2002/03/14 21:38:27  warmerda * pass update arg to DGNOpen * * Revision 1.8  2002/01/21 20:49:52  warmerda * added spatial search option * * Revision 1.7  2001/08/21 03:01:39  warmerda * added raw_data support * * Revision 1.6  2001/07/18 04:55:16  warmerda * added CPL_CSVID * * Revision 1.5  2001/03/07 13:56:44  warmerda * updated copyright to be held by Avenza Systems * * Revision 1.4  2001/03/07 13:49:37  warmerda * removed attribute dumping, handled by DGNDumpElement() * * Revision 1.3  2001/01/10 16:10:57  warmerda * Added extents reporting * * Revision 1.2  2000/12/28 21:27:38  warmerda * added summary report * * Revision 1.1  2000/12/14 17:11:18  warmerda * New * */#include "dgnlibp.h"CPL_CVSID("$Id: dgndump.c,v 1.11 2003/05/21 03:42:01 warmerda Exp $");static void DGNDumpRawElement( DGNHandle hDGN, DGNElemCore *psCore,                               FILE *fpOut );/************************************************************************//*                               Usage()                                *//************************************************************************/static void Usage(){    printf( "Usage: dgndump [-e xmin ymin xmax ymax] [-s] [-r n] filename.dgn\n" );    printf( "\n" );    printf( "  -e xmin ymin xmax ymax: only get elements within extents.\n" );    printf( "  -s: produce summary report of element types and levels.\n");    printf( "  -r n: report raw binary contents of elements of type n.\n");    exit( 1 );}/************************************************************************//*                                main()                                *//************************************************************************/int main( int argc, char ** argv ){    DGNHandle   hDGN;    DGNElemCore *psElement;    const char  *pszFilename = NULL;    int         bSummary = FALSE, iArg, bRaw = FALSE, bReportExtents = FALSE;    char        achRaw[64];    double      dfSFXMin=0.0, dfSFXMax=0.0, dfSFYMin=0.0, dfSFYMax=0.0;    memset( achRaw, 0, 64 );    for( iArg = 1; iArg < argc; iArg++ )    {        if( strcmp(argv[iArg],"-s") == 0 )        {            bSummary = TRUE;        }        else if( strcmp(argv[iArg],"-e") == 0 && iArg < argc-4 )        {            dfSFXMin = atof(argv[iArg+1]);            dfSFYMin = atof(argv[iArg+2]);            dfSFXMax = atof(argv[iArg+3]);            dfSFYMax = atof(argv[iArg+4]);            iArg += 4;        }        else if( strcmp(argv[iArg],"-r") == 0 && iArg < argc-1 )        {            achRaw[MAX(0,MIN(63,atoi(argv[iArg+1])))] = 1;            bRaw = TRUE;            iArg++;        }        else if( strcmp(argv[iArg],"-extents") == 0 )        {            bReportExtents = TRUE;        }        else if( argv[iArg][0] == '-' || pszFilename != NULL )            Usage();        else             pszFilename = argv[iArg];    }    if( pszFilename == NULL )        Usage();    hDGN = DGNOpen( pszFilename, FALSE );    if( hDGN == NULL )        exit( 1 );    if( bRaw )        DGNSetOptions( hDGN, DGNO_CAPTURE_RAW_DATA );    DGNSetSpatialFilter( hDGN, dfSFXMin, dfSFYMin, dfSFXMax, dfSFYMax );    if( !bSummary )    {        while( (psElement=DGNReadElement(hDGN)) != NULL )        {            DGNDumpElement( hDGN, psElement, stdout );            if( achRaw[psElement->type] != 0 )                DGNDumpRawElement( hDGN, psElement, stdout );            if( bReportExtents )            {                DGNPoint sMin, sMax;                if( DGNGetElementExtents( hDGN, psElement, &sMin, &sMax ) )                    printf( "  Extents: (%.6f,%.6f,%.6f)\n"                            "        to (%.6f,%.6f,%.6f)\n",                            sMin.x, sMin.y, sMin.z,                             sMax.x, sMax.y, sMax.z );            }            DGNFreeElement( hDGN, psElement );        }    }    else    {        const DGNElementInfo    *pasEI;        int                     nCount, i, nLevel, nType;        int                     anLevelTypeCount[128*64];        int                     anLevelCount[64];        int                     anTypeCount[128];        double                  adfExtents[6];        DGNGetExtents( hDGN, adfExtents );        printf( "X Range: %.2f to %.2f\n",                 adfExtents[0], adfExtents[3] );        printf( "Y Range: %.2f to %.2f\n",                 adfExtents[1], adfExtents[4] );        printf( "Z Range: %.2f to %.2f\n",                 adfExtents[2], adfExtents[5] );        pasEI = DGNGetElementIndex( hDGN, &nCount );        printf( "Total Elements: %d\n", nCount );                memset( anLevelTypeCount, 0, 128*64*sizeof(int) );        memset( anLevelCount, 0, 64*sizeof(int) );        memset( anTypeCount, 0, 128*sizeof(int) );        for( i = 0; i < nCount; i++ )        {            anLevelTypeCount[pasEI[i].level * 128 + pasEI[i].type]++;            anLevelCount[pasEI[i].level]++;            anTypeCount[pasEI[i].type]++;        }        printf( "\n" );        printf( "Per Type Report\n" );        printf( "===============\n" );        for( nType = 0; nType < 128; nType++ )        {            if( anTypeCount[nType] != 0 )            {                printf( "Type %s: %d\n",                         DGNTypeToName( nType ),                         anTypeCount[nType] );            }        }        printf( "\n" );        printf( "Per Level Report\n" );        printf( "================\n" );        for( nLevel = 0; nLevel < 64; nLevel++ )        {            if( anLevelCount[nLevel] == 0 )                continue;            printf( "Level %d, %d elements:\n",                     nLevel,                     anLevelCount[nLevel] );            for( nType = 0; nType < 128; nType++ )            {                if( anLevelTypeCount[nLevel * 128 + nType] != 0 )                {                    printf( "  Type %s: %d\n",                             DGNTypeToName( nType ),                             anLevelTypeCount[nLevel*128 + nType] );                }            }            printf( "\n" );        }    }    DGNClose( hDGN );    return 0;}/************************************************************************//*                         DGNDumpRawElement()                          *//************************************************************************/static void DGNDumpRawElement( DGNHandle hDGN, DGNElemCore *psCore,                                FILE *fpOut ){    int         i, iChar = 0;    char        szLine[80];    fprintf( fpOut, "  Raw Data (%d bytes):\n", psCore->raw_bytes );    for( i = 0; i < psCore->raw_bytes; i++ )    {        char    szHex[3];        if( (i % 16) == 0 )                                                     {            sprintf( szLine, "%6d: %71s", i, " " );            iChar = 0;        }        sprintf( szHex, "%02x", psCore->raw_data[i] );        strncpy( szLine+8+iChar*2, szHex, 2 );                if( psCore->raw_data[i] < 32 || psCore->raw_data[i] > 127 )            szLine[42+iChar] = '.';        else            szLine[42+iChar] = psCore->raw_data[i];        if( i == psCore->raw_bytes - 1 || (i+1) % 16 == 0 )        {            fprintf( fpOut, "%s\n", szLine );        }        iChar++;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -