///<summary> /// private RuleParser(string) - Parse string text of Rule to fill Rule parameters. /// Regular Expression methodisa are in use. ///</summary> /// <описание> /// -------------------------- СИНТАКСИС ПРАВИЛ ----------------------- /// RuleParser разбирает текстовую строку - правило, выделяя и возвращая в списках или полях, /// входящих в состав класса Rule значения и списки, полученные из текста Правила. /// ...... Части Правила, иначе - Разделы или Секции ...... /// Разделы начинаются признаком раздела, например, "Материал:" и разделяются между собой знаком ';'. /// Заголовок раздела распознается по первым буквам 'M' (Материал), "Пр" ("Pr" для английского текста), /// 'C' (Cost или Стоимость) или 'Ц' (Цена) и завершается ':'. Поэтому /// "Профиль:" = "П:" = "Прф:" = "п:" = "Prof:" /// Заглавные и строчные буквы эквивалентны, национальные символы переводятся в эквивалентные по начертанию /// знаки латинского алфавита, чтобы избежать путаницы между латинским Х и русским Х. /// Разделы Правила можно менять местами и пропускать; тогда они работают "по умолчанию". /// В теле раздела могут быть синонимы - альтернативные обозначения Материала или Профиля. Их синтаксис: /// '=' означает эквивалентность. Допустимы выражения "C255=Ст3=сталь3". /// ',' позволяет перечислять элементы и подразделы Правила. /// ' ' пробелы, табы и знаки конца строки игнорируются, однако они могут служить /// признаком перечисления, так же, как пробелы. Таким образом, названия материалов /// или профилей можно просто перечислить - это эквивалентно '=' /// В результате работы метода RuleParser списки альтернативных наименований для Материала, Профили и Прочего /// RuleMatList - список допустимых альтернативных наименований материалов, с которыми работает Правило /// RulePrfList - список альтернативных наименований Профиля /// RuleCstList - список альтернативных наименований других разделов Правила /// ...... Параметры ...... /// Текст Раздела Правила может иметь т.н. Параметры - символические обозначения каких-либо значений. /// Например,"$p1" или просто "p1" или "Параметр235". Параметр начинается со знака'$' или 'p' и кончается цифрой, /// причем знак '$' можно опускать. Значение Параметра подставляется из атрибутов модели в САПР в порядке следования /// Параметров в Правиле. /// /// #параметры - величины в Правиле, которые соответствуют "значению" в тексте атрибута или прайс-листа, /// например, номер колонки с весом или с ценой /// *параметры - Wild параметр комплектующих; соответствующий элемент модели может иметь /// любое значение, например, ширина листа, из которого нарезают полосы /// Redunduncy% параметр - коэффициент запаса в процентах. Перед десятичным числом - /// коэффициентом запаса - могут быть ключевые слова, возможно, сокращенные /// (избыток, запас, отходы, Redundency, Excess, Waste) по русски или /// по английски заглавными или строчными буквами. /// </описание> /// <history> декабрь 2015 - январь 2016 предистория /// 19.2.16 - #параметры /// 29.2.16 - *параметры /// 17.10.16 - перенос в Rule class /// 28.12.16 - введены Параметры вида {..} правила. Остальные типы правил пока не разбираем /// 25.03.17 - переписал с использованием Section /// </history> public Dictionary <SType, FP> Parser(FP.type _type, string text) { Log.set("Rule.Parser(" + _type + ", " + text); Dictionary <SType, FP> result = new Dictionary <SType, FP>(); string[] sections = Lib.ToLat(text).ToLower().Split(';'); foreach (string sec in sections) { Sec txSec = new Sec(sec); if (txSec.type == SType.NOT_DEFINED) { continue; } FP fp = new FP(_type, txSec.body); result.Add(txSec.type, fp); } Log.exit(); return(result); }
bool isMatchGrRule(SType stype, Group.Group gr, Rule.Rule rule) { if (rule == null || !compDP.dpar.ContainsKey(stype)) { return(true); } string sb = new Sec(rule.text, stype).body; if (sb == "") { return(true); } var ruleSyns = rule.synonyms; string comMatPrf = viewComp_(stype); string grMatPrf = stype == SType.Material ? gr.mat : gr.prf; if (ruleSyns != null && ruleSyns.ContainsKey(stype)) { List <string> Syns = ruleSyns[stype].ToList(); if (!Lib.IContains(Syns, comMatPrf) || !Lib.IContains(Syns, grMatPrf)) { return(false); } string c = strExclude(comMatPrf, Syns); string g = strExclude(grMatPrf, Syns); if (c == g) { return(true); } string pattern = new Sec(rule.text, stype).body.Replace("=", ""); foreach (var s in Syns) { pattern = strExclude(pattern, Syns); } return(isOK(pattern, c, g)); } return(comMatPrf == grMatPrf); }