明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1351|回复: 11

[提问] 大神们进来支支招啊

[复制链接]
发表于 2016-3-31 11:23:40 | 显示全部楼层 |阅读模式
本帖最后由 被承包的东子 于 2016-4-3 22:17 编辑

我想要改进的就是,
1,框选一次,就能把程序运行完成
2,(已用” fan_zh“大神的方法改进过,非常感谢)这段代码中的“repeat”部分,应该是太啰嗦了,想简化,也是不知道有什么合适的函数代替(从一组表中,选出所有群码为10的参数——四个点的坐标,我用的是重复比对筛选,很笨的方法)
  1. (defun c:t1()
  2.    (nl)
  3. (prompt "\n----------------框选线条---------------")
  4.    (setq ss1 (ssget))
  5.    (tst1)
  6.    (prompt "\n----------框选欲更新的洞口----------")
  7.    (setq ss (ssget))
  8.    (setq nq 0 k 0)
  9.    (setq mq (sslength ss))
  10.   (repeat mq
  11.   (Setq en (ssname ss nq))
  12.   (setq hole1_data(entget en))
  13.   (ts1)
  14.     (princ)
  15.     (command "pline" hd ha hb he hd hc hb "")
  16.    
  17.   (setq nq (+ 1 nq))
  18.   (setq k (+ 1 k))
  19.   )
  20. (command "erase" ss "")
  21.    (setvar "osmode" old)
  22.    ()
  23.    (print "程序运行结束,谢谢使用!")
  24.    )


  25. ;========================================计算"7"个关键点坐标========================================
  26. (defun TS1()
  27.   (setq old (getvar "osmode"))
  28.    (setvar "osmode" 0)
  29.       (setq pts nil)
  30.       (foreach pt hole1_data (if (= (car pt) 10) (setq pts (cons (cdr pt) pts))))
  31.       (setq ha (car pts))
  32.       (setq hb (cadr pts))
  33.       (setq hc (caddr pts))
  34.       (setq hd (cddr (cdr pts)))
  35.   


  36.   
  37. ;(落后的筛选方式!!!)
  38.   ;(setq l1 (length hole1_data))
  39.   ;(repeat l1 (if (= 10 (car (car hole1_data))) (setq ha (cdr (car hole1_data))) (setq hole1_data (cdr hole1_data))))
  40.   ;(setq hole2_data (cdr hole1_data))
  41.   ;(repeat l1 (if (= 10 (car (car hole2_data))) (setq hb (cdr (car hole2_data))) (setq hole2_data (cdr hole2_data))))
  42.   ;(setq hole3_data (cdr hole2_data))
  43.   ;(repeat l1 (if (= 10 (car (car hole3_data))) (setq hc (cdr (car hole3_data))) (setq hole3_data (cdr hole3_data))))
  44.   ;(setq hole4_data (cdr hole3_data))
  45.   ;(repeat l1 (if (= 10 (car (car hole4_data))) (setq hd (cdr (car hole4_data))) (setq hole4_data (cdr hole4_data))))
  46.   ;求四角点坐标z
  47.   ;(setq ha (cdr (nth 16 hole1_data)))
  48.   ;(setq hb (cdr (nth 21 hole1_data)))
  49.   ;(setq hc (cdr (nth 26 hole1_data)))
  50.   ;(setq hd (cdr (nth 31 hole1_data)))
  51.   ;算折点坐标
  52. ;(此段作废!!!)

  53.   (setq x1 (car ha))
  54.   (setq y1 (cadr ha))
  55.   (setq x2 (car hc))
  56.   (setq y2 (cadr hc))
  57.   (setq ah (min x1 x2))
  58.   (setq bh (max x1 x2))
  59.   (setq hh (min y1 y2))
  60.   (setq dh (max y1 y2))
  61.   (setq fh (* 0.3 (min (- bh ah) (- dh hh))))
  62.   (setq m (+ ah  fh))
  63.   (setq n (- dh fh))
  64.   (setq he (list m n))
  65.   (setq ha (list ah dh))
  66.   (setq hb (list bh dh))
  67.   (setq hc (list bh hh))
  68.   (setq hd (list ah hh))

  69.    (setvar "osmode" old)
  70. )

  71. ;=======================================设置“线段”变“多段线”======================================
  72. (defun tst1 ()
  73.   (command "_pedit" "m" ss1 "" "" "j" "" "")
  74.   (print "线段连成多段线设置成功!!!")
  75.   
  76. )

  77. ;========================================设置洞口“hole”图层========================================
  78. (defun nl ()  
  79. (setq chklay (tblsearch "layer" "HOLE"))
  80.   (if (= chklay nil)
  81.    (command "layer" "n" "hole" "c" "5" "hole" "m" "hole" "")
  82.     (command "layer" "m" "hole" "")
  83.   )
  84.   (print "图层设置成功!!!")
  85.   )

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2016-3-31 11:49:23 | 显示全部楼层
暖通的吗,我也是做暖通的
发表于 2016-3-31 13:30:37 | 显示全部楼层
     (setq el (entget (car (entsel))))
      (setq pts nil)
      (foreach pt el (if (= (car pt) 10) (setq pts (cons (cdr pt) pts))))
 楼主| 发表于 2016-4-1 08:23:35 | 显示全部楼层
