Сообщество программистов Autodesk в СНГ

ADN Club => Civil 3D API => Тема начата: Вильдар от 29-10-2015, 10:58:14

Название: Редактирование характерной линии
Отправлено: Вильдар от 29-10-2015, 10:58:14
Всем доброго дня,

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

Тестовый пример.
Код - 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 плохо знаю.
Название: Re: Редактирование характерной линии
Отправлено: Дмитрий Загорулькин от 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 и удалить старую характерку.

Я бы действовал по такому плану.
Название: Re: Редактирование характерной линии
Отправлено: Александр Ривилис от 29-10-2015, 12:25:19
Несколько статей, которые я нашёл на эту тему:
http://adndevblog.typepad.com/infrastructure/2013/04/creating-featureline-using-com-api-iaecclandfeaturelines-addfrompolyline.html
http://docs.autodesk.com/CIV3D/2012/ENU/API_Reference_Guide/com/AeccXLandLib__IAeccLandFeatureLine.htm
http://adndevblog.typepad.com/infrastructure/2015/08/civil-3d-2016-sp-1-new-feature-line-api.html
Первые две статьи про COM/ActiveX
Третья про новые возможности в AutoCAD Civil3D 2006 SP1

Название: Re: Редактирование характерной линии
Отправлено: Вильдар от 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.       }
Название: Re: Редактирование характерной линии
Отправлено: Александр Ривилис от 29-10-2015, 17:13:03
Если мне не изменяет память, то так должно сработать:
Код - C# [Выбрать]
  1. ObjectId idNewFL = new ObjectId(comFL.ObjectID);
или
Код - C# [Выбрать]
  1. ObjectId idNewFL  = DBObject.FromAcadObject(comFL);
Только не забывай, что "свапать" нужно вне транзакции.
Название: Re: Редактирование характерной линии
Отправлено: Вильдар от 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);