主要步驟使用 Visual Studio 創(chuàng)建 .NET Framework 4.7.2 的類庫項(xiàng)目 項(xiàng)目中添加對 ProjectPenguin.dll 以及 NSGeo3dm.dll 的引用 創(chuàng)建自定義類,并聲明繼承自 ProcessorCardBase,然后實(shí)現(xiàn)相關(guān)的抽象函數(shù),以及一個 無參數(shù)構(gòu)造函數(shù) 復(fù)制編譯結(jié)果至Y-GAMA的 自定義卡片文件夾 內(nèi)
步驟詳解接下來的內(nèi)容是對上述四個步驟的詳解,并且標(biāo)明了一些需要特別注意的細(xì)節(jié)。 【1 - 使用 Visual Studio 創(chuàng)建 .NET Framework 4.7.2 的類庫項(xiàng)目】首先需要在安裝Visual Studio時,需要選擇 .NET 桌面開發(fā) (.NET desktop development)。并注意在右側(cè)需要有 .NETFramework4.7.2targeting pack: 
若右側(cè)沒有 .NETFramework4.7.2targeting pack 選項(xiàng)出現(xiàn),則需要選擇上方的 “單個組件”標(biāo)簽頁,勾選它: 
若您已經(jīng)安裝過 Visual Studio,則可以通過啟動 Visual Studio Installer (一般可以從開始菜單內(nèi)搜索找到)來啟動上述所示的畫面,并確認(rèn)上述組件是否有安裝: 

在確認(rèn)Visual Studio環(huán)境確認(rèn)完畢之后,就可以開始建立項(xiàng)目了。打開Visual Studio之后,選擇新建項(xiàng)目。 
選擇 類庫 (.NET Framework),不要選擇僅有“類庫”二字的選項(xiàng)。 
點(diǎn)擊下一步后,在隨后的選項(xiàng)中可以任意輸入自己喜歡的名字、項(xiàng)目存放的磁盤位置。然后在框架中需要選擇的是 .NETFramework4.7.2 或更低的版本。 
您當(dāng)前的Visual Studio版本可能與這里展示的版本選項(xiàng)略有出入,這是正常的,也不會影響到后續(xù)的正??ㄆ瑯?gòu)建,只需要確保目標(biāo)庫的版本是 .NETFramework4.7.2 或更低的版本即可。 此時,我們的第一步就完成了。 最后,重新列出在該步驟中需要特別注意的點(diǎn): 特別注意:
【2 - 添加對 ProjectPenguin.dll 以及 NSGeo3dm.dll 的引用】項(xiàng)目建立完畢之后,我們就可以開始著手準(zhǔn)備為 Y-GAMA 編寫代碼了。但是,在編寫代碼之前,我們需要添加對 Y-GAMA 的運(yùn)行必要的 DLL類庫 添加引用,這樣,我們編寫、編譯出來的類庫文件才可以被 Y-GAMA 識別并加載運(yùn)行。 我們需要引用的 DLL類庫 一般來說有2個: 下面我們就來為我們剛剛建立的項(xiàng)目添加這兩個 DLL類庫 的引用。 首先在Visual Studio的 “解決方案資源管理器” 中找到引用,并在上面單擊鼠標(biāo)右鍵,選擇“添加引用…”: 
此時,在彈出的窗口中,選擇“瀏覽”,并在Y-GAMA的安裝目錄下找到對應(yīng)的 ProjectPenguin.dll 以及 NSGeo3dm.dll 文件,依次添加。 

