专业化管理 > 定制业务对象 > 类型和属性管理 > 类型和属性管理命令行工具 > 使用 TypeAttributeMoveTool 实用程序
  
使用 TypeAttributeMoveTool 实用程序
对于某一类型及其所有子类型,TypeAttributeMoveTool 命令行实用程序都可用于将属性值从一个属性复制到另一个属性。复制属性值后,此工具将有助于删除源属性及其值。
实际上,这种能够在类型属性之间复制值的功能也可用于重命名属性在类型层次结构内移动属性 (从子类型移动到父项类型,或从父项类型移动到子类型)。这些特殊使用示例将在后续部分中进行介绍。
* 
因 com.ptc.core.lwc.server.TypeAttributeMoveTool 可能导致族表对象 IBA 值不一致,因此不建议对 EPM 文档/CAD 文档使用该工具。
针对下列四种方案,源和目标属性既可以是局部属性,也可以是全局属性:
将值从全局属性复制到局部属性 - 目的是提高性能,因为局部属性值与类型位于同一个数据库表格中,而并不是位于不同的表格中。
将全局属性中的值复制到全局属性 - 目的是合并或拆分属性。
将局部属性中的值复制到局部属性 - 目的是合并或拆分属性,或将数据从一个表格列移动到另一列。
将局部属性中的值复制到全局属性 - 目的是使属性具有多个值并具有全局性。
运行实用程序之前:
指定的类型、源和目标属性必须已存在于系统中。
两属性必须为同一类型且必须具有相同的数据类型。
对于字符串属性,源属性的数据大小必须与目标属性的数据大小相同或小于目标属性的数据大小。
对原始源属性的任何应用 (例如计算得出的属性或衍生的约束) 均必须改为引用目标属性。
运行工具时,对于指定类型的所有实例:
目标属性的所有当前值均将删除。
源属性中的所有值均将复制到目标属性。
如果在复制过程中遇到多值属性,则仅会复制某些特定值:
如果是从多值全局属性复制到局部属性,则只会复制多个全局属性值中的一个值。
执行完复制后,您必须通过查看对象信息页面上的属性来确认所需的属性是否已复制。
如果是从多值全局属性复制到另一个全局属性,则会复制所有多值。
在源属性上设置“不可变”约束,可防止创建新实例或防止现有实例被更改。
将所有源属性值复制到目标属性后,您需要使用“类型和属性管理”实用程序或 TypeAttributeMoveTool 命令行实用程序从系统中删除原始源属性。该操作会删除所有现有的源属性实例及其值。
* 
由于目标属性上的所有现有属性均会被永久删除,所以使用此实用程序时请慎重!
运行该实用程序的语法为:
要复制属性值,请使用
windchill com.ptc.core.lwc.server.TypeAttributeMoveTool <typeName> <sourceAttributeName> <targetAttributeName> -u <userID> -p <password>
要从系统中删除源属性值及其定义,请使用
windchill com.ptc.core.lwc.server.TypeAttributeMoveTool <typeName> <sourceAttributeName> <targetAttributeName> -d -u <userID> -p <password>
其中:
<typeName> 为类型的内部名称。
<sourceAttributeName> 为源属性的内部名称。
<targetAttributeName> 为目标属性的内部名称。
<typeName> 为站点管理员用户的用户名。
<password> 为站点管理员用户的密码。
* 
局部属性直接存储在基础对象类的列中。如果新局部属性的类没有附加列,会在尝试完成新局部属性的创建时,显示一条错误消息。根据出厂设置,局部属性的所有对象类都不存在附加列。
有关添加局部属性列的详细信息,请参阅将列添加到类型
要获得更多帮助,您可以在命令行实用程序中运行 windchill com.ptc.core.lwc.server.TypeAttributeMoveTool -h
重命名属性
虽然无法更改属性的内部名称,但是可以使用 TypeAttributeMoveTool 实用程序达到相同的效果,方法是将值从具有旧内部名称的属性移动至具有所需内部名称的另一属性。
例如,如果您希望将某属性内部名称从 "ABC" 更改为 "XYZ",则可通过完成以下步骤来实现:
1. “类型和属性管理”实用工具中,使用内部名称 "XYZ" 创建与内部名称为 "ABC" 的属性具有相同类型且数据类型也相同的属性。
2. Windchill shell 运行 TypeAttributeMoveTool 实用程序:
windchill com.ptc.core.lwc.server.TypeAttributeMoveTool <类型名称> "ABC" "XYZ" -u <用户 ID> -p <密码>
该命令会将内部名称为 "ABC" 的属性的所有属性值实例复制到内部名称为 "XYZ" 的属性。
3. 确认内部名称为 "XYZ" 的属性的实例值一切就绪后,便可删除内部名称为 "ABC" 的属性。
将属性从子类型移动到父项类型,或从父项类型移动到子类型
无法将属性从一个类型移动到另一个类型时,可在类型层次结构中使用 TypeAttributeMoveTool 实用程序获得此结果,方法是:将子类型中所创建属性的值移动到继承自父项或其他原型类型的属性中,或者将父项或其他原型类型中所继承属性的值移动到子类型中创建的属性。
要将属性定义移动到类型层次结构的较高层级 (从子类型移动到父项或其他原型类型),请完成以下步骤:
1. “类型和属性管理”实用工具中,在父类型属性或其他原型类型上创建与子类型上的属性具有相同数据类型的新属性。现在,子类型会从父类型继承此新属性。
2. 重命名属性中所述,使用 TypeAttributeMoveTool 将子类型中属性的值移动到继承自父项类型的属性中。
3. 确认结果是否如预期所想。
4. 从子项类型中删除属性。
要将属性定义移动到类型层次结构的较低层级 (从父项或其他原型类型移动到子类型),请完成以下步骤:
1. “类型和属性管理”实用程序中,可在子类型上创建与父项或其他原型类型属性具有相同数据类型的新属性。现在,子项类型具有新创建的属性和继承自父项类型或其他原型类型的属性。
2. 重命名属性所述,使用 TypeAttributeMoveTool 将从父项或其他原型类型中所继承属性的值移动到子类型上新创建的属性中。
3. 确认结果是否如预期所想。
4. 从父项类型中删除属性。
* 
在某类型的所有子类型和父类型中,属性的内部名称必须唯一。如果想要将原始类型中属性的内部名称用作该属性将移动到的目标类型中属性的内部名称,需首先在目标类型上创建一个临时属性。可以使用之前用于将属性定义移动到类型层次结构中较高或较低层级的步骤,将属性值移动到目标类型的临时属性中。
重命名属性所述,删除原始属性后,可在目标类型上创建具有所需内部名称的新属性,并且属性实例值会从临时属性移动至新创建的属性。
有关详细信息,请参阅下列示例:
将局部属性定义移动到类型层次结构中的较低层级
将局部属性定义移动到类型层次结构中的较高层级
将全局属性定义移动到类型层次结构中的较低层级
将全局属性定义移动到类型层次结构中的较高层级
将其他类型的属性移动到类型层次结构中的较低或较高层级
* 
在这些示例中,所有类型和属性的内部名称都将使用与显示名称相同的值。
将局部属性定义移动到类型层次结构中的较低层级
Nigel 的公司为名为 MyPart“部件”类型创建了一个子类型,转而获得一个名为 MySubPart 的子类型。当前,由 MySubPart 类型继承的 MyPart 子类型上定义了名为 Color 的局部属性。MyPartMySubPart 均具有 Color 属性值,但公司决定仅需要在 MySubPart 类型上指定颜色。因此,Nigel 需要将 Color 属性定义从类型层次结构的 MyPart 子类型向下移动到 MySubPart 子类型,从而在 MySubPart 子类型中定义 Color 属性,且仅保留 MySubPartColor 属性中已定义的值。
* 
MyPart 类型上存在与 MySubPart 子类型的子项同级但并非该子项的其他子类型时,如果过程结束时删除原始 Color 属性,则在 MyPart 类型上定义并继承而来的原始 Color 属性中指定的所有值都将删除。
可通过执行以下步骤完成此操作:
1. “类型和属性管理”实用程序中,Nigel 仔细记录下在 MyPart 子类型上定义的 Color 属性的详细信息。
2. Nigel 在 MyPart 子类型上创建一个与原始 Color 属性相同的,名为 ColorCopy 的新局部属性。现在,ColorCopy 属性也由 MySubPart 子类型继承。
3. Nigel 在 Windchill shell 中运行以下命令,将 Color 属性的值复制到 MyPart 子类型上的 ColorCopy 属性中:
windchill com.ptc.core.lwc.server.TypeAttributeMoveTool MyPart Color ColorCopy
出现提示时,Nigel 需输入其管理用户名和密码。
由于 MySubPart 子类型从 MyPart 子类型继承了 Color 属性,因此 MySubPart 子类型中 Color 属性的所有值也都将复制到继承的 ColorCopy 属性。
4. 回到“类型和属性管理”实用程序,Nigel 从 MyPart 子类型中删除 Color 属性。该属性的所有实例 (包括属性值) 也都将被删除。
5. 现在,Nigel 在 MySubPart 子类型上创建一个名为 Color 的新局部属性 (与原始 Color 属性名称相同)。
6. Nigel 在 Windchill shell 中运行以下命令,将继承的 ColorCopy 属性的值复制到 MySubPart 子类型上当前定义的 Color 属性中:
windchill com.ptc.core.lwc.server.TypeAttributeMoveTool MySubPart ColorCopy Color
出现提示时,Nigel 需输入其管理用户名和密码。
7. 回到“类型和属性管理”实用程序,Nigel 从 MyPart 子类型中删除 ColorCopy 属性。
将局部属性定义移动到类型层次结构中的较高层级
Nigel 需要将类型层次结构的 MySubPart 子类型上名为 Size 的局部属性向上移动到 MyPart 子类型,从而使该属性可由 MySubPart 子类型以及 MyPart 的所有其他子类型继承。MySubPart 子类型的 Size 属性中已存在值,而 Nigel 希望在将 Size 属性向上移动到 MyPart 子类型时,上述值完全不变。
可通过执行以下步骤完成此操作:
1. “类型和属性管理”实用程序中,Nigel 仔细记录下在 MySubPart 子类型上定义的 Size 属性的详细信息。
2. Nigel 在 MyPart 子类型上创建一个名为 SizeCopy 的新局部属性 (与 MySubPart 子类型上的原始 Size 属性相同)。SizeCopy 属性现在由 MySubPart 子类型继承。
3. Nigel 在 Windchill shell 中运行以下命令,将 Size 属性的值复制到 MySubPart 子类型上继承的 SizeCopy 属性中:
windchill com.ptc.core.lwc.server.TypeAttributeMoveTool MySubPart Size SizeCopy
出现提示时,Nigel 需输入其管理用户名和密码。
4. 回到“类型和属性管理”实用程序,Nigel 从 MySubPart 子类型中删除 Size 属性。
5. 现在,Nigel 在 MyPart 子类型上创建一个名为 Size 的新局部属性 (与原始 Size 属性相同)。MySubPart 子类型现在继承了 MyPart 子类型上的 Size 属性。
6. Nigel 在 Windchill shell 中运行以下命令,将 SizeCopy 属性的值复制到 MyPart 子类型上的 SizeCopy 属性中:
windchill com.ptc.core.lwc.server.TypeAttributeMoveTool MyPart SizeCopy Size
出现提示时,Nigel 需输入其管理用户名和密码。
7. 回到“类型和属性管理”实用程序,Nigel 从 MyPart 子类型中删除 SizeCopy 属性。
将全局属性定义移动到类型层次结构中的较低层级
MyPart 子类型上定义了名为 Shape 的全局属性,且 MySubPart 子类型继承此全局属性。MyPartMySubPart 均具有 Shape 属性值,但公司决定仅需要在 MySubPart 类型上指定形状。因此,Nigel 需要将 Shape 属性定义从类型层次结构的 MyPart 子类型向下移动到 MySubPart 子类型,从而在 MySubPart 子类型中定义 Shape 属性,且仅保留 MySubPartShape 属性中已定义的值。
* 
MyPart 类型上存在与 MySubPart 子类型的子项同级但并非该子项的其他子类型时,如果过程结束时删除原始 Shape 属性,则在 MyPart 类型上定义并继承的原始 Shape 属性中指定的所有值都将删除。
可通过执行以下步骤完成此操作:
1. “类型和属性管理”实用程序中,Nigel 仔细记录下在 MyPart 子类型上定义的 Shape 属性的详细信息。
2. Nigel 在 MyPart 子类型上创建一个与原始 Shape 属性相同的,名为 ShapeCopy 的新局部属性。在指定的类型层次结构中只有一个全局属性可参考特定的可重用属性。因此,新 ShapeCopy 属性必须与 Shape 属性基于不同的可重用属性。而为了成功执行移动操作,这两个可重用属性必须具有相同的数据类型。
ShapeCopy 属性现在也由 MySubPart 子类型继承。
3. Nigel 在 Windchill shell 中运行以下命令,将 Shape 属性的值复制到 MyPart 子类型上的 ShapeCopy 属性中:
windchill com.ptc.core.lwc.server.TypeAttributeMoveTool MyPart Shape ShapeCopy
出现提示时,Nigel 需输入其管理用户名和密码。
由于 MySubPart 子类型从 MyPart 子类型继承了 Shape 属性,则 MySubPart 子类型中 Shape 属性的所有值也都将复制到继承的 ShapeCopy 属性。
4. 回到“类型和属性管理”实用程序,Nigel 从 MyPart 子类型中删除 Shape 属性。该属性的所有实例 (包括属性值) 也都将被删除。
5. 现在,Nigel 在 MySubPart 子类型上创建了名为 Shape 的新全局属性 (与原始 Shape 属性相同,包括与原始 Shape 属性引用相同的可重用属性)。
6. Nigel 在 Windchill shell 中运行以下命令,将继承的 ShapeCopy 属性的值复制到 MySubPart 子类型上当前定义的 Shape 属性中:
windchill com.ptc.core.lwc.server.TypeAttributeMoveTool MySubPart ShapeCopy Shape
出现提示时,Nigel 需输入其管理用户名和密码。
7. 回到“类型和属性管理”实用程序,Nigel 从 MySubPart 子类型中删除 ShapeCopy 属性。
将全局属性定义移动到类型层次结构中的较高层级
Nigel 需要将类型层次结构的 MySubPart 子类型上名为 Material 的全局属性向上移动到 MyPart 子类型,以使得该属性可由 MySubPart 子类型以及 MyPart 的所有其他子类型继承。MySubPart 子类型的 Material 属性中已存在值,而 Nigel 希望在将 Material 属性向上移动到 MyPart 子类型时,上述值完全不变。
可通过执行以下步骤完成此操作:
1. “类型和属性管理”实用程序中,Nigel 仔细记录下在 MySubPart 子类型上定义的 Material 属性的详细信息。
2. Nigel 在 MyPart 子类型上创建一个名为 MaterialCopy 的新局部属性 (与 MySubPart 子类型上的原始 Material 属性相比,除一点外其余完全相同)。在指定的类型层次结构中只有一个全局属性可参考特定的可重用属性。因此,新 MaterialCopy 属性必须与 Material 属性基于不同的可重用属性。而为了成功执行移动操作,这两个可重用属性必须具有相同的数据类型。
3. Nigel 在 Windchill shell 中运行以下命令,将 Material 属性的值复制到 MySubPart 子类型上继承的 MaterialCopy 属性中:
windchill com.ptc.core.lwc.server.TypeAttributeMoveTool MySubPart Material MaterialCopy
出现提示时,Nigel 需输入其管理用户名和密码。
4. 回到“类型和属性管理”实用程序,Nigel 从 MySubPart 子类型中删除 Material 属性。
5. 现在,Nigel 在 MyPart 子类型上创建了名为 Material 的新全局属性 (与原始 Material 属性相同,包括与原始 Material 属性引用相同的可重用属性)。
6. Nigel 在 Windchill shell 中运行以下命令,将 MySubPart 子类型上 MaterialCopy 属性的值复制到当前从 MyPart 子类型继承的新 Material 属性中:
windchill com.ptc.core.lwc.server.TypeAttributeMoveTool MySubPart MaterialCopy Material
出现提示时,Nigel 需输入其管理用户名和密码。
7. 回到“类型和属性管理”实用程序,Nigel 从 MyPart 子类型中删除 MaterialCopy 属性。
将其他类型的属性移动到类型层次结构中的较低或较高层级
直接在“类型和属性管理”实用程序中操作,即可将别名、计算的文本和已翻译文本属性从类型层次结构的一个级别移动到另一个级别中。因为别名、计算的文本或已翻译文本属性中不存在实例数据,因此,将这些属性删除然后在所需的位置上重新创建时,不会导致实例数据丢失。
要在类型层次结构中将别名、计算的文本或已翻译文本属性移动到较高或较低层级,请完成以下步骤:
1. 准确记录别名、计算的文本或已翻译文本属性当前的定义方式。
2. 删除属性。
3. 在类型层次结构中重新创建所需类型的属性。