近期在进行族库管理的开发,原来的想法通过左右插值进行族库的层级管理后来模拟了一下发现对于后期新增大量的项目族库会有不少的负担,所以把这个想方法记录下来,给有需要的人吧。
如果不涉及大批量的修改,可以使用这种办法,但是整个房建行业恐怕只有规范硬编码之类的能够适合。
左右值比较的关系主要和下图一样
详细内容可以看这个博客:左右值编码存储无限分级树形结构设计
下面的示例是,将族库遍历按照左右插值创建树形结构,主要记录的是思路,里面的一些方法是我自己创建的结构
计算主要是通过
- 非最低层级,通过下面的文件总量与左值确定右值
- 最低层级,通过左值与右值的自减即可确认
/// 引用i值,并设置左右值
/// </summary>
/// <param name="df"></param>
/// <param name="i"></param>
/// <returns></returns>
private DirFolders GetAllFiles(DirFolders df,ref int i)
{
for(int j=0;j<files.Length-1;j++)
{
var fileInfo = files[j];
var str = Path.GetFileNameWithoutExtension(fileInfo.DirectoryName+@"\"+fileInfo.Name);
var extension = fileInfo.Extension;
DirFolders folder = new DirFolders(str, (fileInfo.DirectoryName + "\\" + fileInfo.Name));
folder.SetIcon(new BitmapImage(new Uri("/Resources/R_round_r.jpg", UriKind.Relative)));
folder.IsRfaFile = true;
folder.Left = ++i;
folder.Right = df.Right - (j + 1);
folder.SetThumbnail(
new GetThumbnail(fileInfo.DirectoryName + "\\" + fileInfo.Name).GetImage());
df.SetSub(folder);
}
return df;
}
/// <summary>
/// 上传数据库时计算左右值
/// </summary>
/// <param name="left"></param>
/// <param name="size"></param>
/// <returns></returns>
private static int CalculationRight(int left, int size)
{
//size = (right-left-1)/2
return 2 * size + 1 + left;
}
private static int GetAllFiles(DirectoryInfo dirInfo)
{
int i = 0;
var filesCount = dirInfo.GetFiles("*.rfa");
i += filesCount.Length;
var foldersCount = dirInfo.GetDirectories();
i += foldersCount.Length;
foreach (var directoryInfo in foldersCount)
{
i += GetAllFiles(directoryInfo);
}
return i-1;
}
}