Modeler CLI viz to get specific parts view

Hi,

First of all - thanks for this amazing tool. Finally together with sysmlv2 it made crafting all models less “clicky” and more sustainable via textual notation. Now about the problem I am facing (I am not sure either it’s syside issue, or the lack of sysmlv2 knowledge on my side, or in general current sysmlv2 limitation).

I have a model, that have nested parts. Some of these parts have ports, and ports are connected through specific interfaces. I want a view that shows only parts that have these specific ports and corresponding interfaces. Played with filter, but either I get full blown diagram, or I get empty diagram. Any ideas how to achieve it?

Find my model example below:

package ViewFilterDemo {

    // ---- definitions -----------------------------------------------------

    port def DataPort;
    port def PowerPort;

    interface def DataLink {
        end a : DataPort;
        end b : DataPort;
    }
    interface def PowerLink {
        end supply : PowerPort;
        end consumer : PowerPort;
    }

    part def Controller {
        port data : DataPort;
        port power : PowerPort;
    }
    part def Sensor {
        port data : DataPort;
        port power : PowerPort;
    }
    part def Battery {
        port power : PowerPort;
    }

    // ---- system ----------------------------------------------------------

    part system {
        part controller : Controller;
        part sensor : Sensor;
        part battery : Battery;

        interface : DataLink connect sensor.data to controller.data;
        interface : PowerLink connect battery.power to controller.power;
        interface : PowerLink connect battery.power to sensor.power;
    }

    // ---- goal: a stakeholder view showing ONLY the data architecture ----
    // Controller and sensor connected over DataLink interface, no PowerLink

    view dataViewInclude {
        expose system::**;
        filter ???????????????;
        render Views::asInterconnectionDiagram;
    }
}

Hi, filter conditions need to be model-level evaluable as they run during import resolution. A model-level evaluable expression can only refer to metadata, which user-defined types like DataLink are not.

To achieve more granular filtering, you can adopt metadata tags or SemanticMetadata. Here’s an example:

interface dataLinks : DataLink[*] nonunique;
interface powerLinks : PowerLink[*] nonunique;

metadata def <DATA_INTF> DataInterface :> Metaobjects::SemanticMetadata {
     :>> baseType = dataLinks meta SysML::Usage;
}
metadata def <POWER_INTF> PowerInterface :> Metaobjects::SemanticMetadata {
     :>> baseType = powerLinks meta SysML::Usage;
}

Semantic metadata has the benefit of implicitly specializing your elements, which means instead of interface : DataLink you would write:

#DATA_INTF interface connect sensor.data to controller.data;
#POWER_INTF interface connect battery.power to controller.power;
#POWER_INTF interface connect battery.power to sensor.power;

This allows using the metadata tags directly in filter expressions, e.g.

view dataViewInclude {
    expose system::**;
    filter not @POWER_INTF;
    render Views::asInterconnectionDiagram;
}

You can extend this line of thinking to control at whatever granularity is suitable, even using regular metadata definitions to group tags.

Full Example
package ViewFilterDemo {

    // ---- metadata definitions --------------------------------------------

    abstract metadata def DATA;
    abstract metadata def POWER;
    interface dataLinks : DataLink [*] nonunique;
    interface powerLinks : PowerLink [*] nonunique;
    port dataPorts : DataPort [*] nonunique;
    port powerPorts : PowerPort [*] nonunique;

    metadata def <DATA_INTF> DataInterface :> Metaobjects::SemanticMetadata, DATA {
        :>> baseType = dataLinks meta SysML::Usage;
    }
    metadata def <POWER_INTF> PowerInterface :> Metaobjects::SemanticMetadata, POWER {
        :>> baseType = powerLinks meta SysML::Usage;
    }
    metadata def DATA_PORT :> Metaobjects::SemanticMetadata, DATA {
        :>> baseType = dataPorts meta SysML::Usage;
    }
    metadata def POWER_PORT :> Metaobjects::SemanticMetadata, POWER {
        :>> baseType = powerPorts meta SysML::Usage;
    }

    // ---- definitions -----------------------------------------------------

    port def DataPort;
    port def PowerPort;

    interface def DataLink {
        end #DATA_PORT port a;
        end #DATA_PORT port b;
    }
    interface def PowerLink {
        end #POWER_PORT port supply;
        end #POWER_PORT port consumer;
    }

    abstract part def Powered { #POWER_PORT port power; }
    abstract part def Networked { #DATA_PORT port data; }

    part def Controller :> Powered, Networked;
    part def Sensor :> Powered, Networked;
    part def Battery :> Powered;

    // ---- system ----------------------------------------------------------

    part system {
        part controller : Controller;
        part sensor : Sensor;
        part battery : Battery;

        #DATA_INTF interface connect sensor.data to controller.data;
        #POWER_INTF interface connect battery.power to controller.power;
        #POWER_INTF interface connect battery.power to sensor.power;
    }

    // ---- goal: a stakeholder view showing ONLY the data architecture ----
    // Controller and sensor connected over DataLink interface, no PowerLink

    view dataViewInclude {
        expose system::**;
        filter not (@ POWER);
        render Views::asInterconnectionDiagram;
    }
} // package ViewFilterDemo