Разработка программных средств формирования групповой спецификации в среде Creo

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 25.09.2014
Размер файла 2,6 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

else

{

teg += fileBuffer [i];

if (teg == "section")

{

positionSectionStart [section] [0] = positionStart;

positionSectionStart [section] [1] = 0;

line++;

sizeAllLine += sizeLine *\ AddLine_BeforeAfter (positionSection10_29, \

&section10_29, &line, kline_before, kline_after, positionSectionStart,section, K, T);

bSection = true;

}

else

if (teg == "line")

{

line++;

if ( (line == K) || ( ( (line-K) %T ==\ 0) && (line > K)))

{

CString copyline;

memcpy (copyline. GetBufferSetLength (sizeLine) \

,&fileBuffer [positionStart],sizeLine);

if (CStringA (copyline)! =\ CStringA (sLine))

{

positionSectionStart [section] [0] = positionStart;

positionSectionStart [section] [1] = 2;

line+=2;

sizeLine10_29 += sizeLine*2;

nline++;

section++;

}

}

if ( (line == (K+1)) || ( ( (line- (K+1)) %T == 0) && (line > (K+1))))

{

CString copyline;

memcpy (copyline. GetBufferSetLength (sizeLine),&fileBuffer\

[positionStart],sizeLine);

if (CStringA (copyline)! = CStringA (sLine))

{

positionSectionStart [section] [0] = positionStart;

positionSectionStart [section] [1] = 1;

line++;

nline++;

sizeLine10_29 += sizeLine;

section++;

}

}

bLine = true;

}

else

if (teg == "stamp")

{

teg = "";

do{

i++;

teg += fileBuffer [i];

if (teg == "kline_before")

{

teg = "";

do{

i++;

if ( (fileBuffer [i] == '\"') && (m_yes_kline == FALSE))

kline_before = atoi (&fileBuffer [i+1]);

}while (fileBuffer [i]! = '\"');

}

else

if (teg == "kline_after")

{

teg = "";

do{

i++;

if ( (fileBuffer [i] == '\"') && (m_yes_kline == FALSE))

kline_after = atoi (&fileBuffer [i+1]);

}while (fileBuffer [i]! = '\"');

}

if (fileBuffer [i] == ' ') teg = "";

// Ищем закрывающий символ элемента stamp

if (fileBuffer [i] == '>')

positionStampBefore = i;

}while (fileBuffer [i]! = '>');

}

}

}

if ( (bSection == true) && (fileBuffer [i] == '>'))

{

positionSectionEnd [section] = i+1;

section++;

}

if ( (bLine == true) && (fileBuffer [i] == '>'))

positionLineEnd = i+1;

}while (fileBuffer [i]! = '>');

bSection = false;

bLine = false;

teg = "";

}

}

DWORD dPage;

// Расщитываем число добавляемых строк

if (GroupSpecification)

{

if (line > 10)

{

dPage = kline = (line - 10) / 19;

kline = line - 10 - kline * 19;

kline =19 - kline; // kline - искомое число строк

}

else kline = 10 - line;

}

else

{

// line содержит общее количество просмотренных строк

if (line > 29)

{

dPage = kline = (line - 29) / 32;

kline = line - 29 - kline * 32;

kline =32 - kline; // kline - искомое число строк

}else kline = 29 - line;

}

DWORD sizeLine_after = sizeLine * kline_after;

char *line_after = new char [sizeLine_after];

char sTemp [7];

itoa (dPage+2,sTemp,10);

CString sKPage;

sKPage = " kpage=\""; sKPage+= sTemp; sKPage+= "\"";

for (DWORD i = 0; i<sizeLine_after; i+= sizeLine)

memcpy (&line_after [i],sLine,sizeLine);

// Расчёт размера нового файла.

// Размеры: текущего файла, добавляемых линий до и после секций,

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

// строк добавляемых для переноса line на новый лист

