Методические указания по дипломному проектированию Р-FLEX для интеграции пакетов PCAD и T-FLEX для СМП
Программное обеспечение сквозного маршрута проектирования печатных плат. Эргономичность интерфейса разработанной программы. Передача габаритных параметров между системами. Возможности системы T-FLEX. Структура маршрута и программное обеспечение.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | методичка |
Язык | русский |
Дата добавления | 23.09.2011 |
Размер файла | 429,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
4. Требования к формату pdf-файлов.
Все требования к формату файлов следует учесть при создании БД PCAD по СМП ПП в PCCARDS, до получения файлов .pdf.
На слое KONTUR должен быть заведен контур печатной платы, т.к. именно там программа будет его искать. Если контур платы будет создан на каком-либо другомм слое, то для программы это равносильно его отсутствию вообще.
На слое аттрибуты для каждого элемента должен быть заведен параметр Н=ххх.ххх, где ххх.ххх - высота данного элемента в мм. Именно исходя из этих параметров программа будет определять высоту при создании объемного образа элемента, а при отсутствии такого параметра элементу автоматически присваивается высота в 10мм.
Когда при анализе платы программа обнаруживает элемент, она производит проверку на наличие этого элемента на слое шелкографии и при отрицательном результате элемент просто игнорируется.
Руководство по применению программного обеспечения.
1. Запуск.
Для запуска программы набрать в командной строке DOS имя программы -- p-flex.exe (с указанием пути к ней в том случае если текущий каталог не является каталогом, в котором расположена программа) и через пробел имя pdf-файла анализируемой платы (полученного из pcb-файла с помощью программы pdfout.exe), например:
ххх.exe sample.pdf
На экране появится окно -- главное меню:
Из этого меню пользователь сможет управлять всей дальнейшей работой программы выбирая те или иные пункты меню с помощью функциональных клавиш.
2. Функциональные клавиши.
- навигационные клавиши устанавливают курсор на нужный вам пункт меню;
- клавишей ENTER осуществляется выбор того пункта меню, на котором стоит курсор;
- клавишей INSERT в интерактивном режиме можно переключить режим замещения / вставки букв с раздвижкой строки;
- клавиша ESC, как правило, выполняет возврат к предыдущей функции или меню (аналогично пункту ВЫХОД).
3. Описание использования функциональных возможностей программы.
После запуска открывается главное меню программы, состаящее из пунктов, управляющих дальнейшей работой:
- АРИБУТЫ - при выборе этого пункта становиться активным окно с атрибутами и пользователь может настроить атрибуты по своему усмотрению:
- Имя комплекта : указывае название каталога для системы T-FLEX, в котором расположены файлы f4.grb, plata.grb, 2d.grb, необходимые для формирования элементов платы средствами пакета T-FLEX по результатам работы p-flex.
- Ограничение сверху (снизу) : предельные значения параметров по высоте элементов с верхней и нижней стороны платы (если высота элемента больше этих параметров, то элемент будет выделен красным цветом).
- Толщина платы : параметр, определяющий толщину платы (т.к. в PCAD нет понятия о толщине платы, то этот параметр определяется пользователем, по умолчанию = 0).
- Имя pdf - файла : в этом пункте пользователь может ввести название pdf- файла PCAD-а, который он хочет обработать с указанием пути к нему. Если при запуске программы был указано имя файла pdf, в виде ключа, то оно автоматически попадает в этот пункт. При наборе имени файла программа проверяет существование такого файла по указанному пути и, если он не существует, то пользователь не имеет возможности выйти из окна АТРИБУТЫ до тех пор, пока не введет правильное имя файла иначе остается возможность выхода по esc ,без сохранения всех изменений, сделанных в этом окне.
- КОМПОНОВКА - данный пункт не активен при выборе, до тех пор, пока не будет указанно правильное имя анализируемого pdf- файла в окне АТРИБУТЫ (о чем свидетельствует горящее посреди экрана сообщение “Не вижу pdf-файла”). Если pdf- файл доступен, то при выборе этого пункта меню начинается его анализ : за скоростью этого процесса пользователь может следить по процентной линии, отображаемой на экране.
Внизу экрана отображается общее количество найденных на плате элементов а так-же сообщение о результате поиска контура платы на слое KONTUR.
После завершения анализа платы программа выбирает габариты элементов из файла gabarits.dbf по их названию, а если не находит нужного, то выполняет поиск pdf-файла злемента (для prt, обработанного pdifout.exe) в подкаталоге PDF (который должен находиться в том-же каталоге что и программа). При успешном поиске она анализирует этот файл, находит в нем габариты элемента и заносит их в базу gabarits.dbf. Т.е. если на анализируемой плате есть элементы со стандартным названием, но не стандартными (обнавленными) габаритами, то необходимо удалить gabarits.dbf, а в подкаталог PDF скопировать все .pdf-файлы элементов платы, и тогда габариты всех элементов платы просканируются и файл подготовится заново. (В существующей версии каждый элемент по размерам округляется до параллелограмма, т.е. шар например станет кубом. Для точной графической передачи элементов в трехмерном виде требуется создание специальной графической библиотеки в формате T-FLEX, чему будет посвящена следующая версия программы.) Габариты элемента помещаются в базу gabaritrs.dbf. Т.е. если элемент встречался хотя-бы раз в какой-либо плате, то во всех последующих платах данные на него будут браться из базы без повторной обработки его PRT-файла.
Если контур платы был обнаружен, то при создании файлов для T-FLEX в них передадутся габаритные размеры платы, со слоя KONTUR, округленные по форме до прямоугольника (существующая версия не обрабатывает сложные контуры). Если-же контур найден не был то программой создается собственный прямоугольный контур платы по условию: расстояние от края платы до граничных элементов равно 10 мм.
После этого предлагается меню компоновки:
- Выход (или ESC) -- выход в предыдущее (главное) меню, если этот пункт выбирается первым, то при выходе происходит отказ от создания файлов платы в формате T-FLEX;
- Трехмерная компоновка -- при выборе этого пункта начинается процесс создания файлов изображения платы в трехмерном виде в формат T-FLEX. На экране отображается количество элементов, созданных в файлах T-FLEX , соответственно на нижнй и верхней стороне платы. При этом создаются 3-и файла в формате T-FLEX: *****top.frg-файл элементов верхней стороны платы, *****bot.frg-файл элементов нижней стороны платы, *****plt.frg-файл контура платы (символом ***** обозначаются пять первых символов каждого файла, они общиие для всех трех файлов, которые пользователь редактирует по своему усмотрению в пункте Имя файла). После завершения автоматически предлагается меню компановки и пользователь, по жланию, может либо создать какой-либо другой вид платы, либо выйти в главное меню;
- Имя файла -- при выборе этого пункта курсор переходит в окно с именем файла и позволяет изменить его по своему усмотрению;
- Описание -- при выборе этого пункта создается стандартный dbf- файл, содержащий перечень всех элементов анализируемой платы.
- Двумерная компановка -- при выборе этого пункта предлагается меню с различными двумерными видами платы : спереди (F), сзади (A), слева (L), справа (R). Под каждым пунктом нарисована плата и стрелкой показано направление взгляда на неё.
При выборе нужного пункта происходит создание файлов двумерного изображения, соответствующего вида, в формате 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)<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'
Файл 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 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)
k=2
ELSE
k=1
ENDIF
nom:=nom+1
AADD(rez,({nil}))
rez[nom]=SUBSTR(st0,0,p1-1)
rez[nom]=(VAL(rez[nom])*koef)
st0=ALLTRIM(SUBSTR(st0,p1,60))
NEXT
RETURN rez
//****************************************************
FUNCTION SHELK(max) //проверка компонента на слой шелкографии
false:=0
FOR proo:=1 TO 2
proo=2
n1:=AT ('[Ly "SLK',bufer)
n2=AT('{I '+namecomp,bufer)
n3=AT('COMP_DEF ',bufer)
IF n3=0
n3=65500
ENDIF
IF n2=0
n2=n3
ENDIF
IF n1<>0
IF n1<n2
false:=1
ELSE
false:=0
ENDIF
ENDIF
IF n1=0
IF n2=65500
IF filesost<>'end'
filesost=READF()
proo=1
ENDIF
ENDIF
ENDIF
NEXT
RETURN false
//****************************************************
FUNCTION FINDCOMP() // поиск компонента с именем 'namecomp'
FOR kol:=1 TO 2
kol=2
c2=AT('{I ',bufer) //поиск {I 'имя prt'
c1=AT('{COMP_DEF ',bufer)
IF c2<>0 .AND. c1<>0 .AND. c2>c1
c2=0
ENDIF
IF c2<>0
kol=1 //после конца процедуры повторить поиск с темже именем
nomcomp=nomcomp+1
?'Количство элементов на плате:',ALLTRIM(STR(nomcomp)),' '
setpos(row()-1,Col())
AADD(compon,{NIL,NIL,NIL,0,0,NIL,0,0,NIL}) //увеличение массива на один элемент
slovo:=STROKA(c2)
st0:=ALLTRIM(slovo)
st1:=AT('.',st0)
compon[nomcomp,1]=ALLTRIM(SUBSTR(st0,4,st1-4)) //выделение названия компонента
st1:=RAT(' ',slovo)
compon[nomcomp,9]:=(SUBSTR(st0,st1+1,30))
compon[nomcomp,6]:=0
compon[nomcomp,3]:=0
compon[nomcomp,2]='top'
bufer:=LTRIM(RIGHT(bufer,LEN(bufer)-(c2+3)))
//отброс передней части буфера
FOR powtor:=1 TO 2
powtor=2
c2=AT('{I ',bufer) //определ.поз.следующ.компон.
c3=AT('{Ps "B"',bufer)
c4=AT('{Pl ',bufer)
c1=AT('{COMP_DEF ',bufer) //определ.след.названия
IF c1=0
c1=66000
ENDIF
c5=AT('{Ro' ,bufer)
c6=AT('{At H ' ,bufer)
IF c2<>0 .AND. c1<>0 .AND. c2<c1
endc2=c2
ELSEIF c1<>0 //определения конца области
endc2=c1 //поиска в пределах текущего
ELSE //компонента
endc2=65001
ENDIF
IF c3<>0 //определ.стороны
IF c3<endc2 //компон. в пределах текущего {I
compon[nomcomp,2]='bot'
ENDIF
ENDIF
IF c5<>0 //определ.стороны
IF c5<endc2 //компон. в пределах текущего {I
rot:=STROKA(c5)
compon[nomcomp,6]=VAL(SUBSTR(rot,5,20))
ENDIF
ENDIF
IF c6<>0 //определ.стороны
IF c6<endc2 //компон. в пределах текущего {I
rot:=STROKA(c6+6)
compon[nomcomp,3]=koef*VAL(ALLTRIM(rot))
ENDIF
ENDIF
IF c4<>0 опр.атриб.комп,если он расположен
IF c4<endc2 не дальше следующего {I-го)
slovo:=STROKA(c4)
compon[nomcomp,4]=ALLTRIM(SUBSTR(slovo,5,15))
ENDIF
ELSE
IF endc2=65001 если атриб. в данном буфере
IF filesost<>'end' не наидены и до конца буфера
filesost=READF() не встречается {I {COMP_DEF, тогда
powtor=1 подгрузить след. буфер и искать
ELSE в нем
powtor=2 если буфер последний то
идти дальше
ENDIF
ENDIF
ENDIF
NEXT
ENDIF
NEXT повторный поиск комп. в оставш. буфере с тем-же именем
RETURN
//****************************************************
FUNCTION POISK(name) поиск данных о новом элементе
PRIVATE razmx:={},razmy:={},st_org:=' ',st_razm:=' ',x:=0,y:=0,tp
CLS
fclose(desc)
pnow=0
setpos(0,0)
??'Поиск данных на элемент ',name,'...'
str=4
stolb=15
desc:=FOPEN('PDF\'+alltrim(name)+'.pdf')
IF FERROR()<>0
??'не найдены'
IF ASCAN(errfile,name+'.pdf')=0
AADD(errfile,name+'.pdf')
ENDIF
fclose(desc)
RETURN 'no'
ENDIF
FOR cont:=1 to 2
cont=2
IF READF()='end'
cont=2
ELSE
cont=1
ENDIF
c1=AT('{Org ',bufer)
IF c1<>0
st_org:=STROKA(c1+5)+'}'
ENDIF
c1=AT('{At H ',bufer)
IF c1<>0
tm1:=(STROKA(c1+6)+'}')
ttt:=SKONT(tm1)
hcomp:=ttt[1]
ENDIF
POISKRAZM(@x,@y)
NEXT
PROCENT()
st_org:=SKONT(st_org) координаты org
ASORT(razmx)
ASORT(razmy)
IF len(razmx)<1
razmx:={0}
ENDIF
IF len(razmy)<1
razmy:={0}
ENDIF
gabar[1]=ABS(razmx[LEN(razmx)]-razmx[1])
gabar[2]=ABS(razmy[LEN(razmy)]-razmy[1])
st_org[1]:=razmx[LEN(razmx)]-st_org[1]
st_org[2]:=st_org[2]-razmy[1]
??'найдены'
fclose(desc)
PROCENT()
RETURN st_org возвращает коорд. точки привязки
FUNCTION POISKRAZM(x,y)
private mpoisk:={{65000,'L'},{65000,'R'},{65000,'C'}}
mpoisk[1,1]=AT('{L ',bufer) поиск на графическом слое линий(L),прямоугольников(R),кругов(C)
mpoisk[2,1]=AT('{R ',bufer)
mpoisk[3,1]=AT('{C ',bufer)
cc:=0
For pk:=1 to len(mpoisk)
IF mpoisk[pk,1]=0
mpoisk[pk,1]=65000
ENDIF
Next
ASORT(mpoisk,,,{|px,py| px[1]<py[1]}) выбор графического элемента,ближайшего к началу файла
cc:=mpoisk[1,1]
IF cc<>65000 .AND. mpoisk[1,2]<>'C'
st_razm:=ALLTRIM(STROKA(cc+3))+'}'
bufer:=SUBSTR(bufer,cc+3,65000)
mas:=SKONT(st_razm)
FOR k:=1 TO LEN(mas)-1 STEP 2 выборка координат по Х
x=x+1
AADD(razmx,0)
razmx[x]:=mas[k]
IF LEN(razmx)>20
ASORT(razmx)
min1:=razmx[1]
max2:=razmx[LEN(razmx)]
razmx={min1,max2}
x=2
ENDIF
NEXT
FOR k:=2 TO LEN(mas) STEP 2 выборка координат по Y
y=y+1
AADD(razmy,0)
razmy[y]:=mas[k]
IF LEN(razmy)>20
ASORT(razmy)
min1:=razmy[1]
max2:=razmy[LEN(razmy)]
razmy={min1,max2}
y=2
ENDIF
NEXT
POISKRAZM(@x,@y)
ELSEIF cc<>65000 .AND. mpoisk[1,2]='C'
st_razm:=ALLTRIM(STROKA(cc+3))+'}'
bufer:=SUBSTR(bufer,cc+3,65000)
mas:=SKONT(st_razm)
IF len(mas)=3
st_tmp:=SKONT(st_org) координаты org
AADD(razmx,st_tmp[1]+(mas[1]+mas[3]/2))
AADD(razmy,st_tmp[2]+(mas[2]+mas[3]/2))
AADD(razmx,st_tmp[1]+mas[1]-mas[3]/2)
AADD(razmy,st_tmp[2]+mas[2]-mas[3]/2)
ENDIF
POISKRAZM(@x,@y)
ENDIF
RETURN
//****************************************************
5. Файл specif.prg содержит в себе текст подпрограммы, создающей перечень всех элементов, содержащихся на анализируемой плате, в виде стандартного dbf файла с именем xxxxx.dbf, где ххххх -- имя pfd файла PCAD-а.
//************************************************************
FUNCTION CreatSpec()
PRIVATE struct1 [4,4],nom, ns1:='name',ns2:='oboz',ns3:='kol',ns4:='con'
// описание массива-структуры базы данных
struct1[1,1]=ns1
struct1[1,2]="C"
struct1[1,3]=20
struct1[1,4]=0
struct1[2,1]=ns2
struct1[2,2]="C"
struct1[2,3]=25
struct1[2,4]=0
struct1[3,1]=ns3
struct1[3,2]="C"
struct1[3,3]=6
struct1[3,4]=0
struct1[4,1]=ns4
struct1[4,2]="C"
struct1[4,3]=10
struct1[4,4]=0
public nameper:=''
nameper:=alltrim(left(fname,at('.',fname)-1))+'.dbf'
DBCREATE(nameper,struct1) //создание базы данных перечня элементов
USE
//************************************************************
USE &nameper //открытие б.д. перечня элементов
private
//массив со всевозможными названиями элементов
snaz:={{"Конденсаторы",1},{"Резисторы",1},{"Дроссели",1},{"Транзисторы",2},{"Диоды",2},{"Микросхемы",2},{"Вилки",1},{"Прочие",1}}
private
//массив со всевозможными обозначчениями элементов
soboz:={{'C','c'},{'R','r'},{'L','l'},{'VT','vt,'},{'VD','vd'},{'DD','D','d','dd'},{'X','x'},}
APPEND BLANK
REPLACE &ns1 WITH 'Название'
REPLACE &ns2 WITH 'Обозначение'
REPLACE &ns3 WITH 'Кол-во'
REPLACE &ns4 WITH 'Примеч.'
APPEND BLANK
REPLACE &ns1 WITH '------------------------------------------'
REPLACE &ns2 WITH '------------------------------------------'
REPLACE &ns3 WITH '------------------------------------------'
REPLACE &ns4 WITH '------------------------------------------'
append blank
// поиск элементов, соответствующих определенным обозначениям, и занесение их в свою графу базу данных
FOR naz=1 to len(snaz)
REPLACE &ns1 WITH snaz[naz,1]
nzap:=recno()
kolv:=0 //кол-во эл. одного класса
strsp:=''
FOR nom=1 TO len(compon)
vrem:=compon[nom,9]
IF vrem<>nil
aaa:=posalpha(vrem,.T.)
pvr:=alltrim(left(vrem,aaa-1))
set exact on
IF (ascan(soboz[naz],pvr)>0);
.OR.(naz=len(snaz) .AND. ascan(soboz,{|x| ascan(x,pvr)>0})=0)
kolv=kolv+1
IF (len(alltrim(&ns2))+len(vrem)+1)<25
vrstr:=alltrim(&ns2)+vrem+','
REPLACE &ns2 WITH vrstr
ELSE
APPEND BLANK
vrstr:=alltrim(&ns2)+vrem+','
replace &ns2 with vrstr
ENDIF
ENDIF
set exact off
ENDIF
NEXT
IF kolv>0
vrstr=left(vrstr,len(vrstr)-1)
replace &ns2 with vrstr
goto nzap
replace &ns3 with alltrim(STR(kolv))
APPEND BLANK
APPEND BLANK
ELSE
REPLACE &ns1 WITH ''
ENDIF
NEXT
USE //закрытие б.д.
RETURN
Функционирование разработанной программы было проверено на реальном изделии (4 платы в изделии).
проектирование маршрут программный интерфейс
Организационно-Экономическая часть
Задание: Техноко-Экономическое обоснование разработки. Анализ разделов бизнес-плана. Выполнение расчетов по учету издержек и конкурентоспособности продукции. Образование цены.
Введение
Несмотря на то, что данный проект является экспериментальным, и изготавливается на заказ конкретного предприятия, его можно рассмотривать как товар так как, несомненно, найдется большое количество аналогичных предприятий и частных пользователей заинтересованных в таком программном продукте. Поэтому далее предлагается к рассмотру бизнес-план по производству и реализации этого программного продукта.
Бизнес-план является одним из первых обобщающих документов обоснования инвестиций и содержит укрупнённые данные о планируемой номенклатуре и объёмах выпуска продукции, характеристики рынков сбыта и сырьевой базы, потребность производства в земельных, энергетических и трудовых ресурсах, а также содержит ряд показателей, дающих представление о коммерческой, бюджетной и экономической эффективности рассматриваемого проекта, и в первую очередь представляющих интерес для участников-инвесторов проекта. Расчёты показателей адаптированы к требованиям и условиям современного отечественного и зарубежного инвестирования.
Описание товара
Программный продукт представляет собой пакет программных средств, написанных для IBM-совместимых компьютеров. Программа предназначена для использования ее совместно с пакетами PCAD и T-FLEX (которые применяются для разработки и проектирования печатных плат и деталей остнастки). Пакет PCAD предназначен для разработки плат, а в пакете T-FLEX разрабатывается корпус. В система PCAD плата изображается только в двухмерном виде и поэтому такой образ платы бесполезен при разработке корпуса в ситеме T-FLEX т.к. этот чертеж не обладает объемными размерами. Разработанный программный продукт позволяет передавать все параметры и элементы печатной платы, разрабатываемой в PCAD, пакету T-FLEX, конвертируя чертеж платы в трехмерный объект, для дальнейшей разработки корпуса под созданную плату.
Основные технические требования :
Конфигурация компьютера - IBM 386/DX или выше.
Операционная система - MS-DOS 5.0 или выше.
Свободная память DOS - не менее 450 kb.
Размер, занимаемый на диске - 500 kb.
Возможности программного пакета.
представленная на рассмотрение программа способна обрабатывать pdf-файлы (полученные программой pdifout.exe) в формате PCAD4.5, PCAD7, PCAD8 ;
в ходе своей работы программа создает постоянно пополняющуюся базу данных элементов;
программа способна создавать файлы в формате T-FLEX, которые представляют собой графический образ платы в трехмерном виде (изометрии), что позволяет визуально оценить ее объемный размер и принять решения по разработке деталей оснастки;
программа имеет возможность, по желанию пользователя, подготавливать форму со спецификацией всех элементов, содержащихся на анализируемой плате в виде стандартного dbf-файла;
Рынок сбыта
Предполагается поставлять данный программный продукт ограниченному кругу организаций занимающихся разработкой печатных плат и конструкционной остнастке к ним. Основным потребителем программы должны стать различные подразделения НИИ «Автоматики». Предполагаемый объем поставок системы:
1998 |
1999 |
2000 |
2001 |
||
НИИ «Автоматики» |
50 |
60 |
70 |
70 |
|
Прочие организации |
10 |
80 |
140 |
360 |
Конкуренты
Ввиду уникальности и узконаправленности нашего программного продукта, конкурентов пока можно не опасаться. В дальнейшем-же нужно следить за сохранением коммерческой тайны, что-бы потенциальные конкуренты не смогли воспользоваться нашей идеей.
Источник финансирования
Финансирование проекта осуществляется за счет базового предприятия из средств выделенных на НИР. На первом этапе предполагается устанавливать программу только в устройствах производства НИИ «Автоматики». На втором этапе предполагается расширить рынок сбыта за счет продаж программы прочим производителям. Поскольку НИИ «Автоматики» финансировало разработку системы предполагается поставлять ему программу по существенно более низким ценам.
Календарный план разработки
Название этапа |
Время выполнения (дни) |
Количество (человек) |
|
Разработка технического задания |
3 |
1 |
|
Изучение технической документации и выбор языка программирования |
2 |
1 |
|
Изучение форматов файлов систем PCAD и T-FLEX |
5 |
1 |
|
Разработка алгоритма передачи данных |
2 |
1 |
|
Разработка алгоритма конвертирования трехмерного изображения |
2 |
1 |
|
Создание работающей модели алгоритмов |
10 |
1 |
|
Отладка программы |
10 |
1 |
|
Подготовка технической документации |
2 |
1 |
|
Всего чел/дней |
32 |
Этапы:
1 |
1 |
||||||||||||||||||||||||
2 |
2 |
||||||||||||||||||||||||
3 |
3 |
||||||||||||||||||||||||
4 |
4 |
||||||||||||||||||||||||
5 |
5 |
||||||||||||||||||||||||
6 |
6 |
||||||||||||||||||||||||
7 |
7 |
||||||||||||||||||||||||
8 |
8 |
||||||||||||||||||||||||
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
Структура разработки
Проект по разработке и испытанию программы выполняется силами 2-х инженеров-программистов и руководителя проекта . Первый этап работы предполагает разработку, тестирование и пробное внедрение данной программой.
Расчет издержек и цены продукта.
Затраты на материалы и покупные изделия.
№ |
Наименование |
Кол-во |
Цена за единицу |
Общая сумма |
|
1 |
Документация по PCAD и T-FLEX |
8 |
40000 |
320000 |
|
2 |
Папка для диплома |
1 |
30000 |
30000 |
|
3 |
Дискеты |
40 |
5000 |
200000 |
|
4 |
Программный продукт |
1 |
240000 |
240000 |
|
5 |
Ватман |
6 |
8000 |
48000 |
|
6 |
Книги по теме проекта |
4 |
20000 |
80000 |
|
7 |
Бумага |
1 |
60000 |
60000 |
Всего на материалы было истрачено 978000 руб.
С учетом транспортных расходов затрачено 998000 руб.
Основная заработная плата.
Этап |
Исполнители |
Кол-во дней |
За работу получено |
Месячный оклад |
|
Разработка техническогозадания. |
Руководительпроекта |
3 |
450000 |
3000000 |
|
Изучение технической документации |
Инженерпрограммист |
2 |
200000 |
2000000 |
|
Изучение форматов PCAD и T-FLEX. |
Инженерпрограммист |
5 |
500000 |
2000000 |
|
Разработка алгоритма передачи данных |
Инженерпрограммист |
2 |
200000 |
2000000 |
|
Разработка алгоритма конвертирования трехмерного изображения |
Инженерпрограммист |
2 |
200000 |
2000000 |
|
Создание работающей модели алгоритмов |
Инженерпрограммист |
10 |
1000000 |
2000000 |
|
Отладка программымикропроцессора |
Инженерпрограммист |
10 |
1000000 |
2000000 |
|
Подготовка техническойдокументации |
Инженерпрограммист |
2 |
200000 |
2000000 |
|
Итого |
3750000 |
Дополнительная З/П
Средства затраченные на выходные дни, отпуска , премии и т .д.
Дополнительная З/П=15%Основная З/П =562500 руб.
Отчисления на социальные нужды
Отчисления на социальные нужды=40%(Дополнительная З/П+ Основная З/П)=40%(3750000 руб+562500 руб.)=1725000 руб.
Накладные расходы
Затраты, связанные с управлением, покупкой деталей, обслуживанием и коммунальными услугами, составляют 2400000 руб.
Прочие расходы
При разработке испытательного устройства используются 2 персональных компьютера в течение всего срока разработки. Стоимость одного дня работы на компьютере составляет 10000 руб. с учетом амортизации и потребления электричества. Время выполнения всего проекта составляет 24 дня. Стоимость работы на компьютере будет составлять 480000 руб.
Итоговая таблица издержек и цены продукта.
Название издержек |
Затраты (руб.) |
|
Затраты на материалы и покупные изделия |
998000 |
|
Основная З/П |
3750000 |
|
Дополнительная З/П |
562500 |
|
Отчисления на социальные нужды |
1725000 |
|
Накладные расходы |
2400000 |
|
Прочие расходы |
480000 |
|
Всего |
6165500 |
Норма прибыли=20%
Издержки=6165500 руб.
Стоимость разработки без НДС на затраты=
Норма прибыли+Издержки=7398600 руб.
НДС на затраты =20% Затраты=1479720 руб.
Стоимость разработки=8878320 руб.
Охрана труда
Задание: Составить карту условий труда программиста, определить категорию тяжести труда и разработать мероприятия по оптимизации условий труда.
Изучение и решение проблем, связанных с обеспечением здоровых и безопасных условий, в которых протекает труд человека - одна из наиболее важных задач в разработке новых технологий и систем производства. Изучение и выявление возможных причин производственных несчастных случаев, профессиональных заболеваний, аварий, взрывов, пожаров, и разработка мероприятий и требований, направленных на устранение этих причин позволяют создать безопасные и благоприятные условия для труда человека. Комфортные и безопасные условия труда-- один из основных факторов влияющих на производительность служащих Вычислительных Центров.
Работа сотрудников вычислительных центров непосредственно связана компьютером, а соответственно с дополнительным вредным воздействиям.
Главный показатель, на основе которого можно определять меры по восстановлению исходного дорабочего состояния является категория тяжести труда. На основании краткой хар-ки технологического процесса или вмда трудовой деятельности составляется карта условий труда, которая позволяет определить категорию тяжести труда.
Составим карту условий труда программиста, учитывая специфические факторы и особенности, относящиеся к нашему производству.
Карта условий труда программиста на рабочем месте.
№ |
Показатели условий труда. Единицы измерения. |
ПДУ, ПДК |
Оценка показателя |
Длительность воздействия (экспозиция) |
Балл с учетом экспозиции |
|||
Абсолютная |
В баллах |
Мин. |
В % смены |
|||||
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
А. Психофизиологические нагрузки. |
||||||||
1 |
Напряжение зрения: освещенность рабочего места, лк |
На уровне санитарн. норм |
2 |
95 |
2 |
|||
размеры объекта, мм |
0.3-0.15 |
3 |
90 |
3 |
||||
энтропия зрительной информации, бит/сигнал |
32 |
4 |
80 |
4 |
||||
число информационных сигналов в час |
>300 |
4 |
80 |
4 |
||||
2 |
Напряжение слуха: уровень шума, дб |
ПДУ |
2 |
90 |
2 |
|||
соотношение сигнал-шума , % |
70 |
2 |
85 |
2 |
||||
энтропия слуховой информации, бит/сигнал |
24 |
3 |
85 |
3 |
||||
3 |
Напряжение внимания: длительность сосредоточенного наблюдения, % времени смены |
90 |
4 |
95 |
4 |
|||
число важных объектов наблюдения |
>25 |
4 |
85 |
4 |
||||
число движения пальцев в час |
1080 |
3 |
95 |
3 |
||||
4 |
Напряжение памяти: необходимость помнить об элементах работы свыше 2-х часов (кол-во эл.) |
3-5 |
6 |
87 |
6 |
|||
поиск рассогласований, в % от числа регулируемых параметров |
50 |
3 |
60 |
1.8 |
||||
5 |
Нервно-эмоциональное напряжение. Экспертная оценка. |
4 |
65 |
2.5 |
||||
6 |
Интеллектуальное напряжение. Экспертная оценка. |
4 |
70 |
4 |
||||
7 |
Физическая нагрузка: энергозатраты, Вт |
232 |
2 |
30 |
0.6 |
|||
внешняя механическая работа, Вт |
37 |
2 |
40 |
0.8 |
||||
8 |
Статическая нагрузка в течение смены, кгс.сек |
36000 |
2 |
90 |
2 |
|||
на обе руки |
86000 |
2 |
90 |
2 |
||||
на весь корпус |
123000 |
2 |
90 |
2 |
||||
9 |
Рабочее место, рабочая поза, перемещение в пространстве. Экспертная оценка. |
1 |
97 |
1 |
||||
10 |
Сменность |
Одна |
1 |
1 |
||||
11 |
Продолжительность работы в течение суток, час |
8 |
2 |
100 |
2 |
|||
12 |
Монотонность: число приемов в операции |
5-3 |
4 |
95 |
4 |
|||
Абсолютная |
В баллах |
Мин. |
В долях смены |
|||||
Абсолютная |
В баллах |
Мин. |
В долях смены |
|||||
длительность повторяющихся операций, с |
5-9 |
5 |
80 |
5 |
||||
13 |
Режим труда и отдыха |
Без гимнастики и музыки |
2 |
10 |
0.2 |
|||
Б. Санитарно-гигиенические условия труда. |
||||||||
14 |
Температура воздуха на рабочем месте: теплый период, С |
21-22 |
2 |
97 |
2 |
|||
холодный период, С |
17-19 |
2 |
97 |
2 |
||||
15 |
Вредные химические в-ва, кратность превышения ПДК |
ПДК |
2 |
97 |
2 |
|||
16 |
Промышленная пыль, кратность превышения ПДК |
ПДК |
2 |
97 |
2 |
|||
В. Оценка условий труда. |
||||||||
17 |
Число факторов, формирующих тяжесть труда, n |
29 |
||||||
18 |
Сумма балов, i |
73.9 |
||||||
19 |
Усредненный бал kср |
2.548 |
||||||
20 |
Показатель интегральной оценки условий труда, kz |
39.81 |
||||||
21 |
Категория тяжести труда, kт |
III |
Выясняем, с помощью карты условий труда, что работа на нашем производстве определяется III категорией тяжести труда, а это значит, что необходимо предусмотреть специальные меры по восстановлению исходного дорабочего состояния: это отдых и перерывы после работы рационализация режима труда и отдыха, оздоровление условий труда.
Из карты видно, что основная нагрузка программиста - психологическая. Это напряжение памяти, внимания, монотонность работы. Из физических нагрузок наибольшим показателем категории тяжести труда является непряжение зрения (т.к. программист все свое рабочее время проводит перед монитором). Остальные физические показатели, такие как уровень шума, физическая нагрузка, невелики и не выходят за пределы допустимых норм.
Подобные документы
Средства разработки для реализации On-line игры в Интернете: Adobe Flash Pro, Adobe Flash Builder, Apache Flex. Технология интерактивной анимации. Достоинства и недостатки различных средств разработки приложений. История версий программного обеспечения.
курсовая работа [873,0 K], добавлен 08.12.2013Системное, инструментальное и прикладное программное обеспечение. Современные настольные издательские системы. Программные средства мультимедиа. Системы искусственного интеллекта. Прикладное программное обеспечение автоматизированного проектирования.
реферат [59,4 K], добавлен 18.12.2013Основное программное обеспечение для автоматизации производства. Финансовые и коммуникационные системы. Системы планирования и управления. Текстовые редакторы и табличные процессоры. Финансовое программное обеспечение. Шрифтовые технологии в документах.
шпаргалка [551,9 K], добавлен 16.08.2010Программное обеспечение как совокупность программ системы обработки информации и программных документов, необходимых для эксплуатации этих программ. Системное ПО (программы общего пользования), прикладное и инструментальное (системы программирования).
реферат [73,1 K], добавлен 04.06.2010Системное и прикладное программное обеспечение. Выполнение программ, хранение данных и взаимодействие пользователя с компьютером. Возможности операционных систем. Системы технического обслуживания. Системы обработки электронных таблиц и текста.
презентация [15,9 K], добавлен 06.01.2014Сущность понятия "программное обеспечение". Типы прикладных программ. Современные системы программирования для персональных компьютеров. Уровни программного обеспечения: базовый, системный, служебный. Классификация служебных программных средств.
реферат [20,2 K], добавлен 01.04.2010Классификация программного обеспечения, его особенности, назначение. Программное обеспечение для работы с текстом, изображением, прикладное, офисное, для работы в Интернете. Системы программирования, специфика программного обеспечения, что такое вирусы.
презентация [1,2 M], добавлен 25.02.2010Постановка задачи для модуля 1С. Бухгалтерия 3.0. Анализ существующих разработок в области интегрирования данных. Информационное обеспечение модуля "Связь 1С Предприятия 8.2. с "Казначейством". Программное и технологическое обеспечение данного модуля.
курсовая работа [1,5 M], добавлен 10.06.2013Прикладное программное обеспечение, его использование при проведении сложных математических вычислений. Менеджер загрузок. Офисные средства обработки информации. Система автоматизации проектных работ. Основы использования функций Excel, их аргументы.
контрольная работа [227,6 K], добавлен 01.03.2009Программное обеспечение по автоматизации работы автосервиса. Электронные информационные базы данных по диагностике и ремонту, геометрическим размерам автомобилей. Каталоги запчастей, справочники нормо-часов. Программы для ведения управленческого учета.
реферат [509,0 K], добавлен 23.03.2012