乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 65|回复: 5

[编程交流] 实数浮点精度

[复制链接]

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 09:58:19 | 显示全部楼层 |阅读模式
我对lisp如何处理点的浮点精度感到困惑。
 
我正在尝试使用IntersectWith方法,并得到了一些奇怪的结果。我已经确定这是点精度的结果。
 
我有以下内容:
 
  1. (setq pointlist  (vlax-safearray->list (vlax-variant-value (vlax-invoke-method line-obj 'IntersectWith polyline-obj acExtendNone))))

 
返回:(476472.0 215324.0 0.0)
 
好啊所以它并没有显示所有的小数位。没什么大不了的,对吧?
 
接下来我使用:
 
  1. (setq x (nth 0 poinlist))

 
然后我检查x,得到476472.0
 
一定有什么我遗漏或不理解的。任何帮助都将不胜感激!我期待着476472.96706517或类似的东西。
 
当做
 
Hippe013
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:16:32 | 显示全部楼层
作为一种快速方法,您可以通过使用未记录的vlax调用函数来避免该变体,因此:
 
要显示更多位置,可能需要使用RTO:
 
  1. (rtos (car lst) 2 15)
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 10:26:04 | 显示全部楼层
嘿,李,谢谢你提醒我以下代码:
 
  1. (setq lst (vlax-invoke line-obj 'IntersectWith polyline acExtendNone))

 
变异有时会令人头痛。
 
事实证明,我的问题只是一个小的打字错误。
 
我想与大家分享我的工作,但请记住,我仍处于调试阶段,还需要添加错误陷阱,使其具有虚拟证明。
以下代码将三维多段线覆盖在沿给定直线的一系列高架多段线(等高线)上。它对多段线进行了采样。请随时告诉我你的想法。
 
  1. ;Drapes a 3dpolyline over polylines along a selected line.
  2. (vl-load-com)
  3. (defun c:sample-pl ( / li *ModSpc *ActDoc *Acad lobj p1 p2 ss sslen i plobj pnts n li pntli finli var)
  4. (setq li nil)
  5. (setq *ModSpc (vlax-get-property (setq *ActDoc (vlax-get-property (setq *acad (vlax-get-acad-object)) 'ActiveDocument)) 'ModelSpace))
  6. (setq lobj (vlax-ename->vla-object (car (entsel "\nSelect Line Object: "))))
  7. (setq p1 (vlax-safearray->list (vlax-variant-value (vlax-get-property lobj 'StartPoint))))
  8. (setq p2 (vlax-safearray->list (vlax-variant-value (vlax-get-property lobj 'EndPoint))))
  9. (setq ss (ssget "f" (list p1 p2) '(( 0 . "LWPOLYLINE"))))
  10. (setq sslen (sslength ss))
  11. (setq i 0)
  12. (repeat sslen
  13.    (setq plobj (vlax-ename->vla-object (ssname ss i)))
  14.    (setq el (vlax-get-property plobj 'Elevation))
  15.    (vlax-put-property plobj 'Elevation 0)
  16.    (setq pnts (vlax-invoke lobj 'IntersectWith plobj acExtendNone))
  17.    (vlax-put-property plobj 'Elevation el)
  18.    (vlax-release-object plobj)
  19.    (setq n 0)
  20.    (repeat (/ (length pnts) 3)
  21.      (setq li (append li (list (nth (+ n 0) pnts))))
  22.      (setq li (append li (list (nth (+ n 1) pnts))))
  23.      (setq li (append li (list el)))
  24.      (drxc (list (nth (+ n 0) pnts) (nth (+ n 1) pnts) el) 2)
  25.      (setq n (+ n 3))
  26.      )
  27.    (setq i (1+ i))
  28.    )
  29. (setq n 0)
  30. (setq pntli nil)
  31. (repeat (/ (length li) 3)
  32.    (setq pntli (append pntli (list (cons (distance (list (nth (+ n 0) li) (nth (+ n 1) li)) (list (nth 0 p1) (nth 1 p1))) (list (list (nth (+ n 0) li) (nth (+ n 1) li)(nth (+ n 2) li)))))))
  33.    (setq n (+ n 3))
  34.    )
  35. (setq pntli (vl-sort pntli (function (lambda (d1 d2) (< (car d1) (car d2))))))
  36. (setq n 0)
  37. (setq finli nil)
  38. (repeat (length pntli)
  39.    (setq finli (append finli (cadr (nth n pntli))))
  40.    (setq n (1+ n))
  41. )
  42. (setq var (pl->var finli))
  43. (setq 3dobj2 (vlax-invoke-method *ModSpc 'Add3DPoly var))
  44. (vlax-put-property 3dobj2 'Color 1)
  45. (vlax-release-object 3dobj2)
  46. )
  47. ;Given Pointlist returns pointlist in variant form
  48. (defun PL->VAR ( pl / pl ub sa var)
  49. (setq ub (- (length li) 1))
  50. (setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
  51. (setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
  52. )
  53. ;Graphically draws an "X" at given point and color. Example: (drxc '( 1 2 3) 1) draws x at x=1 y=2 z=3 in the color red   
  54. (defun drxc (ctr color / vs xs xs2 cor1 cor2 cor3 cor4 ctr color)
  55. (setq vs (getvar "viewsize"))
  56. (setq xs (/ vs 20))
  57. (setq xs2 (/ xs 2))
  58. (setq cor1 (polar ctr (* pi 0.25) xs2))
  59. (setq cor2 (polar ctr (* pi 0.75) xs2))
  60. (setq cor3 (polar ctr (* pi 1.25) xs2))
  61. (setq cor4 (polar ctr (* pi 1.75) xs2))
  62. (grdraw ctr cor1 color 0)
  63. (grdraw ctr cor2 color 0)
  64. (grdraw ctr cor3 color 0)
  65. (grdraw ctr cor4 color 0)
  66. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:37:04 | 显示全部楼层
我真的很喜欢这个主意
 
我希望你不介意,我倾向于这样编码——只是作为建议提供。
 
  1. (defun c:LWPolySample ( / _dxf doc spc lobj p1 ss ev tmp lst ) (vl-load-com)
  2. ;; © Lee Mac 2010
  3. (defun _dxf ( code entity ) (cdr (assoc code (entget entity))))
  4. (LM:ActiveSpace 'doc 'spc)
  5. (if
  6.    (and (setq lobj (car (entsel "\nSelect Line: "))) (eq "LINE" (_dxf 0 lobj))
  7.      (ssget "_F"
  8.        (list (setq p1 (_dxf 10 lobj)) (_dxf 11 lobj)) '((0 . "LWPOLYLINE"))
  9.      )
  10.    )
  11.    (progn (setq lobj (vlax-ename->vla-object lobj))
  12.      
  13.      (vlax-for obj (setq ss (vla-get-ActiveSelectionSet doc))
  14.        (setq ev (vla-get-Elevation obj))
  15.        (vla-put-Elevation obj 0.0)
  16.        (setq lst
  17.          (cons
  18.            (mapcar
  19.              (function
  20.                (lambda ( x ) (list (car x) (cadr x) ev))
  21.              )
  22.              (GroupByNum (vlax-invoke obj 'IntersectWith lobj acExtendNone) 3)
  23.            )
  24.            lst
  25.          )
  26.        )
  27.        (vla-put-Elevation obj ev)
  28.      )
  29.      (vla-delete ss)
  30.      (vla-put-Color
  31.        (vlax-invoke spc 'Add3DPoly
  32.          (apply 'append
  33.            (vl-sort (apply 'append lst)
  34.             '(lambda ( a b )
  35.                (< (distance p1 (list (car a) (cadr a))) (distance p1 (list (car b) (cadr b))))
  36.              )
  37.            )
  38.          )
  39.        )
  40.        1
  41.      )
  42.    )
  43. )
  44. (princ)
  45. )
  46. (defun GroupByNum ( l n / r)
  47. ;; © Lee Mac 2010
  48. (setq r (list (car l)))
  49. (if l
  50.    (cons
  51.      (reverse
  52.        (repeat (1- n) (setq l (cdr l) r (cons (car l) r)))
  53.      )
  54.      (GroupByNum (cdr l) n)
  55.    )
  56. )
  57. )
  58. ;;--------------------=={ ActiveSpace }==---------------------;;
  59. ;;                                                            ;;
  60. ;;  Retrieves pointers to the Active Document and Space       ;;
  61. ;;------------------------------------------------------------;;
  62. ;;  Author: Lee Mac, Copyright © 2010 - www.lee-mac.com       ;;
  63. ;;------------------------------------------------------------;;
  64. ;;  Arguments:                                                ;;
  65. ;;  *doc - quoted symbol (other than *doc)                    ;;
  66. ;;  *spc - quoted symbol (other than *spc)                    ;;
  67. ;;------------------------------------------------------------;;
  68. (defun LM:ActiveSpace ( *doc *spc )
  69. ;; © Lee Mac 2010
  70. (set *spc
  71.    (vlax-get-property
  72.      (set *doc
  73.        (vla-get-ActiveDocument
  74.          (vlax-get-acad-object)
  75.        )
  76.      )
  77.      (if (= 1 (getvar 'CVPORT)) 'PaperSpace 'ModelSpace)
  78.    )
  79. )
  80. )
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 10:50:06 | 显示全部楼层

 
我喜欢它!更干净、更聪明、可能更快,但最重要的是,它揭示了我可能从未使用过的新项目,例如:
 
如何获得选择集。
 
删除选择集。
 
迭代选择集。
 
最重要的是,你的代码是如何很好地嵌套的,我的代码是一步一步完成的。
 
我想我有一个问题要问你,就是释放一个物体。什么时候使用(vlax release object obj)很重要,什么时候可以忽略它?
 
我在代码中喜欢的一个小项目是使用drxc来显示绘制点的位置。如果要在代码中添加该功能,您会将其放置在哪里?
 
感谢您的意见,
致以问候,新年快乐
hippe013
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:09:27 | 显示全部楼层
 
我使用这种处理选择集的方法,因为我知道我将处理VLA对象,因此从选择集集合中检索和迭代ActiveSelectionSet比将每个实体转换为VLA对象更快。
 
 
如果尽量减少迭代信息的次数(如果可能的话,只能迭代一次!),可以大大提高程序效率。因此,在这方面,我将努力在单个循环中完成许多操作,而不是每个操作都有许多循环。
 
 
对此众说纷纭-我的观点是,只需释放在AutoCAD对象模型之外创建的对象(如FSO、WSH等),AutoCAD将处理其范围内的对象。
 
这里有更多讨论。
 
 
我可能会用这样的东西:
 
  1. 7

 
非常欢迎你,也祝你新年快乐!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-7 00:37 , Processed in 0.473247 second(s), 64 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表