Тема: Где взять компоненты для работы с DXF?
Подскажите пожалуста компоненты для работы с dxf файлами.
Желательно бесплатные.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → Delphi → Где взять компоненты для работы с DXF?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите пожалуста компоненты для работы с 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-файл - это текстовой файл. А написать процедуру - дело программиста.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → Delphi → Где взять компоненты для работы с DXF?
Форум работает на PunBB, при поддержке Informer Technologies, Inc