Exemplos de Programas para Tratamento de Ficheiros DXF. João Manuel R. S. Tavares Joaquim Oliveira Fonseca

Documentos relacionados
Exemplos de Programas para Tratamento de Ficheiros DXF

CFAC: Programação em FORTRAN - V

CFAC: Exemplos de Programas em FORTRAN

AutoLISP -VII Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos

Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos

AutoLISP Programas Exemplo

Programação estruturada no Fortran 90-3

Exemplos de Programas em FORTRAN. João Manuel R. S. Tavares Joaquim O. Fonseca

Aplicações de Programação CNC/ISO com Microcomputador. João Manuel R. S. Tavares Joaquim Oliveira Fonseca

AutoLISP Programas Exemplo. João Manuel R. S. Tavares Joaquim Oliveira Fonseca

1º Exemplo - Rectângulo

Resumo. 1- Introdução

$ 5HTXHULPHQWRVPtQLPRVSDUDFULDUXPDUTXLYR';)GHXP PRGHOR'

CFAC: Introdução ao AutoCAD - V. Capitulo V: Construções geométricas

Objectivos. Introdução à programação Macros em Microsoft Excel Introdução ao Visual Basic para Aplicações (VBA)

Elementos básicos das linguagens de programação

Programação em FORTRAN V. João Manuel R. S. Tavares

Introdução ao AutoCAD Capitulo V: Construções geométricas. João Manuel R. S. Tavares Joaquim O. Fonseca

UNIVERSIDADE ESTADUAL PAULISTA JÚLIO DE MESQUITA FILHO

CFAC: Programação em FORTRAN - I

Resumo. 1- Introdução. 2- Matrizes e Arquivos Vetores e Matrizes

Programação em FORTRAN - I. João Manuel R. S. Tavares

CFAC: Introdução ao AutoCAD - I. Capitulo I: Iniciação ao AutoCAD

Visual Basic. VII Ficheiros Sequenciais. CFAC Concepção e Fabrico Assistidos por Computador João Manuel R. S. Tavares

CFAC: Visual Basic: VII - Ficheiros Sequenciais. VII Ficheiros Sequenciais

CFAC: Introdução ao AutoCAD - I. Capitulo I: Iniciação ao AutoCAD

Correção do 1º Exame de INTRODUÇÃO À PROGRAMAÇÃO Licenciatura em Engenharia Mecânica 30 de Junho de 2006, 2º Semestre

Módulo 1a: Introdução ao Visual Basic for Applications (VBA)

IMPLEMENTAÇÃO D0 DESENHO AUTOMÁTICO DE CILINDROS DE DUPLO EFEITO AUTOLISP CONCEPÇÃO E FABRICO ASSISTIDOS POR COMPUTADOR ANO LECTIVO

Introdução ao SolidWorks (VI): Elementos de Rotação e de Sweep

Ferramentas de Desenvolvimento Rápido de Jogos 3D [DarkBasicPro] Prof. Osório Pag.: 1

4 - APLICAÇÕES DE PROGRAMAÇÃO CNC/ISO COM MICROCOMPUTADOR

Introdução ao Fortran 90. Aula 3

Visual Basic. V - Repetição. CFAC Concepção e Fabrico Assistidos por Computador João Manuel R. S. Tavares

Modelação Geométrica e Visualização de Edifícios 2007/2008

Introdução à Computação - FORTRAN

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

V - Repetição. CFAC Concepção e Fabrico Assistidos por Computador. 2) Elementos de uma estrutura de repetição;

Linguagem Pascal. Prof. Sérgio Rodrigues. É a descrição, de forma lógica, dos passos a serem executados no cumprimento de determinada tarefa;

Introdução à Programação Aula prática Nº O número de bactérias numa cultura pode ser estimado pela expressão:

Departamento de Matemática Universidade de Coimbra

Faculdade de Engenharia da Universidade do Porto Concepção e Fabrico Assistido por Computador. Relatório

Sintaxe do Pascal Simplificado Estendido de 12 novas construções em Notação EBNF (BNF estendida)

UNIVERSIDADE ESTADUAL PAULISTA. Apostila Pascal Ed Prof. Dr. Galeno José de Sena DMA/FEG CAPÍTULO 8

Prof: Heni Mirna Cruz Santos

Rotação e Interpolação

Programação. MEAer e LEE. Manipulação de ficheiros de texto. Bertinho Andrade da Costa. Instituto Superior Técnico. 2010/2011 1º Semestre

Errata* do livro Programação em Python Fundamentos e Resolução de Problemas

Introdução ao Fortran 90-4

Comandos básicos do AutoCAD

Sumário. Ficheiros. Ficheiros

