Você está na página 1de 26

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

Exemplos de Programas para Tratamento de Ficheiros DXF


Joo Manuel R. S. Tavares Joaquim Oliveira Fonseca

1 Exemplo (BASIC)
O seguinte programa em BASIC l um ficheiro DXF de um desenho e extrai todas as entidades LINE (ignorando as que possam aparecer em Blocks). Este programa projecta no ecr as coordenadas das extremidades destas entidades.
1020 REM 1030 g1% = 0 1040 LINE INPUT " Nome do ficheiro DXF : "; a$ 1050 OPEN "i", 1, a$ + ".dxf" 1060 REM 1070 REM Ignora at que o inicio de uma seccao seja encontr. 1080 REM 1090 GOSUB 2000
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 2

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

1 Exemplo (BASIC)
1100 IF s$ <> "SECTION" THEN 1090 1120 GOSUB 2000 1130 REM 1140 REM salta ate que a seccao ENTITIES seja encontrada 1150 REM 1160 IF s$ <> "ENTITIES" THEN 1090 1170 REM 1180 REM percorre ate ao fim da seccao, processando "LINE" 1190 REM 1200 GOSUB 2000 1210 IF g% = 0 AND s$ = "ENDSEC" THEN 2200 1220 IF g% = 0 AND s$ = "LINE" THEN GOSUB 1400: GOTO 1210 1230 GOTO 1200 1400 REM
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 3

1 Exemplo (BASIC)
1410 REM Acumula informacao associada a LINE 1420 REM 1430 GOSUB 2000 1440 IF g% = 10 THEN x1 = x: y1 = y: z1 = z 1450 IF g% = 11 THEN x2 = x: y2 = y: z2 = z 1460 IF g% = 0 THEN PRINT "Line de ("; x1; ","; y1; ","; z1; ") a (";x2; ","; y2; ","; z2; ")" RETURN END IF 1470 GOTO 1430 2000 REM 2010 REM le codigo de grupo e valor seguinte 2020 REM Para a coordenda X, le o Y e tenta ler o Z 2030 REM
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 4

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

1 Exemplo (BASIC)
2040 IF g% < 0 THEN g% = -g1%: g1% = 0 ELSE INPUT #1, g% 2050 IF g% < 10 OR g% = 999 THEN LINE INPUT #1, s$: RETURN 2060 IF g% >= 38 AND g% <= 49 THEN INPUT #1, v: RETURN 2080 IF g% >= 50 AND g% <= 59 THEN INPUT #1, a: RETURN 2090 IF g% >= 60 AND g% <= 69 THEN INPUT #1, p%: RETURN 2100 IF g% >= 70 AND g% <= 79 THEN INPUT #1, f%: RETURN 2110 IF g% >= 210 AND g% <= 219 THEN 2130 2115 IF g% >= 1000 THEN LINE INPUT #1, t$: RETURN 2120 IF g% >= 20 THEN PRINT "Codigo de grupo invalido"; g%: STOP 2130 INPUT #1, x 2140 INPUT #1, g1% 2150 IF g1% <> (g% + 10) THEN PRINT "Codigo de coord. Y invalido"; g1%: STOP 2160 INPUT #1, y
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 5

1 Exemplo (BASIC)
2170 INPUT #1, g1% 2180 IF g1% <> (g% + 20) THEN g1% = -g1% ELSE INPUT #1, z 2190 RETURN 2200 CLOSE 1

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

2 Exemplo Basic
O programa BASIC seguinte, constri um ficheiro DXF, para a representao de um polgono regular por entidades LINE, no layer 0. Uma vez que este programa s cria a seco ENTITIES e no cria a seco HEADER, os limites, extenso e view ficaro desajustados do desenho, aps se ter realizado o comando DXFIN.

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

