Тема: Где взять компоненты для работы с DXF?

Подскажите пожалуста компоненты для работы с dxf файлами.
Желательно бесплатные.

Re: Где взять компоненты для работы с DXF?

Я себе сам написал ещё под Турбо Паскаль для
Автокада 10. Модули компилируются и в любой версии Делфи, а DXF читается любым Автокадом ввиду простоты используемых примитивов.
Модуль TP_ACAD
----------------
   Модуль TP_ACAD реализует возможность обмена графической  информацией
с графическим редактором AutoCAD (версия 10.0 и выше) посредством создания
dxf-файлов и ориентирован  на  создание  двумерных чертежей.
Переменные модуля TP_ACAD
--------------------------
    Определены следующие переменные:
  BAZX, BAZY : double=0.0  {координаты точки начала отсчета локальной системы координат};
  LAYER:string[12]='0'     {наименование текущего слоя};
  COLOR:byte=10            {номер текущего цвета графических примитивов};
  TIPLINE:string[12]='CONTINUOUS'  {текущий тип линий};
  TIPTXT:string[12]='STANDARD'  {текущий стиль текста};
  ALFTXT:double=0.0        {текущий угол поворота текстовой строки};
  BETTXT:double=0.0        {текущий угол наклона букв в тексте};
  HTXT:double=2.5          {текущая высота текста};
  BTXT:double=1.0          {текущий коэффициент соотношения ширины букв к их высоте в тексте};
Основные процедуры модуля TP_ACAD
---------------------------------
ARC        - Запись дуги.
CIRCLE        - Запись окружности.
RING        - Запись кольца заданного двумя диаметрами.
LINE        - Запись линии.
POLYLINE    - Запись признака начала полилинии.
VERTEX        - Запись вершин полилинии.
END_POLI    - Запись признака конца полилинии.
TXT        - Запись текста.
OPEN_DXF    - Открытие dxf-файла и запись признака начала dxf-файла.
CLOSE_DXF    - Запись признака конца dxf-файла и закрытие файла.
Пример программы построения квадрата 10х10 полилинией толщиной 0.5:

Program ROOT;
uses TpAcad;
begin
  OPEN_DXF('ROOT');
    POLYLINE(0.5);
      VERTEX(0,0);
      VERTEX(10,0);
      VERTEX(10,10);
      VERTEX(0,10);
      VERTEX(0,0);
    END_POLI;
  CLOSE_DXF;
end.

А вот и сам модуль:

unit Tp_Acad;
interface
const
  BAZX : single=0.0;
  BAZY : single=0.0  {координаты точки начала отсчета локальной
                            системы координат};
  LAYER:string[12]='0'     {наименование текущего слоя};
  COLOR:shortint= -1       {номер текущего цвета графических примити-
                            вов. Цвет 0 - по блоку, -1 - по слою};
  TIPLINE:string[12]='CONTINUOUS'  {текущий тип линий};
  TIPTXT:string[12]='STANDARD'  {текущий стиль текста};
  ALFTXT:single=0.0        {текущий угол поворота текстовой строки};
  BETTXT:single=0.0        {текущий угол наклона букв в тексте};
  HTXT:single=2.5          {текущая высота текста};
  BTXT:single=1.0          {текущий коэффициент соотношения ширины
                            букв к их высоте в тексте};
procedure OPEN_DXF(S:string);
procedure CLOSE_DXF;
procedure ARC(X,Y,R,FI1,FI2:single);
procedure CIRCLE(X,Y,D:single);
procedure RING(X,Y,D1,D2:single);
procedure LINE(X1,Y1,X2,Y2:single);
procedure POLYLINE(T:single;L:boolean);
procedure VERTEX(X,Y:single);
procedure END_POLI;
procedure TXT(S:string;X1,Y1:single;M:byte;X2,Y2:single);
procedure SHAPE(S:string;X,Y,K,FI:single);
implementation
const
  BK = #13#10;
var
  F : text;
FUNCTION WRR(A:single) : string;
var S : string;
begin
  Str(A:10:4,S);
  while S[1]=' ' do S:=copy(S,2,Length(S));
  while (Length(S)>2)and(S[Length(S)]='0')and(S[Pred(Length(S))]<>'.')
   do SetLength(S,length(S)-1);
  WRR:=S;
end;
procedure Ob;
begin
  writeln(F,'8',BK,layer);
  if TIPLINE<>'0' then
  writeln(F,'6',BK,TIPLINE);
  if COLOR>=0 then
  writeln(F,'62',BK,COLOR:3);
