Страница 1 из 1

Rabota s *.dxf fileami

Добавлено: 13 сен 2004, 19:48
spec
Parni, kto rabotal s *.dxf fileami.
Mne nuzhno napist" programmu chitayushchuyu, i risuyushchuyu *.dxf.
Konkretno, mne nuzhen SPline.
Zhelatel"no na MFC.
Ili Khotya bi skzhite, chto za matematicheskaya funkciya u SPLine...

Добавлено: 14 сен 2004, 03:19
Hup
Можно по русски(хотя бы с ошибками) и поподробнее. :(

Добавлено: 17 сен 2004, 21:23
severin
Работал я с dxf и немало... Только давно уже.

Вот, например, простенькая программа на C, которая делает из текстокого файла с координатами точек dxf-файл.
Извините, если в ней что-то непонятно, задача была специфическая, а искать что-то более подходящее сейчас некогда. А вообще формат dxf - довольно прозрачный, надо только сделать несколько небольших dxf-файлов без заголовка, с одними примитивами, и сразу поймешь, как он устроен.

А сплайн - это линия вдоль упругого стержня, выгнутого по точкам. Описать ее уравнением нельзя, это решается численно.

#include <stdio.h>

void main(int argv, char **argc)
{
FILE *inp, *out;
int r,i,j,color,kh,ix; double x, y, z, xo, yo, zo, dy, dz;
/* np - число точек в полилинии */
int np;
char name[256];

inp = fopen(argc[1],"rt");

i=0; while (argc[1]!='.') {name=argc[1]; i++;}
name='.'; i++; name='d'; i++; name='x'; i++; name='f'; i++; name=0;

out = fopen(name,"wt");

/* Пишем заголовок файла */
fprintf(out," 0\nSECTION\n 2\nENTITIES\n");
color=1; kh=1;

do {
r=fscanf(inp,"%d",&np);

if (r==1)
{

for (i=0; i<np; i++)
{
if (!kh) {yo=y; zo=z;}

fscanf(inp,"%d %lg %lg %lg",&j,&x,&y,&z);

if (kh) {yo=y; zo=z;}
else
{
dy=y-yo; dz=z-zo;
if ( (dy*dy+dz*dz)>40000. )
{
kh=1;
fprintf(out," 0\nSEQEND\n 8\n0\n");
}
}

if (kh)
{
/* Заголовок полилинии */
ix=(int)x;
if (ix>=10000) fprintf(out," 0\nPOLYLINE\n 8\n%d\n",ix);
if (ix>=1000 && ix<10000) fprintf(out," 0\nPOLYLINE\n 8\n0%d\n",ix);
if (ix>=100 && ix<1000) fprintf(out," 0\nPOLYLINE\n 8\n00%d\n",ix);
if (ix>=10 && ix<100) fprintf(out," 0\nPOLYLINE\n 8\n000%d\n",ix);
if (ix>=0 && ix<10) fprintf(out," 0\nPOLYLINE\n 8\n0000%d\n",ix);
if (ix>-10 && ix<0) fprintf(out," 0\nPOLYLINE\n 8\n-0000%d\n",-ix);
if (ix>-100 && ix<=-10) fprintf(out," 0\nPOLYLINE\n 8\n-000%d\n",-ix);
if (ix>-1000 && ix<=-100) fprintf(out," 0\nPOLYLINE\n 8\n-00%d\n",-ix);
if (ix<=-1000) fprintf(out," 0\nPOLYLINE\n 8\n-0%d\n",-ix);
color=(int)((x+1190.)/21240.*12.)+1;
if (color<10) fprintf(out,"62\n %d0\n66\n 1\n",color);
else fprintf(out,"62\n %d0\n66\n 1\n",color);
fprintf(out," 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n 8\n");
kh=0;
}

fprintf(out," 0\nVERTEX\n 8\n0\n");
fprintf(out," 10\n%lf\n20\n%lf\n30\n%lf\n 70\n 32\n",x,z,y);
}

xo=x; kh=1;
fprintf(out," 0\nSEQEND\n 8\n0\n");
}

} while (r!=EOF);

fprintf(out," 0\nENDSEC\n 0\nEOF\n");

fclose(inp);
fclose(out);

}