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
@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
@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
@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%
@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
@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
@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
@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
@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
@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; ")"
@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
@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.
@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)') finameC
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
@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') THENiff = 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‘
@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,layC 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
@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
@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
@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)
@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) THENlay = 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 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 cc 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 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)
@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)
ELSEc
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
@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
@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 *
@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) THENREAD (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
@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