illcyt 发表于 2012-12-3 20:57:47

【高手请进】能否实现如下功能

各位大神你们好,特别感谢你们的关注,我开门见山:
本人在平时绘图习惯于保持精确的尺寸绘图,但常常遇到如图下问题,都是一个个手画,工作比较繁琐,先向论坛大神们求助能否实现如下功能的lsp,本人不太会说感激的话,但是真心感谢在成功路上给予帮助的大神们!



Gu_xl 发表于 2012-12-3 21:50:34


(defun c:tt (/ E P1 P2 SS PL FLAG)
(princ "\n选择指定图层物体:")
(if (and
        (setq e (ssget ":s"))
        (setq p1 (getpoint "\n画线第一点:"))
        (setq p2 (getpoint p1 "\n画线第二点:"))
      )
    (progn
      (setq ss
             (ssget "_F"
                  (list p1 p2)
                  (list (cons 0 "*line") (assoc 8 (entget (ssname e 0))))
             )
      )
      (if ss
        (progn
          (setq
          pl (mapcar '(lambda (x) (cadr (cadddr x))) (ssnamex ss))
          )
          (setq p1 (car pl) pl (cdr pl) flag t)
          (while pl
          (setq p2 (car pl) pl (cdr pl))
          (if flag
          (entmake
              (list '(0 . "line")
                  (cons 10 (polar p1 (angle p2 p1) 150))
                  (cons 11 (polar p2 (angle p1 p2) 150))
                  )
              )
              (entmake
              (list '(0 . "line")
                  (cons 10 (polar (polar p1 (* 0.5 pi) 100) (angle p2 p1) 150))
                  (cons 11 (polar (polar p2 (* 0.5 pi) 100) (angle p1 p2) 150))
                  )
              )
              )
          (setq p1 p2 flag (not flag))
          )
        )
      )
    )
)
(princ)
)

357785513 发表于 2012-12-3 22:45:25

高呀,高呀.不错呀

illcyt 发表于 2012-12-4 08:39:50

Gu_xl 发表于 2012-12-3 21:50 static/image/common/back.gif


G版依旧犀利,这么快就给解决了,使用中发现一个小小的问题如图所示,就是指定直线为某线宽的多线时,偏移数值就会有些偏差,如果这个也能够解决,就完美了!

Gu_xl 发表于 2012-12-4 09:51:50

illcyt 发表于 2012-12-4 08:39 static/image/common/back.gif
G版依旧犀利,这么快就给解决了,使用中发现一个小小的问题如图所示,就是指定直线为某线宽的多线时,偏移 ...


(defun c:tt (/ E P1 P2 SS PL FLAG a b w1 w2)
(princ "\n选择指定图层物体:")
(if (and
      (setq e (ssget ":s"))
      (setq p1 (getpoint "\n画线第一点:"))
      (setq p2 (getpoint p1 "\n画线第二点:"))
      )
    (progn
      (setq ss
             (ssget "_F"
                  (list p1 p2)
                  (list (cons 0 "*line") (assoc 8 (entget (ssname e 0))))
             )
      )
      (if ss
      (progn
          (setq
            pl (mapcar '(lambda (x) (list (cadr x) (cadr (cadddr x)))) (ssnamex ss))
          )
          (setq a (car pl) pl (cdr pl) flag t)
          (while pl
          (setq p1 (cadr a) e1 (car a))
          (if (WCMATCH (cdr (assoc 0 (entget e1))) "*POLYLINE")
              (setq w1 (* 0.5 (vla-get-ConstantWidth (vlax-ename->vla-object e1))))
              (setq w1 0)
              )
            (setq b (car pl) pl (cdr pl))
          (setq p2 (cadr b) e2 (car b))
          (if (WCMATCH (cdr (assoc 0 (entget e2))) "*POLYLINE")
              (setq w2 (* 0.5 (vla-get-ConstantWidth (vlax-ename->vla-object e2))))
              (setq w2 0)
              )
            (if flag
            (entmake
            (list '(0 . "line")
                  (cons 10 (polar p1 (angle p2 p1) (+ w1 150)))
                  (cons 11 (polar p2 (angle p1 p2) (+ w2 150)))
                  )
            )
            (entmake
            (list '(0 . "line")
                  (cons 10 (polar (polar p1 (* 0.5 pi) 100) (angle p2 p1) (+ w1 150)))
                  (cons 11 (polar (polar p2 (* 0.5 pi) 100) (angle p1 p2) (+ w2 150)))
                  )
            )
            )
            (setq a b flag (not flag))
            )
      )
      )
    )
)
(princ)
)

illcyt 发表于 2012-12-4 16:39:45

Gu_xl 发表于 2012-12-4 09:51 static/image/common/back.gif


G版你好,在你给的源码基础上,实现了我上部的想法,于是在构思能否实现如图操作,请教了@革天明,提供了如下思路:
;;选择集->图元名表
   (defun ss->elst (ss / elst)
   (setq i 0)
   (repeat (sslength ss)
       (setq elst (cons (ssname ss i) elst)
            i         (1+ i)
       )
   )
   (reverse elst)
   )
   ;;两点的中点
   (defun mpt (mpt1 mpt2)
   (polar mpt1 (angle mpt1 mpt2) (/ (distance mpt1 mpt2) 2))
   )
   (setq      ss    (ssget '((8 . "CX砂面线")))
      sslst (ss->elst ss)
      ptlst (mapcar '(lambda (x / data p1 p2 dist p0)
                         (setq data (entget x))
                         (setq p1 (cdr (assoc 10 data)))
                         (setq p2 (cdr (assoc 11 data)))
                         (setq dist (distance p2 p1))
                         (setq p0 (mpt p1 p2))
                         (list p0
                               (polar p0 (* pi 0.5) dist)
                               (polar p0 (* pi 0.5) (* 1.5 dist))
                         )
                     )
                      sslst
            )
   )
   (setq i 0)
   (repeat (length ptlst)
   (setq n (nth i ptlst))
   (entmake (list '(0 . "LEADER")
                   '(100 . "AcDbEntity")
                   '(100 . "AcDbLeader")
                   (cons 10 (car n))
                   (cons 10 (cadr n))
                   (cons 10 (caddr n))
             )
   )
   (setq i (1+ i))
   )


可是我还不够完善,分别表现为不能够支持引出标注,特厚着脸皮再来请教你,如何能够实现和完善,谢谢


页: [1]
查看完整版本: 【高手请进】能否实现如下功能