Revit二次开发的解决方式
根据当前的程序,有以下几个点进行改良
1 日志每次revit生成的之后,就不会del,下次再次生成的时候,发现有日志,就不会在生成。采用将日志的名字修改为时间戳,每次运行的时候,产生独立的日志文件。
示例代码
string date = DateTime.Now.ToLongDateString().ToString() + DateTime.Now.ToLongTimeString();
date = date.Replace(":", "_");
roller.File = @"EventLogByrevit" + date + ".txt";
这个代码放在log.cs中。在revit的命令中执行。这种方法调试的时候很有用。
2 在Model类中,增加一个每次都drop原来的库,单独重新生成一个库。
在Model类中的构造函数中增加
Database.SetInitializer
3 DB中增加一个时间字段,看是什么时间保存的数据。
4 DB中增加一个文件名的字段,这个文件名是全文件名,所以在类中设置这个属性的时候,要保持1000个字符左右。不然个别的会很长,在保持的时候会报错。
5 在保持的时候,因为构建比较多,从网站上下载构建
在Negut的控制台上,执行以下命令
Install-Package Z.EntityFramework.Extensions -Version 3.22.6
就会安装一个Extension,它支持批量保持。
6 如果数据量还是很大,那么就将数据分为10000个为一个单位,分的方法可参考
List templist = new List(); int separate = 10000; int mod整数 = count / separate; int mod余数 = count % separate; for (int j = 1; j <= mod整数; j++) { templist.AddRange(l构件实体列表.Skip((j-1) * separate).Take(separate)); m.d构件实体数据处理.AddRange(templist); m.BatchSaveChanges(); templist.Clear(); } if (mod余数 != 0) { templist.AddRange(l构件实体列表.Skip(mod整数 * separate).Take(mod余数)); m.d构件实体数据处理.AddRange(templist); m.BatchSaveChanges(); templist.Clear(); } Common.utility.WriteDebugLog("数据库存储结束,采用了batchsavechange的方法。");
分为10000个为一个单位进行保持。
7 为了便于发现问题,在系统中增加日志的记录地方,采用
Common.utility.WriteDebugLog(string.Format("正在处理第{0}个文件,文件名是{1},一共有{2}个文件\r\n",i,filename, filenameList.Count()));
这种格式,比较好。
8 在Revit中执行一个目录下所有的revit文件。
打开一个revit文件,运行这个插件。
这个插件一开始采用以下的代码
string path = @"d:\1";
string[] filenameList = Directory.GetFiles(path, "*.rvt", SearchOption.AllDirectories);
app = commandData.Application.Application; Document doc; foreach (var x in filenameList) { Common.utility.WriteDebugLog(string.Format("个文件,文件名是{0}\r\n",x)); } int i = 1; foreach (var filename in filenameList) { Common.utility.WriteDebugLog(string.Format("正在处理第{0}个文件,文件名是{1},一共有{2}个文件\r\n",i,filename, filenameList.Count())); i++;9 ui的地方抽象一个类出来,将每个文档的处理逻辑放入到单独的一个类中