// 高さが0の場合、移動方向が定まらないので // 投影座標系でz=0とした座標から,List[0] - List[1]への垂線を計算して // そこへ移動する private void MoveSelectedPointWithHeight(DrawContext dc, Vector3d delta) { CadSegment seg = CadUtil.PerpSeg(PointList[0], PointList[1], StoreList[2] + delta); PointList[2] = PointList[2].SetVector(seg.P1.vector); PointList[3] = PointList[3].SetVector(seg.P0.vector); }
public override void EndCreate(DrawContext dc) { if (PointList.Count < 3) { return; } CadSegment seg = CadUtil.PerpSeg(PointList[0], PointList[1], PointList[2]); PointList[2] = PointList[2].SetVector(seg.P1.vector); PointList.Add(seg.P0); }
public override void EndEdit() { base.EndEdit(); if (PointList.Count == 0) { return; } CadSegment seg = CadUtil.PerpSeg(PointList[0], PointList[1], PointList[2]); PointList[2] = PointList[2].SetVector(seg.P1.vector); PointList[3] = PointList[3].SetVector(seg.P0.vector); }
private void DrawDim( DrawContext dc, CadVertex a, CadVertex b, CadVertex p, DrawPen pen) { CadSegment seg = CadUtil.PerpSeg(a, b, p); dc.Drawing.DrawLine(pen, a.vector, seg.P0.vector); dc.Drawing.DrawLine(pen, b.vector, seg.P1.vector); Vector3d cp = CadMath.CenterPoint(seg.P0.vector, seg.P1.vector); double arrowW = ARROW_W; double arrowL = ARROW_LEN; dc.Drawing.DrawArrow(pen, cp, seg.P0.vector, ArrowTypes.CROSS, ArrowPos.END, arrowL, arrowW); dc.Drawing.DrawArrow(pen, cp, seg.P1.vector, ArrowTypes.CROSS, ArrowPos.END, arrowL, arrowW); }
protected void DrawLines(DrawContext dc, DrawPen pen, VertexList pl) { int start = 0; int cnt = pl.Count; if (cnt <= 0) { return; } if (Normal.IsZero()) { Normal = CadUtil.TypicalNormal(pl); } CadVertex a; a = pl[start]; if (cnt == 1) { dc.Drawing.DrawCross(pen, a.vector, 2); //if (a.Selected) //{ // dc.Drawing.DrawHighlightPoint(a.vector, dc.GetPen(DrawTools.PEN_POINT_HIGHLIGHT)); //} return; } //DrawParam dp = new DrawParam(dc, pen); //PolyLineExpander.ForEachSegs<DrawParam>(pl, IsLoop, 8, // (v0, v1, p) => // { // p.DC.Drawing.DrawLine(p.Pen, v0.vector, v1.vector); // }, dp); PolyLineExpander.Draw(pl, IsLoop, 8, dc, pen); }
public static CadRect GetContainsRectScrn(CadFigure fig, DrawContext dc) { return(CadUtil.GetContainsRectScrn(dc, fig.PointList)); }
public static CadRect GetContainsRect(CadFigure fig) { return(CadUtil.GetContainsRect(fig.PointList)); }
public static void MoveAllPoints(CadFigure fig, Vector3d delta) { CadUtil.MovePoints(fig.PointList, delta); }
private void DrawDim(DrawContext dc, DrawPen linePen, DrawBrush textBrush) { dc.Drawing.DrawLine(linePen, PointList[0].vector, PointList[3].vector); dc.Drawing.DrawLine(linePen, PointList[1].vector, PointList[2].vector); Vector3d cp = CadMath.CenterPoint(PointList[3].vector, PointList[2].vector); double arrowW = ARROW_W; double arrowL = ARROW_LEN; double ww = (PointList[1] - PointList[0]).Norm() / 4.0; if (ww > arrowL) { dc.Drawing.DrawArrow(linePen, cp, PointList[3].vector, ArrowTypes.CROSS, ArrowPos.END, arrowL, arrowW); dc.Drawing.DrawArrow(linePen, cp, PointList[2].vector, ArrowTypes.CROSS, ArrowPos.END, arrowL, arrowW); } else { Vector3d v0 = cp - PointList[3].vector; Vector3d v1 = cp - PointList[2].vector; v0 = -(v0.Normalized() * (arrowL * 1.5)) / dc.WorldScale + PointList[3].vector; v1 = -(v1.Normalized() * (arrowL * 1.5)) / dc.WorldScale + PointList[2].vector; dc.Drawing.DrawArrow(linePen, v0, PointList[3].vector, ArrowTypes.CROSS, ArrowPos.END, arrowL, arrowW); dc.Drawing.DrawArrow(linePen, v1, PointList[2].vector, ArrowTypes.CROSS, ArrowPos.END, arrowL, arrowW); dc.Drawing.DrawLine(linePen, PointList[2].vector, PointList[3].vector); } CadVertex lineV = PointList[2] - PointList[3]; double len = lineV.Norm(); string lenStr = CadUtil.ValToString(len); CadVertex p = PointList[3] + (lineV / 2); p += (PointList[3] - PointList[0]).UnitVector() * (arrowW); CadVertex up = PointList[3] - PointList[0]; // 裏返しになる場合は、反転する // If it turns over, reverse it Vector3d normal = CadMath.Normal(lineV.vector, up.vector); double scala = CadMath.InnerProduct(normal, dc.ViewDir); if (scala > 0) { lineV = -lineV; } // --- lineV ---> // 3<------------ p ----------->2 // ^ | | // | | | // up 0 1 // dc.Drawing.DrawText(FontID, textBrush, p.vector, lineV.vector, up.vector, new DrawTextOption(DrawTextOption.H_CENTER), lenStr); }
public static List <CadFigure> Split(CadFigure fig, int curveSplitNum = 32) { CadVertex p0 = default(CadVertex); var triangles = new List <CadFigure>(); int i1 = -1; int state = 0; CadFigure triangle; VertexList pointList = fig.GetPoints(curveSplitNum); i1 = CadUtil.FindMaxDistantPointIndex(p0, pointList); if (i1 == -1) { return(triangles); } triangle = GetTriangleWithCenterPoint(pointList, i1); Vector3d tp0 = triangle.PointList[0].vector; Vector3d tp1 = triangle.PointList[1].vector; Vector3d tp2 = triangle.PointList[2].vector; Vector3d dir = CadMath.Normal(tp1, tp0, tp2); Vector3d currentDir = Vector3d.Zero; while (pointList.Count > 3) { if (state == 0) { i1 = CadUtil.FindMaxDistantPointIndex(p0, pointList); if (i1 == -1) { return(triangles); } } triangle = GetTriangleWithCenterPoint(pointList, i1); tp0 = triangle.PointList[0].vector; tp1 = triangle.PointList[1].vector; tp2 = triangle.PointList[2].vector; currentDir = CadMath.Normal(tp1, tp0, tp2); bool hasIn = ListContainsPointInTriangle(pointList, triangle); double scala = CadMath.InnerProduct(dir, currentDir); if (!hasIn && (scala > 0)) { triangles.Add(triangle); pointList.RemoveAt(i1); state = 0; continue; } if (state == 0) { state = 1; i1 = 0; } else if (state == 1) { i1++; if (i1 >= pointList.Count) { break; } } } if (pointList.Count == 3) { triangle = CadFigure.Create(CadFigure.Types.POLY_LINES); triangle.AddPoints(pointList, 0, 3); triangle.IsLoop = true; triangles.Add(triangle); } return(triangles); }