使用ABAP绘制可伸缩矢量图
Jerry去年的文章 動手使用ABAP Channel開發一些小工具,提升日常工作效率 里曾經介紹過一些用ABAP實現的可供娛樂的小程序,比如用古老的HPGL接口在SAPGUI里繪圖:
關于如何用SAP + HPGL語言在SAPGUI里畫出這只哆啦A夢來,參考Jerry的文章:
使用SAPGUI畫圖
本文要介紹的是另一種在SAPGUI里用ABAP繪圖的方式。矢量圖(Scalable Vector Graphics)也是一種圖像格式,和傳統的圖像格式相比具有很多優點,因此近些年使用越來越廣泛:
- SVG是開放的標準,基于XML,可以直接用純文本工具編輯;
- SVG與JPEG和GIF等圖像格式比起來,尺寸更小,可壓縮性更強;
- SVG顧名思義,是一種可伸縮(Scalable)的圖像格式,在圖形尺寸發生改變的情況下,圖形質量也不會受到影響。
- SVG圖形中的文字是可選可搜索的,最適合用于繪制地圖。
看個具體的例子。一個矩形由四條邊組成,所以一個矩形的SVG實現,則是由對應的四條由line標簽代表的線段構成。
從這個例子我們也能發現,SVG標簽可以直接被嵌入HTML網頁里。
而ABAP有一個工具類,CL_ABAP_BROWSER提供了SHOW_HTML方法,可以在SAPGUI里打開一個嵌入的瀏覽器窗口。
這樣,我們將前面介紹的包含有矩形的SVG格式的HTML代碼傳入SHOW_HTML的HTML_STRING參數,發現可以在SAPGUI環境下完美工作:
因此,“使用ABAP繪制可伸縮矢量圖”這個命題,就劃歸為“使用ABAP拼接可伸縮矢量圖對應的HTML源代碼”,一下子就把復雜的圖形操作需求,降維成相對簡單的字符串拼接操作了。
Jerry小學的時候,上的編程啟蒙課,在386上學習過一門名叫Logo的編程語言。LOGO一詞源于希臘文,原意為“文字”或“思考”、“想法”,是一種過程性語言,1976年由美國麻省理工學院佩帕特(Seymour Papert)教授指導下的一個研究小組, 在LISP語言基礎上,專門為兒童研制開發的編程語言。當時教這門課的老師,一位老大爺,直接把語言里畫圖的cursor說成是“海龜”,可謂簡單形象。
下圖是用Logo語言畫出來的圖案。
有趣的是,30年之后,SAP捷克研究院一位開發人員,在Github上創建了一個ABAP代碼倉庫,將SVG常用的繪圖操作用類LOGO語言的語法封裝成庫,庫的名稱就叫ABAP Turtle,仿佛是在向傳統的LOGO語言致敬。
這位ABAP開發人員的聯系方式維護在Github上,大家感興趣的可以自行去交友。
基于這位SAP開發人員創建的ABAP Turtle庫的SVG矩形繪制代碼如下:
下面這個圖形又是如何畫出來的呢?首先選屏幕某個點作為圖形的中心點,從中心點出發畫一個正十邊形,回到原點,然后重復繪制19次正十邊形。每次繪制從中心點出發時,順時針偏移360 / 20 = 18度角。
最后我們看到的圖形,是由20個正十邊形施加了18度角的偏移量后疊加而成。
對應的實現代碼:
我們還可以自己編輯一些指令序列,比如用符號F代表前進,加號代表右轉,減號代表左轉。用這三個符號就可以組裝一些自定義指令,然后通過參數num_iterations指定,按照我們期望的迭代次數執行圖像繪制。
你能想象下面這個圖形,是由"|—|"這個基礎圖形按照F+F-F-F+F迭代四次構成的么?
考一考大家,下面這棵樹如何通過構造自定義的SVG指令畫出來?
答案在FreHu的github里:https://github.com/FreHu/abap-turtle-graphics
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
總結
以上是生活随笔為你收集整理的使用ABAP绘制可伸缩矢量图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视频编码的常见参数基本概念 –
- 下一篇: 如何免费试用SAP的Fiori应用