使用Python在Autocad中对图像进行IMAGECLIP

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

我想使用已知坐标在 Autocad 中自动创建图像的剪切边界(引用外部)。

我可以使用 Autocad 中的本机函数 IMAGECLIP 通过绘制多边形来手动完成此操作。

看来关键参数是ClipBoundary但我无法正确使用它。 供您参考,图像的 ObjectNameAcDbRasterImage,它已通过 AddRaster(image_path, insert_point, 1, 0) (pyautocad) 添加。 https://help.autodesk.com/view/OARX/2022/ENU/?guid=GUID-D9612F57-7F1F-4CFD-B804-838B826C59FC

我已经尝试过这段代码,但它不起作用:

import comtypes.client

# Connexion à l'application AutoCAD active
acad = comtypes.client.GetActiveObject("AutoCAD.Application")
doc = acad.ActiveDocument
modelspace = doc.ModelSpace

# Appliquer la boundary de clip à l'image raster
def apply_clip_boundary(raster, points):
    raster.ClippingEnabled = True  # Activer le clipping

    # Debugging: Output the clip points to verify the correct format
    print("Points to be passed to ClipBoundary:", list(points))
    print(raster.ClipBoundary)
    # Appliquer la ClipBoundary
    raster.ClipBoundary = points  # Assurez-vous que les points sont bien formatés
    print("Clip boundary applied and enabled.")
    print(raster.ClipBoundary)

# Créer les points 2D initiaux (x, y)
points = [
        (325100.2407, 7682500.6218),
        (325100.6019, 7682500.6218),
        (325100.6019, 7682500.3992),
        (325100.2407, 7682500.3992),
        (325100.2407, 7682500.6218)
    ]


# Sélectionner un raster par son nom
def get_raster_by_name(name):
    for item in modelspace:
        if item.ObjectName == "AcDbRasterImage" and item.Name == name:
            return item
    return None

# Obtenir le raster et appliquer la boundary
raster = get_raster_by_name("photo")
if raster:
    apply_clip_boundary(raster, points)
else:
    print("Raster not found.")

脚本的结果是:没有错误消息,但什么也没有发生

这是我在传递points之前使用:print(raster.ClipBoundary)

时的结果
<bound method ClipBoundary of <POINTER(IAcadRasterImage) ptr=0x214be61a5d8 at 214c65509c0>>

这是经过 pointsprint(raster.ClipBoundary) 的结果:

[(325100.2407, 7682500.6218), (325100.6019, 7682500.6218), (325100.6019, 7682500.3992), (325100.2407, 7682500.3992), (325100.2407, 7682500.6218)]

我的结论是要么我没有传递好的数据(点数组?),要么我不知道如何使用ClipBoundary....似乎ClipBoundary在传递参数后不再是一个方法积分

虽然 raster.ClipBoundary = points 不起作用,raster.ClippingEnabled = True 确实起作用(我注意到每当我为 ClippingEnabled 传递参数 True 或 False 时,Autocad UI 中的参数就会更改)

我使用的是原生 WCS(我没有更改它)。也许是坐标系的问题? ClipBoundary 是否需要在本地传递点(相对于图像,从图像的 insert_point?从图像的边界框)?也许我应该像使用 fonction() 一样使用 ClipBoundary

我也尝试过直接传递多边形,但是不起作用: 从 pyautocad 导入 Autocad、APoint、aDouble 导入 comtypes.client 从 ctypes 导入 c_double

# Connexion à AutoCAD via pyautocad
acad = Autocad(create_if_not_exists=True)

def apply_clip_boundary(raster, points):
    # Vérifiez si le raster est bien trouvé avant de continuer
    if not raster:
        print("Raster not found.")
        return

    # Créer une polyligne 2D avec les points fournis (pas de Z, donc uniquement X et Y)
    polyline_points = aDouble(*[coord for point in points for coord in point])  # Ajouter uniquement X et Y
    
    # Utilisation de AddLightWeightPolyline pour créer une polyline 2D
    pl = acad.model.AddLightWeightPolyline(polyline_points)
    
    # Clôturer la polyligne
    pl.Closed = True

    # Activer la boundary de clip et ajouter la géométrie au raster
    raster.ClipBoundary = pl
    raster.ClippingEnabled = True

    return pl

def get_raster_by_name(name):
    # Rechercher le raster par son nom dans le modèle
    for item in acad.iter_objects():
        if item.ObjectName == "AcDbRasterImage" and item.Name == name:
            return item
    return None

# Points définissant la boundary de découpe
points = [
    (325100.2407, 7682500.6218),
    (325100.6019, 7682500.6218),
    (325100.6019, 7682500.3992),
    (325100.2407, 7682500.3992)
]

# Obtenir le raster et appliquer la boundary
raster = get_raster_by_name("photo")
if raster:
    apply_clip_boundary(raster, points)
else:
    print("Raster not found.")

即使我想尽可能避免使用“SendCommand”方法。我会接受这个解决方案。

python ctypes autocad comtypes
1个回答
0
投票

注意:我没有安装AutoCAD,所以我无法进行任何测试来支持/测试我的陈述。

但是正如问题([AutoDesk.Help]:ClipBoundary Method (ActiveX))中的URL所述,ClipBoundary是一个方法,这意味着必须调用它

raster.ClipBoundary = points

没有任何意义,相反你应该:

raster.ClipBoundary(points)
© www.soinside.com 2019 - 2024. All rights reserved.