wang2006zhi 发表于 2023-9-24 23:42:26

绘制墙体-JIG应用

本帖最后由 wang2006zhi 于 2024-8-13 21:16 编辑

/// <summary>
/// 绘制墙体
/// </summary>
[CommandMethod("W_HZQT")]
[AttributeEx.MenuInfo("通用符号", "绘制墙体", 5, 10)]
public static void WallDraw()
{
    var offsetDist = AppX.InfoSysValue.墙体宽度;
    Env.Editor.WriteMessage($"\n当前墙体厚度:{offsetDist}");
    if (!Env.Editor.GetPoint(out Point3d point1, "选择第一个点"))
      return;
    using var tr = new DBTrans();
    var layerId = InfoDicLayer[ETypeName.墙线].MakeLayer();
    var plineTemp = new Polyline();
    plineTemp.AddVertexAt(0, point1.Point2d(), 0, 0, 0);
    plineTemp.AddVertexAt(1, point1.Point2d(), 0, 0, 0);
    using var jig = new JigEx((mpw, _) =>
    {
      plineTemp.SetPointAt(plineTemp.NumberOfVertices - 1, mpw.Point2d());
    });
    jig.DatabaseEntityDraw(wd => wd.Geometry.Draw(plineTemp));
    var jppo = jig.SetOptions(plineTemp.GetPoint3dAt(plineTemp.NumberOfVertices - 1), CursorType.Crosshair,
      "\n选择下一点");
    jppo.Keywords.Add("U", "U", "撤回(U)");
    while (true)
    {
      jppo.BasePoint = plineTemp.GetPoint3dAt(plineTemp.NumberOfVertices - 1);
      var r2 = Env.Editor.Drag(jig);
      if (r2.Status == PromptStatus.OK)
            plineTemp.AddVertexAt(plineTemp.NumberOfVertices, jig.MousePointWcsLast.Point2d(), 0, 0, 0);
      else if (r2.Status == PromptStatus.Keyword)
      {
            switch (r2.StringResult.ToUpper())
            {
                case "U":
                  if (plineTemp.NumberOfVertices > 2)
                  {
                        plineTemp.RemoveVertexAt(plineTemp.NumberOfVertices - 2);
                  }
                  break;
            }
      }
      else
      {
            if (plineTemp.NumberOfVertices > 2)
            {
                plineTemp.RemoveVertexAt(plineTemp.NumberOfVertices - 1);
                break;
            }
      }
    }

    var pts = plineTemp.GetPoints();
    var pt2 = plineTemp.EndPoint;
    pts.AddRange(pts);
    var newpl = pts.CreatePolyline();
    newpl.Closed = true;
    newpl.LayerId = layerId;
   
    using var jig2 = new JigEx((mpw, _) =>
    {
      var pt = plineTemp.EndPoint;
      
      if (offsetDist >= 600)
            offsetDist = 600;
      if (mpw.X < pt.X)
            offsetDist = -offsetDist;
      Doubpline(plineTemp, offsetDist, newpl);
    });
    jig2.DatabaseEntityDraw(wd => { wd.Geometry.Draw(newpl); });
    jig2.SetOptions(pt2, msg: "\n选择第一个点");
    var ppr3 = Env.Editor.Drag(jig2);
    if (ppr3.Status != PromptStatus.OK)
      return;
    tr.CurrentSpace.AddEntity(newpl);

    void Doubpline(Polyline pl, double dou, Polyline polyline)
    {
      var num = pl.NumberOfVertices;
      if (pl.GetOffsetCurves(dou)[0] is Polyline newpl1)
      {
            var npts = newpl1.GetPoints();
            npts.Reverse();
            for (int i = npts.Count - 1; i >= 0; i--)
            {
                polyline.SetPointAt(num + i, npts.Point2d());
            }
      }
    }
}

羊羊羊 发表于 2023-10-20 00:30:14

好贴子,收藏了

zixin51 发表于 2024-2-24 11:21:34

好贴子,收藏了
页: [1]
查看完整版本: 绘制墙体-JIG应用