明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3092|回复: 20

各位帮忙修改命令!

  [复制链接]
发表于 2012-9-12 11:48:06 | 显示全部楼层 |阅读模式
本帖最后由 寒风 于 2012-9-12 12:32 编辑

附件中为压缩包,在压缩包的注释中有命令修改要求
lisp是从网上找到的,两个需要修改,一个需要编写!


谢谢



本帖子中包含更多资源

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

x
 楼主| 发表于 2012-9-12 12:15:39 | 显示全部楼层
1.第一个功能是polyline的简化,搜索后我们发现weed.lsp(见附件)完全满足我们对于线的形态简化的需要(该lsp采用的是控制vertex偏移简化线距离和线段长度两个变量来得到简化的polyline),但可惜的是weed.lsp一次只能选择一条polyline处理,并且不能处理lwpolyline;我们需要在这两个方面进行改进;   2.第二个功能是直线的自动延伸;也找到了和我们的需求差不多的lisp(见附件的blen.lsp,自动从直线的两个端点延长设定的距离),;我们需要对blen.lsp改进,只有当一个直线的端点同时还是该直线与其它直线的交点的时候,才从该端点延长直线;否则不延长(见附件lengthen intersection points.dwg)。   3.第三个功能完全没有参考的lisp,功能需求是将邻近的交点进行合并或焊接(welding):(见附件merge neighboring intersection points.dwg),当一个交点与其它交点的距离小于设定值的时候,将这些交点合并为一个(以位于最长的线上的交点为锚点,锚点位置不变,其它交点向其合并)。
 楼主| 发表于 2012-9-12 12:16:18 | 显示全部楼层
1.第一个功能是polyline的简化,搜索后我们发现weed.lsp(见附件)完全满足我们对于线的形态简化的需要(该lsp采用的是控制vertex偏移简化线距离和线段长度两个变量来得到简化的polyline),但可惜的是weed.lsp一次只能选择一条polyline处理,并且不能处理lwpolyline;我们需要在这两个方面进行改进;

2.第二个功能是直线的自动延伸;也找到了和我们的需求差不多的lisp(见附件的blen.lsp,自动从直线的两个端点延长设定的距离),;我们需要对blen.lsp改进,只有当一个直线的端点同时还是该直线与其它直线的交点的时候,才从该端点延长直线;否则不延长(见附件lengthen intersection points.dwg)。

3.第三个功能完全没有参考的lisp,功能需求是将邻近的交点进行合并或焊接(welding):(见附件merge neighboring intersection points.dwg),当一个交点与其它交点的距离小于设定值的时候,将这些交点合并为一个(以位于最长的线上的交点为锚点,锚点位置不变,其它交点向其合并)。
 楼主| 发表于 2012-9-12 14:59:33 | 显示全部楼层
 楼主| 发表于 2012-9-13 19:26:55 来自手机 | 显示全部楼层
没人帮忙一下吗?
 楼主| 发表于 2012-9-18 18:35:37 | 显示全部楼层
