Установить масштаб штриховки

Автор Тема: Установить масштаб штриховки  (Прочитано 11998 раз)

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Подскажите, что делаю не так.
Устанавливаю масштаб штриховке.

Код - C# [Выбрать]
  1. Dim hatch As Hatch = New Hatch
  2. hatch.SetHatchPattern(HatchPatternType.CustomDefined, "ANSI35")
  3. hatch.PatternScale = 1.1

Такая штука получается (прикрепляю видео),
что масштаб устанавливается, но визуально он не такой, какой должен быть.
Я в редакторе свойств меняю его незначительно и он внешне становится правильный.
Это возникает только с API acad 2012

Начиная с acad 2013 такого эффекта нет.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Установить масштаб штриховки
« Ответ #1 : 19-06-2017, 10:06:15 »
Может стоит вызвать Editor.Regen()?

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Установить масштаб штриховки
« Ответ #2 : 19-06-2017, 10:15:52 »
Может стоит вызвать Editor.Regen()?
_REGEN даже с командной строки автокад не помогает.

Не перенос объекта штриховки не масштабирование ни чего не помогает,
только если руками в свойствах штриховки перебить масштаб - это помогло.
(впрочем как на видео и показано).

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Установить масштаб штриховки
« Ответ #3 : 19-06-2017, 10:17:36 »
Попробуйте еще:
1. hatch.EvaluateHatch(true);
2. ed.UpdateScreen();

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Установить масштаб штриховки
« Ответ #4 : 19-06-2017, 10:32:13 »
hatch.EvaluateHatch(true);
Этот метод не помогает

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Установить масштаб штриховки
« Ответ #5 : 19-06-2017, 10:39:57 »
Проблема еще может быть в порядке задания свойств и вызова методов. Вот обсуждали подобное.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Установить масштаб штриховки
« Ответ #6 : 19-06-2017, 10:44:04 »
Я еще в 10 раз масштабирую все примитивы,
в том числе и те которые, ассоциативно
связаны со штриховкой.
Думаю в этом все дело.
Потому как если не масштабировать
в 10 раз все нормально.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Установить масштаб штриховки
« Ответ #7 : 19-06-2017, 10:46:28 »
Я еще в 10 раз масштабирую все примитивы,
в том числе и те которые, ассоциативно
связаны со штриховкой.
Думаю в этом все дело.
Потому как если не масштабировать
в 10 раз все нормально.
Программно не пробовал, но при работе вручную - масштабирование объектов не влияет на масштаб штриховки.
Масштабируете только объекты? Или вместе со штриховками? Может все-таки пора код показать?  ;)

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Установить масштаб штриховки
« Ответ #8 : 19-06-2017, 10:47:23 »
При чем такой порядок действий
1) Сначала масштабирую объект с которым буду ассоциировать
    штриховку к примеру это полилиния.
2) А потом назначаю ассоциацию.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Установить масштаб штриховки
« Ответ #9 : 19-06-2017, 11:06:17 »
Может все-таки пора код показать? 

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установить масштаб штриховки
« Ответ #10 : 19-06-2017, 11:14:22 »
Я в редакторе свойств меняю его незначительно и он внешне становится правильный.
Я вижу два варианта:
1. Порядок задания свойств штриховке. hatch.SetHatchPattern должен быть задан повторно после задания её масштаба. Ну и hatch.EvaluateHatch(true), как написал Александр Пекшев aka Modis
2. Значение системной переменной MEASUREMENT. На видео хорошо видно:

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Установить масштаб штриховки
« Ответ #11 : 19-06-2017, 11:57:21 »
орядок задания свойств штриховке. hatch.SetHatchPattern
На счет повторно понятно.

Спасибо всем за ответы.

Ну вообщем пока все хорошо работает, если алгоритм у меня
в такой последовательности:
 
1) Создаю объект полилинии
2) Создаю объект штриховки
3) Добавляю в базу объект полилинии
4) Добавляю в базу объект штриховки
5) масштабирую в 10 раз объект полилинии
6) масштабирую в 10 раз объект штриховки
7) назначаю ассоциацию штриховки к полилинии


Буду еще тестировать.
Если что-то не будет получаться.
Тогда напишу.




Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Установить масштаб штриховки
« Ответ #12 : 19-06-2017, 17:31:52 »
Все хорошо. Всем спасибо.
Все получилось

