Example #1
0
        public bool Check(IModel model, string logFile = null)
        {
            // set up error logger handler to get errors from parser
            appender = Logger.Setup(logFile);
            log      = LogManager.GetLogger("Validator");

            return(CheckInternal(model, new Dictionary <int, string>()));
        }
Example #2
0
        // https://stackoverflow.com/a/19538654/6345585
        public static ErrorAppender Setup(string file = null)
        {
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

            // clear in case this is not the first run
            hierarchy.ResetConfiguration();

            PatternLayout patternLayout = new PatternLayout
            {
                // ConversionPattern = "%date [%thread] %-5level %logger - %message%newline"
                ConversionPattern = "%date %-5level - %message%newline"
            };

            patternLayout.ActivateOptions();

            if (file != null)
            {
                RollingFileAppender roller = new RollingFileAppender
                {
                    AppendToFile       = false,
                    File               = file,
                    Layout             = patternLayout,
                    MaxSizeRollBackups = 5,
                    MaximumFileSize    = "1GB",
                    RollingStyle       = RollingFileAppender.RollingMode.Size,
                    StaticLogFileName  = true,
                    Threshold          = Level.Warn
                };
                roller.ActivateOptions();
                hierarchy.Root.AddAppender(roller);
            }

            var appender = new ErrorAppender();

            appender.ActivateOptions();
            hierarchy.Root.AddAppender(appender);

            // add console appender to see what is happenning
            var csl = new ColoredConsoleAppender
            {
                Layout    = patternLayout,
                Name      = "ConsoleAppender",
                Threshold = Level.Info
            };

            csl.AddMapping(new ColoredConsoleAppender.LevelColors
            {
                Level     = Level.Error,
                ForeColor = ColoredConsoleAppender.Colors.Red
            });
            csl.AddMapping(new ColoredConsoleAppender.LevelColors
            {
                Level     = Level.Warn,
                ForeColor = ColoredConsoleAppender.Colors.Yellow
            });
            csl.ActivateOptions();
            hierarchy.Root.AddAppender(csl);

            hierarchy.Root.Level = Level.Info;
            hierarchy.Configured = true;

            return(appender);
        }
Example #3
0
        public bool Check(string file)
        {
            // set up error logger handler to get errors from parser
            var logFile = file + ".log";

            appender = Logger.Setup(logFile);
            log      = LogManager.GetLogger("Validator");


            var ext    = Path.GetExtension(file).ToUpperInvariant().Trim('.');
            var format = "UNKNOWN";

            switch (ext)
            {
            case "IFC":
                format = "STEP21 (*.ifc)";
                break;

            case "IFCXML":
                format = "XML (*.ifcXML)";
                break;

            default:
                break;
            }
            log.Info($"Validating file: {file}");
            log.Info($"File format: {format}");


            try
            {
                // open as an in-memory model (all syntactic errors fill be picked up)
                using (var model = IfcStore.Open(file, null, -1))
                {
                    // header information
                    log.Info($"Schema version: {string.Join(", ", model.Header.SchemaVersion)}");
                    log.Info($"Model View Definitions: {string.Join(", ", model.Header.FileDescription.Description)}");

                    // STEP21 syntactic errors will be reported in the log already
                    if (appender.Errors.Any())
                    {
                        // do not proceed because the data is incomplete
                        return(false);
                    }

                    log.Info($"Number of entities: {model.Instances.Count}");
                    LogEntityHistogram(model);

                    var idMap = new Dictionary <int, string>();
                    if (file.ToLower().EndsWith(".ifcxml"))
                    {
                        using (var stream = File.OpenRead(file))
                        {
                            idMap = GetXmlEntityMap(stream, model);
                        }
                    }

                    CheckInternal(model, idMap);
                }
            }
            // XML syntactic errors will be fired as an exception
            catch (XbimParserException pe)
            {
                log.Error($"Parser failure: {pe.Message}.");
                return(false);
            }
            catch (Exception ge)
            {
                log.Error($"General failure: {ge.Message}.", ge);
                return(false);
            }

            return(!Errors.Any());
        }