/// <summary> /// Создание календаря GanttCalendar по данным календаря PLM /// </summary> /// <param name="calendPLM">Импортируемый календарь PLM</param> public void ImportCalendarPLM(InfoObject calendarPLM) { CalendarExceptionCollection GanttExceptionsColl; CalendarException GanttCalendarException; WorkingHourCollection WorkHourColl; WorkingHour WorkHour; // Наименование нового календаря this.intCalendar.Text = calendarPLM.GetValue<String>("ScheduleName"); SetWorkingDays(calendarPLM); // Инициализация коллекции исключений для нового календаря GanttExceptionsColl = new KS.Gantt.Calendars.CalendarExceptionCollection(); // Выборка коллекции дней исключений из PLM var ExceptionsPLM = calendarPLM.GetAttribute("Exceptions").CollectionElements.ToArray(); foreach (var cePLM in ExceptionsPLM) { GanttCalendarException = new KS.Gantt.Calendars.CalendarException(); // Дата исключения var TheDay = cePLM.GetValue<DateTime>("TheDay"); GanttCalendarException.Date = TheDay; // Признак по календарю рабочего дня isWorking - true, // выходного дня(суббота, воскресение) isWorking - false bool isWorking = calendarPLM.GetAttribute("Schedule" + ((int)TheDay.DayOfWeek)).CollectionElements.Count > 0; GanttCalendarException.IsWorkingDay = cePLM.GetAttribute("Hours").CollectionElements.Count != 0; // Инициализация коллекции рабочих часов дней исключений WorkHourColl = new KS.Gantt.Calendars.WorkingHourCollection(); // Выборка коллекции рабочих часов текущего исключения из PLM var hoursCollPLM = cePLM.GetAttribute("Hours").CollectionElements. OrderBy(e => e.GetValue<TimeSpan>("TimeSpanFrom").Hours).ToArray(); foreach (var hrPLM in hoursCollPLM) { WorkHour = new KS.Gantt.Calendars.WorkingHour(); var b1 = hrPLM.GetValue<String>("HourFrom"); double hourFrom = 0; double.TryParse(b1.Substring(0, 2), out hourFrom); double minuteFrom = 0; double.TryParse(b1.Substring(2, 2), out minuteFrom); double hour = hourFrom + minuteFrom / 100; WorkHour.StartHour = hour; var b2 = hrPLM.GetValue<String>("HourTo"); hourFrom = 0; double.TryParse(b2.Substring(0, 2), out hourFrom); minuteFrom = 0; double.TryParse(b2.Substring(2, 2), out minuteFrom); hour = hourFrom + minuteFrom / 100; WorkHour.EndHour = hour; WorkHourColl.Add(WorkHour); } GanttCalendarException.WorkingHours = WorkHourColl; GanttExceptionsColl.Add(GanttCalendarException); } this.intCalendar.Exceptions = GanttExceptionsColl; }
/// <summary> /// Вызывается в процессе сохранения документа в PLM /// </summary> /// <param name="swDoc">документ</param> /// <param name="ioVersion">ио версии в плм</param> public void OnCheckIn(string swDoc, InfoObject ioVersion) { //MessageBox.Show("CheckIn"); SWDocument addinDoc = AddinDocumentCache.ReturnDocument(swDoc, null) as SWDocument; // SWDocument - обёртка документа для использования аддином //addinDoc.GetStatus() - определение plm-статуса документа -не сохранен, сохранён, на редактировании, забблокирован. если документ сохранён в плм, свойства PlmDocument и PlmVersion будут содержать ссылки на ио соответственно документа и версии ModelDoc2 Doc = SWHelper.GetDocByFileName(swDoc); // нужно учитывать что сохраняться может документ не открытый в PLM. тогда здесь будет null и нужно либо открывать документ, либо работать через DMDocument if (Doc != null) { // Определяем тип документа. Пока работаем только с чертежами int docType = Doc.GetType(); if (docType == (int)swDocumentTypes_e.swDocDRAWING) { // Ищем в примечании ТТ по кэшу сохранённых ссылок на значения чертежа. // Если находим, то ищем в чертеже соответствующий элемент и считываем его значение для передачи в ПЛМ. // Заполненные значения передаём в ПЛМ. var TecchReqGrig = ioVersion.GetAttribute("TecchReqGrig").CollectionElements; String notetxt = GetNoteTTtext(Doc); foreach (var sz in arrLinks) { String szval = ""; if (notetxt.Contains(sz.link)) { IDimension d1 = (IDimension)Doc.Parameter(sz.link); if (d1 != null) { szval = d1.Value.ToString(); // d1.GetUserValueIn(swDoc).ToString(); } } if (szval != "") { // Ищем ссылку на размер по всем строкам грида ТТ foreach (var element in TecchReqGrig) { InfoObject childio = element.GetValue <InfoObject>("ChildIO"); // Поиск в элементе ТТ атрибутов типа "Значения" и сохранение их значения из чертежа var SizeList = childio.GetAttribute("SizeList").CollectionElements; foreach (var isz in SizeList) { if (sz.link == isz.GetValue <string>("ttElementSolidSizeLink")) { isz["ttElementSolidSizeText"] = szval; childio.Invoke("RecalcVisibleText", null); element["ttElementValue"] = childio.GetAttribute("VisibleLabel").GetValue(); } } } } } } } Trace.TraceInformation(@"OnCheckIn: document:" + swDoc + " ioVersion: " + ioVersion.ToString()); //Trace.TraceInformation(@"OnCheckIn: SWDocument:" + addinDoc.ToString()); }
public void PrepareTT(string swDoc, InfoObject ioVersion) { // Чтение атрибутов ИО ПЛМ и запись в кэш var TecchReqGrig = ioVersion.GetAttribute("TecchReqGrig").CollectionElements.OrderBy(i => i.GetValue <int>("IndOrder")); var count = TecchReqGrig.Count(); arrTT.Clear(); arrLinks.Clear(); notes.Clear(); foreach (var element in TecchReqGrig) { //MessageBox.Show(element.GetValue<string>("ttElementLabel")); InfoObject childio = element.GetValue <InfoObject>("ChildIO"); arrTT.Add(childio.GetValue <string>("TextLabel")); // Поиск в элементе ТТ атрибутов типа "Значения" и сохранение их в кэш для синхронизации в ПЛМ var SizeList = childio.GetAttribute("SizeList").CollectionElements; foreach (var sz in SizeList) { arrLinks.Add(new ValElem() { link = sz.GetValue <string>("ttElementSolidSizeLink"), val = "" }); } } // Получение документа SW ModelDoc2 Doc = SWHelper.GetDocByFileName(swDoc); // нужно учитывать что браться на редактирование может документ не открытый в PLM. тогда здесь будет null и нужно либо открывать документ, либо работать через DMDocument if (Doc != null) { // Определяем тип документа. Пока рисуем ТТ только на чертежах int docType = Doc.GetType(); switch (docType) { case (int)swDocumentTypes_e.swDocPART: Debug.Print("swPart"); // отрисовка ТТ на основе атрибутов //PaintNoteOnPart(Doc, arrTT.ToArray()); break; case (int)swDocumentTypes_e.swDocDRAWING: Debug.Print("swDraw"); // Расчёт расположения примечаний на основе атрибутов PreCalcNote(Doc, arrTT.ToArray()); // отрисовка ТТ PaintNoteOnDraw(Doc); break; case (int)swDocumentTypes_e.swDocASSEMBLY: Debug.Print("swAssy"); break; default: //swDocNONE, swDocSDM Debug.Print("another doc"); break; } } }
/// <summary> /// Функция считывает ресурсы при первичном чтении объекта из PLM и добавляет их в справочники /// </summary> /// <param name="obj">Объект PLM, из которого происходит чтение</param> /// <param name="strTask">Объект - структура задачи, в которую будут записаны ресурсы</param> public void AddResource(InfoObject obj, ref clTask strTask) { // Список трудовых ресурсов, входящих в текущую задачу из таблицы "Ресурсы:" var ResourcesTasks = obj.GetAttribute("Resources", AttributeDefBase.DataTypeEnum.CollectionOfElements); if (ResourcesTasks.CollectionElements.Count == 0) return; // Создание списка трудовых ресурсов для текущей задачи foreach (var resourc in ResourcesTasks.CollectionElements) { // Создание структуры трудовых ресурсов (для задачи) stResource strResource = new stResource(); // Заполнение структуры stResource(ресурсы) strResource.objResurce = resourc.GetValue<InfoObject>("ResourceLink"); strResource.responsible = IsRespUser(strTask, strResource.objResurce); strResource.unit = 1; // Проверка наличия ресурса в словаре ресурсов dictResource var gtRes = GetGTbyIO(strResource.objResurce); if (gtRes == null) { // Создание структуры трудовых ресурсов (для справочника) stResource elemResource = new stResource(); elemResource.objResurce = strResource.objResurce; // Краткое название ресурса var shortName = strResource.GetResourceNamePLM(); // Создание нового ресурса gtRes = this.GanttDiag.AddResource(shortName); // Задание календаря InfoObject resCalendar = strResource.objResurce.GetValue<InfoObject>("BasicCalendar"); gtRes.CalendarKey = ParentHelper.GetCalendarKey(resCalendar); elemResource.Res = gtRes; // Запись нового ресурса в словарь ресурсов dictResource.Add(elemResource); } strResource.Res = gtRes; // Запись в список трудовых ресурсов в структуре strTask strTask.lResourceTask.Add(strResource); } }
/// <summary> /// Задание времени работы по дням недели по данным PLM для календаря Gantt /// </summary> private void SetWorkingDays(InfoObject calendarPLM) { this.intCalendar.InitDefaultWorkingDays(); this.intCalendar.ClearAllWorkingHours(); for (int i = 0; i < 7; i++) { ICollection<CollectionElement> ceSchedule = calendarPLM.GetAttribute("Schedule" + i.ToString()). CollectionElements.OrderBy(e => e.GetValue<TimeSpan>("TimeSpanFrom").Hours).ToList(); if (ceSchedule != null) SetOneDay(i, ceSchedule); } }
/// <summary> /// Чтение данных из объекта ПЛМ. /// Создание списка всех задач, входящих в выбранный объект, включаяя задачи, находящиеся вне объекта. /// Объекты могут содержать дерево задач (Задача, Группа задач, Проект) - в этом случае DoOperChildren = true, /// а могут содержать плоский список задач (Ресурсы, Задачи сотрудника) - в этом случае DoOperChildren = false. /// </summary> /// <param name="obj">Объект, который будет считан</param> /// <param name="DoReadChildren">Признак - формировать объекты Гантта изи входящих задач или нет</param> /// <returns> List<stTask> - расширенных список задач </returns> private clTask AddTasks2List(InfoObject obj, bool DoOperChildren, clTask ParentTask) { clTask strTask = new clTask();// Структура дочерней задачи strTask.ParentTask = ParentTask; strTask.externalTask = false; strTask.Dates.bData = false; strTask.FillclTask(obj); strTask.Dates.lDependentTask = CreateDepedent(strTask.Obj); // Список родительских задач(ParentTasks) для задачи obj из таблицы "Входит в:" var ParentTasks = obj.GetAttribute("ParentList", AttributeDefBase.DataTypeEnum.CollectionOfElements); if (ParentTasks != null) { // Создание списка родительских задач в структуре strTask foreach (var task in ParentTasks.CollectionElements) { // Запись в список родительских задач в структуре strTask HelperClasses.stParentTask stPT = new HelperClasses.stParentTask(); stPT.Obj = task.GetValue<InfoObject>("ProjectTask"); stPT.IsPrimary = task.GetValue<bool>("IsPrimary"); // Наименование задачи stPT.TaskName = stPT.Obj["TaskName"].ToString(); // Идентификатор объекта из PLM stPT.idPlm = stPT.Obj.Id; strTask.lParentTask.Add(stPT); } } ResourceWorker.AddResource(obj, ref strTask); mainList.Add(strTask); if (DoOperChildren) { // Если установлен ShowTopLevel, то из ПЛМ считается только один уровень задач DoOperChildren = !this.ShowTopLevel; // Список дочерних задач для задачи obj - listChildr из таблицы "Состоит из:" var listChildr = obj.GetAttribute("SubTaskList").CollectionElements.ToList(); strTask.bGroup = (listChildr.Count() != 0); // Сортировка дочерних задач по Order listChildr = listChildr.OrderBy(pet => pet.GetValue<int>("Order")).ToList(); // Создание списка дочерних задач в структуре strTask foreach (var lC in listChildr) { // Дочерняя задача для задачи obj InfoObject childObj = lC.GetValue<InfoObject>("ProjectTask"); strTask.lChildrTask.Add(AddTasks2List(childObj, DoOperChildren, strTask)); } } else strTask.bGroup = false; return strTask; }
private List<stDependents> CreateDepedent(InfoObject obj) { // Чтение строк таблицы Временные зависимости ICollection<CollectionElement> timeDependencies = obj.GetAttribute("ProjectTaskLinks").CollectionElements; // Создание спискаструктур зависимости List<stDependents> ListStDependents = new List<stDependents>(); foreach (var it in timeDependencies) { // Создание структуры зависимости задачи stDependents curStDependents = new stDependents(); // ИО задача, от выполнения которой зависит текущая задача curStDependents.Obj = it.GetValue<InfoObject>("ProjectTask"); // Наименование задачи, от выполнения которой зависит текущая задача curStDependents.TaskName = curStDependents.Obj["TaskName"].ToString(); // Тип временной зависимости задачи curStDependents.ProjectTaskLinkType = it.GetValue<NamedValue>("ProjectTaskLinkType"); if (curStDependents.ProjectTaskLinkType == Service.GetNamedValue(@"WORKORG\ProjectTaskLinkType\l1")) // Следует после (Окончание-начало) curStDependents.typeGantt = TaskRelationTypes.EndStart; else if (curStDependents.ProjectTaskLinkType == Service.GetNamedValue(@"WORKORG\ProjectTaskLinkType\l2")) // Начать вместе с (Начало-начало) curStDependents.typeGantt = TaskRelationTypes.StartStart; else if (curStDependents.ProjectTaskLinkType == Service.GetNamedValue(@"WORKORG\ProjectTaskLinkType\l3")) // Завершить вместе с (Окончание-окончание) curStDependents.typeGantt = TaskRelationTypes.EndEnd; else if (curStDependents.ProjectTaskLinkType == Service.GetNamedValue(@"WORKORG\ProjectTaskLinkType\l4")) // Завершить до (Начало-окончание) curStDependents.typeGantt = TaskRelationTypes.StartEnd; else // Не определен curStDependents.typeGantt = (TaskRelationTypes)4; // Запаздывание (календарное) curStDependents.Delay = it.GetValue<double>("Delay"); // Ед.изм (дни/часы) curStDependents.DelayType = it.GetValue<NamedValue>("DelayType"); // Использываемый календарь curStDependents.UseTaskCalendar = it.GetValue("UseTaskCalendar", true); // Идентификатор задачи, , от выполнения которой зависит текущая задача curStDependents.idPlm = curStDependents.Obj.Id; curStDependents.IsStrict = (it.GetValue("IsStrict", true) == true ? 1 : 0); ListStDependents.Add(curStDependents); } return ListStDependents; }