yan19851204 发表于 2011-6-17 12:55:04

在交点上插入图块或圆的lisp程序

http://bbs.mjtd.com/thread-86381-1-1.html论坛看到的在交点插入方框的程序,但我希望插入的是圆或者块,哪位朋友能够帮忙改一下吗?谢谢!

[*];;;计算曲线交点
[*]http://bbs.mjtd.com/source/plugin/mc_colorcode/images/jssc_none.gif)

arno_tm 发表于 2019-2-9 14:08:08

谢谢分享,很牛X

墨者 发表于 2018-3-27 23:48:36

谢谢楼主分享

yan19851204 发表于 2011-6-17 12:56:54

插入方框代码:
;;;计算曲线交点
(defun Curveinters (en1 en2 / pl pts)
(setq pl(vlax-invoke (vlax-ename->vla-object en2) 'IntersectWith (vlax-ename->vla-object en1) acExtendNone))
(while pl
    (setq pts (append pts (list (list (car pl) (cadr pl) (caddr pl))))
   pl (cdr (cdr (cdr pl)))
   )
    )
pts
)
;;;曲线选择集交点
(defun ssinters (ss / pts en1 en2)
(while (> (sslength ss) 1)
    (setq en1 (ssname ss 0))
    (ssdel en1 ss)
    (setq n (sslength ss))
    (repeat n
      (setq en2 (ssname ss (setq n (1- n))))
      (setq pts (append pts (Curveinters en1 en2)))
      )
    )
pts
)
;;;画框
(defun drawbox (pt d / r en ang)
(setq en (ssget pt '((0 . "*line"))))
(setq en (ssname en 0))
(setq ang (angle pt (mapcar '+ pt (vlax-curve-getFirstDeriv en (vlax-curve-getParamAtPoint en (setq pt (vlax-curve-getclosestpointto en pt)))))))
(setq r (* d (sqrt 2)))
;;此处也可改插入框的图块
(command "rectang" (polar pt (* pi 1.25) r) (polar pt (* pi 0.25) r ) )
(command "rotate" (entlast) "" pt (/ (* 180 ang) pi))
)
;;;使用实例
(defun c:tt(/ p1 p2 d minX minY maxX maxY pt pts p1 p2 ss os cmdecho)
(setq os (getvar "osmode"))
(setq cmdecho (getvar "cmdecho"))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(setq d (getreal "\n插入框大小<1.0>"))
(if (null d) (setq d 1.))
(while (and
         (setq p1 (getpoint "\n选择图框左下角:"))
         (setq p2 (GETCORNER p1 "\n选择图框左下角:"))
         )
    (setq minX (apply 'min (mapcar 'car (list p1 p2)))
          minY (apply 'min (mapcar 'cadr (list p1 p2)))
          maxX (apply 'max (mapcar 'car (list p1 p2)))
          maxY (apply 'max (mapcar 'cadr (list p1 p2)))
          )
    (grvecs (list 1 (list minx miny) (list maxx miny)
                  1 (list maxx miny) (list maxx maxy)
                  1 (list maxx maxy) (list minx maxy)
                  1 (list minx maxy) (list minx miny)
                  )
            )
    (setq ss (ssget "c" p1 p2 '((0 . "*line"))))
    (if ss
      (progn
      (setq pts (ssinters ss))
      (if pts
          (foreach pt pts
            (if (and (>= maxX (car pt) minX)
                     (>= maxY (cadr pt) minY)
                     )
            (drawbox pt d)
            )
            )
          )
      )
      )
    (princ "\n ***回车键结束***")
    )
(setvar "osmode" os)
(setvar "cmdecho" cmdecho)
(princ)
)

Andyhon 发表于 2011-6-17 15:12:32

;;此处也可改插入框的图块
;|
(command "rectang" (polar pt (* pi 1.25) r) (polar pt (* pi 0.25) r ) )
(command "rotate" (entlast) "" pt (/ (* 180 ang) pi))
|;

(command "Insert" "ABlockName" pt 1 1 0)       ; ABlockName ==>块名

yan19851204 发表于 2011-6-18 12:48:18

回复 Andyhon 的帖子

谢谢您回复,但好像没有效果啊,能否帮忙写全呢?

xyp1964 发表于 2011-6-18 13:01:44

;; 需要e派工具箱的支持
(defun c:tt ()
(CMDLA0)
(if (setq ss (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))
    (progn
      (setq ptn (xyp-Get-CurveInters ss))
      (foreach pt ptn
(xyp-circle pt 200);200为圆半径
      )
    )
)
(CMDLA1)
)


chpmould 发表于 2011-6-18 13:16:05

本帖最后由 chpmould 于 2011-6-18 13:17 编辑

yan19851204 发表于 2011-6-18 12:48 http://bbs.mjtd.com/static/image/common/back.gif
回复 Andyhon 的帖子

谢谢您回复,但好像没有效果啊,能否帮忙写全呢?

Andyhon的方法就是你需要的按交点插入块,你可以直接就这样用 (defun c:test()
(setq ss(ssget '((0 . "line"))))
(if ss(progn(setq pts(ssinters ss))
(if pts(foreach pt pts(command "Insert" "ABlockName" pt 1 1 0)))))
)

【KAIXIN】 发表于 2011-12-14 13:09:33

http://bbs.mjtd.com/thread-91172-1-1.html

zyhandw 发表于 2011-12-14 15:27:19

改了一下,插入圆的程序如下:;;;计算曲线交点
(defun Curveinters (en1 en2 / pl pts)
(setq pl(vlax-invoke (vlax-ename->vla-object en2) 'IntersectWith (vlax-ename->vla-object en1) acExtendNone))
(while pl
    (setq pts (append pts (list (list (car pl) (cadr pl) (caddr pl))))
   pl (cdr (cdr (cdr pl)))
   )
    )
pts
)
;;;曲线选择集交点
(defun ssinters (ss / pts en1 en2)
(while (> (sslength ss) 1)
    (setq en1 (ssname ss 0))
    (ssdel en1 ss)
    (setq n (sslength ss))
    (repeat n
      (setq en2 (ssname ss (setq n (1- n))))
      (setq pts (append pts (Curveinters en1 en2)))
      )
    )
pts
)
;;;画框
(defun drawbox (pt d / r en ang)
(setq en (ssget pt '((0 . "*line"))))
(setq en (ssname en 0))
(setq ang (angle pt (mapcar '+ pt (vlax-curve-getFirstDeriv en (vlax-curve-getParamAtPoint en (setq pt (vlax-curve-getclosestpointto en pt)))))))
(setq r (* d (sqrt 2)))
;;此处也可改插入框的图块
(command "circle" pt 2.0)
)
;;;使用实例
(defun c:tt(/ p1 p2 d minX minY maxX maxY pt pts p1 p2 ss os cmdecho)
(setq os (getvar "osmode"))
(setq cmdecho (getvar "cmdecho"))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(setq d (getreal "\n插入框大小<1.0>"))
(if (null d) (setq d 1.))
(while (and
         (setq p1 (getpoint "\n选择图框左下角:"))
         (setq p2 (GETCORNER p1 "\n选择图框左下角:"))
         )
    (setq minX (apply 'min (mapcar 'car (list p1 p2)))
          minY (apply 'min (mapcar 'cadr (list p1 p2)))
          maxX (apply 'max (mapcar 'car (list p1 p2)))
          maxY (apply 'max (mapcar 'cadr (list p1 p2)))
          )
    (grvecs (list 1 (list minx miny) (list maxx miny)
                  1 (list maxx miny) (list maxx maxy)
                  1 (list maxx maxy) (list minx maxy)
                  1 (list minx maxy) (list minx miny)
                  )
            )
    (setq ss (ssget "c" p1 p2 '((0 . "*line"))))
    (if ss
      (progn
      (setq pts (ssinters ss))
      (if pts
          (foreach pt pts
            (if (and (>= maxX (car pt) minX)
                     (>= maxY (cadr pt) minY)
                     )
            (drawbox pt d)
            )
            )
          )
      )
      )
    (princ "\n ***回车键结束***")
    )
(setvar "osmode" os)
(setvar "cmdecho" cmdecho)
(princ)
)

zyhandw 发表于 2011-12-15 15:21:52

不支持圆弧和直线交点的插入?
那好办啊,用pedit将圆弧转成多义线就行了!

zyhandw 发表于 2011-12-15 15:22:42

将圆弧转成多义线啊!
页: [1] 2
查看完整版本: 在交点上插入图块或圆的lisp程序