AutoCAD|Python 二次开发 栅格图像

首先要感谢Hulunbuir学长以及335工作室的群主对自己在AutoCAD二次开发这条不归路上的帮助与指导,才能够让我顺利的完成自己的任务。
附大佬有关AutoCAD二次开发的主页:

有不少朋友需要在AutoCAD中对于图像进行操作,比如用于等高线、地物表示等的底图;用于插入二维码图像对图块进行说明等等。本篇简要介绍常用的对于图像的属性以及方法的使用。

通过AutoCAD二次开发文档,我们能够找到Raster对象,点击后能够清楚的了解到栅格图像的插入、简单变换、以及对于栅格图像的属性。如图所示:

adams python二次开发 python二次开发cad_python

后续会介绍有关Raster对象的常用方法以及其属性。

首先建立Python和AutoCAD之间的联系,代码如下:

def autocad():
    """cad接口,连接Autocad程序,进行插入图像"""
    try:
        cad = win32com.client.GetActiveObject("Autocad.Application")	# 程序ID
        cad.Visible = True
        doc = cad.ActiveDocument  # 当前文档
        print(doc.Name)
        utilObj = doc.Utility
        utilObj.Prompt("Hello! Autocad from pywin32com.")
        msp = doc.ModelSpace
    except:
        app = 'Autocad'
        cad = win32com.client.Dispatch('%s.Application' % app)
        cad.Visible = True
        doc = cad.ActiveDocument  # 当前文档
        print(doc.Name)
        utilObj = doc.Utility
        utilObj.Prompt("Hello! Autocad from pywin32com.")
        msp = doc.ModelSpace
    return msp

在AutoCAD中进行插入图像

在AutoCAD中提供了AddRaster方法,用以把栅格图像插入到AutoCAD中。下图解释了在进行插入图像时需要提供的参数以及每一个参数的解释。

adams python二次开发 python二次开发cad_开发语言_02

对上述所涉及到的参数进行简要解释

参数名

解释说明

ImageFileName

栅格图像所在的绝对路径,如:‘C:\矩形区域.jpg’

InsertionPoint

插入栅格图像的左下角点,需要进行数据转换

ScaleFactor

尺度变化(可以理解为插入图像时的大小,图像像素与AutoCAD中单位长度的比值)

RotationAngle

插入栅格图像时是否进行旋转

插入栅格图像的代码如下:

def add_img():
    msp = autocad()	# 与AutoCAD进行连接
    FileName = 'C:\\矩形区域.jpg'	# 栅格图像的绝对路径
    InsertionPoint = [0,0,0]		# 插入图像时的左下角点
    ScaleFactor = 1		# 尺度为一,每像素代表的长度为AutoCAD中的单位长度
    RotationAngle = 0	# 旋转角度为0
    point = ConvertArrays2Variant('Double',InsertionPoint)	# 对图像坐标进行数据转换
    RetVal = msp.AddRaster(FileName, point,ScaleFactor, RotationAngle) # 使用插入图像函数
    return RetVal

结果如图所示:

adams python二次开发 python二次开发cad_python_03

图像所包含的方法

adams python二次开发 python二次开发cad_adams python二次开发_04

如图所示,我们可以进行上述任意一种函数方法的操作,与前文中对其他对象的操作类似,我们也可以进行旋转、移动、复制、删除等操作,其操作方式方法相同。

图像的移动

对于图像的移动,如图所示需要我们提供两个点

adams python二次开发 python二次开发cad_python_05

可以理解为这两个点构成的具有长度以及方向的向量,则该栅格图像则会按照该方向以及长度进行移动

adams python二次开发 python二次开发cad_adams python二次开发_06

具体代码如下:

def move_img():
    Retval = add_img()      # 插入图像
    point1 = [0,0,0]    # 起始点
    point2 = [3,0,0]    # 终止点
    point1 = ConvertArrays2Variant('Double', point1)    # 数据转换
    point2 = ConvertArrays2Variant('Double', point2)    # 数据转换
    Retval.Move(point1,point2)  # 对图像进行移动

对图像的旋转:

对于图像的旋转,需要我们提供两个参数,分别为基于某一个点进行的旋转,以及旋转的角度(弧度值)

adams python二次开发 python二次开发cad_adams python二次开发_07

具体代码如下:

def rotate_img():
    Retval = add_img()  # 添加图像  
    point1 = [0,0,0]    # 基准点
    BasePoint = ConvertArrays2Variant('Double', point1) # 数据变换
    Retval.Rotate(BasePoint,90 * 3.141592 / 180)        # 对图像进行旋转

具体如图所示:

adams python二次开发 python二次开发cad_adams python二次开发_08

对图像进行仿射变换

仿射变换是二维平面中一种重要的变换,其在图像图形领域有着广泛的应用;是空间直角坐标系的变换,从一个二维坐标变换到另一个二维坐标。其主要是两种变换的简单叠加:线性变换、平移变换。

仿射变换在计算机图形变换中往往对应着相应的旋转矩阵。比较常用的特殊变换有平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)如下表所示:

adams python二次开发 python二次开发cad_adams python二次开发_09

在AutoCAD中,提供了TransformBy函数, 该函数可通过构造的旋转矩阵进行像素级的仿射变换。笔者认为也是在AutoCAD中进行图像处理最重要的一个函数。

adams python二次开发 python二次开发cad_开发语言_10


其中

adams python二次开发 python二次开发cad_数据转换_11

R表示旋转、缩放;T表示平移量

具体代码如下:

def trans_img():
    """对图像进行变换"""
    RetVal = add_img()  # 添加图像
    matrix = [[1,tan(45),0,2],
              [0,1,0,0],
              [0,0,1,0],
              [0,0,0,1]]    # 构造旋转矩阵
    matrix = ConvertArrays2Variant('Double',matrix) # 数据变换
    RetVal.TransformBy(matrix)  # 图像变换

结果如图所示:

adams python二次开发 python二次开发cad_adams python二次开发_12

图像的属性

如图所示,我们可以获取到栅格图像的许多属性。

adams python二次开发 python二次开发cad_adams python二次开发_13

现在举例说明获取到栅格图像的像素宽和像素高以及图像的名字

具体代码如下:

def attris_img():
    utilObj, msp = autocad()        # 连接AutoCAD
    RetVal = add_img()  # 添加栅格图像
    print('像素宽为:',RetVal.Width)     #分别输出像素的宽、高、名字
    print('像素高为:',RetVal.Height)
    print('图像名为:',RetVal.Name)
    utilObj.Prompt(f'像素宽为:{RetVal.Width},像素的高为:{RetVal.Height},图像的名称为:{RetVal.Name}'
                   .format(RetVal.Width,RetVal.Height,RetVal.Name))   # 在AutoCAD中分别输出像素的宽、高、名字

结果如图所示:

adams python二次开发 python二次开发cad_开发语言_14

当然我们也可以结合前面所叙述的对于选择集的操作,在AutoCAD中进行图像的选择,选择集见:文章,再进行上述对栅格图像的属性以及方法的使用。

备注:再次特别感谢哈工大的Hulunbuir学长以及335工作室的群主和小伙伴们的帮助与支持。