python二次开发CATIA:文字轮廓草图

CATIA V5 版本的草图中,并没有文字轮廓的创建命令。通常的做法是,再Drawing 文件中创建所需文本-->将 Drawing 文件另存为 dwg / dxf 格式-->打开另存的文件,文字已转为轮廓线条-->复制线条并粘贴到草图中。

本例中,基于 opencv 和 pillow两个库,先通过 PIL 将目标文字写到一张空白的图片中,然后再通过 opencv 的findContours 方法,提取该图片中的图形轮廓,最后提取轮廓中的坐标信息,并在CATIA 草图中绘制出相应的轮廓线条。
 

import win32com.client
import pywintypes  # 导入pywintypes模块
# 启动CATIA应用
catia = win32com.client.Dispatch('CATIA.Application')
catia.visible=1
# 输入文字并转码
text=input('请输入文字:\n')
str = text.encode('utf8').decode('utf8')

# 字体大小与颜色
fontsize=100
fontcolor=(0,0,0)

# 导入所需的库
from PIL import Image, ImageDraw, ImageFont

# 创建一张白背景图片,尺寸根据输入文字数量自动确定
img_PIL=Image.new('RGBA',(100*len(str)+10,110),'white')
draw = ImageDraw.Draw(img_PIL)

# 设置文字属性
font = ImageFont.truetype('simkai.ttf', fontsize) #字体与字号
fillColor = fontcolor # 字体颜色
position = (5, 5)  # 文字位置,距左/上

# 把字写写到图片上
draw.text(position, str, font=font, fill=fillColor)

import cv2
import numpy as np

frame = cv2.cvtColor(np.asarray(img_PIL),
                     cv2.COLOR_RGB2BGR)  # 转成OpenCV格式
# cv2.imshow('result',frame)
# cv2.waitKey()

# 将图像转换成灰度图像,并执行图像高斯模糊,以及转化成二值图像
gray=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# blurred = cv2.GaussianBlur(gray, (1,1), 0)
ret,image_binary = cv2.threshold(gray,
                                 127,
                                 255,
                                 cv2.THRESH_BINARY)

# cv2.imshow('result',image_binary)
# cv2.waitKey()

# 从二值图像中提取轮廓
# contours中包含检测到的所有轮廓,以及每个轮廓的坐标点
contours = cv2.findContours(image_binary.copy(),
                            cv2.RETR_TREE,
                            cv2.CHAIN_APPROX_TC89_KCOS)[0]

# 将轮廓画在图像上并显示
cv2.drawContours(frame,contours,-1,(0,0,255),1)

try:
    doc = catia.activedocument
    sel = doc.selection
    part = doc.part
    sketch = part.inworkobject
    f2d = sketch.factory2d

    catia.refreshdisplay = False
    catia.HSOSynchronized = False
    for i in range(1, len(contours)):
        c = contours[i]
        for j in range(0, len(c) - 1):

            if j < len(c) - 2:
                pt1 = c[j][0]
                pt2 = c[j + 1][0]
            else:
                pt1 = c[j][0]
                pt2 = c[0][0]
            # print(pt1,pt2)
            ln = f2d.createline(pt1[0] - 5,
                                -pt1[1] + fontsize + 5,
                                pt2[0] - 5,
                                -pt2[1] + fontsize + 5)
    catia.refreshdisplay = True
    catia.HSOSynchronized = True

except pywintypes.com_error as e:
    # 如果出现错误,可能是因为没有活动文档
    print("无法获取活动文档,请确保CATIA应用程序中已有打开的文档。")
    print(e)

python二次开发CATIA:文字轮廓草图_第1张图片

你可能感兴趣的:(python二次开发CATIA,python,opencv,catia)