javascript 在Illustrator中操作SVG文件以将路径名称更改为该路径中的文本

oknwwptz  于 2023-01-16  发布在  Java
关注(0)|答案(1)|浏览(159)

我目前在Illustrator上有一个文件需要处理。在这个文件(SVG)中,有许多矩形或“路径”,它们被命名为(路径)。在这些路径的顶部,有一些文本,我想使用这些文本来将文档中的所有路径重命名为它们的特定(ID)。
enter image description here ID只是位于文档路径顶部的文本。希望您能够在上面的图像中看到我的意思。
目前,文本和那些框是分开的,我需要用位于它们上面的相应文本重命名这些框。
我目前正在通过手动复制和粘贴文本并重命名框来完成此操作。
有人知道如何写一些东西,将自动为我吗?
我对编程世界还很陌生。我甚至不知道从哪里开始。
我在想像Snap.svg这样的JS库会很好吗?
任何帮助都将不胜感激,因为这份文件是非常非常大的(不仅仅是那张图片),它需要很长的时间来做到这一点。
我试过看Snap.svg,但由于我缺乏经验,我不知道从哪里开始。有更多经验的人可能会发现这非常简单,需要几分钟才能想出解决方案。

ijxebb2r

ijxebb2r1#

通过document.elementsFromPoint()搜索底层元素

请记住:svg <text>元素不能嵌套在<rects>这样的形状中-所以我们不能查询子元素。
document.elementsFromPoint()返回特定点坐标处的元素数组,所有主流浏览器都原生支持document.elementsFromPoint()-不需要snap.svg或其他库。
1.查询所有<text>元素
1.获取中心坐标:
let bb = label.getBoundingClientRect();
let x = bb.left + bb.width/2;
let y = bb.top + bb.height/2;
1.查找元素let els = document.elementsFromPoint(x, y)

let svg = document.querySelector('svg');
let labels = document.querySelectorAll('text');

labels.forEach(label => {
  let bb = label.getBoundingClientRect();
  let x = bb.left + bb.width / 2;
  let y = bb.top + bb.height / 2;
  // sanitize id string
  let id = label.textContent.replaceAll(' ', '-').replaceAll('#', '').toLowerCase();

  // filter only geometry elements
  let els = document.elementsFromPoint(x, y).filter(el => el instanceof SVGGeometryElement);

  // optional: select only first underlying element
  let onlyFirstUnderlying = false;
  if (onlyFirstUnderlying) {
    els = [els[0]];
  }
  els.forEach((el, i) => {
    el.id = id
    // add incremental suffix to prevent duplicate ids
    if (els.length > 1 && i > 0) {
      el.id += '_' + i
    }
  })
  let newSvg = new XMLSerializer().serializeToString(svg);
  output.value = newSvg;
})
svg {
  max-width: 10em;
  height: auto;
  border: 1px solid #ccc;
}

text {
  font-size: 10px
}

#output {
  display: block;
  width: 100%;
  min-height: 20em;
}
<svg id="svg" viewBox="0 0 100 100">
  <rect x="0" y="0" width="50" height="50" fill="yellow" />
  <text x="10" y="25">Label 01</text>
  <rect x="0" y="50" width="50" height="50" fill="orange" />
  <rect x="0" y="50" width="40" height="50" fill="purple" />
  <rect x="0" y="50" width="30" height="50" fill="pink" />
  <text x="10" y="75">Label 02</text>
</svg>
<h3>Output</h3>
<textarea id="output"></textarea>

相关问题