Редактирование характерной линии

Автор Тема: Редактирование характерной линии  (Прочитано 4285 раз)

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Всем доброго дня,

Нужно привести в соответствие характерную линию по заданной полилинии.

Тестовый пример.
Код - C# [Выбрать]
  1. [CommandMethod("Test")]
  2.       public void Test()
  3.       {
  4.          civApp.CivilDocument civil = civApp.CivilApplication.ActiveDocument;
  5.          Document doc = Application.DocumentManager.MdiActiveDocument;
  6.          Database db = doc.Database;
  7.          Editor ed = doc.Editor;
  8.        
  9.          // выбор полилинии
  10.          var optPoly = new PromptEntityOptions("\nВыбери полилинию");
  11.          optPoly.SetRejectMessage("\nДолжна быть Polyline3d");
  12.          optPoly.AddAllowedClass(typeof(Polyline3d), true);        
  13.          var res = ed.GetEntity(optPoly);
  14.          if (res.Status != PromptStatus.OK)
  15.             return;
  16.          ObjectId idPoly = res.ObjectId;
  17.  
  18.          // выбор характерной линии
  19.          var optFL = new PromptEntityOptions("\nВыбери характерную линию");
  20.          optFL.SetRejectMessage("\nДолжна быть FeatureLine");
  21.          optFL.AddAllowedClass(typeof(civDb.FeatureLine), true);        
  22.          res = ed.GetEntity(optFL);
  23.          if (res.Status != PromptStatus.OK)
  24.             return;
  25.          ObjectId idFL = res.ObjectId;
  26.  
  27.          // привести вершини характерной линии в соответствии с полилинией        
  28.          using (var t = db.TransactionManager.StartTransaction())
  29.          {
  30.             // полилиния            
  31.             var poly = t.GetObject(idPoly, OpenMode.ForRead) as Polyline3d;            
  32.  
  33.             // изменение характерной линии
  34.             var fl = t.GetObject(idFL, OpenMode.ForWrite) as Curve;            
  35.             fl.SetFromGeCurve(poly.GetGeCurve()); // eNotImplementYet
  36.  
  37.             t.Commit();
  38.          }        
  39.       }
Подскажите в какую сторону копать.

Спасибо.

пс. civil плохо знаю.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Редактирование характерной линии
« Ответ #1 : 29-10-2015, 11:25:24 »
С характерками вообще не работаю, поэтому могу подсказать только направление:
1. Ищите в Civil3d .NET API Reference любые методы или свойства у объекта FeatureLine, которые могут вам помочь и пробуйте их использовать.
2. Если нужных свойств/методов нет (а это скорее всего так и будет), ищите то же самое в COM API. Как - это вопрос посложнее. Я до сих пор не знаю где найти такой толковый референс. Скорее всего, поможет Object Browser в Visual Studio.
3. Может оказаться, что в API Civil вообще нет способа редактировать FeatureLine. Но в нашем разделе, если мне память не изменяет, была тема по ее созданию с помощью COM. Тогда можно попробовать создать новую характерку по полилинии, выполнить подмену новой на старую с помощью метода SwapIdWith и удалить старую характерку.

Я бы действовал по такому плану.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Re: Редактирование характерной линии
« Ответ #3 : 29-10-2015, 17:08:37 »
Копаю в сторону COM.
Пока создаю новую характерную линию из полилинии.
Далее нужно свапнуть id со старой характерной линией.
Как получить ObjectId из Com-объекта созданной хар.линии AeccLandFeatureLine?
См. последние строчки кода:
Код - C# [Выбрать]
  1. [CommandMethod("Test")]
  2.       public void Test()
  3.       {
  4.          civApp.CivilDocument civil = civApp.CivilApplication.ActiveDocument;
  5.          Document doc = Application.DocumentManager.MdiActiveDocument;
  6.          Database db = doc.Database;
  7.          Editor ed = doc.Editor;
  8.  
  9.          var optPoly = new PromptEntityOptions("\nВыбери полилинию");
  10.          optPoly.SetRejectMessage("\nДолжна быть Polyline3d");
  11.          optPoly.AddAllowedClass(typeof(Polyline3d), true);        
  12.          var res = ed.GetEntity(optPoly);
  13.          if (res.Status != PromptStatus.OK)
  14.             return;
  15.          ObjectId idPoly = res.ObjectId;
  16.  
  17.          var optFL = new PromptEntityOptions("\nВыбери характерную линию");
  18.          optFL.SetRejectMessage("\nДолжна быть FeatureLine");
  19.          optFL.AddAllowedClass(typeof(civDb.FeatureLine), true);        
  20.          res = ed.GetEntity(optFL);
  21.          if (res.Status != PromptStatus.OK)
  22.             return;
  23.          ObjectId idFL = res.ObjectId;
  24.  
  25.          // привести вершини характерной линии в соответствии с полилинией        
  26.          using (var t = db.TransactionManager.StartTransaction())
  27.          {  
  28.             // изменение вершин характерной линии            
  29.             var fl = t.GetObject(idFL, OpenMode.ForRead) as civDb.FeatureLine;
  30.  
  31.             // COM
  32.             dynamic aecApp = ((dynamic)Application.AcadApplication).GetInterfaceObject("AeccXUiLand.AeccApplication.10.5"); // Civil 2016            
  33.  
  34.             dynamic style;
  35.             if (fl.StyleId.IsNull)            
  36.                style = aecApp.ActiveDocument.Database.FeatureLineStyles[0];            
  37.             else            
  38.                style = (t.GetObject(fl.StyleId, OpenMode.ForRead) as civDb.Styles.FeatureLineStyle).AcadObject;
  39.  
  40.             // создание характерной линии из полилинии        
  41.             dynamic comFLs = aecApp.ActiveDocument.Sites[0].FeatureLines; // AeccLandFeatureLines
  42.             dynamic comFL = comFLs.AddFromPolyline((long)idPoly.OldIdPtr, style); // AeccLandFeatureLine            
  43.  
  44.             // подмена id старой характерной линии
  45.             ObjectId idNewFL = comFL.?;
  46.  
  47.             t.Commit();
  48.          }        
  49.       }

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Редактирование характерной линии
« Ответ #4 : 29-10-2015, 17:13:03 »
Если мне не изменяет память, то так должно сработать:
Код - C# [Выбрать]
  1. ObjectId idNewFL = new ObjectId(comFL.ObjectID);
