Смекни!
smekni.com

Разработка программного обеспечения (стр. 6 из 9)

st:=MENU (mas,13,st)

IF st=1

@ 9,0 CLEAR TO maxrow(),maxcol()

set cursor off

TO2D(kolkomp) //пересчет точек привязки в трехмерные координаты

PRINTINFO()

ERRF()

inkey(6)

cls

ELSEIF st=2

@ 9,0 CLEAR TO maxrow(),maxcol()

set cursor off

TO3D(kolkomp) //пересчет точек привязки в трехмерные

координаты

PRINTINFO()

ERRF()

inkey(6)

cls

ELSEIF st=3

set cursor on

read

exit:=alltrim(exittmp)

set cursor off

ELSEIF st=0

st=4

ENDIF

ENDDO

RETURN

//*****************************************************************

FUNCTION INP(dl,pods,typ) //вспомогательная функция для ввода

данных с клавиатуры

oldcol:=col()

oldrow:=row()

er:=space(maxcol()-col())

IF typ<>'n'

FOR L=1 TO 2

ACCEPT pods TO tmp

IF LEN(tmp)<1

L=1

@ oldrow+1,oldcol SAY er

SETPOS(oldrow,oldcol)

ELSEIF LEN(tmp)>dl

L=1

@ oldrow+1,oldcol SAY er

SETPOS(oldrow,oldcol)

ELSE

tmp=ALLTRIM(tmp)

L=2

ENDIF

NEXT

ELSEIF typ='n'

FOR L=1 TO 2

ACCEPT pods TO tmp

IF LEN(tmp)<1

L=1

@ oldrow+1,oldcol SAY er

SETPOS(oldrow,oldcol)

ELSEIF VAL(tmp)=0

L=1

@ oldrow+1,oldcol SAY er

SETPOS(oldrow,oldcol)

ELSE

L=2

ENDIF

NEXT

ENDIF

RETURN tmp

//*******печать информации о найденных элементах******

FUNCTION PRINTINFO() //функция, печатающая на экране результатысоздания TFLEX-файлов и результаты анализа

SCROLL(10,0,MAXROW(),MAXCOL(),4)

SETPOS(MAXROW()-4,0)

?'ДЛИНА PDF-ФАЙЛА:',prflen,' байт'

?'КОЛИЧЕСТВО НАЙДЕННЫХ ЭЛЕМЕНТОВ:',ALLTRIM(STR(kolkomp))

?'ЭЛЕМЕНТОВ НА ВЕРХНЕЙ СТОРОНЕ:',ALLTRIM(STR(koltop))

?'ЭЛЕМЕНТОВ НА НИЖНЕЙ СТОРОНЕ:',ALLTRIM(STR(kolbot))

RETURN

//*************************************************

FUNCTION ERRF() //функция, создающая файл ERROR.TXT и записы//вающая туда имена компонентов, на которые не //найдены габаритные размеры

IF len(errfile)<>0

desk:=fcreate('error.txt')

fwrite(desk,"Не найдены файлы:"+chr(13)+chr(10))

for k:=1 to len(errfile)

fwrite(desk,errfile[k])

fwrite(desk,chr(13)+chr(10))

next

fclose(desk)

ENDIF

RETURN

//**************************************************

FUNCTION TO3D(st0) // функция, пересчитывающая координаты и

габаритные размеры элементов в трехмерную модель

cos30:=0.5*SQRT(3)

cos60:=0.5

FOR L:=1 TO st0

compon[l,4]=compon[l,4]+dx

compon[l,5]=compon[l,5]+dy

compon[l,4]=compon[l,4]+cos60*compon[l,5] //пересчет координат в //3D

compon[l,5]=compon[l,5]*cos30

IF compon[L,2]='bot'

compon[L,5]=compon[L,5]-compon[L,3] //для эл. нижней стороны

ENDIF

NEXT

maxy:=kontur[4]

maxx:=kontur[3]

tx[5])*(maxy-tx[5])))<(((maxx-tx[4])*(maxx-tx[4]))+((maxy-tx[5])*(maxy-ty[5])))})

tx[4])+kwad(tx[5]))>(kwad(maxx-tx[4])+kwad(tx[5]))})