end;
procedure TX(A:word;T:string);
begin
  writeln(F,A,BK,T);
end;
procedure Nam(A:string);
begin
  writeln(F,'0',BK,A);
end;
procedure RO(A:word;R:single);
begin
  writeln(F,A,BK,WRR(R));
end;
procedure XY(X,Y:single);
begin
  writeln(F,'10',BK,WRR(BAZX+X),BK,
            '20',BK,WRR(BAZY+Y));
end;
procedure XY2(X,Y:single);
begin
  writeln(F,'11',BK,WRR(BAZX+X),BK,
            '21',BK,WRR(BAZY+Y));
end;
procedure ARC(X,Y,R,FI1,FI2:single);
begin
  Nam('ARC');
  OB;
  XY(X,Y);
  RO(40,R);
  RO(50,FI1);
  RO(51,FI2);
end;
procedure CIRCLE(X,Y,D:single);
begin
  Nam('CIRCLE');
  OB;
  XY(X,Y);
  RO(40,D);
end;
procedure CLOSE_DXF;
begin
  Nam('ENDSEC');
  Nam('EOF');
  close(F);
end;
procedure LINE(X1,Y1,X2,Y2:single);
begin
  Nam('LINE');
  Ob;
  XY(X1,Y1);
  XY2(X2,Y2);
end;
procedure OPEN_DXF(S:string);
begin
  assign(F,S+'.DXF');
  rewrite(F);
  Nam('SECTION');
  TX(2,'ENTITIES');
end;
procedure POLYLINE(T:single;L:boolean);
begin
  NAM('POLYLINE');
  OB;
  writeln(F,66,BK,1);
  if L then writeln(F,70,BK,1);
  RO(40,T);
  RO(41,T);
end;
procedure RING(X,Y,D1,D2:single);
var R:single;
begin
  if D1>D2 then
  begin
    R:=D1;
    D1:=D2;
    D2:=R;
  end;
  R:=(D1+D2)/4;
  POLYLINE((D2-D1)/2,true);
  VERTEX(X-R,Y);
  RO(42,1);
  VERTEX(X+R,Y);
  RO(42,1);
  END_POLI;
end;
procedure END_POLI;
begin
  Nam('SEQEND');
end;
procedure TXT(S:string;X1,Y1:single;M:byte;X2,Y2:single);
var H,A,B,L,LS,DX,DY : single;
begin
  H:=HTXT;
  B:=BTXT;
  A:=ALFTXT;
  if M in [1..5] then
    LS:=H*B*(Length(S)-0.3);
  if M in [1,2,4] then
  begin
    X2:=X1; Y2:=Y1;
    L:=A*Pi/180;
    DX:=LS*COS(L);
    DY:=LS*SIN(L);
    if M in [1,4] then begin DX:=DX/2; DY:=DY/2 end;
    X1:=X2-DX;
    Y1:=Y2-DY;
    if M=4 then
    begin
      DY:=H*COS(L)/2;
      DX:=H*SIN(L)/2;
      X1:=X1+DX;
      Y1:=Y1-DY;
    end;
  end;
  if M in [3,5] then
  begin
    DX:=X2-X1;
    DY:=Y2-Y1;
    L:=SQRT(SQR(DX)+SQR(DY))/LS;
    if DX=0 then A:=90 else A:=ArcTan(DY/DX)*180/Pi;
    if DX<0 then A:=A+180
    else
      if DY<0 then A:=A+360;
    if M=3 then
    begin H:=H*L; B:=B*L; end
    else B:=B*L;
  end;
  Nam('TEXT');
  OB;
  TX(1,S);
  TX(7,TIPTXT);
  XY(X1,Y1);
  if M>0 then  XY2(X2,Y2);
  RO(40,H);
  RO(41,B);
  RO(50,A);
  RO(51,BETTXT);
  writeln(F,72,BK,M);
end;
procedure VERTEX(X,Y:single);
begin
  NAM('VERTEX');
  OB;
  XY(X,Y);
end;
procedure SHAPE(S:string;X,Y,K,FI:single);
begin
  NAM('SHAPE');
  OB;
  TX(2,S);
  XY(X,Y);
  RO(40,K);
  RO(50,FI);
end;
end.

Пользуйтесь. Если надо чего-то большего - изучите структуру DXF-файла сохраняя рисунок Автокода в этом формате с нарисованным нужным вам примитивом. Ведь DXF-файл - это текстовой файл. А написать процедуру - дело программиста.

Re: Где взять компоненты для работы с DXF?

Огромное спасибо!