主要内容

本页采用了机器翻译。点击此处可查看英文原文。

systemcomposer.sysml.Workspace

在创建工作区时缓存 SysML v2 工程快照

自 R2026a 起

    说明

    Workspace 对象是 SysML® v2 工程快照的缓存,该快照对应于创建工作区时指定的工程提交。默认使用“head”提交。

    使用 createWorkspace 函数对 systemcomposer.sysml.Project 对象创建一个工作区。

    对象函数

    getElements获取 SysML v2 工作区中的所有元素
    getRootElements获取 SysML v2 工作区中的根元素
    getElementRelationships获取关系元素
    getElement获取具有指定 ID 的元素
    getElementsByTypeAndName按类型和名称获取元素
    executeQuery执行查询
    getMembershipHierarchy获取元素所属成员层次结构中的元素
    getOwnershipHierarchy获取元素所属所有权层次结构中的元素
    getAncestors获取 SysML v2 的先代
    getDescendants获取 SysML v2 的子模型
    getUsages获取 SysML v2 的用法

    示例

    全部折叠

    本示例假设有一个名为 SysML v2 的工程,其具体内容由这段 SysML v2 文本描述。

    package test1 {
        part def myArch;
        part def subArch :> myArch;
        part def myTopArch {
          part A:subArch;
        }
    }

    如果您可以使用 SysML v2 编辑器,则可以将 SysML v2 文本发布到存储库中。

    连接到一个本地存储库。发布到存储库后,SysML v2 文本会被转换为 SysML v2 元素,您可以通过 getElements 函数访问这些元素。

    首先,连接到服务器。如果您的服务器支持通过持有者令牌进行身份验证,请将您的令牌作为 credentials 参量 systemcomposer.sysml.Repository.connect(serverUrl,credentials="my-token") 提供。

    serverUrl = 'http://vdi-abcde-123:8000';
    repo = systemcomposer.sysml.Repository.connect(serverUrl)
    repo = 
      Repository with properties:
    
        BaseUri: 'http://vdi-abcde-123:8000'

    通过调用 getProjects,您可以获取存储库中所有工程的信息。或者,如果您知道要使用的工程的 ID,也可以通过调用 getProjectById 直接获取该工程。

    allProjects = repo.getProjects();
    projectToUse = repo.getProjectById('f6deaa82-d16f-40aa-a2bb-f4b04f8e0fc6')
    projectToUse = 
      Project with properties:
    
        ResourceIdentifier: 'http://vdi-ahdsl2-016:9000/projects/f6deaa82-d16f-40aa-a2bb-f4b04f8e0fc6'
                        Id: 'f6deaa82-d16f-40aa-a2bb-f4b04f8e0fc6'
               Description: ''
                      Name: 'supers'

    要查看工程的元素,首先需要通过调用 createWorkspace 为工程中的某个指定提交创建一个工作区。如果调用 createWorkspace 时不带任何参量,则创建的工作区将锚定在默认分支的最新提交上,并检索所有元素。或者,如果您知道当前正在操作的分支,则可以通过调用 createWorkspace(branchId="123456") 来提供分支 ID。

    myFullWorkspace = projectToUse.createWorkspace()
    myFullWorkspace = 
      Workspace with no properties.

    检查工作区中元素的最简单方法是调用 getElements,该函数会列出工作区中锚定提交快照中的所有元素,并检索所有元素(如果这些元素在创建工作区时未被检索)。输出结果显示,该快照包含 17 个元素,这些元素填充了快照的本地缓存,并根据 SysML v2 元模型以图的形式组织起来。

    allElements = myFullWorkspace.getElements()
    
    allElements = 
    
      1×17 Element array with properties:
    
        meta

    现在,您可以编写代码来检查工作区的元素。例如,您可以查找所有类型为 Package 的元素。在此示例中,只有一个元素 test1 具有此类型。

    theOnlyPackage = allElements([allElements.meta] == "Package");
    theOnlyPackage.get("declaredName")
    ans = "test1"

    利用元素的 SysML v2 属性,您可以从任何元素导航至其相关元素。例如,我们可以看一下该包中的一个成员。

    allOwnedMembers = theOnlyPackage.ownedMember
    aMember = allOwnedMembers(3);
    aMember.get("declaredName")
    ans = "myTopArch"

    该成员是一个包含单个零件的零件定义。您可以找到该部件及其类型。此类型的所有者即为原始包。

    thePart = aMember.ownedPart
    thePartsType = thePart.type
    backToTheStart = thePartsType.owner == theOnlyPackage
    thePart = 
      Element with properties:
    
                            meta: "PartUsage"
                        aliasIds: []
                    declaredName: "A"
                     isComposite: 1
               declaredShortName: []
                            type: [1×1 systemcomposer.sysml.Element]
                       isPortion: 0
                      isConstant: 0
               isImpliedIncluded: 0
                       direction: []
                      isAbstract: 0
                       elementId: "d94aa221-0952-4e8e-8a66-51488d990275"
                    ownedFeature: [0×0 systemcomposer.sysml.Element]
                       isDerived: 0
                         feature: [0×0 systemcomposer.sysml.Element]
                    isSufficient: 0
                           isEnd: 0
                         variant: [0×0 systemcomposer.sysml.Element]
                    isIndividual: 0
                       isOrdered: 0
                   documentation: [0×0 systemcomposer.sysml.Element]
                        isUnique: 1
                      isVariable: 0
                     isVariation: 0
               ownedRelationship: [1×2 systemcomposer.sysml.Element]
              owningRelationship: [1×1 systemcomposer.sysml.Element]
                     portionKind: []
                      annotation: [0×0 systemcomposer.sysml.Element]
                 chainingFeature: [0×0 systemcomposer.sysml.Element]
                      definition: [1×1 systemcomposer.sysml.Element]
                 nestedAttribute: [0×0 systemcomposer.sysml.Element]
                      nestedPart: [0×0 systemcomposer.sysml.Element]
          ownedFeatureMembership: [0×0 systemcomposer.sysml.Element]
                    ownedElement: [1×1 systemcomposer.sysml.Element]
                 ownedEndFeature: [0×0 systemcomposer.sysml.Element]
            ownedFeatureChaining: [0×0 systemcomposer.sysml.Element]
                 ownedSubsetting: [0×0 systemcomposer.sysml.Element]
                     ownedImport: [0×0 systemcomposer.sysml.Element]
                     ownedMember: [1×1 systemcomposer.sysml.Element]
                     ownedTyping: [1×1 systemcomposer.sysml.Element]
                 ownedMembership: [1×1 systemcomposer.sysml.Element]
               ownedRedefinition: [0×0 systemcomposer.sysml.Element]
        ownedReferenceSubsetting: [0×0 systemcomposer.sysml.Element]
                           owner: [1×1 systemcomposer.sysml.Element]
                    typedFeature: [0×0 systemcomposer.sysml.Element]
             referenceExpression: [0×0 systemcomposer.sysml.Element]
            satisfiedRequirement: [0×0 systemcomposer.sysml.Element]
                      subsetting: [0×0 systemcomposer.sysml.Element]
           textualRepresentation: [0×0 systemcomposer.sysml.Element]
                           usage: [0×0 systemcomposer.sysml.Element]
                       valuation: [0×0 systemcomposer.sysml.Element]
    
    thePartsType = 
      Element with properties:
    
                          meta: "PartDefinition"
                      aliasIds: []
                  declaredName: "subArch"
                       variant: [0×0 systemcomposer.sysml.Element]
                  isIndividual: 0
             declaredShortName: []
                     elementId: "9c0d5f85-07cb-4013-aaec-7be7c8bc362e"
                       feature: [0×0 systemcomposer.sysml.Element]
                  isSufficient: 0
                    isAbstract: 0
             isImpliedIncluded: 0
                   isVariation: 0
             ownedRelationship: [1×1 systemcomposer.sysml.Element]
            owningRelationship: [1×1 systemcomposer.sysml.Element]
                    annotation: [0×0 systemcomposer.sysml.Element]
                 documentation: [0×0 systemcomposer.sysml.Element]
                ownedAttribute: [0×0 systemcomposer.sysml.Element]
        ownedFeatureMembership: [0×0 systemcomposer.sysml.Element]
                  ownedElement: [0×0 systemcomposer.sysml.Element]
               ownedEndFeature: [0×0 systemcomposer.sysml.Element]
                  ownedFeature: [0×0 systemcomposer.sysml.Element]
                   ownedImport: [0×0 systemcomposer.sysml.Element]
                   ownedMember: [0×0 systemcomposer.sysml.Element]
               ownedMembership: [0×0 systemcomposer.sysml.Element]
                     ownedPart: [0×0 systemcomposer.sysml.Element]
        ownedSubclassification: [1×1 systemcomposer.sysml.Element]
                         owner: [1×1 systemcomposer.sysml.Element]
         textualRepresentation: [0×0 systemcomposer.sysml.Element]
                  typedFeature: [0×0 systemcomposer.sysml.Element]
                         usage: [0×0 systemcomposer.sysml.Element]
    
    backToTheStart = logical
       1

    查看 PartUsage 元素周围的元素关系,以进一步了解这些元素之间的关联。

    elemRels = getElementRelationships(myFullWorkspace,thePart)
    elemRels = 
    
      1×3 Element array with properties:
    
        meta

    确认元素 thePart 是唯一一个类型为 PartUsage 的元素。

    queryString = '{"@type":"Query","name":"string","where":{"@type":"PrimitiveConstraint","operator":"=","property":"@type","value":["PartUsage"]}}';
    flag = isequal(getElement(myFullWorkspace,"d94aa221-0952-4e8e-8a66-51488d990275"),...
    executeQuery(work,queryString))
    flag =
    
      logical
    
       1

    编写代码是查找元素最灵活的方法,但您也可以通过查看工程的根元素来获取元素之间的关系。根元素没有所有者。在此示例中,工程仅有一个根元素,该根元素包含一个成员,即包 test1

    root = myFullWorkspace.getRootElements()
    rootMember = root.ownedMember.get("declaredName")
    root = 
      Element with properties:
    
                         meta: "Namespace"
                     aliasIds: []
                 declaredName: []
            declaredShortName: []
                   annotation: [0×0 systemcomposer.sysml.Element]
                    elementId: "2e329208-1900-4282-9229-7f5da441bee5"
            isImpliedIncluded: 0
           owningRelationship: [0×0 systemcomposer.sysml.Element]
            ownedRelationship: [1×1 systemcomposer.sysml.Element]
                documentation: [0×0 systemcomposer.sysml.Element]
                 ownedElement: [1×1 systemcomposer.sysml.Element]
                  ownedImport: [0×0 systemcomposer.sysml.Element]
                  ownedMember: [1×1 systemcomposer.sysml.Element]
              ownedMembership: [1×1 systemcomposer.sysml.Element]
                        owner: [0×0 systemcomposer.sysml.Element]
        textualRepresentation: [0×0 systemcomposer.sysml.Element]
    
    rootMember = "test1"

    您还可以查找具有指定元数据类型和名称的元素。

    theTopArch = myFullWorkspace.getElementsByTypeAndName('PartDefinition','myTopArch');
    theTopArch.get("declaredName")
    ans = "myTopArch"

    一旦某个提交的元素被放入缓存,您就可以使用 MATLAB® 来浏览该工程的元素图。不过,您也可以通过单次函数调用来获取一些元素集合。例如,您可以使用 getMembershipHierarchy 获取某个命名空间中的所有成员。返回向量中的第一个元素是源元素。反之,您可以通过调用 getOwnershipHierarchy 来获取某个元素的所有权层次结构。与之前一样,向量的第一个元素是源元素。

    myMembers = myFullWorkspace.getMembershipHierarchy(theOnlyPackage)
    myOwners = myFullWorkspace.getOwnershipHierarchy(thePart)
    myMembers = 
    
      1×7 Element array with properties:
    
        meta
    
    myOwners = 
    
      1×4 Element array with properties:
    
        meta

    SysML v2 还支持对元素进行轻松分类。您可以使用 getDescendants 方法查找某个定义的子类。在此示例中,subArch 是唯一的子类。

    myArch = myFullWorkspace.getElementsByTypeAndName('PartDefinition','myArch');
    mySubDefinitions = myFullWorkspace.getDescendants(myArch)
    mySubDefinitions(end).get("declaredName")
    mySubDefinitions = 
    
      1×2 Element array with properties:
    
        meta
    
    ans = "subArch"

    您可以通过调用 getAncestors 来查找其超类。在此示例中,myArch 是唯一的超类。

    mySuperDefinitions = myFullWorkspace.getAncestors(subArch)
    mySuperDefinitions(end).get("declaredName")
    mySuperDefinitions = 
    
      1×2 Element array with properties:
    
        meta
    
    ans = "myArch"

    您还可以使用 getUsages 方法查找给定定义的所有用法。在此工程中,只有一个定义被使用过,即 subArch,它包含一个 PartUsage A

    theOnlyUsage = myFullWorkspace.getUsages(subArch);
    theOnlyUsage.get("declaredName")
    ans = "A"

    详细信息

    全部展开

    版本历史记录

    在 R2026a 中推出