Содержание блога

воскресенье, 26 декабря 2010 г.

JQuery

Получить элемент на форме
$commList.=" <script type=\"text/javascript\">
function sendEdComm".$comm_id."()
{
 var comtxt=$('#form_".$comm_id." #cmted_".$comm_id."').val();
 $('#form_".$comm_id." #cmtText').val('qwe');
 alert(comtxt);
}
</script>";

пятница, 22 октября 2010 г.

Создаем файл формата DXF

Пример файла с полилинией у которой 5 точек (четыре на высоте 200 и одна на высоте 400)
0
SECTION
  2
ENTITIES
  0
POLYLINE
  8
0
 66
     1
 70
     8
 10
681.762
 20
111.997
 30
200.000
 40
1.#QO
 41
1.#QO
  0
VERTEX
  8
0
 10
681.762
 20
111.997
 30
200.000
 70
    32
  0
VERTEX
  8
0
 10
699.637
 20
133.224
 30
200.000
 70
    32
  0
VERTEX
  8
0
 10
736.783
 20
141.603
 30
200.000
 70
    32
  0
VERTEX
  8
0
 10
792.921
 20
136.855
 30
400.000
 70
    32
  0
VERTEX
  8
0
 10
839.564
 20
164.226
 30
200.000
 70
    32
  0
SEQEND
  0
ENDSEC
  0
EOF

пример вывода линии
0
SECTION
 2
ENTITIES
 0
LINE
 8
0
 10
100.0
 20
100.0
 30
100.0
 11
200.0
 21
200.0
 31
300.0
  0
ENDSEC
  0
EOF


Материал из какой-то книжки(кто знает автора сообщите, добавлю):


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

 C.3.1 Общая структура файла
 Файл обмена  чертежами представляет  собой обычный  текстовый файл типа  ".DXF" в  кодах ASCII,  в котором находится текстовая информация в  специально заданном  формате. Файл DXF организован следующим образом:
 1.   Раздел ЗАГОЛОВКА  /HEADER/ -  В данном  разделе  файла  DXF содержится общая  информация  о  чертеже.  Каждый  параметр  имеет имя переменной и соответствующее ей значение.
 2.   Раздел  ТАБЛИЦ  /TABLES/  -  В  данном  разделе  содержатся определения именованных элементов.

  • Таблица типов линий (LTYPE)
  • Таблица слоев
  • Таблица типов шрифтов
  • Таблица видов
 3.   Раздел  БЛОКОВ  /BLOCKS/  -  В  данном  разделе  содержатся графические примитивы определений блоков, которые описывают примитивы, входящие в состав каждого блока изображения.
 4.   Раздел ПРИМИТИВОВ  /ENTITIES/ - В данном разделе содержатся графические примитивы  чертежа,  включая  любые  ссылки  на блоки.
 5.   КОНЕЦ ФАЙЛА
 Если вы используете опцию "Entities" команды DXFOUT, выходной DXF файл  будет содержать только секции ПРИМИТИВЫ и КОНЕЦ ФАЙЛА, а раздел  ПРИМИТИВЫ будет  отражать только  выбранные  вами  для вывода примитивы. Файл DXF  состоит  из  множества  групп,  каждая  из  которых занимает две строки в файле DXF. В первой строке размещается код группы, который представляет собой положительное ненулевое целое число, имеющее  формат "I3"  языка ФОРТРАН  (то есть выровненное вправо число,  заполненное  пробелами  в  трехсимвольном  поле).
 Вторая строка группы представляет собой значение группы, имеющее формат,  который  зависит  от  типа  группы,  задаваемого  кодом группы.
 Присвоение  кодов   групп  зависит  от  того,  какой  элемент описывается в  файле. Тип  значения, которое  дает  эта  группа, определяется из кода группы следующим образом:
   Диапазон кодов группы   Соответствующее значение
   0 - 9 Строковое
   10 - 59  С плавающей запятой
   60 - 79  Целое
 Таким образом,  программа  может  легко  прочитать  значение, соответствующее коду  группы, не  имея информации  о  конкретном использовании этой  группы в элементе файла. Форма представления значений в  файле DXF  не  зависит  от  установки  параметров  в команде  UNITS:   координаты  всегда   представляются   в   виде десятичных чисел  (или если они очень большие, то в виде научных обозначений), а  углы всегда  представляются в  виде  десятичных градусов, причем  отсчет ведется  от направления  на  восток  от начала координат.
 Переменные, точки  входа в  элементы  таблицы  и  графические примитивы описываются  с помощью  группы,  которая  представляет элемент,  задавая   его  тип   и/или  имя,  после  чего  следуют многочисленные  группы,  которые  представляют  собой  значения, связанные с этим элементом. Кроме того, для разделителей файлов, таких как  метки конца и начала разделов, таблиц и самих файлов, используются специальные группы. Графические примитивы,  точки входа  в таблицы  и разделители файлов всегда  вводятся с  помощью группы  0, за которой следует имя, описывающее элемент.

 C.1.3.2 Коды группы
 Коды группы  используются для  указания типа значения группы, как пояснялось  выше, и  для указания  общего назначения группы. Специальная  функция   кода  группы   зависит   от   фактической переменной,   элемента   таблицы   или   описания   графического примитива. В  данном разделе  указано  общее  назначение  групп, причем те,  которые всегда  выполняют  одну  и  ту  же  функцию, отмечены словом "(фиксированный)".
 0  Устанавливает начало  графического примитива, входа в  таблицу, или же разделителя файлов. О чем именно идет  речь, указывает следующее за ним текстовое значение.
 1  Первичное   текстовое   значение   для   графического  примитива.
 2  Имя; описатель атрибута, имя блока, и т.д.
 3-5   Другие текстовые или именованные значения.
 6  Имя типа линии (фиксированное).
 7  Имя типа текстового шрифта (фиксированное).
 8  Имя слоя (фиксированное).
 9  Идентификатор имени переменной (используется только в  разделе ЗАГОЛОВОК файла).
 10 Первичная координата  Х (начальная  точка  линии  или  текстового графического примитива, центр окружности и  т.д.).
 11-18 Другие координаты Х.
 20 Первичная координата  Y. Значения  второй  координаты  всегда соответствуют  значениям первой  координаты  и  следуют непосредственно за ними в файле.
 21-28 Другие координаты Y.
 30 Первичная координата  Z. Значения  третьей координаты  всегда  соответствуют   значениям  первой   и  второй  координат и следуют непосредственно за ними в файле.
 31-36 Другие координаты Z (в будущем).
 38 Если ненулевое  значение, то  это подъем графического  примитива (фиксированное).
 39 Если ненулевое  значение, то это таблица графического  примитива (фиксированное).
 40-48 Значения  с   плавающей   запятой   (высота   текста,  масштабные коэффициенты и т.д.).
 49 Повторное значение  - многократные  группы  49  могут  попадаться в  одном графическом  примитиве для таблиц  переменной длины  (таких как  длины штрихов в таблице  LTYPE).  Для   задания  длины  таблицы  перед  первой  группой 49 всегда предусматривается группа 7х.
 50-58 Углы.
 62 Номер цвета (фиксированное).
 66 Флажок "Далее идут графические примитивы"  (фиксированное).
 70-78 Целочисленные   значения, такие   как   количество  повторений, биты флажков, или режимы.
 Файл DXF  состоит из четырех разделов. Для разграничения этих разделов используются  группы разделителей файлов. Далее следует пример незаполненного  файла DXF,  в котором присутствуют только метки разделов и заголовки таблиц.
 0  (Начало раздела HEADER)
 SECTION
 2
 HEADER
 <<<<Здесь идут элементы переменных раздела HEADER>>>>
 0  (Конец раздела HEADER)
 ENDSEC  (Начало раздела TABLES)
 0
 SECTION
 2
 TABLES
 0
 TABLE
 2
 LTYPE
 70
 (Максимальное количество элементов таблицы типов линий)
 <<<<Здесь идут элементы таблицы типов линий>>>>
 0
 ENDTAB
 0
 TABLE
 2
 LAYER
 70
 (Максимальное число элементов таблицы слоев)
 <<<<Здесь идут элементы таблицы слоев>>>>
 0
 ENDTAB
 0
 TABLE
 2
 STYLE
 70
 (Максимальное число элементов таблицы текстовых шрифтов)
 <<<<Здесь идут элементы таблицы текстовых шрифтов>>>>
 0
 ENDTAB
 0
 TABLE
 2
 VIEW
 70
 (Максимальное число элементов таблицы видов)
 <<<<Здесь идут элементы таблицы видов>>>>
 0
 ENDTAB
 0
 ENDSEC  (Конец раздела TABLES)
 0   (Начало раздела BLOCKS)
 SECTION
 2
 ENTITIES
 <<<<Здесь идут примитивы чертежа>>>>
 0
 ENDSEC  (Конец раздела ПРИМИТИВЫ)
 0
 EOF   (Конец файла)

 C.1.3.3 Раздел ЗАГОЛОВОК
