Площадь Polyline и Hatch

Автор Тема: Площадь Polyline и Hatch  (Прочитано 27605 раз)

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

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

  • ADN Club
  • Сообщений: 33
  • Карма: 0
Re: Площадь Polyline и Hatch
« Ответ #15 : 28-05-2014, 17:12:27 »
С заливками удобнее работать в, при выборе нескольких автоматически вычисляется общая площадь
на рисунке заливки, созданные вручную

у "программных" такого нет


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Площадь Polyline и Hatch
« Ответ #16 : 28-05-2014, 19:47:30 »
на рисунке заливки, созданные вручную
И? Судя во всему программно так сделать не получится. Впрочем по возможности проверю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Площадь Polyline и Hatch
« Ответ #17 : 29-05-2014, 01:01:47 »
Итак вот этот код у меня на основе выбранных полилиний создает нормальную штриховку - у которой в панели свойств есть ненулевая площадь:
Код - C# [Выбрать]
  1. [CommandMethod("CrHatch")]
  2. public void TestCrHatch()
  3. {
  4.   Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  5.   Database db = doc.Database;
  6.   Editor ed = doc.Editor;
  7.   ObjectIdCollection ids;
  8.   ObjectId idHatch;
  9.   try {
  10.     using (DocumentLock docLock = doc.LockDocument()) {
  11.       TypedValue[] filList = new TypedValue[1] { new TypedValue((int)DxfCode.Start, "LWPOLYLINE") };
  12.       SelectionFilter filter = new SelectionFilter(filList);
  13.       PromptSelectionOptions opts = new PromptSelectionOptions();
  14.       opts.SinglePickInSpace = true; opts.SingleOnly = true;
  15.       opts.MessageForAdding = "Выберите полилинию: ";
  16.       PromptSelectionResult res = ed.GetSelection(opts, filter);
  17.       if (res.Status != PromptStatus.OK)
  18.         return;
  19.       SelectionSet selSet = res.Value;
  20.       ids = new ObjectIdCollection(selSet.GetObjectIds());
  21.       using (Hatch hatch = new Hatch()) {
  22.         using (BlockTableRecord btr = db.CurrentSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord) {
  23.           hatch.SetDatabaseDefaults(db);
  24.           hatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID");
  25.           idHatch = btr.AppendEntity(hatch);
  26.           hatch.Associative = true;
  27.           hatch.AppendLoop(HatchLoopTypes.External, ids);
  28.           hatch.EvaluateHatch(false);
  29.           ed.WriteMessage("\nПлощадь={0}", hatch.Area);
  30.         }
  31.       }
  32.     }
  33.   } catch { };
  34. }
Похоже главное отличие в том, что у меня hatch.AppendLoop(HatchLoopTypes.External, ids);
Если выбранная полилиния не замкнутая или самопересекающаяся, то площади нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 33
  • Карма: 0
Re: Площадь Polyline и Hatch
« Ответ #18 : 29-05-2014, 13:19:26 »
Отлично!
Получается из самопересекающейся полилинии тоже можно сделать заливку с площадью, если получить полилинии между пересечениями.
А как решить проблему с полигонами? У MPolygon уже не подправить HatchLoopTypes.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Площадь Polyline и Hatch
« Ответ #19 : 29-05-2014, 13:22:57 »
А как решить проблему с полигонами? У MPolygon уже не подправить HatchLoopTypes.
Почему же не подправить? Нужно проанализировать получившийся Hatch и на основе его сделать новый, но с правильными Loop.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 33
  • Карма: 0
Re: Площадь Polyline и Hatch
« Ответ #20 : 29-05-2014, 17:30:38 »
Нужно проанализировать получившийся Hatch и на основе его сделать новый, но с правильными Loop.
Да, так и получилось из MPolygon получить заливку с площадью
Код - C# [Выбрать]
  1. AcDb.MPolygon plg = trans.GetObject(id, OpenMode.ForWrite, false) as AcDb.MPolygon;
  2. Hatch acHatch = new Hatch();
  3. BlockTblRec.AppendEntity(acHatch);
  4.  trans.AddNewlyCreatedDBObject(acHatch, true);
  5.  
  6. acHatch.SetDatabaseDefaults();
  7. acHatch.SetHatchPattern(HatchPatternType.PreDefined, "ZIGZAG");
  8. acHatch.Associative = false;
  9. int numloop = plg.Hatch.NumberOfLoops;
  10. for (int l = 0; l < numloop; l++)
  11.       {
  12.         HatchLoop hatchlloop = plg.Hatch.GetLoopAt(l);
  13.         BulgeVertexCollection vertcol = hatchlloop.Polyline;
  14.          Polyline polyloop = new Polyline();
  15.           for (int v = 0; v < vertcol.Count; v++)
  16.                 {
  17.                     BulgeVertex vert = vertcol[v];
  18.                      polyloop.AddVertexAt(v, vert.Vertex, 0, 0, 0);
  19.                  }
  20.          BlockTblRec.AppendEntity(polyloop);
  21.         trans.AddNewlyCreatedDBObject(polyloop, true);
  22.         if (!polyloop.Closed)
  23.              polyloop.Closed = true;
  24.  
  25.           ObjectIdCollection acObjIdColl = new ObjectIdCollection();
  26.           acObjIdColl.Add(polyloop.ObjectId);
  27.  
  28.          acHatch.AppendLoop(HatchLoopTypes.External, acObjIdColl);
  29.  
  30.           polyloop.Erase(true);
  31.         }
  32. acHatch.HatchStyle = HatchStyle.Normal;
  33. acHatch.EvaluateHatch(true);

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Площадь Polyline и Hatch
« Ответ #21 : 29-05-2014, 17:46:18 »
Код не проверял, но есть пару замечаний:
1. Если штриховка содержит несколько петель (Loop), то толко одна из них может быть HatchLoopTypes.External. Остальные рекомендуется ставить HatchLoopTypes.Default
2. Можно обойтись без создания временных полилиний, которые потом еще и удаляются если воспользоваться методом
Hatch.AppendLoop Method (HatchLoopTypes, Point2dCollection, DoubleCollection)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 33
  • Карма: 0
Re: Площадь Polyline и Hatch
« Ответ #22 : 30-05-2014, 11:34:19 »
1. Если штриховка содержит несколько петель (Loop), то толко одна из них может быть HatchLoopTypes.External. Остальные рекомендуется ставить HatchLoopTypes.Default
2. Можно обойтись без создания временных полилиний, которые потом еще и удаляются если воспользоваться методом
Hatch.AppendLoop Method (HatchLoopTypes, Point2dCollection, DoubleCollection)
1. MPolygon приходят из MapInfo и все Loop имеет тип Polyline, даже если состоят из одного контура. А при добавлении всех Loop как HatchLoopTypes.Default пропадает Area.
2. Так действительно лучше:
Код - C# [Выбрать]
  1.                                     for (int l = 0; l < plg.Hatch.NumberOfLoops; l++)
  2.                                     {
  3.                                         HatchLoop hatchlloop = plg.Hatch.GetLoopAt(l);
  4.                                         BulgeVertexCollection bulgeVertexCol = hatchlloop.Polyline;
  5.                                         Point2dCollection vertexCol = new Point2dCollection();
  6.                                         DoubleCollection bulgeCol = new DoubleCollection();
  7.                                         for (int v = 0; v < bulgeVertexCol.Count; v++)
  8.                                         {
  9.                                             BulgeVertex bulgeVertex = bulgeVertexCol[v];
  10.                                             vertexCol.Add(bulgeVertex.Vertex);
  11.                                             bulgeCol.Add(bulgeVertex.Bulge);  
  12.                                         }
  13.                                         acHatch.AppendLoop(HatchLoopTypes.External, vertexCol, bulgeCol);
  14.                                     }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Площадь Polyline и Hatch
« Ответ #23 : 30-05-2014, 13:07:24 »
А при добавлении всех Loop как HatchLoopTypes.Default пропадает Area.
Я имел в виду что внешний контур добавляется как HatchLoopTypes.External, а остальные как HatchLoopTypes.Default
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Площадь Polyline и Hatch
« Ответ #24 : 30-05-2014, 13:22:09 »
MPolygon приходят из MapInfo
Кстати, это утверждение не верно в общем случае, так как MPolygon можно создать в чистом AutoCAD средствами ObjectARX/AutoCAD .NET API.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 33
  • Карма: 0
