Ответ 1
Если "импортированный" означает "часть" разметки страницы, а затем используется вашим кодом d3, то да, вы можете использовать svg defs element, чтобы сохранить определение вашей пользовательской формы. Затем в вашем коде создается элемент use
для ссылки на него:
var node = svg.selectAll("g.node")
.data(nodes)
.enter()
.append("g")
.attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; } )
node.append("use")
.attr("xlink:href","#myshape")
Вот полный пример вышеупомянутого подхода. Я использовал Inkscape, но концепция одинаков:
http://bl.ocks.org/explunit/5988971
Обратите внимание, что пространство имен xlink в определении svg важно, чтобы элемент use
работал правильно, и я вижу, что у вас уже есть его код:
xmlns:xlink="http://www.w3.org/1999/xlink"
Если при "импортировании" вы загружаете "на лету", тогда нужен другой подход, как это предлагает @LarsKotthoff. Но похоже, что вы просто хотите повторно использовать существующее определение формы, и вышеупомянутый подход позволяет вам это сделать. Элемент <g>
устанавливает положение фигур, а затем добавляется дочерний элемент node <use>
, чтобы вытащить фактическую форму, определенную ранее.
Определение формы находится в элементе svg в теле, а не в самом javascript. Это отличается от многих примеров D3.js, которые имеют элемент svg, созданный динамически с помощью кода javascript.
Единственное соединение между ними - это идентификатор строки, который вы ввели в href ( "myshape" в этом случае), чтобы соответствовать идентификатору в разделе defs
:
node.append("use").attr("xlink:href","#myshape")