2 Exemplo Basic
1000 Rem 1010 Rem Gerador de Poligono 1020 Rem 1030 LINE INPUT "Nome do Ficheiro DXF : "; A$ 1040 OPEN "o", 1, A$ + ".dxf" 1050 Print #1, 0 1060 Print #1, "SECTION" 1070 Print #1, 2 1080 Print #1, "ENTITIES" 1090 PI = Atn(1) * 4 1100 INPUT "Numero de lados do Poligono : "; S% 1110 INPUT "Ponto de Inicio ( X , Y ) : "; X, Y 1120 INPUT "Comprimento do lado do Poligono: "; D 1130 A1 = (2 * PI) / S%
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 8

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

2 Exemplo Basic
1140 A = PI / 2 1150 For I% = 1 To S% 1160 Print #1, 0 1170 Print #1, "LINE" 1180 Print #1, 8 1190 Print #1, "0" 1200 Print #1, 10 1210 Print #1, X 1220 Print #1, 20 1230 Print #1, Y 1240 Print #1, 30 1250 Print #1, 0! 1260 NX = D * Cos(A) + X 1270 NY = D * Sin(A) + Y 1280 Print #1, 11
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 9

2 Exemplo Basic
1290 Print #1, NX 1300 Print #1, 21 1310 Print #1, NY 1320 Print #1, 31 1330 Print #1, 0! 1340 X = NX 1350 Y = NY 1360 A = A + A1 1370 Next I% 1380 Print #1, 0 1390 Print #1, "ENDSEC" 1400 Print #1, 0 1410 Print #1, "EOF" 1420 Close 1
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 10

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

3 Exemplo (QBASIC)
O programa do 1 exemplo pode ser apresentado de uma forma estruturada, por exemplo, para Qbasic. Apresenta-se de seguida esta implementao j com processamento das entidades ARC, CIRCLE e INSERT/ATTRIB.

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

11

3 Exemplo (QBASIC)
DECLARE SUB f1400 (g%, g1%, x, y, z, f%, s$) DECLARE SUB f1500 (g%, g1%, x, y, z, f%, s$) DECLARE SUB f1600 (g%, g1%, x, y, z, f%, s$) DECLARE SUB f1700 (g%, g1%, x, y, z, f%, s$) DECLARE SUB f2000 (g%, g1%, x, y, z, f%, s$) '---------------------------------------------------------------------------------------------'| Este programa retira as coordenadas dos extremos de segmentos | '| de recta , de arcos de circunferncia e Insert , de um ficheiro dxf | '| jof-SDI-DEMEGI 20-11-92 | '---------------------------------------------------------------------------------------------Cls g1% = 0 INPUT "nome do ficheiro: "; a$ a1$ = a$ + ".DXF" Open a1$ For Input As #1 ' Ciclo while para saltar a informao que no seja respeitante a ENTITIES
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 12

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

3 Exemplo (QBASIC)
f=0 ' Define varivel de teste para o while While f = 0 Call f2000(g%, g1%, x, y, z, f%, s$) ' PRINT s$ If g% = 0 Then If s$ = "SECTION" Then Call f2000(g%, g1%, x, y, z, f%, s$) If s$ = "ENTITIES" Then f=1 End If End If End If Wend ' Ciclo while para processar a informao respeitante a ENTITIES ' Define varivel de teste para o while e varivel para chamada de f2000
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 13

3 Exemplo (QBASIC)
f=0 ' Varivel para o while f1 = 0 ' Varivel para controlo da chamada de f2000 z=0 While f = 0 If f1 = 0 Then Call f2000(g%, g1%, x, y, z, f%, s$) f1 = 0 If g% = 0 And s$ = "ENDSEC" Then f=1 End If If g% = 0 And s$ = "LINE" Then Call f1400(g%, g1%, x, y, z, f%, s$) f1 = 1 End If If g% = 0 And s$ = "ARC" Then Call f1500(g%, g1%, x, y, z, f%, s$) f1 = 1
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 14

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

