5

客观的:

首先,我应该说我想做什么,然后我将在下一个(描述)部分描述我为实现我的目标所做的工作。

我想从功能区插入选项卡中图表部件部分的普通容器创建自定义列表形状。然后,我想创建另一个主形状,它可以用作Created Custom List Master Shape的成员形状

换句话说,我想将创建的主形状添加到我的自定义列表主形状中,就像将成员和分隔符主形状附加到UML 模板的类主形状中一样。

所以,我在实现我的目标方面遇到了一些问题,我在接下来的部分中将对其进行描述。


说明:

在“Visio Stencil (.vssx)”文件中创建了一些新的主形状,如下所示:

新创建的主控形状与使用的主控形状

图 1 - 新创建的主控形状与使用的主控形状

  1. 属性主形状(绿框):从UML 类模板(蓝框)的成员主形状创建。
  2. 对象主形状(红色框):从功能区插入选项卡中图表部件部分的普通容器创建。

创建属性主形状以用作对象主形状中的成员形状,就像在 UML 模板的类主形状中使用的成员主形状一样。

类主形状及其初始成员

图 2 - 类主形状及其初始成员

从成员主形状创建的属性主形状已更改如下:

  • 我向其中添加了一个形状数据(图 3)。

    图 3 - Property Master Shape 的“Shape Data”对话框

  • 我向其中添加了一个数据图形项(图 4)。

    图 4 - 属性主形状的“数据图形”和“数据图形项”对话框

  • 我在 ShapeSheet 窗口用户定义单元格部分更改了“User.MemberName”公式,如下所示(图 5):

    =MID(SUBSTITUTE(TRIM(SHAPETEXT(TheText)),"[",""),1,FIND(" ",SUBSTITUTE(TRIM(SHAPETEXT(TheText)),"[",""))-1)

    代替:

    =SHAPETEXT(TheText)

    图 5 - 属性主形状的“ShapeSheet”窗口

从普通容器创建的对象主形状已更改如下:

  • 我更改了ShapeSheet 窗口的用户定义单元格和事件部分中的单元格内容,如图 6 所示:

    更改内容后,ShapeSheet 窗口的用户定义单元格和事件部分中的单元格

    图 6 - 更改内容后,ShapeSheet 窗口的用户定义单元格和事件部分中的单元格

    代替:

    在更改其内容之前,ShapeSheet 窗口的用户定义单元格和事件部分中的单元格

    图 7 - ShapeSheet 窗口的用户定义单元格和事件部分中的单元格在更改其内容之前


问题:

第一个问题:

为什么在将属性主形状的实例添加到对象主形状的实例之后没有正确排列和放置属性主形状的实例,例如将成员主形状的实例添加到UML Stencil 的 Class Master Shape 的实例(图 8)?

将 Object Master Shape 的一个实例和 Property Master Shape 的一个实例与 UML Stencil 的 Class Master Shape 的一个实例及其初始成员进行比较

图 8 - 将 Object Master Shape 的一个实例和 Property Master Shape 的一个实例与 UML Stencil 及其初始成员的 Class Master Shape 的一个实例进行比较

第二个问题:

为什么对象主形状的实例在将其/它们附加到页面后不添加其初始成员,就像在将 UML 模板的类主形状的实例添加到页面后添加初始成员一样页(图 9)?

将 Object Master Shape 的实例与 UML Stencil 的 Class Master Shape 的实例进行比较

图 9 - 将 Object Master Shape 的一个实例与 UML Stencil 的 Class Master Shape 的一个实例进行比较

我添加了以下公式来实现这一目标;但是,我认为它不起作用:

=IF(LISTMEMBERCOUNT()=0,DOCMD(2270),0)

第三个问题:

为什么在要插入属性主形状的对象主形状的实例中不显示条形,就像在要插入的 UML 模板的类主形状的实例中显示条形一样其成员(图 10)?

