Тема: Кол-во блоков и длина линий в слое

Надо, чтобы прога на Delphi получила:
1. Кол-во блоков в активном слое. (всех, включая одинаковые блоки)
Команда AcadDocument1.Blocks.Count возвращает всегда другое число. Причем всегда разное, независимо от числа блоков.
2. Суммарную длину всех линий активного слоя.
Знает кто-нибудь, как?

Re: Кол-во блоков и длина линий в слое

Команда AcadDocument1.Blocks.Count возвращает всегда другое число. Причем всегда разное, независимо от числа блоков.

Оно возвращает количество блоков (описаний блоков) в таблице блоков, а не количество вставок блоков. Это две совершенно разные вещи.

Re: Кол-во блоков и длина линий в слое

В принципе я уже почти разобрался. Надо сделать перечет всех объектов в ModelSpace и если параметр ObjectName равен определенному значению, то это блок. Осталось только выташить оттуда имя блока и посчитать.

Re: Кол-во блоков и длина линий в слое

Здравствуйте! У меня возникла примерно такая же задача: Надо из чертежа выбрать блоки и записать их имена и атрибуты в StringGrid.
Пишу след. код (здесь заносим только имена):

procedure TForm1.FormShow(Sender: TObject);
 var AcadBlock, AcadBlocks:OleVariant;  AcadAttributes: Variant;
 i,j,count:integer;
begin
  AcadAppString := 'AutoCAD.Application.16';   j:=1;
  AcadApp := GetActiveOleObject(AcadAppString);
  Count := AcadApp.ActiveDocument.ModelSpace.Count;
  for i:=1 to count-1 do
  if AcadApp.ActiveDocument.ModelSpace.Item(i).ObjectName = 'AcDbBlockReference' then begin
  StringGrid1.Cells[1,j] := AcadApp.ActiveDocument.ModelSpace.Item(i).Name;
  j:=j+1;
  end;

В рисунке у меня около 8000 объектов, 100 из которых - блоки.
При проце в 3200 MГц эти 100 блоков выбирались около 30 сек.
Нет ли более быстрого способа выбрать блоки.
Tools->Attribute Extraction в AutoCAD работает намного быстрее.
Спасибо!

Re: Кол-во блоков и длина линий в слое

В рисунке у меня около 8000 объектов, 100 из которых — блоки.
При проце в 3200 MГц эти 100 блоков выбирались около 30 сек.

Очень актуально....
Можно ли как то для этой задачи использовать ActiveDocument.ActiveSelectionSet.Select? и как?

Re: Кол-во блоков и длина линий в слое

Сделал подсчет блоков так:

function EnumBlockNames(Items: TStrings; IncludeSpecial: Boolean = False): Integer;
var
  i, BlocksCount: Integer;
  BlkName: string;
  BlkCount,RowNum: integer;
  Row: Boolean;
begin
  Result:= -1;
  if not VarIsClear(Acad) then
  begin
    with Items do
    begin
      BeginUpdate;
      try
        Clear;
        BlocksCount:= Acad.ActiveDocument.ModelSpace.Count;
        for i:= 0 to BlocksCount - 1 do
        begin
         if Acad.ActiveDocument.ModelSpace.Item(i).ObjectName = 'AcDbBlockReference' then
         begin
          BlkName:= Acad.ActiveDocument.ModelSpace.Item(i).Name;
          BlkCount:=0;
          if (not IncludeSpecial) and (BlkName[1] <> '*') or IncludeSpecial then
            if BlkName[1]<>'_' then
            begin
            Add(BlkName);
            Row:=  Form1.BlkTab.FindRow(BlkName,RowNum);
            if Row=False then
            Form1.BlkTab.InsertRow(BlkName,'1',True) //Добавляем в ValueList если такого блока еще там нет
            else
            Form1.BlkTab.Values[BlkName]:=IntToStr(StrToInt(Form1.BlkTab.Values[BlkName])+1);
//Прибавляем количество в ValueList если такой блок уже добавлен
            end;
        end;
        end;//end i:=0
      finally
        EndUpdate;
      end;
      Result:= Count;
    end;
  end;
end;

В моем случае у блоков на чертеже есть атрибуты,  подскажите как вытащить атрибут по имени из текущего выбранного в цикле блока?