3 Exemplo (QBASIC)
End If If g% = 0 And s$ = "CIRCLE" Then Call f1600(g%, g1%, x, y, z, f%, s$) f1 = 1 End If If g% = 0 And s$ = "INSERT" Then Call f1700(g%, g1%, x, y, z, f%, s$) f1 = 1 End If Wend Close #1 End '---------------------------------------------------------------------------------------------'| subprograma 1400 | '---------------------------------------------------------------------------------------------'| para tratamento de segmentos de recta LINE | '----------------------------------------------------------------------------------------------15 @2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

3 Exemplo (QBASIC)
Sub f1400(g%, g1%, x, y, z, f%, s$) ' Define varivel para o ciclo while ff = 0 While ff = 0 Call f2000(g%, g1%, x, y, z, f%, s$) If g% = 10 Then X1 = x: Y1 = y: z1 = z If g% = 11 Then X2 = x: Y2 = y: z2 = z If g% = 0 Then Print "linha de ("; X1; ","; Y1; ","; z1; ") para ("; X2; ","; Y2; Print ","; z2; ")" ff = 1 End If Wend End Sub

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

16

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

3 Exemplo (QBASIC)
'---------------------------------------------------------------------------------------------'| subprograma 1500 | '---------------------------------------------------------------------------------------------'| para tratamento de arcos de circunferncia ARC | '---------------------------------------------------------------------------------------------Sub f1500(g%, g1%, x, y, z, f%, s$) fff = 0 'Define varivel para o ciclo while While fff = 0 Call f2000(g%, g1%, x, y, z, f%, s$) If g% = 10 Then cx = x: cy = y: cz = z If g% = 40 Then raio = x If g% = 50 Then ang1 = x If g% = 51 Then ang2 = x If g% = 0 Then Print "Centro do arco : ("; cx; ","; cy; ","; cz; ") raio:"; raio; Print " ang inicial: "; ang1; " ang final: "; ang2;
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 17

3 Exemplo (QBASIC)
fff = 1 End If Wend End Sub '---------------------------------------------------------------------------------------------'| subprograma 1600 | '---------------------------------------------------------------------------------------------'| para tratamento de circunferncias CIRCLE | '---------------------------------------------------------------------------------------------Sub f1600(g%, g1%, x, y, z, f%, s$) ' Define varivel para controlo do while fff = 0 While fff = 0 Call f2000(g%, g1%, x, y, z, f%, s$) If g% = 10 Then cx = x: cy = y: cz = z If g% = 40 Then raio = x
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 18

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

3 Exemplo (QBASIC)
If g% = 8 Then LAYER$ = s$ If g% = 0 Then Print "Centro da circunf. : ("; cx; ","; cy; ","; cz; ") raio:"; raio fff = 1 End If Wend End Sub '---------------------------------------------------------------------------------------------'| subprograma 1700 | '---------------------------------------------------------------------------------------------'| para tratamento de INSERT/Blocks | '---------------------------------------------------------------------------------------------Sub f1700(g%, g1%, x, y, z, f%, s$) flag% = 0 fff = 0 ler% = 0
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 19

3 Exemplo (QBASIC)
' Define valores que so admitidos por defeito sx = 1 sy = 1 sz = 1 r=0 While fff = 0 If ler% = 0 Then Call f2000(g%, g1%, x, y, z, f%, s$) If g% = 66 Then flag% = f% If g% = 10 Then X1 = x: Y1 = y: z1 = z If g% = 41 Then sx = x If g% = 42 Then sy = x If g% = 43 Then sz = x If g% = 50 Then r = x If (g% = 0 And flag% = 0) Or (g% = 0 And s$ = "SEQEND") Then Print "Bloco em : ("; X1; ","; Y1; ","; z1; ")" Print "nome :"; b$; " Escalas e rotao : "; sx; sy; sz; r
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 20

@2001 Joo Tavares/JOF

