admin管理员组文章数量:1604751
freecad 的脚本是使用的python解释器, 但是freecad内部的python只有基础的包,对第三方开发包支持度不是很高.有两种方式解决.
一种是使用外部python是可以控制freecad进行绘图的. 具体的可以找网上查查, 好像是安装一个freecad的包即可.
另外一种我认为比较方便, freecad内部直接调用外部python环境的包的方式实现.
下面是第二种的实现过程.
首先是导入外部python环境.
import sys
sys.path += ['~/anaconda3/bin', '', '/opt/ros/noetic/lib/python3/dist-packages', '~/anaconda3/lib/python38.zip', '~/anaconda3/lib/python3.8', '~/anaconda3/lib/python3.8/lib-dynload', '~/.local/lib/python3.8/site-packages', '~/anaconda3/lib/python3.8/site-packages', '~/anaconda3/lib/python3.8/site-packages/web.py-0.62-py3.8.egg', '~/anaconda3/lib/python3.8/site-packages/skidl-0.0.30-py3.8.egg', '~/anaconda3/lib/python3.8/site-packages/graphviz-0.16-py3.8.egg', '~/anaconda3/lib/python3.8/site-packages/kinparse-0.1.2-py3.8.egg', '~/anaconda3/lib/python3.8/site-packages/pycairo-1.20.1-py3.8-linux-x86_64.egg', '~/anaconda3/lib/python3.8/site-packages/unzip_gbk-1.0-py3.8.egg', '~/anaconda3/lib/python3.8/site-packages/locket-0.2.1-py3.8.egg', '~/anaconda3/lib/python3.8/site-packages/IPython/extensions', '~/.ipython']
这里 pyexcel 包在freecad的python内部是没有的, 所以调用外部环境的pyexcel包.
import pyexcel as p
import os
ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def digit(alphabet):
"""26进制 -> 10进制"""
return sum(ALPHABET.index(a) * (26 ** e) for e, a in enumerate(reversed(alphabet)))
def alph(digit):
"""10进制 -> 26进制"""
mod, remainder = divmod(digit, 26)
alphabet = ALPHABET[remainder]
while mod:
mod, remainder = divmod(mod, 26)
alphabet = ALPHABET[remainder] + alphabet
return alphabet
# 表格信息,下面有格式
tab_nm ='~/freecad_auto_gen/data/rebot_arm.xls'
# doc_nm = 'joint02_2'
book = p.get_book(file_name=tab_nm)
ss = book.to_dict()
for spsheet_dname in ss:
sp = App.ActiveDocument.getObject(spsheet_dname)
if sp is None:
App.activeDocument().addObject('Spreadsheet::Sheet',spsheet_dname)
sp = App.ActiveDocument.getObject(spsheet_dname)
sheet = book[spsheet_dname]
# 清除以前的緩存信息
for il, l in enumerate(sheet.row):
for jc, c in enumerate(l):
sp.setAlias(alph(jc)+str(il+1),'')
key_ind = sheet.row[0].index("key")
val_ind = sheet.row[0].index("value")
for jc, c in enumerate(sheet.row[0]):
sp.set(alph(jc)+str(1), str(c))
for il, l in enumerate(sheet.row[1:]):
for jc, c in enumerate(l):
sp.set(alph(jc)+str(il+2), str(c))
el_key = alph(key_ind)+str(il+2)
el_val = alph(val_ind)+str(il+2)
sp.setDisplayUnit(el_val, 'mm')
if l[key_ind] == '' or l[val_ind] == '':
continue
sp.setAlias(el_val, str(l[key_ind]))
sp.set(alph(jc+1)+str(il+2), '<<'+spsheet_dname+'>>.'+l[key_ind])
#重新模型
App.ActiveDocument.recompute()
tab_nm ='~/freecad_auto_gen/data/rebot_arm.xls' 的格式
ps: 可能需要注意外部环境的python和内部环境的版本问题.
版权声明:本文标题:freecad 脚本 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1728463603a1159226.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论