目录
前言
一、简单介绍cloudconvert?
二、dwg2dxf实现步骤
1.引入库
2.创建api客户端
3.创建转换job
4.上传dwg格式源文件
5.下载dxf格式文件
6.删除云端job
总结
众所周知Autodesk公司拥有dwg图形格式的完全版权,而dxf则为一个开源的图形格式,因此在python开源库中鲜有免费的dwg转dxf应用。但是搜索网络,我们仍然会发现有些网站能够提供在线dwg转dxf服务(cloudconvert,anyconv,mygeodata),甚至还有相应的api供开发者使用。利用python编程对接这些api,可以实现常用的dwg转dxf应用。下面以cloudconvert为例,展示其实现过程。
CloudConvert网站提供包括文档、音频、视频、压缩包、cad等类型的丰富的文件转换服务,其中就包括CAD Converter | CloudConvert。转换效果可以通过在线转换(如下图所示)来查看,亲测是挺不错的。
在线转换可以随时免费进行。其api则提供了几档服务,如下图:
可以选择8美元/500分钟的方案,也可以选择8美元/月提供1000分钟转换时长的方案。而且,作为个人使用的话,也可以不花钱,注册即可享受25min/天的转换时长。
代码如下(示例):
import cloudconvert
代码如下(示例):
api_key = 'api_key_example' # api_key为申请账号的token
cloudconvert.configure(api_key=api_key, sandbox=False)
其中api_key_example为注册账号并首次进入dashboard面板后展示的api token,注意一定要将这个很长的token复制粘贴下来,dashboard中仅仅展示这一次,以后都查询不到。
代码如下(示例):
job = cloudconvert.Job.create(payload={
"tasks": {
"import-1": {
"operation": "import/upload"
},
"task-1": {
"operation": "convert",
"input_format": "dwg",
"output_format": "dxf",
"engine": "cadconverter",
"input": [
"import-1"
]
},
"export-1": {
"operation": "export/url",
"input": [
"task-1"
],
"inline": False,
"archive_multiple_files": False
}
},
})
这个转换job包括三个task(import-1,task-1,export-1),分别为导入文件任务、转换文件任务和输出转后文件任务。当然,这三个任务名可以自己任意定义。每个任务的字典中包含了相应的设置参数。其实,cloudconvert提供了一个非常简单的任务定义方法,就是在Job Builder | CloudConvert API中用操作页面的方式来自动生成对应的job代码,如下图:
代码如下(示例):
upload_task_id = job['tasks'][0]['id'] # job['tasks'][0]对应的是上传任务,job['tasks'][1]是转换任务
upload_task = cloudconvert.Task.find(id=upload_task_id)
cloudconvert.Task.upload(file_name=file_name, task=upload_task)
利用cloudconvert库中的Task类可以轻松实现任务的定位和文件的上传。因为在第3步中定义了转换任务,因此上传动作完成后,服务器会自动开始转换任务。注意:由于api原因,file_name不能包含中文。这里转换任务的执行对象为输入任务import-1,也就是说task-1的参数应为import-1。
代码如下(示例):
exported_url_task_id = job['tasks'][2]['id'] # job['tasks'][2]对应的是下载任务
res = cloudconvert.Task.wait(id=exported_url_task_id) # 使用cloudconvert.Task的内置函数等待转换文件完成
file = res.get("result").get("files")[0] # 使用cloudconvert.Task的内置函数提取转换文件
cloudconvert.download(filename=resource.replace('dwg', 'dxf'), url=file['url']) # 下载文件
利用cloudconvert库中的Task类可以轻松实现任务的定位和文件的下载。注意:这里输出任务的执行对象为task-1,也就是说export-1的参数应为task-1。
云端job若达到数量限至,无法进行格式转换任务,因此比较好的办法是每执行转换并完成文件下载后即删除这个job,代码如下(示例):
exported_url_task_id = job['tasks'][2]['id'] # job['tasks'][2]对应的是下载任务
res = cloudconvert.Task.wait(id=exported_url_task_id) # 使用cloudconvert.Task的内置函数等待转换文件完成
file = res.get("result").get("files")[0] # 使用cloudconvert.Task的内置函数提取转换文件
cloudconvert.download(filename=resource.replace('dwg', 'dxf'), url=file['url']) # 下载文件
当然,job在云端过了一定时间后会自动删除,这个步骤也可以忽略。只有在短时间频繁创建job会触发转换限至。
7.完整代码
好了,为了保证在读者复刻的时候能够正确执行程序,这里将代码完整进行展示:
import cloudconvert
def dwg2dxf(file_name):
# 1.定义cloudconvert的api_key(token)
api_key = 'api_key_example'
# 2.创建api客户端
cloudconvert.configure(api_key=api_key, sandbox=False)
# 3.创建一个job
job = cloudconvert.Job.create(payload={
"tasks": {
"import-1": {
"operation": "import/upload"
},
"task-1": {
"operation": "convert",
"input_format": "dwg",
"output_format": "dxf",
"engine": "cadconverter",
"input": [
"import-1"
]
},
"export-1": {
"operation": "export/url",
"input": [
"task-1"
],
"inline": False,
"archive_multiple_files": False
}
},
})
# 4.启动job对应的上传任务(上传原文件)
upload_task_id = job['tasks'][0]['id'] # job['tasks'][0]对应的是上传任务,job['tasks'][1]是转换任务
upload_task = cloudconvert.Task.find(id=upload_task_id)
cloudconvert.Task.upload(file_name=file_name, task=upload_task)
# 5.启动job对应的下载任务(下载转换后的文件)
exported_url_task_id = job['tasks'][2]['id'] # job['tasks'][2]对应的是下载任务
res = cloudconvert.Task.wait(id=exported_url_task_id) # 使用cloudconvert.Task的内置函数等待转换文件完成
file = res.get("result").get("files")[0] # 使用cloudconvert.Task的内置函数提取转换文件
cloudconvert.download(filename=resource.replace('dwg', 'dxf'), url=file['url']) # 下载文件
# 6.为了防止云端job数目过多而产生的api请求错误,在job完成后即将其删除
cloudconvert.Job.delete(job['id'])
if __name__ == '__main__':
resource = 'C:\\Users\\khs001\\Desktop\\Drawing2.dwg'
dwg2dxf(resource)
dwg2dxf的api实现结构如下:
以上,通过简单的6个步骤实现dwg2dxf格式转换。