• Pycomcad快速绘制参数化多段线的一种方法


    • 任务:
    image-20210517141143663

    绘制出不同长度的相同型式的多段线,如上图所示,仅仅是300mm和500mm的区别,3个弯折处都一样,都是圆弧段,对于常规二次开发思路,是通过数学计算,计算出圆弧的圆心的位置,用固定的半径,绘制固定的圆弧,然而着这种方法太繁琐,下面介绍一种新的思路,避免进行这样的数学计算。

    其思路如下:

    (1)首先收集给定的多段线的坐标:

    p=acad.GetEntity()
    p=p[0]
    coords=p.Coordinates()
    

    如果用coords重新直接绘制多段线会发现它是这样的:

    acad.AddLwpline(*coords)
    
    image-20210517141846211

    可以发现没有了圆弧,直接从圆弧的两个端点绘制出了其割线,那么如何得到割线对应的圆弧呢?SetBulge()方法来帮忙!

    image-20210517143055740

    其index是多段线的段数索引,从0开始,value是bulge值,大小是弧顶点到割线的距离与割线一半之比,正数代表逆时针绘制,负数代表顺时针绘制。

    (2)接下来,对所收集的coords进行处理,一个很自然的想法就是将点0~67~12形成的折线平移至最低点,折线的中点与19点齐平,然后指定高度L后,分别将7~12的折线向上平移L/2,0~6的折线向上平移L-30,然后再对特定的段数SetBulge即可!

    image-20210517143030251

    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()方法获取到圆弧。该方法避免了进行繁琐的数学计算,直接利用已有多段线本身的数据,不失为一种好的方法!

    ##### 愿你一寸一寸地攻城略地,一点一点地焕然一新 #####
  • 相关阅读:
    C/C++ 构造函数不能是虚函数
    C/C++ STL迭代器失效
    Linux fork函数
    算法和数据结构 限流算法
    数据库 redis底层实现
    C/C++ 虚析构函数
    万物皆可 Serverless 之使用云函数 SCF 快速部署验证码识别接口
    万物皆可 Serverless 之使用云函数 SCF+COS 免费运营微信公众号
    腾讯云云函数 SCF 日志检索最佳实践
    江娱互动「世界争霸」产品迁移至腾讯云云函数的实践
  • 原文地址:https://www.cnblogs.com/johnyang/p/14776898.html
Copyright © 2020-2023  润新知