• Nenhum resultado encontrado

Exemplos de Programas para Tratamento de Ficheiros DXF

N/A
N/A
Protected

Academic year: 2021

Share "Exemplos de Programas para Tratamento de Ficheiros DXF"

Copied!
26
0
0

Texto

(1)

Exemplos de Programas para

Tratamento de Ficheiros DXF

João 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

(2)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 3

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

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

(3)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 5

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

1º Exemplo (BASIC)

2170 INPUT #1, g1%

2180 IF g1% <> (g% + 20) THEN g1% = -g1% ELSE INPUT #1, z

2190 RETURN

(4)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 7

O programa BASIC seguinte, constrói um ficheiro

DXF, para a representação de um polígono regular por

entidades LINE, no “layer” “0”. Uma vez que este

programa só cria a secção “ENTITIES” e não cria a

secção HEADER, os limites, extensão e “view” ficarão

desajustados do desenho, após se ter realizado o

comando DXFIN.

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%

(5)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 9

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

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

(6)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 11

O programa do 1º exemplo pode ser apresentado de uma

forma estruturada, por exemplo, para Qbasic.

Apresenta-se de seguida esta implementação já com

processamento das entidades ARC, CIRCLE e

INSERT/ATTRIB.

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 circunferência 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

(7)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 13

f = 0 ' Define variável 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 informação respeitante a ENTITIES

' Define variável de teste para o while e variável para chamada de f2000

3º Exemplo (QBASIC)

f = 0 ' Variável para o while

f1 = 0 ' Variável 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

(8)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 15

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 |

'---3º Exemplo (QBASIC)

Sub f1400(g%, g1%, x, y, z, f%, s$)

' Define variável 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

(9)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 17

'---'| subprograma 1500 |

'---'| para tratamento de arcos de circunferência ARC |

'---Sub f1500(g%, g1%, x, y, z, f%, s$)

fff = 0 'Define variável 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;

3º Exemplo (QBASIC)

fff = 1

End If

Wend

End Sub

'---'| subprograma 1600 |

'---'| para tratamento de circunferências CIRCLE |

'---Sub f1600(g%, g1%, x, y, z, f%, s$)

' Define variável 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

(10)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 19

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

3º Exemplo (QBASIC)

' Define valores que são 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; ")"

(11)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 21

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

3º Exemplo (QBASIC)

End If

Wend

End Sub

'---'| subprograma 2000 |

'| para leitura do ficheiro de um par código/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

(12)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 23

flag% = 0 ' Define variável 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 código inválido"; g%: Stop

End If

End If

Input #1, x

Input #1, g1%

If g1% <> g% + 10 Then Print "código da ordenada Y inválido"; g1%: Stop

Input #1, y

Input #1, g1%

If g1% <> g% + 20 Then g1% = -g1% Else Input #1, z

End Sub

4º Exemplo (FORTRAN)

O programa seguinte tem uma estrutura de programação

semelhante ao anterior mas, neste caso, apresenta-se na

linguagem Fortran. Processa as entidades POLYLINE e

POINT mas não a INSERT.

(13)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 25 *********************************************************************** * *

* PROGRAMA para leitura e processamento de ficheiros DXF * * *

* Salta outras SECTION e só processa a SECTION ENTITIES * * Dentro desta secção vai processar as entidades através * * de subrotinas *

* A subrotina F2000 lê do ficheiro o par Código/Valor ou * * o código 10 e as coordenadas de um ponto * * *

*********************************************************************** *

CHARACTER*12 string, finame C

WRITE (*,'(/,12X,A/)')'Programa de transcrição DXF‘ WRITE (*,'(13X,A/)') 'FEUP/DEMEGI JOF-93/12/21' C

WRITE (*,'(4x,A\)')'Nome do ficheiro sem a extensão : '

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 informação que não seja respeitante C a ENTITIES Define variável 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

(14)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 27 IF (string .EQ. 'ENTITIES') THEN

iff = 1 END IF END IF END IF END DO

C---C C---Ciclo while para processar a informação respeitante a ENTITIES C Define variável de teste para o while e para chamada de f2000 C

iff = 0 ! Variável para o while

if1 = 0 ! Variável 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

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) c WRITE (*,'(1x,a)') ' Saii‘

(15)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 29 END IF

END DO CLOSE (iopen)

STOP 'FIM DO PROGRAMA' END

********************************************************************* * *

* subprograma 1400 para Tratamento da entidade LINE * * *

* Códigos: *

* 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

4º Exemplo (FORTRAN)

CHARACTER*12 string,lay

C Define variável 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

(16)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 31 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 * * *

* Códigos: *

* 10 - Coordenadas do centro do arco de circunferência * * 8 - Layer ao qual pertence a entidade *

4º Exemplo (FORTRAN)

* 40 - Valor do raio * * 50 - Angulo do início do arco * * 51 - Angulo do fim do arco * * *

