程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Using Python to IMAGECLIP an image in Autocad

发布于2025-01-04 14:29     阅读(1051)     评论(0)     点赞(30)     收藏(4)


I want to automatize the creation of a Clipping Boundary of an Image (references externes) in Autocad using known coordinates.

I'm able to do it manually using the native function IMAGECLIP in Autocad by drawing a polygon.

It seems the key parameter is ClipBoundary But I'm not able to use it proprely. For your information, the ObjectName of the image is AcDbRasterImage and it has beed add via AddRaster(image_path, insertion_point, 1, 0) (pyautocad). https://help.autodesk.com/view/OARX/2022/ENU/?guid=GUID-D9612F57-7F1F-4CFD-B804-838B826C59FC

I've try this code but it doesn't work :

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.")

The result of the script is : no error message, but nothing happens

This is the result when I use : print(raster.ClipBoundary) before passing points

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

and this is the result of the print(raster.ClipBoundary) after passing points:

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

My conclusion is either I don't pass the good kind of datas (array of points?) or I do not know how to use ClipBoundary.... it seems ClipBoundary is not anymore a method after passing parameters points

While raster.ClipBoundary = points doesn't work, raster.ClippingEnabled = True does work ( I noticed the parameter in Autocad UI changed whenever I pass a parameter True or False for ClippingEnabled)

I'm in nativ WCS (I did not change it). Maybe it's a problem of coordinate system? Does ClipBoundary need points to be passed in local (relativ from the image, from the insert_point of the image? from the boundingbox of the image)? maybe I should use ClipBoundary like a fonction() ?

I also tried to pass directly a polygon, but it doesn't work: from pyautocad import Autocad, APoint, aDouble import comtypes.client from ctypes import 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.")

Even if I would like to avoid "SendCommand" method, as much as possible. I will accept this solution.


解决方案


Note: I don't have AutoCAD installed, so I can't do any testing to support my statement(s).

But as the very URL from the question ([AutoDesk.Help]: ClipBoundary Method (ActiveX)) states, ClipBoundary is a method, which means it has to be invoked.

raster.ClipBoundary = points

doesn't make any sense, instead you should:

raster.ClipBoundary(points)


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/2046727/bf005ddb3c0b19af6de5/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

30 0
收藏该文
已收藏

评论内容:(最多支持255个字符)