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

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 15-10-2019, 22:27:16

Название: как записать blockReference в TypedValue
Отправлено: Atomohod от 15-10-2019, 22:27:16
Кто-нибудь знает как правильно записать в фильтр blockReference в Dxf в TypedValue  acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "BLOCK"), 0);? Перепробовал все комбинации со словом блок.
Код - C# [Выбрать]
  1.  [CommandMethod("FilterSelectionSet")]
  2.         public static void FilterSelectionSet()
  3.         {
  4.             // Get the current document editor
  5.             Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;
  6.  
  7.             // Create a TypedValue array to define the filter criteria
  8.             TypedValue[] acTypValAr = new TypedValue[1];
  9.             acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "BLOCK"), 0);
  10.  
  11.             // Assign the filter criteria to a SelectionFilter object
  12.             SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
  13.  
  14.             // Request for objects to be selected in the drawing area
  15.             PromptSelectionResult acSSPrompt;
  16.             acSSPrompt = acDocEd.GetSelection(acSelFtr);
  17.  
  18.             // If the prompt status is OK, objects were selected
  19.             if (acSSPrompt.Status == PromptStatus.OK)
  20.             {
  21.                 SelectionSet acSSet = acSSPrompt.Value;
  22.  
  23.                 Application.ShowAlertDialog("Number of objects selected: " +
  24.                                             acSSet.Count.ToString());
  25.             }
  26.             else
  27.             {
  28.                 Application.ShowAlertDialog("Number of objects selected: 0");
  29.             }
  30.         }
Название: Re: как записать blockReference в TypedValue
Отправлено: Александр Ривилис от 15-10-2019, 22:39:54
Кто-нибудь знает как правильно записать в фильтр blockReference в Dxf в TypedValue  acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "BLOCK"), 0);? Перепробовал все комбинации со словом блок.
"INSERT" - ты бы глянул "Справочник по DXF": http://help.autodesk.com/view/OARX/2019/RUS/?guid=GUID-235B22E0-A567-4CF6-92D3-38A2306D73F3
http://help.autodesk.com/view/OARX/2019/RUS/?guid=GUID-28FA4CFB-9D5E-4880-9F11-36C97578252F
Название: Re: как записать blockReference в TypedValue
Отправлено: Дмитрий Загорулькин от 16-10-2019, 11:04:36
Немного дополню. Вот эти вот утилиты (https://adn-cis.org/forum/index.php?topic=7274.0) вот прямо должны быть по умолчанию установлены на компьютере разработчика! ;)
С помощью ARXDBG данная информация извлекается из любого объекта чертежа за пару кликов.
(https://i.postimg.cc/hJsdMsKt/arxdbg.png) (https://postimg.cc/hJsdMsKt)
Как альтернативный вариант - можно воспользоваться LISP-выражением:
Код - Auto/Visual Lisp [Выбрать]
  1. (entget (car (entsel)))
Получаемый список содержит практически всю необходимую информацию для составления фильтра:
Команда: (entget (car (entsel)))
Выберите объект: ((-1 . <Имя объекта: 1773a3545a0>) (0 . "INSERT") (330 . <Имя объекта: 177194b2f00>) (5 . "32A") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (2 . "Тест") (10 260.871 140.083 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))


Название: Re: как записать blockReference в TypedValue
Отправлено: Atomohod от 17-10-2019, 21:30:04
А как указать фильтру, что нужен именно динамический блок?
Название: Re: как записать blockReference в TypedValue
Отправлено: Александр Ривилис от 17-10-2019, 21:33:44
А как указать фильтру, что нужен именно динамический блок?
Увы никак. В фильтруемых DXF-кодах этой информации нет. Более того даже отфильтровать по имени динамический блок достаточно сложно, так как только у "нетронутого" динамического блока имя совпадает с тем, которое ему присвоили при создании. Но если хоть немного изменить вставку блока (например, изменить его видимость), то мы имеем уже другое имя (формата "*Unnn") для вставки блока.