Пользовательская штриховка

Автор Тема: Пользовательская штриховка  (Прочитано 8903 раз)

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

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

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

  • ADN Club
  • **
  • Сообщений: 62
  • Карма: 4
Есть файл с кучей пользовательских штриховок. Pat-файлов нет, конечно же. Есть ли какой-то способ "вытащить" описания таких штриховок для дальнейшего использования?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пользовательская штриховка
« Ответ #1 : 24-08-2021, 14:53:06 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 62
  • Карма: 4
Re: Пользовательская штриховка
« Ответ #2 : 24-08-2021, 14:59:53 »
Спасибо, но это малость не то. Мне надо программно получить описание (если это в принципе возможно, конечно) и заштриховать что-то вот этой вот пользовательской штриховкой. Да, надо было сразу точно формулировать. Каюсь.

UPD. Хотя можно и так попробовать.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пользовательская штриховка
« Ответ #3 : 24-08-2021, 17:00:33 »
Мне надо программно получить описание (если это в принципе возможно, конечно) и заштриховать что-то вот этой вот пользовательской штриховкой.
Для создания штриховки (Hatch) стандартными средствами требуется, чтобы её имя было в pat-файле. Так что другого пути я не вижу.
Здесь я нашел исправленную версию: https://thesourcecad.com/wp-content/uploads/2018/10/getpat_mod.zip
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 62
  • Карма: 4
Re: Пользовательская штриховка
« Ответ #4 : 24-08-2021, 17:32:47 »
Да, нормально. Прикрутим. Спасибо.

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

  • ADN Club
  • **
  • Сообщений: 62
  • Карма: 4
Re: Пользовательская штриховка
« Ответ #5 : 26-08-2021, 16:59:18 »
Ну вот как то так. Может кому ещё сгодиться. Используется P/Invoke (acdbGetAdsName, acdbEntGet) т. ч. зависит от разрядности и версии.

