15. Revit API: Transaction(事務)與 Failures(故障處理)

前言

UI講完,回到DB這塊兒。在Document那篇,提到增刪改查操作都是在Document上,是對Documet進行操作。
看到“增刪改查”這四個,想到什么了沒有?
數據庫(DB)嘛~話說那本經典的紅皮數據庫的書叫啥來著?算了算了,數據庫也忘得差不多了😶。
回到Revit API,“刪”我們在Document那篇就講過了,用Delete方法就行了。“查”就是過濾器,上篇的選擇器也能沾一點兒邊。還有“增”和“改”這倆個。
數據庫中的“增”,是增加新的數據,對應Revit就是增加新模型、創建新實例,我們將會在涉及到Creation時講。
數據庫中的“改”,是對原有數據進行修改。在Revit中,就比較寬泛了,或許應該稱之為“變化”,變化了就是改了。這塊兒,體現在事件上,后面專門些一篇關于Events的,再提改這部分。
回到本篇。
在數據庫中,有事務的概念,Revit 的這個功能上差不多,但沒有那么細致。
這篇,涉及的主要類如下圖
在這里插入圖片描述


一、Transaction(事務)

其實在第一篇Namespace與Attributes中,就提到事務,只是那會兒沒有展開。

  [Transaction(TransactionMode.Manual)]  // 開啟事務

現在我們開始講事務。
Revit的事務是做什么的,當我們要進行的操作會改變Document時,就必須在事務中進行,比如:刪除元素,調整元素參數,設置元素顯影。
Revit中,事務類有3個,分別是:

  • Transaction:事務
  • TransactionGroup:事務組,可以在事務組里創建新的事務
  • SubTransaction:子事務,必須在事務中,子事務可嵌套

1.1. 三種事務的對比

來看看方法對比

TransactionTransactionGroupSubTransaction
Start(..) x2Start(..) x2Start
Commit(..) x2Assimilate
Commite
Commite
RollBack(..) x2RollbackRollback
DisposeDisposeDispose
Get/SetNameGet/SetName
GetStatus
HasStarted
HasEnded
GetStatus
HasStarted
HasEnded
GetStatus
HasStarted
HasEnded
GetFailureHandlingOptions
SetFailureHandlingOptions
差異:事務名稱,故障處理差異:事務組名稱,打包提交

瞧,就這么丟丟的差異。

事務:可以在事務上添加故障處理程序。
事務組:可以將多個事務組織成一個事務提交(Assimilate),也可一次性提交(Commite)。
子事務:只能在事務中開啟,本身可嵌套。沒自己的名稱。

1.2. 事務組的2種提交方式

事務組兩種提交方式的區別。

在這里插入圖片描述

對于下面的代碼,將事務改為子事務,事務組改為事務,也是可以的。

public void TestTransactionGroup(UIDocument uIDoc)
{View view = uIDoc.ActiveView;List<ElementId> wallIds = this.GetElementByCategory(uIDoc.Document, BuiltInCategory.OST_Walls);wallIds = wallIds.Take(5).ToList();  // 取5個// 事務組using (TransactionGroup transactionGroup = new TransactionGroup(uIDoc.Document, "TransactionGroup-隱藏-所有墻體")){transactionGroup.Start();foreach (ElementId wallId in wallIds){// 事務using (Transaction transaction = new Transaction(uIDoc.Document, $"Transaction-隱藏-{wallId.IntegerValue}")){transaction.Start();view.HideElements([wallId]);transaction.Commit();}}//transactionGroup.Assimilate();  // 將5個事務打包成一個,提交transactionGroup.Commit();  // 5個事務一次性提交,還是5個}
}

1.3. 子事務

上面說了,子事務必須要在事務中才能創建,不然就會報錯。
在這里插入圖片描述

子事務一般在什么時候使用呢?一般是作為獨立的小的操作步驟,插入到有具體業務的事務的邏輯中。
但有時我們需要進行一些操作了,卻不能確定當前是否在事務中呢?
這個問題是有意義的,因為事務是不可嵌套的,我們無法在一個事務中開啟另一個事務,又無法在非事務中創建子事務,所以需要根據當前的狀態,來選擇性處理。
還記Document的IsModified屬性嗎,True表示文檔正處于修改中,也就是已開啟了事務。

