Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Абсолютное (translate) смешение элемента <g> внутри SVG (https://javascript.ru/forum/dom-window/76103-absolyutnoe-translate-smeshenie-ehlementa-g-vnutri-svg.html)

Vad0k 05.12.2018 19:01

Эх... я уже попадал на данный пример из Реализация Drag and Drop
На основе него уже действительно хорошо разобрался и реализовал хороший drag & drop.

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

Вижу решение одно, но оно мне не нравиться: это рекурсивно перебирать группы и смотреть их позиционирование распарсивая transform="translate" и суммируя в координату, но скорее это ресурсоемкая будет задачей, когда элементов будет больше

<!-- СЕТКА -->
                <g class="grid"><rect width="100%" height="100%" fill="url(#grid)" /></g>
                <!-- СЕТКА -->

                <!-- СПИСОК КАНАЛОВ -->
                <g class="chanel-lines"></g>
                <!-- СПИСОК КАНАЛОВ -->

                <!-- УСТРОЙТСВА -->
                <g class="svg-schema"></g>
                <!-- УСТРОЙТСВА -->

Внутри устройств лежат уже сами блоки обернуты в <g> с transform="translate(x y)"... В общем как-то так

Vad0k 06.12.2018 10:47

Решение найдено. Готовых методов нет в ES6+ для SVG2.0... Можно только рекурсией к родительскому элементу получить.
решение

RX200 28.12.2018 00:24

Цитата:

Сообщение от Vad0k
Можно только рекурсией к родительскому элементу получить.

Я подобные задачи решал не через рекурсию, вот пример может и вам подойдет.
<head>
<script type="text/javascript">
function test(){
	let svgns = "http://www.w3.org/2000/svg";
	let svg = document.getElementsByClassName('canvas-svg')[0];
	let elm_g = document.getElementById("circle");
	let CTM = svg.getScreenCTM();
	let elm_g_pos_x = (elm_g.getBoundingClientRect().left - CTM.e) / CTM.a;
	let path_x = document.createElementNS(svgns, "path");
	path_x.setAttributeNS(null, "d", "M"+elm_g_pos_x+",0 v1000");
	path_x.setAttributeNS(null, "fill", "transparent");
	path_x.setAttributeNS(null, "stroke", "black");
	svg.appendChild(path_x);
	let elm_g_pos_y = (elm_g.getBoundingClientRect().top - CTM.f) / CTM.d;
	let path_y = document.createElementNS(svgns, "path");
	path_y.setAttributeNS(null, "d", "M0,"+elm_g_pos_y+" h1000");
	path_y.setAttributeNS(null, "fill", "transparent");
	path_y.setAttributeNS(null, "stroke", "black");
	svg.appendChild(path_y);
	let elm_g_pos_cx = elm_g_pos_x + elm_g.getAttributeNS(null, "r") * 1;
	let path_cx = document.createElementNS(svgns, "path");
	path_cx.setAttributeNS(null, "d", "M"+elm_g_pos_cx+",0 v1000");
	path_cx.setAttributeNS(null, "fill", "transparent");
	path_cx.setAttributeNS(null, "stroke", "black");
	path_cx.setAttributeNS(null, "stroke-dasharray", "4");
	svg.appendChild(path_cx);
	let elm_g_pos_cy = elm_g_pos_y + elm_g.getAttributeNS(null, "r") * 1;
	let path_cy = document.createElementNS(svgns, "path");
	path_cy.setAttributeNS(null, "d", "M0,"+elm_g_pos_cy+" h1000");
	path_cy.setAttributeNS(null, "fill", "transparent");
	path_cy.setAttributeNS(null, "stroke", "black");
	path_cy.setAttributeNS(null, "stroke-dasharray", "4");
	svg.appendChild(path_cy);
}
window.onload = test;
</script>
</head>
<body>
<svg width="100%" height="100%" viewBox="0 0 1000 1000" preserveAspectRatio="xMidYMin slice" x="0" y="0" class="canvas-svg" tabindex="1">
<g transform="translate(100 100)">
     <g transform="translate(100 100)"> 
          <circle id="circle" r="50" cx="25" cy="25" fill="yellow" />
     </g>
</g>
<svg>
</body>

рони 28.12.2018 00:54

RX200,
на всякий случай
getBoundingClientRect()
и
run
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

RX200 28.12.2018 01:27

рони,
Исправил. А вот красным он не те строки почему то выделяет. от *!* и */!* пришлось отказаться)

рони 28.12.2018 09:09

Цитата:

Сообщение от RX200
от *!* и */!* пришлось отказаться)

отдельной строкой делали?
*!*
 
и 

*/!*
123
*!*
 
и 

*/!*

RX200 28.12.2018 17:01

Цитата:

Сообщение от рони
отдельной строкой делали?

Да я так и сделал на четыре резные строки, 8, 14, 20, 27 но выделились почему то 8 и еще какие то три которых я не выделял, я перепроверил но в тексте были одни строки выделены а визуально другие только первая строка 8 совпала.


Часовой пояс GMT +3, время: 06:29.