- 任务:
绘制出不同长度的相同型式的多段线,如上图所示,仅仅是300mm和500mm的区别,3个弯折处都一样,都是圆弧段,对于常规二次开发思路,是通过数学计算,计算出圆弧的圆心的位置,用固定的半径,绘制固定的圆弧,然而着这种方法太繁琐,下面介绍一种新的思路,避免进行这样的数学计算。
其思路如下:
(1)首先收集给定的多段线的坐标:
p=acad.GetEntity()
p=p[0]
coords=p.Coordinates()
如果用coords重新直接绘制多段线会发现它是这样的:
acad.AddLwpline(*coords)
可以发现没有了圆弧,直接从圆弧的两个端点绘制出了其割线,那么如何得到割线对应的圆弧呢?SetBulge()
方法来帮忙!
其index是多段线的段数索引,从0开始,value是bulge值,大小是弧顶点到割线的距离与割线一半之比,正数代表逆时针绘制,负数代表顺时针绘制。
(2)接下来,对所收集的coords进行处理,一个很自然的想法就是将点0~6
,7~12
形成的折线平移至最低点,折线的中点与19点齐平,然后指定高度L后,分别将7~12
的折线向上平移L/2,0~6
的折线向上平移L-30,然后再对特定的段数SetBulge即可!
import numpy as np
b=coords.reshape(-1,2)
c=b-b[-1]
c[7:13,1]-=((c[9]+c[10])/2)[1] #对7~12点形成的折线进行向下平移
c[0:7,1]-=((c[3]+c[4])/2)[1]#对0~6点形成的折线进行向下平移
import pickle
with open(r'FeatureParameter.pkl','wb') as f:
pickle.dump(c,f) #对求得的特征参数c进行储存
#然后用整理过后的参数c来求得不同L下的多段线的各点坐标,最后施加SetBulge即可
def drawYePian(acad,L,c):
X,Y,Z=acad.GetPoint()
coords=c.copy()
coords[7:13,1]+=L/2
coords[0:7,1]+=L-30
coords+=np.array([X,Y])
pline=acad.AddLwpline(*coords.ravel().tolist())
for i,j in zip([1,3,5,7,9,11,13,15,17],[0.2,-0.4,0.2,-0.2,0.4,-0.2,0.2,-0.4,0.2]):
pline.SetBulge(i,j)
总结来讲,就是通过收集已有多段线的坐标参数,然后处理形成特征数据,最后根据特征数据和给定长度生成多段线的坐标,最后再用SetBulge()
方法获取到圆弧。该方法避免了进行繁琐的数学计算,直接利用已有多段线本身的数据,不失为一种好的方法!