или
Код - C# [Выбрать]
  1. ObjectId idNewFL  = DBObject.FromAcadObject(comFL);
Только не забывай, что "свапать" нужно вне транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Re: Редактирование характерной линии
« Ответ #5 : 29-10-2015, 17:42:25 »
Спасибо, так получилось.
Буду проверять в рабочем режиме.

Код - C# [Выбрать]
  1. [CommandMethod("Test")]
  2.       public void Test()
  3.       {
  4.          civApp.CivilDocument civil = civApp.CivilApplication.ActiveDocument;
  5.          Document doc = Application.DocumentManager.MdiActiveDocument;
  6.          Database db = doc.Database;
  7.          Editor ed = doc.Editor;
  8.  
  9.          var optPoly = new PromptEntityOptions("\nВыбери полилинию");
  10.          optPoly.SetRejectMessage("\nДолжна быть Polyline3d");
  11.          optPoly.AddAllowedClass(typeof(Polyline3d), true);        
  12.          var res = ed.GetEntity(optPoly);
  13.          if (res.Status != PromptStatus.OK)
  14.             return;
  15.          ObjectId idPoly = res.ObjectId;
  16.  
  17.          var optFL = new PromptEntityOptions("\nВыбери характерную линию");
  18.          optFL.SetRejectMessage("\nДолжна быть FeatureLine");
  19.          optFL.AddAllowedClass(typeof(civDb.FeatureLine), true);        
  20.          res = ed.GetEntity(optFL);
  21.          if (res.Status != PromptStatus.OK)
  22.             return;
  23.          ObjectId idFL = res.ObjectId;
  24.  
  25.          // привести вершини характерной линии в соответствии с полилинией        
  26.          using (var t = db.TransactionManager.StartTransaction())
  27.          {
  28.             // изменение вершин характерной линии            
  29.             var fl = t.GetObject(idFL, OpenMode.ForRead) as civDb.FeatureLine;
  30.  
  31.             // COM
  32.             dynamic aecApp = ((dynamic)Application.AcadApplication).GetInterfaceObject("AeccXUiLand.AeccApplication.10.5"); // Civil 2016            
  33.  
  34.             dynamic style;
  35.             if (fl.StyleId.IsNull)                          
  36.                style = (t.GetObject(civil.Styles.FeatureLineStyles["Standard"], OpenMode.ForRead) as civDb.Styles.FeatureLineStyle).AcadObject;            
  37.             else            
  38.                style = (t.GetObject(fl.StyleId, OpenMode.ForRead) as civDb.Styles.FeatureLineStyle).AcadObject;            
  39.            
  40.             // создание характерной линии из полилинии        
  41.             dynamic comFLs = aecApp.ActiveDocument.Sites[0].FeatureLines; // AeccLandFeatureLines
  42.             dynamic comFL = comFLs.AddFromPolyline((long)idPoly.OldIdPtr, style); // AeccLandFeatureLine            
  43.  
  44.             // подмена id старой характерной линии
  45.             ObjectId idNewFL = new ObjectId((IntPtr)comFL.ObjectID);
  46.             var newFL = t.GetObject(idNewFL, OpenMode.ForWrite) as civDb.FeatureLine;
  47.             newFL.SwapIdWith(idFL, true, true);            
  48.  
  49.             // удаление старой хар. линии
  50.             fl.UpgradeOpen();
  51.             fl.Erase();
  52.  
  53.             t.Commit();
  54.          }        
  55.       }

Так тоже работает
Код - C# [Выбрать]
  1. ObjectId idNewFL = DBObject.FromAcadObject(comFL);