Jerry去年的文章 動(dòng)手使用ABAP Channel開(kāi)發(fā)一些小工具,提升日常工作效率 里曾經(jīng)介紹過(guò)一些用ABAP實(shí)現(xiàn)的可供娛樂(lè)的小程序,比如用古老的HPGL接口在SAPGUI里繪圖: 關(guān)于如何用SAP + HPGL語(yǔ)言在SAPGUI里畫(huà)出這只哆啦A夢(mèng)來(lái),參考Jerry的文章: 使用SAPGUI畫(huà)圖 https://www.jianshu.com/p/d3852942b1a9 本文要介紹的是另一種在SAPGUI里用ABAP繪圖的方式。矢量圖(Scalable Vector Graphics)也是一種圖像格式,和傳統(tǒng)的圖像格式相比具有很多優(yōu)點(diǎn),因此近些年使用越來(lái)越廣泛:
看個(gè)具體的例子。一個(gè)矩形由四條邊組成,所以一個(gè)矩形的SVG實(shí)現(xiàn),則是由對(duì)應(yīng)的四條由line標(biāo)簽代表的線段構(gòu)成。 從這個(gè)例子我們也能發(fā)現(xiàn),SVG標(biāo)簽可以直接被嵌入HTML網(wǎng)頁(yè)里。 而ABAP有一個(gè)工具類,CL_ABAP_BROWSER提供了SHOW_HTML方法,可以在SAPGUI里打開(kāi)一個(gè)嵌入的瀏覽器窗口。 這樣,我們將前面介紹的包含有矩形的SVG格式的HTML代碼傳入SHOW_HTML的HTML_STRING參數(shù),發(fā)現(xiàn)可以在SAPGUI環(huán)境下完美工作: 因此,“使用ABAP繪制可伸縮矢量圖”這個(gè)命題,就簡(jiǎn)化為“使用ABAP拼接可伸縮矢量圖對(duì)應(yīng)的HTML源代碼”,一下子就把復(fù)雜的圖形操作需求,降維成相對(duì)簡(jiǎn)單的字符串拼接操作了。 Jerry小學(xué)的時(shí)候,上編程啟蒙課,在386計(jì)算機(jī)上學(xué)習(xí)過(guò)一門(mén)名叫Logo的編程語(yǔ)言。Logo一詞源于希臘文,原意為“文字”或“思考”、“想法”,是一種面向過(guò)程式語(yǔ)言,1976年由美國(guó)麻省理工學(xué)院佩帕特(Seymour Papert)教授指導(dǎo)下的一個(gè)研究小組, 在LISP語(yǔ)言基礎(chǔ)上,專門(mén)為兒童研制開(kāi)發(fā)的編程語(yǔ)言。當(dāng)時(shí)教這門(mén)課的老師,一位老大爺,直接把語(yǔ)言里畫(huà)圖的cursor說(shuō)成是“海龜”,可謂簡(jiǎn)單形象。 下圖是用Logo語(yǔ)言畫(huà)出來(lái)的圖案。 有趣的是,30年之后,SAP捷克研究院一位開(kāi)發(fā)人員,在Github上創(chuàng)建了一個(gè)ABAP代碼倉(cāng)庫(kù),將SVG常用的繪圖操作用類Logo語(yǔ)言的語(yǔ)法封裝成庫(kù),庫(kù)的名稱就叫ABAP Turtle,仿佛是在向傳統(tǒng)的Logo語(yǔ)言致敬。 https://github.com/FreHu/abap-turtle-graphics 這位ABAP開(kāi)發(fā)人員的聯(lián)系方式維護(hù)在Github上,大家感興趣的可以自行去交友。 基于這位SAP開(kāi)發(fā)人員創(chuàng)建的ABAP Turtle庫(kù)的SVG矩形繪制代碼如下: 下面這個(gè)圖形又是如何畫(huà)出來(lái)的呢?首先選屏幕某個(gè)點(diǎn)作為圖形的中心點(diǎn),從中心點(diǎn)出發(fā)畫(huà)一個(gè)正十邊形,回到原點(diǎn),然后重復(fù)繪制19次正十邊形。每次繪制從中心點(diǎn)出發(fā)時(shí),順時(shí)針偏移360 / 20 = 18度角。 最后我們看到的圖形,是由20個(gè)正十邊形施加了18度角的偏移量后疊加而成。 對(duì)應(yīng)的實(shí)現(xiàn)代碼: 我們還可以自己編輯一些指令序列,比如用符號(hào)F代表前進(jìn),加號(hào)代表右轉(zhuǎn),減號(hào)代表左轉(zhuǎn)。用這三個(gè)符號(hào)就可以組裝一些自定義指令,然后通過(guò)參數(shù)num_iterations指定,按照我們期望的迭代次數(shù)執(zhí)行圖像繪制。 你能想象下面這個(gè)圖形,是由"_|—|_"這個(gè)基礎(chǔ)圖形按照F+F-F-F+F迭代四次構(gòu)成的么? 考一考大家,下面這棵樹(shù)如何通過(guò)構(gòu)造自定義的SVG指令畫(huà)出來(lái)? 答案在FreHu的github里:https://github.com/FreHu/abap-turtle-graphics 更多閱讀
|
|