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 ¶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,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\ssear.ch'
#include 'CH\swind.ch'
#include 'CH\smenu.ch'
#include 'CH\sfilcr3d.ch'
#include 'CH\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