3. Возможности программного пакета.

·     представленная на рассмотрение программа способна обрабатывать pdf-файлы (полученные программой pdifout.exe) в формате PCAD4.5, PCAD7, PCAD8 - т.е. со всеми версиями PCAD, применяемыми на данный момент - и обеспечивает передачу данных независимо от версии PCAD;

·     программа создает постоянно пополняющуюся в процессе работы базу данных, в которую заносятся основные атрибуты: имя ptr-файла элемента, его длина, высота, ширина, точка привязки и т.п.

·     программа создает файлы-фрагменты T-FLEX, которые представляют собой графический образ платы (содержащейся в анализируемом pdf-файле) в трехмерном виде (изометрии), что позволяет визуально оценить ее объемный размер и принять решения по разработке деталей и оснастки, с которыми связаны размеры этой платы; пользователь по своему желанию может задать ограничения на высоту элементов по верхней и нижней стороне платы, а элементы, выходящие за эти ограничения, будут выделены в T-FLEX красным цветом;

·     программа создает файлы-фрагменты T-FLEX, которые представляют собой графический образ платы (содержащейся в анализируемом pdf-файле) в двухмерном виде (плоском): спереди, сзади, справа, слева, сверху и снизу - что позволяет разработчику загрузить такой вид вместе с соответствующим видом корпуса и визуально проследить соответствие размеров;

·     программа имеет возможность, по желанию пользователя, подготовить перечень элементов по форме документа, содержащихся на анализируемой плате, в виде стандартного dbf-файла (для передачи на оформление текстовых документов и другую обработку);

·     программа изображает все элементы на плате, используя прилагаемую к ней графическую библиотеку в формате T-FLEX, в виде параллелепипедов с реальными размерами по высоте, длине, ширине и местоположением на плате (возможно создание подробной графической библиотеки на все элементы, что позволит абсолютно точно передавать их графический образ).

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 &parametr //открытие б.д.

FOR nom=1 TO nom2

 APPEND BLANK

 REPLACE &nfill1 WITH compon[nom,1]

 REPLACE &nfill2 WITH compon[nom,2]

 REPLACE &nfill3 WITH compon[nom,3]

 REPLACE &nfill4 WITH compon[nom,4]

 REPLACE &nfill5 WITH compon[nom,5]

NEXT

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

RETURN

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

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

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

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

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

 FOR L:=1 TO st0

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

IF compon[L,2]='bot'

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

 стороны

 ENDIF

 NEXT

 tkont2:=kontur[2]

 tkont4:=kontur[4]

 kontur[2]=-10

 kontur[4]=kontur[2]

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

 IF kolkomp>0

 SETPOS(MAXROW()-1,0)

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

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

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

 ??nn

 ENDIF

 kontur[2]=tkont2

 kontur[4]=tkont4

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

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

 IF compon[L,2]='bot'

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

 стороны

 ENDIF

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

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

 NEXT

RETURN

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

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

newarg:=argum*argum

RETURN newarg

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

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

#include 'CH\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

 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

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

 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 платы в изделии).

Задание: Эргономичность диалогового взаимодействия.

Введение.

Эргономика представляет собой научную дисциплину, комплексно изучающую человека в конкретных условиях его деятельности. Возникшая на стыке общественных, технических и естественных наук, она является одновременно и проектной, и научной дисциплиной. Эргономика, используя фундаментальные знания наук о человеке адаптирует их к практическому применению в проектировании. В последние годы активно разрабатываются собственные методологические принципы, методы и процедуры исследований. Объектом исследований является система человек- машина-среда. Рассматривая человека, машину и среду в конкретных условиях их взаимодействие как сложное функциональное целое с ведущей ролью человека, специалисты по эргономике разрабатывают методы учета человеческого фактора при проектировании и создании техники, критерии оптимизации систем и человеческой деятельности.

Эргономичность диалогового взаимодействия.

Опорным моментом, организующим всю систему психологических процессов и состояний, включенных в деятельность, является цель деятельности. Она определяет характер селекции информации в восприятии, в процессах памяти, внимания и т.д.

Из далеко не полностью описанных психологических характеристик и св-в человека следует, что психические процессы в каждых конкретных условиях протекают специфическим образом , они изменчивы и вариативны по своей природе, и поэтому их необходимо рассматривать в рамках системного подхода как процессы сложные, динамические и многоуровневые.

Психологическое изучение информационного взаимодействия человека с видеотерминалами только начинаемся. Наряду с такими традиционными проблемами, как изучение особенностей восприятия человеком информации возникает и ряд новых проблем: особенности использования различных языков обмена информацией, способы их построения, организация диалога и т.п.

