我有代码创建第一个对象,然后创建位于第一个对象之上的第二个对象。目标是分割第二个对象,使其不与第一个对象重叠。简单来说,就是让第二个物体隐藏在第一个物体下面。
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 库来完成,但我还不明白怎么做。
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=[])