AutoCAD|Python 二次开发 栅格图像
首先要感谢Hulunbuir学长以及335工作室的群主对自己在AutoCAD二次开发这条不归路上的帮助与指导,才能够让我顺利的完成自己的任务。
附大佬有关AutoCAD二次开发的主页:
有不少朋友需要在AutoCAD中对于图像进行操作,比如用于等高线、地物表示等的底图;用于插入二维码图像对图块进行说明等等。本篇简要介绍常用的对于图像的属性以及方法的使用。
通过AutoCAD二次开发文档,我们能够找到Raster对象,点击后能够清楚的了解到栅格图像的插入、简单变换、以及对于栅格图像的属性。如图所示:
后续会介绍有关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中。下图解释了在进行插入图像时需要提供的参数以及每一个参数的解释。
对上述所涉及到的参数进行简要解释
参数名 | 解释说明 |
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
结果如图所示:
图像所包含的方法
如图所示,我们可以进行上述任意一种函数方法的操作,与前文中对其他对象的操作类似,我们也可以进行旋转、移动、复制、删除等操作,其操作方式方法相同。
图像的移动
对于图像的移动,如图所示需要我们提供两个点
可以理解为这两个点构成的具有长度以及方向的向量,则该栅格图像则会按照该方向以及长度进行移动
具体代码如下:
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) # 对图像进行移动
对图像的旋转:
对于图像的旋转,需要我们提供两个参数,分别为基于某一个点进行的旋转,以及旋转的角度(弧度值)
具体代码如下:
def rotate_img():
Retval = add_img() # 添加图像
point1 = [0,0,0] # 基准点
BasePoint = ConvertArrays2Variant('Double', point1) # 数据变换
Retval.Rotate(BasePoint,90 * 3.141592 / 180) # 对图像进行旋转
具体如图所示:
对图像进行仿射变换
仿射变换是二维平面中一种重要的变换,其在图像图形领域有着广泛的应用;是空间直角坐标系的变换,从一个二维坐标变换到另一个二维坐标。其主要是两种变换的简单叠加:线性变换、平移变换。
仿射变换在计算机图形变换中往往对应着相应的旋转矩阵。比较常用的特殊变换有平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)如下表所示:
在AutoCAD中,提供了TransformBy函数, 该函数可通过构造的旋转矩阵进行像素级的仿射变换。笔者认为也是在AutoCAD中进行图像处理最重要的一个函数。
其中
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) # 图像变换
结果如图所示:
图像的属性
如图所示,我们可以获取到栅格图像的许多属性。
现在举例说明获取到栅格图像的像素宽和像素高以及图像的名字
具体代码如下:
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中分别输出像素的宽、高、名字
结果如图所示:
当然我们也可以结合前面所叙述的对于选择集的操作,在AutoCAD中进行图像的选择,选择集见:文章,再进行上述对栅格图像的属性以及方法的使用。
备注:再次特别感谢哈工大的Hulunbuir学长以及335工作室的群主和小伙伴们的帮助与支持。