Дуга по 3 точкам

Автор Тема: Дуга по 3 точкам  (Прочитано 7658 раз)

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

Оффлайн lerikornerАвтор темы

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Дуга по 3 точкам
« : 12-06-2017, 13:28:20 »
Добрый день! Есть ли метод, рисующий дугу по 3 точкам? (средняя точка НЕ центр дуги)

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Дуга по 3 точкам
« Ответ #1 : 12-06-2017, 13:30:02 »
средняя точка НЕ центр дуги
Это как так?

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Дуга по 3 точкам
« Ответ #2 : 12-06-2017, 13:33:25 »
Оно?
Код - C# [Выбрать]
  1.         [CommandMethod("CreateArcBy3Points", "cra3p", CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw)]
  2.         public void CreateArcByThreePoints()
  3.         {
  4.             short osm = (short)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("osmode");
  5.             Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("osmode", 0);
  6.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  7.  
  8.             Editor ed = doc.Editor;
  9.  
  10.             Database db = doc.Database;
  11.  
  12.             // get the points
  13.  
  14.             Point3d p1, p2, p3;
  15.             PromptPointOptions ppo = new PromptPointOptions("\nFirst point: ");
  16.             PromptPointResult ppr = ed.GetPoint(ppo);
  17.             if (ppr.Status != PromptStatus.OK) return;
  18.             p1 = ppr.Value;
  19.  
  20.             ppo = new PromptPointOptions("\nSecond point: ");
  21.             ppr = ed.GetPoint(ppo);
  22.             if (ppr.Status != PromptStatus.OK) return;
  23.             p2 = ppr.Value;
  24.  
  25.             ppo = new PromptPointOptions("\nThird point: ");
  26.             ppr = ed.GetPoint(ppo);
  27.             if (ppr.Status != PromptStatus.OK) return;
  28.             p3 = ppr.Value;
  29.  
  30.             // create a CircularArc3d
  31.            
  32.             CircularArc3d carc = new CircularArc3d(p1, p2, p3);
  33.  
  34.             Arc arc = null;
  35.  
  36.             // now convert the CircularArc3d to an Arc
  37.             Point3d cpt = carc.Center;
  38.             Vector3d normal = carc.Normal;
  39.             Vector3d refVec = carc.ReferenceVector;
  40.             Plane plan = new Plane(cpt, normal);
  41.             double ang = refVec.AngleOnPlane(plan);
  42.             arc = new Arc(cpt, normal, carc.Radius, carc.StartAngle + ang, carc.EndAngle + ang);
  43.  
  44.             arc.SetDatabaseDefaults();
  45.  
  46.             // dispose CircularArc3d
  47.             carc.Dispose();
  48.  
  49.  
  50.             // get the current database
  51.  
  52.             using (Transaction tr = db.TransactionManager.StartTransaction())
  53.             {
  54.                 try
  55.                 {
  56.                     // get the current space
  57.                     BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  58.                     // append arc to space
  59.                     btr.AppendEntity(arc);
  60.                     // add arc to transaction
  61.                     tr.AddNewlyCreatedDBObject(arc, true);
  62.                     tr.Commit();
  63.                 }
  64.                 catch (Autodesk.AutoCAD.Runtime.Exception ex)
  65.                 {
  66.                     ed.WriteMessage(ex.Message + "\n" + ex.StackTrace);
  67.                 }
  68.                 finally
  69.                 {
  70.                     //do nothing (optional)
  71.                     Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("osmode", osm);
  72.                 }
  73.             }
  74.  
  75.         }
Взял отсюда.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Дуга по 3 точкам
« Ответ #3 : 12-06-2017, 14:49:59 »
Александр Пекшев aka Modis
Не хватает только преобразования ПСК->МСК ну и контроля того, что все три точки не лежат на одной прямой.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн lerikornerАвтор темы

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: Дуга по 3 точкам
« Ответ #4 : 12-06-2017, 15:55:21 »
Всем спасибо, что-то состряпал.