Re: Площадь Polyline и Hatch
« Ответ #25 : 30-05-2014, 15:18:46 »
Имел ввиду, что "мои" MPolygon приходят из MapInfo и у них все контуры HatchLoopTypes.Polyline
Пример

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Площадь Polyline и Hatch
« Ответ #26 : 30-05-2014, 21:04:45 »
Имел ввиду, что "мои" MPolygon приходят из MapInfo и у них все контуры HatchLoopTypes.Polyline
Пример
Андрей. Ты не понимаешь о чем я говорю. Вот код:
Код - C# [Выбрать]
  1. [CommandMethod("MPtoHatch")]
  2. public void TestMPtoHatch()
  3. {
  4.   Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  5.   Database db = doc.Database;
  6.   Editor ed = doc.Editor;
  7.   ObjectIdCollection ids;
  8.   ObjectId idHatch;
  9.   try {
  10.     using (DocumentLock docLock = doc.LockDocument()) {
  11.       TypedValue[] filList = new TypedValue[1] { new TypedValue((int)DxfCode.Start, "MPOLYGON") };
  12.       SelectionFilter filter = new SelectionFilter(filList);
  13.       PromptSelectionOptions opts = new PromptSelectionOptions();
  14.       opts.MessageForAdding = "Выберите MPolygon'ы: ";
  15.       PromptSelectionResult res = ed.GetSelection(opts, filter);
  16.       if (res.Status != PromptStatus.OK)
  17.         return;
  18.       SelectionSet selSet = res.Value;
  19.       ids = new ObjectIdCollection(selSet.GetObjectIds());
  20.       using (BlockTableRecord btr = db.CurrentSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord) {
  21.         foreach (ObjectId id in ids) {
  22.           using (MPolygon mp = id.Open(OpenMode.ForRead) as MPolygon) {
  23.             using (Hatch hatch = new Hatch()) {
  24.               hatch.SetDatabaseDefaults(db);
  25.               hatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID");
  26.               idHatch = btr.AppendEntity(hatch);
  27.               hatch.Associative = false;
  28.               for (int i = 0; i < mp.NumMPolygonLoops; i++) {
  29.                 MPolygonLoop mpLoop = mp.GetMPolygonLoopAt(i);
  30.                 Point2dCollection vertexCol = new Point2dCollection();
  31.                 DoubleCollection bulgeCol = new DoubleCollection();
  32.                 for (int j = 0; j < mpLoop.Count; j++) {
  33.                   vertexCol.Add(mpLoop[j].Vertex);
  34.                   bulgeCol.Add(mpLoop[j].Bulge);
  35.                 }
  36.                 HatchLoopTypes loopType = (i == 0) ? HatchLoopTypes.External : HatchLoopTypes.Default;
  37.                 hatch.AppendLoop(loopType, vertexCol, bulgeCol);
  38.               }
  39.               hatch.EvaluateHatch(false);
  40.               ed.WriteMessage("\nПлощадь={0}", hatch.Area);
  41.             }
  42.           }
  43.         }
  44.       }
  45.     }
  46.   } catch { };
  47. }
  48.  
Обрати внимание на строку:
Код - C# [Выбрать]
  1. HatchLoopTypes loopType = (i == 0) ? HatchLoopTypes.External : HatchLoopTypes.Default;
Т.е. первый контур (внешний) идет с HatchLoopTypes.External, а остальные с HatchLoopTypes.Default
На твоём чертеже проверил. Площади исходных MPolygon и полученных штриховок совпадают.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 33
  • Карма: 0
Re: Площадь Polyline и Hatch
« Ответ #27 : 02-06-2014, 12:11:51 »
Получается, что внешним идет всегда только первый контур и в заливках, и в полигонах.
« Последнее редактирование: 02-06-2014, 12:29:02 от Andrey »

Оффлайн MDA

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Re: Площадь Polyline и Hatch
« Ответ #28 : 18-08-2020, 16:39:06 »
Здравствуйте коллеги!

Посмотрел статью, но пока не нашел ответа на свой вопрос. Как дать понять что параметр "Area" отсутствует. Пробовал через if (htc.Area != double.NaN) не помогло.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Площадь Polyline и Hatch
« Ответ #29 : 18-08-2020, 17:21:44 »
Посмотрел статью, но пока не нашел ответа на свой вопрос. Как дать понять что параметр "Area" отсутствует.
Что имеется в виду под отсутствующей площадью?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение