Как получить абсолютную позицию дочерних фигур, используя apache poi - PullRequest
1 голос
/ 20 марта 2020

Это groupShape с дочерней формой:

<p:nvgrpsppr> 
   <p:cnvpr name="Group 256" id="260" /> 
   <p:cnvgrpsppr> 
    <a:grpsplocks nochangeaspect="1" /> 
   </p:cnvgrpsppr> 
   <p:nvpr /> 
  </p:nvgrpsppr> 
  <p:grpsppr bwmode="auto"> 
   <a:xfrm> 
    <a:off y="1940518" x="2952779" /> 
    <a:ext cy="2209679" cx="1219680" /> 
    <a:choff y="1052" x="1972" /> 
    <a:chext cy="1116" cx="616" /> 
   </a:xfrm> 
   <a:solidfill> 
    <a:srgbclr val="F7B63E" /> 
   </a:solidfill> 
  </p:grpsppr> 
  <p:sp> 
   <p:nvsppr> 
    <p:cnvpr name="Freeform 257" id="262" /> 
    <p:cnvsppr> 
     <a:splocks noeditpoints="1" /> 
    </p:cnvsppr> 
    <p:nvpr /> 
   </p:nvsppr> 
   <p:sppr bwmode="auto"> 
    <a:xfrm> 
     <a:off y="1160" x="2161" /> 
     <a:ext cy="287" cx="288" /> 
    </a:xfrm>
   </p:sppr>
  </p:sp>

Когда я разгруппируюсь, получим это:

  <p:grpsppr> 
   <a:xfrm> 
    <a:off y="0" x="0" /> 
    <a:ext cy="0" cx="0" /> 
    <a:choff y="0" x="0" /> 
    <a:chext cy="0" cx="0" /> 
   </a:xfrm> 
  </p:grpsppr> 
  <p:sp> 
   <p:nvsppr> 
    <p:cnvpr name="Freeform 257" id="262" /> 
    <p:cnvsppr> 
     <a:splocks noeditpoints="1" /> 
    </p:cnvsppr> 
    <p:nvpr /> 
   </p:nvsppr> 
   <p:sppr bwmode="auto"> 
    <a:xfrm> 
     <a:off y="2154358" x="3326999" /> 
     <a:ext cy="568260" cx="570240" /> 
    </a:xfrm>
   </p:sppr>
  </p:sp>

ChildShape преобразуется в абсолютное позиционирование.

<a:xfrm> 
 <a:off y="1160" x="2161" /> 
 <a:ext cy="287" cx="288" /> 
</a:xfrm>

converted to:

<a:xfrm> 
 <a:off y="2154358" x="3326999" /> 
 <a:ext cy="568260" cx="570240" /> 
</a:xfrm>

Я рассчитал длину и ширину по расчету.

width = (группа a: ext: cx ) / (группа a: chExt: cx ) * (дочерний элемент a: ext: x );

высота = (группа a: ext: cy ) / (группа a: chExt: cy ) * (дочерний элемент a: ext: y );

Но я пробовал много видов операций, и я не мог понять, как преобразовать координату x и y.

Какую операцию я должен пройти, чтобы преобразовать y : 1160 до y: 2154358.

, пожалуйста, дайте мне несколько советов.

1 Ответ

3 голосов
/ 20 марта 2020

В вашей группе XML

<a:off y="1940518" x="2952779" /> 
<a:ext cy="2209679" cx="1219680" /> 

означает: группа начинается с y 1940518, x 2952779 и имеет экстент высоты 2209679 и ширины 1219680.

<a:choff y="1052" x="1972" /> 
<a:chext cy="1116" cx="616" /> 

означает: дочерняя часть группы начинается с y 1052, x 1972 и имеет экстент высоты 1116 и ширины 616. Это исходные значения фигур при группировке.

Это показывает, что форма вашей группы сильно масштабирована. Он был небольшим, а затем был масштабирован с коэффициентом 1980.

scale_factor_y = ext_cy / chext_cy 
               = 2209679 / 1116 
               ≈ 1980

scale_factor_x = ext_cx / chext_cx 
               = 1219680 / 616
               = 1980

Для вашего ребенка в группе

 <a:off y="1160" x="2161" /> 
 <a:ext cy="287" cx="288" /> 

означает: немасштабированное смещение составляет y 1160, x 2161. А немасштабированный экстент - это высота 287 и ширина 288.

В разгруппированном виде масштабированное смещение равно:

off_y = (not_scaled_off_y - choff_y) * scale_factor_y + group_off_y
      = (1160  - 1052) * 1980 + 1940518
      = 2154358

off_x = (not_scaled_off_x - choff_x) * scale_factor_x + group_off_x
      = (2161  - 1972) * 1980 + 2952779
      = 3326999

, а масштабированный экстент:

ext_cy = not_scaled_ext_cy * scale_factor_y
       = 287 * 1980
       = 568260

ext_cx = not_scaled_ext_cx * scale_factor_x
       = 288 * 1980
       = 570240

Это приводит к вашему

<a:off y="2154358" x="3326999" /> 
<a:ext cy="568260" cx="570240" /> 

для ребенка из группы, который теперь имеет тот же масштабированный размер, что и группа в прошлом.

...