Разработка программного обеспеченияРефераты >> Программирование и компьютеры >> Разработка программного обеспечения
ENDIF
EXIT
ELSE
gabar[1]=0
gabar[2]=0
gabar[3]=0
hcomp:=0
dat:=POISK(st0) //поиск данных о новом элементе и занесение его
// в базу
IF VALTYPE(dat)<>'C'
APPEND BLANK
REPLACE NAME WITH st0
REPLACE SHIR WITH gabar[1]/koef
REPLACE DLIN WITH gabar[2]/koef
REPLACE VIS WITH hcomp/koef
REPLACE X WITH dat[1]/koef
REPLACE Y WITH dat[2]/koef
gabar[1]:=SHIR*koef
gabar[2]:=DLIN*koef
IF compon[nn,3]=0
compon[nn,3]=Vis*koef
ENDIF
ELSE
EXIT
ENDIF
ENDIF
ENDDO
ROT(X*koef,Y*koef,gabar[1],gabar[2],nn)
RETURN gabar
//****************************************************
FUNCTION ROT(a,b,shc,dlc,L) //функция учитывающая поворот эле мента относительно оси и произво дящая соответствующий пересчет его координат
IF compon[L,6]=0 //учет поворота элемента
IF compon[L,2]='bot'
compon[L,4]=compon[L,4]+shc-a
compon[L,5]=compon[L,5]-b
ELSE
compon[L,4]=compon[L,4]+a
compon[L,5]=compon[L,5]-b
ENDIF
compon[L,7]=shc
compon[L,8]=dlc
ELSEIF compon[L,6]=1
IF compon[L,2]='bot'
compon[L,4]=compon[L,4]+b
compon[L,5]=compon[L,5]-a
ELSE
compon[L,4]=compon[L,4]+b
compon[L,5]=compon[L,5]+a-shc
ENDIF
compon[L,7]=dlc
compon[L,8]=shc
ELSEIF compon[L,6]=2
IF compon[L,2]='bot'
compon[L,4]=compon[L,4]+a
compon[L,5]=compon[L,5]+b-dlc
ELSE
compon[L,4]=compon[L,4]-a+shc
compon[L,5]=compon[L,5]+b-dlc
ENDIF
compon[L,7]=shc
compon[L,8]=dlc
ELSEIF compon[L,6]=3
IF compon[L,2]='bot'
compon[L,4]=compon[L,4]-b+dlc
compon[L,5]=compon[L,5]+a-shc
ELSE
compon[L,4]=compon[L,4]-b+dlc
compon[L,5]=compon[L,5]-a
ENDIF
compon[L,7]=dlc
compon[L,8]=shc
ENDIF
RETURN
//****************************************************
//Функция которая последовательно считывает pdf- файл кусками по 65000 байт (т.е. после анализа 1-го куска в 65000 байт считывается следующий и т.д.
FUNCTION READF() //чтение куска файла 65000 с текущей позиции
PRIVATE bait:=CHR(10),seek,contr,sost:=' ',buf
bufer=SPACE(65001)
contr:=FREAD(desc,@bufer,65000)
IF contr<65000
sost='end'
IF lastseek<65000
PROCENT()
ENDIF
ELSE
sost='noend'
buf=RIGHT(bufer,1000)
seek=64000+RAT(bait,buf)
bufer:=LEFT(bufer,seek)
lastseek:=FSEEK(desc,-(65000-seek),1)
PROCENT()
ENDIF
RETURN sost
//****************************************************
//Функция построчно анализирующая pdf- файл и берущая из него по определенным критериям названия и координаиы элементов
FUNCTION SEAR()
PRIVATE filesost,c1,c2,c3,c4,namecomp,ends:=0
@ 5,0 SAY 'Анализ файла:'
SETPOS(8,0)
FOR contin:=1 TO 2 //пойск контура платы
contin=2
filesost=READF() //загрузить первые 65000 pdf- файла
IF AT('COMP_DEF ',bufer)<>0
ends=1
ENDIF
c0=AT('{ANNOTATE',bufer)
IF c0<>0
bufer:=LTRIM(RIGHT(bufer,LEN(bufer)-(c0+5)))
FOR kol=1 TO 2 //поиск между ANNOTATE и COMP_DEF
kol=2
c0=AT('[Ly "KONTUR"]',bufer)
IF c0<>0
bufer:=LTRIM(RIGHT(bufer,LEN(bufer)-(c0+5)))
FOR kol1=1 TO 2
kol1=2
c0:=AT('{R ',bufer)
ver:=AT('[Ly "',bufer)
IF ver=0
ver:=66000
ENDIF
IF c0=0
IF AT('COMP_DEF ',bufer)<>0
ends=1
ELSEIF AT('Ly "',bufer)<>0
ends=1
ELSE
IF filesost<>'end'
filesost=READF()
kol1=1
ENDIF
ENDIF
ELSEIF c0>ver
ends=1
ELSE
kont=ALLTRIM(STROKA(c0+3))
ends=1
verkont=1 //переменная наличия контура
DISPOUT('Найден контур платы','b/gb')
koll:=SKONT(kont)
FOR kk:=1 TO LEN(koll)
AADD(kontur,({nil}))
kontur[kk]=koll[kk]
NEXT
ENDIF
NEXT
ELSE
c1=AT('{COMP_DEF ',bufer)
IF c1<>0
ends=1
ELSEIF ends=1
ends=1
ELSE
IF filesost<>'end'
filesost=READF()
kol=1
ENDIF
ENDIF
ENDIF
NEXT
ENDIF
IF filesost='end'
IF AT('{COMP_DEF ',bufer)=0
ends=1
ENDIF
ELSEIF ends=0
contin=1
ENDIF
NEXT
IF verkont=0
DISPOUT('Контур платы не обнаружен','r/gb')
ENDIF
private endc2,contin,powtor,slovo
namecomp:='not found'
c1=AT('{COMP_DEF ',bufer)
IF c1<>0 //поиск имени prt в bufer
slovo:=STROKA(c1)
namecomp=ALLTRIM(SUBSTR(slovo,11,15))
bufer:=LTRIM(RIGHT(bufer,LEN(bufer)-(c1+11)))
ENDIF
FOR contin:=1 TO 2
IF SHELK()=1
FINDCOMP()
ENDIF
c1=AT('{COMP_DEF ',bufer)
IF c1<>0 //поиск имени prt в оставшемся buferе
slovo=STROKA(c1)
namecomp=ALLTRIM(SUBSTR(slovo,11,15))
bufer:=LTRIM(RIGHT(bufer,LEN(bufer)-(c1+10)))
contin=1
ELSE
IF filesost<>'end'
filesost=READF()
contin=1
ELSE
contin=2
ENDIF
ENDIF
NEXT
PROCENT()
setpos(maxrow(),20)
dispout('OK. Анализ файла завершен.','g+/gb')
inkey(3)
tmz:=INSERTCOMP()
RETURN tmz
//****************************************************
FUNCTION STROKA(nomer) //выдел.подстроки из переменной //bufer,с указанной позиции (nomer)
PRIVATE txt,pos //до конца строки (символа CHR10)
txt:=RIGHT(bufer,LEN(bufer)+1-nomer)
pos=AT(CHR(10),txt)
txt=ALLTRIM(LEFT(txt,pos-2))
RETURN txt
//****************************************************
FUNCTION PROCENT() //функция построения процентной линии
PRIVATE laststr,laststolb
laststr:=ROW()
laststolb:=COL()
pnow=pnow+1
oldcol:=SETCOLOR()
IF pnow=1
str:=5
stolb:=15
parts:=ROUND(filelen/65000,0)
IF parts<2
parts=parts+1
ENDIF
procen:=ROUND(90/parts,0)
znak:=ROUND(45/parts,0)
stcolor:=setcolor('R+/gb')
mstolb:=stolb+49
WHILE stolb<mstolb
SETPOS(str,stolb)
??'|'
stolb=stolb+5
ENDDO
SETPOS(str,mstolb)
??'|'
stolb=15
setcolor(stcolor)
ENDIF
IF pnow=parts
znak:=60-stolb
ENDIF
IF pnow-1=parts
znak:=5
filelen=65000
pnow=0
ENDIF
SETPOS(str,stolb)
FOR k:=1 TO znak
IF stolb>65
EXIT
ENDIF
SETCOLOR('b/gb')
??'--'
stolb=stolb+1
SETPOS(4,57)
SETCOLOR('B/gb')
??((stolb-15)*2)
??'% '
SETPOS(str,stolb)
NEXT
SETPOS(laststr,laststolb)
SETCOLOR(oldcol)
RETURN
//****************************************************
FUNCTION SKONT(st0) //выделение координат контура (если он //обнаружен)
PRIVATE rez[0]
nom:=0
FOR k=1 to 2
p1:=AT(' ',st0)
IF p1=0
p1=AT('}',st0)