如何在绘图中的旧对象下创建新对象?

问题描述 投票:0回答:1

我有代码创建第一个对象,然后创建位于第一个对象之上的第二个对象。目标是分割第二个对象,使其不与第一个对象重叠。简单来说,就是让第二个物体隐藏在第一个物体下面。

import win32com.client
import pythoncom

acad = win32com.client.Dispatch("AutoCAD.Application")
ms = acad.ActiveDocument.ModelSpace
doc = acad.ActiveDocument 

obj_1 = [[0.09, 0.98, 0.13, 0.98, 0.17, 0.97, 0.2, 0.94, 0.2, 0.91, 0.17, 0.88, 0.13, 0.87, 0.09, 0.87, 0.05, 0.88, 0.02, 0.91, 0.02, 0.94, 0.05, 0.97, 0.09, 0.98]]
obj_2 = [[0.1, 0.77, 0.2, 1.07]]

def create_lines(coords):
    for line_coords in coords:
        for i in range(0, len(line_coords)-2, 2):
            x1, y1 = line_coords[i], line_coords[i+1]
            x2, y2 = line_coords[i+2], line_coords[i+3]
            ms.AddLine(APoint(x1, y1), APoint(x2, y2))


create_lines(obj_1)
create_lines(obj_2)

也许可以用 shapely 库来完成,但我还不明白怎么做。

python shapely
1个回答
0
投票

IIUC 并假设每个对象有多个 坐标,您可以绘制其

difference
unary_union
:

import matplotlib.pyplot as plt
from more_itertools import batched
from shapely import LineString, Polygon, unary_union
from shapely.plotting import plot_line

def create_lines(coords):
    return unary_union(
        [
            (
                Polygon(batched(coo, 2))
                if LineString(batched(coo, 2)).is_ring
                else LineString(batched(coo, 2))
            )
            for coo in coords
        ]
    )

lines1 = create_lines(obj_1)
lines2 = create_lines(obj_2)

plot_line(lines2.difference(lines1), color="w", add_points=False, ax=ax)
plot_line(lines1.exterior, color="w", lw=2, add_points=False, ax=ax)

ax.set(facecolor="#242c34", xticks=[], yticks=[])

© www.soinside.com 2019 - 2024. All rights reserved.