確認(rèn)添加之后,我們就可以在 “解決方案資源管理器” 的 “引用” 下面看到我們剛剛添加的兩個 DLL類庫 的引用了。 
此時,我們還需要一步操作,那就是對它們的屬性進(jìn)行設(shè)置:在 “解決方案資源管理器” 中,同時選擇剛剛添加的 ProjectPenguin.dll 以及 NSGeo3dm.dll 引用之后,在其中任意一個引用上點(diǎn)擊右鍵,選擇屬性。 
此時在“屬性”頁面中,將“復(fù)制本地”(Copy Local)選項(xiàng)設(shè)置為 “否”(false)。 
做完上述步驟后,就可以開始代碼邏輯的編寫了。 特別注意:
【3 - 創(chuàng)建第一個自定義卡片類】所有在 Y-GAMA 繪圖區(qū)域所看到的內(nèi)容都是 卡片,而大部分我們在創(chuàng)建參數(shù)化工作流時用到的卡片都是繼承自 ProcessorCardBase 的一類 “數(shù)據(jù)處理卡片”。我們在這里就以制作一個輸出“Hello, World”的卡片為例,學(xué)習(xí)如何制作自己的 數(shù)據(jù)處理卡片 。 我們在該步驟的目標(biāo)是:編寫一個繼承自 ProcessorCardBase的類。在Visual Studio為我們創(chuàng)建項(xiàng)目時,其實(shí)就已經(jīng)準(zhǔn)備好了一個類的模板,以及其對應(yīng)的文件。為了方便起見,我們就不再向該項(xiàng)目中添加其他的文件了,直接在默認(rèn)的這個類中進(jìn)行操作。 我們需要聲明該類繼承自 ProcessorCardBase (using ProjectPenguin.Cards): using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
using ProjectPenguin.Cards;
namespace ClassLibrary1 { public class Class1 : ProcessorCardBase { } } 此時, Class1名字下應(yīng)該會出現(xiàn)紅色波浪線,我們?nèi)绻咽髽?biāo)懸停在波浪線處,則會彈出提示信息。提示信息為未實(shí)現(xiàn)抽象方法xxx。 我們找到提示框最下方處的“顯示可能的修補(bǔ)程序”,鼠標(biāo)左鍵單擊它,選擇“實(shí)現(xiàn)抽象類” 
選擇完成后,Visual Studio就會為我們生成許多代碼了,但每個函數(shù)中都是一句 thrownewNotImplementedException(); 這些內(nèi)容都是我們接下來要進(jìn)行替換的。 
自定義卡片類的無參數(shù)構(gòu)造函數(shù)聲明 在我們替換它們之前,讓我們先來為我們的數(shù)據(jù)處理卡片起個名字??ㄆ峭ㄟ^ 無參數(shù)構(gòu)造函數(shù) 來實(shí)現(xiàn)的。在此處,我們的類名字叫做 Class1,因此我們的 無參數(shù)構(gòu)造函數(shù) 寫為: public Class1() : base('基本名稱', '縮寫', '描述信息', '大類', '子類') {
}
基本名稱:直接顯示在畫布中的名稱 縮寫:某些情況下,不便于直接顯示基本名稱(太長)時,會使用縮寫 描述信息:鼠標(biāo)懸停在卡片上時,會顯示的提示信息 大類及子類:參照下圖 (“常用”大類是自動生成的,一般來說不要聲明大類名稱“常用”)

自定義卡片類的抽象函數(shù)實(shí)現(xiàn)接下來,我們需要將四個 thrownewNotImplementedException();進(jìn)行替換,來真正地實(shí)現(xiàn)自定義卡片的運(yùn)行。這四個抽象函數(shù)分別對應(yīng)的作用是: CardGuid: 一個全局唯一的標(biāo)識號,用來唯一地確定“卡片類別”,可以認(rèn)為是“身份證”一樣的存在。【切勿手工編造輸入,后文會介紹生成方法】 Build: 卡片運(yùn)行的主邏輯 AddInputSideDataCards: 卡片的輸入端口聲明(卡片左端接口聲明) AddOutputSideDataCards: 卡片的輸出端口聲明(卡片右端接口聲明)
實(shí)現(xiàn) CardGuid 屬性的 get方法:我們需要使用 Visual Studio 自帶的 Guid生成器 來獲得一個全新的隨機(jī)的 Guid。在菜單欄的“工具”菜單下,點(diǎn)擊“創(chuàng)建GUID”。 
然后在彈出來的創(chuàng)建GUID小工具中,選擇“注冊表格式”,并點(diǎn)擊“復(fù)制”。此時,生成的Guid文本就已經(jīng)被復(fù)制到您的剪切板上了。 
隨后,我們將 CardGuid=>thrownewNotImplementedException()替換為 Guid.Parse方法(下面所示的代碼僅為示例,您所生成的Guid將會有所不同,這是正常的現(xiàn)象;請確保每次新建類的時候,都有不一樣的Guid,以保證 Y-GAMA 能夠?yàn)槊總€不同的卡片來分配唯一標(biāo)識): public override Guid CardGuid => Guid.Parse('{95FAD3CB-B4DC-4E3A-9D94-F7266F2CA0DB}'); 實(shí)現(xiàn) AddInputSideDataCards 以及 AddOutputSideDataCards正如其函數(shù)名稱所代表的, AddInputSideDataCards 里的代碼是用來實(shí)現(xiàn)添加卡片的入口端,而 AddOutputSideDataCards 里的代碼是用來實(shí)現(xiàn)添加卡片的出口端。 我們目前只想要實(shí)現(xiàn)輸出一個 “Hello, world” 字符串,所以我們無需對 AddInputSideDataCards 里填寫任何代碼,僅需對 AddOutputSideDataCards 中添加一個 字符串 類型的出口即可: protected override void AddInputSideDataCards(IDataCardEmbedmentHelper helper) { }
protected override void AddOutputSideDataCards(IDataCardEmbedmentHelper helper) { helper.AddWellKnownTypeOfDataCard( typeof(string), // 出口的數(shù)據(jù)類型 '卡片出口', // 出口全名,將會在鼠標(biāo)懸停時顯示 '出口', // 出口簡稱,將會直接顯示在卡片上 '卡片出口的描述性文字…', // 出口描述信息,將會在鼠標(biāo)懸停時候顯示 ProjectPenguin.Cards.Enums.DataProcessingMode.OneByOne); // 出口的數(shù)據(jù)處理模式 } 實(shí)現(xiàn) Build 方法Build方法是 數(shù)據(jù)處理卡片 的核心,它會負(fù)責(zé)從卡片入口中收集數(shù)據(jù)、處理數(shù)據(jù)、以及將處理完成的數(shù)據(jù)設(shè)置到卡片出口中。在我們的這個簡單案例中,僅需要對出口的數(shù)據(jù)設(shè)置為'Hello, world'這個字符串即可:
public override void Build(IDataDelivery idd) { idd.SetDataItem( 0, // 出口的編號,從0開始。我們僅有一個出口,因此為0 // 若有多個出口則按照添加順序依次排列 'Hello, world!' // 需要輸出的數(shù)據(jù)結(jié)果 ); } 到此為止,我們的代碼部分就已經(jīng)完成了,完成后的我們Visual Studio大致應(yīng)該是這樣的: 特別注意: CardGuid 不要手動輸入,容易產(chǎn)生Guid沖突,導(dǎo)致自定義卡片類庫加載不成功 自定義類必須具備 無參數(shù)構(gòu)造函數(shù) 需要將所有的 thrownewNotImplementedException() 替換或者刪除
【4 - 復(fù)制編譯結(jié)果至Y-GAMA的“自定義卡片文件夾”之中】上面內(nèi)容完整做完之后,我們就可以開始編寫結(jié)果后處理事件,讓Visual Studio每次都自動復(fù)制編譯好的類庫文件至 Y-GAMA 的自定義卡片文件夾了。 Y-GAMA 的自定義卡片文件夾可以直接在下列目錄找到: C:\Users\<<您的電腦登錄用戶名稱>>\AppData\Roaming\yjkSoft\Penguin\Cards
也可以通過在 Y-GAMA 中點(diǎn)擊“文件”菜單,選擇“打開自定義卡片文件夾”。 
特別提醒:自定義卡片文件夾內(nèi)的卡片將會在下一次 Y-GAMA 啟動的時候讀取,若您在復(fù)制自定義卡片類庫時, Y-GAMA 仍處在運(yùn)行狀態(tài),則需要將 Y-GAMA 以及 盈建科計(jì)算軟件 在內(nèi)的軟件整體關(guān)閉,再次打開,才能加載新的自定義卡片。
找到自定義卡片文件夾路徑后,則可以回到 Visual Studio 中,在“解決方案資源管理器”中找到我們的類庫項(xiàng)目 “ClassLibrary1”,在上面點(diǎn)擊右鍵,選擇“屬性”: 
在左側(cè)選擇“生成事件”標(biāo)簽,在“生成后事件命令行”中依據(jù)您的自定義卡片文件夾來填入下面的內(nèi)容: 
Copy '$(TargetPath)' 'C:\Users\<<您的電腦登錄用戶名稱>>\AppData\Roaming\yjkSoft\Penguin\Cards\$(TargetName).crd'
特別提醒:
設(shè)置生成后事件命令行之后,就可以啟動編譯了。 
如果一切都沒問題,編譯成功之后,我們就可以在我們的自定義卡片文件夾里找到剛剛編譯成功的卡片類庫了: 
此時啟動 Y-GAMA (如果您之前有正在運(yùn)行的 Y-GAMA,請將 Y-GAMA 及其關(guān)聯(lián)的 盈建科結(jié)構(gòu)設(shè)計(jì)軟件 一起關(guān)閉之后,再次啟動) 
Hello, world! 總結(jié)本文簡單地介紹了一下如何基于 Y-GAMA 當(dāng)前版本 (v0.6.11)來制作自定義卡片。 自定義卡片其實(shí)是一個 .NETFramework的類庫,在 Y-GAMA 啟動時將會被加載,并且讀取其中的自定義卡片類,并在使用時將其實(shí)例化。自定義卡片的名字及其所屬分類由卡片類的 無參數(shù)構(gòu)造函數(shù) 確定,自定義卡片的出入口由其實(shí)現(xiàn)的抽象函數(shù) AddInputSideDataCards 以及 AddOutputSideDataCards 來確定,自定義卡片的主要工作邏輯由其實(shí)現(xiàn)的抽象函數(shù) Build 來確定。 編譯完成的類庫文件復(fù)制到自定義卡片文件夾、并將后綴名改為“.crd”后即可被 Y-GAMA 識別并加載。該復(fù)制操作可以通過 Visual Studio 的編譯后處理事件命令行來自動完成。
加入QQ群,我們一起來探索YJK-GAMA的 無限可能! 接下來我們還會給您帶來更多的驚喜,關(guān)注我們公眾號吧! 非解構(gòu)數(shù)字科技 新科技 新設(shè)計(jì) 新建造 2篇原創(chuàng)內(nèi)容 公眾號 非解構(gòu) 建筑與結(jié)構(gòu)語匯的非常解釋 358篇原創(chuàng)內(nèi)容 公眾號 有任何問題,您也可以直接聯(lián)系我們“大菲兒”。
|