[CONNECT C++] Element Handlers

Hi all,

First of all, let me apologize in advance if this comes across as a little incoherent. I'll do my best to state what I am trying to achieve.

I am trying to develop an application that can place a series of cell elements linearly. Which is easy enough, and I can accomplish this no problem.
I would then like to be able to use the standard MicroStation selection tool to select one or all of my series of cell elements and for MicroStation to display my own custom manipulators on top of these elements (I believe this can be done using view decorations and transient elements, etc.).

What I don't quite get is what is the best way to recognize these elements as a special type of element that should display my manipulators while my application is running.
Do I need to monitor element selection events and check each cell element for some piece of data that tells me that it belongs to my application, and then create the manipulators on screen.

Or, preferably, can I use the element handler classes to create my own special type of element (which inherits from cell elements) that I can provide callbacks to my own functions to handle displaying manipulators, etc.

Any pointers as to where I can find more information would be great.

Thanks
Liam

Parents
  • Hi Liam,

    in my opinion there are several independent development topics mentioned in your post and they can be discussed, implemented and tested separately:

    Unknown said:
    Or, preferably, can I use the element handler classes to create my own special type of element

    As far as I know it's not possible to implement own ElementHandler for normal 3rd party developers. The handlers define MicroStation elements behavior, so to create own one predicates to introduce own element type ... and it's probably what is not supported (and what is quite bad idea in my opinion).

    Unknown said:
    that I can provide callbacks to my own functions to handle displaying manipulators, etc.

    You can do it (not sure if for all scenarios) with existing API also.

    Unknown said:
    Any pointers as to where I can find more information would be great.

    Ideas presented by Jon is the way you should think about.

    And some my ideas (and mostly ideas only, because I have not done similar topics in CONNECT Edition yet):

    • To create "own type". I agree with Jon XAttributes can be the right solution. It allows to add own data in own structure, so you can easily identify if a particular cell is your element or not. To use XAttributes, you have to ask Bentley for IDm so you data can be identified. Alternatively you can create ECSchema and attach ECClass instance to elements. Advantage of ECSchema approach is no ID is required, because data are stored as XAttributes with "ECSchema" ID and you can also utilise an ability to display some data in a standardized way in Properties dialog (e.g. to override element type name "Cell" by own one "My element type").
    • To identify own type. Try to implement e.g. modification tool to verify you are able to locate all related elements based on one identified.
    • To monitor Select Element tool (changes in selection set). I am not sure how to use DgnElementSetTool to monitor if selection set was changed, but I assume there is some way using ElementAgenda and own listener. In the past it was possible (and I guess it still exists in CONNECT Edition) using mdlLocate_setFunction and LOCATE_SELECT_CMD.
    • To add own manipulators: Have no idea there, but view decorators seem to be the right way (transient elements are obsolete).

    With regards,

      Jan

    Answer Verified By: wilks 

Reply
  • Hi Liam,

    in my opinion there are several independent development topics mentioned in your post and they can be discussed, implemented and tested separately:

    Unknown said:
    Or, preferably, can I use the element handler classes to create my own special type of element

    As far as I know it's not possible to implement own ElementHandler for normal 3rd party developers. The handlers define MicroStation elements behavior, so to create own one predicates to introduce own element type ... and it's probably what is not supported (and what is quite bad idea in my opinion).

    Unknown said:
    that I can provide callbacks to my own functions to handle displaying manipulators, etc.

    You can do it (not sure if for all scenarios) with existing API also.

    Unknown said:
    Any pointers as to where I can find more information would be great.

    Ideas presented by Jon is the way you should think about.

    And some my ideas (and mostly ideas only, because I have not done similar topics in CONNECT Edition yet):

    • To create "own type". I agree with Jon XAttributes can be the right solution. It allows to add own data in own structure, so you can easily identify if a particular cell is your element or not. To use XAttributes, you have to ask Bentley for IDm so you data can be identified. Alternatively you can create ECSchema and attach ECClass instance to elements. Advantage of ECSchema approach is no ID is required, because data are stored as XAttributes with "ECSchema" ID and you can also utilise an ability to display some data in a standardized way in Properties dialog (e.g. to override element type name "Cell" by own one "My element type").
    • To identify own type. Try to implement e.g. modification tool to verify you are able to locate all related elements based on one identified.
    • To monitor Select Element tool (changes in selection set). I am not sure how to use DgnElementSetTool to monitor if selection set was changed, but I assume there is some way using ElementAgenda and own listener. In the past it was possible (and I guess it still exists in CONNECT Edition) using mdlLocate_setFunction and LOCATE_SELECT_CMD.
    • To add own manipulators: Have no idea there, but view decorators seem to be the right way (transient elements are obsolete).

    With regards,

      Jan

    Answer Verified By: wilks 

Children