Выбрать полилинии по параметрам

Автор Тема: Выбрать полилинии по параметрам  (Прочитано 3963 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Добрый день. Отбираю полилинии по длине:

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Runtime.InteropServices;
  10. using Autodesk.AutoCAD.Geometry;
  11. using Autodesk.AutoCAD.GraphicsInterface;
  12. using System.IO;
  13. using System.Collections;
  14. using Autodesk.AutoCAD.Internal;
  15.  
  16. namespace pavli
  17. {
  18.     public class pavli
  19.     {
  20.         [CommandMethod("PAVLI")]
  21.         public void PAVLI()
  22.         {
  23.             Document doc = Application.DocumentManager.MdiActiveDocument;
  24.             Editor ed = doc.Editor;
  25.             Database db = doc.Database;
  26.             LayoutManager layMng = LayoutManager.Current;
  27.  
  28.             List<Autodesk.AutoCAD.DatabaseServices.Polyline> lin2 = new List<Autodesk.AutoCAD.DatabaseServices.Polyline>();
  29.             List<double> lst1 = new List<double> { 210, 297, 420, 594, 841, 1100, 1188, 1600, 1261, 1783, 1330, 2380 };
  30.  
  31.             string curLayoutName1 = layMng.CurrentLayout;
  32.            
  33.  
  34.             TypedValue[] acTypValAr1 = new TypedValue[1];
  35.             //acTypValAr.SetValue(new TypedValue(67, 1), 0);
  36.  
  37.             acTypValAr1.SetValue(new TypedValue(410, curLayoutName1), 0);
  38.             acTypValAr1.SetValue(new TypedValue((int)DxfCode.Start, "POLYLINE,LWPOLYLINE"), 0);
  39.  
  40.             SelectionFilter acSelFtr1 = new SelectionFilter(acTypValAr1);
  41.             PromptSelectionResult acSSPrompt1 = ed.SelectAll(acSelFtr1);
  42.  
  43.             if (acSSPrompt1.Status == PromptStatus.OK && acSSPrompt1.Value.Count > 0)
  44.             {
  45.                 //SelectionSet acSSet1 = acSSPrompt1.Value;
  46.  
  47.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  48.                 {
  49.                
  50.                     //ObjectId csId = db.CurrentSpaceId;
  51.                     //BlockTableRecord cs = tr.GetObject(csId, OpenMode.ForRead) as BlockTableRecord;
  52.  
  53.  
  54.                     foreach (ObjectId id in acSSPrompt1.Value.GetObjectIds())
  55.                     {
  56.  
  57.                         //        // выбираем все линии по параметрам
  58.                         //        foreach (ObjectId id in cs)
  59.                         //{
  60.                         //    //if (id.ObjectClass.Name == "AcDbPolyline")
  61.                         //    if (id.ObjectClass.DxfName == "LWPOLYLINE")
  62.                         //    //if (id.ObjectClass.IsDerivedFrom(RXClass.GetClass(typeof(Autodesk.AutoCAD.DatabaseServices.Polyline))))
  63.                         //    {
  64.                         Autodesk.AutoCAD.DatabaseServices.Polyline plln = tr.GetObject(id, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Polyline;
  65.                         foreach (double dbl1 in lst1)
  66.                         {
  67.                             if (plln.Length == dbl1) lin2.Add(plln);
  68.  
  69.                         }
  70.                        
  71.                     }
  72.                     tr.Commit();
  73.                 }
  74.                
  75.             }
  76.             ed.WriteMessage("\nКоличество полилиний" + lin2.Count);
  77.  
  78.  
  79.         }
  80.     }
  81. }            
  82.  

В файле n1 верно, а в n2 и n3 -нет. Почему?

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Выбрать полилинии по параметрам
« Ответ #1 : 08-05-2019, 19:51:08 »
Значения типа double следует всегда сверять с погрешностью. Длина полилинии может оказаться, например, 1100.000000001 - и вроде вам подходит, но число не будет равным (==)

Отмечено как Решение pavka_97 11-05-2019, 10:12:16

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбрать полилинии по параметрам
« Ответ #2 : 08-05-2019, 19:51:58 »
Почему?
Ошибка вот в этом:
Код - C# [Выбрать]
  1. if (plln.Length == dbl1) lin2.Add(plln);
Нельзя сравнивать на равенство плавающие числа (double). Их нужна сравнивать с каким-то допуском. Например,
Код - Visual Basic [Выбрать]
  1. if (Math.Abs(plln.Length - dbl1) < 0.01) lin2.Add(plln);
Еще одна ошибка в том, что в набор попадают и полилинии (POLYLINE) и облегченные полилинии (LWPOLYLINE), а в цикле ты преобразуешь всё к Polyline (что соответствует только LWPOLYLINE). А то, что соответствует POLYLINE, может иметь класс Polyline2d, Polyline3d. Поэтому правильнее было бы преобразовывать к Curve (это родительский класс) и вычислять его длину.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Выбрать полилинии по параметрам
« Ответ #3 : 08-05-2019, 20:15:03 »
А зачем создаётся список "lin2"? Что планируется делать с полилиниями после закрытия транзакции, в которой они были открыты?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбрать полилинии по параметрам
« Ответ #4 : 08-05-2019, 20:17:41 »
pavka_97,
Дмитрий Загорулькин не дописал (но явно это подразумевал), что после завершения транзакции категорически нельзя пользоваться объектами, открытыми в этой транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Re: Выбрать полилинии по параметрам
« Ответ #5 : 08-05-2019, 20:23:37 »
Транзакция тут по привычке:). Список полилиний для дальнейшей коллекции точек.

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Re: Выбрать полилинии по параметрам
« Ответ #6 : 11-05-2019, 10:12:01 »
Спасибо всем за замечания. Наконец поборол эти полилинии, которые образовывались после explodeproxy.В моем случае получилось при отказе от транзакции, приведении к Curve и введении определенной точности по длине при отборе. Все как вы написали:)