dadiwusheng 发表于 2016-3-31 11:49
暖通的吗,我也是做暖通的

我是做结构的,这是帮建筑设计的程序
 楼主| 发表于 2016-4-1 08:24:10 | 显示全部楼层
fan_zh 发表于 2016-3-31 13:30
(setq el (entget (car (entsel))))
      (setq pts nil)
      (foreach pt el (if (= (car pt) 1 ...

谢谢 ,我拿去调试调试
发表于 2016-4-2 14:46:03 | 显示全部楼层
第一步直接到目的多好呀 中间那步是必须要的 还是 只是个过程
 楼主| 发表于 2016-4-2 15:36:13 | 显示全部楼层
本帖最后由 被承包的东子 于 2016-4-2 15:41 编辑
love1030312 发表于 2016-4-2 14:46
第一步直接到目的多好呀 中间那步是必须要的 还是 只是个过程
中间 那一步是为了让程序识别洞口的四个角点并获取其坐标,我不会其他的直接从散乱的线段中识别洞口角点坐标。

 楼主| 发表于 2016-4-2 15:39:39 | 显示全部楼层
被承包的东子 发表于 2016-4-2 15:36
什么意思啊

中间那步主要是为了把零散的线段连接在一起,这样再框选的时候,就能简单的识别出各个洞口的角点坐标。
因为我对lisp不熟悉,”对于散乱的多个线段,识别出是各个洞口的点坐标“,没有其他方法,只有通过这样转换的方式。。
 楼主| 发表于 2016-4-3 22:12:53 | 显示全部楼层
求大神们支支招啊,第二个循环部分的改进 我调试好了,第一个改进的地方,我还是想不到办法
发表于 2016-4-4 22:15:37 | 显示全部楼层
本帖最后由 tryhi 于 2016-4-5 22:20 编辑
  1. (defun c:tt (/ enla enlist lst old pllst ss ss2)
  2. (vl-Load-COM)
  3.         (setq ss(ssget '((0 . "LINE")))enla(entlast))
  4.   (command "_pedit" "m" ss "" "" "j" "" "")
  5.         (setq ss2(try-ssend enla)
  6.                 enlist(ss2EnList ss2)
  7.                 lst(mapcar 'getbox enlist)
  8.                 pllst (mapcar '_pt7 lst)
  9.                 old (getvar "osmode")
  10.         )
  11.         (setvar "osmode" 0)
  12.         (foreach n pllst (apply 'command (cons "pline" n)))
  13.         (setvar "osmode" old)
  14. )
  15. (defun _pt7 (ptlst / p2 p4 p6 pt4 x)
  16.         (setq pt4(try-pt2-to-pt4 (car ptlst)(cadr ptlst))
  17.                 x(* 0.25 (distance (setq p2(cadr pt4))(setq p4(cadddr pt4))))
  18.                 p6 (polar p2 (angle (cadr pt4)p4) x))
  19.         (append pt4 (list (car ptlst) p6 (cadr ptlst) ""))
  20. )
  21. (defun ss2EnList(ss / a en lst)
  22.         (setq a -1)
  23.         (while
  24.                 (setq en(ssname ss(setq a(1+ a))))
  25.                 (setq lst(cons en lst))
  26.         )
  27. )
  28. (defun getbox(e)
  29.         (vla-GetBoundingBox (vlax-ename->vla-object e) 'p1 'p2);取得包容图元的最大点和最小点
  30.         (list (vlax-safearray->list p1) (vlax-safearray->list p2))
  31. )
  32. (defun try-pt2-to-pt4 (pt1 pt2)
  33.         (list pt1 (list(car pt1)(cadr pt2))pt2(list (car pt2)(cadr pt1)))
  34. )
  35. (defun try-ssend(en / ss)
  36.         (setq ss (ssadd))
  37.         (while (setq en(entnext en))
  38.                 (setq ss(ssadd en ss))
  39.         )
  40.         ss
  41. )
完全按照楼主思路写的代码,另外提示一句,楼主开洞的位置是左上角的点往右下角偏0.3宽度,这样的不对的,当宽很大高很窄的时候就会出错,所以这里改了一下,改为开洞位置为左上至右下对角线的四分之一处
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 06:19 , Processed in 0.186331 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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