怎样用LISP程序完成多条直线与多条直线倒角?
怎样用LISP程序完成多条直线与多条直线倒角?设计中有多条直线需对应倒角,但每次都要一根一根的来,能不能一起就倒完?
如果有规律的话, 可采用循环. 否则只有一对对的来了.
是一组平行线与别一组平行线之间的倒角
是一组平行线与别一组平行线之间的倒角不可能,除非程序已经把实体排好序
下面有一段程序可以倒,但有错误,比如说线很多的时候。
(defun xxx (/ li lii d ddd dd ss ss1 j s1 s2 d1 d2 d3 d4 dd1 dd2 dd3 dd4 dt1 dt2 get ros gets)(setq gets (getvar "OSMODE"))
(setq getss (getvar "ORTHOMODE"))
(setvar "OSMODE" 0)
(setvar "ORTHOMODE" 0)
(princ (strcat "\n当前倒角孤度为:" (rtos (getvar "FILLETRAD"))))
(if (setq ros (getreal "\n请输入倒角的孤度:")) (setvar "FILLETRAD" ros))
(princ "\n请选取倒角一边的线。")
(command ".line" pause pause "")
(setq li (entlast))
(setq dd1 (cdr (assoc 10 (entget li))) dd2 (cdr (assoc 11 (entget li))))
(command ".erase" li "")
(setq ss (ssget "f" (list dd1 dd2)))
(princ "\n请选取倒角另一边的线。")
(command ".line" pause pause "")
(setq lii (entlast))
(setq dd3 (cdr (assoc 10 (entget lii))) dd4 (cdr (assoc 11 (entget lii))))
(command ".erase" lii "")
(setq ss1 (ssget "f" (list dd3 dd4)))
(command ".redraw")
;;;;;;
(if (> (sslength ss) (sslength ss1))
(setq j (sslength ss1))
(setq j (sslength ss))
)
;;;;;;;;;;;;;;;;;;
(setq get (getvar "PICKBOX"))
(setvar "PICKBOX" 1)
(while (> j 0)
(setq s1 (entget (ssname ss (- j 1))))
(setq s2 (entget (ssname ss1 (- j 1))))
(setq d1 (cdr (assoc 10 s1)))
(setq d2 (cdr (assoc 11 s1)))
(setq d3 (cdr (assoc 10 s2)))
(setq d4 (cdr (assoc 11 s2)))
(setq d(inters d1 d2 d3 d4 nil))
(setq dd (inters d1 d2 dd1 dd2 nil))
(setq ddd (inters d3 d4 dd3 dd4 nil))
(command ".fillet" dd ddd)
(setq j (1- j))
)
(setvar "PICKBOX" 5)
(setvar "OSMODE" gets)
(setvar "ORTHOMODE" getss)
(princ)
)
这里写的不好:
本帖最后由 作者 于 2003-4-22 23:36:53 编辑这里写的不好:
(setq d1 (cdr (assoc 10 s1)))
(setq d2 (cdr (assoc 11 s1)))
(setq d3 (cdr (assoc 10 s2)))
(setq d4 (cdr (assoc 11 s2)))
(setq d(inters d1 d2 d3 d4 nil))
(setq dd (inters d1 d2 dd1 dd2 nil))
(setq ddd (inters d3 d4 dd3 dd4 nil))
(command ".fillet" dd ddd)
可以为
(command"fillet"(list s1 d1)(list s2 d3))
按你的写法当然要出错.
还有画出line线是没必要画的.用getpoint.
你說不好的地方才是好的,那決定倒角位置在前or在後,再配合雙元表
;;要用双元表(defun XXX (/ D DD DDD SS SS1 J S1 S2 D1 D2 D3 D4 DD1 DD2 DD3 DD4 ROS
GET GETS)
(setq GETS (getvar "OSMODE"))
(setq GETSS (getvar "ORTHOMODE"))
(setvar "OSMODE" 0)
(setvar "ORTHOMODE" 0)
(if
(setq
ROS (getdist
(strcat "\n请输入倒角<" (rtos (getvar "FILLETRAD")) ">: ")
)
)
(setvar "FILLETRAD" ROS)
)
(setq DD1 (getpoint "\n请选取倒角一边的线。"))
(setq DD2 (getpoint DD1))
(setq SS (ssget "f" (list DD1 DD2)))
(setq DD3 (getpoint "\n请选取倒角另一边的线。"))
(setq DD4 (getpoint DD3))
(setq SS1 (ssget "f" (list DD3 DD4)))
(if (> (sslength SS) (sslength SS1))
(setq J (sslength SS1))
(setq J (sslength SS))
)
(while (> J 0)
(setq S1 (entget (ssname SS (- J 1))))
(setq S2 (entget (ssname SS1 (- J 1))))
(setq D1 (cdr (assoc 10 S1)))
(setq D2 (cdr (assoc 11 S1)))
(setq D3 (cdr (assoc 10 S2)))
(setq D4 (cdr (assoc 11 S2)))
(setq D (inters D1 D2 D3 D4 NIL))
(setq DD (inters D1 D2 DD1 DD2 NIL))
(setq DDD (inters D3 D4 DD3 DD4 NIL))
(command "_.fillet"
(list (ssname SS (- J 1)) DD)
(list (ssname SS1 (- J 1)) DDD)
)
(setq J (1- J))
)
(setvar "OSMODE" GETS)
(setvar "ORTHOMODE" GETSS)
(princ)
)
谢谢龙龙仔,这段程序比以前好太多了。也谢谢aeo000000热心帮助.
<p>龙龙大哥发的程序真的很好用。那倒成圆角的程序能改成倒圆角及倒45度角可选择的吗?</p><p> </p> <p>剛剛又試了下,怎麼pline不能倒圓角?兩都都能用就完美了。</p>
页:
[1]
2