public class BeeFaceFailureHandler : IFailuresPreprocessor { public string ErrorMessage { set; get; } public string ErrorSeverity { set; get; } public BeeFaceFailureHandler() { ErrorMessage = ""; ErrorSeverity = ""; } public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor) { IList<FailureMessageAccessor> failureMessages = failuresAccessor.GetFailureMessages(); foreach (FailureMessageAccessor failureMessageAccessor in failureMessages) { FailureDefinitionId id = failureMessageAccessor.GetFailureDefinitionId(); try { ErrorMessage = failureMessageAccessor.GetDescriptionText(); } catch { ErrorMessage = "Unknown Error"; } try { FailureSeverity failureSeverity = failureMessageAccessor.GetSeverity(); ErrorSeverity = failureSeverity.ToString(); if (failureSeverity == FailureSeverity.Warning) { //if (failureMessageAccessor.GetDescriptionText() == "同一位置處具有相同實例。這將導致在明細表中重復計算。.") //{ // List<ElementId> c = failureMessageAccessor.GetFailingElementIds().ToList(); // if (c.Count > 1) // { // failuresAccessor.DeleteElements(new List<ElementId>() { c[1] }); // } //} //else //{ // 如果是警告,則禁止消息框 failureMessageAccessor.GetDefaultResolutionCaption(); //} failuresAccessor.DeleteWarning(failureMessageAccessor); } else { // 如果是錯誤:則取消導致錯誤的操作,但是仍然繼續整個事務 if (ErrorMessage.Contains("線太短")) { failureMessageAccessor.SetCurrentResolutionType(FailureResolutionType.DeleteElements); failuresAccessor.ResolveFailure(failureMessageAccessor); return FailureProcessingResult.ProceedWithCommit; } //else //{ // failuresAccessor.DeleteWarning(failureMessageAccessor); // return FailureProcessingResult.ProceedWithCommit; //} } } catch (Exception ex) { } } return FailureProcessingResult.Continue; } [Description("這個方法用在事務開始前,在FailureHandler初始化后調用")] /// <summary> /// 這個方法用在事務開始前,在FailureHandler初始化后調用 /// </summary> public static void SetFailedHandlerBeforeTransaction(IFailuresPreprocessor failureHandler, Transaction transaction) { FailureHandlingOptions failureHandlingOptions = transaction.GetFailureHandlingOptions(); failureHandlingOptions.SetFailuresPreprocessor(failureHandler); // 這句話是關鍵 //failureHandlingOptions.SetClearAfterRollback(true); transaction.SetFailureHandlingOptions(failureHandlingOptions); } }
調用方法:
Transaction tran = new Transaction(doc, "測試"); var failure = new BeeFaceFailureHandler(); BeeFaceFailureHandler.SetFailedHandlerBeforeTransaction(failure, tran); tran.Start(); //------- tran.Commit();
下面講一下之前碰到的創建樓板的一個錯誤:邊界邊緣線彼此相交.邊界等高線不可扭曲
解決方案:
1. 板的”結構“屬性不要勾選,或者
2. 板的”啟用分析模型“不要勾選
對應的,我們可以再創建floor之后,馬上調用下面的任何一段代碼:
1.floor.get_Parameter(BuiltInParameter.STRUCTURAL_ANALYTICAL_MODEL).Set(0);
2.floor.get_Parameter(BuiltInParameter.FLOOR_PARAM_IS_STRUCTURAL).Set(0);
如果不需要分析模型,請使用方法2,如果既不需要分析模型又不需要鋼筋,請使用方法1.