AutoLisp从入门到放弃(二十一)

目标:

任意输入五个点,将5个点用pline线相连,并在最短边上绘制一个半圆弧,在最长边上绘制两个相等的圆弧。预期效果如图:

在这里插入图片描述

程序:

(defun C:DrawPlineArc(
    /
    #iCmdEcho               ;; 人机交互系统变量值
    #iOsMode                ;; 捕捉方式系统变量值
    #ptPline1               ;; 多段线的五个顶点
    #ptPline2
    #ptPline3
    #ptPline4
    #ptPline5
    #lsPlineList            ;; 多段线数据
    #dDist1                 ;; 多段线的五段距离
    #dDist2
    #dDist3
    #dDist4
    #dDist5
    #lsData                 ;; 用于记录距离和点坐标
    #dDistMax               ;; 最大距离
    #dDistMin               ;; 最小距离
    #ptMinSta               ;; 最小距离起点
    #ptMinEnd               ;; 最小距离终点
    #ptMaxSta               ;; 最大距离起点
    #ptMaxEnd               ;; 最大距离终点
    #ptMaxMid               ;; 最大距离中点
    #lsMaxPt                ;; 最大距离关联的所有信息
    #lsMinPt                ;; 最小距离关联的所有信息
    )
    ;; 获取当前的人机交互和捕捉的状态
    (setq #iCmdEcho (getvar "CMDECHO"))
    (setq #iOsMode (getvar "OSMODE"))

    ;; 关闭所有捕捉和人机交互
    (setvar "CMDECHO" 0)
    (setvar "OSMODE" 0)

    ;; 获取多段线点坐标
    (setq 
        #ptPline1 (getpoint "\n请确定PLine线第一点:")
        #ptPline2 (getpoint #ptPline1 "\n请确定PLine线第二点:")
        #ptPline3 (getpoint #ptPline2 "\n请确定PLine线第三点:")
        #ptPline4 (getpoint #ptPline3 "\n请确定PLine线第四点:")
        #ptPline5 (getpoint #ptPline4 "\n请确定PLine线第五点:")
    );setq

     ;; 生成多段线数据列表
    (setq #lsPlineList 
        (list 
            (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") 
            (cons 90 5) (cons 70 1) 
            (cons 10 #ptPline1) (cons 10 #ptPline2) (cons 10 #ptPline3) (cons 10 #ptPline4) (cons 10 #ptPline5)
        ); list
    ); setq

    ;; 生成多段线
    (entmake #lsPlineList)

    ;; 计算多段线的五段距离
    (setq
        #dDist1 (distance #ptPline1 #ptPline2)
        #dDist2 (distance #ptPline2 #ptPline3)
        #dDist3 (distance #ptPline3 #ptPline4)
        #dDist4 (distance #ptPline4 #ptPline5)
        #dDist5 (distance #ptPline5 #ptPline1)
    ); setq

    ;; 将距离和对应的一对点坐标合成点对,并将所有的点对组成列表,方便后续数据处理
    (setq #lsData '())
    (setq 
        #lsData (cons (list #dDist1 #ptPline1 #ptPline2) #lsData)
        #lsData (cons (list #dDist2 #ptPline2 #ptPline3) #lsData)
        #lsData (cons (list #dDist3 #ptPline3 #ptPline4) #lsData)
        #lsData (cons (list #dDist4 #ptPline4 #ptPline5) #lsData)
        #lsData (cons (list #dDist5 #ptPline5 #ptPline1) #lsData)
    );setq

    ;; 计算最大和最小距离
    (setq 
        #dDistMax (max #dDist1 #dDist2 #dDist3 #dDist4 #dDist5)
        #dDistMin (min #dDist1 #dDist2 #dDist3 #dDist4 #dDist5)
    );setq

    ;; 获取距离最远的两个点坐标,以及两点中点
    (setq #lsMaxPt (assoc #dDistMax #lsData))
    (setq 
        #ptMaxSta (cadr #lsMaxPt)
        #ptMaxEnd (caddr #lsMaxPt)
        #ptMaxMid (polar #ptMaxSta (angle #ptMaxSta #ptMaxEnd) (* #dDistMax 0.5))
    );setq

    ;; 获取距离最近的两个点坐标
    (setq #lsMinPt (assoc #dDistMin #lsData))
    (setq 
        #ptMinSta (cadr #lsMinPt)
        #ptMinEnd (caddr #lsMinPt)
    );setq

    ;; 开始绘制圆弧
    (command "arc" #ptMaxSta "e" #ptMaxMid "a" 180 "")
    (command "arc" #ptMaxMid "e" #ptMaxEnd "a" 180 "")
    (command "arc" #ptMinSta "e" #ptMinEnd "a" 180 "")

    ;; 还原程序运行前的捕捉和人机交互状态
    (setvar "CMDECHO" #iCmdEcho)
    (setvar "OSMODE" #iOsMode)

    ;; 消除函数返回值
    (prin1)
)
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
函数名称 描述 PL_3d? 如果多段线的检查是3D或不 PL_AddPoint 加入一个新的多段线点之前指定的顶点数量VxNum PL_Arced? 如果检查多段线有至少一个弧段 PL_ArcPl2LinearPl 重建更换指定的距离直线段只有所有弧段的多段线列表。 PL_BoundPoly 创建直线,多段线和/或圆周围的边界多边形 PL_BreakX 在这一点上打断多段线 PL_DelPoint 从多段线删除点 PL_DividedPoints 返回除以给定的多段线(无论是在“实体”的形式或列表的形式)所获得的点 PL_DrawLeaders 沿线各段多段线绘制的领袖,从而呈现出多段线的流动方向。 PL_DrawLeaders2 沿线各段多段线绘制两端箭头。 PL_facelist 返回从一个多面对象的面部定义列表 PL_Fitted? 检查是否有多段线在选集中 PL_FlipArcedPolyline 翻转(反转)的圆弧(2D)多段线使用特殊技巧 PL_Get2dPolyElev 找到一个二维多段线的标高 PL_GetBulgeLst 返回凸出圆弧多段线列表 PL_GetMiddlePoint 查找行的中间点,多段线,圆弧或样条线对象 PL_GetSlope @点 在某一时间点的斜率的曲线对象 PL_GetVxEntl 返回完整的实体,包括多段线顶点实体的实体列表列表, PL_GetWidths 返回一个列表的开始和结束段多段线宽度 PL_MapMask 创建出多段线和/或圆形的不透明的面具,变成区实体。 PL_MeasuredPoints 返回通过测量给定的多段线(无论是在“实体”的形式或列表的形式)获得的分 PL_Mesh? 如果一个多段线对象的检查是一个三维网格对象或否 PL_mk_pl 给个列表,绘制多段线或LWPOLYLINE的entmake功能 PL_mk_pl_feed 给个列表,绘制多段线或LWPOLYLINE的,使用命令行坐标传输; PL_NewPoint 在指定的顶点更新多段线点 PL_Open? 判断多段线的检查是打开“或”不 PL_plist 返回一个LWPOLYLINE或多段线点表 PL_PlJoin 连接选择集中多段线或线段。 PL_plpick 多段线挑毛,挑个毛,看里面。 PL_PolyFace? 检查多段线对象是否是一个多面网格 PL_ReconstructPoly 重建炸开的多段线对象 PL_SeekMain 寻求从顶点名主要实体名称 PL_Spl2Pl_Int 转换到一个正常的多段线样条或ELLISPE对象的插值方法 PL_Splined? 检查是否拟合多段线 PL_SplitPoly 拟合多条多段线。 PL_SplPl2Pl 拟合多段线转换到正常的多段线 PL_UpdateLine 更新与两个新端点的线对象。保持所有行属性,包括句柄 PL_UpdatePoly 更新一个新的顶点列表的多段线实体。保留所有多段线特性:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值