Polyline3d (AUTOCAD 2012 на C# Visual Studio.)

Автор Тема: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)  (Прочитано 19758 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Замени Polyline на Polyline3d, AddVertexAt на AppendVertex. При этом нужно будет создать PolylineVertex3d, передав конструктору точку вершины.

Для  PolylineVertex3d нужно отдельно создавать точку?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #1 : 06-10-2014, 16:45:02 »
Для  PolylineVertex3d нужно отдельно создавать точку?
Вопроса не понял.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #2 : 06-10-2014, 16:51:14 »
Вопроса не понял.

Код - C++ [Выбрать]
  1. using (PolylineVertex3d poly3dVertex = new PolylineVertex3d())


создаем вершину,какую точку необходимо указывать?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #3 : 06-10-2014, 17:09:23 »
создаем вершину,какую точку необходимо указывать?
Ту точку, которая будет вершиной.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #4 : 06-10-2014, 17:22:58 »
Так выглядит код для создания замкнутой 3D-полилинии. Возьми из него то, что тебе нужно.
Код - C# [Выбрать]
  1. [CommandMethod("MakeContour3D")]
  2. public void MakeContour3D()
  3. {
  4.     AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  5.     AcDb.Database db = doc.Database;
  6.     AcEd.Editor ed = doc.Editor;
  7.     AcGe.Matrix3d mat = ed.CurrentUserCoordinateSystem;
  8.     AcEd.PromptPointOptions pr =
  9.             new AcEd.PromptPointOptions("\nУкажите вершину контура: ");
  10.     AcDb.ObjectId idPoly;
  11.     AcGe.Point3d lastPt = AcGe.Point3d.Origin;
  12.     using (AcDb.Polyline3d poly = new AcDb.Polyline3d())
  13.     {
  14.         using (AcDb.BlockTableRecord space =
  15.              db.CurrentSpaceId.Open(AcDb.OpenMode.ForWrite) as AcDb.BlockTableRecord)
  16.         {
  17.             idPoly = space.AppendEntity(poly);
  18.         }
  19.     }
  20.     int nVert = 0;
  21.     while (true)
  22.     {
  23.         if (nVert > 1)
  24.         {
  25.             pr.BasePoint = lastPt;
  26.             pr.UseBasePoint = true;
  27.             pr.UseDashedLine = true;
  28.         }
  29.         if (nVert >= 3)
  30.         {
  31.             pr.AllowNone = true;
  32.             pr.Message = "\nУкажите очередную вершину контура (ENTER - завершение): ";
  33.         }
  34.         else
  35.         {
  36.             pr.AllowNone = false;
  37.         }
  38.         AcEd.PromptPointResult res = ed.GetPoint(pr);
  39.         if (res.Status == AcEd.PromptStatus.Cancel)
  40.         {
  41.             using (AcDb.Polyline3d poly =
  42.                   idPoly.Open(AcDb.OpenMode.ForWrite) as AcDb.Polyline3d)
  43.             {
  44.                 poly.Erase();
  45.                 break;
  46.             }
  47.         }
  48.         else if (res.Status == AcEd.PromptStatus.None)
  49.         {
  50.             break;
  51.         }
  52.         else
  53.         {
  54.             lastPt = res.Value;
  55.             using (AcDb.Polyline3d poly =
  56.                  idPoly.Open(AcDb.OpenMode.ForWrite) as AcDb.Polyline3d)
  57.             {
  58.                 // Преобразуем из ПСК в МСК
  59.                 AcGe.Point3d pt = res.Value.TransformBy(mat);
  60.                 using (AcDb.PolylineVertex3d pv3d = new AcDb.PolylineVertex3d(pt)) {
  61.                     poly.AppendVertex(pv3d);
  62.                 }
  63.                 poly.Closed = true;
  64.             }
  65.             nVert++;
  66.         }
  67.     }
  68. }

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #5 : 07-10-2014, 16:44:30 »
AcGe.Point3d pt = res.Value.TransformBy(mat);

Объясните пожалуйста эту строчку.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #6 : 07-10-2014, 16:49:19 »
В строке AcGe.Matrix3d mat = ed.CurrentUserCoordinateSystem; мы получаем матрицу mat преобразования из ПСК в МСК.
ed.GetPoint даёт нам в  res.Value координату, указанную пользователем, в ПСК.
Таким образом AcGe.Point3d pt = res.Value.TransformBy(mat); даёт нам точку, которую указал пользователь, но преобразованную в МСК. Это преобразование нужно для внесение информации о вершине полилинии, так как вершины хранят информацию именно в МСК.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #7 : 07-10-2014, 17:00:02 »
В строке AcGe.Matrix3d mat = ed.CurrentUserCoordinateSystem; мы получаем матрицу mat преобразования из ПСК в МСК.
ed.GetPoint даёт нам в  res.Value координату, указанную пользователем, в ПСК.
Таким образом AcGe.Point3d pt = res.Value.TransformBy(mat); даёт нам точку, которую указал пользователь, но преобразованную в МСК. Это преобразование нужно для внесение информации о вершине полилинии, так как вершины хранят информацию именно в МСК.

Значит мне нужно, что бы указывались координаты, которые сами генерируются,а потом преобразовать их, что бы получить вершину полилинии.
 

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #8 : 07-10-2014, 17:02:22 »
Значит мне нужно, что бы указывались координаты, которые сами генерируются,а потом преобразовать их, что бы получить вершину полилинии.
Если у тебя координаты сразу в МСК, то ничего преобразовывать не нужно. Это был конкретный пример ручного ввода координат пользователем. У тебя же ситуация иная.

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #9 : 07-10-2014, 17:07:32 »
Если у тебя координаты сразу в МСК, то ничего преобразовывать не нужно. Это был конкретный пример ручного ввода координат пользователем. У тебя же ситуация иная.

Просто не могу понять, как указать вершину.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #10 : 07-10-2014, 17:21:50 »
Просто не могу понять, как указать вершину.
А я не могу понять в каком виде у тебя вершина.
P.S.: Создается впечатление, что ты рассчитываешь на то, что я сделаю полностью за тебя твою задачу. Но это не соответствует моему представлению о том, чем я тут занимаюсь. Моя цель научить тебя самостоятельно это делать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #11 : 07-10-2014, 17:46:17 »
P.S.: Создается впечатление, что ты рассчитываешь на то, что я сделаю полностью за тебя твою задачу. Но это не соответствует моему представлению о том, чем я тут занимаюсь. Моя цель научить тебя самостоятельно это делать.

Я хочу научится все делать сам, просто много вопросов .

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #12 : 07-10-2014, 18:00:45 »
Я хочу научится все делать сам, просто много вопросов .
Отлично. Ты пишешь, что не знаешь как указать вершину. Допустим ты сформировал уже точку:
Код - C# [Выбрать]
  1. AcGe.Point3d pt = new AcGe.Point3d(x,y,z); // x,y,z - известные тебе числа
Тогда добавление вершины к 3D-полилинии выглядит так:
Код - C# [Выбрать]
  1. using (AcDb.Polyline3d poly =
  2.        idPoly.Open(AcDb.OpenMode.ForWrite) as AcDb.Polyline3d)
  3. {
  4.     using (AcDb.PolylineVertex3d pv3d = new AcDb.PolylineVertex3d(pt)) {
  5.        poly.AppendVertex(pv3d);
  6.     }
  7. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #13 : 13-10-2014, 22:01:51 »
x,y,z - известные тебе числа

Хотел спросить, а x,y,z через random.NextDouble задавать?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline3d (AUTOCAD 2012 на C# Visual Studio.)
« Ответ #14 : 13-10-2014, 22:05:03 »
Хотел спросить, а x,y,z через random.NextDouble задавать?
Если ты в контексте своей темы: http://adn-cis.org/forum/index.php?topic=971.0 то наверное да.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение