翻譯|使用教程|編輯:況魚(yú)杰|2019-08-26 11:51:36.330|閱讀 649 次
概述:本系列教程整理了VectorDraw Developer Framework(VDF)最常見(jiàn)問(wèn)題,教程整理的很齊全,非常適合新手學(xué)習(xí),本節(jié)教程將會(huì)介紹提供復(fù)雜自定義對(duì)象的入門(mén)指南。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
相關(guān)鏈接:
VectorDraw Developer Framework(VDF)是一個(gè)用于應(yīng)用程序可視化的圖形引擎庫(kù)。有了VDF提供的功能,您可以輕松地創(chuàng)建、編輯、管理、輸出、輸入和打印2D和3D圖形文件。
VectorDraw Developer Framework試用版下載
問(wèn):
能否提供復(fù)雜自定義對(duì)象的入門(mén)指南?
答:
我們將嘗試為您提供有關(guān)自定義對(duì)象的詳細(xì)說(shuō)明以及您應(yīng)該如何嘗試實(shí)現(xiàn)此類(lèi)實(shí)現(xiàn)。我們的指南是針對(duì)C#中的.NET項(xiàng)目,主要是我們使用的編程語(yǔ)言。
首先,您必須創(chuàng)建一個(gè)包含2個(gè)項(xiàng)目的解決方案,就像我們的樣本中實(shí)現(xiàn)的那樣。一個(gè)項(xiàng)目將是一個(gè)非常簡(jiǎn)單的控件形式(可滾動(dòng),框架無(wú)關(guān)緊要),最好是vdFramedControl,因?yàn)榫哂袑傩粤斜砗兔钚械膙dFramedControl將為您提供一個(gè)很好的調(diào)試項(xiàng)目。在任何情況下,您為vdFramedControl編寫(xiě)的代碼對(duì)于vdScrollableControl都是相同的。所以我們有一個(gè)帶有vdFramedControl的項(xiàng)目和一些用于測(cè)試自定義對(duì)象的按鈕。
第二個(gè)項(xiàng)目將是一個(gè)DLL,它將包含您的自定義對(duì)象(與我們的示例中的完全相同)。具有該表單的其他項(xiàng)目需要此項(xiàng)目的引用,以便您可以使用自定義對(duì)象進(jìn)行測(cè)試。
完成自定義對(duì)象的實(shí)現(xiàn)后,可以在主應(yīng)用程序中引用dll而不會(huì)出現(xiàn)問(wèn)題,您可以使用此解決方案來(lái)測(cè)試和調(diào)試自定義對(duì)象。
現(xiàn)在,在這些初始設(shè)置之后,我們開(kāi)始使用自定義對(duì)象。
首先,您需要為自定義對(duì)象提供一些屬性,這些屬性與它的幾何有關(guān),以及如何繪制此對(duì)象。再找一個(gè)vdFigure對(duì)象并定義這樣的對(duì)象。
public class vdBox :vdFigure , IvdProxyFigure
作為vdFigure的vdBox,已經(jīng)有一個(gè)pencolor,一個(gè)圖層,一個(gè)penstyle等,接下來(lái)將可以用于繪制對(duì)象(稍后將在draw方法中解釋?zhuān)?br/>
這樣的自定義對(duì)象需要IvdProxyFigure,為對(duì)象添加一個(gè)空構(gòu)造函數(shù),還有一個(gè)傳遞Document的幫助構(gòu)造函數(shù)。您還可以添加一個(gè)傳遞一些基本屬性的構(gòu)造函數(shù),但這可以在我們完成屬性后添加。
/// Empty constructor of the object always required for creating a custom object. public vdBox() { } /// Helpfull constructor that also initializes the object with Document's defaults. /// The Document that the object will use.public vdBox(vdDocument Doc) { SetUnRegisterDocument(Doc); setDocumentDefaults(); }
我們還將為對(duì)象添加一些屬性:
我們需要一個(gè)VertexList(點(diǎn)集合)來(lái)保持小矩形的點(diǎn)。
您還需要一個(gè)主矩形的中心點(diǎn)(gPoint)。
main的MainWidth / MainHeight(雙精度值)。
小矩形的LittleWidth / LittleHeight(雙值)。
您應(yīng)該添加所有自定義對(duì)象示例中所述的屬性,如下所示。
private gPoint mInsertionPoint = null; /// /// The Insertion Point of the vdBox object. /// [EditorAttribute(typeof(VectorDraw.Professional.PropertyList.vdPickPointDialog),typeof(System.Drawing.Design.UITypeEditor))] [GlobalizedCategory("Geometry")] [GlobalizedDisplayName("InsertionPoint")] [GlobalizedDescription("Get/Set the Insertion Point of the vdTable object in World Coordinative System.")] public gPoint InsertionPoint { get { if (mInsertionPoint == null)mInsertionPoint = new gPoint(); return mInsertionPoint; } set { if (InsertionPoint.AreEqual(value)) return; AddHistory("InsertionPoint", value); //For the Undo/Redo implementation of VectorDraw mInsertionPoint.CopyFrom(value); } }
Globalized ...在屬性列表中用于顯示按鈕的描述,屬性的名稱以及它的類(lèi)別。如果您不打算在應(yīng)用程序中使用我們的屬性列表,則不必添加這些內(nèi)容。
現(xiàn)在我們已經(jīng)完成了屬性的設(shè)置,接下來(lái)需要重寫(xiě)Draw方法。
public override VectorDraw.Render.vdRender.DrawStatus Draw(VectorDraw.Render.vdRender render) { vdRender.DrawStatus doDraw = base.Draw(render); if (doDraw == vdRender.DrawStatus.Successed) { //Draw stuff here } AfterDraw(render); return doDraw; }
如果調(diào)用base.Draw,那么必須始終調(diào)用AfterDraw,小心任何try {} catch語(yǔ)句。
這些調(diào)用基本上會(huì)初始化繪制的一些功能,并設(shè)置基本顏色用vdFigure的pencolor等繪制,因此,如果我們?cè)赿raw方法中繪制一條線并且該對(duì)象的pencolor為紅色,那么該線將為紅色。
您可以使用如下所示的渲染的PushPenStyle方法和PopPenStyle(總是在后面)來(lái)更改顏色。
render.PushPenstyle(BackGroundColor, false); render.DrawSolidPolygon(this, mSegments, vdRender.PolygonType.Simple); render.PopPenstyle();
現(xiàn)在需要繪制主矩形,但事先解釋一下ECS矩陣,您可以在我們的自定義對(duì)象和VDF對(duì)象中看到ECSMatrix。在用戶坐標(biāo)系中繪制對(duì)象要容易得多,比方說(shuō)0,0,0然后使用ECSMatrix轉(zhuǎn)換繪制對(duì)象。例如,我們將通過(guò)將中心點(diǎn)設(shè)置為0,0,0繪制主矩形,然后使用ECSMatrix上的InsertionPoint將對(duì)象轉(zhuǎn)換到那里。
double wid = 3.0; //(this Value will Be property among others) render.PushMatrix(ECSMatrix); gPoints pts = new gPoints(); pts.Add(new gPoint (-wid,-wid,0.0)); pts.Add(new gPoint(wid, -wid, 0.0)); pts.Add(new gPoint(wid, wid, 0.0)); pts.Add(new gPoint(-wid, wid, 0.0)); pts.Add(new gPoint (-wid,-wid,0.0)); render.DrawPLine(this, pts); render.PopMatrix();
這將繪制一個(gè)矩形?,F(xiàn)在我們覆蓋ECSMatrix并設(shè)置InsertionPoint。
public override Matrix ECSMatrix { get { if (mEcsMatrix != null) return mEcsMatrix; mEcsMatrix = new Matrix(); mEcsMatrix.TranslateMatrix(InsertionPoint.x, InsertionPoint.y, InsertionPoint.z); return mEcsMatrix; } }
對(duì)于EcsMatrix,您可以添加屬性,如ExtrusionVector,Rotation,Scale等查看我們的樣品。在我們看到繪制對(duì)象之前需要實(shí)現(xiàn)的最后一件事是BoundingBox。
public override Box BoundingBox { get { if (mBoundBox.IsEmpty) { mBoundBox = new Box(); mBoundBox.AddPoint(new gPoint()); mBoundBox.AddWidth(3.0); mBoundBox.TransformBy(ECSMatrix); } return mBoundBox; } }
必須根據(jù)對(duì)象的各種屬性計(jì)算BoundingBox,它是一個(gè)始終包含對(duì)象的框。
現(xiàn)在,在初始編碼之后,我們可以將自定義對(duì)象添加到模型(文檔)的實(shí)體中并查看它。轉(zhuǎn)到用于調(diào)試的Sample應(yīng)用程序,在添加所需的引用之后,讓我們將此自定義對(duì)象添加到Document。
Add the code to a simple test button : vdBox box = new vdBox(vdFramedControl1.BaseControl.ActiveDocument); box.InsertionPoint = new gPoint(10, 10, 0); vdFramedControl1.BaseControl.ActiveDocument.Model.Entities.AddItem(box); vdFramedControl1.BaseControl.ActiveDocument.Redraw(true);
注意:矩形以10,10繪制,寬度為3.0。
這個(gè)矩形已經(jīng)可以選擇,您可以看到它的屬性-framedControl的propertiesList,并且還可以更改它們以查看它們?nèi)绾闻c對(duì)象交互。
在我們完成對(duì)象的繪制和它的繪制屬性之后,我們將不得不實(shí)現(xiàn)一些基本的覆蓋方法,這些方法是幾種vdraw方法所必需的。
首先,我們添加Serialize / DeSerialize覆蓋方法,以便將對(duì)象保存在vdml / vdcl中(實(shí)現(xiàn)保存了對(duì)象的所有屬性,可以在我們的示例中看到)。
每次需要重繪項(xiàng)目時(shí)都會(huì)調(diào)用Update覆蓋。在這里,您可以初始化一些與對(duì)象繪制有關(guān)的私有數(shù)據(jù)。如果更改對(duì)象或任何其他屬性的顏色,則將調(diào)用此方法。例如,如果您對(duì)對(duì)象的繪制進(jìn)行了必要的硬計(jì)算(并且需要時(shí)間來(lái)計(jì)算),則可以將結(jié)果保存在私有結(jié)構(gòu)中。然后在draw方法中,如果結(jié)果的值為null,則僅執(zhí)行此計(jì)算,并將此value = null設(shè)置為update方法。這樣,如果對(duì)象未更改,則除非需要更新對(duì)象,否則不會(huì)調(diào)用計(jì)算。如果更改基本屬性,則只在應(yīng)用程序中的自定義對(duì)象外調(diào)用update。
移動(dòng)或縮放對(duì)象時(shí)調(diào)用Transformby覆蓋。例如,您可以調(diào)用CmdMove命令并選擇對(duì)象。如果您實(shí)現(xiàn)TransformBy,那么您可以通過(guò)在此方法中更改它的InsertionPoint來(lái)移動(dòng)您的對(duì)象。GetGripPoints是一種方法,您可以在其中添加對(duì)象所需的夾點(diǎn)。將對(duì)象添加到Document的實(shí)體時(shí),將調(diào)用OnDocumentSelected override。你可以在這里為對(duì)象做初始化的東西。
克隆對(duì)象需要MatchProperties覆蓋。例如,當(dāng)您調(diào)用move命令然后創(chuàng)建并繪制克隆對(duì)象以便您看到對(duì)象移動(dòng)時(shí),VectorDraw將使用克隆。了解如何使用示例中自定義對(duì)象的屬性實(shí)現(xiàn)此方法。
在爆炸自定義對(duì)象時(shí)調(diào)用爆炸方法,你應(yīng)該在這里返回VectorDraw原語(yǔ)像vdRect,vdPolyline,vdCircle等對(duì)象。如果要在DWG / DXF文件中導(dǎo)出對(duì)象,也會(huì)調(diào)用此方法,結(jié)果將是以這些格式保存。
如果希望自定義對(duì)象在命令中顯示Osnaps,則會(huì)將getOsnapPoints覆蓋用于Osnaps。
完成上述操作后,您可以將自定義對(duì)象添加到文檔的實(shí)體中,以格式繪制,保存/導(dǎo)出。您可以使用代碼添加此對(duì)象。
現(xiàn)在,您必須創(chuàng)建一個(gè)命令CreateBox。通過(guò)向用戶詢問(wèn)簡(jiǎn)單的點(diǎn)和寬度然后創(chuàng)建對(duì)象,可以執(zhí)行如下的簡(jiǎn)單命令。
public static bool CreateBox(vdDocument Doc) { gPoint cen = new gPoint(); Doc.Prompt("Insertion Point : "); object ret = Doc.ActionUtility.getUserPoint(); Doc.Prompt(null); if (ret == null || !(ret is gPoint)) return false; cen = ret as gPoint; Doc.Prompt("Width : "); ret = Doc.ActionUtility.getUserDist(cen); Doc.Prompt(null); if (ret == null) return false; double Width = (double)ret; vdBox box = new vdBox(Doc); box.InsertionPoint = cen; Doc.Model.Entities.AddItem(box); return true; }
并在測(cè)試按鈕中調(diào)用此方法。
vdBox.CreateBox(vdFramedControl1.BaseControl.ActiveDocument);
如果您希望用戶進(jìn)行交互并在命令期間實(shí)時(shí)繪制對(duì)象,則可以實(shí)現(xiàn)更復(fù)雜的操作(例如,如果要在選擇框的寬度時(shí)查看要繪制的自定義對(duì)象) 使用ActionEntityEx。您可以在VectorDrawPolygon命令的CmdPolygon中看到一個(gè)很好的示例。
相關(guān)資料推薦:
VectorDraw Developer Framework(VDF)示例
如果您對(duì)想要購(gòu)買(mǎi)正版授權(quán)VectorDraw Developer Framework(VDF),可以聯(lián)系咨詢相關(guān)問(wèn)題。
關(guān)注慧聚IT微信公眾號(hào) ???,了解產(chǎn)品的最新動(dòng)態(tài)及最新資訊。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: