Расчет площадей выделенных контуров

Автор Тема: Расчет площадей выделенных контуров  (Прочитано 10973 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 0
Добрый день!
Подскажите пожалуйста, как получить площади нескольких контуров по отдельности.
Контур рисую вот так http://adn-cis.org/forum/index.php?topic=975.msg4284#msg4284
Его площадь и периметр получаю таким образом: http://adn-cis.org/forum/index.php?topic=772.msg2887#msg2887
Но если я выделю сразу несколько контуров, то как мне можно вывести площади каждого контура отдельно?(чтобы в журнале командной строки писалось: Контур1 Площадь, периметр; Контур2 площадь периметр и т.д.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Обычный перебор (foreach()) выбранных примитивов с выводом площади в командную строку (Editor.WriteMessage())
UPD: Судя по двум приложенным ссылкам вы хотите, чтобы вам готовое решение написали  ;D

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 0
..
UPD: Судя по двум приложенным ссылкам вы хотите, чтобы вам готовое решение написали  ;D
Не совсем, хотелось бы самому разобраться. Сейчас буду смотреть что это за foreach и как с ним работать)
Я понимаю, что это все надо сделать перебором, просто не понимаю как выделить каждый контур по отдельности. Сейчас буду эксперементировать

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Но если я выделю сразу несколько контуров, то как мне можно вывести площади каждого контура отдельно?
просто не понимаю как выделить каждый контур по отдельности.
Только мне кажется, что в этих двух предложениях есть противоречие? Что понимается под "выделением контуров"? Программа должна запросить у пользователя выбор нескольких контуров и вывести для каждого из выбранных по отдельности информацию в командную строку?
« Последнее редактирование: 29-10-2015, 09:59:02 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение melkalex90 28-10-2015, 23:31:54

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Код - 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. }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Modis
Раз ты выбрал в качестве фильтра "*POLYLINE", то тогда лучше
Код - C# [Выбрать]
  1. var pl = tr.GetObject(objId, OpenMode.ForRead) as Curve;
Да и проверка на pl.Closed пожалуй лишняя (площадь есть и у незамкнутых кривых).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Раз ты выбрал в качестве фильтра "*POLYLINE", то тогда лучше
С 3D полилиниями работать не приходилось, поэтому тут не был уверен в правильности. Была мысль оставить LWPOLYLINE
Да и проверка на pl.Closed пожалуй лишняя (площадь есть и у незамкнутых кривых).
Я так понял, что автору нужна площадь замкнутых полилиний, поэтому и добавил проверку

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
С 3D полилиниями работать не приходилось, поэтому тут не был уверен в правильности.
Под фильтр "*POLYLINE" попадает и класс Polyline2d
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн art_rrc

  • ADN Club
  • **
  • Сообщений: 70
  • Карма: 1
  • Skype: art_sapranovich
Полилинии бывают условно замкнутыми (первая и последняя вершины совпадают). Но свойство Closed при этом возвращает false.
Полилиния может быть вообще не замкнутая, но как сам автокад, так и программное свойство .Area без проблем вернет результат, в таком случае полилиния как бы мысленно замыкается по наикратчайшему расстоянию. 

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
art_rrc, Александр Ривилис об этом уже написал))) Да и все мы об этом знаем

Полилинии бывают условно замкнутыми (первая и последняя вершины совпадают). Но свойство Closed при этом возвращает false.
А, кстати, еще у Polyline есть свойство IsReallyClose (мог с ошибками написать) - думаю, что это что-то из этой-же оперы

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

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

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 0
Не было возможности написать ответ...Александр, во втором из противоречивых предложений я имел ввиду что как мне из всех выбранных контуров каждый обсчитывать по отдельности.
2 Александр Пекшев aka Modis благодарю за код, буду пробовать и разбираться

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

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