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

📄 dgnhelp.cpp

📁 在Linux环境下读写DGN文件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
      case DGNST_COLORTABLE:      {          DGNElemColorTable *psCT = (DGNElemColorTable *) psElement;          int			i;          fprintf( fp, "  screen_flag: %d\n", psCT->screen_flag );          for( i = 0; i < 256; i++ )          {              fprintf( fp, "  %3d: (%3d,%3d,%3d)\n",                       i,                        psCT->color_info[i][0],                        psCT->color_info[i][1],                        psCT->color_info[i][2] );          }      }      break;      case DGNST_TCB:      {          DGNElemTCB *psTCB = (DGNElemTCB *) psElement;          int iView;          fprintf( fp, "  dimension = %d\n", psTCB->dimension );          fprintf( fp, "  uor_per_subunit = %ld, subunits = `%s'\n",                   psTCB->uor_per_subunit, psTCB->sub_units );          fprintf( fp, "  subunits_per_master = %ld, master units = `%s'\n",                   psTCB->subunits_per_master, psTCB->master_units );          fprintf( fp, "  origin = (%.5f,%.5f,%.5f)\n",                    psTCB->origin_x,                   psTCB->origin_y,                   psTCB->origin_z );          for( iView = 0; iView < 8; iView++ )          {              DGNViewInfo *psView = psTCB->views + iView;                            fprintf(fp,                       "  View%d: flags=%04X, levels=%02X%02X%02X%02X%02X%02X%02X%02X\n",                      iView,                      psView->flags,                       psView->levels[0],                      psView->levels[1],                      psView->levels[2],                      psView->levels[3],                      psView->levels[4],                      psView->levels[5],                      psView->levels[6],                      psView->levels[7] );              fprintf(fp,                       "        origin=(%g,%g,%g)\n        delta=(%g,%g,%g)\n",                       psView->origin.x, psView->origin.y, psView->origin.z,                      psView->delta.x, psView->delta.y, psView->delta.z );          }      }      break;      case DGNST_TAG_SET:      {          DGNElemTagSet	*psTagSet = (DGNElemTagSet*) psElement;          int            iTag;          fprintf( fp, "  tagSetName=%s, tagSet=%d, tagCount=%d, flags=%d\n",                    psTagSet->tagSetName, psTagSet->tagSet,                    psTagSet->tagCount, psTagSet->flags );          for( iTag = 0; iTag < psTagSet->tagCount; iTag++ )          {              DGNTagDef *psTagDef = psTagSet->tagList + iTag;              fprintf( fp, "    %d: name=%s, type=%d, prompt=%s",                        psTagDef->id, psTagDef->name, psTagDef->type,                        psTagDef->prompt );              if( psTagDef->type == 1 )                  fprintf( fp, ", default=%s\n",                            psTagDef->defaultValue.string );              else if( psTagDef->type == 3 || psTagDef->type == 5 )                  fprintf( fp, ", default=%d\n",                            psTagDef->defaultValue.integer );              else if( psTagDef->type == 4 )                  fprintf( fp, ", default=%g\n",                            psTagDef->defaultValue.real );              else                  fprintf( fp, ", default=<unknown>\n" );          }      }      break;      case DGNST_TAG_VALUE:      {          DGNElemTagValue *psTag = (DGNElemTagValue*) psElement;          fprintf( fp, "  tagType=%d, tagSet=%d, tagIndex=%d, tagLength=%d\n",                    psTag->tagType, psTag->tagSet, psTag->tagIndex,                    psTag->tagLength );          if( psTag->tagType == 1 )              fprintf( fp, "  value=%s\n", psTag->tagValue.string );          else if( psTag->tagType == 3 )              fprintf( fp, "  value=%d\n", psTag->tagValue.integer );          else if( psTag->tagType == 4 )              fprintf( fp, "  value=%g\n", psTag->tagValue.real );      }      break;      default:        break;    }    if( psElement->attr_bytes > 0 )    {        int iLink;        fprintf( fp, "Attributes (%d bytes):\n", psElement->attr_bytes );                for( iLink = 0; TRUE; iLink++ )        {            int nLinkType, nEntityNum=0, nMSLink=0, nLinkSize, i;            unsigned char *pabyData;            pabyData = DGNGetLinkage( hDGN, psElement, iLink, &nLinkType,                                       &nEntityNum, &nMSLink, &nLinkSize );            if( pabyData == NULL )                break;            fprintf( fp, "Type=0x%04x", nLinkType );            if( nMSLink != 0 || nEntityNum != 0 )                fprintf( fp, ", EntityNum=%d, MSLink=%d",                          nEntityNum, nMSLink );            fprintf( fp, "\n  0x" );            for( i = 0; i < nLinkSize; i++ )                fprintf( fp, "%02x", pabyData[i] );            fprintf( fp, "\n" );                    }    }}/************************************************************************//*                           DGNTypeToName()                            *//************************************************************************//** * Convert type to name. * * Returns a human readable name for an element type such as DGNT_LINE. * * @param nType the DGNT_* type code to translate. * * @return a pointer to an internal string with the translation.  This string * should not be modified or freed. */const char *DGNTypeToName( int nType ){    static char	szNumericResult[16];    switch( nType )    {      case DGNT_CELL_LIBRARY:        return "Cell Library";              case DGNT_CELL_HEADER:        return "Cell Header";              case DGNT_LINE:        return "Line";              case DGNT_LINE_STRING:        return "Line String";      case DGNT_GROUP_DATA:        return "Group Data";      case DGNT_SHAPE:        return "Shape";              case DGNT_TEXT_NODE:        return "Text Node";      case DGNT_DIGITIZER_SETUP:        return "Digitizer Setup";              case DGNT_TCB:        return "TCB";              case DGNT_LEVEL_SYMBOLOGY:        return "Level Symbology";              case DGNT_CURVE:        return "Curve";              case DGNT_COMPLEX_CHAIN_HEADER:        return "Complex Chain Header";              case DGNT_COMPLEX_SHAPE_HEADER:        return "Complex Shape Header";              case DGNT_ELLIPSE:        return "Ellipse";              case DGNT_ARC:        return "Arc";              case DGNT_TEXT:        return "Text";      case DGNT_BSPLINE:        return "B-Spline";      case DGNT_APPLICATION_ELEM:        return "Application Element";      case DGNT_SHARED_CELL_DEFN:        return "Shared Cell Definition";              case DGNT_SHARED_CELL_ELEM:        return "Shared Cell Element";              case DGNT_TAG_VALUE:        return "Tag Value";              default:        sprintf( szNumericResult, "%d", nType );        return szNumericResult;    }}/************************************************************************//*                         DGNGetAttrLinkSize()                         *//************************************************************************//** * Get attribute linkage size.  * * Returns the size, in bytes, of the attribute linkage starting at byte * offset nOffset.  On failure a value of 0 is returned. * * @param hDGN the file from which the element originated. * @param psElement the element to report on. * @param nOffset byte offset within attribute data of linkage to check. * * @return size of linkage in bytes, or zero.  */int DGNGetAttrLinkSize( DGNHandle hDGN, DGNElemCore *psElement,                         int nOffset ){    if( psElement->attr_bytes < nOffset + 4 )        return 0;    /* DMRS Linkage */    if( (psElement->attr_data[nOffset+0] == 0          && psElement->attr_data[nOffset+1] == 0)        || (psElement->attr_data[nOffset+0] == 0             && psElement->attr_data[nOffset+1] == 0x80) )        return 8;    /* If low order bit of second byte is set, first byte is length */    if( psElement->attr_data[nOffset+1] & 0x10 )        return psElement->attr_data[nOffset+0] * 2 + 2;    /* unknown */    return 0;}/************************************************************************//*                           DGNGetLinkage()                            *//************************************************************************//** * Returns requested linkage raw data.  * * A pointer to the raw data for the requested attribute linkage is returned * as well as (potentially) various information about the linkage including * the linkage type, database entity number and MSLink value, and the length * of the raw linkage data in bytes. * * If the requested linkage (iIndex) does not exist a value of zero is  * returned. * * The entity number is (loosely speaking) the index of the table within * the current database to which the MSLINK value will refer.  The entity * number should be used to lookup the table name in the MSCATALOG table.  * The MSLINK value is the key value for the record in the target table.  * * @param hDGN the file from which the element originated. * @param psElement the element to report on. * @param iIndex the zero based index of the linkage to fetch. * @param pnLinkageType variable to return linkage type.  This may be one of * the predefined DGNLT_ values or a different value. This pointer may be NULL. * @param pnEntityNum variable to return the entity number in or NULL if not * required.   * @param pnMSLink variable to return the MSLINK value in, or NULL if not  * required. * @param pnLength variable to returned the linkage size in bytes or NULL. *  * @return pointer to raw internal linkage data.  This data should not be * altered or freed.  NULL returned on failure.  */unsigned char *DGNGetLinkage( DGNHandle hDGN, DGNElemCore *psElement,                               int iIndex, int *pnLinkageType,                              int *pnEntityNum, int *pnMSLink, int *pnLength )    {    int nAttrOffset;    int iLinkage, nLinkSize;    for( iLinkage=0, nAttrOffset=0;         (nLinkSize = DGNGetAttrLinkSize( hDGN, psElement, nAttrOffset)) != 0;         iLinkage++, nAttrOffset += nLinkSize )    {        if( iLinkage == iIndex )        {            int  nLinkageType=0, nEntityNum=0, nMSLink = 0;            CPLAssert( nLinkSize > 4 );            if( psElement->attr_data[nAttrOffset+0] == 0x00                && (psElement->attr_data[nAttrOffset+0] == 0x00                    || psElement->attr_data[nAttrOffset+0] == 0x80) )            {                nLinkageType = DGNLT_DMRS;                nEntityNum = psElement->attr_data[nAttrOffset+2]                     + psElement->attr_data[nAttrOffset+3] * 256;                nMSLink = psElement->attr_data[nAttrOffset+4]                     + psElement->attr_data[nAttrOffset+5] * 256                    + psElement->attr_data[nAttrOffset+6] * 65536;            }            else                nLinkageType = psElement->attr_data[nAttrOffset+2]                     + psElement->attr_data[nAttrOffset+3] * 256;            // Possibly an external database linkage?            if( nLinkSize == 16 && nLinkageType != DGNLT_SHAPE_FILL )            {                nEntityNum = psElement->attr_data[nAttrOffset+6]                     + psElement->attr_data[nAttrOffset+7] * 256;                nMSLink = psElement->attr_data[nAttrOffset+8]                     + psElement->attr_data[nAttrOffset+9] * 256                    + psElement->attr_data[nAttrOffset+10] * 65536                    + psElement->attr_data[nAttrOffset+11] * 65536 * 256;                            }            if( pnLinkageType != NULL )                *pnLinkageType = nLinkageType;            if( pnEntityNum != NULL )                *pnEntityNum = nEntityNum;            if( pnMSLink != NULL )                *pnMSLink = nMSLink;            if( pnLength != NULL )                *pnLength = nLinkSize;            return psElement->attr_data + nAttrOffset;        }    }                 return NULL;}

⌨️ 快捷键说明

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