#svg
#svg
Вопрос:
Я хотел бы создать сетку чертежей, созданных разными авторами в разных программах, и уменьшить масштаб каждого чертежа до одинакового размера. Обратите внимание, что все чертежи будут созданы с одинаковым соотношением сторон.
Вот пример. Я попытался установить оболочку viewBox вокруг каждого чертежа с помощью preserveAspectRatio, чтобы заставить его масштабироваться. Что я делаю не так?
<svg xmlns="http://www.w3.org/2000/svg" width="18in" height="12in" viewBox="0 0 1296 864">
<defs>
<svg width="3.25in" height="5.25in" viewBox="0 0 234 378" preserveAspectRatio="xMinYMin meet">
<svg id="ad">
<g transform="matrix(1,0,0,1,-37.5,-37.5)"> <g transform="matrix(1,0,0,1,20,10)"> <ellipse cx="143.406" cy="150.564" rx="107.776" ry="107.172" style="fill:none;stroke:rgb(255,0,0);stroke-width:1px;"/> </g> <path d="M842.64,75L968.522,145.424L920.439,259.373L764.841,259.373L716.758,145.424L842.64,75Z" style="fill:none;stroke:rgb(255,0,0);stroke-width:1px;"/> <g transform="matrix(1,0,0,1,20,-20)"> <rect x="35.629" y="1385.57" width="240.5" height="222.221" style="fill:none;stroke:rgb(255,0,0);stroke-width:1px;"/> </g> <g transform="matrix(1,0,0,1,25.1242,54.6384)"> <path d="M953.901,1534.08C967.723,1515.42 975,1494.26 975,1472.72C975,1404.99 904.434,1350 817.516,1350C730.598,1350 660.032,1404.99 660.032,1472.72C660.032,1494.26 667.308,1515.42 681.131,1534.08L953.901,1534.08Z" style="fill:none;stroke:rgb(255,0,0);stroke-width:1px;"/> </g> <path d="M571.57,566.256L620.774,717.688L779.999,717.688L651.183,811.278L700.386,962.71L571.57,869.12L442.755,962.71L491.958,811.278L363.142,717.688L522.367,717.688L571.57,566.256Z" style="fill:none;stroke:rgb(255,0,0);stroke-width:1px;"/> </g>
</svg>
</svg>
<svg width="3.25in" height="5.25in" viewBox="0 0 234 378" preserveAspectRatio="xMinYMin meet">
<svg id="il">
<rect class="cls-1" x="2.6" y="4.45" width="42.14" height="42.14"/><polygon class="cls-1" points="171.37 243.59 95.5 265.83 38.29 211.25 56.96 134.41 132.84 112.17 190.04 166.75 171.37 243.59"/><circle class="cls-1" cx="216.79" cy="17.66" r="13.21"/><circle class="cls-1" cx="216.79" cy="363.73" r="11.68"/><circle class="cls-1" cx="21.7" cy="356.31" r="19.1"/>
</svg>
</svg>
</defs>
<svg x="0"><use href="#il" /></svg>
<svg x="234"><use href="#ad" /></svg>
</svg>
Комментарии:
1.
<use>
элемент может принимать атрибуты awidth
и aheight
. Используйтеwidth
иheight
, чтобы задать необходимый размер. Используйте атрибутыx
иy
для позиционирования<use>
элемента. Вам не нужно переносить use в элемент svg2. Если я задаю ширину и высоту
use
элемента, то он просто обрезает изображение, а не масштабирует его.3. И вам понадобится окно просмотра для элементов #ad и #il svg
4. Добавили ли вы атрибуты width height x и y к элементам use? Можете ли вы отредактировать свой вопрос и заменить код тем, что у вас есть прямо сейчас?
5. Я понял это из того, что вы мне сказали. Я отвечу на свой вопрос ниже. Могу ли я предложить вам немного денег через PayPal за вашу помощь?
Ответ №1:
Хорошо, с помощью @enxaneta я понял, как заставить это работать. Вот результирующий файл:
<svg xmlns="http://www.w3.org/2000/svg" width="18in" height="12in" viewBox="0 0 1296 864">
<defs>
<svg id="ad" viewBox="0 0 975 1575" spreserveAspectRatio="xMinYMin meet">
<g transform="matrix(1,0,0,1,-37.5,-37.5)"> <g transform="matrix(1,0,0,1,20,10)"> <ellipse cx="143.406" cy="150.564" rx="107.776" ry="107.172" style="fill:none;stroke:rgb(255,0,0);stroke-width:1px;"/> </g> <path d="M842.64,75L968.522,145.424L920.439,259.373L764.841,259.373L716.758,145.424L842.64,75Z" style="fill:none;stroke:rgb(255,0,0);stroke-width:1px;"/> <g transform="matrix(1,0,0,1,20,-20)"> <rect x="35.629" y="1385.57" width="240.5" height="222.221" style="fill:none;stroke:rgb(255,0,0);stroke-width:1px;"/> </g> <g transform="matrix(1,0,0,1,25.1242,54.6384)"> <path d="M953.901,1534.08C967.723,1515.42 975,1494.26 975,1472.72C975,1404.99 904.434,1350 817.516,1350C730.598,1350 660.032,1404.99 660.032,1472.72C660.032,1494.26 667.308,1515.42 681.131,1534.08L953.901,1534.08Z" style="fill:none;stroke:rgb(255,0,0);stroke-width:1px;"/> </g> <path d="M571.57,566.256L620.774,717.688L779.999,717.688L651.183,811.278L700.386,962.71L571.57,869.12L442.755,962.71L491.958,811.278L363.142,717.688L522.367,717.688L571.57,566.256Z" style="fill:none;stroke:rgb(255,0,0);stroke-width:1px;"/> </g>
</svg>
<svg id="il" viewBox="0 0 234 378" spreserveAspectRatio="xMinYMin meet">
<rect class="cls-1" x="2.6" y="4.45" width="42.14" height="42.14"/><polygon class="cls-1" points="171.37 243.59 95.5 265.83 38.29 211.25 56.96 134.41 132.84 112.17 190.04 166.75 171.37 243.59"/><circle class="cls-1" cx="216.79" cy="17.66" r="13.21"/><circle class="cls-1" cx="216.79" cy="363.73" r="11.68"/><circle class="cls-1" cx="21.7" cy="356.31" r="19.1"/>
</svg>
</defs>
<use href="#il" width="3.25in" height="5.25in" />
<use href="#ad" x="3.25in" width="3.25in" height="5.25in" />
</svg>
Вы должны скопировать окно просмотра из исходного чертежа в элемент svg, который его оборачивает, затем вы можете указать ширину и высоту в элементе use .