Код - C# [Выбрать]
  1.         [CommandMethod("TestHatchDxf")]
  2.         public void TestHatchDxf()
  3.         {
  4.             Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.  
  8.             PromptEntityOptions entityOpt = new PromptEntityOptions("\nSelect hatch: ");
  9.             PromptEntityResult entityRes = ed.GetEntity(entityOpt);
  10.  
  11.             if (entityRes.Status == PromptStatus.OK)
  12.             {
  13.                 ObjectId id = entityRes.ObjectId;
  14.  
  15.                 if (!id.ObjectClass.IsDerivedFrom(RXClass.GetClass(typeof(Hatch))))
  16.                 {
  17.                     MessageBox.Show("Не шртиховка");
  18.  
  19.                     return;
  20.                 }
  21.  
  22.                 db.Dimzin = 0;
  23.  
  24.                 List<TypedValue> dxf = new List<TypedValue>();
  25.  
  26.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  27.                 {
  28.                     using (Hatch hatch = tr.GetObject(entityRes.ObjectId, OpenMode.ForWrite, false, true) as Hatch)
  29.                     {
  30.                         double angle = hatch.PatternAngle;
  31.  
  32.                         try { hatch.PatternAngle = 0; } catch { }
  33.  
  34.                         long[] ent = new long[] { 0, 0 };
  35.  
  36.                         acdbGetAdsName(ent, id);
  37.  
  38.                         using (ResultBuffer rb = DisposableWrapper.Create(typeof(ResultBuffer), acdbEntGet(ent), true) as ResultBuffer)
  39.                         {
  40.                             if (rb != null) dxf = rb.AsArray().ToList();
  41.                         }
  42.  
  43.                         try { hatch.PatternAngle = angle; } catch { }
  44.                     }
  45.  
  46.                     tr.Commit();
  47.                 }
  48.  
  49.                 if (dxf.Count > 0)
  50.                 {
  51.                     string pattern = (string)dxf.Where(tv => tv.TypeCode == 2).Select(tv => tv.Value).FirstOrDefault();
  52.                     double rotation = (double)dxf.Where(tv => tv.TypeCode == 52).Select(tv => tv.Value).FirstOrDefault() * 180 / Math.PI;
  53.                     double scale = (double)dxf.Where(tv => tv.TypeCode == 41).Select(tv => tv.Value).FirstOrDefault();
  54.                     double xoffset = (double)dxf.Where(tv => tv.TypeCode == 43).Select(tv => tv.Value).FirstOrDefault();
  55.                     double yoffset = (double)dxf.Where(tv => tv.TypeCode == 44).Select(tv => tv.Value).FirstOrDefault();
  56.  
  57.                     string record = "*" + pattern;
  58.  
  59.                     TypedValue member = dxf.Where(tv => tv.TypeCode == 53).FirstOrDefault();
  60.  
  61.                     int index = dxf.IndexOf(member);
  62.  
  63.                     dxf.RemoveRange(0, index);
  64.  
  65.                     string filePath = Path.Combine((string)AcAp.Application.GetSystemVariable("DWGPREFIX"), pattern + ".pat");
  66.  
  67.                     if (File.Exists(filePath)) File.Delete(filePath);
  68.  
  69.                     double angl = 0d, tmp1 = 0d, tmp2 = 0d, xvec = 0d, yvec = 0d;
  70.  
  71.                     using (StreamWriter file = new StreamWriter(filePath, false, Encoding.Default))
  72.                     {
  73.                         foreach (TypedValue val in dxf)
  74.                         {
  75.                             switch (val.TypeCode)
  76.                             {
  77.                                 case 53:
  78.                                     file.WriteLine(record);
  79.                                     angl = (double)val.Value;
  80.                                     record = string.Format("{0:F7}", angl * 180 / Math.PI).TrimEnd('0').TrimEnd('.');
  81.                                     break;
  82.                                 case 43:
  83.                                     record += ", " + string.Format("{0:F7}", (((double)val.Value) - xoffset) / scale).TrimEnd('0').TrimEnd('.');
  84.                                     break;
  85.                                 case 44:
  86.                                     record += "," + string.Format("{0:F7}", (((double)val.Value) - yoffset) / scale).TrimEnd('0').TrimEnd('.');
  87.                                     break;
  88.                                 case 45:
  89.                                     tmp1 = (double)val.Value;
  90.                                     break;
  91.                                 case 46:
  92.                                     tmp2 = (double)val.Value;
  93.                                     xvec = (tmp1 * Math.Cos(angl) + tmp2 * Math.Sin(angl)) / scale;
  94.                                     yvec = (tmp2 * Math.Cos(angl) - tmp1 * Math.Sin(angl)) / scale;
  95.                                     record += ", " + string.Format("{0:F7}", xvec).TrimEnd('0').TrimEnd('.') + "," +
  96.                                                      string.Format("{0:F7}", yvec).TrimEnd('0').TrimEnd('.');
  97.                                     break;
  98.                                 case 49:
  99.                                     record += ", " + string.Format("{0:F7}", (double)val.Value / scale).TrimEnd('0').TrimEnd('.');
  100.                                     break;
  101.                                 case 98:
  102.                                     file.WriteLine(record);
  103.                                     break;
  104.                                 default:
  105.                                     break;
  106.                             }
  107.                         }
  108.  
  109.                         file.WriteLine("");
  110.                     }
  111.                 }
  112.             }
  113.         }
  114.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пользовательская штриховка
« Ответ #6 : 27-08-2021, 00:17:05 »
bender,
MessageBox.Show("Не шртиховка"); :D :D :D
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пользовательская штриховка
« Ответ #7 : 27-08-2021, 00:22:43 »
Кстати, можно было бы попытаться не использовать acdbGetAdsName и acdbEntGet, а заменить их на DBObject.DxfOut и свой DxfFiler
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение bender 27-08-2021, 15:54:54

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пользовательская штриховка
« Ответ #8 : 27-08-2021, 00:27:59 »
И еще - если вообще отказаться от базы в виде lisp-кода. Можно воспользоваться парой методов: Hatch.NumberOfPatternDefinitions и Hatch.GetPatternDefinitionAt
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 62
  • Карма: 4
Re: Пользовательская штриховка
« Ответ #9 : 27-08-2021, 15:54:41 »
И еще - если вообще отказаться от базы в виде lisp-кода. Можно воспользоваться парой методов: Hatch.NumberOfPatternDefinitions и Hatch.GetPatternDefinitionAt

А вот это похоже на дело. Т. ч. я этот ответ как решение отмечу.