Aftertouch 发表于 2022-7-5 15:58:25

计算精确长度

大家好,
 
我创建了一个lisp来偏移一条线,
用给定值扩展线,
然后闭合两条线之间的间隙。
 
现在,当我的多段线为V形时,绝对长度会延长/缩短。
 
如何修改此代码,使DeltaX为我的值,并计算扩展长度?
 
例子:
我得到了一条^形的多段线,0,0,12,0(2x 45度)。
我希望这条线向DeltaX方向延伸1米。
现在我的代码扩展了1米,所以detalX的变化只是。。。0,7071.
 

(defun C:OffsetJoinCopy ( / offsetobject )
(setvar "cmdecho" 0)
(command "UNDO" "BEGIN")
(if (= offsetdepthvalue nil)(setq offsetdepthvalue 0.0))
(if (= offsetwidthvalue nil)(setq offsetwidthvalue 0.0))
(setq newoffsetdepthvalue (getreal (strcat "Specify offset depth <" (rtos offsetdepthvalue 2) ">: ")))
(cond
        ((= newoffsetdepthvalue nil)
                (setq offsetdepthvalue offsetdepthvalue)
        )
        (t
                (setq offsetdepthvalue newoffsetdepthvalue)
        )
)

(setq newoffsetwidthvalue (getreal (strcat "Specify offset width <" (rtos offsetwidthvalue 2) ">: ")))
(cond
        ((= newoffsetwidthvalue nil)
                (setq offsetdepthvalue offsetwidthvalue)
        )
        (t
                (setq offsetwidthvalue newoffsetwidthvalue)
        )
)

(setq offsetobject (entsel "\nSelect object to offset: "))
(cond
        ((and (/= offsetdepthvalue 0)(/= offsetwidthvalue 0)(/= offsetobject nil))
                (setvar "peditaccept" 1)
                (command "_COPY" offsetobject "" "" "")
                (setq topline (entlast))
                (setq currentlength (vlax-curve-getdistatparam (entlast) (vlax-curve-getendparam (entlast))))
                (setq newlength (+ currentlength (* 2 offsetwidthvalue)))
                (setq extendlength (/ (- newlength currentlength) 2))
                (setq StrtPnt (vlax-curve-getStartPoint (entlast)))
                (setq EnfPoint (vlax-curve-getEndPoint (entlast)))
                (vl-cmdf "_.lengthen" "Delta" extendlength StrtPnt EnfPoint "")
                (command "_COPY" (entlast) "" "" "")
                (command "_MOVE" (entlast) "" "0,0" (strcat "0,-" (rtos offsetdepthvalue)))
                (setq xy1 (strcat (rtos (car (cdr (assoc 10 (entget (entlast)))))) "," (rtos (car (cdr (cdr (assoc 10 (entget (entlast)))))))))
                (setq xy2 (strcat (rtos (car (cdr (assoc 10 (entget topline))))) "," (rtos (car (cdr (cdr (assoc 10 (entget topline))))))))
                (setq xy3 (strcat (rtos (car (cdr (assoc 10 (reverse (entget (entlast))))))) "," (rtos (car (cdr (cdr (assoc 10 (reverse (entget (entlast))))))))))
                (setq xy4 (strcat (rtos (car (cdr (assoc 10 (reverse (entget topline)))))) "," (rtos (car (cdr (cdr (assoc 10 (reverse (entget topline)))))))))
                (command "_PLINE" xy1 xy2 "")
                (command "_PLINE" xy3 xy4 "")
                (setvar "peditaccept" 0)
        )
        (t
                (princ "*Cancel*")
        )
)
(command "UNDO" "END")
(setvar "cmdecho" 1)
(princ)
)

Roy_043 发表于 2022-7-5 16:20:02

您知道OSMODE和LUPREC设置都会对代码的结果产生影响吗?鉴于本主题的标题,您似乎不太可能希望这样。
 
注:请参见此处。

hanhphuc 发表于 2022-7-5 16:46:06

 
我认为这更有意义45度
0,0 1,1 2,0

try math cos or sin & abs
(defun foo (x a)(/ x (cos a ) ))
;(foo 1. (/ pi 4.))
(foo 1. (angle '(0 0)'(1 1)))
(foo 1. (angle '(1 1)'(2 0)))

;1.41421 to be extended?

Aftertouch 发表于 2022-7-5 17:02:52

成功了,
我使用COS函数来计算长度。
 
正在思考的方式很难。。。
 
谢谢
页: [1]
查看完整版本: 计算精确长度