明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3900|回复: 8

很是纠结的一个问题,请路过的高手帮忙看看!

[复制链接]
发表于 2011-12-8 21:20:13 | 显示全部楼层 |阅读模式
       自己搞得“BREAK”程序,经过仔细观察,发现线和圆的交点总是差那么一点点,用DI量了一下,基本是0.005这个级别,但就是无法得到重合点,线和线之间没问题,对程序调试发现到“intersectwith"求出交点这一步就已经差了那么一点点了,因此怀疑是不是“intersectwith"的BUG?对一些高手的BREAK程序进行了测试,同样发现这个问题,如著名的BREAKALL。。。
如下图所示:


本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2011-12-8 21:36:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| 发表于 2011-12-8 21:46:05 | 显示全部楼层
1548845899 发表于 2011-12-8 21:36
不会,这是显示精度问题

将圆弧平弧度调整到20000,多段线线段数调整到32767,测量小数点调到最多位,再次测量为0.000013左右,请问一下1548845899,显示精度问题如何解决?
发表于 2011-12-8 21:54:34 | 显示全部楼层
本帖最后由 Andyhon 于 2011-12-8 21:56 编辑

LUPREC System Variable

Type: Integer
Saved in: Drawing
Initial value: 4


...圆弧平弧度...
参考 ===> WhipARC

评分

参与人数 1明经币 +1 收起 理由
yjr111 + 1 谢谢关注!

查看全部评分

 楼主| 发表于 2011-12-8 22:17:04 | 显示全部楼层
Andyhon 发表于 2011-12-8 21:54
LUPREC System Variable

Type: Integer

一、LUPREC 设置为4,的确可以让数据显示为0.000,但我将LUPREC 设置为8,数据还是会显示为0.000013,交点也不会重合。。。
二、圆弧平弧度我前面已经设置过了,没用!
请继续赐教!
发表于 2011-12-8 22:20:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-12-8 22:21:36 | 显示全部楼层
能上传该图纸作为验证之用吗?
 楼主| 发表于 2011-12-8 22:37:08 | 显示全部楼层
本帖最后由 yjr111 于 2011-12-8 22:38 编辑
Andyhon 发表于 2011-12-8 22:21
能上传该图纸作为验证之用吗?

