Проблема при создании штриховки

Автор Тема: Проблема при создании штриховки  (Прочитано 8820 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Коллеги, добрый день! Помогите разобраться, пожалуйста. Пытаюсь немного облегчить рутинную работу через C#. Хотел расширить работу плагина, чтобы при всех прочих действиях, выбранные полилинии через GetSelection заштриховывались. В коллекцию добавляю только замкнутые полилинии. Полилинии перебираю циклом и добавляю их в ObjectIdCollections.  Но на методе oHatch.AppendLoop((int)HatchLoopTypes.Default, ObjIds) возникает ошибка eInvalidInput. Причем если выбрать одну полилинию - штрихует. Если больше одной - возникает ошибка. Может быть подскажите как быть?

пытаюсь реализовать так:
Код - C# [Выбрать]
  1. //в одном методе перебираю полилинии
  2.  
  3.               if (acSSPrompt.Status == PromptStatus.OK)
  4.                 {
  5.  
  6.                     using (Transaction tr = db.TransactionManager.StartTransaction())
  7.                     {
  8.  
  9.  
  10.                         foreach (ObjectId id in acSSPrompt.Value.GetObjectIds())
  11.                         {
  12.                             Polyline plln = tr.GetObject(id, OpenMode.ForRead) as Polyline;
  13.                             pllntemp.Add(plln);
  14.  
  15.                             if (plln.Closed == true) ObjIds.Add(plln.ObjectId); //тут добавляю их в ObjectIdCollections
  16.  
  17.                        }
  18.  
  19.                         tr.Commit();
  20.  
  21. _5_Vosstaovlenie_shtrihovki.CHB(ObjIds, db); // потом передаю в метод, который по идее должен создавать штриховку
  22.  
  23. // и сам метод:
  24.  
  25.    
  26.         public static void CHB(ObjectIdCollection ObjIds, Database db)
  27.         {
  28.  
  29.             //Document doc = Application.DocumentManager.MdiActiveDocument;
  30.             //Database db = doc.Database;
  31.             //Editor ed = doc.Editor;
  32.             using (DocumentLock locked = Application.DocumentManager.MdiActiveDocument.LockDocument())
  33.             {
  34.                 using (Transaction Tx = db.TransactionManager.StartTransaction())
  35.             {
  36.                 ObjectId ModelSpaceId =
  37.                         SymbolUtilityServices.GetBlockModelSpaceId(db);
  38.  
  39.                 BlockTableRecord btr = Tx.GetObject(ModelSpaceId,
  40.                                   OpenMode.ForWrite) as BlockTableRecord;
  41.  
  42.              
  43.        
  44.  
  45.                 Hatch oHatch = new Hatch();
  46.                     Vector3d normal = new Vector3d(0.0, 0.0, 1.0);
  47.                     oHatch.Normal = normal;
  48.                     oHatch.Elevation = 0.0;
  49.                     oHatch.PatternScale = 200.0;
  50.                 oHatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31");
  51.  
  52.  
  53.                 btr.AppendEntity(oHatch);
  54.                 Tx.AddNewlyCreatedDBObject(oHatch, true);
  55.                     // Вот теперь можно сделать штриховку ассоциативной
  56.                     oHatch.Associative = true;
  57.                     oHatch.AppendLoop((int)HatchLoopTypes.Default, ObjIds); //вот тут позникает ошибка, если в ObjIds лежит больше 1 элемента
  58.                 oHatch.EvaluateHatch(true);
  59.                    
  60.                 Tx.Commit();
  61.             }
  62.                 locked.Dispose();
  63.             }
  64.            
  65.  
  66.         }
« Последнее редактирование: 29-03-2020, 16:26:07 от Александр Ривилис »

Отмечено как Решение VitaliyB 29-03-2020, 18:00:34

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Проблема при создании штриховки
« Ответ #1 : 29-03-2020, 16:33:02 »
VitaliyB,
Приветствую на форуме!
Обрати внимание как следует форматировать код у нас на форуме - у меня в подписи инструкция.

Ты добавляешь замкнутые полилинии в качестве границы (Loop) штриховки. Очевидно, что замкнутая полилиния может быть только одна в качестве границы. В твоём же случае нужно в цикле добавлять по одной полилинии, т.е. вызовов oHatch.AppendLoop должно быть столько, сколько замкнутых полилиний ты выбрал.

P.S.: locked.Dispose(); убери - он лишний, так как этот метод вызывается автоматически при использовании using (...)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Проблема при создании штриховки
« Ответ #2 : 29-03-2020, 17:31:00 »
VitaliyB,
Дублирующую тему я убрал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Проблема при создании штриховки
« Ответ #3 : 29-03-2020, 17:47:39 »
Александр Ривилис, спасибо за ответ! Если я правильно понял, то я уже пробовал такой способ:

Код - C# [Выбрать]
  1.  if (acSSPrompt.Status == PromptStatus.OK)
  2.                 {
  3.                     using (Transaction tr = db.TransactionManager.StartTransaction())
  4.                     {
  5.  
  6.                         foreach (ObjectId id in acSSPrompt.Value.GetObjectIds())
  7.                         {
  8.                             Polyline plln = tr.GetObject(id, OpenMode.ForRead) as Polyline;
  9.                             pllntemp.Add(plln);
  10.  
  11.  
  12.                             if (plln.Closed == true)
  13.                             {
  14.                                 ObjIds.Clear(); //очищаю коллекцию ObjectId
  15.                                    ObjIds.Add(plln.ObjectId);//добавляю ObjectId очередой полилинии
  16.                                 _5_Vosstaovlenie_shtrihovki.CHB(ObjIds, db);//создаю штриховку посредством метода (приведенного выше)
  17.                             }
  18.  
  19.  
  20.                         }
  21.  
  22.                         tr.Commit();

Но в этом случае просто создаются разные штриховки, а мне надо чтобы создавалась одна штриховка, как если бы я делал это руками в автокаде, выбрав замкнутые контуры - т.е. чтобы штриховались внешние контуры, не штриховались внутренние. Или я что-то не правильно понимаю?




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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Проблема при создании штриховки
« Ответ #4 : 29-03-2020, 17:49:16 »
Или я что-то не правильно понимаю?
Понимаешь неправильно. Перечитай внимательно мой ответ.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Проблема при создании штриховки
« Ответ #5 : 29-03-2020, 18:01:08 »
Все, понял! Получилось! УРА! Александр, спасибо!!!