Files

429 lines
13 KiB
C#
Raw Permalink Normal View History

2025-07-11 09:20:23 +08:00

using System;
using System.Diagnostics;
using System.IO;
using System.IO.Packaging;
using System.Text;
2026-02-12 21:29:00 +08:00
using RevitLess;
namespace ShrlAlgoStudio.RevitLess
2025-07-11 09:20:23 +08:00
{
2026-02-12 21:29:00 +08:00
public class BasicFileInfo : RevitLess.StorageStreamBase
2025-07-11 09:20:23 +08:00
{
2026-01-02 16:37:37 +08:00
#region Private Variables
2025-07-11 09:20:23 +08:00
2026-02-12 21:29:00 +08:00
private RevitLess.WorkSharingMode workSharing = RevitLess.WorkSharingMode.Unknown;
2026-01-02 16:37:37 +08:00
private string userName = string.Empty;
private string centralFilePath = string.Empty;
private string revitBuild = string.Empty;
private string lastSavedpath = string.Empty;
private int openWorksetDefault = 0;
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
#endregion
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
#region Constructors
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
public BasicFileInfo(string fileName, StorageInfo storage)
: base(fileName, storage)
{
ReadStructuredStorageFile();
}
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
#endregion
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
#region Public Properties
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
public bool IsCentralFile
{
get
{
2026-02-12 21:29:00 +08:00
if ((WorkSharing == RevitLess.WorkSharingMode.NotEnabled) ||
(WorkSharing == RevitLess.WorkSharingMode.Unknown))
2026-01-02 16:37:37 +08:00
{
return false;
}
bool fileNamesMatch = false;
2026-02-12 21:29:00 +08:00
bool workSharing = WorkSharing == RevitLess.WorkSharingMode.Central;
2026-01-02 16:37:37 +08:00
string fileName = Path.GetFileName(FileName).ToUpper();
string centralFile = string.Empty;
if (CentralFilePath.Length > 0)
{
centralFile = Path.GetFileName(CentralFilePath).ToUpper();
}
if (centralFile.Length > 0)
{
fileNamesMatch = centralFile.Equals(fileName);
}
return workSharing && fileNamesMatch;
}
}
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
public bool IsLocalWorkingFile
{
get
{
2026-02-12 21:29:00 +08:00
if ((WorkSharing == RevitLess.WorkSharingMode.NotEnabled) ||
(WorkSharing == RevitLess.WorkSharingMode.Unknown))
2026-01-02 16:37:37 +08:00
{
return false;
}
bool fileNamesMatch = false;
2026-02-12 21:29:00 +08:00
bool workSharing = WorkSharing == RevitLess.WorkSharingMode.Local;
2026-01-02 16:37:37 +08:00
string fileName = Path.GetFileName(FileName).ToUpper();
string centralFile = string.Empty;
if (CentralFilePath.Length > 0)
{
centralFile = Path.GetFileName(CentralFilePath).ToUpper();
}
if (centralFile.Length > 0)
{
fileNamesMatch = centralFile.Equals(fileName);
}
return workSharing || (fileNamesMatch == false);
}
}
2025-07-11 09:20:23 +08:00
2026-02-12 21:29:00 +08:00
public RevitLess.WorkSharingMode WorkSharing
2026-01-02 16:37:37 +08:00
{
get
{
return workSharing;
}
private set
{
workSharing = value;
}
}
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
public string UserName
{
get
{
return userName;
}
private set
{
userName = value;
}
}
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
public string CentralFilePath
{
get
{
return centralFilePath;
}
private set
{
centralFilePath = value;
}
}
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
public string RevitBuild
{
get
{
return revitBuild;
}
private set
{
revitBuild = value;
}
}
2025-07-11 09:20:23 +08:00
2026-02-12 21:29:00 +08:00
public RevitLess.ProductType Product
2026-01-02 16:37:37 +08:00
{
get
{
if (string.IsNullOrEmpty(RevitBuild))
{
2026-02-12 21:29:00 +08:00
return RevitLess.ProductType.Unknown;
2026-01-02 16:37:37 +08:00
}
if (RevitBuild.ToUpper().IndexOf("MEP") >= 0)
{
2026-02-12 21:29:00 +08:00
return RevitLess.ProductType.MEP;
2026-01-02 16:37:37 +08:00
}
if (RevitBuild.ToUpper().IndexOf("ARCHITECTURE") >= 0)
{
2026-02-12 21:29:00 +08:00
return RevitLess.ProductType.Architecture;
2026-01-02 16:37:37 +08:00
}
if (RevitBuild.ToUpper().IndexOf("STRUCTURE") >= 0)
{
2026-02-12 21:29:00 +08:00
return RevitLess.ProductType.Structure;
2026-01-02 16:37:37 +08:00
}
2026-02-12 21:29:00 +08:00
return RevitLess.ProductType.Unknown;
2026-01-02 16:37:37 +08:00
}
}
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
public string BuildTimeStamp
{
get
{
if (string.IsNullOrEmpty(RevitBuild))
{
return string.Empty;
}
string[] buildParts = RevitBuild.Split(new char[] { ':' });
if (buildParts != null)
{
if (buildParts.Length == 2)
{
string timeStamp = buildParts[1].Trim().Replace("(x64))", string.Empty);
timeStamp = timeStamp.Replace("(x64)", string.Empty);
timeStamp = timeStamp.Replace(")", string.Empty);
return timeStamp.Trim();
}
}
return revitBuild.Trim();
}
}
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
public PlatformType Platform
{
get
{
if (string.IsNullOrEmpty(RevitBuild))
{
return PlatformType.Unknown;
}
if (RevitBuild.ToUpper().IndexOf("X64") >= 0)
{
return PlatformType.X64;
}
return PlatformType.X86;
}
}
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
public string LastSavedpath
{
get
{
return lastSavedpath;
}
private set
{
lastSavedpath = value;
}
}
2025-07-11 09:20:23 +08:00
2026-01-02 16:37:37 +08:00
public int OpenWorksetDefault
2025-07-11 09:20:23 +08:00
{
2026-01-02 16:37:37 +08:00
get
{
return openWorksetDefault;
}
private set
{
openWorksetDefault = value;
}
2025-07-11 09:20:23 +08:00
}
2026-01-02 16:37:37 +08:00
#endregion
#region Public Methods
#endregion
#region Private Methods
private void ParseDetailInfo(string detailInfo)
{
detailInfo = detailInfo.Trim();
int index = detailInfo.IndexOf(":");
string detailValue = detailInfo.Substring(detailInfo.IndexOf(":") + 1);
string detailKey = detailInfo.Substring(0, detailInfo.IndexOf(":"));
detailKey = detailKey.Trim().ToUpper().Replace(" ", string.Empty);
2026-02-12 21:29:00 +08:00
detailKey = RevitLess.StringUtility.PurgeUnprintableCharacters(detailKey);
detailValue = RevitLess.StringUtility.PurgeUnprintableCharacters(detailValue);
2026-01-02 16:37:37 +08:00
switch (detailKey)
{
case "WORKSHARING":
if (string.IsNullOrEmpty(detailValue))
{
2026-02-12 21:29:00 +08:00
WorkSharing = RevitLess.WorkSharingMode.Unknown;
2026-01-02 16:37:37 +08:00
return;
}
string workSharing = detailValue.Replace(" ", string.Empty).Trim().ToUpper();
switch (workSharing)
{
case "NOTENABLED":
2026-02-12 21:29:00 +08:00
WorkSharing = RevitLess.WorkSharingMode.NotEnabled;
2026-01-02 16:37:37 +08:00
break;
case "LOCAL":
2026-02-12 21:29:00 +08:00
WorkSharing = RevitLess.WorkSharingMode.Local;
2026-01-02 16:37:37 +08:00
break;
case "CENTRAL":
2026-02-12 21:29:00 +08:00
WorkSharing = RevitLess.WorkSharingMode.Central;
2026-01-02 16:37:37 +08:00
break;
default:
2026-02-12 21:29:00 +08:00
WorkSharing = RevitLess.WorkSharingMode.Unknown;
2026-01-02 16:37:37 +08:00
break;
}
break;
case "USERNAME":
UserName = detailValue.Trim();
break;
case "CENTRALFILEPATH":
CentralFilePath = detailValue.Trim();
break;
case "REVITBUILD":
RevitBuild = detailValue.Trim();
break;
case "LASTSAVEPATH":
LastSavedpath = detailValue.Trim();
break;
case "OPENWORKSETDEFAULT":
OpenWorksetDefault = Convert.ToInt32(detailValue.Trim());
break;
default:
//Debug.Assert(false, string.Format("{0} was not found in the case tests.", detailKey));
break;
}
}
#endregion
#region Protected Methods
//internal override void ReadStructuredStorageFile()
//{
// if(IsInitialized)
// {
// return;
// }
// try
// {
// StreamInfo[] streams = Storage.GetStreams();
// foreach(StreamInfo stream in streams)
// {
// if(stream.Name.ToUpper().Equals("BASICFILEINFO"))
// {
// string unicodeData = StringUtility.ConvertStreamBytesToUnicode(stream);
// string[] basicFileInfoParts = unicodeData.Split(new char[] { '\0' });
// foreach(string basicFileInfoPart in basicFileInfoParts)
// {
// if(basicFileInfoPart.IndexOf("\r\n") >= 0)
// {
// string[] detailInfoParts = basicFileInfoPart.Split(new string[] { "\r\n" }, new StringSplitOptions());
// foreach(string detailPart in detailInfoParts)
// {
// ParseDetailInfo(detailPart);
// }
// }
// }
// }
// }
// }
// catch(Exception ex)
// {
// LogManager.LogMessage(ex);
// IsInitialized = false;
// }
// IsInitialized = true;
//}
public void ReadStructuredStorageFile()
{
if (IsInitialized)
{
return;
}
try
{
StreamInfo[] streams = Storage.GetStreams();
foreach (StreamInfo stream in streams)
{
if (stream.Name.ToUpper().Equals("BASICFILEINFO"))
{
2026-02-12 21:29:00 +08:00
string unicodeData = RevitLess.StringUtility.ConvertStreamBytesToUnicode(stream);
2026-01-02 16:37:37 +08:00
string[] basicFileInfoParts = unicodeData.Split(new char[] { '\0' });
foreach (string basicFileInfoPart in basicFileInfoParts)
{
if (basicFileInfoPart.IndexOf("\r\n") >= 0)
{
string[] detailInfoParts = basicFileInfoPart.Split(new string[] { "\r\n" }, new StringSplitOptions());
foreach (string detailPart in detailInfoParts)
{
ParseDetailInfo(detailPart);
}
}
}
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
IsInitialized = false;
}
IsInitialized = true;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
string seperator = string.Empty;
try
{
if (this != null)
{
seperator = "+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+" + Environment.NewLine;
sb.Append(string.Format("FileName: <{0}>{1}", FileName, Environment.NewLine));
sb.Append(seperator);
sb.Append(string.Format("BasicFileInfo Section{0}", Environment.NewLine));
sb.Append(seperator);
sb.Append(string.Format("DocType: <{0}>{1}", DocType, Environment.NewLine));
sb.Append(string.Format("WorkSharing: <{0}>{1}", WorkSharing, Environment.NewLine));
sb.Append(string.Format("IsCentralFile: <{0}>{1}", IsCentralFile, Environment.NewLine));
sb.Append(string.Format("UserName: <{0}>{1}", UserName, Environment.NewLine));
sb.Append(string.Format("CentralFilePath: <{0}>{1}", CentralFilePath, Environment.NewLine));
sb.Append(string.Format("RevitBuild: <{0}>{1}", RevitBuild, Environment.NewLine));
sb.Append(string.Format("Product: <{0}>{1}", Product, Environment.NewLine));
sb.Append(string.Format("Platform: <{0}>{1}", Platform, Environment.NewLine));
sb.Append(string.Format("BuildTimeStamp: <{0}>{1}", BuildTimeStamp, Environment.NewLine));
sb.Append(string.Format("LastSavedpath: <{0}>{1}", LastSavedpath, Environment.NewLine));
sb.Append(string.Format("OpenWorksetDefault: <{0}>{1}", OpenWorksetDefault, Environment.NewLine));
sb.Append(seperator);
seperator = sb.ToString();
return seperator;
}
}
finally
{
sb.Length = 0;
sb.Capacity = 0;
sb = null;
}
return string.Empty;
}
#endregion
2025-07-11 09:20:23 +08:00
}
}