Диалог признается перспективной формой взаимодействия человека с терминалом, где взаимодействие представляет собой двухсторонний обмен информацией в виде команд, просьб, вопросов- ответов и сообщений различных видов. Обмен сообщениями происходит на языке, который можно варьировать от сложного языка программирования до простого языка команд.

Языков программирования и их диалектов насчитывается по крайней мере несколько сотен, но только несколько десятков из них имеют широкое распространение. У каждого языка есть свои грамматика и синтаксис, собственная манера выражения понятий. Практика показывает что определенную вычислительную задачу на одном языке написать гораздо проще, чем на другом. Отсюда и выбор языка программирования должен определяться целями его предполагаемого применения.

Языки, используемые на дисплее, часто применяют в кодированном или сокращенном варианте, и в отличии от естественного языка они не обладают избыточностью. По этой причине пропуск, замена, или забывание кодов приводят к ошибкам в работе. Кроме того следует учесть, что неопытным операторам к различным сообщениям необходимы объяснения. Структура диалога является одним из факторов, обуславливающих эффективность взаимодействия с дисплеем. Она должна быть различной, для разных видов пользователя. Одним из подходов к конструированию диалогового языка, при котором языковые средства удовлетворяют требования опытного и неопытного пользователей, считается следующий: пользователь должен иметь возможность для выбора предела любого соотношения от ЭВМ, т.е. возможность получать дополнительные сообщения, когда ему это необходимо. Чем проще язык диалога, чем меньше его приходиться изучать новичку, чем удобнее его применять, тем шире круг пользователей.

Другим фактором, определяющим эффективность взаимодействия, является время срабатывания системы, т.е. время ответа на запросы или команды пользователя. По мнению Р. Миллера время ожидания в режиме диалога не должно превышать 2с. Но эта рекомендация не универсальна, т.к. в зависимости от разных систем и функций необходимое время ответа может быть разным. При чтении информации с экрана с “перелистыванием” время смены страниц должно быть не более одной секунды, чтобы не нарушать непрерывность мысленного процесса. Для переключения внимания с клавиатуры на экран необходимо около 1.5 с, поэтому 2-х секундная задержка ответа при вводе с клавиатуры нормальна.

Эффективность диалога зависит и от соответствующих устройств ввода- вывода информации. Разработка таких устройств должна основываться на результатах экспериментальных исследований не только аппаратных, но и программных средств, ибо именно совокупность программных и аппаратных средств является функционально завершенными средствами деятельности пользователя.

На основе экспериментальных данных выдвигаются следующие психологические требования и рекомендации к дисплею.

Психологические требования предъявляются к знаковой информации, выводимой на дисплей, и направлены на оптимизацию ее представления с позиций оптимизации кодирования, значимости и смысловой нагрузки сообщения, обеспечения максимальной скорости переработки информации при максимальной надежности ее понимания, оптимизация структурного представления текстовых и графических сообщений, правильной организации диалога с учетом свойств восприятия, памяти и мышления человека.

 Скорость передачи информации человеку должна не превышать его пропускной способности и быть достаточной для поддержания преобразования поступающей информации.

 Максимальный объем информации, отображаемой на экране, должен определяться скоростью опознания и интерпретации предъявляемых сигналов, а также временем их восприятия. Если объем информации превышает возможности человека, ее следует передавать порциями. Каждая порция должна быть равна оперативной памяти оператора, а интервалы должны быть достаточными для преобразования поступающей информации.

Чтобы не перегружать оперативную память человека-оператора следует исключить:

·     одновременный учет трех-четырех различных значений текущих параметров при операциях обслуживания;

·     сопоставление в уме более трех логических условий;

·     вычисления или перевод в уме с той или иной величины в другие единицы или системы отсчета;

·     дополнительное перекодирование предъявляемой информации.

Требования предъявляемые к сообщению.

 Сообщение должно содержать лишь те элементы, которые играют существенную роль в выполнении задач, поставленных перед оператором.

 В сообщении необходимо выделять каким-либо способом (цветом, размером) те элементы, которые наиболее важны для контроля и управления системой.

 Каждая часть сообщения, соответствующая автономно управляемому объекту, должна иметь четкую, легко воспринимающуюся структуру, отличную от других и отражающую особенности этого объекта. Структурированные данные в виде групп обеспечивают более точное и быстрое их обнаружение и опознание.

 При кодировании сообщений следует использовать простые и привычные ассоциации, сложившиеся между знаками и обозначаемыми объектами.

 Каждый из признаков сообщения должен находиться во взаимооднозначном соответствии с кодируемыми характеристиками объекта.