Раздел ЗАГОЛОВОК  (HEADER) файла  DXF  содержит  установочные значения  для  переменных,  которые  непосредственно  связаны  с чертежем. Эти  переменные устанавливаются  с  помощью  различных команд  и   относятся  к   такому   виду   информации,   который отображается  на   дисплее  с  помощью  команды  STATUS.  Каждая переменная указывается  в разделе  заголовка с помощью группы 9, задающей ее  имя, после  чего следуют  группы,  определяющие  ее значение. Переменные заголовка, последующие группы и их значения приведены в данной таблице.
 $ACADVER   1(номер версии системы AutoCAD)
 $ANGBASE   50(угол направления ноль)
 $ANGDIR 70(1=углы по часовой, 0=против часовой)
 $ATTMODE   70(видимость атрибута: 0=нет; 1=нормальная; 2=все)
 $AUNITS 70(формат UNITS для углов)
 $AUPREC 70(точность UNITS для углов)
 $AXISMODE  70(если значение не равно нулю, то  оси включены)
 $AXISUNIT  10 и 20(разметка осей Х и Y)
 $BLIPMODE  70(если значение не равно нулю, то "включение" режима  отметки на экране)
 $CECOLOR   62(номер цвета примитива; 0=BYBLOCK, 256=BYLAYER)
 $CELTYPE   6(имя типа линии примитива, или BYBLOCK или BYLAYER)
 $CHAMFERA  40(первый параметр фаски)
 $CHAMFERB  40(второй параметр фаски)
 $CLAYER 8(имя текущего слоя)
 $COORDS 70(0=статическое отображение координат, 1=непрерывное  обновление, 2="d<a" формат)
 $DIMALT 70(если  не   ноль,  размерность   в   альтернативных  единицах)
 $DIMALTD   70(число десятичных знаков для альтернативных единиц)
 $DIMALTF   40(масштабный коэффициент альтернативных единиц)
 $DIMASZ 40(величина размерной стрелки)
 $DIMBLK 2(имя блока стрелки)
 $DIMCEN 40(размер центровых меток/линий)
 $DIMDLE 40(продолжение линии размерности)
 $DIMDLI 40(увеличение размерной выносной линии)
 $DIMEXE 40(продолжение выносной линии)
 $DIMEXO 40(смещение выносной линии)
 $DIMLFAC   40(масштабный коэффициент линейных размеров)
 $DIMLIM 70(если не  равно  нулю,  то  вырабатываются  пределы  размеров)
 $DIMRND 40(значение округления для расстояний размера)
 $DIMSCALE  70(масштабный коэффициент габаритных размеров)
 $DIMSE1 70(если не  равно  нулю,  то  первая  выносная  линия  подавляется)
 $DIMSE2 70(если не  равно  нулю,  то  вторая  выносная  линия  подавляется)
 $DIMTAD 70(если не  равно нулю,  то текст  располагается  над  размерной линией)
 $DIMTIH 70(если не  равно нулю,  то текст  располагается  под  горизонталью)
 $DIMTM  40(отрицательный допуск)
 $DIMTOH 70(если не  равно нулю,  то текст  располагается  над  горизонталью)
 $DIMTOL 70(если не  равно  нулю,  то  вырабатываются  допуски  размеров)
 $DIMTP  40(положительный допуск)
 $DIMTSZ 40(задание размеров  штриховой  разметки:  0=разметки  нет)
 $DIMTXT 40(задание высоты размерностей текста)
 $DIMZIN 70(если не нуль, включать нулевые дюймы в текст)
 $DRAGMODE  70(0=выключено, 1=включено, 2=автоматическое)
 $DRAGP1 70(скорость   съема   ввода   для   трансформации   с  регенерацией)
 $DRAGP2 70(скорость съема ввода для быстрой трансформации)
 $ELEVATION 40(установка текущего подъема с помощью команды ELEV)
 $EXTMAX 10 и 20(правый верхний угол пределов чертежа)
 $EXTMIN 10 и 20(левый нижний угол пределов чертежа)
 $FASTZOOM  70(0=выключено, 1=включено)
 $FILLETRAD 40(радиус сопряжения)
 $FILLMODE  70(если не равно нулю, то "включение" режима FILL)
 $GRIDMODE  70(если не равно нулю, то "включение" режима GRID)
 $GRIDUNIT  10 и 20(размещение координатной сетки по осям Х и Y)
 $HIGHLIGHT 70(1=подсвечивать  выбранные  объекты,  2=не  подсвечивать)
 $INSBASE   10 и  20(установка базы  вставки  с  помощью  команды  BASE)
 $LIMCHECK  70(не равно нулю, если "включена" проверка пределов)
 $LIMMAX 10 и 20(правый верхний угол границ чертежа)
 $LIMMIN 10 и 20(левый нижний угол границ чертежа)
 $LTSCALE   40(глобальный масштаб типа линии)
 $LUNITS 70(формат команды UNITS для координат и расстояний)
 $LUPREC 70(точность команды UNITS для координат и расстояний)
 $MENU 1(имя файла меню)
 $MIRRTEXT  70(если не нуль, текст MIRROR)
 $ORTHOMODE 70(если не равно нулю, то "включение" режима ORTHO)
 $OSMODE 70(действующий режим привязки объекта)
 $PDMODE 70(режим отображения точек)
 $PDSIZE 40(размер отображения точек)
 $PLINEWID  40(ширина ломаной по умолчанию)
 $QTEXTMODE 70(если  не   равно  нулю,   то  "включение"   режима  "быстрого текста")
 $REGENMODE 70(если  не   равно  нулю,   то  "включение"   режима  REGENAUTO)
 $SKETCHINC 40(инкремент эскизной записи)
 $SKPOLY 70(0=эскиз линиями, 1=эскиз ломаными)
 $SNAPANG   50(угол вращения сетки привязки)
 $SNAPBASE  10 и 20(начало отсчета сетки привязки)
 $SNAPISOPAIR   70(изометрическая плоскость: 0= слева, 1= сверху,  2=справа)
 $SNAPMODE  70(если  не   равно  нулю,   то  "включение"   режима  привязки)
 $SNAPSTYLE 70(тип привязки:0=стандартный, 1=изометрический)
 $SNAPUNIT  10 и 20(размеры сетки по Х и Y)
 $TDCREATE  40(дата/время создания чертежа)
 $TDINDWG   40(накопленное  время   редактирования  для   данного  чертежа)
 $TDUPDATE  40(дата/время последнего обновления чертежа)
 $TDUSRTIMER 40(таймер прошедшего времени пользователя)
 $TEXTSIZE  40(высота текста по умолчанию)
 $TEXTSTYLE 7(имя текущего типа шрифта)
 $THICKNESS 40(установка текущей толщины с помощью команды ELEV)
 $TRACEWID  40(ширина трассы по умолчанию)
 $VIEWCTR   10 и 20(центр текущего вида на экране)
 $VIEWDIR   10, 20  и 30(установка  текущей точки  вида с помощью  команды VPOINT)
 $VIEWSIZE  40(высота текущего вида на экране)
 ЗАМЕЧАНИЕ: Хотя  выше приведенный список переменных заголовка DXF очень  юлизок к списку системных переменных в приложениии А, эти два  списка не  идентичны.  Будьте  внимательны  ссылаясь  к правильному списку. Переменные даты  и  времени  ($TDCREATE  и  $TDUPDATE)  имеют вывод, как действительные числа в формате:
 <Julian date>.<Fraction>
 (<юлианская дата>.<Остаток>)
 Переменные истекшего  времени ($TDINDWG  и $TDUSRTIMER) имеют
 подобный формат:
 <Number of days>.<Fraction>
 (<Число дней>.<Остаток>)

 С.1.3.4 Раздел ТАБЛИЦЫ
 Раздел ТАБЛИЦЫ  (TABLES) файла  DXF содержит  четыре таблицы, каждая из  которых  в  свою  очередь  содержит  различное  число табличных записей.  Таблицы всегда  расположены в таком порядке, который имеется  в приведенном  выше примере этого файла. Каждая таблица из раздела TABLES начинается с группы 0 с меткой "TABLE" /ТАБЛИЦА/. За ней следует группа 2 с названием таблицы ("LTYPE", "LAYER", "STYLE"  или же  "VIEW"), и далее - группа 70, задающая максимальное число  табличных записей.  Таблицы в  чертеже могут содержать исключенные  элементы, однако  они не  записываются  в файл DXF.  Таким  образом,  реальное  число  элементов,  которые следуют  после  заголовка  таблицы,  может  быть  меньше  числа, заданного в  группе 70,  поэтому не  следует использовать число, заданное в  группе 70,  в качестве  индекса при  чтении таблицы. Предусмотрено, что  ваша программа  для чтения  файлов DXF может разместить  массив  заранее,  чтобы  сохранить  все  последующие табличные элементы. После заголовка  в каждой  таблице следуют  табличные записи. Каждый элемент таблицы состоит из группы 0, идентифицирующей тип элемента  (такой  же,  как  и  имя  таблицы,  т.е.  "LTYPE"  или "LAYER"), группы 2, в которой указывается имя записи, группы 70, в которой  указываются флажки,  относящиеся к  табличной  записи (для каждой таблицы определены ниже), и из дополнительных групп, в которых  приводятся значения  табличных записей.  Конец каждой таблицы отмечается  с помощью  группы 0,  которая имеет значение "ENDTAB".
 Ниже приведены  группы, которые используются для каждого типа табличного  элемента.   В  каждом   элементе  (пункте)   таблицы представлены все возможные группы. LTYPE 3(описательный  текст   для   типа   линии),   72(код  выравнивания),  73(число   элементов  длин  штрихов),  40(общая длина  линий образца),  49(длина штриха  1),  49(длина штриха 2), ...
 LAYER 62(номер цвета, отрицательный, если слой "выключен"),  6(имя типа  линии). Если  слой "заморожен",  то бит 1  устанавливается во флажках группы 70.
 STYLE 40(фиксированная высота текста; если высота текста не  является фиксированной,  то  0),  50(непрямой  угол),  71(флажки генерации  текста), 42(используется высота,  заданная в  последний раз),  3(имя  файла  текстового  шрифта или формы).
  Пункт таблицы  STYLE используется  также  для  записи  запросов LOAD  (загрузка) файла  формы. В этом случае  бит 1 устанавливается в флажках группы 70, и значимой  является только 3 группа (тем не менее, все остальные  группы являются выходными).
 VIEW  40 и  41 (высота и ширина вида), 10 и 20 (центральная  точка вида),  11, 21  и 31(направление вида от начала  отсчета).