10

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

3 Exemplo (QBASIC)
fff = 1 ElseIf g% = 0 And flag% = 1 And s$ = "ATTRIB" Then itrib% = 0 While itrib% = 0 Call f2000(g%, g1%, x, y, z, f%, s$) If g% = 10 Then xt = x: yt = y: zt = z If g% = 1 Then at$ = s$ F g% = 2 THEN t$ = s$ If g% = 51 Then ang2 = x If g% = 0 Then Print "Atributo em : ("; xt; ","; yt; ","; zt; ")" Print "Tag : "; t$; " , Valor: "; at$ itrib% = 1 ler% = 1 End If Wend
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 21

3 Exemplo (QBASIC)
End If Wend End Sub '---------------------------------------------------------------------------------------------'| subprograma 2000 | '| para leitura do ficheiro de um par cdigo/valor | '| ou as coordenadas x, y e z de um ponto | '---------------------------------------------------------------------------------------------Sub f2000(g%, g1%, x, y, z, f%, s$) If g1% < 0 Then g% = -g1%: g1% = 0 Else Input #1, g% If g% < 10 Or g% = 999 Or g% = 100 Or g% = 102 Or g% = 105 Then Input #1, s$ Exit Sub End If If g% >= 38 And g% <= 59 Then Input #1, x: Exit Sub If g% >= 60 And g% <= 79 Then Input #1, f%: Exit Sub
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 22

@2001 Joo Tavares/JOF

11

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

3 Exemplo (QBASIC)
flag% = 0 ' Define varivel para controlo de salto If g% >= 210 And g% <= 219 Then flag% = 1 If flag% = 0 Then If g% > 230 Then Line Input #1, t$: Exit Sub ElseIf g% >= 20 Then Print "grupo de cdigo invlido"; g%: Stop End If End If Input #1, x Input #1, g1% If g1% <> g% + 10 Then Print "cdigo da ordenada Y invlido"; g1%: Stop Input #1, y Input #1, g1% If g1% <> g% + 20 Then g1% = -g1% Else Input #1, z End Sub
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 23

4 Exemplo (FORTRAN)
O programa seguinte tem uma estrutura de programao semelhante ao anterior mas, neste caso, apresenta-se na linguagem Fortran. Processa as entidades POLYLINE e POINT mas no a INSERT.

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

24

@2001 Joo Tavares/JOF

12

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
*********************************************************************** * * * PROGRAMA para leitura e processamento de ficheiros DXF * * * * Salta outras SECTION e s processa a SECTION ENTITIES * * Dentro desta seco vai processar as entidades atravs * * de subrotinas * * A subrotina F2000 l do ficheiro o par Cdigo/Valor ou * * o cdigo 10 e as coordenadas de um ponto * * * *********************************************************************** * CHARACTER*12 string, finame C WRITE (*,'(/,12X,A/)')'Programa de transcrio DXF WRITE (*,'(13X,A/)') 'FEUP/DEMEGI JOF-93/12/21' C WRITE (*,'(4x,A\)')'Nome do ficheiro sem a extenso : '
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 25

4 Exemplo (FORTRAN)
READ (*,'(a)') finame C C Define o nome do ficheiro de leitura C FINAME(9:12) = '.DXF' IOPEN = 10 OPEN (iopen,FILE=FINAME) C C Ciclo while para saltar a informao que no seja respeitante C a ENTITIES Define varivel de teste para o while C iff = 0 DO WHILE (iff .EQ. 0) CALL f2000(iG, iG1, x, y, z, iif, string,iopen) c write (*,'( 5H ppp ,i3)') ig IF (iG .EQ. 0) THEN IF (string .EQ. 'SECTION') THEN CALL f2000(iG, iG1, x, y, z, iif, string,iopen)
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 26

@2001 Joo Tavares/JOF

