明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7236|回复: 18

[讨论] 在交点上插入图块或圆的lisp程序

    [复制链接]
发表于 2011-6-17 12:55 | 显示全部楼层 |阅读模式
http://bbs.mjtd.com/thread-86381-1-1.html论坛看到的在交点插入方框的程序,但我希望插入的是圆或者块,哪位朋友能够帮忙改一下吗?谢谢!
  • ;;;计算曲线交点
  •   )

发表于 2019-2-9 14:08 | 显示全部楼层
谢谢分享,很牛X
发表于 2018-3-27 23:48 | 显示全部楼层
谢谢楼主分享
 楼主| 发表于 2011-6-17 12:56 | 显示全部楼层
插入方框代码:
;;;计算曲线交点
(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)
  )
发表于 2011-6-17 15:12 | 显示全部楼层
;;此处也可改插入框的图块
;|
  (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 ==>块名
 楼主| 发表于 2011-6-18 12:48 | 显示全部楼层
回复 Andyhon 的帖子

谢谢您回复,但好像没有效果啊,能否帮忙写全呢?
发表于 2011-6-18 13:01 | 显示全部楼层
  1. ;; 需要e派工具箱的支持
  2. (defun c:tt ()
  3.   (CMDLA0)
  4.   (if (setq ss (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))
  5.     (progn
  6.       (setq ptn (xyp-Get-CurveInters ss))
  7.       (foreach pt ptn
  8. (xyp-circle pt 200)  ;200为圆半径
  9.       )
  10.     )
  11.   )
  12.   (CMDLA1)
  13. )


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2011-6-18 13:16 | 显示全部楼层
本帖最后由 chpmould 于 2011-6-18 13:17 编辑
yan19851204 发表于 2011-6-18 12:48
回复 Andyhon 的帖子

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


Andyhon的方法就是你需要的按交点插入块,你可以直接就这样用
  1. (defun c:test()
  2. (setq ss(ssget '((0 . "line"))))
  3. (if ss(progn(setq pts(ssinters ss))
  4. (if pts(foreach pt pts(command "Insert" "ABlockName" pt 1 1 0)))))
  5. )
发表于 2011-12-14 13:09 | 显示全部楼层
http://bbs.mjtd.com/thread-91172-1-1.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2011-12-14 15:27 | 显示全部楼层
改了一下,插入圆的程序如下:
  1. ;;;计算曲线交点
  2. (defun Curveinters (en1 en2 / pl pts)
  3.   (setq pl  (vlax-invoke (vlax-ename->vla-object en2) 'IntersectWith (vlax-ename->vla-object en1) acExtendNone))
  4.   (while pl
  5.     (setq pts (append pts (list (list (car pl) (cadr pl) (caddr pl))))
  6.    pl (cdr (cdr (cdr pl)))
  7.    )
  8.     )
  9. pts
  10.   )
  11. ;;;曲线选择集交点
  12. (defun ssinters (ss / pts en1 en2)
  13.   (while (> (sslength ss) 1)
  14.     (setq en1 (ssname ss 0))
  15.     (ssdel en1 ss)
  16.     (setq n (sslength ss))
  17.     (repeat n
  18.       (setq en2 (ssname ss (setq n (1- n))))
  19.       (setq pts (append pts (Curveinters en1 en2)))
  20.       )
  21.     )
  22.   pts
  23.   )
  24. ;;;画框
  25. (defun drawbox (pt d / r en ang)
  26.   (setq en (ssget pt '((0 . "*line"))))
  27.   (setq en (ssname en 0))
  28.   (setq ang (angle pt (mapcar '+ pt (vlax-curve-getFirstDeriv en (vlax-curve-getParamAtPoint en (setq pt (vlax-curve-getclosestpointto en pt)))))))
  29.   (setq r (* d (sqrt 2)))
  30.   ;;此处也可改插入框的图块
  31.   (command "circle" pt 2.0)
  32.   )
  33. ;;;使用实例
  34. (defun c:tt(/ p1 p2 d minX minY maxX maxY pt pts p1 p2 ss os cmdecho)
  35.   (setq os (getvar "osmode"))
  36.   (setq cmdecho (getvar "cmdecho"))
  37.   (setvar "osmode" 0)
  38.   (setvar "cmdecho" 0)
  39.   (setq d (getreal "\n插入框大小<1.0>"))
  40.   (if (null d) (setq d 1.))
  41.   (while (and
  42.            (setq p1 (getpoint "\n选择图框左下角:"))
  43.            (setq p2 (GETCORNER p1 "\n选择图框左下角:"))
  44.            )
  45.     (setq minX (apply 'min (mapcar 'car (list p1 p2)))
  46.           minY (apply 'min (mapcar 'cadr (list p1 p2)))
  47.           maxX (apply 'max (mapcar 'car (list p1 p2)))
  48.           maxY (apply 'max (mapcar 'cadr (list p1 p2)))
  49.           )
  50.     (grvecs (list 1 (list minx miny) (list maxx miny)
  51.                   1 (list maxx miny) (list maxx maxy)
  52.                   1 (list maxx maxy) (list minx maxy)
  53.                   1 (list minx maxy) (list minx miny)
  54.                   )
  55.             )
  56.     (setq ss (ssget "c" p1 p2 '((0 . "*line"))))
  57.     (if ss
  58.       (progn
  59.         (setq pts (ssinters ss))
  60.         (if pts
  61.           (foreach pt pts
  62.             (if (and (>= maxX (car pt) minX)
  63.                      (>= maxY (cadr pt) minY)
  64.                      )
  65.               (drawbox pt d)
  66.               )
  67.             )
  68.           )
  69.         )
  70.       )
  71.     (princ "\n ***回车键结束***")
  72.     )
  73. (setvar "osmode" os)
  74.   (setvar "cmdecho" cmdecho)
  75.   (princ)
  76. )

点评

不支持圆弧和直线交点的插入  发表于 2011-12-15 14:54
发表于 2011-12-15 15:21 | 显示全部楼层
不支持圆弧和直线交点的插入?
那好办啊,用pedit将圆弧转成多义线就行了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2011-12-15 15:22 | 显示全部楼层
将圆弧转成多义线啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-13 15:54 , Processed in 0.162469 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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