C.1.3.5 Раздел БЛОКИ
Раздел БЛОКИ (BLOCKS) файла DXF содержит все описания блоков. Данный раздел  содержит  примитивы,  которые  составляют  блоки, используемые в чертеже. Формат примитивов, содержащихся в данном разделе, идентичен  формату, который  приведен ниже при описании раздела  ENTITIES,   поэтому  для  более  детального  знакомства обратитесь к  указанному разделу.  Все графические  примитивы  в разделе BLOCKS  размещаются между  элементами BLOCKS  и  ENDBLK. Элементы BLOCK  и ENDBLK  встречаются только  в разделе  BLOCKS. Описания блоков  не бывают  вложенными (то  есть, элементы BLOCK или ENDBLK  не могут  располагаться внутри  другой пары  BLOCK и ENDBLK).

C.1.3.6 Раздел ПРИМИТИВЫ
Элементы графических  примитивов размещаются  как  в  разделе BLOCKS, так  и в  разделе ПРИМИТИВЫ (ENTITIES) файла DXF. Формат их размещения  и в  том  и  в  другом  разделе  идентичен.  Ниже приведен формат  каждого графического  примитива в таком виде, в каком  он   размещается  в   файле.  Некоторые  группы,  которые определяют графический  примитив, размещаются  в файле всегда, а некоторые являются  дополнительными, и появляются в файле только в том  случае, если  имеют такое значение, которое отличается от их значения  по умолчанию.  В приведенном  описании  для  групп, которые всегда имеются в файле, дается номер группы и функция, а дополнительные  группы  помечены  словами  "-дополнительная  N", которые следуют после описания группы. Величина "N" представляет собой значение  по умолчанию,  которое принимается в том случае, если группа опущена. Программы, которые  осуществляют считывание файлов, не должны предполагать,  что   описывающие  графические  примитивы  группы встречаются в  таком порядке, какой приведен здесь. Конец групп, которые  составляют  графический  примитив,  задается  следующей группой  0,   началом  нового   графического  примитива  или  же указанием конца раздела. Помните, что  файл DXF - это полное представление базы данных чертежей, и  что в  ходе дальнейшего  совершенствования  системы AutoCAD к  графическим примитивам  для  расширения  возможностей будут добавляться новые группы. Запись вашей программы обработки DXF  с   помощью  табличного  управления,  отказ  от  каких-либо предположений об  очередности групп  в графическом  примитиве  и пропуск неопределенных  в данное  время групп  даст  возможность намного проще  адаптировать файлы  DXF для  новых версий системы AutoCAD.
 Каждый  графический   примитив   начинается   с   группы   0, указывающей его тип. Имена, которые используются для графических примитивов, даны в таблице, приведенной ниже. Каждый графический примитив содержит  группу 8,  в которой  приведено имя  слоя, на котором он  постоянно находится. Если графический примитив имеет ненулевой подъем  или толщину,  тип линии,  информацию о  цвете. Следующие группы  включены только  в том  случае, если  примитив имеет  отличные   значения  для  этих  свойств  от  значений  по умолчанию.
 6  Имя типа  линии (если  не "BYLAYER"). Специальное имя  "BYLAYER" указывает на тип линии вещественный.
 38 Подъем (если не нулевой)
 39 Толщина (если не нулевая)
 62 Номер цвета  (если нет  "BYLAYER"). Нулевое  значение  определяет "BYBLOCK" (вещественный) цвет.
 Остальные  группы,   которые  составляют   элемент   описания графического примитива, следующие:
 LINE  /линия/
  10 и 20 (начальная точка), 11 и 21(конечная точка)
 POINT /точка/
  10 и 20
 CIRCLE  /круг/
  10 и 20 (центр), 40(радиус)
 ARC   /дуга/
  10 и 20 (центр), 40 (радиус), 50 (начальный угол), 51
  (конечный угол)
 TRACE /трасса/
  Четыре точки, задающие углы трассы: 10 и 20, 11 и 21,
  12 и 22, 13 и 23
 SOLID /тело/
  Четыре точки,  задающие углы  сплошного  тела:  10  и  (сплошной) 20,  11 и  21, 12 и 22, 13 и 23. Если тело  имеет только три стороны, то координаты, задаваемые с  помощью групп  12 и 22,13 и 23 будут одни и те же (то  есть, группы  12 и  13 одинаковые  и группы  22 и  23  одинаковые)
 TEXT  /текст/
  10 и  20(место вставки),  40  (высота),  1  (значение  текста), 50  (угол поворота  - дополнительная  0), 41  (относительный   масштабный коэффициент по Х  дополнительная 1),  51  (угол  наклона-дополнительная  0), 7 (имя типа текста-дополнительная "STANDARD"), 71  (флажки  генерации   -  дополнительная  0),  72  (тип  выравнивания -  дополнительная 0),  11  и  21  (точка  выравнивания -  дополнительная; имеется  только в том  случае, если есть не равная нулю группа 72)
 SHAPE /форма/
  10 и  20 (место вставки), 40 (размер), 2 (имя формы),  50   (угол   поворота   -   дополнительная   0),   41  (относительный   масштабный коэффициент   по Х-  дополнительная 1),  51( угол наклона - дополнительная  0)
 BLOCK /блок/
  2 (имя  блока), 70  (флажки  типа  блока),  10  и  20  (базовая точка блока). Имеется только в разделе BLOCK ENDBLK  /конец блока/  Групп нет. Имеется только в разделе BLOCK INSERT  /вставка/  66 (флажок  "Далее следуют  атрибуты" -дополнительная  0), 2  (имя блока),  10  и  20  (место  вставки),  41  (масштабный коэффициент  по Х - дополнительная 1), 42  (масштабный коэффициент  по Y-дополнительная  1),  50  (угол  поворота   -  дополнительная   0),  70   и  71  (количество столбцов и строк -дополнительная 0), 44 и  45 (шаг столбцов и строк - дополнительная 0)
 ATTDEF  10 и  20  (начало  текста),  40  (высота  текста),  1  (значение по  умолчанию), 3  (строки приглашения),  2  (строка), 70  (признаки атрибута),  73 (длина  поля -  дополнительная 0), 50 (поворот текста -дополнительная  0), 41 (относительный масштабный  коэффициент  по Х -  дополнительная 1),  51  (угол  наклона-дополнительная  0), 7 (имя типа текста-дополнительная "STANDARD"), 71  (признаки генерации  текста -  дополнительная 0),  72  (тип   выравнивания текста  - дополнительная 0), 11 и  21  (точка  выравнивания  -  дополнительная;  имеется  только в  том случае, если есть не равная нулю группа  72)
 ATTRIB  10 и  20 (начало  текста), 40 (высота текста), 1 (значение),  2   (описатель   атрибута),   70   (признаки  атрибута), 73  (длина поля  - дополнительная  0),  50  (поворот   текста - дополнительная 0), 41  (относительный  масштабный   коэффициент   по   Х   -  дополнительная 1),  51 (  угол наклона-дополнительная  0), 7  (имя типа  текста -дополнительная "STANDARD"),  71 (признаки генерации текста - дополнительная 0), 72  (тип выравнивания  текста - дополнительная 0, имеется  только в  том случае, если есть не равная нулю группа  72)
 POLYLINE   70  (признаки   ломаной),  40  (начальная  ширина  по  умолчанию),  41   (конечная  ширина   по  умолчанию);  признаки  имеют  в  данное  время  значения  битов  1  (замкнутая  ломаная)  и  2  (добавлена  информация  о  встраивании кривой).  Значения  ширины  по  умолчанию  относятся к любой вершине (точке перегиба), у которой  нет значений ширины (смотри ниже).
 VERTEX  10  и   20  (местоположение),  40  (начальная  ширина  дополнительная, смотри  выше),  41  (конечная  ширина  дополнительная,   смотри выше), 42 (кривизна  (выпуклость)),  70   (признаки  точки  перегиба),  50  (направление  касательной   к   сглаживающей   кривой  дополнительная).  Выпуклость   -  это   тангенс   1/4  внутреннего   угла   для   сегмента   дуги,   который  становится  отрицательным,   если  направление   дуги  отсчитывается  от   начальной  точки  к  конечной  по  часовой стрелке;  выпуклость равна 0 на прямолинейном  участке,  а   на  полукруглом   участке  равна  1.  В  настоящее время  признаки точки  перегиба включают  1  (дополнительная точка  перегиба,  образованная  путем  подгонки кривой)  и  2  (определен  тангенс  подгонки  кривой). Нулевое значение тангенса может опускаться в  выходных данных  DXF, однако  оно является  значимым,  если  в   признаках  точки  перегиба  установлен  бит  "тангенс определен".
 SEQEND  Нет полей.  С помощью  этой величины отмечается конец  точек перегиба  (имя типа  -VERTEX) для  ломаных  или  конец  величин   атрибутов  (имя   типа  ATTRIB)  для  графического примитива INSERT, который имеет атрибуты  (определяемые по  наличию не  равной нулю группы 66 в  графическом примитиве INSERT).

 С.1.3.7 Определения признаков примитивов
 Элементы   графических примитивов,   перечисленные   выше, используют  различные   значения  флажков   ("признаков").   Это целочисленные коды  (групп 6х  и 7х),  которые кодируют  разного рода   информацию о   синтаксической   единице   (графическом примитиве).  В   дальнейших  параграфах  описывается  назначение различных групп  с признаками (флажками), которые используются в графических примитивах.  В данном  описании термин  "закодирован побитно"  означает,  что  признак  содержит  различные  значения "истина" или  "ложь", которые  закодированы как  сумма  заданных значений битов. Те биты, которые не определены в данном разделе, должны игнорироваться  в этих  полях и  устанавливаться  равными нулю при построении файла DXF.

 Признак "Далее следуют атрибуты"
 Данный признак содержится в дополнительной группе 66, которая в настоящее  время используется  только в синтаксической единице INSERT. Если  значение, которое  следует за группой, равно 1, то ожидается, что атрибуты (ATTRIB) следуют за элементом INSERT.