13

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
IF (string .EQ. 'ENTITIES') THEN iff = 1 END IF END IF END IF END DO C---------------------------------------------------------------C Ciclo while para processar a informao respeitante a ENTITIES C Define varivel de teste para o while e para chamada de f2000 C iff = 0 ! Varivel para o while if1 = 0 ! Varivel para controlo da chamada de f2000 DO WHILE (iff .EQ. 0) IF (if1 .EQ. 0) THEN CALL f2000(iG, iG1, x, y, z, iif, string,iopen) END IF if1 = 0 c WRITE(*,'(1x,a)') string
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 27

4 Exemplo (FORTRAN)
IF (ig .EQ. 0 .AND. string .EQ. 'ENDSEC') THEN iff = 1 ELSE IF (ig.EQ.0 .AND. string.EQ.'LINE') THEN CALL f1400(ig, ig1, x, y, z, iif, string, iopen) if1 = 1 ELSE IF (ig.EQ.0 .AND. string.EQ.'ARC') THEN CALL f1500(ig, ig1, x, y, z, iif, string, iopen) if1 = 1 ELSE IF (ig.EQ.0 .AND. string.EQ.'CIRCLE') THEN CALL f1600(ig, ig1, x, y, z, iif, string, iopen) if1 = 1 ELSE IF (ig.EQ.0 .AND. string.EQ.'POLYLINE') THEN CALL f1700(ig, ig1, x, y, z, iif, string, iopen) if1 = 1 ELSE IF (ig.EQ.0 .AND. string.EQ.'POINT') THEN CALL f1800(ig, ig1, x, y, z, iif, string, iopen) WRITE (*,'(1x,a)') ' Saii if1 = 1
CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 28

@2001 Joo Tavares/JOF

@2001 Joo Tavares/JOF

14

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
END IF END DO CLOSE (iopen) STOP 'FIM DO PROGRAMA' END ********************************************************************* * * * subprograma 1400 para Tratamento da entidade LINE * * * * Cdigos: * * 10 - Coordenadas da primeira extremidade * * 11 - Coordenadas da segunda extremidade * * 8 - Layer ao qual pertence a entidade * * * ********************************************************************* * SUBROUTINE f1400 (ig, ig1, x, y, z, iif, string, icanal) C
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 29

4 Exemplo (FORTRAN)
CHARACTER*12 string,lay C Define varivel para o ciclo while zprof = 0 iff = 0 DO WHILE (iff.EQ.0) CALL f2000(ig, ig1, x, y, z, iif, string,icanal) IF (ig.EQ.10) THEN x1 = x y1 = y z1 = z ELSE IF (ig.EQ.11) THEN x2 = x y2 = y z2 = z ELSE IF (ig.EQ.8) THEN lay = string ELSE IF (ig.EQ.39) THEN
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 30

@2001 Joo Tavares/JOF

15

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
zprof = x ELSE IF (ig.EQ.0) THEN WRITE (*,1000) x1, y1, z1, x2, y2, z2 iff = 1 END IF END DO C RETURN 1000 FORMAT (1x,9HLinha de(,F9.3,2(2H ,F9.3),6H)para(, . F9.3,2(2H ,F9.3),2H ) ) END ********************************************************************* * * * subprograma 1500 para Tratamento da entidade ARC * * * * Cdigos: * * 10 - Coordenadas do centro do arco de circunferncia * * 8 - Layer ao qual pertence a entidade *
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 31

4 Exemplo (FORTRAN)
* 40 - Valor do raio * * 50 - Angulo do incio do arco * * 51 - Angulo do fim do arco * * * ********************************************************************* * SUBROUTINE f1500 (ig, ig1, x, y, z, iif, string,icanal) CHARACTER*12 string,lay C Define varivel para o ciclo while iff = 0 ! Inicializa varivel para controlo do while DO WHILE (iff.EQ.0) CALL f2000(ig, ig1, x, y, z, iif, string,icanal) c WRITE (*,'(5H 1800, i4)') ig IF (ig.EQ.10) THEN cx = x cy = y
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 32