使用document.IsModified來判斷當前事務環境。
根據環境不同,來決定是創建 事務 還是 子事務

二、Failures(故障處理)

事務執行失敗了怎么辦?我們可以回滾Rollback
不想回滾呢?那就try-catch處理問題吧。
但這里的說的故障處理可不是程序上的錯誤,而是Revit發出的問題。
Revit里有許多的約束,當文檔變化時,就會進行校驗,判斷是否允許更改,常見的問題有“不滿足約束”“無法剪切圖元”等,在遇到這些問題時,Revit會有彈框,并暫定程序的執行,待用戶選擇操作后才會繼續處理。
這種由Revit發出的警告或錯誤,是無法通過try-catch處理的,得提供專門的故障處理方式,即實現IFailuresPreprocessor接口,并將其提供給事務。

2.1. IFailuresPreprocessor

IFailuresPreprocessor需要實現一個方法,也只有這個方法。

public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)

方法有個參數FailuresAccessor,文檔中是這么介紹的:“是獲取文檔故障信息的唯一可以接口,雖然可以在故障處理期間讀取文檔,但在處理期間修改文檔的唯一方法是通過此類提供的方法”。
但在我的測試中,拿到Document進行一些操作,沒有效果也不報錯,不明白🙃。
甚至只要我在故障處理方法力稍稍做些事兒,錯誤彈框就無法被跳過,還是會彈出來。

類成員,就不列了。

2.2. 取消Revit 警告/錯誤 彈框

注意,錯誤不應該直接ResolveFailure,Revit可能會采用刪除的方式處理。

