lisperado
发表于 2018-10-30 01:58:31
本帖最后由 lisperado 于 2018-10-30 02:12 编辑
20060510412 发表于 2018-10-29 19:24
个人感觉貌似还有几点可以改进一下:
1.生成的是直线,改为多段线是否更方便选取。
2.对于边界为直线的 ...
当然可行只是故意让你自己从思路中学习如何优化... ;P
以下思路, 请自行明经社区里搜索应该会好多画多段线函数
1.无需代码:先选取程序所画的线(或过滤其图层)以命令: _PEDIT JOIN 可解决!
2.命令方式 : PLINE
3.entmake方式 : LWPOLYLINE
4.activeX方式:vla-AddLightWeightPolyline
推荐方法之3以参考 , 其它自行搜索&研究
在这里是以 'x' 变量表达
(foreach x (vlax-curve-DivideBetweenPair e1 e2 y)
;;; (mapcar ''((a b) (grdraw a b 1) ) x (cdr x))
(entmakex (vl-list* '(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
'(62 . 1)
(cons 70 0)
(cons 90 (length x))
(mapcar '(lambda (x) (cons 10 x) ) x)
)
)
)
yoyoho
发表于 2018-10-30 18:17:09
(defun c:tt ( / e1 e2 y ) ;自定义lisp命令=tt , e1 e2 y 局部化避免变量冲突
(if
(and (setq e1 (car (entsel "\n选取第一条曲线 "))) ; 储存于变量e1
(setq e2 (car (entsel "\n选取第二条曲线 "))) ; 储存于变量e2
(setq y (cond((getint "\nDivide by # ? ")) (5))) ;平分默认值=5
) ; 储存于变量 y
(foreach x (vlax-curve-DivideBetweenPair e1 e2 y) ; 把各自有效变量使用于函数参数,返回值=坐标表
;画线需要开始&终点
;利用cdr分成两个序列表 A B C D ...
;(A B C D) 陪对 (B C D) ...
;以mapcar迭代表值以用于绘画功能
;A-B,B-C,C-D etc.. 符合线型表达
;(mapcar ''((a b) (grdraw a b 1)) x (cdr x)) ;以grdraw函数瞬态绘画A-B,B-C,C-D....
(Entmake-Spline x)
)
(princ "\n退出?") ;如果选取无效退出
)
(princ) ; 无痕迹退出
)
(defun Entmake-Spline (ptn / a)
(entmake (append (list '(0 . "SPLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbSpline")
'(71 . 3)
)
(mapcar '(lambda (pt) (cons 11 pt)) ptn)
)
)
(entlast)
)
20060510412
发表于 2018-10-30 19:24:28
yoyoho 发表于 2018-10-30 18:17
(defun c:tt ( / e1 e2 y ) ;自定义lisp命令=tt , e1 e2 y 局部化避免变量冲突
(if
请问,对于边界曲线为直线的特例,能否直接生成直线而不是样条曲线呢
panliang9
发表于 2018-10-31 10:58:26
20060510412 发表于 2018-10-30 19:24
请问,对于边界曲线为直线的特例,能否直接生成直线而不是样条曲线呢
这好象也是明经里的,不记得是谁写的,贴给你:
(defun c:hx(/ e1 e2 p1 p2 p3 p4 n i)
(while(and(setq e1(ssget":E:S"'((0 . "line"))))
(setq e2(ssget":E:S"'((0 . "line"))))
(setq n(getint"插入直线数量")
n(if n n 1)))
(setq e1(entget(ssname e1 0))
p1(mapcar'+'(0 0)(cdr(assoc 10 e1)))
p2(mapcar'+'(0 0)(cdr(assoc 11 e1)))
e2(entget(ssname e2 0))
p3(mapcar'+'(0 0)(cdr(assoc 10 e2)))
p4(mapcar'+'(0 0)(cdr(assoc 11 e2))))
(if(inters p1 p3 p2 p4 t)(setq e1 p4 p4 p3 p3 e1))
(setq e1(/(distance p1 p3)(1+ n)1.)
e2(/(distance p2 p4)(1+ n)1.)
p3(angle p1 p3)
p4(angle p2 p4)
i 0)
(while(< i n)
(setq i(1+ i))
(entmakex(mapcar'cons'(0 10 11)(list"line"(polar p1 p3(* e1 i))(polar p2 p4(* e2 i))))))
))
yaokui25
发表于 2018-10-31 18:29:20
楼主,你好.能否把整合好的发上来供大家学习.
dhcad
发表于 2019-1-16 10:54:47
lisperado 发表于 2018-10-28 01:53
试试上传图片
可以分享吗?太棒了
dhcad
发表于 2019-1-16 17:18:10
lisperado 发表于 2018-10-28 01:53
试试上传图片
大师,能把最后的插件分享一下吗?我太需要了,谢谢。
gamexia
发表于 2021-6-9 14:36:44
yaokui25 发表于 2018-10-31 18:29
楼主,你好.能否把整合好的发上来供大家学习.
22楼就是曲线模拟的代码
kkq0305
发表于 2021-6-11 01:43:44
lisperado 发表于 2018-10-28 21:03
谢谢l顶上
但不见原版主回复所以只提供函数 ,其他用法只需自行更改参数吧!
最后一个foreach 真的是写的 不错
潇湘飞雨
发表于 2023-2-28 20:25:36
yoyoho 发表于 2018-10-30 18:17
(defun c:tt ( / e1 e2 y ) ;自定义lisp命令=tt , e1 e2 y 局部化避免变量冲突
(if
亲,测试出来变成直线了,可否赐教?