@2001 Joo Tavares/JOF

16

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
cz = z ELSE IF (ig.EQ.8) THEN lay = string ELSE IF (ig.EQ.40) THEN r=x ELSE IF (ig.EQ.50) THEN a1 = x ELSE IF (ig.EQ.51) THEN a2 = x ELSE IF (ig.EQ.0) THEN WRITE (*,1000) cx, cy, cz, r, a1, a2 iff = 1 END IF END DO C 1000 . RETURN FORMAT (1x,7HArc (,F9.3,2(2H ,F9.3),6H) Raio ,F9.3, 8H Angulos ,2F9.3)
CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 33

@2001 Joo Tavares/JOF

4 Exemplo (FORTRAN)
END ********************************************************************* * * * subprograma 1600 para Tratamento da entidade CIRCLE * * * * Cdigos: * * 10 - Coordenadas do centro da circunferncia * * 8 - Layer ao qual pertence a entidade * * 40 - Valor do raio * * * ********************************************************************* * SUBROUTINE f1600 (ig, ig1, x, y, z, iif, string,icanal) CHARACTER*12 string,lay C C Inicializa a varivel para controlo do while C
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 34

@2001 Joo Tavares/JOF

17

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
c iff = 0 DO WHILE (iff.EQ.0) CALL f2000(ig, ig1, x, y, z, iif, string,icanal) WRITE (*,'(5H 1800, i4)') ig IF (ig.EQ.10) THEN cx = x cy = y cz = z ELSE IF (ig.EQ.8) THEN lay = string ELSE IF (ig.EQ.40) THEN r=x ELSE IF (ig.EQ.0) THEN WRITE (*,1000) cx, cy, cz, r iff = 1 END IF END DO RETURN
CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 35

@2001 Joo Tavares/JOF

4 Exemplo (FORTRAN)
FORMAT (1x,8HCircle (,F9.3,2(2H ,F9.3),7H ) Raio ,F9.3 ) END ********************************************************************* * * * subprograma 1700 para Tratamento da entidade POLYLINE * * * * Cdigos: * * 10 - Coordenadas de um VERTEX * * 8 - Layer ao qual pertence a entidade * * 42 - Um quarto da tangente do ngulo do arco seguinte 0=LINE* * 70 - Flag 1=Polyline fechada ; 0=aberta * * 0 - SEQEND fim da definio da POLYLINE * * * ********************************************************************* * SUBROUTINE f1700 (ig, ig1, x, y, z, iif, string,icanal) CHARACTER*12 string,lay
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 36

1000

@2001 Joo Tavares/JOF

18

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
pi = ATAN(1.0)*4 C C Define varivel para o controlo do ciclo while C iflag = 0 C C Tratamento de uma polyline. Define valores por defeito. C iclose = 0 a0 = 0 iflag = 0 C C Vai ler o cabealho da polyline C DO WHILE (iflag .EQ. 0) CALL f2000(ig, ig1, x, y, z, iif, string, icanal) IF (ig .EQ. 70) THEN IF (iif .EQ. 1) iclose = 1
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 37

4 Exemplo (FORTRAN)
ELSE IF (ig .EQ. 8) THEN lay = string ELSE IF (ig .EQ. 0) THEN IF (iclose .EQ. 0) THEN WRITE (*,1000) ' Aberta ', lay ELSE WRITE (*,1000) ' Fechada', lay END IF iflag = 1 END IF END DO c c Vai ler o primeiro vertex na polyline c iflag = 0 DO WHILE (iflag .EQ. 0) CALL f2000(ig, ig1, x, y, z, iif, string, icanal) IF (ig .EQ. 10) THEN
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 38

@2001 Joo Tavares/JOF