Признаки атрибутов
 Данные признаки содержатся в группе 70, которая встречается в синтаксических  конструкциях   ATTDEF  и   ATTRIB.   Это   поле, закодированное  побитно,  в  котором  1  означает,  что  атрибут "невидимый" (не  отображается), 2 означает, что атрибут является постоянным,  а  4  означает,  что  при  вводе  данного  атрибута требуется проведение проверки.

 Признаки генерации текста
 Данные признаки содержатся в дополнительной группе 71,которая встречается в синтаксических конструкциях TEXT, ATTDEF и ATTRIB. Это поле,  закодированное побитно,  в котором  2  означает,  что текст зеркально  отображается в  направлении Х  (т.е. нормальное зеркальное отображение),  а 4 означает, что текст отображается в перевернутом виде.

 Тип выравнивания текста
 Данный признак содержится в дополнительной группе 72, которая встречается в синтаксических конструкциях TEXT, ATTDEF и ATTRIB. Данное значение  (НЕ является закодированным побитно) показывает тип  выравнивания   текста,  который   используется   в   данной конструкции.  0  -  означает  выравнивание  по  левому  краю,  1 означает центрирование  текста, 2  -  означает  выравнивание  по правому краю,  а 3  указывает, что текст "выравнен". Если данная группа имеет  ненулевое значение,  то в  той  же  синтаксической конструкции должны  встретиться группы  11 и  21, которые задают точку выравнивания  текста (центральную,  крайнюю правую  или же вторую точку выравнивания).

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

вторник, 14 сентября 2010 г.

Элементы редактора

Line
Создается в :

  • cnvDrawPoly_MouseLeftButtonUp
  • LoadXMLtoGFX
  • OnNavigatedTo

lineBrush = (SolidColorBrush)colorBorder.Fill;
line.Stroke = lineBrush;
line.StrokeThickness = numericStrokeThickness.Value * getScale();//вычисление толщины от масштаба



LineTo
Создается как элемент Line
Создается в :
  • cnvDrawPoly_MouseLeftButtonUp



Rectangle
Создается в :
  • cnvDrawPoly_MouseLeftButtonUp
  • LoadXMLtoGFX
  • OnNavigatedTo


Naves
Создается в :
  • cnvDrawPoly_MouseLeftButtonUp
  • LoadXMLtoGFX
  • OnNavigatedTo
SolidColorBrush lineBrush = new SolidColorBrush();
lineBrush = (SolidColorBrush)colorBorder.Fill;
SolidColorBrush lineFillBrush = new SolidColorBrush();
lineFillBrush = (SolidColorBrush)colorFill.Fill;

PolyLine
Создается в :
  • buttonLinePolyLine_Click
  • LoadXMLtoGFX
  • OnNavigatedTo


Surve
Создается в :
  • buttonLinePolyLine_Click
  • LoadXMLtoGFX
  • OnNavigatedTo

