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

ADN Club => AutoCAD .NET API => Тема начата: avc от 19-05-2017, 17:01:14

Название: Как присвоить стрелку размеру
Отправлено: avc от 19-05-2017, 17:01:14
Если пользователь меняет у размера стандартную стрелку на другой блок, то Автокад где-то находит стандартные блоки стрелок (типа _DotBlank) даже когда таких блков нет ни в чертеже, ни в шаблоне. Вопрос в том, как мне в программе присвоить RotatedDimension.Dimblk1 стрелку _DotBlank, если такого блока пока нет? Нашел только что в ObjectARX свойство Dimblk1 не ObjectId, а текстовое - там все просто
Код - C++ [Выбрать]
  1. pAlignedDim->setDimblk1(_T("None" ));

А как такое реализовать в .Net? Загружать блоки из другого файла я умею, но откуда загрузить?
Название: Re: Как присвоить стрелку размеру
Отправлено: Дмитрий Загорулькин от 19-05-2017, 18:33:49
Может быть, они ниоткуда не грузятся? Не удивлюсь, если где-то прямо в коде прописано программное создание этих блоков в чертеже. Они довольно примитивны (особенно, блок _None  ;)).
P.S. Хех: http://adndevblog.typepad.com/autocad/2012/06/modifying-arrow-head-of-dimensionleader.html
Название: Re: Как присвоить стрелку размеру
Отправлено: Александр Пекшев aka Modis от 19-05-2017, 18:37:52
Ответ тут (http://through-the-interface.typepad.com/through_the_interface/2007/01/creating_an_aut.html)
Код - C# [Выбрать]
  1. static ObjectId GetArrowObjectId(string newArrName)
  2.     {
  3.       ObjectId arrObjId = ObjectId.Null;
  4.  
  5.       Document doc =
  6.         Application.DocumentManager.MdiActiveDocument;
  7.       Database db = doc.Database;
  8.  
  9.       // Get the current value of DIMBLK
  10.       string oldArrName =
  11.         Application.GetSystemVariable(
  12.           "DIMBLK"
  13.         ) as string;
  14.  
  15.       // Set DIMBLK to the new style
  16.       // (this action may create a new block)
  17.       Application.SetSystemVariable(
  18.         "DIMBLK",
  19.         newArrName
  20.       );
  21.  
  22.       // Reset the previous value of DIMBLK
  23.       if (oldArrName.Length != 0)
  24.         Application.SetSystemVariable(
  25.           "DIMBLK",
  26.           oldArrName
  27.         );
  28.  
  29.       // Now get the objectId of the block
  30.       Transaction tr =
  31.         db.TransactionManager.StartTransaction();
  32.       using(tr)
  33.       {
  34.         BlockTable bt =
  35.           (BlockTable)tr.GetObject(
  36.             db.BlockTableId,
  37.             OpenMode.ForRead
  38.           );
  39.  
  40.         arrObjId = bt[newArrName];
  41.         tr.Commit();
  42.       }
  43.       return arrObjId;
  44.     }
Название: Re: Как присвоить стрелку размеру
Отправлено: avc от 19-05-2017, 19:09:26
ха! Системная переменная в самом деле текстовая. Оригинальный костыль :)
Проверил, работает.
Спасибо!