public override void Execute(object @object) { if (!Enabled) { return; } var q = new MultichoiceQuestion { Id = Guid.NewGuid() }; if (Warehouse.Warehouse.Instance.CourseTree.CurrentNode is TestModule) { var tm = Warehouse.Warehouse.Instance.CourseTree.CurrentNode as TestModule; q.Text = string.Concat("Вопрос ", tm.Questions.Count + 1); } if (Warehouse.Warehouse.Instance.CourseTree.CurrentNode is Group) { var g = Warehouse.Warehouse.Instance.CourseTree.CurrentNode as Group; q.Text = string.Concat("Вопрос ", g.Questions.Count + 1); q.TimeRestriction = g.TimeRestriction; q.Profile = g.Profile; q.Marks = g.Marks; } Warehouse.Warehouse.Instance.CourseTree.CurrentNode.Nodes.Add(q); if (!Warehouse.Warehouse.Instance.CourseTree.CurrentNode.IsExpanded) { Warehouse.Warehouse.Instance.CourseTree.CurrentNode.Toggle(); } // Создает и отображает редактор. q.QuestionDocument = new QuestionDocument { Question = q, Text = q.Text, HtmlEditingTool = {Mode = Utils.Controls.HtmlEditing.Enums.HtmlEditingToolMode.Design} }; //q.QuestionDocument.VisualHtmlEditor.SetDefaultFont(); HtmlEditingToolHelper.SetDefaultDocumentHtml(q.QuestionDocument.HtmlEditingTool); PreviewObserver.AddDocument(q.QuestionDocument); q.QuestionDocument.Show(); Warehouse.Warehouse.Instance.CourseTree.CurrentNode = q; Warehouse.Warehouse.IsProjectModified = true; }
/// <summary> /// считывает файл вопроса /// </summary> /// <returns>считанный вопрос</returns> public Question ReadQuestionFile(string qfPath, TestModule test) { // пока сделан вариант только для вопроса типов Choice // когда будут реализованы все варианты вопросов, сделать Question question = null Question question = new MultichoiceQuestion(); XmlTextReader reader = null; string interaction = string.Empty; string title = string.Empty; string cardinality = string.Empty; bool isAdaptive = false; bool isSupported = false; if (!File.Exists(qfPath)) { MessageBox.Show("Файла " + qfPath + " не существует!"); } else { try { bool isQuestion = false; // проверяем, является ли файл вопросом reader = new XmlTextReader(qfPath); while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.Name.Equals("assessmentItem", StringComparison.OrdinalIgnoreCase)) { isQuestion = true; } } if (isQuestion == true) break; } reader.Close(); if (isQuestion) { // считываем из файла тип вопроса reader = new XmlTextReader(qfPath); while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { // считываем название вопроса if (reader.Name.Equals("assessmentItem", StringComparison.OrdinalIgnoreCase)) { if (reader.GetAttribute("title") != null) { title = reader.GetAttribute("title"); } if (reader.GetAttribute("adaptive") != null) { isAdaptive = bool.Parse(reader.GetAttribute("adaptive")); } } if (!isAdaptive) { // считываем признак типа вопроса if (reader.Name.Equals("responseDeclaration", StringComparison.OrdinalIgnoreCase)) { cardinality = reader.GetAttribute("cardinality"); } // вопросы типа "Выбор" if (reader.Name.Equals("choiceInteraction", StringComparison.OrdinalIgnoreCase)) { isSupported = true; // Одновариантный выбор if (cardinality.Equals("single", StringComparison.OrdinalIgnoreCase)) { question = new ChoiceQuestion(); } // Множественный выбор else if (cardinality.Equals("multiple", StringComparison.OrdinalIgnoreCase)) { question = new MultichoiceQuestion(); } } // вопросы типа "Упорядочивание элементов ответа" if (reader.Name.Equals("orderInteraction", StringComparison.OrdinalIgnoreCase)) { isSupported = true; question = new OrderingQuestion(); } // Открытые вопросы if (reader.Name.Equals("textEntryInteraction", StringComparison.OrdinalIgnoreCase)) { isSupported = true; question = new OpenQuestion(); } } } } if (!isSupported) { // question = new UnknownQuestion(title); MessageBox.Show("Данный тип вопросов не поддерживается приложением Visual Editor.", "Visual Editor", MessageBoxButtons.OK, MessageBoxIcon.Error); question = null; } question.TestModule = test; if (!question.ReadQti(qfPath)) { question = null; } } else { MessageBox.Show("Данный файл не является файлом вопроса в стандарте IMS QTI 2.1.", "Visual Editor", MessageBoxButtons.OK, MessageBoxIcon.Error); question = null; } } catch { MessageBox.Show("При чтении файла вопроса произошла ошибка. (" + qfPath + ")", "Visual Editor", MessageBoxButtons.OK, MessageBoxIcon.Error); question = null; } finally { if (reader != null) { reader.Close(); } } } return question; }
public void ReadXml(XmlTextReader xmlReader) { try { var isEndCycle = false; while (!isEndCycle && xmlReader.Read()) { if (xmlReader.NodeType == XmlNodeType.Element) { if (xmlReader.Name.Equals("group", StringComparison.OrdinalIgnoreCase)) { #region Группа var g = new Group(); if (xmlReader.GetAttribute("name") != null) { g.Text = xmlReader.GetAttribute("name"); } else { g.Text = string.Concat("Группа ", testModule.Groups.Count + 1); } g.ChosenQuestionsCount = int.Parse(xmlReader.GetAttribute("count")); g.XmlReader.ReadXml(xmlReader); testModule.Nodes.Add(g); #endregion } if (xmlReader.Name.Equals("question", StringComparison.OrdinalIgnoreCase)) { // Название вопроса. var qname = xmlReader.GetAttribute("name"); // Идентификатор вопроса. var qid = xmlReader.GetAttribute("id").Substring(8, 36); // Тип вопроса. var qtype = xmlReader.GetAttribute("type"); // Ограничение по времени на прохождение вопроса. var qtime = xmlReader.GetAttribute("time"); // Идентификатор следующего вопроса. var qNextQuestion = xmlReader.GetAttribute("next_question"); if (!string.IsNullOrEmpty(qNextQuestion)) { qNextQuestion = qNextQuestion.Substring(8, 36); } if (qtype.Equals("radio", StringComparison.OrdinalIgnoreCase)) { #region Вопросы Одновариантный выбор var q = new ChoiceQuestion { Text = qname }; try { q.Id = new Guid(qid); } catch { //q.Identifier = qid; } q.TimeRestriction = int.Parse(qtime); if (!string.IsNullOrEmpty(qNextQuestion)) { // q_ - временное хранилище для идентификатора следующего вопроса. // После чтения всего контроля, q.NextQuestion заменяется на реальный вопрос. var q_ = new ChoiceQuestion { Id = new Guid(qNextQuestion) }; q.NextQuestion = q_; } q.XmlReader.ReadXml(xmlReader); testModule.Nodes.Add(q); #endregion } else if (qtype.Equals("checkbox", StringComparison.OrdinalIgnoreCase)) { #region Вопросы Множественный выбор var q = new MultichoiceQuestion { Text = qname }; try { q.Id = new Guid(qid); } catch { //mq.Identifier = qid; } q.TimeRestriction = int.Parse(qtime); if (!string.IsNullOrEmpty(qNextQuestion)) { // q_ - временное хранилище для идентификатора следующего вопроса. // После чтения всего контроля, q.NextQuestion заменяется на реальный вопрос. var q_ = new ChoiceQuestion { Id = new Guid(qNextQuestion) }; q.NextQuestion = q_; } q.XmlReader.ReadXml(xmlReader); testModule.Nodes.Add(q); #endregion } else if (qtype.Equals("order", StringComparison.OrdinalIgnoreCase)) { #region Вопросы Ранжирование var q = new OrderingQuestion { Text = qname }; try { q.Id = new Guid(qid); } catch { //mq.Identifier = qid; } q.TimeRestriction = int.Parse(qtime); if (!string.IsNullOrEmpty(qNextQuestion)) { // q_ - временное хранилище для идентификатора следующего вопроса. // После чтения всего контроля, q.NextQuestion заменяется на реальный вопрос. var q_ = new ChoiceQuestion { Id = new Guid(qNextQuestion) }; q.NextQuestion = q_; } q.XmlReader.ReadXml(xmlReader); testModule.Nodes.Add(q); #endregion } else if (qtype.Equals("edit", StringComparison.OrdinalIgnoreCase) || qtype.Equals("explicit", StringComparison.OrdinalIgnoreCase)) { #region Вопросы Открытый вопрос var q = new OpenQuestion { Text = qname }; if (qtype.Equals("edit", StringComparison.OrdinalIgnoreCase)) { q.IsAnswerNumeric = false; } else if (qtype.Equals("explicit", StringComparison.OrdinalIgnoreCase)) { q.IsAnswerNumeric = true; } try { q.Id = new Guid(qid); } catch { //mq.Identifier = qid; } q.TimeRestriction = int.Parse(qtime); if (!string.IsNullOrEmpty(qNextQuestion)) { // q_ - временное хранилище для идентификатора следующего вопроса. // После чтения всего контроля, q.NextQuestion заменяется на реальный вопрос. var q_ = new ChoiceQuestion { Id = new Guid(qNextQuestion) }; q.NextQuestion = q_; } q.XmlReader.ReadXml(xmlReader); testModule.Nodes.Add(q); #endregion } else if (qtype.Equals("outer", StringComparison.OrdinalIgnoreCase)) { #region Вопросы Внешний вопрос var q = new OuterQuestion { Text = qname }; try { q.Id = new Guid(qid); } catch { //q.Identifier = qid; } q.TimeRestriction = int.Parse(qtime); if (!string.IsNullOrEmpty(qNextQuestion)) { // q_ - временное хранилище для идентификатора следующего вопроса. // После чтения всего контроля, q.NextQuestion заменяется на реальный вопрос. var q_ = new ChoiceQuestion { Id = new Guid(qNextQuestion) }; q.NextQuestion = q_; } q.XmlReader.ReadXml(xmlReader); testModule.Nodes.Add(q); #endregion } } } else if (xmlReader.NodeType == XmlNodeType.EndElement) { if (xmlReader.Name.Equals("module", StringComparison.OrdinalIgnoreCase)) { isEndCycle = true; } } } } catch (Exception ex) { ExceptionManager.Instance.LogException(ex); } }
public static Question Clone(Question question) { Question newQuestion = null; #region Инициализация вопроса if (question is ChoiceQuestion) { newQuestion = new ChoiceQuestion(); } else if (question is MultichoiceQuestion) { newQuestion = new MultichoiceQuestion(); } else if (question is InteractiveQuestion) { newQuestion = new InteractiveQuestion(); } else if (question is OrderingQuestion) { newQuestion = new OrderingQuestion(); } else if (question is OpenQuestion) { newQuestion = new OpenQuestion(); } else if (question is CorrespondenceQuestion) { newQuestion = new CorrespondenceQuestion(); } else if (question is OuterQuestion) { newQuestion = new OuterQuestion(); (newQuestion as OuterQuestion).TaskId = (question as OuterQuestion).TaskId; (newQuestion as OuterQuestion).TaskName = (question as OuterQuestion).TaskName; (newQuestion as OuterQuestion).TestName = (question as OuterQuestion).TestName; (newQuestion as OuterQuestion).SubjectName = (question as OuterQuestion).SubjectName; (newQuestion as OuterQuestion).Declaration = (question as OuterQuestion).Declaration; (newQuestion as OuterQuestion).Url = (question as OuterQuestion).Url; } #endregion newQuestion.LowerBound = question.LowerBound; newQuestion.Cardinality = question.Cardinality; newQuestion.Text = question.Text; newQuestion.Id = Guid.NewGuid(); newQuestion.DocumentHtml = string.Copy(question.DocumentHtml); newQuestion.TimeRestriction = question.TimeRestriction; newQuestion.Profile = question.Profile; newQuestion.Marks = question.Marks; newQuestion.Hint = question.Hint; newQuestion.NextQuestion = question.NextQuestion; newQuestion.IsAdaptive = question.IsAdaptive; newQuestion.BaseType = question.BaseType; newQuestion.DefaultValue = question.DefaultValue; //newQuestion.Mark = question.Mark; newQuestion.IsShuffle = question.IsShuffle; newQuestion.MaxChoices = question.MaxChoices; // newQuestion.timeRestriction = question.timeRestriction; newQuestion.identifier = question.identifier; // идентификатор вопроса ("VE-" + questionNumber + questionType) foreach (var questionResponse in question.Responses) { var response = Response.Clone(questionResponse); newQuestion.Nodes.Add(response); } foreach (ResponseVariant questionResponseVariant in question.ResponseVariants) { var responseVariant = new ResponseVariant(question); if (!(question is OrderingQuestion) && !(question is OpenQuestion)) { foreach (Response response in questionResponseVariant.Responses) { for (var i = 0; i < question.Responses.Count; i++) { if ((question.Responses[i]).Text.Equals(response.Text)) { responseVariant.Responses.Add(question.Responses[i]); break; } } } } else { for (var i = 0; i < questionResponseVariant.Responses.Count; i++) { responseVariant.Responses.Add(questionResponseVariant.Responses[i]); } } responseVariant.Weight = questionResponseVariant.Weight; responseVariant.Hint = questionResponseVariant.Hint; responseVariant.NextQuestion = questionResponseVariant.NextQuestion; // моё newQuestion.ResponseVariants.Add(responseVariant); } return newQuestion; }
public void ReadXml(XmlTextReader xmlReader) { try { var isEndCycle = false; group.ChosenQuestionsCount = int.Parse(xmlReader.GetAttribute("count")); while (!isEndCycle && xmlReader.Read()) { if (xmlReader.NodeType == XmlNodeType.Element) { if (xmlReader.Name.Equals("question", StringComparison.OrdinalIgnoreCase)) { var qname = xmlReader.GetAttribute("name"); var qid = xmlReader.GetAttribute("id").Substring(8, 36); var qtype = xmlReader.GetAttribute("type"); var qtime = xmlReader.GetAttribute("time"); group.TimeRestriction = int.Parse(qtime); if (qtype.Equals("radio", StringComparison.OrdinalIgnoreCase)) { #region Вопросы Одновариантный выбор var q = new ChoiceQuestion { Text = qname }; try { q.Id = new Guid(qid); } catch { //q.Identifier = qid; } q.TimeRestriction = int.Parse(qtime); q.XmlReader.ReadXml(xmlReader); group.Nodes.Add(q); #endregion } else if (qtype.Equals("checkbox", StringComparison.OrdinalIgnoreCase)) { #region Вопросы Множественный выбор var q = new MultichoiceQuestion { Text = qname }; try { q.Id = new Guid(qid); } catch { //mq.Identifier = qid; } q.TimeRestriction = int.Parse(qtime); q.XmlReader.ReadXml(xmlReader); group.Nodes.Add(q); #endregion } else if (qtype.Equals("order", StringComparison.OrdinalIgnoreCase)) { #region Вопросы Ранжирование var q = new OrderingQuestion { Text = qname }; try { q.Id = new Guid(qid); } catch { //mq.Identifier = qid; } q.TimeRestriction = int.Parse(qtime); q.XmlReader.ReadXml(xmlReader); group.Nodes.Add(q); #endregion } else if (qtype.Equals("edit", StringComparison.OrdinalIgnoreCase) || qtype.Equals("explicit", StringComparison.OrdinalIgnoreCase)) { #region Вопросы Открытый вопрос var q = new OpenQuestion { Text = qname }; if (qtype.Equals("edit", StringComparison.OrdinalIgnoreCase)) { q.IsAnswerNumeric = false; } else if (qtype.Equals("explicit", StringComparison.OrdinalIgnoreCase)) { q.IsAnswerNumeric = true; } try { q.Id = new Guid(qid); } catch { //mq.Identifier = qid; } q.TimeRestriction = int.Parse(qtime); q.XmlReader.ReadXml(xmlReader); group.Nodes.Add(q); #endregion } else if (qtype.Equals("outer", StringComparison.OrdinalIgnoreCase)) { #region Вопросы Внешний вопрос var q = new OuterQuestion { Text = qname }; try { q.Id = new Guid(qid); } catch { //q.Identifier = qid; } q.TimeRestriction = int.Parse(qtime); q.XmlReader.ReadXml(xmlReader); group.Nodes.Add(q); #endregion } } if (xmlReader.Name.Equals("mark", StringComparison.OrdinalIgnoreCase)) { group.Marks = int.Parse(xmlReader.GetAttribute("value")); try { var id = new Guid(xmlReader.GetAttribute("concept_id").Substring(6, 36)); foreach (Concept c in Warehouse.Warehouse.Instance.ConceptTree.Nodes) { if (c.Id.Equals(id)) { group.Profile = c; break; } } } catch { group.Profile = null; } foreach (var q in group.Questions) { q.Marks = group.Marks; q.Profile = group.Profile; } } } else if (xmlReader.NodeType == XmlNodeType.EndElement) { if (xmlReader.Name.Equals("group", StringComparison.OrdinalIgnoreCase)) { isEndCycle = true; } } } } catch (Exception ex) { ExceptionManager.Instance.LogException(ex); } }