internal class MyFailuresPreprocessor : IFailuresPreprocessor
{public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor){IList<FailureMessageAccessor> failures = failuresAccessor.GetFailureMessages();foreach (FailureMessageAccessor failure in failures){//ICollection<ElementId> additionalElements = failure.GetAdditionalElementIds();  // 獲取與問題相關的其他元素//ICollection<ElementId> failingElementIds = failure.GetFailingElementIds();  // 獲取引起問題的元素FailureSeverity failureSeverity = failure.GetSeverity();  // 獲取失敗的嚴重程度if (failureSeverity == FailureSeverity.Warning){failuresAccessor.DeleteWarning(failure); // 刪除警告}else if (failureSeverity == FailureSeverity.DocumentCorruption){return FailureProcessingResult.ProceedWithRollBack;  // 文檔損壞,回滾}else if (failureSeverity == FailureSeverity.Error){//FailureDefinitionId failureId = failure.GetFailureDefinitionId();  // 獲取失敗的定義ID//if (failureId == BuiltInFailures.CutFailures.CannotCutInstanceOut)  // 如果問題是無法剪切實例//{//    failure.SetCurrentResolutionType(FailureResolutionType.MoveElements);  // 嘗試采用移動物體的方式處理//}failuresAccessor.ResolveFailure(failure);  // 解決錯誤}}return FailureProcessingResult.ProceedWithCommit;  // 提交  // 可能會刪除部分模型//return FailureProcessingResult.Continue;}
}

上面的代碼,會不顯示所有的警告彈框。對于下面的錯誤彈框,也會消失。
當然,這不意味著就可以剪切了,具體的效果就是取消了剪切。
在這里插入圖片描述


三、通過代碼進行歷史操作回退

在Revit左上角快捷欄里,有事務歷史,我們當然可以通過交互的方式快速回退到之前的文檔。其實這個操作也是可以通過代碼進行的。
我們需要引入庫UIFrameworkServices.dll,其中有類QuickAccessToolBarService

// 找到歷史操作記錄
public static ObservableCollection<string> collectUndoRedoItems(bool bForUndo);// 回退或前進,步數
public static void performMultipleUndoRedoOperations(bool bForUndo, int iNumOperations)

總結

寫到這兒,一看最上方的導圖,好像還有個事件,算了,不寫了🙄。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43215.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43215.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43215.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡安全----防御----防火墻安全策略組網

防火墻組網 要求&#xff1a; 1&#xff0c;DMz區內的服務器&#xff0c;辦公區僅能在辦公時間內(9:00-18:00)可以訪問&#xff0c;生產區的設備全天可以訪問。 2&#xff0c;生產區不允許訪問互聯網&#xff0c;辦公區和游客區允許訪問互聯網 3&#xff0c;辦公區設備10.0.…

計算機網絡之廣域網

廣域網特點: 主要提供面向通信的服務&#xff0c;支持用戶使用計算機進行遠距離的信息交換。 覆蓋范圍廣,通信的距離遠&#xff0c;需要考慮的因素增多&#xff0c; 線路的冗余、媒體帶寬的利用和差錯處理問題。 由電信部門或公司負責組建、管理和維護&#xff0c;并向全社會…

友思特方案 | 低延遲GigE Vision解決方案:用于紅外設備、醫療和工業級探測面板

導讀 維持實時視頻系統軟硬件的長期成本效益&#xff0c;是該系統在醫療、工業等領域廣泛應用的前提。友思特低延遲GigE Vision解決方案創新性地突破了這一難題&#xff0c;提供高帶寬且高可靠性的端到端網絡鏈接&#xff0c;有效降低了開發成本、復雜性和時間。 引言 雖然實…

DDoS攻擊詳解

DDoS 攻擊&#xff0c;其本質是通過操控大量的傀儡主機或者被其掌控的網絡設備&#xff0c;向目標系統如潮水般地發送海量的請求或數據。這種行為的目的在于竭盡全力地耗盡目標系統的網絡帶寬、系統資源以及服務能力&#xff0c;從而致使目標系統無法正常地為合法用戶提供其所應…

leetcode--從前序與中序遍歷序列構造二叉樹

leetcode地址&#xff1a;從前序與中序遍歷序列構造二叉樹 給定兩個整數數組 preorder 和 inorder &#xff0c;其中 preorder 是二叉樹的先序遍歷&#xff0c; inorder 是同一棵樹的中序遍歷&#xff0c;請構造二叉樹并返回其根節點。 示例 1: 輸入: preorder [3,9,20,15,…

vue學習day05-watch偵聽器(監視器)、Vue生命周期和生命周期的四個階段、、工程化開發和腳手架Vue cli

13、watch偵聽器&#xff08;監視器&#xff09; &#xff08;1&#xff09;作用&#xff1a;監視數據變化&#xff0c;執行一些業務邏輯或異步操作 &#xff08;2&#xff09;語法&#xff1a; 1&#xff09;簡寫語法——簡單數據類型&#xff0c;直接監視 ① Watch:{ 數…

[Flink]二、Flink1.13

7. 處理函數 之前所介紹的流處理 API,無論是基本的轉換、聚合,還是更為復雜的窗口操作,其實都是基于 DataStream 進行轉換的;所以可以統稱為 DataStream API ,這也是 Flink 編程的核心。而我們知道,為了讓代碼有更強大的表現力和易用性, Flink 本身提供了多…

一文入門【NestJs】Controllers 控制器

Nest學習系列 ??一文帶你入門【NestJS】 ??前言 流程圖 Controllers 控制器主要負責處理傳入請求&#xff0c;并向客戶端返回響應&#xff0c;控制器可以通過路由機制來控制接收那些請求&#xff0c;通常一個Controllers種會有多個匹配路由&#xff0c;不同的路由可以知…

Spring源碼二十一:Bean實例化流程四

上一篇Spring源碼二十&#xff1a;Bean實例化流程三中&#xff0c;我們主要討論了單例Bean創建對象的主要方法getSingleton的內部方法createBean&#xff0c;createBean方法中的resolveBeanClase方法與prepareMethodOverrides方法處理了lookup-method屬性與repliace-method配置…

MT3046 憤怒的象棚

思路&#xff1a; a[]存憤怒值&#xff1b;b[i]存以i結尾的&#xff0c;窗口里的最大值&#xff1b;c[i]存以i結尾的&#xff0c;窗口里面包含?的最大值。 &#xff08;?為新大象的位置&#xff09; 例&#xff1a;1 2 3 4 ? 5 6 7 8 9 則ans的計算公式b3b4c4c5c6b7b8b9…

三代測序結構變異分析 - 單樣本Germline SV calling和多樣本SV Calling

適用于三代PacBio HiFi / ONT 長reads數據的結構變異分析。 1. sniffles2安裝 sniffles2需要Python >= 3.10環境,因此用conda創建安裝好3.10的環境。 sniffles2安裝要求: Python >= 3.10pysam >= 0.21.0edlib >=1.3.9psutil>=5.9.4# 創建conda環境 conda c…

【記錄】LaTex|LaTex 代碼片段 Listings 添加帶圓圈數字標號的箭頭(又名 LaTex Tikz 庫畫箭頭的簡要介紹)

文章目錄 前言注意事項1 Tikz 的調用方法&#xff1a;newcommand2 標號圓圈數字的添加方式&#xff1a;\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭頭寫法&#xff1a;插入點相對位移標號node3.1 第一張圖&#xff1a;插入點相對位移3.2 第二張圖&#xff1…

【MindSpore學習打卡】應用實踐-LLM原理和實踐-基于MindSpore實現BERT對話情緒識別

在當今的自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;情緒識別是一個非常重要的應用場景。無論是在智能客服、社交媒體分析&#xff0c;還是在情感計算領域&#xff0c;準確地識別用戶的情緒都能夠極大地提升用戶體驗和系統的智能化水平。BERT&#xff08;Bidirec…

imx6ull/linux應用編程學習(12)CAN應用編程基礎

關于裸機的can通信&#xff0c;會在其他文章發&#xff0c;這里主要講講linux上的can通信。 與I2C,SPI等同步通訊方式不同&#xff0c;CAN通訊是異步通訊&#xff0c;也就是沒有時鐘信號線來保持信號接收同步&#xff0c;也就是所說的半雙工&#xff0c;無法同時發送與接收&…

【Java 注解,自定義注解,元注解,注解本質,注解解析】

文章目錄 什么是注解&#xff1f;Java內置注解自定義注解元注解注解的本質注解解析 什么是注解&#xff1f; 注解是Java編程語言中的一種元數據&#xff0c;提供了有關程序的額外信息。注解以符號開始&#xff0c;緊跟著注解的名稱和一對括號&#xff0c;括號內包含注解的參數…

C++基礎篇(1)

目錄 前言 1.第一個C程序 2.命名空間 2.1概念理解 2.2namespace 的價值 2.3 namespace的定義 3.命名空間的使用 4.C的輸入輸出 結束語 前言 本節我們將正式進入C基礎的學習&#xff0c;話不多說&#xff0c;直接上貨&#xff01;&#xff01;&#xff01; 1.第一個C程…

【Linux進階】文件系統8——硬鏈接和符號連接:ln

在Linux下面的鏈接文件有兩種&#xff0c; 一種是類似Windows的快捷方式功能的文件&#xff0c;可以讓你快速地鏈接到目標文件&#xff08;或目錄)&#xff1b;另一種則是通過文件系統的inode 鏈接來產生新文件名&#xff0c;而不是產生新文件&#xff0c;這種稱為硬鏈接&…

base SAS programming學習筆記10(combine data)

1.一對一合并 基本格式如下&#xff1a; data output-data-set; set data-set1; set data-set2;(data-set1和data-set2可以是相同的數據集&#xff0c;可以添加多個set 語句來實現上述的一對一合并) run; 輸出數據集結果如下&#xff1a; a.會包含所有輸入數據的變量名&#x…

小米手機永久刪除的照片怎么找回?這兩個方法千萬不要錯過!

小米手機永久刪除的照片怎么找回&#xff1f;身為米粉發燒黨的小編又雙叒叕手殘了&#xff01;本來想在手機回收站中恢復一張照片&#xff0c;結果一個稀里糊涂就把照片點成了“永久刪除”。于是乎難得的休班假期&#xff0c;就變成了小編恢復永久刪除照片的漫漫之路。以下是小…

org.springframework.boot.autoconfigure.EnableAutoConfiguration=XXXXX的作用是什么?

org.springframework.boot.autoconfigure.EnableAutoConfigurationXXXXXXX 這一配置項在 Spring Boot 項目中的作用如下&#xff1a; 自動配置類的指定&#xff1a; 這一配置將 EnableAutoConfiguration 設置為 cn.geek.javadatamanage.config.DataManageAutoConfiguration&…