Вращение svg элемента находящегося в группе других элементов
Пробую сделать кнопку для вращения элемента svg, который находится в группе с другими элементами. Пробовал использовать матрицы для пересчета и все что находил на формуах и в гугле. В целом у меня получилось сделать вращение элемента вокруг, но проблема в том, что при первом вызове вращения элемент уезжает со своего места и вращается уже на новом месте. Пробовал вычислять глобальные координаты и после вращения перемещать элемент на них, но глобальные координаты для элемента вычисляются как раз те, на которые переходит вращение. Может кто сможет объяснить почему у меня съезжает элемент и как его оставлять на месте при вращении?
class Merger {
constructor(svgCanvas, proximityThreshold = 50) {
this.svgCanvas = svgCanvas;
this.groups = [];
this.proximityThreshold = proximityThreshold;
this.init();
}
init() {
this.updateDraggableGroups();
this.addSelectableFeature();
}
updateDraggableGroups() {
const groups = d3.select(this.svgCanvas).selectAll('.draggable-group').call(d3.drag()
.on('start', (event, d) => this.startDrag(event, d))
.on('drag', (event, d) => this.drag(event, d))
.on('end', (event, d) => this.endDrag(event, d)));
this.groups = groups.nodes();
console.log('Updated groups:', this.groups);
}
getRotationFromTransform(element) {
const transform = d3.select(element).attr('transform');
const rotateMatch = transform ? transform.match(/rotate\(([^)]+)\)/) : null;
return rotateMatch ? parseFloat(rotateMatch[1]) : 0;
}
addSelectableFeature() {
d3.select(this.svgCanvas).selectAll('.sofa').on('click', (event, d) => {
d3.selectAll('.selected').classed('selected', false);
d3.select(event.target.closest('.sofa')).classed('selected', true);
document.getElementById('rotateBtn').classList.remove('hidden');
});
}
rotateSelectedSofa() {
const selectedElement = d3.select('.selected');
if (!selectedElement.empty()) {
const transform = selectedElement.attr("transform");
const rotateMatch = transform ? transform.match(/rotate\(([^)]+)\)/) : null;
const currentRotation = rotateMatch ? parseFloat(rotateMatch[1].split(',')[0]) : 0;
const newRotation = (currentRotation + 90) % 360;
const translateMatch = transform ? transform.match(/translate\(([^)]+)\)/) : null;
const translate = translateMatch ? translateMatch[1].split(',').map(Number) : [0, 0];
const bbox = selectedElement.node().getBBox();
const cx = bbox.x + bbox.width / 2;
const cy = bbox.y + bbox.height / 2;
const newTransform = `translate(${translate[0]},${translate[1]}) rotate(${newRotation}, ${cx}, ${cy})`;
selectedElement.attr("transform", newTransform);
console.log(`Rotated - Element: ${selectedElement.attr('id')}, New Transform: ${newTransform}`);
}
}
}
// Initialize after SVG content is loaded
document.addEventListener('DOMContentLoaded', () => {
const svgCanvas = document.getElementById('svgCanvas');
const merger = new Merger(svgCanvas, 50);
document.getElementById('rotateBtn').addEventListener('click', () => {
merger.rotateSelectedSofa();
});
});
body {
font-family: Arial, sans-serif;
margin: 20px;
}
svg {
border: 1px solid #ccc;
width: 100%;
height: 100vh;
}
.draggable-group {
cursor: move;
}
.dragging {
stroke: red;
stroke-width: 2px;
}
.selected {
stroke: blue;
stroke-width: 2px;
}
.hidden {
display: none;
}
.normalTable, .sofaTable {
transform-origin: center center;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SVG Editor</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.8.5/d3.min.js"></script>
</head>
<body>
<h1>SVG Editor</h1>
<button id="saveBtn">Save SVG</button>
<button id="rotateBtn" class="hidden">Rotate Selected Sofa</button>
<br><br>
<svg id="svgCanvas">
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Создано Microsoft Visio, экспорт SVG Итерация 2 - изменил svg руками, сохранил его как visio.svg Страница-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="8.26772in" height="11.6929in"
viewBox="0 0 595.276 841.889" xml:space="preserve" color-interpolation-filters="sRGB" class="st23">
<v:documentProperties v:langID="1049">
<v:userDefs>
<v:ud v:nameU="VisAecDocument" v:val="VT0(1):26"/>
<v:ud v:nameU="VisAecVersion" v:val="VT0(15):26"/>
<v:ud v:nameU="Ifc__CustomPropsLevel" v:val="VT0(0):26"/>
<v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/>
</v:userDefs>
</v:documentProperties>
<style type="text/css">
<![CDATA[
.st1 {fill:#789440;stroke:#923931;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}
.st2 {fill:#789440;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.749999}
.st3 {fill:#789440}
.st4 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
.st5 {fill:#b95f3a;stroke:#000000;stroke-linecap:butt;stroke-width:0.75}
.st6 {fill:#310e00;stroke:none;stroke-linecap:butt;stroke-width:0.75}
.st7 {fill:#157224;stroke:none;stroke-linecap:butt;stroke-width:0.75}
.st8 {fill:#86c140;stroke:none;stroke-linecap:butt;stroke-width:0.75}
.st9 {fill:#ffd965}
.st10 {fill:#ffd965;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
.st11 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
.st12 {fill:#232323;stroke:none;stroke-linecap:butt;stroke-width:0.75}
.st13 {fill:#4c4c4c;stroke:none;stroke-linecap:butt;stroke-width:0.75}
.st14 {fill:#000000;stroke:none;stroke-linecap:butt;stroke-width:0.75}
.st15 {stroke:#000000;stroke-linecap:butt;stroke-width:0.1875}
.st16 {fill:none;stroke:#000000;stroke-linecap:butt;stroke-width:0.375}
.st17 {fill:#d8842a;stroke:none;stroke-linecap:butt;stroke-width:0.75}
.st18 {fill:#aa5d17}
.st19 {stroke:none;stroke-linecap:butt;stroke-width:0.75}
.st20 {fill:#486b03;stroke:none;stroke-linecap:butt;stroke-width:0.75}
.st21 {fill:#a8bd40;stroke:none;stroke-linecap:butt;stroke-width:5E-05}
.st22 {fill:#739626;stroke:none;stroke-linecap:butt;stroke-width:0.0001}
.st23 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
]]>
</style>
<g v:mID="0" v:index="1" v:groupContext="foregroundPage">
<v:custProps>
<v:cp v:nameU="VisDoorFrameWidth" v:lbl="Ширина дверной коробки" v:type="4"
v:format="10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisDoorFrameDepth" v:lbl="Толщина дверной коробки" v:type="4"
v:format="Как у стены;100 mm;150 mm;200 mm;250 mm;300 mm" v:sortKey="0" v:invis="true" v:langID="1049"
v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisDoorStopWidth" v:lbl="Ширина ограничителя двери" v:type="4"
v:format="10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(20 mm)"/>
<v:cp v:nameU="VisDoorStopDepth" v:lbl="Толщина ограничителя двери" v:type="4"
v:format="10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisDoorThresDepthIn" v:lbl="Внутренняя ширина порога двери" v:type="4"
v:format="10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisDoorThresWidthIn" v:lbl="Внутренняя толщина порога двери" v:type="4"
v:format="0 mm;10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisDoorThresDepthOut" v:lbl="Наружная толщина порога двери" v:type="4"
v:format="0 mm;10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisDoorThresWidthOut" v:lbl="Наружная ширина порога двери" v:type="4"
v:format="0 mm;10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisDoorPanelThickness" v:lbl="Толщина филенки" v:type="4"
v:format="10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisWndwFrameDepth" v:lbl="Толщина оконной рамы" v:type="4"
v:format="Как у стены;100 mm;150 mm;200 mm;250 mm;300 mm" v:sortKey="0" v:invis="true" v:langID="1049"
v:cal="0" v:val="VT4(200 mm)"/>
<v:cp v:nameU="VisWndwFrameWidth" v:lbl="Ширина оконной рамы" v:type="4"
v:format="10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisWndwSashDepth" v:lbl="Толщина оконного переплета" v:type="4"
v:format="10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisWndwSashWidth" v:lbl="Ширина оконного переплета" v:type="4"
v:format="5 mm;10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisWndwSillDepthIn" v:lbl="Внутренняя толщина подоконника" v:type="4"
v:format="0 mm;10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisWndwSillWidthIn" v:lbl="Внутренняя ширина подоконника" v:type="4"
v:format="0 mm;10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisWndwSillDepthOut" v:lbl="Наружная толщина подоконника" v:type="4"
v:format="0 mm;10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="VisWndwSillWidthOut" v:lbl="Наружная ширина подоконника" v:type="4"
v:format="0 mm;10 mm;20 mm;30 mm;40 mm;50 mm;60 mm;70 mm;80 mm;90 mm;100 mm" v:sortKey="0" v:invis="true"
v:langID="1049" v:cal="0" v:val="VT4(50 mm)"/>
<v:cp v:nameU="WdFenceThick" v:lbl="Толщина деревянного забора" v:type="4" v:format="100 мм; 125 мм"
v:sortKey="visSpace02" v:langID="1049" v:val="VT4(100 мм)"/>
</v:custProps>
<v:userDefs>
<v:ud v:nameU="VisAecPage" v:val="VT0(1):26"/>
<v:ud v:nameU="LineStyleIndex" v:val="VT0(0):26"/>
<v:ud v:nameU="VisDoorPanelsClosed" v:prompt="Show all doors closed" v:val="VT0(0):26"/>
<v:ud v:nameU="VisDoorShowHeader" v:prompt="Show all door headers" v:val="VT0(0):26"/>
<v:ud v:nameU="VisDoorShowPanel" v:prompt="Show all door panels" v:val="VT0(1):26"/>
<v:ud v:nameU="VisDoorShowSwing" v:prompt="Show all door swings" v:val="VT0(1):26"/>
<v:ud v:nameU="VisDoorShowThreshold" v:prompt="Show all door thresholds" v:val="VT0(0):26"/>
<v:ud v:nameU="VisDoorShowThresIn" v:prompt="Show all door interior thresholds" v:val="VT0(1):26"/>
<v:ud v:nameU="VisDoorShowThresOut" v:prompt="Show all door exterior thresholds" v:val="VT0(1):26"/>
<v:ud v:nameU="VisDoorFrameToWall" v:prompt="Draw door frame depths same as wall thickness" v:val="VT0(1):26"/>
<v:ud v:nameU="VisDoorSwingAs" v:prompt="Draw all door swings as: 0 = arc, 1 = line" v:val="VT0(0):26"/>
<v:ud v:nameU="VisDoorShowFrame" v:prompt="Show all door frames" v:val="VT0(1):26"/>
<v:ud v:nameU="VisDoorShowStop" v:prompt="Show all door stops" v:val="VT0(1):26"/>
<v:ud v:nameU="VisWndwShowFrame" v:prompt="Show all window frames" v:val="VT0(1):26"/>
<v:ud v:nameU="VisWndwShowSash" v:prompt="Show all window sashes" v:val="VT0(1):26"/>
<v:ud v:nameU="VisWndwFrameToWall" v:prompt="Draw window frame depths same as wall thickness" v:val="VT0(1):26"/>
<v:ud v:nameU="VisWndwShowHeader" v:prompt="Show all window headers" v:val="VT0(0):26"/>
<v:ud v:nameU="VisWndwShowSill" v:prompt="Show all window sills" v:val="VT0(0):26"/>
<v:ud v:nameU="VisWndwShowSillIn" v:prompt="Show all window interior sills" v:val="VT0(1):26"/>
<v:ud v:nameU="VisWndwShowSillOut" v:prompt="Show all window exterior sills" v:val="VT0(1):26"/>
<v:ud v:nameU="visSpaceUnits" v:val="VT0(1):26"/>
<v:ud v:nameU="visSpacePrecision" v:val="VT0(0):26"/>
<v:ud v:nameU="visSpaceLabel" v:val="VT0(1):26"/>
<v:ud v:nameU="visSpaceNameLabel" v:val="VT0(1):26"/>
<v:ud v:nameU="visSpaceUseLabel" v:val="VT0(1):26"/>
<v:ud v:nameU="visSpaceBoundary" v:val="VT0(0):26"/>
<v:ud v:nameU="SpaceLabelDisabled" v:prompt="Disabled Label" v:val="VT4()"/>
<v:ud v:nameU="DisplayField1" v:prompt="Space label 1" v:val="VT4(Prop.Use)"/>
<v:ud v:nameU="DisplayField2" v:prompt="Space label 2" v:val="VT4(Prop.Name)"/>
<v:ud v:nameU="DisplayField3" v:prompt="Space label 3" v:val="VT4(User.visFMAreaDisplay)"/>
<v:ud v:nameU="DisplayField4" v:prompt="Space label 4" v:val="VT4(User.DisplayFieldDisabled)"/>
<v:ud v:nameU="IFCPropsInvisible" v:val="VT0(0):26"/>
<v:ud v:nameU="LPrec" v:val="VT0(2):26"/>
<v:ud v:nameU="LUnits" v:val="VT0(0):26"/>
<v:ud v:nameU="ShowUnits" v:val="VT0(0):26"/>
<v:ud v:nameU="APrec" v:val="VT0(1):26"/>
<v:ud v:nameU="AUnits" v:val="VT0(1):26"/>
<v:ud v:nameU="LInchPrec" v:val="VT0(4):26"/>
<v:ud v:nameU="VisWndwClosed" v:prompt="Show all windows closed" v:val="VT0(0):26"/>
<v:ud v:nameU="VisWndwShowGlass" v:prompt="Show all window glass panels" v:val="VT0(1):26"/>
<v:ud v:nameU="VisWndwShowTag" v:prompt="Show all window tags" v:val="VT0(0):26"/>
<v:ud v:nameU="VisDoorShowTag" v:prompt="Show all door tags" v:val="VT0(0):26"/>
<v:ud v:nameU="WFThick" v:val="VT4(100 мм)"/>
</v:userDefs>
<title>Страница-1</title>
<v:pageProperties v:drawingScale="39.3701" v:pageScale="0.787402" v:drawingUnits="6" v:shadowOffsetX="8.50393"
v:shadowOffsetY="-8.50393"/>
<v:layer v:name="Незакрепленное оборудование" v:index="0"/>
<v:layer v:name="Мебель" v:index="1"/>
<v:layer v:name="Соединительная линия" v:index="2"/>
<v:layer v:name="Оборудование" v:index="3"/>
<v:layer v:name="Электроприбор" v:index="4"/>
<v:layer v:name="Благоустройство территории" v:index="5"/>
<v:layer v:name="Забор" v:index="6"/>
<v:layer v:name="Новые растения" v:index="7"/>
<v:layer v:name="Растение" v:index="8"/>
<g id="group122-118" transform="translate(22.6772,-587.415)" v:mID="122" v:groupContext="group" class="draggable-group sofaTable">
<v:userDefs>
<v:ud v:nameU="visAltText" v:val="VT4(Стол 10)"/>
</v:userDefs>
<title>Лист.122</title>
<g id="shape118-119" v:mID="118" v:groupContext="shape" transform="translate(1.70079,-22.0334)">
<title>Стол</title>
<path transform="" d="M0 839.61 A2.46962 2.28334 -180 0 0 2.47 841.89 L48.56 841.89 A2.46962 2.28334 -180 0 0 51.02
839.61 L51.02 793.38 A2.46962 2.28334 -180 0 0 48.56 791.1 L2.47 791.1 A2.46962 2.28334 -180 0 0 0 793.38
L0 839.61 Z" class="st1"/>
</g>
<g id="shape119-121" v:mID="119" v:groupContext="shape" transform="translate(58.3937,-40.742)">
<title>Стул 4</title>
<rect x="0" y="826.582" width="15.3071" height="15.3071" class="st2"/>
</g>
<g id="shape117-123" v:mID="117" v:groupContext="shape" v:layerMember="0;1"
transform="translate(841.889,746.798) rotate(90)" class="sofa draggable-group">
<title>2 seat sofa.701</title>
<v:custProps>
<v:cp v:nameU="Width" v:lbl="Ширина" v:type="4"
v:format="800 mm;1000 mm;1200 mm;1400 mm;1600 mm;1800 mm;2000 mm" v:langID="1049"
v:val="VT0(62.992125984252):24"/>
<v:cp v:nameU="Depth" v:lbl="Глубина" v:type="4" v:format="500 mm;600 mm;700 mm;800 mm;900 mm;1000 mm"
v:langID="1049" v:val="VT0(31.496062992126):24"/>
<v:cp v:nameU="ShapeClass" v:lbl="Класс фигуры" v:invis="true" v:langID="1049" v:val="VT4(Актив)"/>
<v:cp v:nameU="ShapeType" v:lbl="Тип фигуры" v:invis="true" v:langID="1049" v:val="VT4(Мебель)"/>
<v:cp v:nameU="SubShapeType" v:lbl="Тип вложенной фигуры" v:invis="true" v:langID="1049" v:val="VT4(Кресло)"/>
<v:cp v:nameU="ID" v:lbl="Код" v:type="0" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="Name" v:lbl="Имя" v:type="0" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="Department" v:lbl="Отдел" v:type="0" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="BelongsTo" v:lbl="Владелец" v:type="0" v:invis="true" v:langID="1049"/>
<v:cp v:nameU="Modify" v:lbl="Дата изменения" v:type="5" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="AssetNumber" v:lbl="Инвентарный номер" v:type="0" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="SerialNumber" v:lbl="Серийный номер" v:type="0" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="ProductDescription" v:lbl="Описание товара" v:type="0" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="PurchaseDate" v:lbl="Дата покупки" v:type="5" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="ProductNumber" v:lbl="Номер товара" v:type="0" v:langID="1049"/>
<v:cp v:nameU="BaseElevation" v:lbl="Базовая высота" v:type="2" v:langID="1049"/>
<v:cp v:nameU="Width" v:lbl="" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="0" v:cal="0" v:val="VT0(37.992125984252):1"/>
<v:cp v:nameU="Depth" v:lbl="" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="0" v:cal="0" v:val="VT0(13.72306781628):1"/>
</v:custProps>
<v:userDefs>
<v:ud v:nameU="3D_type" v:val="VT0(1):26"/>
<v:ud v:nameU="3D_model_id" v:val="VT4(диван)"/>
<v:ud v:nameU="visFMName"/>
<v:ud v:nameU="AntiScale" v:val="VT0(100):26"/>
<v:ud v:nameU="HasText" v:val="VT0(0):5"/>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
<v:ud v:nameU="SolSH" v:val="VT4({5D50005D-537C-4738-9C46-130C74335A6D})"/>
<v:ud v:nameU="ShapeClass" v:prompt="Актив" v:val="VT0(2):26"/>
<v:ud v:nameU="ShapeType" v:prompt="Мебель" v:val="VT0(21):26"/>
<v:ud v:nameU="SubShapeType" v:prompt="Кресло" v:val="VT0(12):26"/>
<v:ud v:nameU="AntiScale" v:prompt="" v:val="VT0(50):26"/>
</v:userDefs>
<path transform="" d="M18.06 787.18 L1.42 787.18 A1.4173 1.4173 -180 0 0 -0 788.6 L0 840.47 A1.4173 1.4173 -180 0
0 1.42 841.89 L18.06 841.89 A1.70079 3.40157 -180 0 0 18.06 835.09 L18.06 793.98 A1.70079 3.40157 -180
0 0 18.06 787.18 Z" class="st3"/>
<path transform="" d="M18.06 787.18 L1.42 787.18 A1.4173 1.4173 -180 0 0 -0 788.6 L0 840.47 A1.4173 1.4173 -180 0
0 1.42 841.89 L18.06 841.89 A1.70079 3.40157 -180 0 0 18.06 835.09 L18.06 793.98 A1.70079 3.40157 -180
0 0 18.06 787.18" class="st4"/>
<path transform="" d="M18.06 835.09 L5.67 835.09 L5.67 793.98 L18.06 793.98" class="st4"/>
<path transform="" d="M18.06 814.53 L5.67 814.53" class="st4"/>
<path transform="" d="M5.67 835.09 A2.83423 6.80215 0 0 1 2.83 841.89" class="st4"/>
<path transform="" d="M2.83 787.18 A2.83423 6.80215 0 0 1 5.67 793.98" class="st4"/>
</g>
<g id="shape116-130" v:mID="116" v:groupContext="shape" v:layerMember="0;1"
transform="translate(-787.18,841.889) rotate(-90)" class="sofa draggable-group">
<title>2 seat sofa</title>
<v:custProps>
<v:cp v:nameU="Width" v:lbl="Ширина" v:type="4"
v:format="800 mm;1000 mm;1200 mm;1400 mm;1600 mm;1800 mm;2000 mm" v:langID="1049"
v:val="VT0(62.992125984252):24"/>
<v:cp v:nameU="Depth" v:lbl="Глубина" v:type="4" v:format="500 mm;600 mm;700 mm;800 mm;900 mm;1000 mm"
v:langID="1049" v:val="VT0(31.496062992126):24"/>
<v:cp v:nameU="ShapeClass" v:lbl="Класс фигуры" v:invis="true" v:langID="1049" v:val="VT4(Актив)"/>
<v:cp v:nameU="ShapeType" v:lbl="Тип фигуры" v:invis="true" v:langID="1049" v:val="VT4(Мебель)"/>
<v:cp v:nameU="SubShapeType" v:lbl="Тип вложенной фигуры" v:invis="true" v:langID="1049" v:val="VT4(Кресло)"/>
<v:cp v:nameU="ID" v:lbl="Код" v:type="0" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="Name" v:lbl="Имя" v:type="0" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="Department" v:lbl="Отдел" v:type="0" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="BelongsTo" v:lbl="Владелец" v:type="0" v:invis="true" v:langID="1049"/>
<v:cp v:nameU="Modify" v:lbl="Дата изменения" v:type="5" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="AssetNumber" v:lbl="Инвентарный номер" v:type="0" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="SerialNumber" v:lbl="Серийный номер" v:type="0" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="ProductDescription" v:lbl="Описание товара" v:type="0" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="PurchaseDate" v:lbl="Дата покупки" v:type="5" v:invis="false" v:langID="1049"/>
<v:cp v:nameU="ProductNumber" v:lbl="Номер товара" v:type="0" v:langID="1049"/>
<v:cp v:nameU="BaseElevation" v:lbl="Базовая высота" v:type="2" v:langID="1049"/>
<v:cp v:nameU="Width" v:lbl="" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="0" v:cal="0" v:val="VT0(37.992125984252):1"/>
<v:cp v:nameU="Depth" v:lbl="" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="0" v:cal="0" v:val="VT0(13.72306781628):1"/>
</v:custProps>
<v:userDefs>
<v:ud v:nameU="3D_type" v:val="VT0(1):26"/>
<v:ud v:nameU="3D_model_id" v:val="VT4(диван)"/>
<v:ud v:nameU="visFMName"/>
<v:ud v:nameU="AntiScale" v:val="VT0(100):26"/>
<v:ud v:nameU="HasText" v:val="VT0(0):5"/>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
<v:ud v:nameU="SolSH" v:val="VT4({5D50005D-537C-4738-9C46-130C74335A6D})"/>
<v:ud v:nameU="ShapeClass" v:prompt="Актив" v:val="VT0(2):26"/>
<v:ud v:nameU="ShapeType" v:prompt="Мебель" v:val="VT0(21):26"/>
<v:ud v:nameU="SubShapeType" v:prompt="Кресло" v:val="VT0(12):26"/>
<v:ud v:nameU="AntiScale" v:prompt="" v:val="VT0(50):26"/>
</v:userDefs>
<path transform="" d="M18.06 787.18 L1.42 787.18 A1.4173 1.4173 -180 0 0 -0 788.6 L0 840.47 A1.4173 1.4173 -180 0
0 1.42 841.89 L18.06 841.89 A1.70079 3.40157 -180 0 0 18.06 835.09 L18.06 793.98 A1.70079 3.40157 -180
0 0 18.06 787.18 Z" class="st3"/>
<path transform="" d="M18.06 787.18 L1.42 787.18 A1.4173 1.4173 -180 0 0 -0 788.6 L0 840.47 A1.4173 1.4173 -180 0
0 1.42 841.89 L18.06 841.89 A1.70079 3.40157 -180 0 0 18.06 835.09 L18.06 793.98 A1.70079 3.40157 -180
0 0 18.06 787.18" class="st4"/>
<path transform="" d="M18.06 835.09 L5.67 835.09 L5.67 793.98 L18.06 793.98" class="st4"/>
<path transform="" d="M18.06 814.53 L5.67 814.53" class="st4"/>
<path transform="" d="M5.67 835.09 A2.83423 6.80215 0 0 1 2.83 841.89" class="st4"/>
<path transform="" d="M2.83 787.18 A2.83423 6.80215 0 0 1 5.67 793.98" class="st4"/>
</g>
</g>
</g>
</svg>
</svg>
</body>
</html>