Для каждого типа задач требуется адекватная система знаков. При большой нагрузке на оперативную память эффективнее буквенно-цифровое кодирование. Цветом лучше кодировать местоположение стимула. Мелькание служит для привлечения внимания оператора к определенным параметрам, у которых изменилось состояние, или которые требуют выполнения определенных действий. Обычно используют не более двух частот вспышек на одном дисплее. Выделение отдельных областей на графиках можно закодировать штриховкой, полутонами, цветом. Отдельные графические объекты могут быть выделены толщиной линий.

Способы кодирования довольно разнообразны и каждый из них должен быть рассмотрен исходя из всех особенностей конкретной ситуации.

Текст - широко распространенный способ передачи информации. Скорость и точность его восприятия зависят от характеристик букв, интервалов между ними и словами, от длины строк и интервалов между строками. При выборе начертания букв следует учитывать различимость не только каждой из них, но и алфавита в целом.

Шрифт должен быть экономичным, простым и понятным. Для каждого шрифта существует определенная оптимальная длина строки. Слишком длинную строку трудно удержать в поле зрения и порой нелегко найти начало следующей строки. При чтении же коротких строк иногда трудно уловить смысл текста, разбитого на мелкие части. Удобнее для чтения такая длина строки, когда фиксация ее центра позволяет периферическим зрением охватить всю строку.

Пробелы между буквами следует устанавливать с учетом формы соседних знаков, размера, плотности и насыщенности шрифта. Зрительно одинаковые пробелы между буквами и словами дают возможность читателю сохранять определенный ритм чтения, с увеличением межстрочных пробелов улучшается читаемость включенных в текст формул.

Логограммы должны быть краткими, но достаточно понятными, благозвучными, не вызывать нежелательных ассоциаций, легко усваиваться, запоминаться и читаться.

Выбор формата текста на экране диктуется размерами экрана. Точность и скорость считывания буквенно- цифровых знаков существенно не меняются при изменении преобладании ширины над высотой формата и наоборот.

Понимание содержания текста зависит от того, насколько оператор владеет языком и той областью знаний к которой относится воспринимаемый текст.

График — графическое изображение функциональных зависимостей. Способ отображения функциональной зависимости ломаной линией лучше по скорости и точности передачи информации по сравнению с графиками в виде вертикальных и горизонтальных столбцов. Когда необходимо сравнить несколько функций, то целесообразнее прибегнуть к многолинейному графику, т.е. на одном графике отражать несколько функциональных зависимостей (но не более 4-х) , чем использовать несколько однолинейных графиков.

На многолинейном графике необходимо ввести различительные признаки линий для безошибочного их восприятия. Различием линий по толщине и тону пользуются для акцентирования одной кривой из семейства однородных кривых. Чаще всего применяется различное начертание линий. Линии на графике, с нанесенными на них крестиками, кружками, квадратами, и треугольниками различить легче, чем линии с внутренней структурой или составленные из однородных элементов (штрихов, точек и т.д.).

Точность определения требуемых величин повышается при нанесении на график координатной сетки. Линии, образующие координатную сетку должны отличаться от линий графика толщиной, цветом или типом.

Таблицы — как способ представления информации на дисплее используются в тех случаях, когда имеется достаточное пространство и не требуется интерполяции данных. Хотя скорость передачи информации графиками выше, чем таблицами, но когда важна точность, эффективнее использовать таблицы.

Скорость и точность считывания табличных данных зависят от их пространственной организации. Столбцы цифровой информации целесообразно разделять между собой вертикальными линиями, причем толщина линий не должна превышать толщину штрихов цифр. Дополнительное кодирование (цветом, размером, яркостью) повышает эффективность счета и сравнения величин.

Если сложная инструкция описательного вида (слова, фразы) переводится в форму таблицы, то она должна изображаться согласно логической последовательности действий и исключать необходимость в добавочных арифметических действиях.

Диалог — непосредственный и оперативный обмен сообщениями - требует развитых средств коммуникации. Выбор вида диалога должен обосновываться характером и типом решаемых задач и квалификацией пользователя.

Процедура диалога должна предусматривать удобство приема информации, содержать минимальное число шагов и этапов, минимизировать погрешности и отказы, обеспечивать легкое вхождение пользователя во все существенные этапы диалога, включать автоматическую переработку большей части информации. Для успешного диалога необходимо знать используемый язык. Сообщения и ответы должны иметь четкую и однозначную форму, чтобы не вызывать разночтений.

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