Comandos e Construtos de Controle de Fluxo

Capítulo 12. SUB-ROTINAS

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 31. Instituto de C

Introdução ao Fortran 90-3

Teoria da Computação e Algoritmos. Introdução à Linguagem Pascal. ALGORITMO <Nome do algoritmo>; <definições>; INÍCIO <Comandos>; FIM.

1 Da aula teórica ao Java

Resolução do exame de Computadores e Programação da licenciatura em Engenharia Biomédica

Árvores B (Parte III)

Introdução ao AutoCAD Capitulo IV: Comandos de modificação

Apostila de Fortran. É uma pseudo-linguagem a qual oferece recursos para que o programador possa codificar e testar os seus algoritmos.

Compiladores. Análise Léxica

Programação de Computadores III

Introdução ao Fortran 90-7

Informática I. Aula 19. Aula 19-31/10/2007 1

1 Expressões, valores e tipos 1. 2 Variáveis e atribuições 5. cálculo de expressões segue a estrutura de parênteses e as prioridades dos operadores

In I t n rto r d o u d ç u ão ã o à à Com o pu p t u a t ç a ão ã Linguagem Fortran! " 1

PROGRAMAÇÃO E SISTEMAS DE INFORMAÇÃO 11ºANO

Testes Baseados na Implementação. (fluxo de controle) Baseado em notas de aula da profa. Eliane Martins

Programação de Computadores III

Site:

Aplicações de Programação CNC/ISO com Microcomputador

Visual Basic. VI - Arrays. CFAC Concepção e Fabrico Assistidos por Computador João Manuel R. S. Tavares

Programação de Computadores III

Introdução ao SolidWorks (VI): Elementos de Rotação e de Sweep. João Manuel R. S. Tavares Joaquim Oliveira Fonseca

MSXDOS GUIA DE CONSULTA RÁPIDA. Escrito e editorado por: Edison Antonio Pires de Moraes eapmoraes@msxall.com

Programação de Computadores:

Fabricação de Moldes 2011/ a 7.5. Novo BOTÃO no NX4. FEUP/DEMec/SDI 1

1.2 OPERAÇÕES BÁSICAS EM ALGORITMOS E PROGRAMAS 18

Linguagens de Programação Conceitos e Técnicas. Amarrações

Licenciatura em Gestão e Engenharia Industrial CFAC

DESENHO TÉCNICO E ARQUITETÔNICO

Pascal. -Cabeçalho do programa. - label - const - type - var - procedure - function. - integer - real - byte - boolean - char - string

PROGRAMAÇÃO DE COMPUTADORES

Nesta aula serão apresentados alguns comandos de condição, repetição e gráficos.

Programação em FORTRAN III. João Manuel R. S. Tavares

Exercícios de Programação e Computação para Arquitectura. António Menezes Leitão

Linguagem de programação: Pascal

TEM VÁRIOS ESTADOS: 0V,0.1V,3V,3.3V,4V,5V,10V, ETC.

Figura 7.2 Sentido de construção dos arcos de circunferência

SQL Procedural. Josino Rodrigues Neto

Introdução ao FORTRAN 90. Aula 4

Transformações Geométricas

CFAC: Visual Basic: IV - Decisões

Hello World. Linguagem C. Tipos de Dados. Palavras Reservadas. Operadores Aritméticos. Pré e pós incremento e pré e pós decremento

Transcrição:

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

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

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

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

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 8

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

3º Exemplo (QBASIC) 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. @2001 João 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 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 ' Ciclo while para saltar a informação que não seja respeitante a ENTITIES @2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 12

3º Exemplo (QBASIC) 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 @2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 13

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 14

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

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 16

3º Exemplo (QBASIC) '---------------------------------------------------------------------------------------------- ' 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; @2001 João 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 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 18

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

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; ")" Print "nome :"; b$; " Escalas e rotação : "; sx; sy; sz; r @2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 20

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

3º Exemplo (QBASIC) 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 @2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 23

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 24

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

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 CALL f2000(ig, ig1, x, y, z, iif, string,iopen) @2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 26

IF (string.eq. 'ENTITIES') THEN iff = 1 END IF END IF END IF END DO 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 @2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 27

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

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

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 ELSE IF (ig.eq.39) THEN @2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 30

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

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

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

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 34

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

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) CHARACTER*12 string,lay @2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 36

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

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

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

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

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

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) CALL ANGLIN(xxmm, yymm, xold, yold,aaa1) @2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 42

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

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 xxmm = xold + dx / 2 @2001 João Tavares/JOF CFAC: Exemplos de Programas para Tratamento de Ficheiros DXF 44

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

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

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

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

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

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

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