ASORT(compon,,,{|tx,ty| (tx[4]*tx[4]+(maxy*2-tx[5])*(maxy*2-tx[5]))<(ty[4]*ty[4]+(maxy*2-ty[5])*(maxy*2-ty[5]))})

//*******СОЗДАНИЕ ФАЙЛОВ-ФРАГМЕНТОВ************

IF kolkomp>0

SCROLL(10,0,MAXROW(),MAXCOL(),1)

SETPOS(MAXROW()-1,0)

?'Идет создание файла элементов на нижней стороне:'

nn:=FILECR3D(kolkomp,'bot','bot')

??nn

SCROLL(10,0,MAXROW(),MAXCOL(),1)

SETPOS(MAXROW()-1,0)

?'Идет создание файла элементов на верхней стороне:'

nn:=FILECR3D(kolkomp,'top','top')

??nn

PLATCR() //создание файла контура платы

ENDIF

FOR L:=1 TO st0 //обратный пересчет координат для приведения

// массива габаритов в исходный вид

IF compon[L,2]='bot'

compon[L,5]=compon[L,5]+compon[L,3] //для эл. нижней стороны

ENDIF

compon[l,5]=compon[l,5]/cos30

compon[l,4]=compon[l,4]-cos60*compon[l,5]

compon[l,5]=compon[l,5]-dy

compon[l,4]=compon[l,4]-dx

NEXT

RETURN

//****************************************************

FUNCTION TO2D(st0)// функция, пересчитывающая координаты и //габаритные размеры элементов в двумерную //модель

wzapis:=wind(3,4,maxrow()+2,maxcol()+3,"Двумерная компоновка",5)

mas:={{'Спереди','Сзади ','Слева','Справа'},{"Создание файла вида спереди","Создание файла вида сзади","Создание файла вида слева","Создание файла вида справа"}}

xkor:=4

strel:={chr(24),chr(25),chr(26),chr(27)} //Прорисовка видов плат

col2d:=setcolor('r+/bg')

For k=1 To 4

setcolor('r/bg')

@ 5,xkor to 5+2,xkor+10

setcolor('n/bg')

@ 5+3,xkor-1 say '0,0'

xkor=xkor+16

next

setcolor('g+/bg')

@ 8,9 say strel[1]

@ 4,25 say strel[2]

@ 6,35 say strel[3]

@ 6,63 say strel[4]

setcolor(col2d)

st:=MENU (mas,13,st)

IF st=1

ASORT(compon,,,{|x,y| x[5]>y[5]})

FOR L:=1 TO st0

compon[l,4]=compon[l,4]+dx

// compon[l,5]=0

// compon[l,8]=0

IF compon[L,2]='bot'

compon[L,5]=compon[L,5]-compon[L,3]-tlplat //для эл. нижней

стороны

ENDIF

NEXT

tkont2:=kontur[2]

tkont4:=kontur[4]

kontur[2]=-10

kontur[4]=kontur[2]

//*******СОЗДАНИЕ ФАЙЛОВ-ФРАГМЕНТОВ************

IF kolkomp>0

SETPOS(MAXROW()-1,0)

?'Идет создание файла элементов на нижней стороне:'

dlin:=ALLTRIM(STR(kontur[3]-kontur[1]))

nn:=FILECR2D(kolkomp,'top',dlin)

??nn

ENDIF

FOR L:=1 TO st0 //обратный пересчет координат для приведения

// массива габаритов в исходный вид

IF compon[L,2]='bot'

compon[L,5]=compon[L,5]+compon[L,3]+tlplat //для эл. нижней

стороны

ENDIF

compon[l,4]=compon[l,4]-dx

NEXT

kontur[2]=tkont2

kontur[4]=tkont4

ELSEIF st=2

TO2DZAD(st0)

ELSEIF st=3

ELSEIF st=4

ENDIF

winclose()

RETURN

//****************************************************

FUNCTION AUTOKONTUR(L1) // выделение контура платы по

максимуму

minY:=compon[1,5]

maxY:=minY

minX:=compon[1,4]

maxX:=minX

IF verkont=0

PUBLIC kontur[4]

FOR L:=2 TO L1

IF compon[L,4]>maxX

maxX:=compon[L,4]

ELSEIF compon[L,4]<minX

minX:=compon[L,4]

ENDIF

IF compon[L,5]>maxY

maxY:=compon[L,5]

ELSEIF compon[L,5]<minY

minY:=compon[L,5]

ENDIF

NEXT

kontur[1]=(minX-30)

kontur[2]=(minY-30)

kontur[3]=(maxX+30)

kontur[4]=(maxY+30)

ENDIF

dx:=(0-kontur[1]) //вычисление поправки на ноль

dy:=(0-kontur[2])

kontur[1]=kontur[1]+dx //пересчет координат контура в 0 0

kontur[3]=kontur[3]+dx

kontur[2]=kontur[2]+dy

kontur[4]=kontur[4]+dy

RETURN

//****************************************************

FUNCTION PLATCR() создание файла контура платы в формате TFLEX

PRIVATE fil,st1,st2,st3,st4,st5

SCROLL(10,0,MAXROW(),MAXCOL(),1)

SETPOS(MAXROW()-1,0)

?'Идет создание файла контура платы.'

cos30:=0.5*SQRT(3)

fil=FCREATE(exit+'plt'+'.frg')

st1:='plata '+attr+' 1 1'+CHR(13)+CHR(10)

dlin:=ALLTRIM(STR(kontur[3]-kontur[1]))

shir:=ALLTRIM(STR(kontur[4]-kontur[2]))

st3:='x1='+ALLTRIM(str(kontur[1]))+CHR(13)+CHR(10)

st2:='y1='+ALLTRIM(STR(kontur[2]))+CHR(13)+CHR(10)

st4:='sh1='+shir+CHR(13)+CHR(10)

st5:='dl1='+dlin+CHR(13)+CHR(10)

st1:=st1+st2+st3+st4+st5+'+'+CHR(13)+CHR(10)

err:=FWRITE(fil,st1)

IF err<>LEN(st1)

?'Ошибка при записи файла'

ELSE

??' OK'

ENDIF

FCLOSE(fil)

RETURN

///***************************************************

FUNCTION CREATDBF(nom2)//функция создающая пустую базу данных

PUBLIC nfill1:='COMP', nfill2:='SIDE', nfill3:='attr', nfill4:="X",nfill5:="Y"

PRIVATE struct [5,4],nom

struct[1,1]=nfill1

struct[1,2]="C"

struct[1,3]=18

struct[1,4]=0

struct[2,1]=nfill2

struct[2,2]="C"

struct[2,3]=5

struct[2,4]=0

struct[3,1]=nfill3

struct[3,2]="N"

struct[3,3]=10

struct[3,4]=0

struct[4,1]=nfill4

struct[4,2]="N"

struct[4,3]=10

struct[4,4]=5

struct[5,1]=nfill5

struct[5,2]="N"

struct[5,3]=10

struct[5,4]=5

parametr:=exit

DBCREATE(parametr,struct) //создание базы данных

USE

USE &parametr //открытие б.д.

FOR nom=1 TO nom2

APPEND BLANK

REPLACE &nfill1 WITH compon[nom,1]

REPLACE &nfill2 WITH compon[nom,2]

REPLACE &nfill3 WITH compon[nom,3]

REPLACE &nfill4 WITH compon[nom,4]

REPLACE &nfill5 WITH compon[nom,5]

NEXT

USE //закрытие б.д.

RETURN

//***************************************************************

FUNCTION TO2DZAD(st0) // функция, пересчитывающая координаты и габаритные размеры элементов в

двумерную модель вида сзади

dlin:=ALLTRIM(STR(kontur[3]-kontur[1]))

ASORT(compon,,,{|x,y| x[5]<y[5]})

FOR L:=1 TO st0

compon[l,4]=kontur[3]-(compon[l,4]+dx)-kontur[1]+compon[l,7]

IF compon[L,2]='bot'

compon[L,5]=compon[L,5]-compon[L,3]-tlplat //для эл. нижней

стороны

ENDIF

NEXT

tkont2:=kontur[2]

tkont4:=kontur[4]

kontur[2]=-10

kontur[4]=kontur[2]

//*******СОЗДАНИЕ ФАЙЛОВ-ФРАГМЕНТОВ************

IF kolkomp>0

SETPOS(MAXROW()-1,0)

?'Идет создание файла элементов на нижней стороне:'

dlin:=ALLTRIM(STR(kontur[3]-kontur[1]))

nn:=FILECR2D(kolkomp,'top',dlin)

??nn

ENDIF

kontur[2]=tkont2

kontur[4]=tkont4

FOR L:=1 TO st0 //обратный пересчет координат для приведения

массива габаритов в исходный вид

IF compon[L,2]='bot'

compon[L,5]=compon[L,5]+compon[L,3]+tlplat //для эл. Нижней

стороны

ENDIF

compon[l,4]=-compon[l,4]+kontur[3]-kontur[1]+compon[l,7]

compon[l,4]=compon[l,4]-dx

NEXT

RETURN

//***************************************************************

FUNCTION kwad(argum) //функция возведения в квадрат

newarg:=argum*argum

RETURN newarg

//****************************************************

//подключение файлов с вспомогательными программами

#include 'CH&bsol;ssear.ch'

#include 'CH&bsol;swind.ch'

#include 'CH&bsol;smenu.ch'

#include 'CH&bsol;sfilcr3d.ch'

#include 'CH&bsol;sfilcr2d.ch'

4.Файл ssear.prg содержит в себе текст подпрограммы, которая выполняет весь анализ pdf файла, находит имена, габариты, и координаты всех элементов, содержащихся в этом pdf файле, а так же ищет для всех вновь встреченных элементов их преобразовнные prt- файлы, берет оттуда габариты и помещает их в базу данных габаритов элементов (файл gabarits.dbf):

FUNCTION SEARCHCOMP(koef)

lastseek:=0

olsear:=setcolor('n/gb')

set cursor off

//******** Выделение элементов из pdf-файла и занесение их в массив compon[0,9] *****

// compon[n,1]-название элемента(строка)

// compon[n,2]-сторона установки('top' или 'bot')

// compon[n,3]-высота элемента(число)

// compon[n,4]-координата х-точки привязки(число)

// compon[n,5]-координата у-точки привязки(цифра)

// compon[n,6]-поворот элемента(число от 0 до 3)

// compon[n,7]-ширина элем.(число)

// compon[n,8]-длина элем.(число)

// compon[n,9]-обозначение элемента(строка)

tmz1:=SEAR()

setcolor(olsear)

RETURN tmz1

FUNCTION INSERTCOMP() //выделение параметров элементов из строки текста

USE 'gabarits.dbf' //открытие базы данных с размерами элементов

FOR L=1 TO LEN(compon) //выделение координат точки привязки

элемента

IF compon[L,1]=NIL

L=LEN(compon)

kolkomp:=L-1

ELSE

kolkomp:=len(compon)

str2=ALLTRIM(compon[l,4])

IF compon[l,2]<>'bot'

koltop=koltop+1

ELSEIF compon[l,2]='bot'

kolbot=kolbot+1

ENDIF

p1=At(' ',str2)

compon[l,4]=VAL(SUBSTR(str2,0,p1-1))*koef //выделение х точки привязки

str2=LTRIM(SUBSTR(str2,p1,30))

p1=At(' ',str2)

IF p1=0

p1=AT('}',str2)

ENDIF

compon[l,5]=VAL(SUBSTR(str2,0,p1-1))*koef //выделение у точки привязки

SCROLL(10,0,MAXROW(),MAXCOL(),1)

st0:=compon[l,1]+compon[l,2]+' X='+STR(compon[l,4])+' Y='+STR(compon[l,5])+' Ro='+str(compon[l,6])

gab:=GABARIT(compon[L,1],L) //вызов данных о размерах элемента

ENDIF

NEXT

USE //закрытие базы данных с размерами элементов

RETURN {kolkomp,koltop,kolbot}

//****************************************************

FUNCTION GABARIT(st0,nn) // определение габаритов элемента по его имени

PRIVATE naiden:=0,gabar:={0,0,0} //по заданному имени элемента

возвращает массив из 3 чисел /ширина/длина/высота/

WHILE naiden=0

LOCATE FOR name=st0+SPACE(10-LEN(st0))

IF FOUND()=.T.

gabar[1]:=SHIR*koef

gabar[2]:=DLIN*koef

IF compon[nn,3]=0

compon[nn,3]=Vis*koef

IF Vis=0

compon[nn,3]=90*koef

ENDIF

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