yyz123121 发表于 2020-12-15 08:48:33

多段线向内或向外偏移后,角点自动画出斜线

多段线向内或向外偏移后,角点自动画出斜线

类似这样的,蓝色的线是多段线,红色的线是偏移之后的线,需要角点的斜线自动出来。

有个参考的代码。

yshf 发表于 2020-12-15 08:48:34

yyz123121 发表于 2020-12-15 21:49
你好,测试了下,如果输入数值,那么就直接向内偏移,如果点外侧,那就没法输入数值。可以帮忙优化一下吗 ...

(defun c:SGX()
    (setq cmd (getvar "cmdecho"))
    (setq osm (getvar "osmode"))
    (setvar "cmdecho" 0)
    (setvar "osmode" 0)
    (command "_undo" "be")
    (while (progn
             (princ "\需要选取单根POLYLINE作为截面线")
             (setq ssa (ssget ":S" '((0 . "lwpolyline")(70 . 1))))
           )
         (If (= (setq pyjl (getreal "\n偏移距离<1.0>=")) nil)
             (setq pyjl 1.0)
       )
         (If (setq pt1 (getpoint "\n点选偏移方向(向内侧)"))
             (progn
               (setq ent (ssname ssa 0))
               (setq dxf (entget ent))
                 (setq pts (mapcar 'cdr (vl-remove-if-not '(lambda(a)(= (car a) 10)) dxf)))
               (command "_offset" pyjl ent pt1 "")
               (command "_chprop" (entlast) "" "c" 1 "")
               (setq pts1 (mapcar 'cdr (vl-remove-if-not '(lambda(a)(= (car a) 10)) (entget (entlast)))))
               (mapcar '(lambda(a b)
                              (command "_line" a b "" "_chprop" (entlast) "" "c" 1 "")
                        )
                        pts
                        pts1
                 )
             )
       )
    )
    (command "_undo" "e")
    (setvar "osmode" osm)
    (setvar "cmdecho" cmd)
    (princ)
)

yshf 发表于 2020-12-15 14:13:34


(defun c:SGX()
    (setq cmd (getvar "cmdecho"))
    (setq osm (getvar "osmode"))
    (setvar "cmdecho" 0)
    (setvar "osmode" 0)
    (command "_undo" "be")
    (setq cd (getvar "offsetdist"))
    (while (progn
             (princ "\需要选取单根POLYLINE作为截面线")
             (setq ssa (ssget ":S" '((0 . "lwpolyline")(70 . 1))))
           )
         (setq ent (ssname ssa 0))
         (setq dxf (entget ent))
       (setq pts (mapcar 'cdr (vl-remove-if-not '(lambda(a)(= (car a) 10)) dxf)))
         (setq pt1 (getpoint "\n点选偏移方向(向内侧)"))
         (setq cd (distance pt1 (vlax-curve-getclosestpointto ent pt1)))
         (setvar "offsetdist" cd)
         (command "_offset" "" ent pt1 "")
         (command "_chprop" (entlast) "" "c" 1 "")
         (setq pts1 (mapcar 'cdr (vl-remove-if-not '(lambda(a)(= (car a) 10)) (entget (entlast)))))
         (mapcar '(lambda(a b)
                      (command "_line" a b "" "_chprop" (entlast) "" "c" 1 "")
                  )
                  pts
                  pts1
        )
    )
    (command "_undo" "e")
    (setvar "osmode" osm)
    (setvar "cmdecho" cmd)
    (princ)
)

yyz123121 发表于 2020-12-15 21:49:45

yshf 发表于 2020-12-15 14:13
(defun c:SGX()
    (setq cmd (getvar "cmdecho"))
    (setq osm (getvar "osmode"))


你好,测试了下,如果输入数值,那么就直接向内偏移,如果点外侧,那就没法输入数值。可以帮忙优化一下吗,改成输入命令后,让输入数值,然后选择多段线,然后点击内侧或外侧。

yyz123121 发表于 2020-12-16 10:44:45

yshf 发表于 2020-12-15 22:04
(defun c:SGX()
    (setq cmd (getvar "cmdecho"))
    (setq osm (getvar "osmode"))


谢谢,就是这个效果,非常完美。

tigcat 发表于 2021-6-26 22:06:00

yshf 发表于 2020-12-15 08:48
(defun c:SGX()
    (setq cmd (getvar "cmdecho"))
    (setq osm (getvar "osmode"))


谢谢长老的回帖,我感觉可以用来参考画结构图的加腋板

zj20190405 发表于 2021-7-14 09:19:51

yshf 发表于 2020-12-15 08:48
(defun c:SGX()
    (setq cmd (getvar "cmdecho"))
    (setq osm (getvar "osmode"))


版主,你这个只适合多段线,

zj20190405 发表于 2021-7-14 09:22:48

yshf 发表于 2020-12-15 08:48
(defun c:SGX()
    (setq cmd (getvar "cmdecho"))
    (setq osm (getvar "osmode"))


如果是线段或者其他图形,很难做出来这个效果

weizhenyu2000 发表于 2021-7-15 17:22:11

很好人实用

pizi158545086 发表于 2021-11-8 10:04:20

每次使用后捕捉都全部取消了是怎么回事呢
页: [1] 2
查看完整版本: 多段线向内或向外偏移后,角点自动画出斜线