Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 19-06-2017, 10:05:09

Название: Установить масштаб штриховки
Отправлено: Алексей (IdeaSoft) от 19-06-2017, 10:05:09
Подскажите, что делаю не так.
Устанавливаю масштаб штриховке.

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

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

Начиная с acad 2013 такого эффекта нет.
Название: Re: Установить масштаб штриховки
Отправлено: Александр Пекшев aka Modis от 19-06-2017, 10:06:15
Может стоит вызвать Editor.Regen()?
Название: Re: Установить масштаб штриховки
Отправлено: Алексей (IdeaSoft) от 19-06-2017, 10:15:52
Может стоит вызвать Editor.Regen()?
_REGEN даже с командной строки автокад не помогает.

Не перенос объекта штриховки не масштабирование ни чего не помогает,
только если руками в свойствах штриховки перебить масштаб - это помогло.
(впрочем как на видео и показано).
Название: Re: Установить масштаб штриховки
Отправлено: Александр Пекшев aka Modis от 19-06-2017, 10:17:36
Попробуйте еще:
1. hatch.EvaluateHatch(true);
2. ed.UpdateScreen();
Название: Re: Установить масштаб штриховки
Отправлено: Алексей (IdeaSoft) от 19-06-2017, 10:32:13
hatch.EvaluateHatch(true);
Этот метод не помогает
Название: Re: Установить масштаб штриховки
Отправлено: Александр Пекшев aka Modis от 19-06-2017, 10:39:57
Проблема еще может быть в порядке задания свойств и вызова методов. Вот обсуждали подобное (http://forums.augi.com/showthread.php?115092-problem-with-hatch-pattern-and-angle).
Название: Re: Установить масштаб штриховки
Отправлено: Алексей (IdeaSoft) от 19-06-2017, 10:44:04
Я еще в 10 раз масштабирую все примитивы,
в том числе и те которые, ассоциативно
связаны со штриховкой.
Думаю в этом все дело.
Потому как если не масштабировать
в 10 раз все нормально.
Название: Re: Установить масштаб штриховки
Отправлено: Александр Пекшев aka Modis от 19-06-2017, 10:46:28
Я еще в 10 раз масштабирую все примитивы,
в том числе и те которые, ассоциативно
связаны со штриховкой.
Думаю в этом все дело.
Потому как если не масштабировать
в 10 раз все нормально.
Программно не пробовал, но при работе вручную - масштабирование объектов не влияет на масштаб штриховки.
Масштабируете только объекты? Или вместе со штриховками? Может все-таки пора код показать?  ;)
Название: Re: Установить масштаб штриховки
Отправлено: Алексей (IdeaSoft) от 19-06-2017, 10:47:23
При чем такой порядок действий
1) Сначала масштабирую объект с которым буду ассоциировать
    штриховку к примеру это полилиния.
2) А потом назначаю ассоциацию.
Название: Re: Установить масштаб штриховки
Отправлено: Александр Пекшев aka Modis от 19-06-2017, 11:06:17
Может все-таки пора код показать? 
Название: Re: Установить масштаб штриховки
Отправлено: Александр Ривилис от 19-06-2017, 11:14:22
Я в редакторе свойств меняю его незначительно и он внешне становится правильный.
Я вижу два варианта:
1. Порядок задания свойств штриховке. hatch.SetHatchPattern должен быть задан повторно после задания её масштаба. Ну и hatch.EvaluateHatch(true), как написал Александр Пекшев aka Modis
2. Значение системной переменной MEASUREMENT. На видео хорошо видно:

Название: Re: Установить масштаб штриховки
Отправлено: Алексей (IdeaSoft) от 19-06-2017, 11:57:21
орядок задания свойств штриховке. hatch.SetHatchPattern
На счет повторно понятно.

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

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


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



Название: Re: Установить масштаб штриховки
Отправлено: Алексей (IdeaSoft) от 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.         }
Название: Re: Установить масштаб штриховки
Отправлено: Дмитрий Загорулькин от 19-06-2017, 18:10:56
Строки 11 и 13: В чем смысл повтора?
26-29: А где, собственно, масштабирование штриховки?
Что-то мне подсказывает, что в таком варианте - когда у штриховки нет собственных границ, для "масштабирования" штриховки достаточно сделать следующее:
Код - C# [Выбрать]
  1. Hobj.PatternScale = 0.5 * mas;
Название: Re: Установить масштаб штриховки
Отправлено: Алексей (IdeaSoft) от 19-06-2017, 19:20:12
В чем смысл повтора?
Это я следовал совету Александра

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

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

Хотя может эта строка не нужна.
Попробую без нее.
Название: Re: Установить масштаб штриховки
Отправлено: Алексей (IdeaSoft) от 19-06-2017, 19:21:57
А где, собственно, масштабирование штриховки?
Как оказалось это и не нужно.
Я просто сам запутался в своем алгоритме и сначало было подумал что эот масштабирование нужно.
А как оказалось и без этого все хорошо работает
Название: Re: Установить масштаб штриховки
Отправлено: Алексей (IdeaSoft) от 19-06-2017, 19:28:38
Убрал строку
13. Hobj.SetHatchPattern(HatchPatternType.CustomDefined, "ANSI35");
И масштаб перестал устанавливаться.

Название: Re: Установить масштаб штриховки
Отправлено: Алексей (IdeaSoft) от 19-06-2017, 19:34:02
А вот убрал строку 11. Ни чего не поменялось.
Название: Re: Установить масштаб штриховки
Отправлено: Александр Ривилис от 19-06-2017, 20:07:39
Убрал строку
13. Hobj.SetHatchPattern(HatchPatternType.CustomDefined, "ANSI35");
И масштаб перестал устанавливаться.
Именно так.
А вот убрал строку 11. Ни чего не поменялось.
Лучше верни обратно. Не помню в какой из версий AutoCAD если PatternScale задавался до SetHatchPattern, то срабатывало исключение.
Название: Re: Установить масштаб штриховки
Отправлено: Алексей (IdeaSoft) от 19-06-2017, 21:28:40
Лучше верни обратно
OK! Вернуть не проблема.