将 Object Master Shape 的实例与 UML Stencil 的 Class Master Shape 的实例进行比较,以显示 Bar 以插入相关的成员

图 10 - 将 Object Master Shape 的一个实例与 UML Stencil 的 Class Master Shape 的一个实例进行比较,以显示 Bar 以插入相关的成员

第四个问题:

为什么 Object Master Shape 的实例接受所有 Master Shape 的实例,除了 Property Master Shape的实例,而不是 Class Master Shape 的实例只接受 UML 模板的成员和分隔主形状的实例的 UML 模板(图 11)?

将接受所有主形状的实例的对象主形状的实例与仅接受 UML 模板的成员和分隔主形状的实例的 UML 模板的类主形状的实例进行比较

图 11 - 将接受所有主形状实例的对象主形状实例与仅接受成员和分隔主形状实例的 UML 模板的类主形状实例进行比较UML 模板

我已经在 ShapeSheet 窗口的用户定义单元格部分=USE("Property")中设置了“User.msvSDListItemMaster” ;但是,我认为它不起作用。

第五个问题:

为什么不显示用于将属性主形状的添加实例上的成员插入到对象主形状的实例中的选项,例如成员和分隔符主形状的附加实例UML 模板到 UML 模板的类主形状的实例(图 12)?

将 Object Master Shape 的一个实例和 Property Master Shape 的一个实例与 UML Stencil 的 Class Master Shape 的一个实例及其成员进行比较,以便在添加的成员上显示插入成员的选项

图 12 - 将 Object Master Shape 的一个实例和 Property Master Shape 的一个实例与 UML Stencil 的 Class Master Shape 的一个实例及其成员进行比较,以便在添加的成员上显示插入成员的选项

第 6 个(最后)问题:

为什么当我将其/它们的主对象更改为列表时,对象主形状的实例的行为和行为类似于容器?

4

1 回答 1

2

第一个问题的答案:

这个问题总是因为不注意“类别”这个词。在大多数情况下,人们不会注意那个词,而是使用“形状大师名称”而不是“形状类别”;但是,它们彼此不同。

在我的例子中,我被输入了形状Property名称类别名称。其他形状必须至少有一个匹配名称才能作为列表成员。)而不是形状类别( )User.msvSDContainerRequiredCategories User.msvSDListRequiredCategories User.msvShapeCategories = Member

比较

图 1 - 比较“Shape Master Name”与“Shape Category”


第二个问题的答案:

为了解决这个问题,我们必须注意两件事

首先,我们必须在实例化主形状后添加我们想要自动添加的形状。因此,我们必须为要添加的每个形状添加行名称User.msvSDListItemMaster[Index] (主形状的名称或 UniqueID 以创建插入命令的实例。该值必须放在 USE() 函数中.) .

如您所见,我只想添加一个形状。所以,我必须将User.msvSDListItemMaster行的名称更改为User.msvSDListItemMaster1. 如果我想在实例化时间内添加更多形状,我必须添加另一行,如User.msvSDListItemMaster2User.msvSDListItemMaster3依此类推。

第二也是最后一件事,我们必须在“事件”部分的“EventDrop”单元格中添加一个公式。如您所见,我已将其添加到我的自定义列表形状中,如此此处所述:

指定插入形状

有几种方法可以将形状添加到列表中:拖放形状、单击列表边缘附近出现的蓝色插入三角形,或右键单击现有成员并插入形状单击插入三角形和右键单击以插入形状都使用User.msvSDListItemMaster单元格来确定要添加到列表中的形状。 主服务器的名称放在函数内的引号USE()中(例如,USE("List member master"))。如果在User.msvSDListItemMaster中未指定形状,则 Visio 将在插入形状时复制列表中的相邻形状。

当列表第一次放在页面上时,也可以使用一些成员形状自动填充列表。为此,请将以下公式放入列表的EventDropDOCMD(2270)单元格中,为要添加的每个成员重复一次:

