Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 05.12.2018, 19:01
Новичок на форуме
Отправить личное сообщение для Vad0k Посмотреть профиль Найти все сообщения от Vad0k
 
Регистрация: 30.11.2018
Сообщений: 8

Эх... я уже попадал на данный пример из Реализация 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, 05.12.2018 в 19:17.
Ответить с цитированием
  #12 (permalink)  
Старый 06.12.2018, 10:47
Новичок на форуме
Отправить личное сообщение для Vad0k Посмотреть профиль Найти все сообщения от Vad0k
 
Регистрация: 30.11.2018
Сообщений: 8

Решение найдено. Готовых методов нет в ES6+ для SVG2.0... Можно только рекурсией к родительскому элементу получить.
решение
Ответить с цитированием
  #13 (permalink)  
Старый 28.12.2018, 00:24
Аспирант
Отправить личное сообщение для RX200 Посмотреть профиль Найти все сообщения от RX200
 
Регистрация: 06.02.2011
Сообщений: 54

Сообщение от 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>

Последний раз редактировалось RX200, 31.12.2018 в 18:54.
Ответить с цитированием
  #14 (permalink)  
Старый 28.12.2018, 00:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

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

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #15 (permalink)  
Старый 28.12.2018, 01:27
Аспирант
Отправить личное сообщение для RX200 Посмотреть профиль Найти все сообщения от RX200
 
Регистрация: 06.02.2011
Сообщений: 54

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

Последний раз редактировалось RX200, 28.12.2018 в 01:38.
Ответить с цитированием
  #16 (permalink)  
Старый 28.12.2018, 09:09
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

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

*/!*
123
*!*
 
и 

*/!*

Последний раз редактировалось рони, 28.12.2018 в 18:08.
Ответить с цитированием
  #17 (permalink)  
Старый 28.12.2018, 17:01
Аспирант
Отправить личное сообщение для RX200 Посмотреть профиль Найти все сообщения от RX200
 
Регистрация: 06.02.2011
Сообщений: 54

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

Последний раз редактировалось RX200, 31.12.2018 в 18:52.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли использовать анимацию svg внутри canvas? Negotiant Общие вопросы Javascript 0 30.08.2017 10:56
JS как изменить позицию SVG элемента? mkrichet Общие вопросы Javascript 2 09.12.2015 08:59
Создание SVG элемента и вставка на страницу FINoM Events/DOM/Window 3 13.09.2015 16:47
Event тега object после подгрузки svg контента внутри него Wahlberg Events/DOM/Window 8 26.01.2015 19:38
Обработка события элемента внутри создавшего его объекта pauluss Общие вопросы Javascript 10 10.09.2010 17:01