明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1784|回复: 5

[LISP]听说哪位仁兄需要剪切圆内部图元的程序我写了一个看一下吧,很简单的

[复制链接]
发表于 2005-3-26 17:56 | 显示全部楼层 |阅读模式
;;;;;;;;;;;经实验可切除圆内部或图形
(defun c:trc(/ oldcmdcho oldosmode enobj kk endata);;;hy_trim_in
(setq oldcmdcho (getvar "cmdecho" ))
(setvar "cmdecho" 0)
(setq oldosmode (getvar "osmode"))
(setvar "osmode" 0)
(command "ucs" "w")
(COMMAND "REGEN")
(setq enobj (car (entsel "\n选圆:")))
(initget "1 2")
(setq kk (getkword "\n剪除内部物体<1>,剪除外部物体<2>:<1?>"))
(if (= kk nil) (setq kk "1"))
(setq endata (entget enobj))
(cond
;;;;;如果enobj为一个圆;;;;;;;
((= (cdr (assoc 0 endata)) "CIRCLE")
(hy_trim_in_circle))
(t (progn (alert "\n你选的物体不是圆!重新确认")(exit))))
;end cond
(setvar "cmdecho" oldcmdcho)
(setvar "osmode" oldosmode)
(prin1)
)
;;;;;;;;;;剪除圆内或外部的物体;;;;;;;;;;
(defun hy_trim_in_circle(/ centerpoint radius point_list be_angle jk viu_point item)
(setq centerpoint (cdr(assoc 10 endata)))
(setq radius (cdr(assoc 40 endata)))
(if (= kk "1") (setq jk (- radius 0.01)) (setq jk (+ radius 0.01)))
(setq point_list '());;;以0.5度为一阶,半径缩小0.05圆上所有点
;(setq be_angle 0);起始角度为0
(setq i 0);;计数器归0
(repeat 720
(setq viu_point (polar centerpoint
(/ (* 0.5 i pi) 180)
jk);end polar
)
(setq point_list (cons viu_point point_list))
(setq i (1+ i))
);end repeat
(command "undo" "be")
(command "trim" enobj "" "f")
(foreach item point_list (command item))
(command "" ""))
(command "undo" "e")
)
发表于 2005-3-27 08:53 | 显示全部楼层
我试了一下,有bug,并且速度有点慢。
发表于 2005-3-27 09:47 | 显示全部楼层
Ljpnb近来很热情地研究lisp , 我感觉到的.
发表于 2005-3-27 11:09 | 显示全部楼层
让BDYCAD见笑了,最近兴趣在这编程上,趁热打铁,多学一点,说不定过一阵子就去忙别的,不过总觉得autocad学得再好,对我来说不顶事,我是靠三维软件吃饭的,所以打算过一阵子重新去学pro/e-wf。
发表于 2006-1-5 17:14 | 显示全部楼层

将楼主的程序修改了一下可以实现批量剪切

;;;;;;;;;;;经实验可切除圆内部或图形
(defun c:trc (/ oldcmdcho oldosmode enobj kk endata)
;;;hy_trim_in
  (setq oldcmdcho (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (setq oldosmode (getvar "osmode"))
  (setvar "osmode" 0)
     ;(command "ucs" "w")
     ;(COMMAND "REGEN")
  (prompt "\n请选择需圆内剪切的圆:")
  (setq ss_ent (ssget '((0 . "circle"))))
  (setq ss_n (sslength ss_ent)
 in   0
  )
  (while (< in ss_n)
    (setq enobj (ssname ss_ent in))
    (setq endata (entget enobj))
    (setq kk "1")
    (if
      (= (cdr (assoc 0 endata)) "CIRCLE")
       (hy_trim_in_circle)
    )
    (setq in (1+ in))
  )
  (setvar "cmdecho" oldcmdcho)
  (setvar "osmode" oldosmode)
  (princ)
)
;;;;;;;;;;剪除圆内或外部的物体;;;;;;;;;;
(defun hy_trim_in_circle
       (/ centerpoint radius point_list be_angle jk viu_point item)
  (setq centerpoint (cdr (assoc 10 endata)))
  (setq radius (cdr (assoc 40 endata)))
  (if (= kk "1")
    (setq jk (- radius 0.01))
    (setq jk (+ radius 0.01))
  )
  (setq point_list '())
;;;以0.5度为一阶,半径缩小0.05圆上所有点
     ;(setq be_angle 0);起始角度为0
  (setq i 0)
  ;;计数器归0
  (repeat 720
    (setq viu_point (polar centerpoint
      (/ (* 0.5 i pi) 180)
      jk
      )   ;end polar
    )
    (setq point_list (cons viu_point point_list))
    (setq i (1+ i))
  )     ;end repeat
  (command "undo" "be")
  (if (= kk "1")
    (progn
      (command "trim" enobj "" "f")
      (foreach item point_list (command item))
      (command "" "")
    )
  )
  (if (/= kk "1")
    (progn (setq i 0)
    (repeat (length point_list)
      (command "trim"
        enobj
        ""
        "f"
        (nth i point_list)
        (nth (1+ i) point_list)
        ""
        ""
      )
      (setq i (1+ i))
    )
    )
  )
  (command "undo" "e")
)

发表于 2006-1-5 23:57 | 显示全部楼层

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=42440

可参考我写的一个东西,

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 22:09 , Processed in 0.262723 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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