如何在 python-pptx 中获取给定形状的连接点坐标

How to get co-ordinates of connecting points for a given shape in python-pptx

我的任务是将 arrow/line 从 shape1 连接到 shape2。在这样做的同时,我需要沿着形状的周边获得 连接点 的精确坐标。明确地说,我所说的连接点是指当您尝试在 powerpoint 工具中将 arrow/line 连接到形状时,沿着形状的周边看到的绿色小气泡。我只对这些点感兴趣,因为 PPT 软件添加了视觉上吸引人的对齐方式 if 连接到这些点。

在现有代码中,有两个函数_move_begin_to_cxn() and _move_end_to_cxn(),它们共享共同的逻辑,它们获取连接点的坐标。但这仅适用于矩形的情况。这是因为我们只有形状的左上角位置和宽高。

    def _move_end_to_cxn(self, shape, cxn_pt_idx):
        """
        Move the end point of this connector to the coordinates of the
        connection point of *shape* specified by *cxn_pt_idx*.
        """
        x, y, cx, cy = shape.left, shape.top, shape.width, shape.height
        self.end_x, self.end_y = {
            0: (int(x + cx / 2), y),
            1: (x, int(y + cy / 2)),
            2: (int(x + cx / 2), y + cy),
            3: (x + cx, int(y + cy / 2)),
        }[cxn_pt_idx]

这很难计算复杂的形状 - 例如椭圆形、五边形、平行四边形 - 只有左上角的位置和宽度 - 高度。

有什么有效的方法可以准确定位可连接点?任何帮助将不胜感激。

提前致谢!

没有平滑的方程来获得任意形状的那些点。 PPT 硬编码这些点,参数化到边界框,并在适​​当的时候简单地激活它们。

幸运的是,您不必将它们计算到 13 位有效数字。获得积分的一种简单但乏味的方法是自己对它们进行硬编码。在PPT中创建一个想要的形状,尽可能放大,并从放大中读取相对坐标。将这些参数存储在每个形状的列表中。

另一种直接的方法是检查每个形状的连接点;它们都是边或弧的极值点和中点。使用基本的解析几何来计算每个点的相对坐标。同样,将这些硬编码到您的应用程序中。

无论您选择哪种方式,您都可能会偏离一两个像素,但这足以让 PPT 识别出您想要连接。