********************************************************************* *

SUBROUTINE f1500 (ig, ig1, x, y, z, iif, string,icanal)

CHARACTER*12 string,lay

C Define variável para o ciclo while

iff = 0 ! Inicializa variável 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

(17)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 33 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

RETURN

1000 FORMAT (1x,7HArc (,F9.3,2(2H ,F9.3),6H) Raio ,F9.3, . 8H Angulos ,2F9.3)

4º Exemplo (FORTRAN)

END

********************************************************************* * *

* subprograma 1600 para Tratamento da entidade CIRCLE * * *

* Códigos: *

* 10 - Coordenadas do centro da circunferência * * 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 variável para controlo do while C

(18)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 35 iff = 0

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 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

4º Exemplo (FORTRAN)

1000 FORMAT (1x,8HCircle (,F9.3,2(2H ,F9.3),7H ) Raio ,F9.3 ) END

********************************************************************* * *

* subprograma 1700 para Tratamento da entidade POLYLINE * * *

* Códigos: *

* 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 definição da POLYLINE * * *

********************************************************************* *

SUBROUTINE f1700 (ig, ig1, x, y, z, iif, string,icanal)

(19)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 37 pi = ATAN(1.0)*4

C

C Define variável 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 cabeçalho 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

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

(20)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 39 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

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

(21)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 41 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

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 orientação do centro relativamente ao ponto médio 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)

(22)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 43 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

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 orientação do centro relativa ao ponto médio c

sinal = aaa / ABS(aaa)

IF (ABS(aaa) .GT. pi) sinal = -sinal CALL ANGLIN(xold, yold, x00, y00,aacc) aacc = aacc + pi * sinal / 2

(23)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 45 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

RETURN

1000 FORMAT (1x,9HPolyline ,a8,10H no layer ,a12) 1010 FORMAT (4x,16HPrimeiro VERTEX ,3F9.3) 1020 FORMAT (13x,7HVERTEX ,3F9.3)

1030 FORMAT (9x,11HARC VERTEXc,3F9.3,5H Raio,F8.3,3H A1,F7.3, . 3H AA,F7.3)

END

4º Exemplo (FORTRAN)

********************************************************************* * *

* subprograma 1800 para Tratamento da entidade POINT * * *

* Códigos: * * 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 variável para controlo do while C

zprof = 0 iff = 0

(24)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 47 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

4º Exemplo (FORTRAN)

********************************************************************* * *

* subprograma 2000 para Leitura de Códigos e valores respectivos * * *

* icanal - Número do canal de leitura * * *

* Códigos: * * 0-9 - Variáveis de tipo string * * 10-59 - Variáveis de tipo real * * 60-79 - Variáveis de tipo inteiro * * - Outros casos particulares * * *

* Saída: * * ig - Código do valor lido * * ig1 - Código temporário *

* x,y,z- Coordenadas de um ponto ou valor real em x * * str - Valor de uma string *

(25)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 49 * *

********************************************************************* *

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

4º Exemplo (FORTRAN)

ELSE IF (ig .GE. 60 .AND. ig .LE. 79) THEN

READ (icanal,*) iff ELSE

C

C Define variável 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 código inválido ', ig STOP

(26)

@2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 51 END IF

READ (icanal,*) x READ (icanal,*) ig1 IF (ig1 .NE. (ig+10)) THEN

WRITE (*,'(a,i4)') ' Código de coord Y inválido ', 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

Referências

Documentos relacionados

2. Ausência de epífitas e trepadeiras,.. As espécies vegetais indicadoras. Possível ocorrência de epífitas e trepadeiras de pequeno porte; 5. Espécies vegetais indicadoras.

O Patrimônio Histórico, concebido aqui como uma relação entre memória social (CARLAN, 2008, p.82) e soma dos bens culturais, agrega conjuntos de informações,

Local de realização da avaliação: Centro de Aperfeiçoamento dos Profissionais da Educação - EAPE , endereço : SGAS 907 - Brasília/DF. Estamos à disposição

Discussion The present results show that, like other conditions that change brain excitability, early environmental heat exposure also enhanced CSD propagation in adult rats.. The

Responder pelo atendimento (presencial e/ou a distância) de 3 (três) horas semanais, realizados presencialmente na IES, para orientação das dúvidas de alunos em relação

da lesão na orelha interna e isto pode alterar o senso da posição da cabeça destas crianças, tornando-as mais sus- ceptíveis ao surgimento de alterações na

Uma segunda hipótese foi de que não haveria diferenças nas práticas educativas maternas e paternas aos 24 meses da criança, a exem- plo do que foi constatado no estudo

- Se o estagiário, ou alguém com contacto direto, tiver sintomas sugestivos de infeção respiratória (febre, tosse, expetoração e/ou falta de ar) NÃO DEVE frequentar