понедельник, 13 сентября 2010 г.

ColorDialog

Для выбора цвета нужен привычный колордиалог, но в Silverligth3 его нету, проблему решить очень просто, за основу взял статью и код
http://www.shinedraw.com/mathematics/first-silverlight-2-application-color-picker/

но эта версия работает под silverkigth2 и требуется в доработке под мой проект:
нужно сделать диалоговое окно тут я выбрал ChildWindow назвал его ColorDialog

 <controls:ChildWindow x:Class="WebPiket2.Views.ColorDialog"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
           Width="549" Height="454"
           Title="ColorDialog">
    <Grid x:Name="LayoutRoot" Margin="2">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <Button x:Name="CancelButton" Content="Отмена" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1" />
        <Button x:Name="OKButton" Content="ОК" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="1" />
        <Grid Height="513" HorizontalAlignment="Left" Margin="6,7,0,0" Name="grid1" VerticalAlignment="Top" Width="639" >
            <Canvas x:Name="LayoutColorControl" Background="White" Margin="0,0,118,137" MouseMove="RootVisual_MouseMove" MouseLeftButtonUp="Picker_MouseLeftButtonUp">

                <!-- OldColor/NewColor -->
                <Border  Canvas.Left="100" Canvas.Top="30" Padding="2" BorderBrush="Black" BorderThickness="1">
                    <StackPanel Orientation="Horizontal">
                        <Canvas x:Name="OldColor" Width="165" Height="50" Background="#55FF0000"></Canvas>
                        <Canvas x:Name="NewColor" Width="165" Height="50" Background="#55FF00FF"></Canvas>
                    </StackPanel>
                </Border>

                <!-- ColorBoard -->
                <Border  Canvas.Left="100" Canvas.Top="100" Padding="2" BorderBrush="Black" BorderThickness="1">
                    <Grid Width="250" Height="250"   x:Name="ColorBoard" MouseLeftButtonDown="Picker_MouseLeftButtonDown" >
                        <Canvas>
                            <Canvas.Background>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
                                    <GradientStop Color="#FFFF0000" Offset="0"/>
                                    <GradientStop Color="#FFFFFF00" Offset="0.16"/>
                                    <GradientStop Color="#FF00FF00" Offset="0.33"/>
                                    <GradientStop Color="#FF00FFFF" Offset="0.50"/>
                                    <GradientStop Color="#FF0000FF" Offset="0.67"/>
                                    <GradientStop Color="#FFFF00FF" Offset="0.83"/>
                                    <GradientStop Color="#FFFF0000" Offset="1"/>
                                </LinearGradientBrush>
                            </Canvas.Background>
                        </Canvas>

                        <Canvas>
                            <Canvas.Background>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                    <GradientStop Color="#00333333" Offset="0"/>
                                    <GradientStop Color="#FF333333" Offset="1"/>
                                </LinearGradientBrush>
                            </Canvas.Background>
                        </Canvas>

                        <Canvas>
                            <Ellipse x:Name="Picker" Width="12" Height="12" Stroke="Black"  Fill="#CCFFFFFF" StrokeThickness="1" Canvas.Left="50" Canvas.Top="50">
                                <Ellipse.RenderTransform>
                                    <TranslateTransform X="-6" Y="-6"></TranslateTransform>
                                </Ellipse.RenderTransform>
                            </Ellipse>
                        </Canvas>
                    </Grid>
                </Border>

                <!-- Gradient -->
                <Border  Canvas.Left="380" Canvas.Top="100" Padding="2" BorderBrush="Black" BorderThickness="1">
                    <Grid Width="50" Height="250" x:Name="Gradient" MouseLeftButtonDown="Gradient_MouseLeftButtonDown">
                        <Canvas Background="Red" x:Name="GradientBox">
                        </Canvas>

                        <Canvas>
                            <Canvas.Background>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                    <GradientStop Color="#FFFFFFFF" Offset="0"/>
                                    <GradientStop Color="#00FFFFFF" Offset="0.5"/>
                                    <GradientStop Color="#00000000" Offset="0.5"/>
                                    <GradientStop Color="#FF000000" Offset="1"/>
                                </LinearGradientBrush>
                            </Canvas.Background>
                        </Canvas>

                        <Canvas>
                            <Border x:Name="LightPicker" BorderBrush="White" BorderThickness="1">
                                <Canvas Background="Black" Height="4" Width="48"/>
                            </Border>
                        </Canvas>
                    </Grid>

                </Border>

            </Canvas>

        </Grid>
    </Grid>
