Files
stgsharp/内核源代码/StgSharp.Modeling/STEP/STEPHeadReader.cs
T

116 lines
5.4 KiB
C#

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
// file="STEPHeadReader.cs"
// Project: StgSharp
// AuthorGroup: Nitload Space
// Copyright (c) Nitload Space. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the ¡°Software¡±), to deal in the Software without restriction,
// including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software,
// and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and
// this permission notice shall be included in all copies
// or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED ¡°AS IS¡±,
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Runtime.Serialization;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace StgSharp.Modeling.STEP
{
public partial class STEPReader
{
/**/
private static Regex expressionSplitter = new Regex(
@"^(?<CALLER>[A-Z_]+)\s?\((?<PARAM>.+)\)\;",
RegexOptions.Compiled );
public Task<STEPInfo> GetInfo()
{
return Task<STEPInfo>.Run<STEPInfo>(
() => {
STEPInfo info = new STEPInfo();
List<STEPExpression> expressionList = new List<STEPExpression>(
);
using( MemoryMappedViewStream ms = _memoryFile.CreateViewStream(
0, _size, MemoryMappedFileAccess.Read ) ) {
using( StreamReader sr = new StreamReader( ms ) ) {
long pos = _headStart;
ms.Seek( _headStart, SeekOrigin.Begin );
while( pos <= _headEnd ) {
string token = ReadToken( sr, ref pos );
if( token == "HEADER;" ) {
continue;
}
if( token == "ENDSEC;" ) {
break;
}
GroupCollection match = expressionSplitter.Match(
token )
.Groups;
expressionList.Add(
new STEPExpression(
0, match[ "CALLER" ].ToString(),
match[ "PARAM" ].ToString() ) );
}
foreach( STEPExpression expression in expressionList ) {
switch( expression.Caller ) {
case "FILE_DESCRIPTION":
info.Description = STEPDataParser.ToString(
expression[ 0 ] );
info.Level = STEPDataParser.ToVersion(
expression[ 1 ] );
break;
case "FILE_NAME":
info.Name = STEPDataParser.ToString(
expression[ 0 ] );
info.TimeStamp = STEPDataParser.ToDateTime(
expression[ 1 ] );
info.Author = STEPDataParser.ToString(
expression[ 2 ] );
info.Organization = STEPDataParser.ToString(
expression[ 3 ] );
info.PreprocessorVersion = STEPDataParser.ToString(
expression[ 4 ] );
info.OriginatingSystem = STEPDataParser.ToString(
expression[ 5 ] );
info.Authorization = STEPDataParser.ToString(
expression[ 6 ] );
break;
default:
break;
}
}
}
}
return info;
} );
}
/**/
}
}