明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 半听可乐

[已解答] 简单操作不堪重负,深夜求急诊!!--平行图块自动连线

[复制链接]
 楼主| 发表于 2014-6-6 08:41 | 显示全部楼层
longcashman 发表于 2014-6-5 23:37
来看看我榨出来的脑汁
老顾的排序太高大上了,看不懂。
突然想到直接画构造线然后打断的法子,

朋友,为了帮这个忙,花了那么多功夫,真是过意不去,在此对你的辛勤付出感激不尽!但是经过使用,发现连的线是一段一段的,还有就是并没有完全连上(都是一条线上的,只连了一部分),G版和院长的感觉是要快些,能否将他们的完善一下?不懂lisp ,实在是惭愧~~

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2014-6-6 13:14 | 显示全部楼层
我理解错了,我是特意断成1段1段的,慢就慢在这了。
我开始画构造线的版本应该可以用
我找找再发出来
版主那个需要坐标转换的目前我的能力达不到
院长那个闭源苹果公司的范儿也学不来
回复

使用道具 举报

发表于 2014-6-6 16:35 | 显示全部楼层
本帖最后由 longcashman 于 2014-6-6 16:36 编辑

  1. (defun GetMinExtents (plist /)
  2.   (list
  3.     (apply 'mapcar (cons 'min plist))
  4.     (apply 'mapcar (cons 'min plist))
  5.   )
  6. )
  7. (defun GetMaxExtents (plist /)
  8.   (list
  9.     (apply 'mapcar (cons 'max plist))
  10.     (apply 'mapcar (cons 'max plist))
  11.   )
  12. )
  13. ;;;判断平面上的三点是否共线By highflybir               ;
  14. ;;;----------------------------------------------------;
  15. ;;;功能: 判断平面上的三点是否共线                      ;
  16. ;;;输入: 三点 P1,P2,P3                                 ;
  17. ;;;输出: T 说明三点共线,否则不共线                    ;
  18. ;;;----------------------------------------------------;
  19. (defun ptAtLine?  (p1 p2 p3 / a b c eps)
  20.   (setq eps 1e-6)
  21.   (setq a (distance p2 p3))
  22.   (setq b (distance p3 p1))
  23.   (setq c (distance p1 p2))
  24.   (or (equal (+ a b) c eps)
  25.       (equal (+ b c) a eps)
  26.       (equal (+ c a) b eps)
  27.       )
  28.   )
  29. ;;; 旋转一个向量或者点90度By highflybird               ;
  30. (defun MAT:Rot90  (vec)
  31.   (vl-list* (- (cadr vec)) (car vec) (cddr vec))
  32.   )
  33. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  34. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  35. ;;[功能] 选择集->图元列表 By caiqs          ;
  36. (defun ss->lst        (ss / retu)
  37.   (setq retu (apply 'append (ssnamex ss)))
  38.   (setq retu (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) retu))
  39.   )

  40. ;;示例 (MJ:Massoc 10 (entget (car (entsel))))
  41. ;; Notes:特别适合多段线各顶点;作者不详      
  42. (defun MJ:Massoc  (key alist)
  43.   (apply
  44.     'append
  45.     (mapcar '(lambda (x)
  46.                (if (eq (car x) key)
  47.                  (list (cdr x))
  48.                  )
  49.                )
  50.             alist
  51.             )
  52.     )
  53.   )


  54. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  55. (defun makeDirPts (ptlst dir / aline ent p1 p2 sumaline)

  56.   (while ptlst
  57.     (setq aline nil)
  58.     (setq p1 (car ptlst))
  59.     (setq p2 (mapcar '+ p1 dir))
  60.     (setq aline (cons p1 aline))
  61.     (setq ptlst (cdr ptlst))
  62.     (foreach pt        ptlst
  63.       (if (ptAtLine? pt p1 p2)
  64.         (progn
  65.           (setq aline (cons pt aline))
  66.           (setq ptlst (vl-remove-if '(lambda (x) (equal pt x)) ptlst))
  67.         )
  68.       )
  69.     )
  70.     (setq sumaline (cons aline sumaline))
  71.   )
  72.   sumaline
  73. )

  74. (defun toDraw (psatline / ootst maxd distop1 index endptlst endpts)
  75.   
  76.   (foreach ps psatline
  77.         (setq ootst
  78.            (mapcar '(lambda (p)
  79.                       (setq
  80.                         distop1        (mapcar '(lambda (pt) (distance pt p)) ps)
  81.                       )
  82.                       (setq maxd (apply 'max distop1))
  83.                       (cons maxd (vl-position maxd distop1))
  84.                     )
  85.                    ps
  86.            )
  87.     )
  88.     (setq index (apply 'max (mapcar 'car ootst)))
  89.     (setq endpts nil)
  90.     (foreach item ootst
  91.       (if (setq it (assoc index (list item)))
  92.         (setq endpts (cons (nth (cdr it) ps) endpts))
  93.       )
  94.     )
  95.     (setq endptlst (cons endpts endptlst))
  96.   )
  97.   (foreach item        endptlst
  98.     (vl-cmdf "_.line" (car item) (cadr item) "")
  99.   )
  100. )

  101. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  102. ;;;主函数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  103. (defun assistLine  (/ dir1 dir2 ss enlst ptlst dirlinent)
  104.   (if  blkName
  105.     (setq blkName "j_pt1")
  106.     (setq blkName (cdr (assoc 2 (entget (car (entsel "\n 选择样例喷头"))))))
  107.             )
  108.   (setvar "osmode" 4)
  109.   (setq dirlinent (entget(car(entsel"\n 选择方向线"))))
  110.   (setq        dir1 (mapcar '-
  111.                      (cdr (assoc 10 dirlinent))
  112.                      (cdr (assoc 11 dirlinent))
  113.                      )
  114.         )
  115.   (setq dir2 (MAT:Rot90 dir1))
  116.   (setvar "osmode" 0)
  117.   (princ "\n 框选喷头范围")

  118.   (setq ss (ssget (list '(0 . "INSERT") (cons 2 blkName))))
  119.   (setq enlst (ss->lst ss))
  120.   (setq
  121.     ptlst (mapcar '(lambda (en) (car (MJ:Massoc 10 (entget en))))
  122.                   enlst
  123.                   )
  124.     )                                
  125. (toDraw (makeDirPts ptlst dir1))
  126.   (toDraw (makeDirPts ptlst dir2))
  127.   )
  128. (defun c:bb  (/ oldOs oldClayer)
  129.   (setq oldOs (getvar "osmode"))
  130.   (setq oldClayer (getvar "clayer"))
  131.   (setvar "clayer" "SZ_FINE")
  132.   (assistLine)
  133.   (setvar "osmode" oldOs)
  134.   (setvar "clayer" oldClayer)
  135.   (princ)
  136.   )









回复

使用道具 举报

发表于 2014-6-6 17:14 | 显示全部楼层
本帖最后由 gzxl 于 2014-6-6 17:22 编辑

其实大大们已经给出了源码了,我试着按院长和G版的提供的写了下
好像是这样
(defun c:tt ( / a ge i len lst1 lst2 pl pt s1 s2 s3 ss)
  (setq i -1)
  (if (setq ss (ssget '((0 . "insert") (2 . "j_pt1") (8 . "SZ-喷头设备"))))
    (progn
      (setq len (sslength ss) pl nil)
      (repeat len
         (setq ge (ssname ss (setq i (1+ i))))
         (setq pt (cdr (assoc 10 (entget ge))))
         (setq pl (cons pt pl))
      )
      (setq lst1 (sortPtsX pl 0.001)
            lst2 (sortPtsY pl 0.001)
      )
      (if (null (tblsearch "layer" "SZ_FINE")) (EntmakeLayer 1 "SZ_FINE"))
      (setvar "clayer" "SZ_FINE")
      (foreach a lst1
        (setq s1 (car a) s2 (last a))
        (EntmakeLine s1 s2)
      )
      (foreach a lst2
        (setq s1 (car a)
              s2 (last a)
        )
        (EntmakeLine s1 s2)
      )
      (setvar "clayer" "0")
    )
  )
  (princ)
)
(defun EntmakeLayer (c n)
  (entmake
    (list
      '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord")
      '(70 . 0) '(6 . "Continuous") (cons 62 c) (cons 2 n)
    )
  )
)
(defun sortPtsX (pts tol / LST L)
  (setq pts
    (vl-sort
      pts
     '(lambda (a b)
        (if (equal (cadr a) (cadr b) tol)
          (< (car a) (car b))   ;_ X方向从小到大排序
          (< (cadr a) (cadr b)) ;_ Y方向从小到大
        )
      )
    )
  )
  ;;对pts进行分组
  (setq  lst nil
         L   (list (car pts))
         pts (cdr pts)
  )
  (while pts
    (if (equal (cadar pts) (cadar L) tol)
      (setq L   (cons (car pts) L)
            pts (cdr pts)
      )
      (setq lst (cons L lst)
            L   (list (car pts))
            pts (cdr pts)
      )
    )
  )
  (setq lst (cons L lst))
)
(defun sortPtsY (pts tol / LST L)
  (setq pts
    (vl-sort
      pts
     '(lambda (a b)
        (if (equal (car a) (car b) tol)
          (< (cadr a) (cadr b))
          (> (car a) (car b))
        )
      )
    )
  )
  (setq  lst nil
         L   (list (car pts))
         pts (cdr pts)
  )
  (while pts
    (if (equal (caar pts) (caar L) tol)
      (setq L   (cons (car pts) L)
            pts (cdr pts)
      )
      (setq lst (cons L lst)
            L   (list (car pts))
            pts (cdr pts)
      )
    )
  )
  (setq lst (cons L lst))
)
(defun EntmakeLine (pt1 pt2)
  (entmake (list '(0 . "LINE") (cons 10 pt1) (cons 11 pt2)))
)
回复

使用道具 举报

 楼主| 发表于 2014-6-6 20:20 | 显示全部楼层
gzxl 发表于 2014-6-6 17:14
其实大大们已经给出了源码了,我试着按院长和G版的提供的写了下
好像是这样
(defun c:tt ( / a ge i len  ...

朋友,感谢你的帮助,但是这个生成的有重复线段
回复

使用道具 举报

 楼主| 发表于 2014-6-6 20:22 | 显示全部楼层
longcashman 发表于 2014-6-6 16:35

BB
选择样例喷头
选择方向线error: 参数类型错误: numberp: nil

朋友,感谢关注,还是有点小问题哦
回复

使用道具 举报

发表于 2014-6-6 21:15 | 显示全部楼层

把这个函数替换一下

半听可乐 发表于 2014-6-6 20:22
BB
选择样例喷头
选择方向线error: 参数类型错误: numberp: nil

(defun assistLine  (/ dir1 dir2 ss enlst ptlst dirlinent)
   (if (not (setq en (car (entsel "\n 选择样例喷头"))))
    (setq blkName "j_pt1");
    (setq blkName (cdr (assoc 2 (entget en))))
  )
  (setvar "osmode" 4)
  (setq dirlinent (entget(car(entsel"\n 选择方向线"))))
  (setq        dir1 (mapcar '-
                     (cdr (assoc 10 dirlinent))
                     (cdr (assoc 11 dirlinent))
                     )
        )
  (setq dir2 (MAT:Rot90 dir1))
  (setvar "osmode" 0)
  (princ "\n 框选喷头范围")

  (setq ss (ssget (list '(0 . "INSERT") (cons 2 blkName))))
  (setq enlst (ss->lst ss))
  (setq
    ptlst (mapcar '(lambda (en) (car (MJ:Massoc 10 (entget en))))
                  enlst
                  )
    )                               
(toDraw (makeDirPts ptlst dir1))
  (toDraw (makeDirPts ptlst dir2))
  )
回复

使用道具 举报

 楼主| 发表于 2014-6-7 09:54 | 显示全部楼层
longcashman 发表于 2014-5-17 01:50
我刚看到你图纸上还有一个不输入方向的要求;替换下面的函数大概可以满足要求
其实是个偷懒的办法,高飞鸟 ...

非常感谢朋友的热心相助,现在的程序终于能完美满足我的要求了!在此一并感谢G版、院长、gzxl 的鼎立相助,感谢你们!
回复

使用道具 举报

发表于 2014-6-17 13:21 | 显示全部楼层
如果两个方向的线分图层就好了。有谁能改?
回复

使用道具 举报

发表于 2014-9-4 01:12 | 显示全部楼层
看下。。学习中。。。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 00:16 , Processed in 4.043524 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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