【问题标题】:How to get the absolute position of child shapes by using apache poi如何使用 apache poi 获取子形状的绝对位置
【发布时间】:2020-03-20 08:15:21
【问题描述】:

这是一个带有子形状的 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 = (group a:ext:cx) / (group a:chExt:cx) * (child a:ext:x >);

height = (group a:ext:cy) / (group a:chExt:cy) * (child a:ext:y >);

但是我尝试了很多种操作,都无法得到x坐标和y坐标的转换方法。

我应该通过什么操作来将 y:1160 转换为 y:2154358。

请给我一些建议。

【问题讨论】:

    标签: java apache-poi openxml shapes


    【解决方案1】:

    在你的群里XML

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

    表示:组从y1940518、x2952779开始,高度为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" /> 
    

    表示:未缩放的偏移量为y1160,x2161。未缩放的范围为高度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" /> 
    

    对于现在与之前的组具有相同比例大小的组外的孩子。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多