DWORD fileSizeNew = fileSize + sizeAllLine + kline*sizeLine+sKPage. GetLength () +\ sizeLine10_29;

// Выделение блока оперативной памяти для нового файла

char *fBuffer = new char [fileSizeNew];

memcpy (fBuffer,fileBuffer,fileSize);

// Включаем в тег stamp, атрибут kpage содержащий кол-во листов в документе

memcpy (&fBuffer [positionStampBefore1], (CStringA) sKPage. GetBuffer (),\

sKPage. GetLength ());

memcpy (&fBuffer [positionStampBefore - 1 +\

sKPage. GetLength ()],&fileBuffer [positionStampBefore-1],fileSize - \

positionStampBefore-1);

DWORD size3 = sKPage. GetLength ();

unsigned int t = 0, k = 0;

for (DWORD j = 0; j<section; j++)

{

// Если это позиция названия раздела

if (positionSectionStart [j] [1] == 0)

{

for (k = 0; k<positionSectionStart [j] [2]; k++)

{

memcpy (&fBuffer [positionSectionStart [j] \

[0] +size3],sLine,sizeLine);

size3 += sizeLine;

}

if ( (j == positionSection10_29 [t] [0]) && (section10_29! = - \

1) && ( (t<=section10_29)))

{

for (k = 0; k<positionSection10_29 [t] [1]; k++)

{

memcpy (&fBuffer [positionSectionStart [j] [0] +\

size3],sLine,sizeLine);

size3 += sizeLine;

}

t++;

}

memcpy (&fBuffer [positionSectionStart [j] [0] +size3],\

&fileBuffer [positionSectionStart [j] [0]],fileSize - positionSectionStart [j] [0]);

memcpy (&fBuffer [positionSectionEnd [j] +size3] \

,line_after,sizeLine_after);

size3 += sizeLine_after;

memcpy (&fBuffer [positionSectionEnd [j] +size3],\

&fileBuffer [positionSectionEnd [j]],fileSize - positionSectionEnd [j]);

}

else // Если это первая или последняя строка таблицы

{

for (k = 0; k<positionSectionStart [j] [1]; k++)

{

memcpy (&fBuffer [positionSectionStart [j] [0] +size3],\

sLine,sizeLine);

size3+=sizeLine;

}

memcpy (&fBuffer [positionSectionStart [j] [0] +size3],\

&fileBuffer [positionSectionStart [j] [0]],fileSize - positionSectionStart [j] [0]);

}

}

// Дописываем строки в конце файла XML

for (DWORD k = 0; k < kline; k++)

{

memcpy (&fBuffer [positionLineEnd+size3],sLine,sizeLine);

size3+=sizeLine;

}

memcpy (&fBuffer [positionLineEnd+size3],&fileBuffer [positionLineEnd],\

fileSize - positionLineEnd);

// Формируем имя промежуточного файла

CString strPartDir;

strPartDir = "temp\\";

strPartDir += sPartDir;

strPartDir += "xml";

HANDLE hFileWrite = CreateFile (strPartDir,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);

if (hFileWrite == INVALID_HANDLE_VALUE)

{

FreeBuffer (fileBuffer,fBuffer,positionSectionStart,\

positionSection10_29,line_after,counter);

return true;

}

DWORD bufferWrite;

bReadWriteError = WriteFile (hFileWrite,fBuffer,fileSizeNew,&bufferWrite,0);

if ( (hFileWrite == INVALID_HANDLE_VALUE) || (! bReadWriteError))

{

FreeBuffer (fileBuffer,fBuffer,positionSectionStart,\

positionSection10_29,line_after,counter);

CloseHandle (hFileWrite);

return true;

}

CloseHandle (hFileWrite);

FreeBuffer (fileBuffer,fBuffer,positionSectionStart,\

positionSection10_29,line_after,counter);

delete [] positionSectionEnd;

return false;

}

