Расширенные атрибуты проекта
Microsoft Project имеет обширную схему обмена данными XML, которая облегчает обмен информации между приложениями и программированием с файлами проекта. Схема позволяет вам добавлять расширенные атрибуты в задачи, ресурсы и задания. Эта статья демонстрирует, как работать с расширенными атрибутами, используя Aspose.tasks.
Работа с пользовательскими полями с использованием Microsoft Project
В этом примере мы продемонстрируем, как работать с расширенным атрибутом Text1 проекта для связи информации с задачей.
- В MSP перейдите в Project-> Пользовательские поля.
- Отсюда выберите задание.
- Выберите текст как пользовательский тип поля из поля Type Combo.
- Выберите Text1 как пользовательское поле, с которым вы хотите работать
- Используйте кнопку «Переименовать», чтобы переименовать псевдоним поля, если она желательна, и нажмите кнопку OK
- Добавьте новую задачу и вставьте новый столбец в строку задач с помощью пользовательского поля, которое вы использовали на вышеуказанном шаге
Работа с пользовательскими полями/расширенными атрибутами с использованием Aspose.Tasks для C ++ API
Aspose.Tasks для API C ++ предоставляет возможность создавать новые расширенные атрибуты, а также работать с расширенными атрибутами, уже присутствующими в документе. Пользовательские поля или расширенные атрибуты представлены в сборе Extendendattributes проекта в Aspose.tasks. Он содержит все расширенные атрибуты определения проектного документа. Некоторые из сопоставлений определения поля MSP являются, как показано на изображении ниже.
Создание нового расширенного атрибута и добавление его в задачу
Чтобы добавить новый расширенный атрибут для задачи или ресурса, нам сначала необходимо определить и добавить расширенное определение атрибута в коллекцию ExtendendattRibutes. Класс ExtendationAttributeFinition используется для определения нового расширенного атрибута в проекте. FieldID должен быть установлен для правильного определения расширенного атрибута, который связан с extendendattributeksk (в случае задачи) или ExtendendatTtributerSource (в случае ресурса). В следующем примере кода показано, как определить новый расширенный атрибут для поля проекта Text1. Как только расширенное определение атрибута завершено, теперь вы можете создать из него новый расширенный атрибут и назначить его задаче.
1System::SharedPtr<Project> project1 = System::MakeObject<Project>(dataDir + u"Blank2010.mpp");
2
3System::SharedPtr<ExtendedAttributeDefinition> myTextAttributeDefinition = project1->get_ExtendedAttributes()->GetById((int32_t)Aspose::Tasks::ExtendedAttributeTask::Text1);
4
5// If the Custom field doesn't exist in Project, create it
6if (myTextAttributeDefinition == nullptr)
7{
8 myTextAttributeDefinition = ExtendedAttributeDefinition::CreateTaskDefinition(Aspose::Tasks::ExtendedAttributeTask::Text1, u"My text field");
9 project1->get_ExtendedAttributes()->Add(myTextAttributeDefinition);
10}
11
12// Generate Extended Attribute from definition
13System::SharedPtr<ExtendedAttribute> text1TaskAttribute = myTextAttributeDefinition->CreateExtendedAttribute();
14
15text1TaskAttribute->set_TextValue(u"Text attribute value");
16
17// Add extended attribute to task
18System::SharedPtr<Task> tsk = project1->get_RootTask()->get_Children()->Add(u"Task 1");
19tsk->get_ExtendedAttributes()->Add(text1TaskAttribute);
20
21project1->Save(dataDir + u"CreateExtendedAttributes_out.mpp", Aspose::Tasks::Saving::SaveFileFormat::MPP);
Writing Updated Extended Attribute Definitions and Values to MPP
Aspose.Tasks for C++ API supports updating extended attribute data in a Microsoft Project MPP file and save it back.
The code example given below demonstrates how to add new extended attributes of the Resource and Task types to the source MPP file. The steps involved in this activity are:
- Create an instance of Project Reader.
- Read the source MPP file.
- Define a new extended attribute and update its values.
- Save the project using the Project Writer.
The following example shows setting the extended attributes of a resource.
1System::SharedPtr<Project> project = System::MakeObject<Project>(dataDir + u"WriteUpdatedExtendedAttributeDefinitions.mpp");
2
3
4// C# preprocessor directive: #region task attributes
5
6
7// Add new text3 extended attribute with lookup and one lookup value
8System::SharedPtr<ExtendedAttributeDefinition> taskTextAttributeDefinition = ExtendedAttributeDefinition::CreateLookupTaskDefinition(Aspose::Tasks::ExtendedAttributeTask::Text3, u"New text3 attribute");
9taskTextAttributeDefinition->set_ElementType(Aspose::Tasks::ElementType::Task);
10project->get_ExtendedAttributes()->Add(taskTextAttributeDefinition);
11
12System::SharedPtr<Value> textVal = System::MakeObject<Value>();
13textVal->set_Id(1);
14textVal->set_Description(u"Text value descr");
15textVal->set_Val(u"Text value1");
16
17taskTextAttributeDefinition->AddLookupValue(textVal);
18
19// Add new cost1 extended attribute with lookup and two cost values
20System::SharedPtr<ExtendedAttributeDefinition> taskCostAttributeDefinition = ExtendedAttributeDefinition::CreateLookupTaskDefinition(Aspose::Tasks::ExtendedAttributeTask::Cost1, u"New cost1 attribute");
21project->get_ExtendedAttributes()->Add(taskCostAttributeDefinition);
22
23System::SharedPtr<Value> costVal1 = System::MakeObject<Value>();
24costVal1->set_Id(2);
25costVal1->set_Description(u"Cost value 1 descr");
26costVal1->set_Val(u"99900");
27
28System::SharedPtr<Value> costVal2 = System::MakeObject<Value>();
29costVal2->set_Id(3);
30costVal2->set_Description(u"Cost value 2 descr");
31costVal2->set_Val(u"11100");
32
33taskCostAttributeDefinition->AddLookupValue(costVal1);
34taskCostAttributeDefinition->AddLookupValue(costVal2);
35
36// Add new task and assign attribute lookup value.
37System::SharedPtr<Task> task = project->get_RootTask()->get_Children()->Add(u"New task");
38
39System::SharedPtr<ExtendedAttribute> taskAttr = taskCostAttributeDefinition->CreateExtendedAttribute(costVal1);
40task->get_ExtendedAttributes()->Add(taskAttr);
41
42System::SharedPtr<ExtendedAttributeDefinition> taskStartAttributeDefinition = ExtendedAttributeDefinition::CreateLookupTaskDefinition(Aspose::Tasks::ExtendedAttributeTask::Start7, u"New start 7 attribute");
43
44System::SharedPtr<Value> startVal = System::MakeObject<Value>();
45startVal->set_Id(4);
46startVal->set_DateTimeValue(System::DateTime::get_Now());
47startVal->set_Description(u"Start 7 value description");
48
49taskStartAttributeDefinition->AddLookupValue(startVal);
50
51project->get_ExtendedAttributes()->Add(taskStartAttributeDefinition);
52
53System::SharedPtr<ExtendedAttributeDefinition> taskFinishAttributeDefinition = ExtendedAttributeDefinition::CreateLookupTaskDefinition(Aspose::Tasks::ExtendedAttributeTask::Finish4, u"New finish 4 attribute");
54
55System::SharedPtr<Value> finishVal = System::MakeObject<Value>();
56finishVal->set_Id(5);
57finishVal->set_DateTimeValue(System::DateTime::get_Now());
58finishVal->set_Description(u"Finish 4 value description");
59
60taskFinishAttributeDefinition->get_ValueList()->Add(finishVal);
61
62project->get_ExtendedAttributes()->Add(taskFinishAttributeDefinition);
63
64System::SharedPtr<ExtendedAttributeDefinition> numberAttributeDefinition = ExtendedAttributeDefinition::CreateLookupTaskDefinition(Aspose::Tasks::ExtendedAttributeTask::Number20, u"New number attribute");
65
66System::SharedPtr<Value> val1 = System::MakeObject<Value>();
67val1->set_Id(6);
68val1->set_Val(u"1");
69val1->set_Description(u"Number 1 value");
70System::SharedPtr<Value> val2 = System::MakeObject<Value>();
71val2->set_Id(7);
72val2->set_Val(u"2");
73val2->set_Description(u"Number 2 value");
74System::SharedPtr<Value> val3 = System::MakeObject<Value>();
75val2->set_Id(8);
76val3->set_Val(u"3");
77val3->set_Description(u"Number 3 value");
78
79numberAttributeDefinition->AddLookupValue(val1);
80numberAttributeDefinition->AddLookupValue(val2);
81numberAttributeDefinition->AddLookupValue(val3);
82
83project->get_ExtendedAttributes()->Add(numberAttributeDefinition);
84
85
86// C# preprocessor directive: #endregion
87
88
89System::SharedPtr<ExtendedAttributeDefinition> rscStartAttributeDefinition = ExtendedAttributeDefinition::CreateLookupResourceDefinition(Aspose::Tasks::ExtendedAttributeResource::Start5, u"New start5 attribute");
90
91System::SharedPtr<Value> startVal2 = System::MakeObject<Value>();
92startVal2->set_Id(9);
93startVal2->set_DateTimeValue(System::DateTime::get_Now());
94startVal2->set_Description(u"this is start5 value descr");
95
96rscStartAttributeDefinition->AddLookupValue(startVal2);
97
98project->get_ExtendedAttributes()->Add(rscStartAttributeDefinition);
99
100// Define a duration attribute without lookup.
101System::SharedPtr<ExtendedAttributeDefinition> taskDurationAttributeDefinition = ExtendedAttributeDefinition::CreateTaskDefinition(Aspose::Tasks::ExtendedAttributeTask::Duration1, u"New Duration");
102project->get_ExtendedAttributes()->Add(taskDurationAttributeDefinition);
103
104// Add new task and assign duration value to the previously defined duration attribute.
105System::SharedPtr<Task> timeTask = project->get_RootTask()->get_Children()->Add(u"New task");
106
107System::SharedPtr<ExtendedAttribute> durationExtendedAttribute = taskDurationAttributeDefinition->CreateExtendedAttribute();
108
109durationExtendedAttribute->set_DurationValue(project->GetDuration(3.0, Aspose::Tasks::TimeUnitType::Hour));
110timeTask->get_ExtendedAttributes()->Add(durationExtendedAttribute);
111
112System::SharedPtr<MPPSaveOptions> mppSaveOptions = System::MakeObject<MPPSaveOptions>();
113mppSaveOptions->set_WriteViewData(true);
114
115// Save the project as MPP project file
116project->Save(dataDir + u"WriteUpdatedExtendedAttributeDefinitions_out.mpp", mppSaveOptions);