Код - C# [Выбрать]
  1.         // mas - коэффициент масштаба
  2.         public static void test_addHatch(double mas) {
  3.             Document doc = acApp.DocumentManager.MdiActiveDocument;
  4.             Database db = doc.Database;
  5.             using (Transaction tr = db.TransactionManager.StartTransaction() ) {
  6.                
  7.                 BlockTable bt = tr.GetObject(db.BlockTableId,  OpenMode.ForWrite) as BlockTable;
  8.                 BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  9.                 // 1. Создаем объект штриховки
  10.                 Hatch Hobj = new Hatch();
  11.                 Hobj.SetHatchPattern(HatchPatternType.CustomDefined, "ANSI35");
  12.                 Hobj.PatternScale = 0.5;
  13.                 Hobj.SetHatchPattern(HatchPatternType.CustomDefined, "ANSI35");
  14.                 // 2. Создаем объект полилилинии
  15.                 Polyline pl = new Polyline();
  16.                 pl.AddVertexAt(0, new Point2d(0,  0), 0, 0, 0);
  17.                 pl.AddVertexAt(0, new Point2d(4,  0), 0, 0, 0);
  18.                 pl.AddVertexAt(0, new Point2d(4,  1), 0, 0, 0);
  19.                 pl.AddVertexAt(0, new Point2d(0,  1), 0, 0, 0);
  20.                 pl.Closed = true;
  21.                 // 3. добавляем записи в таблицу
  22.                 ObjectId id = btr.AppendEntity(pl);
  23.                 btr.AppendEntity(Hobj);
  24.                 tr.AddNewlyCreatedDBObject(pl, true);
  25.                 tr.AddNewlyCreatedDBObject(Hobj, true);
  26.                 // 4. масштабируем объекты в mas раз
  27.                 Entity ent1 = pl as Entity;
  28.                 Entity ent2 = Hobj as Entity;
  29.                 acadnet_Primitive_Scale_Ent(ref ent1, mas);
  30.                 //5. Назначение ассоциации
  31.                 ObjectId[] IDS = { id };
  32.                 ObjectIdCollection InnObj = new ObjectIdCollection(IDS);
  33.                 acadnet_Hath_LoopsObj(ref Hobj, InnObj);
  34.  
  35.                 tr.Commit();
  36.             }
  37.         }
  38.         // масштабирует примитив
  39.         public static void acadnet_Primitive_Scale_Ent(ref Entity ent, double val) {
  40.             if ((val == 1) || (val == 0)) return;
  41.             Database db = ent.Database;
  42.             using (Transaction tr = db.TransactionManager.StartTransaction())
  43.             {
  44.                 ent.UpgradeOpen();
  45.                 Point3d Zpnt = new Point3d(0, 0, 0);
  46.                 Matrix3d matScale = Matrix3d.Scaling(val, Zpnt);
  47.                 ent.TransformBy(matScale);
  48.                 tr.Commit();
  49.             }
  50.         }
  51.         // назначение асоциативных обектов для штриховки
  52.         public static void acadnet_Hath_LoopsObj(ref Hatch entH,
  53.                                                  ObjectIdCollection IDColl_Inner) {
  54.             entH.UpgradeOpen();
  55.             entH.Associative = true;
  56.             if (IDColl_Inner != null) {
  57.                 entH.AppendLoop(HatchLoopTypes.Default, IDColl_Inner);
  58.                 entH.EvaluateHatch(true);
  59.             }
  60.         }

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Установить масштаб штриховки
« Ответ #13 : 19-06-2017, 18:10:56 »
Строки 11 и 13: В чем смысл повтора?
26-29: А где, собственно, масштабирование штриховки?
Что-то мне подсказывает, что в таком варианте - когда у штриховки нет собственных границ, для "масштабирования" штриховки достаточно сделать следующее:
Код - C# [Выбрать]
  1. Hobj.PatternScale = 0.5 * mas;

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Установить масштаб штриховки
« Ответ #14 : 19-06-2017, 19:20:12 »
В чем смысл повтора?
Это я следовал совету Александра

1. Порядок задания свойств штриховке. hatch.SetHatchPattern должен быть задан повторно после задания её масштаба

Может я что-то не так понял?

Хотя может эта строка не нужна.
Попробую без нее.