IF(LISTMEMBERCOUNT()=0,DOCMD(2270)+DOCMD(2270)+DOCMD(2270),0)

2270是在列表中的项目之前插入的命令 ( visUiCmds.visCmdListInsertBefore)。也可以使用2271, 命令在列表中的项目之后插入 ( visUiCmds.visCmdListInsertAfter)。

问题在于2270数量。我不知道为什么它不起作用;但是,当我检查 UML 模板的 Class Master Shape 的“事件”部分中的上述单元格时,我看到它已被使用2499而不是2270. 所以,我在我的公式中使用了这个数字,它奏效了。如果我有多个形状的User.msvSDListItemMaster[Index]行,我必须+DOCMD(2499)在形状 1 之后为每个形状添加。


第三个问题的答案:

如果第一个问题的问题得到解决,这个问题就会解决。


第4个问题的答案:

如果第一个问题的问题得到解决,这个问题就会解决。正如这里这里提到的:

控制列表成员资格

列表有自己的单元格来管理列表成员资格。使用User.msvSDListRequiredCategoriesUser.msvSDListExcludedCategories单元格来限制哪些形状可以成为列表成员。 因为列表也是容器,所以形状可以成为列表的容器成员。标准User.msvSDContainerRequiredCategoriesUser.msvSDContainerExcludedCategories单元格决定了这种行为。 默认情况下,Visio 将尝试将形状作为列表成员添加到列表中,但如果失败,它可能会尝试将其添加为容器成员。 列表成员和容器成员的区别在于,只有列表成员会被列表排列并影响其大小。形状设计师应该管理两组成员单元以确保正确的结果。

我们最好同时使用User.msvSDListRequiredCategoriesUser.msvSDContainerRequiredCategories以获得最佳效率


第5个问题的答案:

如果第一个问题的问题得到解决,这个问题就会解决。


第 6 个(最终)问题的答案:

答案是(这里这里):

自定义列表

"List"Visio将单元格值为 的任何形状User.msvStructureType视为列表。 列表自动排序和排列其成员形状。 请注意,列表也被视为容器,它们具有类似的功能,例如自动移动、复制或删除成员形状。前面提到的所有容器单元格都适用于列表形状。

表 1. ShapeSheet 容器属性

User.msvSDContainerMargin

      The distance between the container boundary and member shapes.

User.msvSDContainerResize

      The automatic-resize behavior for the shape:
  • 0 = 不自动调整大小。

  • 1 = 根据需要扩展。

  • 2 = 始终适合内容。

User.msvSDContainerStyle

      A one-based index value for the current visual style of the container.

User.msvSDContainerStyleCount

      The total number of visual styles that the container supports.

用户.msvSDHeadingStyle

      A one-based index value for the current visual style of the container heading.

User.msvSDHeadingStyleCount

      The total number of visual styles that the container heading supports.

User.msvSDContainerLocked

      A Boolean value that prevents membership changes in the container.

User.msvSDContainerRequiredCategories

      A semicolon-delimited list of category names. Other shapes must have at least one matching name to be allowed as container members.

User.msvSDContainerExcludedCategories

      A semicolon-delimited list of category names. Other shapes with at least one matching name are disallowed as container members.

User.msvSDContainerNoHighlight

      A Boolean value that suppresses the container highlighting when member shapes are selected or added to the container.

User.msvSDContainerNoRibbon

      A Boolean value that hides the Container Tools contextual tab in the ribbon for this container.

User.msvSDContainerHeadingEdge

      A string that designates the location of the interior of the container from the perspective of the container heading. Must be "Left", "Right", "Top", or "Bottom".

User.msvSDMembersOnHiddenLayer

      A Boolean value that determines whether Visio severs container relationships when the container or member is placed on a hidden layer. If True, Visio allows relationships to exist on the hidden layer. If False, Visio severs the relationships.
于 2015-06-19T12:31:09.717 回答