Организация диалогового режима должна быть гибкой и обеспечивать многократный доступ к отдельным частям программы, а также систему подачи сообщений об ошибках. Организация данных на экране дисплея должна предусматривать возможность зонирования экрана, изменение масштаба изображения, поворот и сдвиг изображения, изменение положения начала координат и т.п.

Работу человека в диалоговом режиме необходимо организовывать так, чтобы сохранить его активность при управлении ходом решения задач, предоставлять ему определенную степень свободы при выборе того или иного способа выполнения задания, формы представления данных, автоматизировать рутинные компоненты деятельности, т.е. сделать работу человека по возможности многосторонней и творческой.

Эргономичность интерфейса разработанной программы.

Учитывая важность эргономичной организации диалога пользователя с дисплеем интерфейс предлагаемой программы разрабатывался с учетом всех выше описанных требований и рекомендаций. Несмотря на то, что обращение с программой не требует от пользователя большого опыта и больших умственных усилий ее внешний вид и организация диалога сделана для обеспечения наибольшего удобства и комфорта.

Так, пункты меню предлагаются пользователю в виде объемных кнопок и при выборе одного из них на экране происходит нажатие соответствующей кнопки. Это вызывает ассоциации работы с обычным кнопочным прибором и поэтому не отнимает времени пользователя на то, чтобы разбираться в организации меню.

Несмотря на технические трудности (язык, на котором написана программа не предусматривает русского алфавита) весь ход выполнения программы сопровождается сообщениями и пояснениями на русском языке, выраженными в краткой и понятной форме. Из программы исключены все сокращения (в названиях пунктов меню и сообщениях), которые могут ввести пользователя в заблуждение, приложены все старания для придания диалогу предельно понятной и краткой формы.

В программе действует “защита” от неопытного пользователя, т.е. когда пользователю предлагается ввести какую-либо информацию или ответить на вопрос, то это организовано так, что ввод данных в неверной форме просто не возможен. Например при запросе ввода даты не работают никакие клавиши, кроме цифровых, и при вводе числа месяца не воспринимаются числа больше двенадцати.

При подборе цветовой палитры учитывалось, что пункты меню и строки сообщений должны не только ярко выделяться на фоне рабочего поля, но и не перегружать зрение пользователя чрезмерной контрастностью.

Ниже предлагается один из видов рабочего поля предлагаемой программы.

Итак, учитывая все вышесказанное, можно сделать вывод, что разработанная программа удовлетворяет всем требованиям организации эргономичного диалога между пользователем и машиной, и можно надеяться, что работа с ней принесет удовольствие пользователю.


Информация о работе «Разработка программного обеспечения»
Раздел: Информатика, программирование
Количество знаков с пробелами: 89120
Количество таблиц: 0
Количество изображений: 5

Похожие работы

Скачать
147348
16
12

... недостаточно). Возможно включение комплекса в план учебного процесса, для обучения студентов. 2. Специальная часть разработка программного обеспечения для организации интерфейса программно-методического комплекса   2.1 Разработка технического задания на реализацию специальной части дипломного проекта Наименование программного изделия - "Интерфейс программно - методического комплекса для ...

Скачать
33122
0
3

... не гарантирует соблюдения сроков - они могут быть сорваны, например, в случае резкого сокращения бюджета или серьезного изменения требований. Общие характеристики этапов разработки программного обеспечения Этап планирования и анализа требований Цель: - получение требований ; - выработка производных от них требований для этапа оценки безопасности. Входные данные: - требования к системе, ...

Скачать
151086
8
13

... пользоваться и которая не подведет; - операционная система Windows XP Home Edition более удобная и более быстрая. 2. Разработка компьютерной сети на предприятии по разработке программного обеспечения 2.1 Постановка задачи Необходимо разработать локальную сеть из 70 компьютеров. Выбор технологии подключения к Интернет произволен. Удаленный участок сети необходимо разместить в диаметре 1 ...

Скачать
117942
2
4

... обращений к реестру были проконтролированы при помощи Registry Monitor от Sysinternals Corp. 4.4 Описание программы Автоматизированная система для оценки уровня знаний студентов с применением технологии «Клиент-сервер» предназначена для проведения централизованных итоговых занятий по разным дисциплинам в виде интерактивного тестирования. Данный проект поддерживает совместимость с пакетом ...

0 комментариев


Наверх