实数浮点精度
我对lisp如何处理点的浮点精度感到困惑。我正在尝试使用IntersectWith方法,并得到了一些奇怪的结果。我已经确定这是点精度的结果。
我有以下内容:
(setq pointlist(vlax-safearray->list (vlax-variant-value (vlax-invoke-method line-obj 'IntersectWith polyline-obj acExtendNone))))
返回:(476472.0 215324.0 0.0)
好啊所以它并没有显示所有的小数位。没什么大不了的,对吧?
接下来我使用:
(setq x (nth 0 poinlist))
然后我检查x,得到476472.0
一定有什么我遗漏或不理解的。任何帮助都将不胜感激!我期待着476472.96706517或类似的东西。
当做
Hippe013 作为一种快速方法,您可以通过使用未记录的vlax调用函数来避免该变体,因此:
要显示更多位置,可能需要使用RTO:
(rtos (car lst) 2 15) 嘿,李,谢谢你提醒我以下代码:
(setq lst (vlax-invoke line-obj 'IntersectWith polyline acExtendNone))
变异有时会令人头痛。
事实证明,我的问题只是一个小的打字错误。
我想与大家分享我的工作,但请记住,我仍处于调试阶段,还需要添加错误陷阱,使其具有虚拟证明。
以下代码将三维多段线覆盖在沿给定直线的一系列高架多段线(等高线)上。它对多段线进行了采样。请随时告诉我你的想法。
;Drapes a 3dpolyline over polylines along a selected line.
(vl-load-com)
(defun c:sample-pl ( / li *ModSpc *ActDoc *Acad lobj p1 p2 ss sslen i plobj pnts n li pntli finli var)
(setq li nil)
(setq *ModSpc (vlax-get-property (setq *ActDoc (vlax-get-property (setq *acad (vlax-get-acad-object)) 'ActiveDocument)) 'ModelSpace))
(setq lobj (vlax-ename->vla-object (car (entsel "\nSelect Line Object: "))))
(setq p1 (vlax-safearray->list (vlax-variant-value (vlax-get-property lobj 'StartPoint))))
(setq p2 (vlax-safearray->list (vlax-variant-value (vlax-get-property lobj 'EndPoint))))
(setq ss (ssget "f" (list p1 p2) '(( 0 . "LWPOLYLINE"))))
(setq sslen (sslength ss))
(setq i 0)
(repeat sslen
(setq plobj (vlax-ename->vla-object (ssname ss i)))
(setq el (vlax-get-property plobj 'Elevation))
(vlax-put-property plobj 'Elevation 0)
(setq pnts (vlax-invoke lobj 'IntersectWith plobj acExtendNone))
(vlax-put-property plobj 'Elevation el)
(vlax-release-object plobj)
(setq n 0)
(repeat (/ (length pnts) 3)
(setq li (append li (list (nth (+ n 0) pnts))))
(setq li (append li (list (nth (+ n 1) pnts))))
(setq li (append li (list el)))
(drxc (list (nth (+ n 0) pnts) (nth (+ n 1) pnts) el) 2)
(setq n (+ n 3))
)
(setq i (1+ i))
)
(setq n 0)
(setq pntli nil)
(repeat (/ (length li) 3)
(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)))))))
(setq n (+ n 3))
)
(setq pntli (vl-sort pntli (function (lambda (d1 d2) (< (car d1) (car d2))))))
(setq n 0)
(setq finli nil)
(repeat (length pntli)
(setq finli (append finli (cadr (nth n pntli))))
(setq n (1+ n))
)
(setq var (pl->var finli))
(setq 3dobj2 (vlax-invoke-method *ModSpc 'Add3DPoly var))
(vlax-put-property 3dobj2 'Color 1)
(vlax-release-object 3dobj2)
)
;Given Pointlist returns pointlist in variant form
(defun PL->VAR ( pl / pl ub sa var)
(setq ub (- (length li) 1))
(setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
(setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
)
;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
(defun drxc (ctr color / vs xs xs2 cor1 cor2 cor3 cor4 ctr color)
(setq vs (getvar "viewsize"))
(setq xs (/ vs 20))
(setq xs2 (/ xs 2))
(setq cor1 (polar ctr (* pi 0.25) xs2))
(setq cor2 (polar ctr (* pi 0.75) xs2))
(setq cor3 (polar ctr (* pi 1.25) xs2))
(setq cor4 (polar ctr (* pi 1.75) xs2))
(grdraw ctr cor1 color 0)
(grdraw ctr cor2 color 0)
(grdraw ctr cor3 color 0)
(grdraw ctr cor4 color 0)
)
我真的很喜欢这个主意
我希望你不介意,我倾向于这样编码——只是作为建议提供。
(defun c:LWPolySample ( / _dxf doc spc lobj p1 ss ev tmp lst ) (vl-load-com)
;; © Lee Mac 2010
(defun _dxf ( code entity ) (cdr (assoc code (entget entity))))
(LM:ActiveSpace 'doc 'spc)
(if
(and (setq lobj (car (entsel "\nSelect Line: "))) (eq "LINE" (_dxf 0 lobj))
(ssget "_F"
(list (setq p1 (_dxf 10 lobj)) (_dxf 11 lobj)) '((0 . "LWPOLYLINE"))
)
)
(progn (setq lobj (vlax-ename->vla-object lobj))
(vlax-for obj (setq ss (vla-get-ActiveSelectionSet doc))
(setq ev (vla-get-Elevation obj))
(vla-put-Elevation obj 0.0)
(setq lst
(cons
(mapcar
(function
(lambda ( x ) (list (car x) (cadr x) ev))
)
(GroupByNum (vlax-invoke obj 'IntersectWith lobj acExtendNone) 3)
)
lst
)
)
(vla-put-Elevation obj ev)
)
(vla-delete ss)
(vla-put-Color
(vlax-invoke spc 'Add3DPoly
(apply 'append
(vl-sort (apply 'append lst)
'(lambda ( a b )
(< (distance p1 (list (car a) (cadr a))) (distance p1 (list (car b) (cadr b))))
)
)
)
)
1
)
)
)
(princ)
)
(defun GroupByNum ( l n / r)
;; © Lee Mac 2010
(setq r (list (car l)))
(if l
(cons
(reverse
(repeat (1- n) (setq l (cdr l) r (cons (car l) r)))
)
(GroupByNum (cdr l) n)
)
)
)
;;--------------------=={ ActiveSpace }==---------------------;;
;; ;;
;;Retrieves pointers to the Active Document and Space ;;
;;------------------------------------------------------------;;
;;Author: Lee Mac, Copyright © 2010 - www.lee-mac.com ;;
;;------------------------------------------------------------;;
;;Arguments: ;;
;;*doc - quoted symbol (other than *doc) ;;
;;*spc - quoted symbol (other than *spc) ;;
;;------------------------------------------------------------;;
(defun LM:ActiveSpace ( *doc *spc )
;; © Lee Mac 2010
(set *spc
(vlax-get-property
(set *doc
(vla-get-ActiveDocument
(vlax-get-acad-object)
)
)
(if (= 1 (getvar 'CVPORT)) 'PaperSpace 'ModelSpace)
)
)
)
李
我喜欢它!更干净、更聪明、可能更快,但最重要的是,它揭示了我可能从未使用过的新项目,例如:
如何获得选择集。
删除选择集。
迭代选择集。
最重要的是,你的代码是如何很好地嵌套的,我的代码是一步一步完成的。
我想我有一个问题要问你,就是释放一个物体。什么时候使用(vlax release object obj)很重要,什么时候可以忽略它?
我在代码中喜欢的一个小项目是使用drxc来显示绘制点的位置。如果要在代码中添加该功能,您会将其放置在哪里?
感谢您的意见,
致以问候,新年快乐
hippe013
我使用这种处理选择集的方法,因为我知道我将处理VLA对象,因此从选择集集合中检索和迭代ActiveSelectionSet比将每个实体转换为VLA对象更快。
如果尽量减少迭代信息的次数(如果可能的话,只能迭代一次!),可以大大提高程序效率。因此,在这方面,我将努力在单个循环中完成许多操作,而不是每个操作都有许多循环。
对此众说纷纭-我的观点是,只需释放在AutoCAD对象模型之外创建的对象(如FSO、WSH等),AutoCAD将处理其范围内的对象。
这里有更多讨论。
我可能会用这样的东西:
7
非常欢迎你,也祝你新年快乐!
页:
[1]