專利名稱:一種工程量計算方法
技術(shù)領域:
本發(fā)明涉及工程預決算技術(shù)領域,尤其涉及一種采用并行增量式計算的工程量計 算方法。
背景技術(shù):
在建筑工程預算、施工決算等方面都需要引用工程量數(shù)據(jù),包括混凝土方、人工費 用等等。而要得到這些工程量數(shù)據(jù),需先計算建筑的體積、表面積等基礎幾何量。由于復雜 的幾何相交扣減關(guān)系,這些量的人工計算繁瑣而費時,準確性也比較差。這正是工程量自動 計算軟件發(fā)揮作用之處。上述預決算方法的主要任務在于工程量計算,其核心思想均基于三維布爾運算, 即對任意兩個三維幾何體,求其交、并和補,得到新的幾何體,然后對它們的量進行運算、匯 總。這種運算本質(zhì)是對工程量扣減計算的數(shù)學描述,圍繞這套數(shù)學方法普遍操作流程是(1)對建筑構(gòu)件三維建模,從圖紙中的信息還原出建筑物完整的三維幾何信息;(2)基于(1)中的信息,利用三維布爾計算求得建筑物的整體幾何量,例如墻體體 積、梁體積(已計入扣件關(guān)系)、模板面積等等;(3)套用清單或者定額,得到最終需要的匯總量。其中,主要的計算量集中在第(2)步。參見圖1,示出了一種典型的現(xiàn)有工程量計算方法的計算過程,包括以下步驟SlOl、對構(gòu)件建模。S102、判斷是否建模完畢,若是,進入步驟S103;若否,返回步驟S101。S103、計算單個構(gòu)件的工程量。S104、計算構(gòu)件間相交部分的扣減工程量。S105、根據(jù)全部構(gòu)件的工程量及構(gòu)件間相交部分的扣減工程量,得到匯總工程量。S106、套用清單或定額,得到預決算結(jié)果。圖1示出的工程量計算方法采用建模完畢再計算的思路,即集中計算的模式。由 于工程計算量非常龐大,導致用戶建模后等待數(shù)分鐘甚至數(shù)小時才能看到計算結(jié)果。也有 些方案采用了 一些加速技巧,但總體講對計算速度的改進都杯水車薪,遠遠達不到實時效 果(建模完成即看到計算結(jié)果)。由此可見,現(xiàn)有技術(shù)的主要缺點體現(xiàn)在兩方面(1)計算速度慢。每次計算需要數(shù)分鐘甚至數(shù)小時的計算時間,在此期間用戶不能 操作軟件,只有等待計算完成。即便用戶對工程設計只做了一些細微的調(diào)整,也會導致工程 重頭到尾計算,計算時間得不到改觀。(2)沒有充分利用現(xiàn)代CPU的多核心特性,最大化地調(diào)動計算資源,提高效率。無 論用戶的電腦有多少個處理核心,都只能利用其中一個,資源利用率低。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的目的在于提供一種增量式工程量計算方法,可實現(xiàn)建模后即 完成工程量計算的實時計算效果。進而本發(fā)明采用后臺多線程并行增量式工程量計算方 法,以充分利用CPU的多核心資源,提高工程量計算效率。為解決上述技術(shù)問題,本發(fā)明提供的技術(shù)方案是,一種工程量計算方法,包括(10)提取已建模構(gòu)件集合;(20)編輯構(gòu)件,并識別已建模構(gòu)件集合中與編輯構(gòu)件存在相交和扣減關(guān)系的目標 構(gòu)件子集合;(30)計算編輯構(gòu)件的工程量,計算并更新目標構(gòu)件子集合中每個目標構(gòu)件的工程 量;(40)判斷建模是否結(jié)束,若是,進入步驟(10);若否,返回步驟(20);(50)匯總已建模構(gòu)件集合中所有已建模構(gòu)件的工程量。較優(yōu)地,編輯構(gòu)件的類型為添加構(gòu)件、刪除構(gòu)件或修改構(gòu)件。較優(yōu)地,修改構(gòu)件按照添加修改前構(gòu)件、刪除修改后構(gòu)件兩個步驟操作。較優(yōu)地,采用并行計算方式。較優(yōu)地,引入以下計算線程建模主線程,用于提取已建模構(gòu)件集合、編輯構(gòu)件并識別已建模構(gòu)件集合中與編 輯構(gòu)件存在相交和扣減關(guān)系的目標構(gòu)件子集合;工程量計算線程,用于計算編輯構(gòu)件的工程量,計算并更新目標構(gòu)件子集合中每 個目標構(gòu)件的工程量。較優(yōu)地,引入帶標記的垃圾回收線程,用于標記目標刪除構(gòu)件并在計算隊列為空 時清理已標記刪除構(gòu)件。較優(yōu)地,若發(fā)生因構(gòu)件被刪除而導致的非法內(nèi)存地址訪問錯誤,根據(jù)已標記刪除 構(gòu)件排除錯誤。較優(yōu)地,在步驟(50)之前,判斷是否發(fā)生因構(gòu)件被刪除而導致的冗余計算錯誤, 若是,剔除冗余計算結(jié)果。較優(yōu)地,引入計算準備線程,用于執(zhí)行工程量計算之前的預備工作。較優(yōu)地,工程量計算之前的預備工作包括建立構(gòu)件的三維實體模型、確定構(gòu)件之 間的影響關(guān)系、以及將待計算的工作添加入計算隊列之中。與現(xiàn)有技術(shù)相比,本發(fā)明采用增量式工程量計算方法,即在建模的同時進行工程 量計算,可實現(xiàn)建模后即完成工程量計算的實時計算效果。由于同時在后臺進行多線程計 算,即開啟后臺計算線程,利用一個或多個線程計算,這樣與建模主線程互不干擾,既不影 響用戶體驗,同時也能充分利用多核CPU資源,加快工程量的計算速度。特別地,采用了基 于標記的垃圾回收機制,用一個單獨的線程定期清理已刪除構(gòu)件,從而避免線程并發(fā)運行 可能引入的錯誤情況。
圖1為現(xiàn)有工程量計算方法的流程圖;圖2為本發(fā)明工程量計算方法實施例一的流程圖;圖3為圖2中針對不同編輯構(gòu)件工程量的處理方法的流程圖;圖4為本發(fā)明工程量計算方法實施例二的多線程架構(gòu)圖。
具體實施例方式本發(fā)明的核心為采取增量式計算,即在建模的同時進行工程量的計算,實現(xiàn)建模 后即完成工程量計算的實時效果。進而采用多線程并行計算方式,以充分利用CPU資源,從
而提高工程量計算效率。為了使本領域的技術(shù)人員更好地理解本發(fā)明的技術(shù)方案,下面結(jié)合附圖和具體實 施例對本發(fā)明作進一步的詳細說明。實施例一增量式工程量計算方法本發(fā)明采用增量式工程量計算的出發(fā)點是基于這樣的觀察——工程量軟件計算 的時間耗費遠小于其前期建模的時間耗費。由此,本發(fā)明改變傳統(tǒng)的工程量計算處理流程, 把集中計算改為增量式計算。也就是說,在用戶建模的同時對已完成建模的部分做計算,從 而把計算時間攤薄到建模時間中;最后用戶作總體計算的時候僅僅是簡單的匯總而已,而 最主要的計算在之前的建模過程中即早已完成,由此可實現(xiàn)建模后即完成工程量計算的實 時或準實時效果。為實現(xiàn)此目的,須得建立一套增量式計算框架。其中的建模過程包括圖紙智能識 別和用戶手繪構(gòu)件,可看成逐個往建筑物中添加、刪除或修改構(gòu)件的過程。取任意的一個時 間點,并假設在此之前完成的建模部分已完成全部計算,則采取以下處理方式(1)若添加新構(gòu)件a此時,構(gòu)件a只會影響那些與它空間上相交并且規(guī)則上有扣減關(guān)系的構(gòu)件。設在 添加a之前已完成建模的建筑中所有的構(gòu)件集合為Ω,并設Ω中所有與a有相交和扣減關(guān) 系的構(gòu)件集合為S。則只有S中的每個構(gòu)件8和3需要重新計算,Ω-S不受影響。重新計 算的過程和傳統(tǒng)方法類似,對每個s e S,用三維布爾運算結(jié)合工程量扣減計算規(guī)則求得s 新的工程量(主要計算a的影響),并加入計算得到的a的工程量。(2)刪除構(gòu)件a類似(1),構(gòu)件a也只會影響那些與它空間上相交并且規(guī)則上有扣減關(guān)系的構(gòu)件, 設在刪除a之前已完成建模的建筑中所有的構(gòu)件集合為Ω (不包括a),并設Ω中所有與a 有相交和扣減關(guān)系的構(gòu)件集合為S。只有S中的每個構(gòu)件s和a需要重新計算,Ω-S不受 影響。此時對每個s e S,用三維布爾運算結(jié)合工程量扣減計算規(guī)則求得s新的工程量(主 要計算a的影響),并刪除a的工程量。(3)修改構(gòu)件a類似(1),構(gòu)件a也只會影響那些與它空間上相交并且規(guī)則上有扣減關(guān)系的構(gòu)件, 設在修改a之前已完成建模的建筑中所有的構(gòu)件集合為Ω (不包括a),并設Ω中所有與構(gòu) 件a修改前或后有相交和扣減關(guān)系的構(gòu)件集合為S (S為構(gòu)件a修改前與其相交和扣減關(guān)系 的構(gòu)件集合和修改后與其相交和扣減關(guān)系的構(gòu)件集合的并集)。只有S中的每個構(gòu)件S和a需要重新計算,Ω-S不受影響。此時對每個s e S,用三維布爾運算結(jié)合工程量扣減計算 規(guī)則重新求得s新的工程量(主要計算a的影響),并重新計算a的工程量后予以更新。顯然,本發(fā)明通過增量式計算可大大減少計算量,從而提高工程量的計算效率,有 利于實現(xiàn)工程量實時計算目的。參見圖2,示出本發(fā)明工程量計算方法的實施例一的流程圖,主要包括以下步驟S201、提取已建模構(gòu)件集合。提取的已建模構(gòu)件集合中的每個已建模構(gòu)件的工程量及該已建模構(gòu)件集合的工 程量已經(jīng)完成。已建模構(gòu)件集合中為空,則已建模構(gòu)件集合的工程量為0。S202、編輯構(gòu)件,并識別已建模構(gòu)件集合中與編輯構(gòu)件存在相交和扣減關(guān)系的目 標構(gòu)件子集合。每一構(gòu)件建模視為編輯構(gòu)件,其類型包括添加構(gòu)件、刪除構(gòu)件與修改構(gòu)件,其中的 修改構(gòu)件也可以按照修改前添加構(gòu)件、修改后刪除構(gòu)件兩個步驟操作。而如何識別已建模 構(gòu)件集合中哪些構(gòu)件與編輯構(gòu)件存在相交和扣減關(guān)系,可依照現(xiàn)有技術(shù)進行,在此不再贅 述。對于識別出來的目標構(gòu)件構(gòu)成目標構(gòu)件子集合,后續(xù)工程量計算時只需要按照三 維布爾運算規(guī)則結(jié)合工程量扣減規(guī)則計算其中的每個目標構(gòu)件的工程量,而無需計算其它 已建模構(gòu)件的工程量,這就大大減少了計算量。S203、計算編輯構(gòu)件的工程量,計算并更新目標構(gòu)件子集合中每個目標構(gòu)件的工
程量。當前編輯構(gòu)件的工程量計算可依現(xiàn)有規(guī)則,而目標構(gòu)件子集合每個目標構(gòu)件的工 程量計算依照三維布爾運算規(guī)則結(jié)合工程量扣減規(guī)則計算,在此不再贅述。在這些相關(guān)構(gòu)件的工程量計算完畢后,將相應的已建模構(gòu)件集合的工程量予以更 新。若此時停止建模,只需通過對全部已建模構(gòu)件工程量簡單匯總就可以得到工程量的實 時或準實時計算效果。S204、判斷建模是否結(jié)束,若是,進入步驟S205;若否,返回步驟S201。S205、匯總已建模構(gòu)件集合中所有已建模構(gòu)件的工程量。匯總已建模構(gòu)件集合中所有已建模構(gòu)件的工程量時,需對前述編輯構(gòu)件本身的工 程量進行處理,具體采用如下方式。參見圖3,示出編輯構(gòu)件在不同類型下更新已建模構(gòu)件集合的工程量時的處理流程。S301、判斷編輯構(gòu)件的種類。S302、若當前編輯構(gòu)件為添加構(gòu)件,加入當前編輯構(gòu)件的工程量;S303、若當前編輯構(gòu)件為刪除構(gòu)件,減去當前編輯構(gòu)件的工程量;S304、若當前編輯構(gòu)件為修改構(gòu)件,更新當前編輯構(gòu)件的工程量。建模結(jié)束后,依照編輯構(gòu)件類型加入、減去或更新其工程量,然后對全部已建模構(gòu) 件匯總后得到全部構(gòu)件的幾何工程量,進一步套用清單或者定額就可以得到最終需要的匯 總量,最終得到預決算結(jié)果。
以上對增量式工程量計算方法的基本模式進行了說明,它可以實現(xiàn)工程量實時或 準實時計算效果。它可以采用串行計算方式,也可以采用并行計算方式,其中串行方式仍存 在以下問題(1)計算過程分攤到用戶的建模過程之中,如果建模和計算共享主線程,則計算過 程將干擾建模,很可能發(fā)生用戶界面不響應的情況,影響用戶體驗;(2)不能利用現(xiàn)代CPU多核心特性;(3)沒有考慮到計算擁堵的情況,考慮用戶一次編輯多個構(gòu)件,則這些構(gòu)件的計算 會因為無法同時完成而發(fā)生擁堵情況。為此,本發(fā)明進一步提出并行增量式后臺工程量計算的解決方案,進一步說明如 下。實施例二 并行增量式后臺工程量計算方法并行增量式后臺工程量計算方法具體包括以下要點(1)開啟后臺計算線程,利用一個或者多個線程來計算,這樣和建模主線程互不干 擾,不影響用戶體驗;同時也能充分利用多核CPU。(2)引入帶標記的垃圾回收機制,用一個單獨的線程定期清理已刪除的構(gòu)件,避免 并發(fā)可能引入的錯誤情況(如多線程計算引用了已經(jīng)被刪除的內(nèi)存空間導致內(nèi)存錯誤)。(3)為簡化操作并避免并行計算沖突,將構(gòu)件修改拆分為兩個步驟,即刪除修改前 構(gòu)件和添加修改后構(gòu)件??紤]計算擁塞的情況,待計算的構(gòu)件需要做三維布爾運算和幾何量運算,可以把 構(gòu)件和構(gòu)件上的計算綜合看成一個獨立的計算任務,在擁塞的情況下多個待計算的任務自 然形成了計算隊列,該隊列里各個計算任務相互獨立,但是計算結(jié)果有相關(guān)性。例如以下操 作(1)添加構(gòu)件a ;(2)添加和構(gòu)件a相交的構(gòu)件b ;(3)刪除構(gòu)件a。顯然第(3)步操作會導致第(2)步中b和a的扣減計算無效化。在串行增量式計 算的框架下,只有一個計算線程,因(1)、(2)、(3)順序執(zhí)行因果操作不會引入任何錯誤。但 考慮到多線程情況下,每個計算子線程的執(zhí)行時機通常無法預測,盡管每次它們都是從計 算隊列頭部取任務,避免了很多亂序的情況,但依然可能產(chǎn)生(1)、(3)、(2)這樣的亂序。此 時,可能發(fā)生兩種錯誤(1)冗余計算。構(gòu)件b計算了與a的相互扣減關(guān)系。(2)構(gòu)件b訪問構(gòu)件a,而構(gòu)件a已經(jīng)被刪除,可能導致非法的內(nèi)存地址訪問。對于前一種錯誤,本發(fā)明的應對策略是允許冗余計算,只是最后匯總前或者垃圾 收集階段判斷一次,剔除冗余的計算結(jié)果。這樣保證了程序的簡單性和可靠性。對于后一種錯誤,引入帶標記的垃圾回收線程。即每次刪除構(gòu)件的時候,被刪除的 構(gòu)件不做真正的刪除,只是打個標記表明需要刪除;然后當計算隊列為空時,掛起所有的計 算線程,并啟動垃圾回收線程,由它來逐個檢查構(gòu)件的標記,對那些標記了的構(gòu)件做真正的 刪除工作,并清空內(nèi)存。此外,為確定計算中編輯構(gòu)件a后需要進行哪些計算,編輯構(gòu)件a后需要先進行一定的準備工作,如果同時編輯了多個構(gòu)件,則可能會使響應變慢,從而影響用戶體驗。為此, 在計算和編輯構(gòu)件之間增加了一個額外的計算準備線程,專門執(zhí)行計算之前的預備工作, 包括建立構(gòu)件的三維實體模型、確定構(gòu)件的影響關(guān)系,準備工作完成后把待計算的工作添 加入計算隊列中。上述構(gòu)思集中體現(xiàn)為多線程并行計算方式,以下進一步對各線程進行說明。參見圖4,示出并行增量式工程量計算方法的多線程架構(gòu),包括線程調(diào)度程序401,在線程進入了就緒狀態(tài)時,根據(jù)優(yōu)先級決定該線程何時執(zhí)行;建模主線程402,用于提取已建模構(gòu)件集合、編輯構(gòu)件并識別已建模構(gòu)件集合中與 編輯構(gòu)件存在相交和扣減關(guān)系的目標構(gòu)件子集合;計算準備線程403,用于執(zhí)行工程量計算之前的預備工作,包括建立構(gòu)件的三維實 體模型、確定構(gòu)件之間的影響關(guān)系、以及將待計算的工作添加入計算隊列之中;工程量計算線程404,用于計算編輯構(gòu)件的工程量,計算并更新目標構(gòu)件子集合中 每個目標構(gòu)件的工程量;帶標記的垃圾回收線程405,用于標記目標刪除構(gòu)件并在計算隊列為空時清理已 標記刪除構(gòu)件。在設置帶標記的垃圾回收線程405的基礎上,若發(fā)生因構(gòu)件被刪除而導致的非法 內(nèi)存地址訪問錯誤,可根據(jù)已標記刪除構(gòu)件排除錯誤;若匯總工程量前判斷發(fā)生因構(gòu)件被 刪除而導致的冗余計算錯誤,根據(jù)相關(guān)已標記刪除構(gòu)件剔除冗余計算結(jié)果。由此,在線程調(diào)度程序401的調(diào)度下,建模主線程402、計算準備線程403、工程量 計算線程404、帶標記的垃圾回收線程405并發(fā)運行,能更高效地提高系統(tǒng)資源的利用率和 吞吐量。通過以上方法,將原串行計算過程設計為全增量并行計算,在不影響用戶操作體 驗的前提下,大大提高了計算效率,最終的計算僅僅是構(gòu)件結(jié)果的匯總過程,僅需要數(shù)秒即 可完成。本實施例的主要優(yōu)點是(1)實時計算,建模完畢即可查看計算結(jié)果,用戶無需任何等待時間;(2)后臺多線程計算,充分利用了現(xiàn)代多核CPU的計算能力。本實施例通過增量式算法+后臺多線程計算機制,充分利用了建模時間大于計算 時間的特性,邊建模邊計算,從而在現(xiàn)有多核CPU計算平臺上做到實時計算。本發(fā)明的上述實施例解決了以往土建工程量計算中存在的計算速度緩慢慢的問 題,把以往數(shù)分鐘到數(shù)小時的計算時間縮短到數(shù)秒鐘以內(nèi)(在大量不同配置個人電腦上測 量平均0 3秒鐘),從而使得計算程序以實時或準實時的速度運行。順便指出的是,另一種可能達到實時計算的方法是利用GPU通用計算平臺。由于 GPU驚人的并行高性能計算能力,只要把運算尤其是幾何體三維布爾運算遷移到GPU平臺, 就有希望在傳統(tǒng)計算方案下也做到實時計算。但是目前GPU平臺一者計算速度遠達不到工 程量實時計算的要求,二者高精度計算能力還有欠缺,三者價格高昂非一般人群可以負擔, 要在實際產(chǎn)品中采用上述方案還有待時間考察。以上僅是本發(fā)明的優(yōu)選實施方式,應當指出的是,上述優(yōu)選實施方式不應視為對 本發(fā)明的限制,本發(fā)明的保護范圍應當以權(quán)利要求所限定的范圍為準。對于本技術(shù)領域的
8普通技術(shù)人員來說,在不脫離本發(fā)明的精神和范圍內(nèi),還可以做出若干改進和潤飾,這些改 進和潤飾也應視為本發(fā)明的保護范圍。
權(quán)利要求
1. 一種工程量計算方法,其特征在于,包括(10)提取已建模構(gòu)件集合;(20)編輯構(gòu)件,并識別已建模構(gòu)件集合中與編輯構(gòu)件存在相交和扣減關(guān)系的目標構(gòu)件 子集合;(30)計算編輯構(gòu)件的工程量,計算并更新目標構(gòu)件子集合中每個目標構(gòu)件的工程量;(40)判斷建模是否結(jié)束,若是,進入步驟(10);若否,返回步驟(20);(50)匯總已建模構(gòu)件集合中所有已建模構(gòu)件的工程量。
2.根據(jù)權(quán)利要求1所述的工程量計算方法,其特征在于,編輯構(gòu)件的類型為添加構(gòu)件、 刪除構(gòu)件或修改構(gòu)件。
3.根據(jù)權(quán)利要求2所述的工程量計算方法,其特征在于,修改構(gòu)件按照添加修改前構(gòu) 件、刪除修改后構(gòu)件兩個步驟操作。
4.根據(jù)權(quán)利要求1、2或3所述的工程量計算方法,其特征在于,采用并行計算方式。
5.根據(jù)權(quán)利要求4所述的工程量計算方法,其特征在于,引入以下計算線程建模主線程,用于提取已建模構(gòu)件集合、編輯構(gòu)件并識別已建模構(gòu)件集合中與編輯構(gòu) 件存在相交和扣減關(guān)系的目標構(gòu)件子集合;工程量計算線程,用于計算編輯構(gòu)件的工程量,計算并更新目標構(gòu)件子集合中每個目 標構(gòu)件的工程量。
6.根據(jù)權(quán)利要求5所述的工程量計算方法,其特征在于,引入帶標記的垃圾回收線程, 用于標記目標刪除構(gòu)件并在計算隊列為空時清理已標記刪除構(gòu)件。
7.根據(jù)權(quán)利要求6所述的工程量計算方法,其特征在于,若發(fā)生因構(gòu)件被刪除而導致 的非法內(nèi)存地址訪問錯誤,根據(jù)已標記刪除構(gòu)件排除錯誤。
8.根據(jù)權(quán)利要求6所述的工程量計算方法,其特征在于,在步驟(50)之前,判斷是否發(fā) 生因構(gòu)件被刪除而導致的冗余計算錯誤,若是,剔除冗余計算結(jié)果。
9.根據(jù)權(quán)利要求5所述的工程量計算方法,其特征在于,引入計算準備線程,用于執(zhí)行 工程量計算之前的預備工作。
10.根據(jù)權(quán)利要求9所述的工程量計算方法,其特征在于,工程量計算之前的預備工作 包括建立構(gòu)件的三維實體模型、確定構(gòu)件之間的影響關(guān)系、以及將待計算的工作添加入計 算隊列之中。
全文摘要
本發(fā)明公開一種工程量計算方法,包括(10)提取已建模構(gòu)件集合;(20)編輯構(gòu)件,并識別已建模構(gòu)件集合中與編輯構(gòu)件存在相交和扣減關(guān)系的目標構(gòu)件子集合;(30)計算編輯構(gòu)件的工程量,計算并更新目標構(gòu)件子集合中每個目標構(gòu)件的工程量;(40)判斷建模是否結(jié)束,若是,進入步驟(10);若否,返回步驟(20);(50)匯總已建模構(gòu)件集合中所有已建模構(gòu)件的工程量。本發(fā)明采用增量式計算方法,建模的同時進行相關(guān)構(gòu)件的工程量計算,從而將工程量計算時間攤薄至建模時間之中,有利于實現(xiàn)實時計算效果。
文檔編號G06F17/50GK102004828SQ20101054608
公開日2011年4月6日 申請日期2010年11月15日 優(yōu)先權(quán)日2010年11月15日
發(fā)明者余俠, 張鵬, 陳順斌 申請人:成都鵬業(yè)軟件股份有限公司