Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2010, 17:03   #1
praeeo
 
Регистрация: 30.03.2010
Сообщений: 9
По умолчанию Delphi и AutoCAD - страсти по типам данных

Здравствуйте! Прошу помощи у тех, кто разбирается в объектной модели Автокада и VBA!
Хотелось бы реализовать функцию поиска и замены текста в Автокаде из Делфи.
Хотелось бы обойтись без привлечения классов, одними интерфейсами. И вот тут загвоздка, указанная ниже:
Код:
procedure TForm2.Button1Click(Sender: TObject);
var
  i: integer;
  iadoc: IAcadDocument;
  iselset: IAcadSelectionSet;
  iselsets: IAcadSelectionSets;
  itxt: IAcadText;
  ient: IAcadEntity;
  ttxt: TAcadText;
  txtcode,
  txttype: Variant;
begin
  txtcode:= VarArrayCreate ([0,3], varSmallint);
  txtcode[0]:= -4;
  txtcode[1]:= 0;
  txtcode[2]:= 0;
  txtcode[3]:= -4;
  txttype:= VarArrayOf (['<OR','TEXT','MTEXT','OR>']);
  AcadApp := GetAcadApplication(false);
  iadoc := AcadApp.Documents.Open('c:\111', EmptyParam, EmptyParam);
  iselsets := iadoc.SelectionSets;
  iselset := iselsets.Add('t');
  iselset.Select(acSelectionSetAll, EmptyParam, EmptyParam, txtcode, txttype);
  for i := 1 to iselset.Count - 1 do
  begin
  itxt:= iselset.Item(i) as IAcadText;// здесь ошибка EIntfCastError, "Interface not supported"
При явном указании Item'а (например: itxt:= iselset.Item(3) as IAcadText) ошибки нет. Может быть, дело в совместимости числовых типов? Например, для процедуры Select пришлось создавать массив Variant'ов типа Smallint (Integer не прошел)
praeeo вне форума Ответить с цитированием
Старый 21.10.2010, 17:19   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Загляни в хелп акада, и посмотри есть ли метод Item() в классе AcadSelectionSet
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.10.2010, 17:20   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Загляни в хелп акада, и посмотри есть ли метод Item() в классе AcadSelectionSet
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.10.2010, 17:25   #4
praeeo
 
Регистрация: 30.03.2010
Сообщений: 9
По умолчанию

Есть, с этим все в порядке ))

Добавление:

Всё, разобрался. Дело было в разных типах текста: IAcadText (однострочный) и IAcadMText (многострочный). Вот исправленный, хотя еще и сырой, юнит поиска и замены, может кому понадобится. Допилить по вкусу ))
Код:
unit acad;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, AutoCAD_TLB, StdCtrls, ComObj;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    Function GetAcadApplication(Visible: Boolean): IAcadApplication;
    function ReplaceTxt (ss:IAcadSelectionSet; i: integer): WideString;
  private
    AcadApp: IAcadApplication;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
  i: integer;
  iadoc: IAcadDocument;
  iselsets: IAcadSelectionSets;
  iselset: IAcadSelectionSet;
  txtcode, txttype: Variant;
begin
  txtcode := VarArrayCreate([0, 3], varSmallint);
  txtcode[0] := -4;
  txtcode[1] := 0;
  txtcode[2] := 0;
  txtcode[3] := -4;
  txttype := VarArrayOf(['<OR', 'TEXT', 'MTEXT', 'OR>']);
  AcadApp := GetAcadApplication(false);
  iadoc := AcadApp.Documents.Open('c:\123.dwg', EmptyParam,
    EmptyParam);
  iselsets := iadoc.SelectionSets;
  iselset := iselsets.Add('t');
  iselset.Select(acSelectionSetAll, EmptyParam, EmptyParam, txtcode, txttype);
  for i := 0 to iselset.Count - 1 do
  begin
    if iselset.Item(i).EntityName = 'AcDbText' then
       (iselset.Item(i) as IAcadText).TextString:= ReplaceTxt (iselset, i);
    if iselset.Item(i).EntityName = 'AcDbMText' then
       (iselset.Item(i) as IAcadMText).TextString:= ReplaceTxt (iselset, i);
    iselset.Update;
  end;
end;

function TForm2.ReplaceTxt(ss:IAcadSelectionSet; i: integer): WideString;
begin
  if ss.Item(i).EntityName = 'AcDbText' then
    if pos('23', string((ss.Item(i) as IAcadText).TextString)) <> 0 then
      Result := StringReplace(string((ss.Item(i) as IAcadText).TextString),
        '23', '89', [rfReplaceAll]);
  if ss.Item(i).EntityName = 'AcDbMText' then
    if pos('23', string((ss.Item(i) as IAcadMText).TextString)) <> 0 then
      Result := StringReplace(string((ss.Item(i) as IAcadMText).TextString),
        '23', '89', [rfReplaceAll]);
end;

function TForm2.GetAcadApplication(Visible: Boolean): IAcadApplication;
var
  v : OleVariant;
begin
  Try
    v := GetActiveOleObject('AutoCAD.Application');
  Except
    v:= CreateOleObject('AutoCAD.Application');
  end;
  Result := IDispatch(v) as IAcadApplication;
  if Visible then Result.Visible := True;
end;

Последний раз редактировалось praeeo; 22.10.2010 в 10:37.
praeeo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к типам другой формы godlsd Общие вопросы Delphi 4 16.08.2010 13:30
AutoCAD AnTe Общие вопросы Delphi 12 14.06.2010 18:12
Работа с AutoCad KarolinaVlad Помощь студентам 1 11.03.2010 09:05
Delphi и Autocad LaNNC Общие вопросы Delphi 0 29.05.2008 18:41
Delphi и AutoCAD Roof Общие вопросы Delphi 3 28.07.2007 23:04