// Функция определяющая количество строк добавляемых до и после элементов // section

DWORD CXMLСonverterDlg:: AddLine_BeforeAfter (DWORD **positionSection10_29, DWORD *section10_29,DWORD *line,DWORD kline_before, DWORD kline_after, DWORD **positionSectionStart,DWORD section, DWORD K, DWORD T)

{

// ---------------------------------------------------------------------

// К - количество строк на первой странице спецификации

// Т - количество строк на 2й и последующих страницах спецификации

// ---------------------------------------------------------------------

positionSection10_29 [ (*section10_29) +1] [1] = - 1;

bool yes = false;

for (DWORD k = 0; k < kline_before + 1; k++)

{

// Если секция может попасть на вторую строку листа, уменьшаем отступ на // необходимое кол-во строк

if ( ( (*line) + k == 2) || ( (*line) + k == (K+2)) || ( ( ( (*line) + k - \

(K+2)) % T == 0) && ( ( (*line) + k) > (K+2))))

{

positionSectionStart [section] [2] = k;

yes = true;

break;

}

}

// Если не нужно изменять количество строк, принимаем указанное число

if (! yes) positionSectionStart [section] [2] = kline_before;

// Увеличиваем счётчик строк на количество добавляемых строк перед секцией

*line += positionSectionStart [section] [2];

// Содержит кол-во добавляемых строк для переноса section на другой лист

DWORD nSection10_29 = 0;

for (DWORD k = 0; k < kline_after + 2; k++)

{

// Проверяем не попала ли секция в конец листа спецификации

if ( ( ( (*line) +k) == K) || ( ( ( ( (*line) +k-K) %T) == 0) && ( ( (*line) +k) > K)))

{

(*section10_29) ++;

positionSection10_29 [*section10_29] [0] = section;

positionSection10_29 [*section10_29] [1] = k + 2;

// Должны быть добавлены как минимум 2 строки

nSection10_29 += k + 2;

*line += k + 2;

break;

}

}

// Проверяем не попала ли секция в начало листа спецификации

if ( (*line == 1) || (*line == (K+1)) || ( ( ( (*line) +k - \

(K+1)) %T==0) && ( ( (*line) +k) > (K+1))))

{

(*section10_29) ++;

positionSection10_29 [*section10_29] [0] = section;

positionSection10_29 [*section10_29] [1] = k + 1;

nSection10_29 += k + 1;

*line += k + 1;

break;

}

// Увеличиваем счётчик строк, на количество добавляемых строк после секции

*line += kline_after;

// Возвращаем общее число добавляемых строк (до и после элемента section)

return positionSectionStart [section] [2] + kline_after + nSection10_29;

}

void CXMLСonverterDlg:: FreeBuffer (char *fileBuffer,char *fBuffer,\

DWORD **positionSectionStart,DWORD **positionSection10_29,char *line_after,\ DWORD counter)

{

delete [] line_after;

delete [] fileBuffer;

delete [] fBuffer;

for (DWORD n=0; n<counter; n++)

{

delete [] positionSectionStart [n];

delete [] positionSection10_29 [n];

}

}

DWORD CXMLСonverterDlg:: Counter_of_lines (char *fileBuffer,DWORD fileSize,\

DWORD K, DWORD T)

{

DWORD counter_line = 0;

for (DWORD i = 0; i<fileSize; i++)

{

if (fileBuffer [i] == '<')

{

counter_line++;

}

}

return counter_line;

}

Приложение С

ПЕРВАЯ СТРАНИЦА ГРУППОВОЙ СПЕЦИФИКАЦИИ, ПРЕДСТАВЛЕННОЙ В ФОРМАТЕ PDF

Приложение D

ВТОРАЯ СТРАНИЦА ГРУППОВОЙ СПЕЦИФИКАЦИИ, ПРЕДСТАВЛЕННОЙ В ФОРМАТЕ PDF

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.