Работа в Пользовательской системе координат!

Автор Тема: Работа в Пользовательской системе координат!  (Прочитано 16941 раз)

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

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Здравствуйте уважаемые форумчане )
Есть программа, которая чертит линии, относительно координатам других линий,
Но столкнулся с проблемой. Что если чертеж находится в ПСК, то линии чертятся, совершенно не там где надо.
т.е. как я понимаю новые линии чертятся относительно мировой системы координат. И координаты существующих объектов берутся так же относительно мировой системы координат!
Помогите пожалуйста разобраться с этой делемой.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Что если чертеж находится в ПСК, то линии чертятся, совершенно не там где надо.
Чертеж не может находится в ПСК. Координаты объектов чертежа в МСК (иногда в ОСК), но никогда не в ПСК. В ПСК возвращаются указанные пользователем точки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
ОСК - это ортогональная система координат? или Относительная система координат.
Создаю ПСК, выбираю ортогональные ПСК, и задаю вид сверху относительно именованной пск.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
ОСК (OCS) - Объектная Система Координат. Есть у некоторых плоских объектов (Polyline, Circle, Ellipse и т.д.)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Думаю, что правильнее будет если ты покажешь чертеж и программу (код), для того чтобы можно было понять:
1) что есть
2) что нужно получить
3) что у тебя получается
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Объектная это понятно. А это система координат чертежа. Я просто боюсь ты меня не понимаешь, поэтому опишу как я её создаю.
вот есть некий чертеж. , для на нем рисую отрезок. далее команда _ucs.
контекстное меню об объект. контекстное меню именнованная, вводим имя новой пск.
Далее команда _+ucsman выбираем ортогональные ПСК, относительно недавно созданной пск.ОК.
Обновляем вид командой _top и система координат изменилась. и все объекты изменили свои координаты. и создание новых происходит также относительно новой ск -)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я просто боюсь ты меня не понимаешь
Это не я тебя не понимаю,  а ты меня. :)
Обновляем вид командой _top и система координат изменилась. и все объекты изменили свои координаты. и создание новых происходит также относительно новой ск -)
Объекты не меняли свои координаты в МСК. И создание новых происходит в МСК. А вот точки ты получаешь в ПСК. Поэтому тебе нужно точки преобразовать из ПСК в МСК для того чтобы создавать объекты.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
вот dwg с созданной системой координат.
Ну а программо просто считывает начало и конец линий, и создает новые линии относительнно координат.
В мировой системе координат всё норм.
Приложу код, но он прост :
Код - C# [Выбрать]
  1. [CommandMethod("func_lest_draw")]
  2.         public void func_lest_draw()
  3.         {
  4.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.             Database acDocBase = acDoc.Database;
  6.             Editor acDocEd = acDoc.Editor;
  7.             PromptSelectionResult sel_res;
  8.             PromptSelectionOptions sel_opts = new PromptSelectionOptions();
  9.             sel_opts.MessageForAdding = "Выберете линию пола и потолка : ";
  10.             sel_res = acDocEd.GetSelection(sel_opts);
  11.             ObjectId[] ids_lest = sel_res.Value.GetObjectIds();
  12.             PromptSelectionResult sel_res2;
  13.             PromptSelectionOptions sel_opts2 = new PromptSelectionOptions();
  14.             sel_opts2.MessageForAdding = "выберите линии ступенек : ";
  15.             sel_res2 = acDocEd.GetSelection(sel_opts2);
  16.             ObjectId[] ids_lest2 = sel_res2.Value.GetObjectIds();
  17.             Double razn = new Double();
  18.             Point3d ps1 = new Point3d();
  19.             Point3d ps2 = new Point3d();
  20.             Point3d pe1 = new Point3d();
  21.             Point3d pe2 = new Point3d();
  22.             using (DocumentLock acDockLock = acDoc.LockDocument())
  23.             {
  24.                 using (Transaction acDocTr = acDoc.TransactionManager.StartTransaction())
  25.                 {
  26.                     for (int i = 0; i < 2; i++)
  27.                     {
  28.                         DBObject get_object = acDocTr.GetObject(ids_lest[i], OpenMode.ForWrite, true);
  29.                         Line line_le_h = (Line)get_object;
  30.                         if (i == 0) {
  31.                             ps1 = line_le_h.StartPoint;
  32.                             pe1 = line_le_h.EndPoint;
  33.                         }
  34.                         else
  35.                         {
  36.                             ps2 = line_le_h.StartPoint;
  37.                             pe2 = line_le_h.EndPoint;
  38.                         }
  39.                     }
  40.                     acDocTr.Commit();
  41.                 }
  42.             }
  43.             int niz = 0;
  44.             int pravo = 0;
  45.             Point3d start_le = new Point3d();
  46.             Point3d end_le = new Point3d();
  47.             if (ps1.Y > ps2.Y)
  48.             {
  49.                 niz = 2;
  50.                 if (ps1.X > ps2.X)
  51.                 {
  52.                     pravo = 2;
  53.                 }
  54.                 else
  55.                 {
  56.                     pravo = 1;
  57.                 }
  58.             }
  59.             else
  60.             {
  61.                 niz = 1;
  62.                 if (ps1.X > ps2.X)
  63.                 {
  64.                     pravo = 1;
  65.                 }
  66.                 else
  67.                 {
  68.                     pravo = 2;
  69.                 }
  70.             }
  71.             if (niz == 1)
  72.             {
  73.                 start_le = func_ptk(ps1, pe1, pravo);
  74.                 if (pravo == 2)
  75.                 {
  76.                     end_le = func_ptk(ps2, pe2, 1);
  77.                 }
  78.                 else
  79.                 {
  80.                     end_le = func_ptk(ps2, pe2, 2);
  81.                 }
  82.             }
  83.             if (niz == 2)
  84.             {
  85.                 start_le = func_ptk(ps2, pe2, pravo);
  86.                 if (pravo == 2)
  87.                 {
  88.                     end_le = func_ptk(ps1, pe1, 1);
  89.                 }
  90.                 else
  91.                 {
  92.                     end_le = func_ptk(ps1, pe1, 2);
  93.                 }
  94.             }
  95.             razn = (end_le.Y - start_le.Y)/ids_lest2.Length;
  96.             Double[] p3d = new Double[ids_lest2.Length];
  97.             for (int i = 0; i < ids_lest2.Length; i++)
  98.             {
  99.                 using (DocumentLock acDockLock = acDoc.LockDocument())
  100.                 {
  101.                     using (Transaction acDocTr = acDoc.TransactionManager.StartTransaction())
  102.                     {
  103.                             DBObject get_object = acDocTr.GetObject(ids_lest2[i], OpenMode.ForWrite, true);
  104.                             Line line_le_h = (Line)get_object;
  105.                             p3d[i] = line_le_h.StartPoint.X;
  106.                         acDocTr.Commit();
  107.                     }
  108.                 }
  109.             }
  110.             Array.Sort(p3d);
  111.             Point3d temp1;
  112.             temp1 = new Point3d(start_le.X, start_le.Y, start_le.Z);
  113.             Point3d temp2;
  114.             bool k = false;
  115.             if (pravo == 2)
  116.             {
  117.                 for (int i = 1; i < p3d.Length; i++)
  118.                 {
  119.                     if (k == false)
  120.                     {
  121.                        temp1 = new Point3d(p3d[0],start_le.Y,start_le.Z);
  122.                        k = true;
  123.                     }
  124.                     using (DocumentLock acDocLock = acDoc.LockDocument())
  125.                     {
  126.                         using (Transaction acDocTr = acDocBase.TransactionManager.StartTransaction())
  127.                         {
  128.                             BlockTable TrTable = acDocTr.GetObject(acDocBase.BlockTableId, OpenMode.ForRead) as BlockTable;
  129.                             BlockTableRecord TrTableRec = acDocTr.GetObject(TrTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  130.                             temp2 = new Point3d(temp1.X, temp1.Y + razn, 0);    
  131.                             Line acline = new Line(temp1,temp2);
  132.                                 acline.SetDatabaseDefaults();
  133.                                 TrTableRec.AppendEntity(acline);
  134.                                 acDocTr.AddNewlyCreatedDBObject(acline, true);
  135.                                 temp1 = new Point3d(p3d[i], temp2.Y, 0);
  136.                                 Line acline2 = new Line(temp2, temp1);
  137.                                 acline2.SetDatabaseDefaults();
  138.                                 TrTableRec.AppendEntity(acline2);
  139.                                 acDocTr.AddNewlyCreatedDBObject(acline2, true);
  140.  
  141.                             // потдверждаем измениния, сохраняем транзакцию
  142.                             acDocTr.Commit();
  143.                         }
  144.                     }
  145.                 }
  146.                 using (DocumentLock acDocLock = acDoc.LockDocument())
  147.                 {
  148.                     using (Transaction acDocTr = acDocBase.TransactionManager.StartTransaction())
  149.                     {
  150.                         BlockTable TrTable = acDocTr.GetObject(acDocBase.BlockTableId, OpenMode.ForRead) as BlockTable;
  151.                         BlockTableRecord TrTableRec = acDocTr.GetObject(TrTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  152.                         temp2 = new Point3d(temp1.X, temp1.Y + razn, 0);
  153.                         Line acline = new Line(temp1, temp2);
  154.                         acline.SetDatabaseDefaults();
  155.                         TrTableRec.AppendEntity(acline);
  156.                         acDocTr.AddNewlyCreatedDBObject(acline, true);
  157.                         // потдверждаем измениния, сохраняем транзакцию
  158.                         acDocTr.Commit();
  159.                     }
  160.                 }
  161.             }
  162.             else
  163.             {
  164.                 for (int i = p3d.Length-2; i > -1; i--)
  165.                 {
  166.                     if (k == false)
  167.                     {
  168.                         temp1 = new Point3d(p3d[p3d.Length - 1], start_le.Y, start_le.Z);
  169.                         k = true;
  170.                     }
  171.                     using (DocumentLock acDocLock = acDoc.LockDocument())
  172.                     {
  173.                         using (Transaction acDocTr = acDocBase.TransactionManager.StartTransaction())
  174.                         {
  175.                             BlockTable TrTable = acDocTr.GetObject(acDocBase.BlockTableId, OpenMode.ForRead) as BlockTable;
  176.                             BlockTableRecord TrTableRec = acDocTr.GetObject(TrTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  177.                             temp2 = new Point3d(temp1.X, temp1.Y + razn, 0);
  178.                             Line acline = new Line(temp1, temp2);
  179.                             acline.SetDatabaseDefaults();
  180.                             TrTableRec.AppendEntity(acline);
  181.                             acDocTr.AddNewlyCreatedDBObject(acline, true);
  182.                             temp1 = new Point3d(p3d[i], temp2.Y, 0);
  183.                             Line acline2 = new Line(temp2, temp1);
  184.                             acline2.SetDatabaseDefaults();
  185.                             TrTableRec.AppendEntity(acline2);
  186.                             acDocTr.AddNewlyCreatedDBObject(acline2, true);
  187.  
  188.                             // потдверждаем измениния, сохраняем транзакцию
  189.                             acDocTr.Commit();
  190.                         }
  191.                     }
  192.                 }
  193.                 using (DocumentLock acDocLock = acDoc.LockDocument())
  194.                 {
  195.                     using (Transaction acDocTr = acDocBase.TransactionManager.StartTransaction())
  196.                     {
  197.                         BlockTable TrTable = acDocTr.GetObject(acDocBase.BlockTableId, OpenMode.ForRead) as BlockTable;
  198.                         BlockTableRecord TrTableRec = acDocTr.GetObject(TrTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  199.                         temp2 = new Point3d(temp1.X, temp1.Y + razn, 0);
  200.                         Line acline = new Line(temp1, temp2);
  201.                         acline.SetDatabaseDefaults();
  202.                         TrTableRec.AppendEntity(acline);
  203.                         acDocTr.AddNewlyCreatedDBObject(acline, true);
  204.                         // потдверждаем измениния, сохраняем транзакцию
  205.                         acDocTr.Commit();
  206.                     }
  207.                 }
  208.             }
  209.         }
  210.         public Point3d func_ptk(Point3d x1, Point3d x2, int x3)
  211.         {
  212.             if (x3 == 2)
  213.             {
  214.                 if (x1.X > x2.X)
  215.                 {
  216.                     return new Point3d(x1.X, x1.Y, 0);
  217.                 }
  218.                 else
  219.                 {
  220.                     return new Point3d(x2.X, x2.Y, 0);
  221.                 }
  222.             }
  223.             else if (x3 == 1)
  224.             {
  225.                 if (x1.X < x2.X)
  226.                 {
  227.                     return new Point3d(x1.X, x1.Y, 0);
  228.                 }
  229.                 else
  230.                 {
  231.                     return new Point3d(x2.X, x2.Y, 0);
  232.                 }
  233.             }
  234.             return new Point3d(0, 0, 0);
  235.         }
  236.  
  237.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Приложу код, но он прост :
Извини, но такой код я читать не буду. Я понимаю что у тебя нет опыта программирования, но не до такой же степени...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Не могу поспорить. Там просто создаются отрезки относительно координат линий.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Там просто создаются отрезки относительно координат линий.
Относительно координат в МСК. Если тебе нужно строить относительно координат в ПСК, то ты должен:
1) преобразовывать точки из МСК в ПСК.
2) Выполнить свои вычисления и получить новые точки в ПСК.
3) Преобразовать новые точки из ПСК в МСК и построить по ним новые отрезки.
Так понятно?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Ну вот это я сразу понел. А вот как преобразовать координаты из пск в мск ?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А вот как преобразовать координаты из пск в мск ?
Так бы и задал вопрос. Вот пример, который я постарался продокументировать. В нём запрашивается отрезок и строится такой же, но сдвинутый по оси X текущей ПСК на заданное расстояние.

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. [assembly: CommandClass(typeof(Rivilis.TestUcsWcs))]
  9.  
  10. namespace Rivilis
  11. {
  12.   public class TestUcsWcs
  13.   {
  14.     [CommandMethod("TestUCS")]
  15.     public void TestUCS()
  16.     {
  17.       Document doc = Application.DocumentManager.MdiActiveDocument;
  18.       if (doc == null) return;
  19.       Editor ed = doc.Editor;
  20.       Database db = doc.Database;
  21.       PromptEntityOptions prEnt =
  22.            new PromptEntityOptions("\nВыберите отрезок: ");
  23.       prEnt.SetRejectMessage("Это не отрезок!");
  24.       prEnt.AddAllowedClass(typeof(Line), true);
  25.       PromptEntityResult rsEnt = ed.GetEntity(prEnt);
  26.       if (rsEnt.Status != PromptStatus.OK) return;
  27.  
  28.       PromptDoubleResult rsDist =
  29.            ed.GetDistance("\nУкажите расстояние между отрезками по оси X: ");
  30.       if (rsDist.Status != PromptStatus.OK) return;
  31.  
  32.       // Матрица преобразования из ПСК в МСК
  33.       Matrix3d matUcsWcs = ed.CurrentUserCoordinateSystem;
  34.       // Матрица преобразования из МСК в ПСК
  35.       Matrix3d matWcsUcs = matUcsWcs.Inverse();
  36.       using (Line line = rsEnt.ObjectId.Open(OpenMode.ForRead) as Line)
  37.       {
  38.         Point3d p1 = line.StartPoint,
  39.                 p2 = line.EndPoint;
  40.         p1 = p1.TransformBy(matWcsUcs);  p2 = p2.TransformBy(matWcsUcs);
  41.         // Сделаем дубликат отрезка сдвинутый по X
  42.         // (в ПСК) на заданное расстояние
  43.         Vector3d vec = new Vector3d(rsDist.Value, 0, 0);
  44.         p1 += vec;  p2 += vec;
  45.         p1 = p1.TransformBy(matUcsWcs);   p2 = p2.TransformBy(matUcsWcs);
  46.         using (BlockTableRecord btr = db.CurrentSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord)
  47.         using (Line lineOffset = line.Clone() as Line)
  48.         {
  49.           lineOffset.StartPoint = p1;
  50.           lineOffset.EndPoint = p2;
  51.           btr.AppendEntity(lineOffset);
  52.         }
  53.       }
  54.     }
  55.   }
  56. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Спасибо большое. Попробую разобраться! И ещё один тупейший вопрос.
Как отредактировать местоположение точки.
При открытие объекта для записи, DBPoint.position.X только для чтения.
((
Код - C# [Выбрать]
  1. DBObject get_object = acDocTr.GetObject(id_object, OpenMode.ForWrite, true);
  2.                         if (get_object.ToString() == "DBPoint")
  3.                         {
  4.                             DBPoint ptk = (DBPoint)get_object;
  5.                             ptk.position.X = read only
  6.                         }
  7.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
И ещё один тупейший вопрос.
Угу.
Код - C# [Выбрать]
  1. DBPoint ptk = (DBPoint)get_object;
  2. double newX = /* новое значение X - например 10 */ 10.0;
  3. ptk.Position = new Point3d(newX, ptk.Position.Y, ptk.Position.Z);

P.S.: Один вопрос - одна тема. В этой теме только про ПСК<->МСК!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение