博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【矢量图控件教程】矢量图控件VectorDraw 常见问题整理大全(一)
阅读量:6093 次
发布时间:2019-06-20

本文共 11092 字,大约阅读时间需要 36 分钟。

是一个用于应用程序可视化的图形引擎库。有了VDF提供的功能,您可以轻松地创建、编辑、管理、输出、输入和打印2D和3D图形文件。该库还支持许多矢量和栅格输入和输出格式,包括本地PDF和SVG导出。

【矢量图控件教程】矢量图控件VectorDraw 常见问题整理大全(一)
是一个矢量图形库。VectorDraw web library (javascript)不仅能打开CAD图纸,而且能显示任何支持HTML5标准平台上的通用矢量对象,如Windows,安卓,iOS和Linux。无需任何安装,VectorDraw web library (javascript)就可以运行在任何支持canvas标签和Javascript的主流浏览器(Chrome, Firefox, Safari, Opera, Dolphin, Boat等等)中。


一. 导出背景色的SVG文件

问:是否可以导出背景颜色不同于白色的SVG文件?

答:可以通过一些代码行来指示VDF(VectorDraw Developer Framework)组件在OnDrawBackground事件中使用Palette的背景颜色,例如:

// the form conatins a vdFramedControl and a Buttonbool isOnSVGSave = false; // use this global boolean in the form and make it true just before saving the SVG and then again to false after save is finishedprivate void button1_Click(object sender, EventArgs e){    vdDocument doc = vdFramedControl.BaseControl.ActiveDocument;    doc.Open(@"C:\test\simple1.vdml"); // open a test file    doc.Palette.Background = Color.LightYellow; // change the background color    doc.Palette.Forground = Color.DarkSlateGray; // and the foreground color..........    isOnSVGSave = true; //set this flag to true before saving SVG    doc.OnDrawBackground += new vdDocument.DrawBackgroundEventHandler(doc_OnDrawBackground); // enable the event    doc.SaveAs(@"c:\test\svg1.svg"); // save the SVG    doc.OnDrawBackground -= new vdDocument.DrawBackgroundEventHandler(doc_OnDrawBackground); // disable the event    isOnSVGSave = false;//set this flag back to false after saving SVG}void doc_OnDrawBackground(object sender, vdRender render, ref bool cancel){    if (isOnSVGSave && render!=null && render is RenderFormats.SvgRender) // check that is on "save" and render is SvgRender    {        cancel = true; // you need to pass this as tru        render.Clear(vdFramedControl.BaseControl.ActiveDocument.Palette.Background); // clear the render and use the Palette’s Background color!    }}

二. 在非XY平面中创建polyhatch

问:如何在非X / Y平面中创建polyhatch?

答:在创建剖面线时,多边形曲线和剖面线应位于X / Y平面中,因此如果在相同但不是X / Y平面中有折线,则需要将它们“带”到X / Y平面,创建聚阴影线,然后让他们回到他们的平面。请看以下代码:

private void Test()       {           vdDocument doc = vdFramedControl.BaseControl.ActiveDocument;           doc.New();           #region create 2 random polylines           // we will use two circles in order to get some random points from them to create the polylines.           vdCircle cir1 = new vdCircle(doc, new gPoint(3, 2), 5);           vdCircle cir2 = new vdCircle(doc, new gPoint(3, 2), 2);           Vector vec = new Vector(0.3, 0.7, -0.2); vec.Normalize();           cir1.ExtrusionVector = vec;           cir2.ExtrusionVector = vec;           // 2 circles are created in the same "random" plane           // get some points from these just to "have" two polylines           gPoints pts1 = cir1.geomMeasure(7); // points of 1st polyline           gPoints pts2 = cir2.geomMeasure(4); // points of 2nd polyline           #endregion           Matrix mat = new Matrix(); // this is the matrix of the plane that the circles belong to           mat.SetToViewDirection(vec, 0.0d);           Matrix invmat = new Matrix(mat.GetInvertion());           // create the curves for the polyhatch           vdPolyline pl = new vdPolyline(doc, pts1);           // vector should be perpendicular in the plane where the polyline is and can also calculated using CalculateNormal3P, like:           Vector vec2 = new Vector();           Vector.CalculateNormal3P(pl.VertexList[0] as gPoint, pl.VertexList[1] as gPoint, pl.VertexList[2] as gPoint, out vec2);           // in this case we already have it from the circle, as we set it above.           pl.ExtrusionVector = vec;           pl.Flag = VdConstPlineFlag.PlFlagCLOSE;           pl.Transformby(mat); // we need to bring these points to X/Y plane           pl.Update();           VectorDraw.Professional.vdCollections.vdCurves curves_Outer = new VectorDraw.Professional.vdCollections.vdCurves();           curves_Outer.AddItem(pl);           pl = new vdPolyline(doc, pts2);           pl.ExtrusionVector = vec;           pl.Flag = VdConstPlineFlag.PlFlagCLOSE;           pl.Transformby(mat); pl.Update(); // we need to bring these points to X/Y plane           VectorDraw.Professional.vdCollections.vdCurves curves_Inside = new VectorDraw.Professional.vdCollections.vdCurves();           curves_Inside.AddItem(pl);           //'create polyhatch           vdPolyhatch onehatch = new vdPolyhatch(doc);           onehatch.PolyCurves.AddItem(curves_Outer);           onehatch.PolyCurves.AddItem(curves_Inside);           onehatch.HatchProperties = new VectorDraw.Professional.vdObjects.vdHatchProperties(VectorDraw.Professional.Constants.VdConstFill.VdFillModeSolid);           onehatch.Transformby(invmat); // bring this to the plane where the circles are.           doc.Model.Entities.AddItem(onehatch);           //just add the circles for display reasons. There is no need to add them           cir1.PenColor.FromSystemColor(Color.Red);           cir2.PenColor.FromSystemColor(Color.Red);           doc.Model.Entities.AddItem(cir1);           doc.Model.Entities.AddItem(cir2);           doc.CommandAction.Zoom("E", 0, 0);       }

三. 导出txt文件中的xyz坐标

问:如何将图形中的折线和折线的x,y,z数据导出到txt文件中?

答:VDF没有自动化此功能,但很容易从加载到VDF组件的任意图形中导出此txt文件。请参阅以下代码:

private void button1_Click(object sender, EventArgs e){    vdDocument doc = vdFramedControl.BaseControl.ActiveDocument;    doc.New();    doc.Open(@"c:\test\MyModel Layout_1.0.dxf");    using (StreamWriter writer = new StreamWriter(doc.FileName+".txt")) //export c:\test\MyModel Layout_1.0.dxf.txt file containing the points of lines and polylines only    {        foreach (vdFigure item in doc.Model.Entities)        {            if (item != null && item is vdLine)            {                writer.WriteLine("vdLine " + (item as vdLine).StartPoint.ToString() + " " + (item as vdLine).EndPoint.ToString());            }            if (item != null && item is vdPolyline)            {                writer.Write("vdPolyline ");                foreach (Vertex item2 in (item as vdPolyline).VertexList)                {                    writer.Write(item2.AsgPoint().ToString() + " ");                }                writer.WriteLine(" ");            }        }    }}

您所需要的只是循环遍历文档中的所有对象(线,折线等)并获取其x,y,z值并使用StreamWriter将它们写入txt文件。

四. 如何覆盖折线的夹点

问:我想以不同的方式绘制折线的第一个夹点。我如何才能做到这一点?

答:以下是使用FigureDrawGrips事件执行此操作的示例:

..... // need to have thesedoc.FreezeEntityDrawEvents.Push(false);doc.OnFigureDrawGrips += new vdDocument.FigureDrawGripsEventHandler(doc_OnFigureDrawGrips);....and        //overrides the default draw grip        //draw the first grip of all vdFigures as red circle        //and the others as rectangle using the default grip color        void doc_OnFigureDrawGrips(object sender, vdRender render, ref bool cancel)        {            vdFigure fig = sender as vdFigure;            if (fig == null) return;            //calculate the circle points and grip box points relative to grip center.            double half_viewsize = render.PixelSize * render.GlobalProperties.GripSize * 0.5d;            gPoint offsetPoint = new gPoint(half_viewsize, half_viewsize);            Box GripBox = new Box(offsetPoint * -1, offsetPoint);            gPoints circlepts = Globals.GetArcSamplePoints(16, half_viewsize, 0, Globals.VD_TWOPI);            Matrix morigin = new Matrix();            gPoints pts = fig.GetGripPoints();//points are in world CS            int i = 0;            foreach (gPoint pt in pts)            {                if (!render.IsSectionVisible(pt)) continue;//check the 3d section clip visibility                gPoint ptInView = render.CurrentMatrix.Transform(pt);                System.Drawing.Point p = render.View2PixelMatrix.Transform2GDIPoint(ptInView);                if (!render.Contains(p)) continue;//check if grip is inside the screen                //initialize a new offset matrix represents the center of grip in current view CS                morigin.IdentityMatrix();                morigin.TranslateMatrix(ptInView);                //push to matrix where the grip figure points are reference(see GripBox and circlepts)                render.PushToViewMatrix();                render.PushMatrix(morigin);                if (i == 0)//if it is the first grip                {                    render.PushPenstyle(Color.Red, true);                    render.DrawPLine(sender, circlepts);                    render.PopPenstyle();                }                else render.DrawBoundBox(sender, GripBox);                render.PopMatrix();                render.PopMatrix();                //if a rendering procedure was break usually by a user pan / zoom in-out                if (render.StatusDraw == vdRender.DrawStatus.Break) break;                i++;            }            render.IsMessageQueEmpty();//update the render StatusDraw by checking if a mouse action was placed by the user            cancel = true;//do not call the default VectorDraw grip draw.        }

五. VDF滚动的鼠标滚轮控制

问:我想禁用鼠标平移和鼠标滚轮缩放,而不是使用滚轮,我想控制绘图的滚动,水平和垂直。我如何才能做到这一点?

答:您可以按照以下操作来禁用鼠标中键平移和鼠标滚轮放大/缩小。

//For the wrapper we have to get the vdDocument object like below.VectorDraw.Professional.vdObjects.vdDocument doc = vd.ActiveDocument.WrapperObject as VectorDraw.Professional.vdObjects.vdDocument;doc.MouseWheelZoomScale = 1.0;              //1.0 means disabled mouse wheel. 0.8(less than 1.0) or 1.2(more than 1.0) values can reverse the mouse wheel functionality.

要禁用平移,您必须使用如下的JobStart事件。

vd.JobStart += new AxVDrawLib5._DVdrawEvents_JobStartEventHandler(vd_JobStart);void vd_JobStart(object sender, AxVDrawLib5._DVdrawEvents_JobStartEvent e){if (e.jobName == "BaseAction_ActionPan") e.cancel = 1;}

要滚动视图,请使用以下代码:

... // these events must be used           doc.MouseWheelZoomScale = 1.0d; // disable mouse wheel zoom           doc.ActionStart += new vdDocument.ActionStartEventHandler(doc_ActionStart);           vdFramedControl1.BaseControl.MouseWheel += new MouseEventHandler(BaseControl_MouseWheel);       ...       void BaseControl_MouseWheel(object sender, MouseEventArgs e)       {           if ((e != null) && (e.Delta != 0))           {               vdDocument doc = vdFramedControl1.BaseControl.ActiveDocument;               double height = doc.ActiveRender.Height * doc.ActiveRender.PixelSize;               double width = doc.ActiveRender.Width * doc.ActiveRender.PixelSize;               double stepY = height * (e.Delta / Math.Abs(e.Delta)) / 10.0d;               double stepX = width * (-1.0d * e.Delta / Math.Abs(e.Delta)) / 10.0d;               if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)               { // if Shift key is pressed scroll horizontally                   doc.ScrollActiveActionRenderView(stepX, 0.0d, true); // scroll only in dX               }               else //else scroll vertically               {                   doc.ScrollActiveActionRenderView(0.0d, stepY, true); // scroll only in dY               }           }       }       void doc_ActionStart(object sender, string actionName, ref bool cancel)       {           if (actionName == "BaseAction_ActionPan") cancel = true; // cancel middle mouse button pan       }

未完待续~

转载于:https://blog.51cto.com/14036271/2325219

你可能感兴趣的文章
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>
如何判断自己适不适合做程序员?这几个特点了解一下
查看>>
newinstance()和new有什么区别
查看>>
android下载封装类
查看>>
[node] 用 node-webkit 开发桌面应用
查看>>
Nginx访问控制和虚拟主机
查看>>
report widget not working for external users
查看>>
windows phone 摄像头得到图片是旋转90°
查看>>
Linux--sed使用
查看>>
没有显示器的情况下安装和使用树莓派
查看>>
【android】使用handler更新UI
查看>>
mochiweb 源码阅读(十五)
查看>>
前端面试中的常见的算法问题
查看>>
计算机语言的基本理论
查看>>
nodejs流之行读取器例子
查看>>
批量文件重命名工具
查看>>
简单说一下UWP中的JumpList
查看>>
unity将object[]或者string对象转换成枚举enum
查看>>
以太坊系列之六: p2p模块--以太坊源码学习
查看>>
使用scikit-learn解决文本多分类问题(附python演练)
查看>>