Подрезать кольцо

Автор Тема: Подрезать кольцо  (Прочитано 5363 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Подрезать кольцо
« : 18-08-2023, 12:03:36 »
Помогите не могу понять что я делаю не так
Мне нужно подрезать тело "кольцо" двумя плоскостями Plane

Код - C# [Выбрать]
  1.         using CAD_GEO = Autodesk.AutoCAD.Geometry;
  2.         using CAD_DBS = Autodesk.AutoCAD.DatabaseServices;
  3.  
  4.         // 2023.08.18
  5.         public static CAD_DBS.Solid3d CreateRing(double r1, double r2, double h,
  6.                                                                       double a1 = 0, double a2 = 0)
  7.         {
  8.             CAD_DBS.Solid3d ring = new CAD_DBS.Solid3d();
  9.             CAD_DBS.Solid3d smin = new CAD_DBS.Solid3d();
  10.             double rmax = Math.Max(r1, r2);
  11.             double rmin = Math.Min(r1, r2);
  12.             smin.CreateFrustum(h, rmin, rmin, rmin);
  13.             ring.CreateFrustum(h, rmax, rmax, rmax);
  14.             // получаю тело-кольцо
  15.             ring.BooleanOperation(CAD_DBS.BooleanOperationType.BoolSubtract, smin);
  16.             if (a1 != a2)
  17.             { // Подрезка кольца двумя плоскостями
  18.                 CAD_GEO.Point3d p0 = new CAD_GEO.Point3d(0, 0, -h/2.0);
  19.                 CAD_GEO.Point3d p1 = new CAD_GEO.Point3d(rmax*Math.Cos(a1), rmax*Math.Sin(a1), -h/2.0);
  20.                 CAD_GEO.Point3d p2 = new CAD_GEO.Point3d(rmax*Math.Cos(a2), rmax*Math.Sin(a2), -h/2.0);
  21.                 CAD_GEO.Vector3d u1 = new CAD_GEO.Vector3d(p1.X, p1.Y, -h/2.0);
  22.                 CAD_GEO.Vector3d u2 = new CAD_GEO.Vector3d(p2.X, p2.Y, -h/2.0);
  23.                 CAD_GEO.Vector3d vZ = new CAD_GEO.Vector3d(p0.X, p0.Y,  h);
  24.                 CAD_GEO.Plane surf1 = new CAD_GEO.Plane(p1, vZ, u1);
  25.                 CAD_GEO.Plane surf2 = new CAD_GEO.Plane(p2, vZ, u2);
  26.                 ring.Slice(surf1);
  27.                 ring.Slice(surf2);
  28.             }
  29.             return ring;
  30.         }

И потом не понятно вот что еще.
Если я подрежу тело, то как мне узнать какой кусок
тела оставить, а какой удалить?
Я хочу оставить маленький кусочек части кольца между углами a1 и a2

На картинке показано как я хочу.



Отмечено как Решение Алексей (IdeaSoft) 20-08-2023, 11:28:56

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подрезать кольцо
« Ответ #1 : 20-08-2023, 11:14:44 »
Разобрался :))

Код - C# [Выбрать]
  1.        
  2.         using CAD_GEO = Autodesk.AutoCAD.Geometry;
  3.         using CAD_DBS = Autodesk.AutoCAD.DatabaseServices;
  4. //...
  5. public static CAD_DBS.Solid3d CreateRing(double r1, double r2, // Радиусы кольца  
  6.                                                  double h, // Высота кольца
  7.                                                  double a1 = 0, double a2 = 0) // Углы начала и конца подрезки
  8.         {
  9.             CAD_DBS.Solid3d ring = new CAD_DBS.Solid3d();
  10.             CAD_DBS.Solid3d smin = new CAD_DBS.Solid3d();
  11.             double rmax = Math.Max(r1, r2);
  12.             double rmin = Math.Min(r1, r2);
  13.             smin.CreateFrustum(h, rmin, rmin, rmin);
  14.             ring.CreateFrustum(h, rmax, rmax, rmax);
  15.             ring.BooleanOperation(CAD_DBS.BooleanOperationType.BoolSubtract, smin);
  16.             if (a1 != a2)
  17.             {
  18.                 // Подрезка кольца двумя плоскостями
  19.                 double[] a = { a1, a2 };
  20.                 double[] k = { 1.0, -1.0};
  21.                 for (int i = 0; i < a.Length; i++)
  22.                 {
  23.                     double dx = rmax * Math.Cos(a[i]);
  24.                     double dy = rmax * Math.Sin(a[i]);
  25.                     CAD_GEO.Vector3d VecXY = new CAD_GEO.Vector3d(-k[i] * dx, -k[i] * dy, 0);
  26.                     CAD_GEO.Point3d basePnt = new CAD_GEO.Point3d( k[i] * dx,  k[i] * dy, 0);
  27.                     CAD_GEO.Plane pln = new CAD_GEO.Plane(basePnt, VecXY, CAD_GEO.Vector3d.ZAxis);
  28.                     ring.Slice(pln);
  29.                 }
  30.             }
  31.             return ring;
  32.         }

Для кольца радиусом 1000 мм, толщиной 250 мм, высотой 100 мм 
Начальный и конечный углы: PI/4 до PI/2
вызов функции такой:

Код - C# [Выбрать]
  1. Solid3d body = CreateRing(1000, 750, 100, Math.PI/4 Math.PI/2);