</controls:ChildWindow>
Код был изменен, ссылки на обработчики событий вынесены в XAML
/****************************************************************************

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

-- Copyright 2009 Terence Tsang
-- admin@shinedraw.com
-- http://www.shinedraw.com
-- Your Flash vs Silverlight Repositry

****************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;


namespace WebPiket2.Views
{
    public partial class ColorDialog : ChildWindow
    {
        public ColorDialog()
        {
            InitializeComponent();
            // Allow to use The RootVisual Object after Loaded
            Loaded += new RoutedEventHandler(ColorPicker_Loaded);
        }
        public Color Result = new Color();
        public string call = "";
        private void OKButton_Click(object sender, RoutedEventArgs e)
        {
            SolidColorBrush br = (SolidColorBrush)NewColor.Background;
            Result = br.Color;
            this.DialogResult = true;
        }

        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = false;
        }

        #region ColorPicker
        private double[] _hsl = { 0, 0, 0.5 };

        // New HSL Value
        private double[] _tempHsl = { 0, 0, 0.5 };

        // Check the Mouse Down
        private bool _isBoardMouseDown = false;
        private bool _isGradientMouseDown = false;

        

        // Add Handlers
        void ColorPicker_Loaded(object sender, RoutedEventArgs e)
        {
            // update color
            showColor(_hsl, _tempHsl);
        }



        /////////////////////////////////////////////////////        
        // Handlers 
        ///////////////////////////////////////////////////// 

        // Calculate the New Color Value
        void RootVisual_MouseMove(object sender, MouseEventArgs e)
        {
            if (_isBoardMouseDown)  // if change the hue and saturation
            {
                double offsetWidth = ColorBoard.ActualWidth;
                double offsetHeight = ColorBoard.ActualHeight;

                double mouseX = e.GetPosition(ColorBoard).X;
                double mouseY = e.GetPosition(ColorBoard).Y;

                // calculate new hue value
    double hue = mouseX / offsetWidth;
    hue = Math.Min(1, Math.Max(0, hue));

                // calculate new saturation value
                double saturation = 1 - mouseY / offsetHeight;
                saturation = Math.Min(1, Math.Max(0, saturation));

                // update the picker position
                Picker.SetValue(Canvas.LeftProperty, hue * offsetWidth);
                Picker.SetValue(Canvas.TopProperty, (1 -  saturation ) * offsetHeight);

                _tempHsl[0] = hue * 359;
                _tempHsl[1] = saturation;

                showColor(_hsl, _tempHsl);
            }
            else if (_isGradientMouseDown) // if change the Light
            {
                double offsetHeight = Gradient.ActualHeight;
                double mouseY = e.GetPosition(Gradient).Y;

                // calculate the new light value
                double light = 1 - mouseY / offsetHeight;
    light = Math.Min(1, Math.Max(0, light));

                // update the picker position
                LightPicker.SetValue(Canvas.TopProperty, (1 - light) * (offsetHeight - LightPicker.ActualHeight));

                _tempHsl[2] = light;
                showColor(_hsl, _tempHsl);
            }
        }

        // Update the Color 
        void Picker_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            _isBoardMouseDown = false;
            _isGradientMouseDown = false;

             _tempHsl.CopyTo(_hsl, 0);
             showColor(_hsl, _hsl);
        }

        // When Mouse Down on the Color Board
        void Picker_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            _isBoardMouseDown = true;
            RootVisual_MouseMove(sender, e);
        }

        // When Mouse Down on the Gradient Box
        void Gradient_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            _isGradientMouseDown = true;
            RootVisual_MouseMove(sender, e);
        }


        /////////////////////////////////////////////////////        
        // Private Methods
        ///////////////////////////////////////////////////// 

        // Show the Color Differnt
        private void showColor(double [] hsl1, double [] hsl2)
        {
            double[] rgb1 = hslToRgb(hsl1[0], hsl1[1], hsl1[2]);
            double[] rgb2 = hslToRgb(hsl2[0], hsl2[1], hsl2[2]);
            OldColor.Background = new SolidColorBrush(Color.FromArgb(255, (byte)rgb1[0], (byte)rgb1[1], (byte)rgb1[2]));
            NewColor.Background = new SolidColorBrush(Color.FromArgb(255, (byte)rgb2[0], (byte)rgb2[1], (byte)rgb2[2]));

            double[] rgb3 = hslToRgb(hsl2[0], hsl2[1], 0.5);
            GradientBox.Background = new SolidColorBrush(Color.FromArgb(255, (byte)rgb3[0], (byte)rgb3[1], (byte)rgb3[2]));
        }

        // Convert HSL to RGB
  private double [] hslToRgb(double H, double S, double L) {
            double [] rgb = new double [3];
            double p1 = 0;
            double p2 = 0;

   if (L<=0.5) {
    p2 = L*(1+S);
   } else {
    p2 = L+S-(L*S);
   }
   p1 = 2*L-p2;
   if (S == 0) {
    rgb[0] = L;
    rgb[1] = L;
    rgb[2] = L;
   } else {
    rgb[0] = toRgb(p1, p2, H+120);
                rgb[1] = toRgb(p1, p2, H);
                rgb[2] = toRgb(p1, p2, H - 120);
   }
            rgb[0] *= 255;
            rgb[1] *= 255;
            rgb[2] *= 255;
   return rgb;
  }

        // Calculate the RGB Value
  private double toRgb(double q1, double q2, double hue) {
   if (hue>360) {
    hue = hue-360;
   }
   if (hue<0) {
    hue = hue+360;
   }
   if (hue<60) {
    return (q1+(q2-q1)*hue/60);
   } else if (hue<180) {
    return (q2);
   } else if (hue<240) {
    return (q1+(q2-q1)*(240-hue)/60);
   } else {
    return (q1);
   }
  }
  
        #endregion ColorPicker
    }
}

На странице где требуется вызвать диалог, например при нажатии на region
у диалогового окна есть два публичных свойства: call - текстовое поле, для указания обработчику ColorDialog_Closed какому элементу присвоить значение и Result - полученный цвет
#region ColorDialog
        #region ColorDialog_Closed -- Событие закрытия окна
        private void ColorDialog_Closed(object sender, EventArgs e)
        {
            var result = ((ChildWindow)sender).DialogResult;
            if (result.HasValue)
            {
                //результат нажатия кнопки OK/Cancel у нас в result.Value
                if (result.Value == true)
                {
                    ColorDialog cd=(ColorDialog)sender;
                    if (cd.call == "colorBorder")
                        colorBorder.Fill = new SolidColorBrush(cd.Result);
                    if (cd.call == "colorFill")
                        colorFill.Fill = new SolidColorBrush(cd.Result);
                }
            }
        }
        #endregion ColorDialog_Closed -- Событие закрытия окна
        private void colorBorder_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            ColorDialog cd = new ColorDialog();
            cd.Closed += new EventHandler(ColorDialog_Closed);
            cd.call = "colorBorder";
            cd.Show();
        }
        private void colorFill_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            ColorDialog cd = new ColorDialog();
            cd.Closed += new EventHandler(ColorDialog_Closed);
            cd.call = "colorFill";
            cd.Show();
        }
        #endregion ColorDialog

воскресенье, 29 августа 2010 г.

Работа с куками (Cookies)

Иногда может потребоваться установить или прочитать Cookies из Silverlight приложения.
Cookies представляют собой строку текста, которая сохраняется на стороне клиента и отправляется на сервер, установивший данную Cookie, при каждом запросе. Их обычно используют для хранения данных о сессии, аутентификации и другой информации, специфичной для конкретного пользователя.
Например, интернет магазин может сохранять в Cookies информацию о выбранных незарегистрированным пользователем товарах. И даже, если такой пользователь закроет окно браузера, он сможет зайти на сайт позже и закончить оформление заказа.
В случае, когда пользователь работает только с Silverlight приложением, лучше использовать изолированное хранилище (IsolatedStorage), оно позволяет хранить любые данные и имеет значительно больший, притом увеличиваемый размер.
Однако бывает, что есть страница, использующая Cookies, и на ней нет Silverlight приложений. При этом прочитать информацию, сохранённую в Cookies надо уже на другой странице из Silverlight приложения.
Как это сделать? Нет ничего проще.
Читать и устанавливать Cookies в Silverlight приложении мы можем, используя объект HtmlPage.Document, определённый в пространстве имён System.Windows.Browser.
Для установки Cookie надо вызвать метод SetProperty() и передать ему строку следующего формата: «Ключ=Значение;expires=Дата_Окончания_Хранения.»
Вот типовой код:
private void SetCookie(string key, string value)
{
  DateTime expireDate =
  DateTime.Now + TimeSpan.FromDays(10);

  string cookie =
  String.Format("{0}={1};expires={2}", key,
  value, expireDate.ToString("R"));
  HtmlPage.Document.SetProperty("cookie", cookie);
}
Прочитать же Cookies можно используя свойство HtmlPage.Document.Cookies.

Также привожу типовой код:
private string GetCookie(string key)
{
  string[] cookies = HtmlPage.Document.Cookies.Split(';');

  foreach (string cookie in cookies)
  {
    string[] keyValue = cookie.Split('=');
    if (keyValue.Length == 2)
    {
      if (keyValue[0].ToString().Trim() == key)
        return keyValue[1];
    }
  }
  return null;
}


ссылка на сайт
(с) Сергей Пугачев

пятница, 27 августа 2010 г.

DataGrid - рецепты по приготовлению

DataGrid очень мощная штука, можно переменную хранящую структурированные данные присвоить значению  dataGridPkt.ItemsSource = PrjProperty.CurrentPiketList;
и таблица уже сама готова... определены поля, заполнены записи...

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

Свой набор полей(Заголовки)
Если при использовании DataGrid, у нас определен класс, которым будет заполняться таблица. можно указать только те поля которые мы будем использовать.
пусть у нас есть класс
PiketList, с полями (ID(int),FROM(string),TO(string),IsPiket(bool),x(double),y(double),z(double) )

Используя механизм Binding можно указать поля которые хотим вывести, для логического типа красивее использовать data:DataGridCheckBoxColumn

<data:DataGrid Grid.Row="1" Name="dataGridPkt" AutoGenerateColumns="False" >
  <data:DataGrid.Columns>

     <data:DataGridTextColumn Binding="{Binding ID}" Header="№"/>
     <data:DataGridTextColumn Binding="{Binding FROM}" Header="От"/>
     <data:DataGridTextColumn Binding="{Binding TO}" Header="До"/>
     <!-- флажок -->
     <data:DataGridCheckBoxColumn Binding="{Binding IsPiket}" Header="Пикет"/>


  </data:DataGrid.Columns>
</data:DataGrid>
теперь при использовании команды
dataGridPkt.ItemsSource = PrjProperty.CurrentPiketList;
будут заполнены указанные поля

Создание кнопки в поле.
для удаления записи можно описать кнопку в поле, и для каждой записи будет своя кнопочка
описание кнопки выглядит так
<data:DataGridTemplateColumn>
      <data:DataGridTemplateColumn.CellTemplate>
             <DataTemplate>
                   <Button x:Name="btnDelete" Content="Удл" Foreground="DarkBlue" Click="btnDelete_Click" >
                           <!-- Всплывающая подсказка -->
                           <ToolTipService.ToolTip>
                                 <ToolTip>
                                       <TextBlock Text="Удалить строчку" />
                                 </ToolTip>
                           </ToolTipService.ToolTip>
                   </Button>
              </DataTemplate>
         </data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
для обработки события нажатия на кнопку удаления
создадим окно на подтверждение
для этого добавим новый элемент в наш проект "Дочернее окно Silverligth" - ConfimDeleteRecord
в режиме кода
    public partial class ConfimDeleteRecord : ChildWindow
    {
        int index = 0;
        /// <summary>
        /// Конструктор окна подтверждения
        /// </summary>
        /// <param name="wtlt">Заголовок</param>
        /// <param name="msg">Сообщение</param>
        /// <param name="idx">номер </param>
        public ConfimDeleteRecord(string wtlt, string msg, int idx)
        {
            InitializeComponent();

            index = idx;
            this.Title = wtlt;
            this.Message.Text = msg;
        }

        private void OKButton_Click(object sender, RoutedEventArgs e)
        {
            PrjProperty.CurrentPiketList.RemoveAt(index);
            this.DialogResult = true;
        }

        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = false;
        }
    }


в нашей странице теперь вызовем окно и создадим обработчик событий

        #region ConfimDeleteRecord_Closed -- Событие закрытия окна Удаления
        private void ConfimDeleteRecord_Closed(object sender, EventArgs e)
        {
            var result = ((ChildWindow)sender).DialogResult;
            if (result.HasValue)
            {
                //результат нажатия кнопки OK/Cancel у нас в result.Value
                if (result.Value == true)
                {
                    textBlockStatus.Text = "Запись удалена";
                    refreshTable();
                }
            }
        }
        #endregion ConfimDeleteRecord_Closed

        #region btnDelete_Click -- Удалить запись
        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            int i = dataGridPkt.SelectedIndex;
            ConfimDeleteRecord del = new ConfimDeleteRecord("Удаление записи...", "Вы действительно желаете удалить запись № " + i, i);
            del.Closed += new EventHandler(ConfimDeleteRecord_Closed);
            del.Show();
        }
        #endregion btnDelete_Click