[CE VBA] Select shared cells on level

Hi,

this is sample of code that I use in v8i for selecting shared cell elements on specified level. I'm trying to migrate code to CE but it seems that all shared cells from all levels are found. Workaround is to test level of every shared cell in file.
Is this some change in VBA or is this a bug? Also, I'm using Map PowerView so I'm not sure if same happens in Microstation.

Sub test()

        ActiveModelReference.UnselectAllElements


        Dim ee As ElementEnumerator

        Dim esk As New ElementScanCriteria
        Set esk = New ElementScanCriteria
        esk.ExcludeAllTypes
        esk.IncludeType msdElementTypeSharedCell
        esk.ExcludeAllLevels
        esk.IncludeLevel ActiveDesignFile.Levels.Item("8_tocke")
        Set ee = ActiveModelReference.Scan(esk)

        Dim num As Long
        num = 0
        ee.Reset

        While ee.MoveNext
        
            If ee.Current.IsSharedCellElement Then
                num = num + 1
                Debug.Print ee.Current.AsSharedCellElement.level.Name
                ActiveModelReference.SelectElement ee.Current
            
            
            End If
        
        Wend
        
        MsgBox num

End Sub

Parents Reply Children
  • Hi Brien,

    unless a shared cell instance has it's level override set, the level of the instance isn't used

    thanks for "internal implementation" note.

    On the other hand, I think VBA users are not aware of these features (as not described anywhere, as far as I know), and thei approach is simpler and more straightforward: When level is assigned to shared cell instance and displayed in MicroStation GUI ...

    ... how to search these instances?

    BTW The cell on the picture is identified at level "moje_vrstva" when the header is selected (or displayed in Element Properties dialog), because it was active level when the cell was placed. But the cell content is placed on another level, as defined in shared cell definition. Is it the situation you talk about, when "level override" is mentioned?

    Regards,

      Jan

  • The details tab shows the overrides.

    If you use the "Change Attributes" tool on a shared cell instance it will set the appropriate override flags.

    If I remember correctly, back in V7 when there were only 63 levels, a "level mask" was stored on the shared cell instance so that the scanner could efficiently check level criteria.

    Since the number of levels is no longer fixed, there is no longer a level mask stored on the element. As such shared cells are no longer rejected on level criteria by the scanner (unless I assume, but did not test, the level override is set).

    Shared cells have a further complication called "relative levels" where the effective level of the sc def components is determined by using the component's level id as an offset from the instance's level; this really only applies/works for shared cells that came from V7 where levels are 0-63.

    Since a shared cell can display components on different levels, it's not clear to me what "select shared cells on a particular level" means. If you have hundreds of instances of a particular shared cell, you certainly don't want to be reading the sc definition hundreds of times (once for each instance) in order to check the component levels.

    -B



  • Hi Brien,

    as usually, thanks a lot for the detailed explanation!

    it's not clear to me what "select shared cells on a particular level" means.

    This thread is not my question, but what I see in my customers, is they mean the level displayed in Element Properties dialog. In other words, the level of the cell header (active level when the cell was placed):

    I agree that, when the cell is spread over more levels, such searching may not be logical, because it does not query the cell content, but e.g. my customers use typically cell where everything is in one level. And even when spread over more levels, the visibility is controlled by this one level, so it's intuitive.

    With regards,

      Jan