Разработка программного обеспечения
изменений, сделанных в этом окне.
- КОМПОНОВКА - данный пункт не активен при выборе, до тех пор,
пока не будет указанно правильное имя анализируемого 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
|