Чертежи в SVG формате. Часть 1 — Черновик стандарта
Мопед не мой, я только объявление разместил (с)
Это цикл статей, посвященных работе с SVG, размещенный на сайте http://v.sytnik.lviv.ua (ныне недоступный). Статьи мне показались очень информативными, поэтому захотелось их сохранить.
В интернете можно найти много разной информации о создании чертежей в формате SVG. Чаще предлагается какой-то редактор и экспорт из формата DXF в SVG. Просматривая код SVG сразу видно что там много лишнего. Созданный в одном редакторе файл SVG не всегда может корректно открыться в другом. Одно радует, что браузеры начали поддерживать SVG формат. Всюду пишут про недостатки использования SVG. А может надо придерживаться единых правил структуры файла для отображения чертежей?
Из экспериментов и тестов пришёл к таким правилам при создании чертёжа:
- использование объектной модели чертежа;
- используем только одну единицу измерения (та что по умолчанию в пикселях);
- условно принимаем — один пиксель равен одному миллиметру (для браузера будет в
пикселях, а для нас вмм); - масштаб описания элементов всегда
1:1; - для отображения объектов в другом масштабе используем вложенный svg рисунок;
- для уникальных объектов задаём
idа для характерныхclass; - …
Объектная модель чертежа
Упрощенно чертёж можно описать в виде XML структуры.
<svg id="Detail1" ...>
<defs id="defsCAD"> ... </defs>
<svg id="Shtamp" name="Frame drawing" ... >
...
</svg>
<svg id="View1" ... >
<g id="layer-0" name="System layer" ...>
<line class="line-type-1" ... />
<line class="line-type-1" ... />
<circle class="line-type-1" ... />
<path class="line-type-1" ... />
<rect class="line-type-1" ... />
<line class="line-type-2" ... />
<line class="line-type-2" ... />
<g class="dimL">
<line class="line-type-2" ... />
<line class="line-type-2" ... />
<line class="line-type-2" ... />
<text ... >...</text>
</g>
...
</g>
<g id="layer-1" name="Layer 1" ...>
...
</g>
</svg>
<svg id="View2" ... >
<line class="line-type-1" ... />
...
</svg>
<svg id="View3" ... > ... </svg>
</svg>Тег svg
<svg> — тег используется для описания самого чертежа и встроенных видов, штампа и техтребований. Если необходимо использовать масштаб отличный от 1:1, то реализуется с помощью свойств тега.
Например масштаб 1:4
<svg id="View1"
x="50"
y="7"
width="150"
height="162"
viewBox="-25 -200 600 648">width="150" height="162" viewBox="…… 600 648" — соотношение величин задаёт масштаб отображения вида на листе.
<svg id="View1"
x="50"
y="7"
width="150"
height="162"
viewBox="-0.6 -5 15 16.2">Тег defs
<defs> — здесь описываем все примитивные повторяющиеся элементы. Замечена одна особенность при использовании SVG элемента marker — на него не действуют параметры масштаба из тега <svg>, что намного упрощает работу с масштабом. (При любом масштабе вида стрелки в размерах должны быть одинаковые). Но на линии в элемента marker не действует параметр свойства vector-effect: non-scaling-stroke;
Тег line
<line class=«atr1» …/> — в файле CSS описываем стили линий для графических примитивов. Жаль что в Internet Explorer для каждого масштаба необходимо указывать свой стиль линии (толщина линии и интервал пунктиров). Как правило в чертеже одновременно не используются все возможные масштабы и достаточно задать только для используемых масштабов.
Пример описания стилей линий для элементов line, circle, path, rect и др.:
line, rect, circle, ellipse, path, text {
vector-effect: non-scaling-stroke;
}
/* main line */
.line-type-1 { fill: none; stroke: blue; stroke-width: 2;
}
/* hairline */
.line-type-2 { fill: none; stroke: black; stroke-width: .7;
}
/* axial */
.line-type-3 { fill: none; stroke: red; stroke-width: .7; stroke-dasharray: 25, 4, 3, 4;
}
/* dashed */
.line-type-4 { fill: none; stroke: black; stroke-width: .7; stroke-dasharray: 7, 4;
}
/* main line for the scale 0.25 */
.line-type-1_025 { fill: none; stroke: blue; stroke-width: 8;
}
/* hairline for the scale 0.25 */
.line-type-2_025 { stroke: black; stroke-width: 2.8;
}Тег g
<g class="dimL">…</g> — элементы описывающие объекты как размер группируем.
Пример:
...
<defs id="defsCAD">
<!-- Draw arrows and tick marks -->
<marker id="dimArrow-1" viewBox="-2 -12 29 24" markerWidth="44" markerHeight="36" orient="auto">
<path class="line-type-2_025" stroke="black" d="M0,0 L20,-4 16,0 20,4 z M0,-10 L0,10 M0,0 L27,0"/>
</marker>
<marker id="dimArrow-2" viewBox="-27 -12 29 24" markerWidth="44" markerHeight="36" orient="auto">
<path class="line-type-2_025" stroke="black" d="M0,0 L-20,-4 -16,0 -20,4 z M0,-10 L0,10 M0,0 L-27,0"/>
</marker>
</defs>
...
<g class="DimL">
<line class="line-type-2" x1="190" y1="180" x2="190" y2="230"/>
<line class="line-type-2" x1="310" y1="180" x2="310" y2="230"/>
<line id="dim1" class="line-type-2" x1="190" y1="230" x2="310" y2="230" marker-start="url(#dimArrow-1)" marker-end="url(#dimArrow-2)"/>
<text x="265" y="222" font-size="28" text-anchor="middle">120</text>
</g>
...Есть одна особенность отображения графики в SVG. Если мы задали область и хотим по краю её нарисовать контур, то должны отступить на пол толщины линии иначе линии будут на половину тоньше. Например кода чёрной рамочки края чертежа.
<svg id="Shtamp" type="1" x="0" y="0" width="420" height="297" viewBox="0 0 420 297">
...
<rect class="line-type-2" x="1" y="1" width="418" height="295"/>
....
</svg>