明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2167|回复: 10

请问,能不能实现以下功能。

[复制链接]
发表于 2004-1-5 11:45:00 | 显示全部楼层 |阅读模式


请问各位版主,有没有什么好的办法,可以实现在网格上自动判断网格间的距离,根据
不同的网格间的距离插入相应的块,网格不是规则的。块已经事先做好了。

谢谢各位。

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2004-1-5 16:32:00 | 显示全部楼层
各位高手只要给个思路就可以。
发表于 2004-1-5 16:54:00 | 显示全部楼层
你先试试,总觉得有些问题,可却无法改正
调试图,注意块的名字



  1. (defun Getinterpoints (ent1 ent2 / e1 e2 pt1 pt2 pt3 pt4)
  2.   (setq e1 (entget ent1))
  3.   (setq e2 (entget ent2))
  4.   (setq pt1 (cdr (assoc 10 e1)))
  5.   (setq pt2 (cdr (assoc 11 e1)))
  6.   (setq pt3 (cdr (assoc 10 e2)))
  7.   (setq pt4 (cdr (assoc 11 e2)))
  8.   (inters pt1 pt2 pt3 pt4)
  9. )

  10. (defun GetAllInters (ss / n i j ent1 ent2 points point)
  11.   (setq n (sslength ss))
  12.   (setq        i 0
  13.         j 0
  14.   )
  15.   (while (< i n)
  16.     (setq j (1+ i))
  17.     (setq ent1 (ssname ss i))
  18.     (while (< j n)
  19.       (setq ent2 (ssname ss j))
  20.       (if (setq point (getinterpoints ent1 ent2))
  21.         (setq points (append points (list point)))
  22.       )
  23.       (setq j (1+ j))
  24.     )
  25.     (setq i (1+ i))
  26.   )
  27.   points
  28. )

  29. (defun c:test (/ ss n i pts pt pt_next dist BlkName)
  30.   (setq os (getvar "osmode"))
  31.   (setq cmd (getvar "cmdecho"))
  32.   (setq ss (ssget '((0 . "LINE"))))
  33.   (command "_.undo" "be")
  34.   (setvar "osmode" 0)
  35.                                         ;(setvar "cmdecho" 0)
  36.   (setq pts (GetAllInters ss))
  37.   (setq pts (vl-sort pts '(lambda (e1 e2) (< (car e1) (car e2)))))
  38.   (setq pts (vl-sort pts '(lambda (e1 e2) (< (cadr e1) (cadr e2)))))
  39.   (setq n (length pts))
  40.   (setq i 0)

  41.   (while (< i (1- n))
  42.     (setq pt (nth i pts))
  43.     (setq pt_next (nth (1+ i) pts))
  44.     (if        (equal (cadr pt) (cadr pt_next))
  45.       (progn
  46.         (setq dist (distance pt pt_next))
  47.         (cond
  48.           ((equal dist 5 0.00000001) (setq BlkName "Len5"))
  49.           ((equal dist 11 0.00000001) (setq BlkName "Len11"))
  50.         )
  51.         (command "_.insert"
  52.                  BlkName
  53.                  (list (/ (+ (car pt) (car pt_next)) 2)
  54.                        (/ (+ (cadr pt) (cadr pt_next)) 2)
  55.                  )
  56.                  ""
  57.                  ""
  58.                  ""
  59.         )
  60.       )
  61.     )
  62.     (setq i (1+ i))
  63.   )
  64.   (setq pts (vl-sort pts '(lambda (e1 e2) (< (car e1) (car e2)))))
  65.   (setq i 0)
  66.   (while (< i (1- n))
  67.     (setq pt (nth i pts))
  68.     (setq pt_next (nth (1+ i) pts))
  69.     (if        (equal (car pt) (car pt_next))
  70.       (progn
  71.         (setq dist (distance pt pt_next))
  72.         (cond
  73.           ((equal dist 5) (setq BlkName "Len5"))
  74.           ((equal dist 11) (setq BlkName "Len11"))
  75.         )
  76.         (command "_.insert"
  77.                  BlkName
  78.                  (list (/ (+ (car pt) (car pt_next)) 2)
  79.                        (/ (+ (cadr pt) (cadr pt_next)) 2)
  80.                  )
  81.                  ""
  82.                  ""
  83.                  "90"
  84.         )
  85.       )
  86.     )
  87.     (setq i (1+ i))
  88.   )
  89.   (command "_.undo" "e")
  90.   (setvar "osmode" os)
  91.   (setvar "cmdecho" cmd)
  92.   (princ)
  93. )

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-1-5 17:02:00 | 显示全部楼层
多谢版主,我先试试。
 楼主| 发表于 2004-1-7 09:24:00 | 显示全部楼层

我昨天仔细研究了一下飞版主的程序。程序很不错,但好像还是有点问题。
这个程序难就难在怎样将很多的交点进行合理的排序, 飞版主的程序中
(setq pts (vl-sort pts '(lambda (e1 e2) (< (car e1) (car e2)))))
  (setq pts (vl-sort pts '(lambda (e1 e2) (< (cadr e1) (cadr e2)))))
是为了排序,但好像没有达到预期的效果。不知各位版主还有什么高招吗?
谢谢各位。

本帖子中包含更多资源

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

x
发表于 2004-1-7 09:40:00 | 显示全部楼层
我也搞不清楚这个排序为什么没有得到正确的结果,试了很长时间,总是有几个点排列错误。
不知是不是进入误区了,自己出不来了,谁有空可以看看
发表于 2004-1-7 20:15:00 | 显示全部楼层
两个排序不能连续用
一个排好后,在按照car相同的进行cadr排序,car不相同的不能放到一次排序的行列里面
 楼主| 发表于 2004-1-8 09:29:00 | 显示全部楼层
无痕游侠能不能说的详细一点?我看过飞版主的排序,先是按x的坐标排,小的排在前面,
在排y坐标,小的放在前面,没有发现什么错。请看下图



!pts的值,完全符合排列规律。但却达不到效果。
((0.0 0.0 0.0) (0.0 11.0 0.0) (0.0 22.0 0.0) (11.0 0.0 0.0) (11.0
11.0 0.0) (11.0 22.0 0.0) (16.0 0.0 0.0) (16.0 11.0 0.0) (22.0 11.0 0.0) (22.0
22.0 0.0) (27.0 0.0 0.0) (27.0 11.0 0.0) (33.0 11.0 0.0) (33.0 22.0 0.0) (38.0
0.0 0.0) (38.0 11.0 0.0) (44.0 11.0 0.0) (44.0 22.0 0.0) (49.0 0.0 0.0) (49.0
11.0 0.0))

本帖子中包含更多资源

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

x
发表于 2004-1-8 10:35:00 | 显示全部楼层
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=2521
发表于 2004-1-8 21:14:00 | 显示全部楼层
问题解决了,主要是CAD处理数据精度问题。比如两个X坐标相同的点,经过它提取和计算后,他们的坐标会有一些差异,当然这个差异是很小的,基本上不影响我们的使用。但在排序时,我们认为这两个坐标的X值相同,不要重新排列了,但CAD却应该有这么一点差异,比较它们的大小,重新排列了顺序。
所以我做了一个有精度控制的大于和小于的函数,就是小于时,要小到某一精度才算比它小,否则,还算等于。。。

to 无痕,你的说法我有些不赞同。。。

程序如下:


  1. (defun Wl-equal(Val1 Val2 fun fuzz)
  2.   (cond
  3.     ((= fun "=") (equal Val1 Val2 fuzz) t)
  4.     ((= fun "<") (cond
  5.                    ((equal Val1 Val2 fuzz) nil)
  6.                    ((< Val1 Val2) t)))
  7.     ((= fun ">" (cond
  8.                   ((equal Val1 Val2 fuzz) nil)
  9.                   ((> Val1 Val2) t))))
  10.   )
  11. )

  12. (defun Getinterpoints (ent1 ent2 / e1 e2 pt1 pt2 pt3 pt4)
  13.   (setq e1 (entget ent1))
  14.   (setq e2 (entget ent2))
  15.   (setq pt1 (cdr (assoc 10 e1)))
  16.   (setq pt2 (cdr (assoc 11 e1)))
  17.   (setq pt3 (cdr (assoc 10 e2)))
  18.   (setq pt4 (cdr (assoc 11 e2)))
  19.   (inters pt1 pt2 pt3 pt4)
  20. )

  21. (defun GetAllInters (ss / n i j ent1 ent2 points point)
  22.   (setq n (sslength ss))
  23.   (setq        i 0
  24.         j 0
  25.   )
  26.   (while (< i n)
  27.     (setq j (1+ i))
  28.     (setq ent1 (ssname ss i))
  29.     (while (< j n)
  30.       (setq ent2 (ssname ss j))
  31.       (if (setq point (getinterpoints ent1 ent2))
  32.         (setq points (append points (list point)))
  33.       )
  34.       (setq j (1+ j))
  35.     )
  36.     (setq i (1+ i))
  37.   )
  38.   points
  39. )

  40. (defun c:test (/ ss n i pts pt pt_next dist BlkName)
  41.   (setq os (getvar "osmode"))
  42.   (setq cmd (getvar "cmdecho"))
  43.   (setq ss (ssget '((0 . "LINE"))))
  44.   (command "_.undo" "be")
  45.   (setvar "osmode" 0)
  46.   (setvar "cmdecho" 0)
  47.   (setq pts (GetAllInters ss))
  48.   (setq pts (vl-sort pts '(lambda (e1 e2) (wl-equal (car e1) (car e2) "<" 0.00001))))
  49.   (setq pts (vl-sort pts '(lambda (e1 e2) (wl-equal (cadr e1) (cadr e2) "<" 0.00001))))
  50.   
  51.   (princ "\n")  
  52.   (princ pts)
  53.   
  54.   (setq n (length pts))
  55.   (setq i 0)
  56.   (while (< i (1- n))
  57.     (setq pt (nth i pts))
  58.     (setq pt_next (nth (1+ i) pts))
  59.     (if        (equal (cadr pt) (cadr pt_next) 0.000000001)
  60.       (progn
  61.         (setq dist (distance pt pt_next))
  62.         (cond
  63.           ((equal dist 5 0.00000001) (setq BlkName "Len5"))
  64.           ((equal dist 11 0.00000001) (setq BlkName "Len11"))
  65.           (t (setq BlkName nil))
  66.         )
  67.         (if BlkName
  68.           (command "_.insert"
  69.                  BlkName
  70.                  (list (/ (+ (car pt) (car pt_next)) 2)
  71.                        (/ (+ (cadr pt) (cadr pt_next)) 2)
  72.                  )
  73.                  ""
  74.                  ""
  75.                  ""
  76.         )
  77.         )
  78.       )
  79.     )
  80.     (setq i (1+ i))
  81.   )  
  82.   (setq pts (vl-sort pts '(lambda (e1 e2) (wl-equal (car e1) (car e2) "<" 0.00001))))
  83.   
  84.   (princ "\n")  
  85.   (princ pts)
  86.   
  87.   (setq i 0)
  88.   (while (< i (1- n))
  89.     (setq pt (nth i pts))
  90.     (setq pt_next (nth (1+ i) pts))
  91.     (if        (equal (car pt) (car pt_next) 0.000000001)
  92.       (progn
  93.         (setq dist (distance pt pt_next))
  94.         (cond
  95.           ((equal dist 5 0.000000001) (setq BlkName "Len5"))
  96.           ((equal dist 11 0.0000000001) (setq BlkName "Len11"))
  97.           (t (setq BlkName nil))
  98.         )
  99.         (if BlkName
  100.           (command "_.insert"
  101.                  BlkName
  102.                  (list (/ (+ (car pt) (car pt_next)) 2)
  103.                        (/ (+ (cadr pt) (cadr pt_next)) 2)
  104.                  )
  105.                  ""
  106.                  ""
  107.                  "90"
  108.         )
  109.         )
  110.       )
  111.     )
  112.     (setq i (1+ i))
  113.   )
  114.   (command "_.undo" "e")
  115.   (setvar "osmode" os)
  116.   (setvar "cmdecho" cmd)
  117.   (princ)
  118. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-2 03:32 , Processed in 0.186455 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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