Detecting a Cached Saved View Attachment in MicroStation CONNECT

Hi All,

I have some legacy VBA code from v8i that I'm trying to port over to the CONNECT versions - it's using a CExpression with a pointer into the referenceFile struct for a specific reference:

Private Declare PtrSafe Function mdlRefFile_getInfo Lib "stdmdlbltin.dll" (ByVal modelRef As LongLong) As LongLong //Declare MDL Function

//Do other stuff

RefInfoP = mdlRefFile_getInfo(modelRef:=oRef.MdlModelRefP) //Get a Pointer to the Reference File

strRefName = "((struct referenceFile *)" & RefInfoP & ")" //Construct the beginning of the CExpression

iCacheValue = GetCExpressionValue(CExpression:=strRefName & "->display.flags.hiddenLineCaching") //Grab the value from the nested members of the struct

This is from the refernce.h header file included with the v8i SDK:

struct  referenceFile
    {
    File_id_desc            file_id;                    /* file identification */
    Ref_display             display;                    /* display information */
    Ref_attach_desc         attach;                     /* attachment description */
    Clip_desc               clip;                       /* clipping descriptor(points separate) */
    UInt32                  *colorMap_deprecated[2];    /* DEPRECATED: element to screen color mappings */
    RefLevelMasks           levelMask;                  /* Level mask */
    MSElementDescrP         readOnlyRefAttachEdP;       /* Attachment descriptor for reference attached during readonly session */
    MiscellaneousRefData    *extraDataP;                /* variable sized part of reference structure. More can be added to it. */
    void                    *additionalDataP[2];        /* Future use */
    };

The struct Ref_display named "display" contains the variable I want, "hiddenLineCaching".

The v8i code generates an error "expected struct/union name" when running in CONNECT, so I went hunting through the documentation.

I think I know (from what I can gather) that the MicrostationAPI has superseded MDL, so looking at the documentation and headers in the CONNECT SDK I found the struct Bentley::DgnPlatform::DgnAttachment.

In the header DgnAttachment.h is a similar struct to what was nested within the original referenceFile struct:

struct  RefDisplayFlags
    {
    UInt32      symbologySet:1;                 //!< The symbology has been set.
    UInt32      hiliteBoundary:1;               //!< Hilite the clip boundary when the DgnAttachment is selected in the reference dialog box (not persistent).
    UInt32      displayHilitedManip:1;          //!< Hilite all elements in the DgnAttachment when the DgnAttachment is the subject of a DgnAttachmnet manipulation command.
    UInt32      displayHilitedSelected:1;       //!< Hilite all elements in the DgnAttachment when the DgnAttachment is selected in the reference dialog box (not persitent).
    UInt32      dontUpdateChildren:1;           //!< Don't display child references (not persistent).
    UInt32      redundant:1;                    //!< This display of this DgnAttachment is the the same as another in the tree of DgnAttachments, so it is not displayed (not persistent).
    UInt32      missingModel:1;                 //!< The file for this DgnAttachment is found, but the model is not (not persistent).
    UInt32      rightNotGranted:1;              //!< The file is found, but we don't have View permissions (not persistent).
    UInt32      namedGroupFound:1;              //!< There is a named group limiting display to only members of that named group (not persistent).
    UInt32      revisionNotAvailable:1;         //!< There is a History revision specified, but that revision was not found in the file (not persistent).
    UInt32      resolvedHistoryTag:1;           //!< A revision is specfied as a tag and found.
    UInt32      revisionFromParent:1;           //!< The revision came from a parent history tag.
    UInt32      findModelByID:1;                //!< Use file_id.modelId to find the target model.
    UInt32      missingGeoCoordApp:1;           //!< This is a Geo referenced attachment, but the GeoCoord capabilities are not available.
    UInt32      missingGeoCoordSys:1;           //!< This is a Geo referenced attachment, but there is no GCS in either the parent model or the DgnAttachment model.
    UInt32      isCircular:1;                   //!< This is a circular reference? (Usually, such a DgnAttachment is not loaded at all).
    UInt32      calculatedTransformUsed:1;      //!< The DgnAttachment is set to be GeoCoord reprojected, but DgnPlatform was were able to substitue an identical linear transform.
    UInt32      namedGroupProcessingComplete:1; //!< We have done the named group processing for this reference already.
    UInt32      hiddenLineCaching:2;            //!< How hidden lines are saved in the file (stored in linkage).
    UInt32      proxyCacheSynchOption:2;
    UInt32      dontAddRefClip:1;
    UInt32      unused:9;
    };

I can see this contains the variable I want to access: hiddenLineCaching.

I have amended the CExpression thus:

 strRefName = "((struct Bentley::DgnPlatform::DgnAttachment *)" & RefInfoP & ")"
 
 iCacheValue = GetCExpressionValue(CExpression:=strRefName & "->RefDisplayFlags.hiddenLineCaching")

When this runs I receive an error "expected struct/union name".

Reading through the documentation it seems that not all structs are published / accessible, and I'm a long way from a C++ expert, so I'm stumped.

I can't figure out what struct I need to access and get the members of.

Any insight would be greatly appreciated.


Related problem is changing the slot number as well:

strRfName = "((struct referenceFile *)" & RefInfoP & ")"

lngSlotNumber = GetCExpressionValue(CExpression:=strRfName & "->file_id.referenceNum")

I haven't looked into this yet, but the struct is the same, so also doesn't work.

Parents Reply Children
No Data