明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1562|回复: 11

[源码] 双折线绘制

[复制链接]
发表于 2022-5-26 21:03 | 显示全部楼层 |阅读模式
;;; ****************************************************************
;;; 双折线绘制(支持直线和多段线)
;;; ****************************************************************
(defun c:szx (/ #erryx001 $orr a b c co curve d en ent h i l la lst name obj p p0 p10 p11 pp r snap ty x)
  (defun #erryx001 (s)
    (setvar "osmode" snap) (command ".UNDO" "E") (setq *error* $orr))
  (defun hh:pickarc (curve p / pp)
    (setq pp (vlax-curve-getclosestpointto curve (trans p 1 0)))
    (setq pp (vlax-curve-getsecondderiv curve (fix (vlax-curve-getparamatpoint curve pp))))
    (equal pp '(0.0 0.0 0.0))  )
  (defun rf (r / pp) (* (/ r 180.0) pi))
  (vl-load-com)
  (setvar "cmdecho" 0)
  (setq $orr *error*)
  (setq *error* #erryx001)
  (command ".UNDO" "BE")
  (setq snap (getvar "osmode"))
  (setvar "osmode" 0)
  (while (setq en (entsel "\n选择直线段:"))
    (setq name (car en) p0 (cadr en) p0 (osnap p0 "_NEA") ent (entget name) ty (cdr (assoc 0 ent)) la (assoc 8 ent))
    (if (not (setq co (assoc 62 ent))) (setq co (assoc 62 (tblsearch "layer" (cdr la)))))
    (if (= ty "LWPOLYLINE")
      (if (hh:pickarc name p0)
        (progn
          (setq lst '()        obj (vlax-ename->vla-object name)
                i (fix (vlax-curve-getparamatpoint obj (vlax-curve-getclosestpointto obj p0))))
          (foreach x ent  (if (= (car x) 10) (setq lst (cons (cdr x) lst))))
          (setq lst (reverse lst) p10 (nth i lst)
                p11 (nth (if (< (1+ i) (length lst)) (1+ i)  0 ) lst ) ty "LINE")))
      (if (= ty "LINE")
        (setq p10 (cdr (assoc 10 ent))  p11 (cdr (assoc 11 ent)))))
    (if (= ty "LINE")
      (progn
        (setq r (angle p10 p11) h (* (getvar "DIMTXT") (getvar "DIMSCALE")) l (/ h (sin (rf 75)))
              a (polar p0 (+ r (rf 105)) l) b (polar p0 (- r (rf 75)) l)
              c (polar a (- r (rf 105)) l) d (polar b (+ r (rf 75)) l))
        (if (and
              (equal (+ (distance c p10) (distance c p11)) (distance p10 p11) 0.000001)
              (equal (+ (distance d p10) (distance d p11)) (distance p10 p11) 0.000001) )
          (progn
            (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") la co (cons 90 4) (cons 10 c)
                           (cons 10 a) (cons 10 b) (cons 10 d)))
            (setq en (entlast))
            (command "trim" en "" "F" (polar p0 (+ r (rf 179)) (* 0.267 h)) (polar p0 (+ r (rf 181)) (* 0.267 h)) "" "F"
                     (polar p0 (+ r (rf 1)) (* 0.267 h)) (polar p0 (- r (rf 1)) (* 0.267 h)) "" ""))))))
  (setvar "osmode" snap)
  (command ".UNDO" "E")
  (setq *error* $orr)
  (princ)
)

评分

参与人数 1明经币 +1 收起 理由
yaokui25 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-5-27 10:38 | 显示全部楼层
缩放到很小没有误选
其实是缩放的不够小
第一次用之前没看代码
用了以后我直接懵了
点一下直线短了半截
再点一下又短了半截
后面看了代码
才知道是咋回事

以标注字高定大小
也不是特别合理
因为有的人用专业软件标注
而我几乎不用标注
所以默认标注字高可能就是0.18

其实我也很少用到折线这功能
需要时就手动画一个
反馈下我的体验没有其它意思
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2022-5-27 07:55 来自手机 | 显示全部楼层
masterlong 发表于 2022-5-26 23:09
设的折线太小了
没缩放窗口的情况下
trim会误选

大小是根据当前标注的字高自动调节的。关闭了捕捉缩放很小也没有误选啊
发表于 2022-5-26 22:04 | 显示全部楼层
感谢大神又分享佳作
发表于 2022-5-26 23:09 | 显示全部楼层
设的折线太小了
没缩放窗口的情况下
trim会误选
发表于 2022-5-27 08:44 | 显示全部楼层
langjs大师的作品都是很实用的
发表于 2022-5-27 15:40 | 显示全部楼层
谢谢langjs大师分享新作
发表于 2022-5-31 10:11 | 显示全部楼层
感谢大神分享的新作
发表于 2022-9-7 09:42 | 显示全部楼层
谢谢大神的分享
发表于 2023-10-29 12:49 | 显示全部楼层
谢谢分享,不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-28 13:08 , Processed in 0.282187 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表