Тема: Первые шаги программирования Delphi - AutoCad

Конечно хорошо когда уже знаешь, что и как.
А вот я только начинаю в этом разбираться. К тому же не умею программировать на LISP и VB. Могу только на Delphi.
Поэтому будет большая просьба. Помогите начать.
Из данного форума я понял как запустить из Delphi AutoCad. Смог нарисовать линию. А дальше тупик. Как рисовать окружности, дуги, заливку и т.п.
Пишу код для отрисовки окружности, Delphi это устраивает компилируется без проблем, вот AutoCad ругается или вообще ничего не рисует.
Кто может подсказать (если можно, то напишите код) или дать сылку на форум для начинающих.
Понимаю, что спрашиваю элементарное, но начинать всегда трудно.

Re: Первые шаги программирования Delphi - AutoCad

Линию нарисовал - уже гурру.
Остальное см. Help по VBA в АКАДе и переводи код в Делфи

Re: Первые шаги программирования Delphi - AutoCad

Не идельно, но всё же поможет на первых порах...

function DrawArc(IAcad:IAcadApplication):boolean;
//прорисовка дуги
var Point:OleVariant;
    Radius,
    StartAngle,
    EndAngle:Double;
begin
  Result:=false;
  with IAcad.ActiveDocument do
    begin
      //получаем от пользователя точку
      Point:=Utility.GetPoint(EmptyParam,Укажите точку центра дуги: ');
      //если не получаем, то выходим
      if not(VarIsArray(Point)) then Exit;
      //получаем радиус
      Radius:=Utility.GetDistance(Point,Введите радиус: ');
      //начальный угол
      StartAngle:=Utility.GetAngle(Point,Введите начальный угол: ');
      //конечный угол
      EndAngle:=Utility.GetAngle(Point,Введите конечный угол: ');
      //прорисовка и визуализация дуги
      ModelSpace.AddArc(Point,Radius,StartAngle,EndAngle).Update;
    end;
  Result:=true;
end;

Re: Первые шаги программирования Delphi - AutoCad

function DrawCircle(IAcad:IAcadApplication):boolean;
//прорисовка окружности
var Point:OleVariant;
    Radius:Double;
begin
  Result:=false;
  with IAcad.ActiveDocument do
    begin
      //получаем от пользователя точку центра
      Point:=Utility.GetPoint(EmptyParam,'Укажите точку центра окружности: ');
      //если не получаем, то выходим
      if not(VarIsArray(Point)) then Exit;
      //получаем радиус
      Radius:=Utility.GetDistance(Point,'Введите радиус: ');
      //прорисовка и визуализация окружности
      IAcad.ActiveDocument.ModelSpace.AddCircle(Point,Radius).Update;
    end;
  Result:=true;
end;

Re: Первые шаги программирования Delphi - AutoCad

function DrawHatchObject(IAcad:IAcadApplication):boolean;
//прорисовка 3-х колец, залитых штриховкой
var Point:OleVariant;
    Radius:Double;
    HatchObj:IAcadHatch; //штриховка
    OuterLoop, //внешние границы штриховки
    InnerLoop: //внутренние границы штриховки
    array of IAcadEntity;
    i:integer;
begin
  Result:=false;
  with IAcad.ActiveDocument do
    begin
      SetLength(OuterLoop,1);
      SetLength(InnerLoop,1);
      //получаем от пользователя точку центра
      Point:=Utility.GetPoint(EmptyParam,'Укажите точку центра: ');
      if not(VarIsArray(Point)) then Exit;
      //получаем радиус
      Radius:=Utility.GetDistance(Point,'Введите радиус: ');
      //создаём объект штриховки
      HatchObj:=ModelSpace.AddHatch(0,'ANSI31',true);
      //рисуем кольца и заполняем массивы границ
      Point[0]:=Point[0]-Radius*2;
      for i:=0 to 2 do
        begin
          //внешние
          OuterLoop[0]:=ModelSpace.AddCircle(Point,Radius);
          //внутренние
          InnerLoop[0]:=ModelSpace.AddCircle(Point,Radius/2);
          //применяем наружные границы
          HatchObj.AppendOuterLoop(OuterLoop);
          //применяем внутренние границы
          HatchObj.AppendInnerLoop(InnerLoop);
          Point[0]:=Point[0]+Radius*2;
        end;
      //вычисление штриховки
      HatchObj.Evaluate;
      //визуализация штриховки
      HatchObj.Update;
      SetLength(OuterLoop,0);
      setLength(InnerLoop,0);
    end;
  Result:=true;
end;

Re: Первые шаги программирования Delphi - AutoCad

Если со всем предыдущим разберёшся, то тогда и с этим тоже.
Не комментирую.

function DrawHatchPolygon(IAcad:IAcadApplication):boolean;
label GetVert;
var Points:array of OleVariant;
    Line:IAcadLine;
    HatchObj:IAcadHatch;
    OuterLoop:array of IAcadEntity;
begin
  Result:=false;
  with IAcad.ActiveDocument do
    begin
      HatchObj:=ModelSpace.AddHatch(0,'ANSI31',true);
      GetVert: SetLength(Points,Length(Points)+1);
               try
                 if Length(Points)=1 then
                   Points[Length(Points)-1]:=Utility.GetPoint(EmptyParam,'Укажите точку'+IntToStr(Length(Points))+': ')
                 else
                   begin
                     Points[Length(Points)-1]:=Utility.GetPoint(Points[Length(Points)-2],'Укажите точку'+IntToStr(Length(Points))+': ');
                     SetLength(OuterLoop,Length(OuterLoop)+1);
                     OuterLoop[Length(OuterLoop)-1]:=ModelSpace.AddLine(Points[Length(Points)-2],Points[Length(Points)-1]);
                   end;
               except
               end;
                 if VarIsArray(Points[Length(Points)-1]) then
                   Goto GetVert
                 else
                   SetLength(Points,Length(Points)-1);
                 if Length(Points)>2 then
                   begin
                     if not((Points[0][0]=Points[Length(Points)-1][0]) and
                            (Points[0][1]=Points[Length(Points)-1][1]) and
                            (Points[0][2]=Points[Length(Points)-1][2])) then
                              begin
                                SetLength(OuterLoop,Length(OuterLoop)+1);
                                OuterLoop[Length(OuterLoop)-1]:=ModelSpace.AddLine(Points[0],Points[Length(Points)-1]);
                              end;
                     HatchObj.AppendOuterLoop(OuterLoop);
                     HatchObj.Evaluate;
                     HatchObj.Update;
                   end;
      Result:=Length(Points)>2;
      SetLength(Points,0);
      SetLength(OuterLoop,0);
    end;
end;

Re: Первые шаги программирования Delphi - AutoCad

Спасибо Леприкон. Потихоньку разбираюсь.
Не подскажешь еще как изменять тип и толщину линии, ее цвет. Поворот текста.

Re: Первые шаги программирования Delphi - AutoCad

procedure DrawLine(IAcad:IAcadApplication);
//прорисовка линии на отдельном слое с назначением
//типа линии, толщины и цвета
var stPoint,enPoint:OleVariant;
    iLine:IAcadLine;
begin
  with IAcad.ActiveDocument do
    begin
      stPoint:=Utility.GetPoint(EmptyParam,'Укажите начальную точку: ');
      enPoint:=Utility.GetPoint(stPoint,'Укажите конечную точку: ');
      //добавляем в пространство листа линию
      iLine:=ModelSpace.AddLine(stPoint,enPoint);
      //добавляем свой слой
      IAcad.ActiveDocument.Layers.Add('My layer');
      //назначаем слой для линии
      iLine.Layer:='My layer';
      //тип линии - штрихпунктирная
      iLine.Linetype:='DASHDOT';
      //вес линии (толщина) - 2 mm, по остальным см. help VBA
      iLine.Lineweight:=acLnWt200;
      //цвет, либо значение от 0 до 256
      //(для acad 2004 и 2005 интервалы наверное больше, не работал),
      //либо константа цвета, например acGreen, и опять же см. help VBA
      iLine.Color:=acGreen;
      //применяем все параметры для линии и визуализируем её
      iLine.Update;
    end;
end;

Re: Первые шаги программирования Delphi - AutoCad

procedure RotateTextObject(IAcad:IAcadApplication);
//выбор текстового объекта для поворота
label GetEnt;
var iText:IAcadText;
    Entity:IDispatch;
    Point:OleVariant;
    Angle:double;
begin
  with IAcad.ActiveDocument do
    begin
      GetEnt: try
                Utility.GetEntity(Entity,Point,'Укажите текстовый объект: ');
              except
              end;
      if Entity<>nil then
        if (Entity as IAcadEntity).EntityType<>acText then
          begin
            Utility.Prompt('Ошибка. Выбран не текстовый объект. ');
            Goto GetEnt;
          end
        else
          begin
            (Entity as IAcadText).Highlight(true);
            try
              Point:=Utility.GetPoint(EmptyParam,'Укажите базовую точку поворота : ');
              Angle:=Utility.GetAngle(Point,'Укажите угол поворота: ');
              (Entity as IAcadText).Rotate(Point,Angle);
              (Entity as IAcadText).Update;
            except
              (Entity as IAcadText).Update;
            end;
          end;
    end;
end;

Re: Первые шаги программирования Delphi - AutoCad

Александр, посмотри ссылку
http://www.delphimaster.ru/articles/autocad/index.html
Может пригодится.

Re: Первые шаги программирования Delphi - AutoCad

Леприкон. Замечательно. Сегодня же попробую поработать с тестом и линиями. А то я тут все пытаюсь из справки AutoCad'a переводить. Ну и как уже говорил если Delphi принимает, то AutoCAD ругается.
И еще, я использую только OLEVariant. Мне кажется так удобней. Или я не прав.
Если я тебя своими просьбами еще не достал, то как ты обходишь такую проблему как в дробных числах запятые или точки. Что бы не зависить от настроек виндов. На форуме Мастеров Delphi нашел кое что, да почему то у меня так не получается как советуют. И на вопрос уже не отвечаю запись старая.
bridgemaster спасибо за ссылочку.

Re: Первые шаги программирования Delphi - AutoCad

Если я правильно понял, то проблема заключается в получении от пользователя строки с числом и перевода её в число с плавающей точкой?
Помоему, если работать с Автокадом, то уж и просить от пользователя разделитель дробной части как точку и использовать процедуры Val и Str. Они работают только с точками.
Пример на Val.

var FloatValue:extended;
     IntCode:integer;
.........
Val(SampleString,FloatValue,IntCode);

Если в строке SampleString содержится корректное число, то в переменную IntCode передастся 0, в противном случае туда передастся порядковый номер первого некорректного символа в строке. Т.е. анализируя IntCode можно решать, брать значение FloatValue или нет.
С процедурой Str я думаю всё понятно.