📄 dgnhelp.cpp
字号:
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 + -