找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1092|回复: 11

[下载]:实现智能剪切的lisp程序

[复制链接]
发表于 2003-5-27 16:04:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
该程序实现的功能如图中所示,只要选择矩形,便可将穿过矩形的直线剪切(以前是一条一条的选择),由于水平有限,程序的语句可能太繁琐,但功能对我面言很实用(以前我下载了一个,但效果不好,连矩形外也剪掉了),

请各位高手优化!
源程序如下:

  1. (defun c:mytrim (/ rect e0 e1 pt x ptx pty  l1 i p1 p2 p1x p1y point count)
  2.   (setvar "osmode" 0)
  3.   (setq l1 nil)
  4.   (setq i 0)
  5.   (setq rect (car (entsel "\n请选择需剪切的矩形:")))
  6.   (setq e0 (entget rect))
  7.   (while (setq x (nth i e0))
  8.     (if        (= (car x) 10)
  9.       (progn
  10.         (setq ptx (nth 1 x))
  11.         (setq pty (nth 2 x))
  12.         (setq x (list ptx pty))
  13.         (setq l1 (cons x l1))
  14.       )
  15.     )
  16.     (setq i (1+ i))
  17.   )
  18.   (reverse l1)
  19.   (setq p1 (car l1))
  20.   (setq p1x (nth 0 p1))
  21.   (setq p1y (nth 1 p1))
  22.   (setq count 0)
  23.   (repeat 3
  24.     (setq count (+ count 1))
  25.     (setq pt (nth count l1))
  26.     (setq ptx (nth 0 pt))
  27.     (setq pty (nth 1 pt))
  28.     (setq point (mapcar '+ p1 pt))
  29.     (setq point (mapcar '/ point '(2.0 2.0 2.0)))
  30.     (if
  31.       (and (/= (nth 0 point) p1x)
  32.            (/= (nth 0 point) ptx)
  33.            (/= (nth 1 point) p1y)
  34.            (/= (nth 1 point) pty)
  35.       )
  36.        (setq p point)
  37.     )
  38.   )
  39.   (setq l1 nil)
  40.   (command "offset" 5 rect p "")
  41.   (setq e0 (entlast))
  42.   (setq e1 (entget e0))
  43.   (princ e1)
  44.   (setq i 0)
  45.   (while (setq x (nth i e1))
  46.     (if        (= (car x) 10)
  47.       (progn
  48.         (setq ptx (nth 1 x))
  49.         (setq pty (nth 2 x))
  50.         (setq x (list ptx pty))
  51.         (setq l1 (cons x l1))
  52.       )
  53.     )
  54.     (setq i (1+ i))
  55.   )
  56.   (reverse l1)
  57.   (setq p1 (car l1))
  58.   (command "erase" e0 "")
  59.   (setq count 0)
  60.   (repeat 3
  61.     (setq count (+ count 1))
  62.     (setq pt (nth count l1))
  63.     (command "trim" rect "" "f" p1 pt """")
  64.   )
  65.   (setq p1 (cadr l1))
  66.   (command "erase" e0 "")
  67.   (setq count 1)
  68.   (repeat 2
  69.     (setq count (+ count 1))
  70.     (setq pt (nth count l1))
  71.     (command "trim" rect "" "f" p1 pt """")
  72.   )  
  73.    (setvar "osmode" 687)
  74. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-5-27 16:13:42 | 显示全部楼层
这个程序与CAD扩展工具里的用特定边界剪切是不是一样?从介绍来看应该是差不多吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-27 18:11:36 | 显示全部楼层
你5月7日不是发过这个问题的帖子吗,我给你写了一个程序。 你还说很实用,怎么, 又有什么新问题了吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-28 08:32:05 | 显示全部楼层
你的程序在实际使用中,有时将矩形的边或矩形外的线剪切掉了,我的程序参照你的程序重新编了一下,不好意思,借用了你的思路.(朋友多,互相学习)
有些语句实际上重复了,昨天我又改了下,源程序如下:
(defun c:mytrim
       (/ rect e0 e1 pt x ptx pty l1 i p1 p2 p1x p1y point count)
  (setvar "osmode" 0)
  (setq l1 nil)
  (setq i 0)
  (setq rect (car (entsel "\n请选择需剪切的矩形:")))
  (setq e0 (entget rect))
  (while (setq x (nth i e0))
    (if        (= (car x) 10)
      (progn
        (setq ptx (nth 1 x))
        (setq pty (nth 2 x))
        (setq x (list ptx pty))
        (setq l1 (cons x l1))
      )
    )
    (setq i (1+ i))
  )
  (reverse l1)
  (setq p1 (car l1))
  (setq p1x (nth 0 p1))
  (setq p1y (nth 1 p1))
  (setq count 0)
  (repeat 3
    (setq count (+ count 1))
    (setq pt (nth count l1))
    (setq ptx (nth 0 pt))
    (setq pty (nth 1 pt))
    (setq point (mapcar '+ p1 pt))
    (setq point (mapcar '/ point '(2.0 2.0 2.0)))
    (if
      (and (/= (nth 0 point) p1x)
           (/= (nth 0 point) ptx)
           (/= (nth 1 point) p1y)
           (/= (nth 1 point) pty)
      )
       (setq p point)
    )
  )
  (setq l1 nil)
  (command "offset" 5 rect p "")
  (setq e0 (entlast))
  (setq e1 (entget e0))
  (princ e1)
  (setq i 0)
  (while (setq x (nth i e1))
    (if        (= (car x) 10)
      (progn
        (setq ptx (nth 1 x))
        (setq pty (nth 2 x))
        (setq x (list ptx pty))
        (setq l1 (cons x l1))
      )
    )
    (setq i (1+ i))
  )
  (reverse l1)
  (setq p1 (car l1))
  (setq p2 p1)
  (command "erase" e0 "")
  (setq count 0)
  (repeat 3
    (setq count (+ count 1))
    (setq pt (nth count l1))
    (command "trim" rect "" "f" p1 pt "" "")
    (setq p1 pt)
  )
  (command "trim" rect "" "f" p1 p2 "" "")
  (setvar "osmode" 687)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-28 08:40:49 | 显示全部楼层
该程序的主要思路如下:
选择得到矩形RECT,求出矩形顶点的选择集,根据顶点集求出矩形的中心坐标,将矩形OFFSET得到一个原有矩形RECT内稍微小一点的矩形,得到新矩形顶点的选择集,根据4个顶点进行原有矩形RECT的剪切。
中间有些程序可移植到别的程序中(象求出矩形的顶点集,由此可求出LWPOLYLINE的顶点集)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-28 08:42:30 | 显示全部楼层
express工具里面好像有这个命令吧,你这个程序有什么特殊的地方吗?请详细介绍一下好吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-28 09:03:45 | 显示全部楼层
我需要把矩形的边或矩形外的线也剪切掉的程序。谁有?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-28 10:12:14 | 显示全部楼层
能做一个剪切边界为圆或闭合的多义线来剪切的程序吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-28 17:54:17 | 显示全部楼层
编程思路:以圆为剪切边的情况,先找出与圆相交的直线的在圆外的端点,然后以圆为剪切边剪切。
多边形或闭合的多义线利用fence来剪切。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-30 13:33:02 | 显示全部楼层
能做一个剪切边界为圆或闭合的多义线来剪切的程序吗
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-9 18:17:26 | 显示全部楼层
能做一个剪切下来后复制到其他地方的程序吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2003-6-9 18:59:04 | 显示全部楼层
最初由 2002zjp 发布
[B]我需要把矩形的边或矩形外的线也剪切掉的程序。谁有? [/B]


回复7,8,10,11楼的朋友:

晓东工具箱里面提供了“图形切割”,“图形裁减”,正是符合你们要求的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-26 12:55 , Processed in 0.338950 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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