实在对不起,我的网速也很纠结,所以反应可能会慢一点。。。
上传测试图纸和本人自己写的break程序(真不敢拿出来见人)。。。

  1. ;;;;;;;;;;;;;;;;;;与线相交交点打断;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;;;;;;;;;;;;;;;;;BY YJR111 2011-11-24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;;;;;;;;;;;;;;;;;;适用于所有曲线;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4. (defun c:brs (/                n          e            ee              s
  5.               lst_e        vla_x          vla_y            point     vla_point
  6.               p_lst        point1          dxf10_line              dxf11_line
  7.               ee_new        ee_last          ss   ss_1    ss_2   lst_newpoint
  8.               entname   vla_entname
  9.              )
  10.   (command "_.undo" "be")
  11.   (setq oldosmode (getvar "osmode"))
  12.   (setq oldorthomode (getvar "orthomode"))
  13.   (setvar "osmode" 0)
  14.   (setvar "cmdecho" 0)
  15.   (setvar "orthomode" 0)
  16.   (setq n 0)
  17.   (setq sss (ssadd))
  18.   (setq ee (car (entsel "\n选择一条曲线:")))
  19.   (redraw ee 3)
  20.   (ssadd ee sss)
  21.   (setq vla_ee (vlax-ename->vla-object ee))
  22.   (vla-getboundingbox vla_ee 'minpoint 'maxpoint)
  23.   (setq        minpoint (vlax-safearray->list minpoint)
  24.         maxpoint (vlax-safearray->list maxpoint)
  25.   )
  26.   (INITGET 128 "S O")
  27.   (SETQ        KEY
  28.          (GETKWORD
  29.            "\n 所选曲线自身在交点被打断凡或与所选曲线相交的曲线被打断(S)[右键确认(S)/自身打断(O)]"
  30.          ) ;_ 结束GETKWORD
  31.   ) ;_ 结束SETQ
  32.   (if (not KEY)
  33.     (setq key "S")
  34.   ) ;_ 结束if
  35.   (setq        ss (ssget "c" minpoint maxpoint)
  36.         n  0
  37.   ) ;_ 结束setq
  38. (setq        ss (ssget "p"
  39.                   '((-4 . "")(-4 . "")
  40.                     (-4 . "")
  41.                     (-4 . "")
  42.                     (-4 . "")
  43.                     (-4 . "")(-4 . "and>")
  44.                    )
  45.            )
  46.   )
  47.   (while (< n (sslength ss))
  48.     (setq e        (ssname ss n)
  49.           s        (entget e)
  50.           lst_e        (append lst_e (list e))
  51.           n        (1+ n)
  52.     ) ;_ 结束setq
  53. ;_ 结束setq
  54.   ) ;_ 结束while
  55.   (setq        n 0
  56.         i 0
  57.   ) ;_ 结束setq
  58.   (foreach y lst_e
  59.     (setq vla_y (vlax-ename->vla-object y))
  60.     (if        (and (not (equal vla_ee vla_y))
  61.              (/= (safearray-value
  62.                    (vlax-variant-value
  63.                      (setq vla_point (vlax-invoke-method
  64.                                        vla_ee
  65.                                        'IntersectWith
  66.                                        vla_y
  67.                                        acExtendNone
  68.                                      ) ;_ 结束vlax-invoke-method
  69.                      ) ;_ 结束setq
  70.                    ) ;_ 结束vlax-variant-value
  71.                  ) ;_ 结束safearray-value
  72.                  nil
  73.              ) ;_ 结束/=
  74.         ) ;_ 结束and
  75.       (progn
  76.         (setq
  77.           point        (vlax-safearray->list (vlax-variant-value vla_point))
  78.         ) ;_ 结束setq
  79.         (if (> (length point) 3)
  80.           (progn
  81.             (lst->3p point)
  82.             (setq p_lst lst_newpoint)
  83.             (if        (= key "S")
  84.               (progn
  85.               (setq ssss (ssadd))
  86.               (ssadd y ssss)
  87.               (sssbreak y ss ssss p_lst)
  88.               (if(or(=(vla-get-objectname vla_y)"AcDbCircle")(=(vla-get-objectname vla_y)"AcDbEllipse"))
  89.                   (alert (strcat "\n不能单点打断闭合曲线!""\n\n"
  90.                    "\n共打断 0 个交点!"
  91.                      )
  92.                     ) ;_ 结束if
  93.           ) ;_ 结束progn
  94.           )
  95.               )
  96.             )
  97.           (progn
  98.             (setq point        (vlax-safearray->list
  99.                           (vlax-variant-value vla_point)
  100.                         ) ;_ 结束vlax-safearray->list
  101.             ) ;_ 结束vlax-safearray->list

  102.             (if
  103.               (not
  104.                 (or (equal (vlax-curve-getstartpoint vla_y) point 1e-4)
  105.                     (equal (vlax-curve-getendpoint vla_y) point 1e-4)
  106.                 )
  107.               ) ;_ 结束not
  108.                (setq p_lst (cons point p_lst))
  109.             ) ;_ 结束setq
  110.             (if        (= key "S")
  111.               (command "_.break" (list y point) "_non" (trans point 0 1) "_non" (trans point 0 1))
  112.             ) ;_ 结束if
  113.           ) ;_ 结束progn
  114.         ) ;_ 结束if
  115.       ) ;_ 结束progn
  116.     ) ;_ 结束if
  117.     (redraw y 4)
  118.   ) ;_ 结束foreach
  119.   (if (= key "O")
  120.     (sssbreak ee ss sss p_lst)
  121.   ) ;_ 结束if
  122.   (if (and(or(=(vla-get-objectname vla_ee)"AcDbCircle")(=(vla-get-objectname vla_ee)"AcDbEllipse"))
  123.              (= key "O"))
  124.          (alert (strcat "\n不能单点打断闭合曲线!""\n\n"
  125.                    "\n共打断 0 个交点!"
  126.            ))
  127.    
  128.    (if(not(and (= key "S") (vlax-curve-isClosed vla_Y)))
  129.    (princ (strcat "\n共打断<" (itoa (length p_lst)) " >个交点!")))
  130.   )
  131.   (command "_.undo" "end")
  132.   (setvar "osmode" oldosmode)
  133.   (setvar "orthomode" oldorthomode)
  134.   (princ)
  135. ) ;_ 结束defun
  136. ;;;;;;;;将点表3个一组重新组表,用于处理多段线;;;;;;;;;;;;;;;;;;;;;
  137. (defun lst->3p (lst / n lst_new1)
  138.   (setq n 0)
  139.   (mapcar
  140.     (function
  141.       (lambda (x)
  142.         (setq lst_new1 (append lst_new1 (list x)))
  143.         (if (= (rem (1+ n) 3) 0)
  144.           (progn
  145.             (setq lst_newpoint (append (list lst_new1) lst_newpoint))
  146.             (setq lst_new1 nil)
  147.           )
  148.         )
  149.         (setq n (1+ n))
  150.       )
  151.     )
  152.     lst
  153.   )

  154. )
  155.   

  156. ;;;;;;;;;;;;;;;;;重新构造选择集进行交点打断;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  157. (defun sssbreak        (entname ss_1 ss_2 p_lst / i n)
  158.   (foreach x p_lst
  159.     (setq i 0)
  160.     (if        (> (sslength ss_2) 0)
  161.       (while (< i (sslength ss_2))
  162.         (setq entname (ssname ss_2 i))
  163.         (setq vla_entname (vlax-ename->vla-object entname))
  164.         (if (equal (vlax-curve-getClosestPointTo vla_entname x) x 1e-4)
  165.           (command "_.break" (list entname x) "_non" (trans x 0 1) "_non" (trans x 0 1))
  166.           ;(command "_.break" (list entname x)"_non" x "_non" x)
  167.         )
  168.         (setq i (1+ i))
  169.       ) ;_ 结束while
  170.     ) ;_ 结束if
  171.     (setq ss_2 (ssget "c" minpoint maxpoint))
  172.     (setq ss_2 (ssget "p"
  173.                   '((-4 . "")(-4 . "")
  174.                     (-4 . "")
  175.                     (-4 . "")
  176.                     (-4 . "")
  177.                     (-4 . "")(-4 . "and>")
  178.                    )
  179.            )
  180.   )
  181.     (command "_.select" SS_1 ss_2 "")
  182.     (setq ss_2 (ssget "P"))
  183.     (ssdel entname SS_1)
  184.     (setq n 0)
  185.     (repeat (sslength SS_1)
  186.       (setq i 0)
  187.       (while (< i (sslength ss_2))
  188.         (if (equal (ssname SS_1 n) (ssname ss_2 i))
  189.           (progn
  190.             (ssdel (ssname ss_2 i) ss_2)
  191.             (setq i (sslength ss_2))
  192.           ) ;_ 结束progn
  193.         ) ;_ 结束if
  194.         (setq i (1+ i))
  195.       ) ;_ 结束while
  196.       (setq n (1+ n))
  197.     ) ;_ 结束repeat
  198.   )
  199. )


本帖子中包含更多资源

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

x
发表于 2011-12-8 22:48:05 | 显示全部楼层
Command: (rtos (cdr (assoc 40 (entget ee))) 2 16)
"1.547820147438836"    <== 这是半径值

距离 :1.547820147438854   <== 这是断点至圆心的距离值
(-1.378832381450592 -0.7032556239952328 0.000000000000000)

点评

也就是断点不在交点位置,不知你是否有BREAKALL的程序,可以测试一下他里面的BREAKOBJECT的命令,同样是这种情况。。。  发表于 2011-12-8 23:00
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-23 12:16 , Processed in 0.207349 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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