明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 258|回复: 16

[源码] 初学写的一个延长直线和圆弧的功能,还不完善,望高手能指点

[复制链接]
发表于 2021-9-8 16:54 | 显示全部楼层 |阅读模式
;;;代码还不完善,有两个问题一直没解决:
;;;1、不能批量完成操作
;;;2、当线条距离很近时有的线会延长很多,有的不延长




(defun c:dd1 ()
  (setvar "CMDECHO" 0)
  (setq os (getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (setq qq (ssget '((0 . "*line,arc"))))
  (setq n 0)
  (if (= qq nil)
    (princ "没有选择任何相符元素!")
    (if (= "LINE" (cdr (assoc 0 (entget (ssname qq n)))))
      (progn
        (setq bb (sslength qq))
        (repeat bb
          (setq p1 (cdr (assoc 10 (entget (ssname qq n)))))
          (setq p2 (cdr (assoc 11 (entget (ssname qq n)))))
          (command "_.LENGTHEN" "de" 100 p1 p2 "")
          (setq n (1+ n))
        )
      )
      (if (= "ARC" (cdr (assoc 0 (entget (ssname qq n)))))
        (progn
          (setq bb (sslength qq))
          (repeat bb
            (setq r (cdr (assoc 40 (entget (ssname qq n)))))
            (setq rad1 (cdr (assoc 50 (entget (ssname qq n)))))
            (setq cenx (cadr (assoc 10 (entget (ssname qq n)))))
            (setq p1x (+ (* (cos rad1) r) cenx))
            (setq ceny (caddr (assoc 10 (entget (ssname qq n)))))
            (setq p1y (+ (* (sin rad1) r) ceny))
            (setq p1 (list p1x p1y))
            (setq rad1 (cdr (assoc 51 (entget (ssname qq n)))))
            (setq p2x (+ (* (cos rad1) r) cenx))
            (setq p2y (+ (* (sin rad1) r) ceny))
            (setq p2 (list p2x p2y))
            (command "_.LENGTHEN" "de" 100 p1 p2 "")
            (setq n (1+ n))
          )
        )
      )
    )
  )
  (setvar "OSMODE" os)
  (setq qq nil)
  (princ)
)

点评

循环用的有点问题。  发表于 2021-9-9 08:49
发表于 2021-9-9 08:47 | 显示全部楼层
本帖最后由 gaics 于 2021-9-9 09:23 编辑

(defun c:dd1 (/ os qq n p1 p2 rad1 cenx ceny p1x p1y p2x p2y)
  (setvar "CMDECHO" 0)
  (setq os (getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (setq qq (ssget '((0 . "*line,arc"))))
  (setq n 0)
  (if (= qq nil)
    (princ "没有选择任何相符元素!")
    (repeat (sslength qq)
      (if (= "LINE" (cdr (assoc 0 (entget (ssname qq n)))))
        (progn (setq p1 (cdr (assoc 10 (entget (ssname qq n)))))
               (setq p2 (cdr (assoc 11 (entget (ssname qq n)))))
               (command "_.LENGTHEN" "de" 100 (list (ssname qq n) p1) "")
               (command "_.LENGTHEN" "de" 100 (list (ssname qq n) p2) "")
        )
      )
      (if (= "ARC" (cdr (assoc 0 (entget (ssname qq n)))))
        (progn
          (setq r (cdr (assoc 40 (entget (ssname qq n)))))
          (setq rad1 (cdr (assoc 50 (entget (ssname qq n)))))
          (setq cenx (cadr (assoc 10 (entget (ssname qq n)))))
          (setq p1x (+ (* (cos rad1) r) cenx))
          (setq ceny (caddr (assoc 10 (entget (ssname qq n)))))
          (setq p1y (+ (* (sin rad1) r) ceny))
          (setq p1 (list p1x p1y))
          (setq rad1 (cdr (assoc 51 (entget (ssname qq n)))))
          (setq p2x (+ (* (cos rad1) r) cenx))
          (setq p2y (+ (* (sin rad1) r) ceny))
          (setq p2 (list p2x p2y))
          (command "_.LENGTHEN" "de" 100 p1 p2 "")
        )
      )
      (setq n (1+ n))
    )
  )
  (setvar "OSMODE" os)
  (princ)
)


这里改了一下:
(command "_.LENGTHEN" "de" 100  p1 p2 "")改为:
(command "_.LENGTHEN" "de" 100 (list (ssname qq n) p1) "")
(command "_.LENGTHEN" "de" 100 (list (ssname qq n) p2) "")
或:
(command "_.LENGTHEN" "de" 100 (list (ssname qq n) p1)  (list (ssname qq n) p2)  "")


回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-9 10:01 | 显示全部楼层
稍微改了一下
[code="lisp] (defun c:lsc (/ os l ss n en pt1 pt2)
  (setvar "CMDECHO" 0)
  (setq os (getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (setq l (getreal "\n伸长量:"))
  (setq ss (ssget '((0 . "lwpolyline,line,arc"))))
  (repeat (setq n (sslength ss))
    (setq en  (ssname ss (setq n (1- n)))
          pt1 (vlax-curve-getstartpoint en)
          pt2 (vlax-curve-getendpoint en)
    )
    (command "lengthen" "de" l (list en pt1) (list en pt2) "")
  )
  (setvar "OSMODE" os)
)[/code]
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-9 09:50 | 显示全部楼层
可以选择延长左边或右边,延长的距离要能输入就方便了

点评

相对谁左边或右边?  发表于 2021-9-9 10:02
发表于 2021-9-9 11:02 | 显示全部楼层
本帖最后由 sunny_8848 于 2021-9-9 11:04 编辑
sunny_8848 发表于 2021-9-9 09:50
可以选择延长左边或右边,延长的距离要能输入就方便了

把直线的中点放到原点,延长直线,就会发现是两端各延长50(实际上图形都有其位置的,延长的这个数据还不能输入)
 楼主| 发表于 2021-9-9 11:35 | 显示全部楼层
gaics 发表于 2021-9-9 08:47
(defun c:dd1 (/ os qq n p1 p2 rad1 cenx ceny p1x p1y p2x p2y)
  (setvar "CMDECHO" 0)
  (setq os (g ...

谢谢您的指点,已试用,可完美运行。。
 楼主| 发表于 2021-9-9 11:41 | 显示全部楼层

您这哪是稍微修改啊,简直脱胎换骨,代码简化了且运行完美,谢谢大神
 楼主| 发表于 2021-9-9 11:42 | 显示全部楼层
sunny_8848 发表于 2021-9-9 09:50
可以选择延长左边或右边,延长的距离要能输入就方便了

也谢谢小姐姐的指点
发表于 2021-9-9 14:25 | 显示全部楼层
高手,一群高手
发表于 2021-9-9 20:53 | 显示全部楼层


能不能在增加个批量一边延长也支持和保存输入上一次数值   这样更加智能化   不知大佬可否改下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2021-9-17 23:12 , Processed in 0.530250 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

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