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

ADN Club => AutoCAD .NET API => Тема начата: melkalex90 от 28-10-2015, 14:51:49

Название: Расчет площадей выделенных контуров
Отправлено: melkalex90 от 28-10-2015, 14:51:49
Добрый день!
Подскажите пожалуйста, как получить площади нескольких контуров по отдельности.
Контур рисую вот так http://adn-cis.org/forum/index.php?topic=975.msg4284#msg4284 (http://adn-cis.org/forum/index.php?topic=975.msg4284#msg4284)
Его площадь и периметр получаю таким образом: http://adn-cis.org/forum/index.php?topic=772.msg2887#msg2887 (http://adn-cis.org/forum/index.php?topic=772.msg2887#msg2887)
Но если я выделю сразу несколько контуров, то как мне можно вывести площади каждого контура отдельно?(чтобы в журнале командной строки писалось: Контур1 Площадь, периметр; Контур2 площадь периметр и т.д.
Название: Re: Расчет площадей выделенных контуров
Отправлено: Александр Пекшев aka Modis от 28-10-2015, 14:55:38
Обычный перебор (foreach()) выбранных примитивов с выводом площади в командную строку (Editor.WriteMessage())
UPD: Судя по двум приложенным ссылкам вы хотите, чтобы вам готовое решение написали  ;D
Название: Re: Расчет площадей выделенных контуров
Отправлено: melkalex90 от 28-10-2015, 15:02:32
..
UPD: Судя по двум приложенным ссылкам вы хотите, чтобы вам готовое решение написали  ;D
Не совсем, хотелось бы самому разобраться. Сейчас буду смотреть что это за foreach и как с ним работать)
Я понимаю, что это все надо сделать перебором, просто не понимаю как выделить каждый контур по отдельности. Сейчас буду эксперементировать
Название: Re: Расчет площадей выделенных контуров
Отправлено: Александр Ривилис от 28-10-2015, 16:17:24
Но если я выделю сразу несколько контуров, то как мне можно вывести площади каждого контура отдельно?
просто не понимаю как выделить каждый контур по отдельности.
Только мне кажется, что в этих двух предложениях есть противоречие? Что понимается под "выделением контуров"? Программа должна запросить у пользователя выбор нескольких контуров и вывести для каждого из выбранных по отдельности информацию в командную строку?
Название: Re: Расчет площадей выделенных контуров
Отправлено: Александр Пекшев aka Modis от 28-10-2015, 16:27:18
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.EditorInput;
  2. using Autodesk.AutoCAD.Runtime;
  3. using AcApp = Autodesk.AutoCAD.ApplicationServices.Core.Application;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5.  
  6. namespace PlinesArea
  7. {
  8.     public class Class1
  9.     {
  10.         [CommandMethod("PlinesAreaToEd")]
  11.         public void Main()
  12.         {
  13.             var doc = AcApp.DocumentManager.MdiActiveDocument;
  14.             var ed = doc.Editor;
  15.             try
  16.             {
  17.                 var pso = new PromptSelectionOptions();
  18.                 pso.MessageForAdding = "\nSelect polylines: ";
  19.                 var filList = new TypedValue[1] { new TypedValue((int)DxfCode.Start, "*POLYLINE") };
  20.                 SelectionFilter sf = new SelectionFilter(filList);
  21.                 PromptSelectionResult psr = ed.GetSelection(pso, sf);
  22.                 if (psr.Status == PromptStatus.OK)
  23.                 {
  24.                     using (Transaction tr = doc.TransactionManager.StartTransaction())
  25.                     {
  26.                         var selSet = psr.Value;
  27.                         var ids = selSet.GetObjectIds();
  28.  
  29.                         int i = 1;
  30.                         foreach (ObjectId objId in ids)
  31.                         {
  32.                             var pl = tr.GetObject(objId, OpenMode.ForRead) as Polyline;
  33.                             if (pl.Closed)
  34.                                 ed.WriteMessage(
  35.                                 "\nПолилиния №: " + i +
  36.                                 ". Площадь: " + pl.Area.ToString());
  37.                             i++;
  38.                         }
  39.                         tr.Commit();
  40.                     }
  41.                 }
  42.             }
  43.             catch (System.Exception ex)
  44.             {
  45.                 ed.WriteMessage("\n" + ex.Message);
  46.             }
  47.         }
  48.     }
  49. }
Название: Re: Расчет площадей выделенных контуров
Отправлено: Александр Ривилис от 28-10-2015, 16:38:51
Modis
Раз ты выбрал в качестве фильтра "*POLYLINE", то тогда лучше
Код - C# [Выбрать]
  1. var pl = tr.GetObject(objId, OpenMode.ForRead) as Curve;
Да и проверка на pl.Closed пожалуй лишняя (площадь есть и у незамкнутых кривых).
Название: Re: Расчет площадей выделенных контуров
Отправлено: Александр Пекшев aka Modis от 28-10-2015, 16:42:38
Раз ты выбрал в качестве фильтра "*POLYLINE", то тогда лучше
С 3D полилиниями работать не приходилось, поэтому тут не был уверен в правильности. Была мысль оставить LWPOLYLINE
Да и проверка на pl.Closed пожалуй лишняя (площадь есть и у незамкнутых кривых).
Я так понял, что автору нужна площадь замкнутых полилиний, поэтому и добавил проверку
Название: Re: Расчет площадей выделенных контуров
Отправлено: Александр Ривилис от 28-10-2015, 16:49:27
Я так понял, что автору нужна площадь замкнутых полилиний, поэтому и добавил проверку
Полилинии бывают условно замкнутыми (первая и последняя вершины совпадают). Но свойство Closed при этом возвращает false.
Название: Re: Расчет площадей выделенных контуров
Отправлено: Александр Ривилис от 28-10-2015, 16:50:59
С 3D полилиниями работать не приходилось, поэтому тут не был уверен в правильности.
Под фильтр "*POLYLINE" попадает и класс Polyline2d
Название: Re: Расчет площадей выделенных контуров
Отправлено: art_rrc от 28-10-2015, 18:12:11
Полилинии бывают условно замкнутыми (первая и последняя вершины совпадают). Но свойство Closed при этом возвращает false.
Полилиния может быть вообще не замкнутая, но как сам автокад, так и программное свойство .Area без проблем вернет результат, в таком случае полилиния как бы мысленно замыкается по наикратчайшему расстоянию. 
Название: Re: Расчет площадей выделенных контуров
Отправлено: Александр Пекшев aka Modis от 28-10-2015, 18:15:29
art_rrc, Александр Ривилис об этом уже написал))) Да и все мы об этом знаем

Полилинии бывают условно замкнутыми (первая и последняя вершины совпадают). Но свойство Closed при этом возвращает false.
А, кстати, еще у Polyline есть свойство IsReallyClose (мог с ошибками написать) - думаю, что это что-то из этой-же оперы
Название: Re: Расчет площадей выделенных контуров
Отправлено: Александр Ривилис от 28-10-2015, 18:16:59
Полилиния может быть вообще не замкнутая, но как сам автокад, так и программное свойство .Area без проблем вернет результат, в таком случае полилиния как бы мысленно замыкается по наикратчайшему расстоянию.
Да. Всё правильно. Но такая незамкнутая полилиния не подпадает под категорию "контур". Цитата из Википедии:
Цитировать
Контур — в общем случае, замкнутая линия, очертание некоторой геометрической фигуры, предмета.
Название: Re: Расчет площадей выделенных контуров
Отправлено: Александр Ривилис от 28-10-2015, 18:18:08
А, кстати, еще у Polyline есть свойство IsReallyClose (мог с ошибками написать) - думаю, что это что-то из этой-же оперы
IsReallyClosing - это совершенно из другой оперы!!!
Название: Re: Расчет площадей выделенных контуров
Отправлено: melkalex90 от 28-10-2015, 22:10:59
Не было возможности написать ответ...Александр, во втором из противоречивых предложений я имел ввиду что как мне из всех выбранных контуров каждый обсчитывать по отдельности.
2 Александр Пекшев aka Modis благодарю за код, буду пробовать и разбираться
Название: Re: Расчет площадей выделенных контуров
Отправлено: Александр Ривилис от 28-10-2015, 22:13:48
Александр, во втором из противоречивых предложений я имел ввиду что как мне из всех выбранных контуров каждый обсчитывать по отдельности.
Тогда Александр Пекшев aka Modis тебя правильно понял.