public void TestArgumentPerformance() { for (int count = 0; count < 1000000; count++) { ConstructionTemplate template = new ConstructionTemplate(ElementType.AbstractNode_a, ElementType.CommonArc_a, new ScAddress(1, 1)); template.GetBytes(); } }
/// <summary> /// Получить коллекцию конструкций, соответствующих указанной конструкции-шаблону. /// </summary> /// <param name="template">Конструкция-шаблон.</param> /// <returns>Список конструкций (списков элементов).</returns> public List <List <ScAddress> > IterateElements(ConstructionTemplate template) { if (!knowledgeBase.IsAvaible) { return(new List <List <ScAddress> >()); } var cmd = new IterateElementsCommand(template); var rsp = (IterateElementsResponse)knowledgeBase.ExecuteCommand(cmd); return(rsp.Constructions); }
public List <ScAddress> FindApples() { List <ScAddress> apples = new List <ScAddress>(); //ищем адресс класса яблоко var classAppleAddress = this.FindElementAddress(class_apple); //ищем все экземпляры класса яблоко. Вот здесь обычно очень нужно находить подмаски масок элементов и сравнивать их var template = new ConstructionTemplate(classAppleAddress, ElementType.PositiveConstantPermanentAccessArc, ElementType.ConstantNode); var cmdFindApples = new IterateElementsCommand(template); var rspIterateAppels = (IterateElementsResponse)client.Send(cmdFindApples); //и при итерации добавляем в коллекцию адреса яблок (у нас в примере один, но суть можно уловить) foreach (var construction in rspIterateAppels.Constructions) { apples.Add(construction[2]); } return(apples); }
/// <summary> /// Получение произвольного идентификатора. узла /// </summary> /// <param name="scAddress">SC-адрес узла</param> /// <param name="identifierType">тип идентификатора</param> /// <returns>идентификатор</returns> public Identifier GetNodeIdentifier(ScAddress scAddress, Identifier identifierType) { Identifier identifier = Identifier.Invalid; if (knowledgeBase.IsAvaible) { var template = new ConstructionTemplate(scAddress, ElementType.ConstantCommonArc_c, ElementType.Link_a, ElementType.PositiveConstantPermanentAccessArc_c, GetNodeAddress(identifierType)); var command = new IterateElementsCommand(template); var response = (IterateElementsResponse)knowledgeBase.ExecuteCommand(command); if (response.Constructions.Count == 1) { ScAddress link = response.Constructions[0][2]; var commandGetLink = new GetLinkContentCommand(link); var responseGetLink = (GetLinkContentResponse)knowledgeBase.ExecuteCommand(commandGetLink); if (responseGetLink.Header.ReturnCode == ReturnCode.Successfull) { identifier = LinkContent.ToString(responseGetLink.LinkContent); } } } return(identifier); }
/// <summary> /// Функция для поиска значения ссылки по отношению, например в констукции bittersweet_apple => nrel_price:[5,5]; /// </summary> /// <param name="node">это адрес узла, например, bittersweet_apple у которого есть ссылка, например [5,5]</param> /// <param name="predicate">это отношение, например nrel_price, которое поясняет, что это за ссылка</param> /// <returns></returns> private double FindValueByPredicate(ScAddress node, ScAddress predicate) { double value = double.NaN; //итерируем конструкцию var template = new ConstructionTemplate(node, ElementType.ConstantCommonArc, ElementType.Link, ElementType.PositiveConstantPermanentAccessArc, predicate); var cmdIterateElements = new IterateElementsCommand(template); var rspIterateElements = (IterateElementsResponse)client.Send(cmdIterateElements); //если число конструкций равно 1, то ищем значение ссылки if (rspIterateElements.Constructions.Count() == 1) { var cmdGetValue = new GetLinkContentCommand(rspIterateElements.Constructions[0][2]); var rspGetValue = (GetLinkContentResponse)client.Send(cmdGetValue); value = LinkContent.ToDouble(rspGetValue.LinkContent); } if (predicate.Offset == 2087) { int i = 0; i = 1; } return(value); }
public void TestConstructionTemplate() { var elementNode = ElementType.ConstantNode_c; var elementArcCommon = ElementType.ConstantCommonArc_c; var elementArcAccess = ElementType.PositiveConstantPermanentAccessArc_c; var scAddress1 = new ScAddress(1, 1); var scAddress2 = new ScAddress(1, 2); var scAddress3 = new ScAddress(1, 3); //a_a_f var constructiontemplate_a_a_f = new ConstructionTemplate(elementNode, elementArcAccess, scAddress1); var bytes = constructiontemplate_a_a_f.GetBytes(); Assert.AreNotEqual(0, bytes.Length); //f_a_a var constructiontemplate_f_a_a = new ConstructionTemplate(scAddress1, elementArcAccess, elementArcCommon); bytes = constructiontemplate_f_a_a.GetBytes(); Assert.AreNotEqual(0, bytes.Length); //f_a_f var constructiontemplate_f_a_f = new ConstructionTemplate(scAddress1, elementArcAccess, scAddress2); bytes = constructiontemplate_f_a_f.GetBytes(); Assert.AreNotEqual(0, bytes.Length); //a_a_f_a_a var constructiontemplate_a_a_f_a_a = new ConstructionTemplate(elementNode, elementArcCommon, scAddress1, elementArcAccess, elementNode); bytes = constructiontemplate_a_a_f_a_a.GetBytes(); Assert.AreNotEqual(0, bytes.Length); //a_a_f_a_f var constructiontemplate_a_a_f_a_f = new ConstructionTemplate(elementNode, elementArcCommon, scAddress1, elementArcAccess, scAddress2); bytes = constructiontemplate_a_a_f_a_f.GetBytes(); Assert.AreNotEqual(0, bytes.Length); //f_a_a_a_a var constructiontemplate_f_a_a_a_a = new ConstructionTemplate(scAddress1, elementArcCommon, elementNode, elementArcAccess, elementNode); bytes = constructiontemplate_f_a_a_a_a.GetBytes(); Assert.AreNotEqual(0, bytes.Length); //f_a_a_a_f var constructiontemplate_f_a_a_a_f = new ConstructionTemplate(scAddress1, elementArcCommon, elementNode, elementArcAccess, scAddress2); bytes = constructiontemplate_f_a_a_a_f.GetBytes(); Assert.AreNotEqual(0, bytes.Length); //f_a_f_a_a var constructiontemplate_f_a_f_a_a = new ConstructionTemplate(scAddress1, elementArcCommon, scAddress2, elementArcAccess, elementNode); bytes = constructiontemplate_f_a_f_a_a.GetBytes(); Assert.AreNotEqual(0, bytes.Length); //f_a_f_a_f var constructiontemplate_f_a_f_a_f = new ConstructionTemplate(scAddress1, elementArcCommon, scAddress2, elementArcAccess, scAddress3); bytes = constructiontemplate_f_a_f_a_f.GetBytes(); Assert.AreNotEqual(0, bytes.Length); }
/// <summary> /// Инициализирует новую команду. /// </summary> /// <param name="template">шаблон для поиска</param> public IterateElementsCommand(ConstructionTemplate template) : base(CommandCode.IterateElements) { Arguments.Add(this.template = template); }
public List<ScAddress> FindApples() { List<ScAddress> apples = new List<ScAddress>(); //ищем адресс класса яблоко var classAppleAddress = this.FindElementAddress(class_apple); //ищем все экземпляры класса яблоко. Вот здесь обычно очень нужно находить подмаски масок элементов и сравнивать их var template = new ConstructionTemplate(classAppleAddress, ElementType.PositiveConstantPermanentAccessArc, ElementType.ConstantNode); var cmdFindApples = new IterateElementsCommand(template); var rspIterateAppels = (IterateElementsResponse)client.Send(cmdFindApples); //и при итерации добавляем в коллекцию адреса яблок (у нас в примере один, но суть можно уловить) foreach (var construction in rspIterateAppels.Constructions) { apples.Add(construction[2]); } return apples; }
/// <summary> /// Функция для поиска значения ссылки по отношению, например в констукции bittersweet_apple => nrel_price:[5,5]; /// </summary> /// <param name="node">это адрес узла, например, bittersweet_apple у которого есть ссылка, например [5,5]</param> /// <param name="predicate">это отношение, например nrel_price, которое поясняет, что это за ссылка</param> /// <returns></returns> private double FindValueByPredicate(ScAddress node, ScAddress predicate) { double value = double.NaN; //итерируем конструкцию var template = new ConstructionTemplate(node, ElementType.ConstantCommonArc, ElementType.Link, ElementType.PositiveConstantPermanentAccessArc, predicate); var cmdIterateElements = new IterateElementsCommand(template); var rspIterateElements = (IterateElementsResponse)client.Send(cmdIterateElements); //если число конструкций равно 1, то ищем значение ссылки if (rspIterateElements.Constructions.Count() == 1) { var cmdGetValue = new GetLinkContentCommand(rspIterateElements.Constructions[0][2]); var rspGetValue = (GetLinkContentResponse)client.Send(cmdGetValue); value = LinkContent.ToDouble(rspGetValue.LinkContent); } if (predicate.Offset == 2087) { int i = 0; i = 1; } return value; }