19

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
x1 = x y1 = y z1 = z ELSE IF (ig .EQ. 42) THEN a0 = x ELSE IF (ig .EQ. 0) THEN xold = x1 yold = y1 zold = z1 C C guarda o primeiro ponto para o caso de ser Polyline fechada C x00 = x1 y00 = y1 z00 = z1 iflag = 1 WRITE (*,1010) x1, y1, z1 END IF
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 39

4 Exemplo (FORTRAN)
END DO c c Vai ler os VERTEX at encontrar o SEQEND c iflag = 0 a1 = 0 DO WHILE (iflag .EQ. 0) jflag = 0 a1 = 0 DO WHILE (jflag .EQ. 0) CALL f2000(ig, ig1, x, y, z, iif, string, icanal) IF (ig .EQ. 10) THEN x1 = x y1 = y z1 = z ELSE IF (ig .EQ. 42) THEN a1 = x
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 40

@2001 Joo Tavares/JOF

20

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
ELSE IF (ig .EQ. 8) THEN lay = string ELSE IF (ig .EQ. 0) THEN jflag = 1 IF (string .EQ. 'SEQEND') THEN iflag = 1 END IF c c Processa um segmento de recta entre dois VERTEX c IF (a0 .EQ. 0) THEN WRITE (*,1020) x1, y1, z1 ELSE c c Processa um arco unicamente no plano XY c dx = x1 - xold
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 41

4 Exemplo (FORTRAN)
dy = y1 - yold ddd = SQRT(dx * dx + dy * dy) / 2 aaa = 4 * ATAN(a0) raio = ABS(ddd / SIN(aaa / 2)) ddd = ABS(ddd * (COS(aaa / 2) / SIN(aaa / 2))) c c define o ngulo de orientao do centro relativamente ao ponto mdio c sinal = aaa / ABS(aaa) IF (ABS(aaa) .GT. pi) sinal = -sinal CALL ANGLIN(xold, yold, x1, y1, aacc) aacc = aacc + pi * sinal / 2 xxmm = xold + dx / 2 yymm = yold + dy / 2 xxmm = xxmm + ddd * COS(aacc) yymm = yymm + ddd * SIN(aacc) CALL ANGLIN(xxmm, yymm, xold, yold,aaa1)
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 42

@2001 Joo Tavares/JOF

21

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
WRITE (*,1030) xxmm,yymm,z1, raio, aaa1,aaa END IF a0 = a1 xold = x1 yold = y1 END IF END DO END DO c c Vai fechar POLYLINE, se for o caso presente c IF (iclose .EQ. 1) THEN c c Processa um segmento de recta c IF (a0 .EQ. 0) THEN WRITE (*,1020) x00, y00, z00
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 43

4 Exemplo (FORTRAN)
ELSE c c Processa um arco a fechar no primeiro ponto c dx = x00 - xold dy = y00 - yold ddd = SQRT(dx * dx + dy * dy) / 2 aaa = 4 * ATAN(a0) raio = ABS(ddd / SIN(aaa / 2)) ddd = ABS(ddd * (COS(aaa / 2) / SIN(aaa / 2))) c c define o ngulo de orientao do centro relativa ao ponto mdio c sinal = aaa / ABS(aaa) IF (ABS(aaa) .GT. pi) sinal = -sinal CALL ANGLIN(xold, yold, x00, y00,aacc) aacc = aacc + pi * sinal / 2 xxmm = xold + dx / 2
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 44

@2001 Joo Tavares/JOF

22

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
yymm = yold + dy / 2 xxmm = xxmm + ddd * COS(aacc) yymm = yymm + ddd * SIN(aacc) CALL ANGLIN(xxmm, yymm, xold, yold, aaa1) WRITE (*,1030) xxmm,yymm,z1, raio, aaa1,aaa END IF END IF C 1000 1010 1020 1030 . RETURN FORMAT (1x,9HPolyline ,a8,10H no layer ,a12) FORMAT (4x,16HPrimeiro VERTEX ,3F9.3) FORMAT (13x,7HVERTEX ,3F9.3) FORMAT (9x,11HARC VERTEXc,3F9.3,5H Raio,F8.3,3H A1,F7.3, 3H AA,F7.3) END

@2001 Joo Tavares/JOF

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

45

4 Exemplo (FORTRAN)
********************************************************************* * * * subprograma 1800 para Tratamento da entidade POINT * * * * Cdigos: * * 10 - Coordenadas do ponto * * 8 - Layer ao qual pertence a entidade * * * ********************************************************************* * SUBROUTINE f1800 (ig, ig1, x, y, z, iif, string,icanal) CHARACTER*12 string,lay C C Define varivel para controlo do while C zprof = 0 iff = 0
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 46

@2001 Joo Tavares/JOF

23

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
DO WHILE (iff .EQ. 0) CALL f2000(ig, ig1, x, y, z, iif, string,icanal) IF (ig .EQ. 10) THEN x1 = x y1 = y z1 = z ELSE IF (ig .EQ. 8) THEN lay = string ELSE IF (ig .EQ. 39) THEN zprof = x ELSE IF (ig .EQ. 0) THEN WRITE (*,1000) x1, y1, z1 iff = 1 END IF END DO RETURN 1000 FORMAT (1x,7HPonto (,F9.3,2(2H ,F9.3),2H ) ) END
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 47

4 Exemplo (FORTRAN)
********************************************************************* * * * subprograma 2000 para Leitura de Cdigos e valores respectivos * * * * icanal - Nmero do canal de leitura * * * * Cdigos: * * 0-9 - Variveis de tipo string * * 10-59 - Variveis de tipo real * * 60-79 - Variveis de tipo inteiro * * - Outros casos particulares * * * * Sada: * * ig - Cdigo do valor lido * * ig1 - Cdigo temporrio * * x,y,z- Coordenadas de um ponto ou valor real em x * * str - Valor de uma string * * iff - Valor inteiro *
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 48

@2001 Joo Tavares/JOF

24

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
* * ********************************************************************* * SUBROUTINE f2000 (ig, ig1, x, y, z, iff, str,icanal) CHARACTER*72 tt CHARACTER*12 str IF (ig1 .LT. 0) THEN ig = -ig1 ig1 = 0 ELSE READ (icanal,*) ig END IF IF (ig.LT.10.OR.ig.EQ.999.OR.ig.EQ.100.OR.ig.EQ.102.OR.ig.EQ.105) THEN READ (icanal,'(a)') str ELSE IF (ig .GE. 38 .AND. ig .LE. 59) THEN READ (icanal,*) x
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 49

4 Exemplo (FORTRAN)
ELSE IF (ig .GE. 60 .AND. ig .LE. 79) THEN READ (icanal,*) iff ELSE C C Define varivel para controlo de salto C iflag = 0 IF (ig .GE. 210 .AND. ig .LE. 219) THEN iflag = 1 END IF IF (iflag .EQ. 0) THEN IF (ig .GT. 230) THEN READ (icanal,'(a)') tt RETURN ELSE IF (ig .GE. 20) THEN WRITE (*,'(a,i4)') ' Grupo de cdigo invlido ', ig STOP END IF
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 50

@2001 Joo Tavares/JOF

25

CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF

FEUP/DEMEGI-SDI

4 Exemplo (FORTRAN)
END IF READ (icanal,*) x READ (icanal,*) ig1 IF (ig1 .NE. (ig+10)) THEN WRITE (*,'(a,i4)') ' Cdigo de coord Y invlido ', ig1 STOP END IF READ (icanal,*) y READ (icanal,*) ig1 IF (ig1 .NE. (ig+20)) THEN ig1 = -ig1 ELSE READ (icanal,*) z END IF END IF RETURN END
@2001 Joo Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 51

@2001 Joo Tavares/JOF

26