Revit二次開發高階應用(二)——怎樣在Revit中使用多執行緒
阿新 • • 發佈:2018-11-06
在Revit中完全可以使用多執行緒,只是需要滿足一定的規則:不改變Revit的Document文件的工作都可以線上程中完成,改變Document文件的工作都需要在主執行緒中完成。
如下:不改變文件,只是在執行緒裡建立輔助的線,執行之後,絲毫不錯。
namespace RevitUseThread { [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] [Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)] public class Commad : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Thread thread=new Thread(() =>{ for(var i=0;i<10;i++) { Line line = Line.CreateUnbound(new XYZ(0,10* i, 0), new XYZ(10, 10*i, 0)); } }); thread.Start(); return Result.Succeeded; } } }
然後試一下線上程中建立模型線,模型線是元素,會改變Revit文件,如果這部分線上程裡進行的話,會直接導致致命錯誤。
namespace RevitUseThread { [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] [Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)] public class Commad : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Document revitDoc = commandData.Application.ActiveUIDocument.Document; Thread thread=new Thread(() =>{ using (Transaction transaction = new Transaction(revitDoc, "建立模型線")) { transaction.Start(); SketchPlane sketchPlane = SketchPlane.Create(revitDoc, Plane.CreateByNormalAndOrigin(XYZ.BasisZ,XYZ.Zero)); for (var i = 0; i < 10; i++) { Line line = Line.CreateUnbound(new XYZ(0, 10*i, 0), new XYZ(10, 10 * i, 0)); ModelCurve modelCurve = revitDoc.Create.NewModelCurve(line,sketchPlane); } transaction.Commit(); } }); thread.Start(); return Result.Succeeded; } } }
然後再在上面的基礎上稍加修改,把修改文件的部分移出到執行緒以外就可以正常運行了。
namespace RevitUseThread { [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] [Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)] public class Commad : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Document revitDoc = commandData.Application.ActiveUIDocument.Document; CurveArray curveArray = new CurveArray(); Thread thread=new Thread(() =>{ for (var i = 0; i < 10; i++) { Line line = Line.CreateBound(new XYZ(0, 10*i, 0), new XYZ(10, 10 * i, 0)); curveArray.Append(line); } }); thread.Start(); thread.Join(); using (Transaction transaction = new Transaction(revitDoc, "建立模型線")) { transaction.Start(); SketchPlane sketchPlane = SketchPlane.Create(revitDoc, Plane.CreateByNormalAndOrigin(new XYZ(0,0,1), XYZ.Zero)); revitDoc.Create.NewModelCurveArray(curveArray, sketchPlane); transaction.Commit(); } return Result.Succeeded; } } }