发表于 2012-9-19 08:16:51 | 显示全部楼层
本帖最后由 革天明 于 2012-9-19 13:13 编辑
寒风 发表于 2012-9-12 12:16
1.第一个功能是polyline的简化,搜索后我们发现weed.lsp(见附件)完全满足我们对于线的形态简化的需要(该 ...

第三个你所述的最长的线上的交点比较模糊,至少左右两图中不能看到明显的最长的线的交点

本帖子中包含更多资源

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

x
发表于 2012-9-19 13:11:46 | 显示全部楼层
本帖最后由 革天明 于 2012-9-19 16:29 编辑

现在是第三个程序,对你你的样例可以实现,你也可以看我的图片,只要交点就是直线端点的直线(1e-6的精度)都可以自动找到交点不是线的端点的位置进行合并 ;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;;功能:返回两个对象的所有交点
;;参数: ent1、ent2 均为ename对象
(defun obj_int (ent1 ent2 / ax_ent_1 ax_ent_2 intpoints points i)
   (vl-load-com)
   (setq        ax_ent_1 (vlax-ename->vla-object ent1)
        ax_ent_2 (vlax-ename->vla-object ent2)
   )
   (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
   (setq intpoints (vlax-variant-value intpoints))
   (setq i 0)
   (if (> (vlax-safearray-get-u-bound intpoints 1) 0)
     (repeat (/ (+ 1
                  (- (vlax-safearray-get-u-bound intpoints 1)
                     (vlax-safearray-get-l-bound intpoints 1)
                  )
               )
               3
            )
       (setq points
             (append
               points
               (list (list
                       (vlax-safearray-get-element intpoints i)
                       (vlax-safearray-get-element intpoints (+ i 1))
                       (vlax-safearray-get-element intpoints (+ i 2))
                     )
               )
             )
       )
       (setq i (+ 3 i))
     )
   )
   points
)
;;;----通用函数-----
;;carrot1983  http://bbs.mjtd.com/forum.php?mod=viewthread&tid=64502
;;选择集->图元名表
(defun ss->elst        (ss / elst)
   (setq i 0)
   (repeat (sslength ss)
     (setq elst (cons (ssname ss i) elst)
          i    (1+ i)
     )
   )
   (reverse elst)
)
;;翻译了rosettacode的一段递归代码
;;若各位有兴致的话,也可以看看 Reini Urban(STDLIB作者)的函数
;;http://autocad.xarch.at/stdlib/COMBINATIONS.LSP
;;;from http://rosettacode.org/wiki/Combinations#Scheme
;;;translated into autolisp by qjchen
(defun combination (lst m)
   (cond        ((zerop m) '(()))
        ((null lst) '())
        (T
         (append (mapcar '(lambda (y) (cons (car lst) y))
                         (combination (cdr lst) (- m 1))
                 )
                 (combination (cdr lst) m)
         )
        )
   )
)
;;(combination '(5 1 2 3 4) 1)
(defun c:test1 ()
   (setq ss (ssget '((0 . "LINE"))))
   (if ss
     (progn
       ;;将选择集转化成对象名组成的表
       (setq ssnamelist (ss->elst ss))
       ;;将对象名表按2个一组进行组合
       (setq PXlist (combination ssnamelist 2))
       ;;求两个对象的交点点,不包括虚交点
       (setq JDlist
             (mapcar '(lambda (x)
                        (car x)
                      )
                     (vl-remove        nil
                                (mapcar        '(lambda (x)
                                           (obj_int (car x) (cadr x))
                                         )
                                        PXlist
                                )
                     )
             )
       )
       ;;线的起点10与终点11
       (setq 1011list (append (mapcar '(lambda (x)
                                        (cdr (assoc 10 (entget x)))
                                      )
                                     ssnamelist
                             )
                             (mapcar '(lambda (x)
                                        (cdr (assoc 11 (entget x)))
                                      )
                                     ssnamelist
                             )
                     )
       )
       (setq i 0)
       (repeat (length JDlist)
        (setq JDpt(nth i JDlist))
        (if (= (length
               (vl-remove
                 nil
                 (mapcar
                   '(lambda (x)
                      (equal JDpt x 1e-6)
                    )
                   1011list
                 )
               )
             )
             0
          )
          (setq pt0 JDpt)
          )
        (setq i (1+ i))
       )
       (if (null pt0)
        (setq pt0(getpoint "\n请输入基准交点:"))
       )          
       (setq i 0)
       (repeat (length ssnamelist)
        (setq ssname1 (nth i ssnamelist))
        (if
          (> (length
               (vl-remove
                 nil
                 (mapcar
                   '(lambda (x)
                      (equal (cdr (assoc 10 (entget ssname1))) x 1e-6)
                    )
                   JDlist
                 )
               )
             )
             0
          )
           (progn
             (setq endata (entget ssname1))
             (setq old10list (assoc 10 (entget ssname1)))
             (setq new10list (cons 10 pt0))
             (setq endata (subst new10list old10list endata))
             (entmod endata)
           )
        )
        (if
          (> (length
               (vl-remove
                 nil
                 (mapcar
                   '(lambda (x)
                      (equal (cdr (assoc 11 (entget ssname1))) x 1e-6)
                    )
                   JDlist
                 )
               )
             )
             0
          )
           (progn
             (setq endata (entget ssname1))
             (setq old11list (assoc 11 (entget ssname1)))
             (setq new11list (cons 11 pt0))
             (setq endata (subst new11list old11list endata))
             (entmod endata)
           )
        )
        (setq i (1+ i))
       )
       ;;end repeat
     )
     ;;end progn   
   )
   ;;end if
)
 楼主| 发表于 2012-9-19 17:42:32 | 显示全部楼层
真的谢谢你!
发表于 2012-9-19 17:43:18 | 显示全部楼层
寒风 发表于 2012-9-12 12:16
1.第一个功能是polyline的简化,搜索后我们发现weed.lsp(见附件)完全满足我们对于线的形态简化的需要(该 ...

如果能看得懂我写的第三个程序的话,第二个就很简单了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-20 07:12 , Processed in 0.199092 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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