• <menu id="w2i4a"></menu>
  • logo VectorDraw教程
    文檔首頁>>VectorDraw教程>>新手入門必看:VectorDraw 常見問題整理大全(四)

    新手入門必看:VectorDraw 常見問題整理大全(四)


    VectorDraw Developer Framework(VDF)是一個(gè)用于應(yīng)用程序可視化的圖形引擎庫。有了VDF提供的功能,您可以輕松地創(chuàng)建、編輯、管理、輸出、輸入和打印2D和3D圖形文件。該庫還支持許多矢量和柵格輸入和輸出格式,包括本地PDF和SVG導(dǎo)出。

    VectorDraw Developer Framework最新版下載

    VectorDraw web library (javascript)是一個(gè)矢量圖形庫。VectorDraw web library (javascript)不僅能打開CAD圖紙,而且能顯示任何支持HTML5標(biāo)準(zhǔn)平臺(tái)上的通用矢量對象,如Windows,安卓,iOS和Linux。無需任何安裝,VectorDraw web library (javascript)就可以運(yùn)行在任何支持canvas標(biāo)簽和Javascript的主流瀏覽器(Chrome, Firefox, Safari, Opera, Dolphin, Boat等等)中。

    VectorDraw web library (javascript)最新版下載

    一. 在包裝器組件中使用新對象和功能

    問:如何在包裝器組件中使用新對象和功能?

    答:包裝器組件是一個(gè)COM ActiveX,可以在vd6和c ++ 6等環(huán)境中使用。我們已經(jīng)實(shí)現(xiàn)了.tlb文件,這些文件可以添加到項(xiàng)目的引用中,并且可以為您的應(yīng)用程序提供新組件的功能。

    導(dǎo)出的tlb文件:VectorDraw.Serialize.tlbVectorDraw.Render.tlbVectorDraw.Professional.tlbVectorDraw.Geometry.tlbVectorDraw.Actions.tlbVdrawPro5.tlbvdrawi5.tlbvdPropertyGrid.tlbVdProControl.tlb

    下面的代碼示例實(shí)現(xiàn)了包裝器組件,其中使用按鈕我們添加了一個(gè)vdMtext對象,這是一個(gè)全新的對象,它在我們的新庫中實(shí)現(xiàn),并且在版本5中不存在。

    對于這個(gè)實(shí)現(xiàn),我們導(dǎo)入了VectorDraw.Geometry .tlb,VectorDraw.Professional.tlb以及vdrawi5.tlb

    VB6代碼示例:

    Private Sub Command1_Click()
    'Get the document interface of VectorDraw FrameWork
       Dim doc As VectorDraw_Professional.vdDocument
       Set doc = VDraw1.ActiveDocument.WrapperObject
    'Create a new Mtext object with VDF Interfaces
       Dim mtext As VectorDraw_Professional.vdMText
       Set mtext = New VectorDraw_Professional.vdMText
    
       'typecast the Mtext as vdbaseObject
       Dim baseobj As VectorDraw_Professional.vdBaseObject
       Set baseobj = mtext
       baseobj.SetUnRegisterDocument doc
       'typecast the Mtext as vdPrimary
       Dim primary As VectorDraw_Professional.vdPrimary
       Set primary = mtext
       primary.setDocumentDefaults
    
       'Create a gPoint object
       Dim pt As VectorDraw_Geometry.gPoint
       Set pt = New VectorDraw_Geometry.gPoint
       pt.SetValue 2, 3, 0
       'set values in some properties of mtext
       mtext.TextString = "VectorDraw Mtext using VDF Interfaces"
       Set mtext.InsertionPoint = pt
       mtext.BoxWidth = 12
       mtext.Height = 1#
    
       'typecast the Mtext as vdFigure
       Dim fig As VectorDraw_Professional.vdFigure
       Set fig = mtext
       'add mtext in the collection entities table
       doc.ActiveLayOut.entities.AddItem fig
    
       primary.Update
       fig.Invalidate
       VDraw1.CommandAction.Zoom "e", 0, 0
    End Sub

    C ++代碼示例:

    void Cvd6WrapperDlg::OnBnClickedMtext()
    {
    //Get the document interface of VectorDraw FrameWork
       VectorDraw_Professional::IvdDocumentPtr doc =       m_vdraw.GetActiveDocument().GetWrapperObject();
    
    //Create a new Mtext object with VectorDraw FrameWork Interfaces
       VectorDraw_Professional::IvdMTextPtr    mtext(__uuidof(VectorDraw_Professional::vdMText));
    
    //typecast the Mtext as vdbaseObject
       VectorDraw_Professional::IvdBaseObjectPtr baseobj =    (VectorDraw_Professional::IvdBaseObjectPtr)mtext;
       baseobj->SetUnRegisterDocument(doc);
    
    //typecast the Mtext as vdPrimary
       VectorDraw_Professional::IvdPrimaryPtr primary = (VectorDraw_Professional::IvdPrimaryPtr)mtext;
       primary->setDocumentDefaults();
    
    //Create a gPoint object;
       VectorDraw_Geometry::IgPointPtr pt(__uuidof(VectorDraw_Geometry::gPoint));
    pt->SetValue(2,3,0);
    
    //set values in some properties of mtext
       mtext->PutRefInsertionPoint(pt);
       mtext->PutTextString("Vectordraw Mtext using VectorDrawFramework Interfaces");
       mtext->PutBoxWidth(12);
       mtext->PutHeight(1.0);
    
    //typecast the Mtext as vdFigure
       VectorDraw_Professional::IvdFigurePtr figure = (VectorDraw_Professional::IvdFigurePtr)mtext;
    
    //add mtext in the collection entities table
       doc->ActiveLayOut->Entities->AddItem(figure);
       primary->Update();
       figure->Invalidate();
      m_vdraw.GetCommandAction().Zoom(COleVariant(_T("e")),COleVariant(),COleVariant());
    }

    Delphi 7代碼示例:

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SHDocVw, AxCtrls, OleCtrls,
    VDrawLib5_TLB, VDrawI5_TLB, VectorDraw_Professional_TLB, VectorDraw_Geometry_TLB;
    
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
       mtext : VectorDraw_Professional_TLB.IvdMText;
       pt : VectorDraw_Geometry_TLB.Igpoint;
       doc : VectorDraw_Professional_TLB.IvdDocument;
       primary : VectorDraw_Professional_TLB.IvdPrimary;
       baseobject : VectorDraw_Professional_TLB.IvdBaseObject;
    
    begin
       doc := vdrawpro.ActiveDocument.WrapperObject as VectorDraw_Professional_TLB.IvdDocument;
       pt := VectorDraw_Geometry_TLB.CogPoint.Create();
       pt.SetValue(2,3,0);
       mtext := VectorDraw_Professional_TLB.CovdMText.Create();
       baseobject := mtext as VectorDraw_Professional_TLB.IvdBaseObject;
       baseobject.SetUnRegisterDocument(doc);
       primary:=mtext as VectorDraw_Professional_TLB.IvdPrimary;
       primary.setDocumentDefaults();
       mtext.TextString := 'VectorDraw Mtext using VDF Interfaces';
       mtext.InsertionPoint := pt;
       mtext.BoxWidth := 12;
       mtext.Height := 1;
       doc.ActiveLayOut.entities.AddItem(mtext as VectorDraw_Professional_TLB.IvdFigure);
       vdrawpro.CommandAction.Zoom('E',0,0);
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    var vdGPts : VectorDraw_Geometry_TLB.Igpoints;
      doc : VectorDraw_Professional_TLB.IvdDocument;
      primary : VectorDraw_Professional_TLB.IvdPrimary;
      baseobject : VectorDraw_Professional_TLB.IvdBaseObject;
      vdGPt : VectorDraw_Geometry_TLB.Igpoint;
      GS : VectorDraw_Professional_TLB.IvdGroundSurface;
      I : integer;
    
    begin
      vdraw1.DisplayFrames:=63;
      vdraw1.StatusBar:=true;
      vdraw1.StatusBarMenu:=true;
      vdraw1.EnableAutoGripOn:=true;
    
      doc := vdraw1.ActiveDocument.WrapperObject as VectorDraw_Professional_TLB.IvdDocument;
    
      vdGPts := VectorDraw_Geometry_TLB.CogPoints.Create();
      for I:=1 to 8 do // create a ground sourface from 8 points
      begin
        vdGPt := VectorDraw_Geometry_TLB.CogPoint.Create();
        vdGPts.Add(vdGpt);
      end;
    
      vdGPTs.Item[0].SetValue(2,3,0);
      vdGPTs.Item[1].SetValue(2,5,1);
      vdGPTs.Item[2].SetValue(4,5,1.5);
      vdGPTs.Item[3].SetValue(4,3,1);
      vdGPTs.Item[4].SetValue(7,3,2);
      vdGPTs.Item[5].SetValue(7,5,0.5);
      vdGPTs.Item[6].SetValue(9,3,0.3);
      vdGPTs.Item[7].SetValue(9,5,0.5);
    
      GS := VectorDraw_Professional_TLB.CovdGroundSurface.Create();
      baseobject := GS as VectorDraw_Professional_TLB.IvdBaseObject;
      baseobject.SetUnRegisterDocument(doc);
      primary:=GS as VectorDraw_Professional_TLB.IvdPrimary;
      primary.setDocumentDefaults();
      GS.Points := vdGPts;
      GS.MeshSize := 0.1;
      GS.DispMode := DisplayMode_Mesh;//DisplayMode_Triangle;
      doc.ActiveLayOut.entities.AddItem(GS as VectorDraw_Professional_TLB.IvdFigure);
      vdraw1.CommandAction.View3D('VISE');
      vdraw1.CommandAction.Zoom('E',0,0);
    end;

    二. 計(jì)算用戶在3D中單擊多邊形的點(diǎn)

    問:如何計(jì)算用戶在3D中單擊多邊形的點(diǎn)?

    答:在下面的代碼示例中,我們要求用戶單擊一個(gè)點(diǎn)。我們檢查用戶是否單擊了一個(gè)多邊形。從這一點(diǎn)開始,我們計(jì)算出一條從用戶的"eye"和內(nèi)部開始的線。我們計(jì)算此線與找到的多面的所有面的交點(diǎn)。然后我們排除所有不屬于臉部的點(diǎn),我們選擇更接近用戶“eye”的點(diǎn)。

    Important Functions Used : Intersection3DSegmentPlane,PointInTriangle, CalculateExtrution  can be found in VectorDraw.Geometry.Globals.
    
    private void button4_Click(object sender, EventArgs e)
    {
    vdDocument doc = vdFramedControl1.BaseControl.ActiveDocument;
    gPoint userpt = null;
    //Get a point from the user
    VectorDraw.Actions.StatusCode s= doc.ActionUtility.getUserPointDCS(out userpt);
    if (s == VectorDraw.Actions.StatusCode.Success)
    {
    //Find the polyface the user clicked.
    gPoint tmppt = doc.View2PixelMatrix.Transform(userpt);
    Point screenpt = new Point((int)tmppt.x, (int)tmppt.y);
    //This function it is recommended not to go to the Mouse Down event(it might slow down your application)
    //It is recommended to create a button function to do this like this one.
    vdEntities ents = doc.Select3d(screenpt, doc.GlobalRenderProperties.PickSize);
    if (ents.Count != 0)
    {
    vdPolyface polyface = ents[0] as vdPolyface;
    if (polyface != null)
    {
    //Calculate the biggest z value of the polyface.
    double val = 0.0;
    foreach (gPoint var in polyface.VertexList)
    {
    if (val < var.z) val = var.z;
    }
    //Calculate the line that starts from the point that the user clicked and goes "inside the screen" to intersect the face. 
    gPoint world = doc.View2WorldMatrix.Transform(userpt);
    gPoint linept1 = world - (val * 10.0) * doc.ActiveLayOut.ViewDir;
    gPoint linept2 = world + (val*10.0)*doc.ActiveLayOut.ViewDir;
    gPoints FoundPoints = new gPoints();
    int count = 1;
    foreach (int var in polyface.FaceList)
    {
    count++;
    if (count % 5 == 0)
    {
    //4 points of the face.
    gPoint pt1 = polyface.VertexList[polyface.FaceList[count - 5] - 1];
    gPoint pt2 = polyface.VertexList[polyface.FaceList[count - 4] - 1];
    gPoint pt3 = polyface.VertexList[polyface.FaceList[count - 3] - 1];
    gPoint pt4 = polyface.VertexList[polyface.FaceList[count - 2] - 1];
    //Calculate the perpedicular vector of the plane of the face.
    Vector v = new Vector();
    v.CalculateExtrution(pt1, pt2,pt3);
    //Calculate the intersection point of the plane with the above calculated line
    gPoint ret1 = new gPoint();
    int j = VectorDraw.Geometry.Globals.Intersection3DSegmentPlane(linept1, linept2, v, pt1, out ret1);
    if (j != 0)
    {
    bool triangle1 = VectorDraw.Geometry.Globals.PointInTriangle(doc.World2ViewMatrix.Transform (ret1),doc.World2ViewMatrix.Transform ( pt1), doc.World2ViewMatrix.Transform (pt2), doc.World2ViewMatrix.Transform (pt3));
    bool triangle2 = VectorDraw.Geometry.Globals.PointInTriangle(doc.World2ViewMatrix.Transform (ret1),doc.World2ViewMatrix.Transform ( pt1),doc.World2ViewMatrix.Transform ( pt3), doc.World2ViewMatrix.Transform (pt4));
    if (triangle1 || triangle2) //If the point belongs to any of the triangles then belongs to the face.
    {
    //Add the found point to this list.
    FoundPoints.Add(ret1);
    }
    }
    }
    }
    //Debug Add a vdPoint for each point found.
    foreach (gPoint var in FoundPoints)
    {
    vdPoint vdpt = new vdPoint();
    vdpt.SetUnRegisterDocument(doc);
    vdpt.setDocumentDefaults();
    vdpt.PenColor.ColorIndex = 2;
    vdpt.InsertionPoint = var;
    doc.ActiveLayOut.Entities.AddItem(vdpt);
    vdpt.Invalidate();
    }
    //This is for debug purposes we will add the calculated line and the Found Point.
    vdLine line = new vdLine(linept1, linept2);
    line.SetUnRegisterDocument(doc);
    line.setDocumentDefaults();
    line.PenColor.ColorIndex = 0;
    doc.ActiveLayOut.Entities.AddItem(line);
    line.Invalidate();
    
    //Now we will choose the point that has the less distance from linept2
    int index = 0;
    int indexFound = 0;
    double dist = linept1.Distance3D(linept2); //We start from the biggest distance
    foreach (gPoint var in FoundPoints)
    {
    double dist1 = var.Distance3D(linept2);
    if (dist1 < dist)
    {
    indexFound = index;
    dist = dist1;
    }
    index++;
    }
    //Add the Found point with different color.
    vdPoint vdpt1 = new vdPoint();
    vdpt1.SetUnRegisterDocument(doc);
    vdpt1.setDocumentDefaults();
    vdpt1.PenColor.ColorIndex = 3;
    vdpt1.InsertionPoint = FoundPoints[indexFound];
    doc.ActiveLayOut.Entities.AddItem(vdpt1);
    vdpt1.Invalidate();
    }
    }
    }
    }

    未完待續(xù)......

    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();