Кстати, поясните, пожалуйста, разницу между PlaceObject и транзакцией.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Дуга по 3 точкам
« Ответ #5 : 12-06-2017, 16:26:53 »
Кстати, поясните, пожалуйста, разницу между PlaceObject и транзакцией.
Для начала поясни что ты подразумеваешь под PlaceObject.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн lerikornerАвтор темы

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: Дуга по 3 точкам
« Ответ #6 : 12-06-2017, 16:31:36 »
Для начала поясни что ты подразумеваешь под PlaceObject.
Сорри :) метод то кастомный)
Код - C# [Выбрать]
  1. public override hresult PlaceObject(PlaceFlags lInsertType)
  2.         {
  3.             InputJig jig = new InputJig();
  4.  
  5.             // Пользовательский ввод центра CrossCircle
  6.             InputResult res_center = jig.GetPoint("Выберите точку вставки: ");
  7.             if (res_center.Result != InputResult.ResultCode.Normal)
  8.                 return hresult.e_Fail;
  9.             center = res_center.Point;
  10.  
  11.             Double res_rad = Convert.ToDouble(jig.GetText("Укажите диаметр: "));
  12.  
  13.             radius = res_rad;
  14.  
  15.             // Добавляем объект в базу данных
  16.             DbEntity.AddToCurrentDocument();
  17.  
  18.             jig.ExcludeObject(ID);
  19.  
  20.             jig.MouseMove = (s, a) => {
  21.                 TryModify();
  22.                 center = a.Point;
  23.                 DbEntity.Update();
  24.             };
  25.     return hresult.s_Ok;
  26.         }

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Дуга по 3 точкам
« Ответ #7 : 12-06-2017, 17:01:54 »
lerikorner,
Тут не только этот метод кастомный, а всё целиком. Не исключаю что в конечном итоге код тоже сводится к транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн lerikornerАвтор темы

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: Дуга по 3 точкам
« Ответ #8 : 12-06-2017, 17:08:47 »
Код мой... Вот вызов метода. И чего то упустил транзакции ,а нужны ли они?

Во вкладке весь проект...

Код - C# [Выбрать]
  1.  [CommandMethod("CrossCircle")]
  2.         public void CrossCircle()
  3.         {
  4.             CrossCircle obj = new CrossCircle();
  5.  
  6.             obj.CoordUpdate = a_CoordUpdate;
  7.             obj.DbEntity.Color = Color.White;
  8.             CCobj.Add(obj);
  9.             CCArcPt.Add(obj.arcp());
  10.             obj.PlaceObject();
  11.         }

После исполнения куча ругательств, от imapmgd и не только.
Суть задачи - взять необходимые точки у 2 объектов и построить дугу, проходящую через эти точки и касательную. она является соединителем 2 объектов.


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Дуга по 3 точкам
« Ответ #9 : 12-06-2017, 17:31:13 »
Эммм... по-моему это не для автокада. А раз не для автокада - то и форум не тот =)

Оффлайн lerikornerАвтор темы

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: Дуга по 3 точкам
« Ответ #10 : 12-06-2017, 17:38:06 »
Эммм... по-моему это не для автокада.
Согласен, но принципы те же))

Но если оффтоп, извините.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Дуга по 3 точкам
« Ответ #11 : 12-06-2017, 17:42:48 »
Согласен, но принципы те же))
Принцип, в принципе, в том, что любой созданный примитив нужно добавлять в транзакции. Вам нужно упростить свой проект (убрать Jig и прочее) до минимума - создание примитива и его добавление в базу чертежа. Тогда вам станет яснее. Посмотрите самый простой пример в справке. Да и тот пример, что я Вам нашел выше тоже пойдет

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Дуга по 3 точкам
« Ответ #12 : 12-06-2017, 17:45:34 »
Но если оффтоп, извините.
Это полный offtop.
Согласен, но принципы те же))
Принципы разные. Это разные API. Ну и NanoCAD и его API на этом форуме не обсуждается.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение