Рефераты

Разработка программного обеспечения

изменений, сделанных в этом окне.

- КОМПОНОВКА - данный пункт не активен при выборе, до тех пор,

пока не будет указанно правильное имя анализируемого pdf- файла в окне

АТРИБУТЫ (о чем свидетельствует горящее посреди экрана сообщение “Не

вижу pdf-файла”). Если pdf- файл доступен, то при выборе этого пункта

меню начинается его анализ : за скоростью этого процесса пользователь

может следить по процентной линии, отображаемой на экране.

[pic]

Внизу экрана отображается общее количество найденных на плате

элементов а так-же сообщение о результате поиска контура платы на слое

KONTUR.

После завершения анализа платы программа выбирает габариты

элементов из файла gabarits.dbf по их названию, а если не находит

нужного, то выполняет поиск pdf-файла злемента (для prt, обработанного

pdifout.exe) в подкаталоге PDF (который должен находиться в том-же

каталоге что и программа). При успешном поиске она анализирует этот

файл, находит в нем габариты элемента и заносит их в базу gabarits.dbf.

Т.е. если на анализируемой плате есть элементы со стандартным названием,

но не стандартными (обнавленными) габаритами, то необходимо удалить

gabarits.dbf, а в подкаталог PDF скопировать все .pdf-файлы элементов

платы, и тогда габариты всех элементов платы просканируются и файл

подготовится заново. (В существующей версии каждый элемент по размерам

округляется до параллелограмма, т.е. шар например станет кубом. Для

точной графической передачи элементов в трехмерном виде требуется

создание специальной графической библиотеки в формате T-FLEX, чему будет

посвящена следующая версия программы.) Габариты элемента помещаются в

базу gabaritrs.dbf. Т.е. если элемент встречался хотя-бы раз в какой-

либо плате, то во всех последующих платах данные на него будут браться

из базы без повторной обработки его PRT-файла.

Если контур платы был обнаружен, то при создании файлов

для T-FLEX в них передадутся габаритные размеры платы, со слоя KONTUR,

округленные по форме до прямоугольника (существующая версия не

обрабатывает сложные контуры). Если-же контур найден не был то

программой создается собственный прямоугольный контур платы по условию:

расстояние от края платы до граничных элементов равно 10 мм.

После этого предлагается меню компоновки:

[pic]

- Выход (или ESC) — выход в предыдущее (главное) меню, если этот

пункт выбирается первым, то при выходе происходит отказ от создания

файлов платы в формате T-FLEX;

- Трехмерная компоновка — при выборе этого пункта начинается процесс

создания файлов изображения платы в трехмерном виде в формат T-FLEX.

На экране отображается количество элементов, созданных в файлах T-

FLEX , соответственно на нижнй и верхней стороне платы. При этом

создаются 3-и файла в формате T-FLEX: *****top.frg-файл элементов

верхней стороны платы, *****bot.frg-файл элементов нижней стороны

платы, *****plt.frg-файл контура платы (символом ***** обозначаются

пять первых символов каждого файла, они общиие для всех трех файлов,

которые пользователь редактирует по своему усмотрению в пункте Имя

файла). После завершения автоматически предлагается меню компановки

и пользователь, по жланию, может либо создать какой-либо другой вид

платы, либо выйти в главное меню;

- Имя файла — при выборе этого пункта курсор переходит в окно с

именм файла и позволяет изменить его по своему усмотрению;

[pic]

- Описание — при выборе этого пункта создается стандартный dbf-

файл, содержащий перечень всех элементов анализируемой платы.

- Двумерная компановка — при выборе этого пункта предлагается меню с

различными двумерными видами платы : спереди (F), сзади (A), слева

(L), справа (R). Под каждым пунктом нарисована плата и стрелкой

показано направление взгляда на неё.

[pic]

При выборе нужного пункта происходит создание файлов двумерного

изображения, соответствующего вида, в формате T-FLEX (создается файл

*****2d#.frg , где ***** - имя задаваемое пользователем при выборе

пункта “имя”, а # - символ признак вида : F, A, L, R).

После этого вновь предлагается меню компановки.

Алгоритм и описание программы.

Программа разработана и написана в СУБД CLIPPER 5.2 с

использованием стандартных форматов файлов баз данных.

Учитывая объем программы и сложность алгоритма,

использовались методы структурированного программирования и текст

программы разбит на несколько файлов, в которых выделены основные

функции, таким образом, чтобы их легко было редактировать во время

отладки.

1. Основная программа содержится в файле dbfill.prg, которая

в своей работе использует процедуры и функции, описанные во

вспомогательных программных файлах.

На первом шаге выполнения программа считывает имя pdf-файла,

заданного в командной строке, делает текущим каталог в котором она

находится, создает переменные, необходимые в работе как её, так и другим

подпрограммам:

PARAMETERS fname //считать параметры командной строки

PUBLIC

higt,higtd,pnow:=0,filelen,exit:='',attr:='',desc,bufer:=SPACE(65000),

; compon[0,9],nomcomp:=0

PUBLIC

koef:=0.1,str,stolb,parts,znak,kontur[0],verkont:=0,parametr

PUBLIC errfile[0] // массив сообщений

об ошибках

PRIVATE razm,filend,not,L,p1,str2,colo

PUBLIC tlplat:=7 //толщина платы

set cursor off

cls

colo:=setcolor('g+/b')

tmppat:=dirname() //делает текущим каталог в котором

наход.

pat:=LOWER(exename()) //исполняемый файл

c1:=RAT('tel',pat)

pat:=LEFT(pat,c1-2)

DIRCHANGE (pat)

Далее вызывается функция, активизирующая главное меню

программы, которая, в зависимости от выбранного пункта, передает

управление той или иной процедуре:

IF fname<>NIL

cls

setboxgrow(3)

wbox(0)

set date format 'dd:mm:yyyy'

//открытие основного окна

ZAGOL('ОБРАБОТКА PDF-ФАЙЛА '+DTOC(DATE()))

SETCOLOR('N/G')

wmenu:=wind(1,2,maxrow()-3,maxcol()-3,'Главное меню',5)

perv:=1

SHOWTIME(0,72,'G/G')

attrtmp:='DEMO '

higttmp:=30.00

higtdtmp:=30.00

exittmp:=' out'

GL() //выов фкнкции главного меню

WINCLOSE()

SETCOLOR(colo)

cls

ELSE

SETCOLOR(colo)

cls

@ 3,0 SAY 'Не введено имя pdf файла!'

ENDIF

SETCOLOR(colo)

DIRCHANGE (tmppat) //возвращает сохраненный текущий

каталог

SETCOLOR('g/n')

@ MAXROW()-1,15 SAY 'Shurasoft 1997 Mihail & Alexandr Company'

SETCOLOR(colo) //возвращение текущего цвета при выходе

?' '

RETURN

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

FUNCTION GL() //главное меню

CLEAR GETS

cglold:=setcolor('n/rg')

@ 11,5 CLEAR TO maxrow()-2,maxcol()-6

@ 11,5 TO maxrow()-2,maxcol()-6 DOUBLE

set cursor off

set scoreboard off

readexit(.F.)

set cursor on

set date format to 'dd.mm.yyyy'

setpos(12,(maxcol()/2)-4)

dispout(' АТРИБУТЫ ','g+/b')

@ 13,7 say "Имя комплекта................................"

color ('W+/rg') get attrtmp color('rg+/rg,n/w')

@ 14,7 say "Ограничение по высоте сверху в mm............"

color ('W+/rg') get higttmp picture '@B 999.99' color('gr+/rg,n/w')

@ 15,7 say "Ограничение по высоте снизу в mm............."

color ('W+/rg') get higtdtmp picture '@B 999.99'

color('gr+/rg,n/w')

setcolor(cglold)

set cursor off

mas:={{'Атрибуты','Компановка','Выход'},{"Редактирование

атрибутов файла","Скомпоновать файл в формате T-FLEX","Выход в

DOS"}}

str:=MENU (mas,14,perv)

perv=str

str1:=10

IF str=1 //если выбран пункт АТРИБУТЫ- запустить меню ,

//позволяющее изменить атрибуты

set cursor on

read

set cursor off

ELSEIF str=2 //если выбран пункт КОМПАНОВКА- запустить

//процедуру анализа pdf- файла

WSELECT(0)

SETCOLOR('n/bg')

PUBLIC

pnow:=0,filelen,desc,bufer:=SPACE(65000),compon[0,9],nomcomp:=0

PUBLIC kontur[0],verkont:=0,parametr

PUBLIC errfile[0] // массив

сообщений об ошибках

CREATDB()

wzapis:=wind(2,3,maxrow()-7,maxcol()-6,"Компановка",5)

higt:=higttmp

higtd:=higtdtmp

attr:=alltrim(attrtmp)

CONT()

winclose()

wselect(wmenu)

ELSEIF str=0 //если не выбран не один пункт

perv=4

ENDIF

IF str<>3

wselect(wmenu)

GL()

ENDIF

RETURN

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

FUNCTION CONT() //функция анализу\ирующая pdf- файл

PUBLIC kolkomp,koltop:=0,kolbot:=0,dx,dy //выделенме параметров

эле- //ментов

//dx,dy

-поправка на 0

desc:=FOPEN(fname)

filelen:=FSEEK(desc,0,2)

prflen:=filelen

FSEEK(desc,0,0)

CLS

?'ИДЕТ ПОИСК КОМПОНЕНТ...'

not:=SEARCHCOMP(@koef) //вызов функции которая выполняет

всю работу по анализу текста pdf-

айла , находит имена, обозначения,

габариты всех элементов, находя

щихся на плате и упаковы

вает их в виде файла базы данных

kolkomp:=0

IF len(not)>0

kolkomp:=not[1]

koltop:=not[2]

kolbot:=not[3]

ENDIF

FCLOSE(desc) //закрытие pdf файла

//*****ОБРАБОТКА ПАРАМЕТРОВ У НАЙДЕННЫХ ЭЛЕМЕНТОВ****

IF kolkomp>0

AUTOKONTUR(kolkomp) //выделение контура платы по максималь

ным габаритам элементов на ней

ENDIF

//*******ВЫБОР ВИДА ПЛАТЫ******************************

exit:=alltrim(exittmp)

CLEAR GETS

st:=1

cls

DO WHILE (st<>4) //Предлагается меню, где можно выбрать направ

ление взгляда на плату

cglold:=setcolor('n/rg')

@ 9,12 CLEAR TO 11,maxcol()-13

@ 9,12 TO 11,maxcol()-13 DOUBLE

set cursor off

set scoreboard off

readexit(.F.)

set cursor on

@ 10,14 say "Имя получаемоемого файла......" color ('w+/rg')

get exittmp picture 'NNNNN' color('gr+/gr,n/w')

setpos(10,50)

dispout('.frg','w+/gr')

setcolor(cglold)

mas:={{'Двумерная','Трехмерная ','Имя

файла','Выход'},{"Создание файла вида сбоку(двумерное

изображение)","Создание файла вида со стороны(трехмерное

изображение)",'Изменить имя получаемоемого файла','Выход в главное

меню'}}

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)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)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])))(kwad(maxx-tx[4])+kwad(tx[5]))})

