如何實現一個類似於autoCAD軟體?

渲染可以考慮用cairo或skia作為backend,但諸如選擇矩形,添加線條等交互,有什麼有比較好的架構設計?


這個問題不是幾句話,或幾篇文章就能講清楚的。簡單的說幾句,整體上看,Autocad整體實現上是一種很典型的面向對象式的架構設計,直線,圓,多段線,填充,各種類型的標註,凡是Autocad里的各種元素都抽象成對象,這些對象稱為資料庫對象,對象上實現繪製自身的介面,介面的實現一般就是根據對象特徵,通過幾何系統定義的幾何圖元來表達自己,然後通過幾何演算法,離散成顯示系統定義的顯示圖元,二維情況下一般就是線段了。這個過程在Auocad里被稱為是重生成。遍歷所有的資料庫對象,把以上的重生成過程走一遍,顯示用的數據就收集好了,丟給顯示系統繪製就出來了,略去各種優化措施不講,顯示系統設計並不複雜,會畫線段就夠了。

拾取或選擇的思想,大概就是在重生成的過程中,搜集對象的包圍盒,組成一顆空間索引樹,根據給定的點或框選範圍在樹上做搜索,回溯到對象作點擊測試,當然這些都是簡化的模型,實際的細節很繁雜。

命令的實現也是對象化的,所有命令對象都註冊到一個map里,map的鍵就是命令的名稱。命令的調度,大概就是一個大的命令循環,最外層不斷的獲取文字輸入,不管是點擊命令按鈕或是直接在命令行輸入,最終都會轉化為命令字元串丟給命令循環。命令循環就負責解析命令字元串,查表找到命令對象,開啟一個協程(纖程),進入對這個命令的調度,命令的調度大體上也類似,獲取參數輸入,需要交互的地方就開個事件循環。算了,不說了,說不清楚,總之,整就是個大的狀態機。

樓主如果真想了解Autocad的架構和實現,下載個Autocad的擴展框架ObjectARX,研究研究它的文檔,嘗試下Autocad的二次開發,可以很快的自己理解。


AutoCAD大部分的技術和架構,幾乎都是你憑直覺就能想得到的。如果你直覺想不到,那基本上都是細節上的坑,不自己擼一擼是不太明白的。

對於這個規模的軟體,幾十年積累的產品就不是一句話兩句話說得清楚的。

你需要的不是Framework,也不是技術,而是勞動力。

最後,AutoCAD是OpenGL的。。。


開源的 CAD 不少,去看吧。

這些一眼能看到的都沒啥難的,怎麼搞定一個設計打開比內存都大還要能順利操作之類的工程問題才是麻煩。


CAD的渲染應當只是一個小部分,一大部分都在數據操作上。


e...為何切入點如此奇特?一個像Autocad、Solidwork這樣的工業設計軟體跟3dmax那樣的軟體不一樣的,他的渲染功能基本就是個配菜,所以按照題主的問法這問題根本就沒法回答...

要不(從開發介面的角度)簡單介紹一下Autocad的幾大模塊吧,包括有負責數據的db模塊,負責交互的ed模塊,負責顯示的gs模塊,負責幾何計算的ge模塊,當然也有雜七雜八的列印圖像約束等等十來個各種次要一些的模塊了。我想說的是所有這些東西要實現都是不難的,但是要做到autocad那樣的性能和擴展性的話恐怕知乎上你是找不到答案的


我無cad經驗。可嘗試說說。 感覺你是想不考慮渲染那一層,而專門考慮幾何元素的pick與增刪改操作?

可以先定義那些線,方形等對象,然後用什麼表示,點線相連?

先搞定操作對象的選擇,

有了操作對象之後就是點線拓撲的改動,

更新那些對象,

渲染接著更新,存儲接著更新。

上面是最簡單的流程。

要實際有用的話可能是一個不斷填坑的過程。希望有所幫助。


像AutoCAD已經存在20,30年以上的東西,是多少人年累積下來的,1,2個人的或者30,50人的團隊是不能在短期做出來的,但是實現一個基本的框架倒是不難,按面對對象開發來說,首先要定義實體類或者叫圖元類,基本圖元操作放在基類裡面,然後點、線,面,各種複雜圖元繼承並實現各自的特點,比如點的基本要素是坐標,直線是兩個點坐標,折線是多個點坐標,園是半徑,然後就是操作類,也就是響應滑鼠、鍵盤操作,操作類負責操作圖元,整體視圖應該有一個圖元的集合,繪製就是集合的批量渲染,也可能成組批量操作,或者不同圖元組合成組,不同圖元間還會有關聯,比如兩個矩形連上了線等等,還有圖層,操作命令(應用命令模式,支持撤銷、重做),等等等等。

好吧,這基本上是一個二維矢量圖軟體最基本的框架。應該類似軟體都是這樣實現的。


題主還在么?我有類似的想法,能聊聊么?


推薦閱讀:

怎樣才能從菜鳥級別升級為CAD的精英?可以講述你們是怎麼學習的嗎?都是買什麼書籍?
怎麼將cad的繪圖整到word上面?
如何學好 CAD?從未知到入門再到熟練掌握,如何把控這個過程?
CAD向程序發送命令時出現問題?
安裝cad後不小心卸了,再次重新安裝時顯示已安裝。這個怎麼破?

TAG:軟體架構 | CAD | 圖形圖像 | OpenGL | GDI |