明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 570|回复: 3

[【IFoxCAD】] IFoxCad画圆Jig示例,包括2点画圆和3点画圆

  [复制链接]
发表于 2023-2-5 11:23 | 显示全部楼层 |阅读模式
本帖最后由 d1742647821 于 2023-2-9 18:20 编辑

画圆Jig示例,包括2点画圆和3点画圆
帮助大家学习使用IFox

  1. public static class TestClass
  2. {
  3.     [CommandMethod(nameof(DrawCircle))]
  4.     public static void DrawCircle()
  5.     {
  6.         var ppo1=new PromptPointOptions("\n指定圆的圆心或") { AllowNone= true };
  7.         ppo1.Keywords.Add("3P", "3P", "三点(3P)");
  8.         ppo1.Keywords.Add("2P", "2P", "两点(2P)");
  9.         var ed = Env.Editor;
  10.         var r1 = ed.GetPoint(ppo1);
  11.         if (r1.Status == PromptStatus.Keyword)
  12.         {
  13.             switch (r1.StringResult)
  14.             {
  15.                 case "3P":
  16.                     DrawCircle3P();
  17.                     return;
  18.                 case "2P":
  19.                     DrawCircle2P();
  20.                     return;
  21.             }
  22.         }
  23.         else if (r1.Status!=PromptStatus.OK)
  24.             return;
  25.         var pt1 = r1.Value.Ucs2Wcs();
  26.         var circle = new Circle(pt1,Vector3d.ZAxis, 1);
  27.         circle.SetDatabaseDefaults();
  28.         bool isRaidus = true;
  29.         using var jig = new JigEx((mpw, _) =>
  30.         {
  31.             var dist = pt1.DistanceTo(new Point3d(mpw.X, mpw.Y, pt1.Z));
  32.             if (dist > 0)
  33.                 circle.Radius = isRaidus? dist:dist*0.5;
  34.         });
  35.         jig.DatabaseEntityDraw(wd=>wd.Geometry.Draw(circle));
  36.         var jppo= jig.SetOptions(pt1,msg:"\n指定圆的半径或");
  37.         jppo.Keywords.Add("D","D","直径(D)");
  38.         while (true)
  39.         {
  40.             var r2 = ed.Drag(jig);
  41.             if (r2.Status == PromptStatus.Keyword&&r2.StringResult.ToUpper()=="D")
  42.             {
  43.                 isRaidus = false;
  44.                 circle.Radius*=0.5;
  45.                 jppo.Keywords.Clear();
  46.                 jppo.Message = "\n指定圆的直径";
  47.                 continue;
  48.             }
  49.             if (r2.Status == PromptStatus.OK)
  50.             {
  51.                 using var tr = new DBTrans();
  52.                 tr.CurrentSpace.AddEntity(circle);
  53.             }
  54.             return;
  55.         }
  56.     }

  57.     private static void DrawCircle3P()
  58.     {
  59.         var ed = Env.Editor;
  60.         var r1 = ed.GetPoint("\n指定圆上的第一个点");
  61.         if(r1.Status!=PromptStatus.OK)
  62.             return;
  63.         var pt1 = r1.Value.Ucs2Wcs();
  64.         var r2 = ed.GetPoint("\n指定圆上的第二个点");
  65.         if(r2.Status!=PromptStatus.OK)
  66.             return;
  67.         var pt2=r2.Value.Ucs2Wcs().SetZ(pt1.Z);
  68.         if(pt1==pt2)
  69.             return;
  70.         var circle = new Circle();
  71.         var right=false;
  72.         var angle = pt1.GetAngle(pt2)%Math.PI;
  73.         using var jig = new JigEx((mpw, _) =>
  74.         {
  75.             var pt3 = mpw.SetZ(pt1.Z);
  76.             if(pt3==pt1||pt3==pt2 || Math.Abs(angle - pt1.GetAngle(pt3) % Math.PI) < 1e-6)
  77.             {
  78.                 right = false;
  79.                 return;
  80.             }
  81.             var cr3d = new CircularArc3d(pt1, pt2, pt3);
  82.             circle.Radius=cr3d.Radius;
  83.             circle.Center=cr3d.Center;
  84.             circle.Normal=cr3d.Normal;
  85.             right=true;
  86.         });
  87.         jig.DatabaseEntityDraw(wd =>
  88.         {
  89.             if (right)
  90.                 wd.Geometry.Draw(circle);
  91.         });
  92.         var jppo= jig.SetOptions("\n指定圆上的第三个点");
  93.         jppo.Keywords.Clear();
  94.         var r3 = ed.Drag(jig);
  95.         if(r3.Status!=PromptStatus.OK||!right)
  96.             return;
  97.         using var tr = new DBTrans();
  98.         tr.CurrentSpace.AddEntity(circle);
  99.     }

  100.     private static void DrawCircle2P()
  101.     {
  102.         var ed = Env.Editor;
  103.         var r1 = Env.Editor.GetPoint("\n指定圆直径的第一个端点");
  104.         if(r1.Status!=PromptStatus.OK)
  105.             return;
  106.         var pt1 = r1.Value.Ucs2Wcs();
  107.         var circle = new Circle();
  108.         circle.SetDatabaseDefaults();
  109.         bool right = false;
  110.         using var jig = new JigEx((mpw, _) =>
  111.         {
  112.             var pt2 = mpw.SetZ(pt1.Z);
  113.             if(pt1==pt2)
  114.             {
  115.                 right = false;
  116.                 return;
  117.             }
  118.             circle.Center = pt1.GetMidPointTo(pt2);
  119.             circle.Diameter = pt1.DistanceTo(pt2);
  120.             right=true;
  121.         });
  122.         jig.DatabaseEntityDraw(wd => wd.Geometry.Draw(circle));
  123.         jig.SetOptions(pt1, CursorType.Crosshair, "指定圆直径的第二个端点");
  124.         var r2=ed.Drag(jig);
  125.         if(r2.Status!=PromptStatus.OK||!right)
  126.             return;

  127.         using var tr = new DBTrans();
  128.         tr.CurrentSpace.AddEntity(circle);
  129.     }

  130.     private static Point3d SetZ(this Point3d pt, double z=0) => new (pt.X, pt.Y, z);
  131. }










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +2 收起 理由
闻人南131 + 1 很给力!
lxl217114 + 1

查看全部评分

发表于 2023-2-5 12:00 来自手机 | 显示全部楼层
感谢大佬分享
发表于 2023-2-5 13:31 | 显示全部楼层
虽然啥也看不懂,还是感谢大佬分享。
发表于 2023-2-5 21:54 | 显示全部楼层
谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-1 18:48 , Processed in 2.023715 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表