ASORT(compon,,, tx[5]))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)

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

maxY:=compon[L,5]

ELSEIF compon[L,5]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 ¶metr //открытие б.д.

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[5]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\ssear.ch'

#include 'CH\swind.ch'

#include 'CH\smenu.ch'

#include 'CH\sfilcr3d.ch'

#include 'CH\sfilcr2d.ch'

Файл swind.prg содержит в себе текст подпрограммы, организующей оконный

интерфейс:

FUNCTION WIND(top,left,bot,rigt,zag,speed,centr) //создание окна

setboxgrow(speed)

//переменные:верх,лево,низ,право,

wsetshadow(-1) //текст

заголовка,скорость распахивания,центрирование

n:=wopen(top,left,bot,rigt,.F.)

wbox(0)

wsetshadow('N+/N') //текст

заголовка,скорость распахивания,центрирование

n:=wopen(top,left,bot,rigt,.F.)

setboxgrow(0)

//переменные:верх,лево,низ,право,

wbox(0)

IF centr<>nil

IF centr='centr'

WCENTER(.T.)

ENDIF

ENDIF

ZAGOL(zag)

RETURN n

FUNCTION WINCLOSE() //функция закрывающая окно

wclose()

wclose()

RETURN

FUNCTION RUSSLOW(st)

