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


亲,测试出来变成直线了,可否赐教?
页: 1 2 [3]
查看完整版本: 求助!!两条非等距离的样条曲线之间如何绘制几条等分的曲线