qjchen
发表于 2023-6-28 16:26:16
本帖最后由 qjchen 于 2023-7-1 20:22 编辑
一直学习
假如不需要批量,只需要绘制,估计chenjun兄的方法加上ucs和倒角就是够用的。
假如需要批量或者一键点击出空间曲线的话,估计就还是得花时间去慢慢算出这两个圆弧的倾斜角向量、起始角度和结束角度,然后entmake一下
如
((-1 . <图元名: 29de71ba5f0>) (0 . "ARC") (330 . <图元名: 29de71b51f0>) (5 . "2B7") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "1") (100 . "AcDbCircle") (10 -1681.19 -480.222 1705.11) (40 . 222.0) (210 1.13393e-15 0.924656 0.380805) (100 . "AcDbArc") (50 . 4.07596) (51 . 4.71239))
其中的210 就是其中某段圆弧的空间角度向量。
不过用command ,fillet ,ucs 等按图慢慢做下,可能也是可行的
----------------------------------
注:2023年7月1日,经过验证,上面的ucs 是没有必要的,CAD是可以fillet空间曲线的
chenjun_nj
发表于 2023-6-28 17:19:16
ynhh 发表于 2023-6-28 11:48
谢谢您的帮助
已选您为最佳答案
敬上一百明经币
“但现在的是圆弧一端在三维线框角点
感觉无法定位应用倒圆角功能
您的几何知识强
想请教您,能不能用画图法,即空间直线倒圆角的方法
实现这个题解?”
--作图法不能实现
ynhh
发表于 2023-6-28 22:40:12
qjchen 发表于 2023-6-28 16:26
一直学习
假如不需要批量,只需要绘制,估计chenjun兄的方法加上ucs和倒角就是够用的。
您说的这个是要建立在之前的计算结果的基础上
有这结果之后的都好办了
我想是否能用纯作图法完成?
感觉也好象不好办
chenjun_nj
发表于 2023-6-29 09:35:41
ynhh 发表于 2023-6-28 22:40
您说的这个是要建立在之前的计算结果的基础上
有这结果之后的都好办了
您说的这个是要建立在之前的计算结果的基础上
有这结果之后的都好办了
我想是否能用纯作图法完成?
感觉也好象不好办只有两端的管口轴线在同一个平面上时,才可以用纯作图完成,
因为此时两端的圆弧轴线可以先画出来,中间的直管轴线就是两端圆弧的公切线;
其他不在一个平面上的,就是要计算后才能确定,而且计算出来的方程是不可能有解析解的,
只能用数值求解。
ynhh
发表于 2023-6-29 16:39:26
chenjun_nj 发表于 2023-6-29 09:35
只有两端的管口轴线在同一个平面上时,才可以用纯作图完成,
因为此时两端的圆弧轴线可以先画出来,中 ...
以您这么高的水平
我也坚定了您说的是对的
谢谢您的指导
qjchen
发表于 2023-7-1 20:19:48
好久没有写LISP,感觉得练习一下。写了这段,估计也不是楼主的目标,权当自我学习。代码只求能用,颇丑,就不优化了。
之前也没有怎么试过用fillet这种command写法,才发现fillet是会自动识别两线是否同一平面的,然后fillet出空间结果,看来前面的说法是有误了。
;;;;vec plus
(defun q:vec:+ (v1 v2) (mapcar '+ v1 v2))
;;;;vec substract
(defun q:vec:- (v1 v2) (mapcar '- v1 v2))
;;;;vec dot product
(defun q:vec:dot* (v1 v2) (apply '+ (mapcar '* v1 v2)))
;;;;vec plus constant
(defun q:vec:*c (v a) (mapcar '(lambda (x) (* x a)) v))
;;;;Normalize a vec
(defun q:vec:Norm (v / l)
(if (not (zerop (setq l (distance '(0 0 0) v))))
(mapcar '(lambda (x) (/ x l)) v)
)
)
;;entmake line
(defun q:entmake:line (pt1 pt2 layer)
(entmake (list (cons 0 "LINE")
(cons 6 "BYLAYER")
(cons 8 layer)
(cons 10 pt1)
(cons 11 pt2)
(cons 39 0.0)
(cons 62 256)
(cons 210 (list 0.0 0.0 1.0))
)
)
)
;;;无聊之作,空间管道的连接,基于chenjun_nj兄的计算公式
;;;http://bbs.mjtd.com/thread-188072-1-1.html
;;;by qjchen
;;;功能:选择X向直线和Y向直线,进行绘制,目前只能是对两根连接管正交的情况,没有考虑斜向的情况
;;;没有做其他代码优化,程序变量、UNDO之类的优化
(defun c:test ( / a b c disa2 disd2 entla entlap1 entlap2 entld entldp1 entldp2 la ld pointa pointa1 pointa2 pointd pointd1 pointd2 r ss1 ss2 ss3 vecaa1 vecad vecdd1 vv x xi y yi)
(setq ss1 (ssadd))
(setq ss2 (ssadd))
(setq ss3 (ssadd))
(setq pointa (getpoint "\n选择A点"))
(setq la (entsel "\n请选择连着A的X方向的直线"))
(ssadd (car la) ss1)
(setq entla (entget (car la)))
(setq entlap1 (cdr (assoc 10 entla)))
(setq entlap2 (cdr (assoc 11 entla)))
(if (> (distance pointa entlap1) 1e-3)
(setq pointa1 entlap1)
(setq pointa1 entlap2)
)
(setq pointd (getpoint "\n选择D点"))
(setq ld (entsel "\n请选择连着D的Y方向的直线"))
(ssadd (car ld) ss2)
(setq entld (entget (car ld)))
(setq entldp1 (cdr (assoc 10 entld)))
(setq entldp2 (cdr (assoc 11 entld)))
(if (> (distance pointd entldp1) 1e-3)
(setq pointd1 entldp1)
(setq pointd1 entldp2)
)
(setq vecaa1 (q:vec:Norm (q:vec:- pointa1 pointa)))
(setq vecdd1 (q:vec:Norm (q:vec:- pointd1 pointd)))
(setq vecad (q:vec:- pointa pointd))
(setq vv (q:vec:dot* vecaa1 vecdd1))
(if (> (abs vv) 1e-12)
(princ "\n 两根直线不正交,本代码不适用")
(progn
(setq a (abs (cadr vecad))
b (abs (car vecad))
c (abs (caddr vecad))
R 222
)
(setq x 0
y 0
)
(setq xi (fun1 x y b c R))
(setq yi (fun2 xi y a c R))
(while (or (> (abs (- xi x)) 1e-12) (> (abs (- yi y)) 1e-12))
(setq xxi
yyi
)
(setq xi (fun1 x y b c R))
(setq yi (fun2 xi y a c R))
)
(setq disa2 (- b xi))
(setq disd2 (- a yi))
(setq pointa2 (q:vec:+ pointa (q:vec:*c vecaa1 (- disa2))))
(setq pointd2 (q:vec:+ pointd (q:vec:*c vecdd1 (- disd2))))
(q:entmake:line pointa2 pointd2 "0")
(ssadd (entlast) ss3)
(command "fillet" "R" R)
(command "fillet" ss1 ss3)
(command "fillet" ss2 ss3)
(princ)
)
)
)
(defun fun1 (x y b c R)
(- b
(/(* R (- (sqrt (+ (* c c) (* x x) (* y y))) x))
(sqrt (+ (* c c) (* y y)))
)
)
)
(defun fun2 (x y a c R)
(- a
(/(* R (- (sqrt (+ (* c c) (* x x) (* y y))) y))
(sqrt (+ (* c c) (* x x)))
)
)
)
chenjun_nj
发表于 2023-7-3 09:37:41
qjchen 发表于 2023-7-1 20:19
好久没有写LISP,感觉得练习一下。写了这段,估计也不是楼主的目标,权当自我学习。代码只求能用,颇丑,就 ...
FILLET命令一直是对同一平面的两线倒圆角,与UCS没有关系。
ynhh
发表于 2023-7-3 14:16:26
qjchen 发表于 2023-7-1 20:19
好久没有写LISP,感觉得练习一下。写了这段,估计也不是楼主的目标,权当自我学习。代码只求能用,颇丑,就 ...
您好
敬佩您的钻研精神
我在2010和2018中都测试了您的代码,
分别选择图中红线
均会出现死机且无法成功的情况。
现实工作中,XYZ 三个方向的都有可能
空间任意角的三根直线是可以倒圆角的
我这次问的
主要是复杂在圆弧的一端在指定点上
最后感觉还是用您最先的公式法稳定一些
谢谢您
ynhh
发表于 2023-8-19 20:21:08
qjchen 发表于 2023-6-27 22:23
谢谢chenjun兄给出的几何解法,之前一直想不明白这些空间拐来拐去的 :)总是想歪了
太久没有编过lisp ...
老师您好
能不能请您看看这个
http://bbs.mjtd.com/thread-171157-1-1.html
已知弧长弦长求半径
我想学习用迭代法计算
却一直写不出来
自己水平太差
别人也没说出过好用的方法
想请您出手指导一下
谢谢您
qjchen
发表于 2023-8-20 12:17:43
本帖最后由 qjchen 于 2023-8-20 12:20 编辑
ynhh 发表于 2023-8-19 20:21
老师您好
能不能请您看看这个
用最简单的迭代法编了一小段。(以后有空再试试其他迭代法)
其中手工拟合了一个初值函数。
适用范围: 弧长大于弦长,然后,弧心角小于180度(可以自己再试试修改的),没有考虑各种容错机制。对付能用。没有仔细测试,若有问题,请告知。
(defun c:test ( / a b epsilon lastr r ratio)
(setq a (getreal "\n弧长:"))
(setq b (getreal "\n弦长:"))
(setq ratio (/ (- 0.89863 (* 0.89498 b)) (- 1 (* 0.99994 b))))
(setq R (* ratio b))
(setq epsilon 1e5)
(while (> epsilon 1e-5)
(setq lastR R)
(setq R (/ b (* 2 (sin (/ a 2 R)))))
(setq epsilon (abs (- R lastR)))
)
(princ "\n R = ") (princ R)(princ)
)