FOR k:=1 to len(russl)

st:=strtran(st,russl[k],russs[k])

NEXT

RETURN st

FUNCTION ZAGOL(L1) //делает надпись окна

l2:=len(L1)

l3:=maxcol()

l4:=(l3-l2)/2

@ -1,l4 SAY ' '+l1+' '

RETURN

3. Файл smenu.prg содержит в себе текст подпрограммы для

организации на экране меню:

FUNCTION MENU(k,razm,res)

olcurs:=setcursor(0)

set wrap on //к-2-массив пунктов и подсказок,razm-

длина 1-го пункта

olrow:=ROW() //res-начальный пункт

olcol:=COL()

ol:=setcolor('GR+/B,gr+/R')

dl:=len(k[1])

zmes:=0

FOR nom:=1 to dl

IF len(k[1,nom])/2=INT(len(k[1,nom])/2) .AND. razm/2=INT(razm/2)

k[1,nom]=center(k[1,nom],razm,' ',.T.)

ELSEIF len(k[1,nom])/2<>INT(len(k[1,nom])/2) .AND.

razm/2<>INT(razm/2)

k[1,nom]=center(k[1,nom],razm,' ',.T.)

ELSE

k[1,nom]=center(k[1,nom],razm-1,' ',.T.)

ENDIF

zmes:=zmes+len(k[1,nom])

NEXT

ots:=maxcol()-zmes

ots:=ots/(dl+1)

col:=ots

ten:=''

tc:=ntocolor(screenattr(2,0),.T.)

tc:=substr(tc,at('/',tc)+1,7)

tc:=left(tc,len(tc)-1)

tn:=''

FOR nom:=1 to dl

ten:=padright(tn,len(k[1,nom]),chr(223))

k[2,nom]=center(k[2,nom],maxcol()+1,' ',.T.)

@ 1,col PROMPT k[1,nom] MESSAGE k[2,nom]

trow:=row()

tcol:=col()

dispout(chr(220),'n/'+tc) //г78_---

setpos(2,col()-len(k[1,nom]))

dispout(ten,'n/'+tc)

setpos(trow,tcol)

col:=col+len(k[1,nom])+ots

NEXT

SET MESSAGE TO maxrow() CENTER

MENU TO res

IF res<>0 //эффект нажатия кнопки

razm:=len(k[1,res])

dol:=0

FOR o:=1 to res

dol:=dol+len(k[1,o])

NEXT

dol:=dol-razm

setpos(2,1+ots+dol+(ots)*(res-1))

dispout(space(razm+1),tc+'/'+tc)

setpos(1,ots+dol+(ots)*(res-1))

dispout(' ',tc+'/'+tc)

dispout(k[1,res],'GR+/R')

inkey(0.1)

setpos(1,1+ots+dol+(ots)*(res-1))

dispout(space(razm+1),tc+'/'+tc)

setpos(1,ots+dol+(ots)*(res-1))

dispout(k[1,res],'GR+/R')

dispout(chr(220),'n/'+tc) //г78_---

setpos(2,col()-razm)

ten:=padright(tn,len(k[1,res]),chr(223))

dispout(ten,'n/'+tc)

inkey(0.1)

ENDIF

setcolor(ol)

setpos(olrow,olcol)

setcursor(olcurs)

RETURN res

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

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 contr0

Страницы: 1, 2, 3, 4, 5


© 2010 Современные рефераты