千家信息网

Revit二次开发的解决方式

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,根据当前的程序,有以下几个点进行改良1 日志每次revit生成的之后,就不会del,下次再次生成的时候,发现有日志,就不会在生成。采用将日志的名字修改为时间戳,每次运行的时候,产生独立的日志文件。示例
千家信息网最后更新 2024年11月23日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(new DropCreateDatabaseAlways());

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的地方抽象一个类出来,将每个文档的处理逻辑放入到单独的一个类中
0