找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2514|回复: 2

[LISP程序]:结合trim和extend的有趣程序

[复制链接]
发表于 2005-11-17 17:36:04 | 显示全部楼层 |阅读模式

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

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

×
一个还算有趣的trim和extend的结合,不记得论坛是不是有写过
针对一个修剪边和一堆直线自动进行trim或者extend,相交的直线按照
修剪边两边的长度,取长者保留。
这个是今天在http://intervision.hjem.wanadoo.dk/看到的程序
作者原来程序中作为修剪边的对象只能是直线,(因为用的是纯lisp
的inter函数),为了修剪边可以复杂一些,我稍作修改,用了陌生人
长老的x_intlst实体交点子程序,不过现在r14就不可以用了。
这个程序应该可以继续改进的,对修剪对象扩展为其他类型,不过这时候
应该就得用到vlax-curve-getParamAtDist之类来判断线应该留下哪一边
之类了。

代码如下
[php]
;;; Touch.LSP                                              *
;;; Small routine to align endpoints of lines to an edge.  *
;;; The edge have to be a line.                            *
;;; The routine works by calculating the point of inter-   *
;;; section and change the nearest endpoint to that point  *
;;; 2001 Stig Madsen, no rights reserved                   *
;;; modified by qjchen

(defun C:Ttt (/ cmd ent entl spt ept sset a lent lentl lspt lept lint)
  (vl-load-com)
  (setq cmd (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (command "UNDO" "Begin")
  (while (not ent)
    (setq ent (car (entsel "Select edge line: ")))
    (if ent
      (progn
        (setq entl (entget ent))
      )
    )
  )
  (if ent
    (progn
      (redraw ent 3)
      (prompt "\nSelect lines to touch edge: ")
      (setq sset (ssget '((0 . "LINE")))
            a 0
      )
      (if sset
        (repeat (sslength sset)
          (setq lentl (entget (setq lent (ssname sset a)))
                lspt (cdr (assoc 10 lentl))
                lept (cdr (assoc 11 lentl))
          )
          (setq entttt (ssname sset a))
          (setq lint (nth 0 (x_intlst ent entttt acExtendOtherEntity)))
          (if lint
            (progn

              (if (< (distance lint lspt) (distance lint lept))
                (entmod (subst
                          (cons 10 lint)
                          (assoc 10 lentl)
                          lentl
                        )
                )
                (entmod (subst
                          (cons 11 lint)
                          (assoc 11 lentl)
                          lentl
                        )
                )
              )
            )
          )
          (setq a (1+ a))
        )
        (princ "\nNo objects found")
      )
      (redraw ent 4)
    )
    (princ "\nNo edge selected")
  )
  (setvar "CMDECHO" cmd)
  (command "UNDO" "End")
  (princ)
)

;;; by xdcad 陌生人
(defun x_intlst (obj1 obj2 param / intlst1 intlst2 ptlst)

  (if (= 'ENAME (type obj1))
    (setq obj1 (vlax-ename->vla-object obj1))
  )
  (if (= 'ENAME (type obj2))
    (setq obj2 (vlax-ename->vla-object obj2))
  )
  (setq intlst1 (vlax-variant-value (vla-intersectwith obj1 obj2 param)))
  (if (< 0 (vlax-safearray-get-u-bound intlst1 1))
    (progn
      (setq intlst2 (vlax-safearray->list intlst1))
      (while (> (length intlst2) 0)
        (setq ptlst (cons (list (car intlst2) (cadr intlst2) (caddr intlst2))
                          ptlst
                    )
              intlst2 (cdddr intlst2)
        )
      )
    )
  )
  ptlst
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-11-17 18:09:48 | 显示全部楼层
求实交点,如果有实交点,剪切端点近的一边
如果无实交点,延伸端点近的一边
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2010-3-15 16:18:52 | 显示全部楼层
加载后使用时怎么提示No objects found
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 16:41 , Processed in 0.365993 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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