明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1726|回复: 14

[源码] 曲线展点

  [复制链接]
发表于 2018-6-4 00:28 | 显示全部楼层 |阅读模式

(defun c:zd (/ en en_obj gd len len_lst obj pt pt_x pt_y pt1 pts ss ss1_lst)       
        (vl-load-com)   
        (setq eh-*error*-bak *error*)
        (defun *error* (msg)
                (setq *error* eh-*error*-bak)
                (setvar "osmode" eh_os_g)
                (vla-endundomark eh_doc_g)
                (setvar "nomutt" 0)
                (setvar "cmdecho" 1)
                (print msg)
        )
       
        (setvar "cmdecho" 0)
        (if (null eh_doc_g)(setq eh_doc_g (vla-get-activedocument (vlax-get-acad-object))))
        (vla-startundomark eh_doc_g)
        (if (< (setq eh_os_g (getvar "osmode")) 16384)
                (setvar "osmode" (+ eh_os_g 16384))
        )
       
        (setq ss (ssget))
        (setq en (ssname ss 0))
        (setq en_obj (vlax-ename->vla-object en))
        (setq ss1_lst (EH-SS->List (ssget)))
        (setq ss1_lst (vl-remove en ss1_lst))
        ;;闭合对象取结束端点时出现长度0,所以取用参数来取长度       
        (setq len (vlax-curve-getDistAtParam en (vlax-curve-getEndParam en)))
        ;;求出交点集
        (setq pts '())       
        (foreach x ss1_lst
                (setq obj (vlax-ename->vla-object x))                       
                (setq pt (vla-IntersectWith en_obj obj acExtendNone))               
                (setq pt (vlax-variant-value pt))               
                (if (= -1 (vlax-safearray-get-u-bound pt 1))
                        nil
                        (progn
                                (setq pt (vlax-safearray->list pt))
                                ;;如果交点在顶点上有可能会出错
                                ;;(1.41138e+006 43846.0 0.0 1.41138e+006 43846.0 0.0)
                                (cond
                                        ((= (length pt) 3) (setq pts (cons pt pts)))
                                        ((> (length pt) 3)
                                                (setq ls_lst nil)
                                                (while (car pt)
                                                        (setq ls_lst (cons (list (car pt) (cadr pt) (caddr pt)) ls_lst))
                                                        (setq pt (cdr (cdr (cdr pt))))                                                       
                                                )
                                                (foreach x ls_lst
                                                        (setq pts (cons x pts))                                                       
                                                )
                                        )
                                        (T nil)                                       
                                )                                       
                        )       
                )               
        )
       
        ;;求曲线上起点到各交点的长度并排序
        (setq len_lst '())
        (setq len_lst (cons len len_lst))       
        (foreach x pts               
                (setq len (vlax-curve-getDistAtPoint en x))
                (setq len_lst (cons len len_lst))               
        )
        (setq len_lst
                (vl-sort len_lst '(lambda (a b) (< a b)))               
        )
       
        (if len_lst
                (progn
               
                        (if (= eh_wall_gd_g nil)
                                (setq eh_wall_gd_g 2900))
                        (princ "\n请输入墙高<")(princ eh_wall_gd_g)(princ ">:")  ;;显示默认墙高
                        (setq gd (getdist))
                        (if (= gd nil)
                                (setq gd eh_wall_gd_g)
                                (setq eh_wall_gd_g gd))
                       
                       
                       
                       
                        (setvar "osmode" eh_os_g)
                        (setq pt1 (getpoint "请指定墙料插入点:"))
                                               
                        (if (< (setq eh_os_g (getvar "osmode")) 16384)
                                (setvar "osmode" (+ eh_os_g 16384))
                        )                       
                        (setq pt_X (car pt1))
                        (setq pt_Y (cadr pt1))
                       
                        (setq pts (list
                                                                        pt1
                                                                        (list (+ pt_X (last len_lst)) pt_Y)
                                                                        (list (+ pt_X (last len_lst)) (+ pt_Y gd))
                                                                        (list pt_X (+ pt_Y gd))
                                                                )                               
                        )
                        (EH-Make-Lwpolyline pts nil T nil nil)
                       
                        (setq len_lst (reverse (cdr (reverse len_lst))))
                       
                        (foreach x len_lst
                                (setq pts (list
                                                                                (list (+ pt_X x) pt_Y)
                                                                                (list (+ pt_X x) (+ pt_Y gd))                                                                                                                                                                                                                                                                                                                                                                                                       
                                                                        )                                       
                                )
                                (EH-Make-Lwpolyline pts nil nil nil nil)                                                               
                        )                                               
                )
        )
       
        (setq *error* eh-*error*-bak)
        (setvar "osmode" eh_os_g)
        (vla-endundomark eh_doc_g)
        (setvar "nomutt" 0)
        (setvar "cmdecho" 1)   
        (princ)
);defun_end
发表于 2018-10-8 16:04 | 显示全部楼层
本帖最后由 lisperado 于 2018-10-8 16:15 编辑

暂时用 EXPRESS TOOL代替看看?
(setq EH-SS->List   ACET-SS-TO-LIST)

EH-Make-Lwpolyline这函数需要5个参数所以没办法帮
如果用普通线看看结果是什么?
  1. (defun Make-Lwpolyline (lst)
  2.     (entmake (vl-list*        '(0 . "LWPOLYLINE")
  3.                         '(100 . "AcDbEntity")
  4.                         '(100 . "AcDbPolyline")
  5.                         '(70 . 0)
  6.                         (cons 90 (length lst))
  7.                         (mapcar '(lambda (x) (cons 10 x)) lst)
  8.                         )
  9.               )
  10.   )


;搜索放弃应用无知EH-函数
(EH-Make-Lwpolyline pts nil nil nil nil)

;改普通线看看
(make-Lwpolyline pts)   
发表于 2018-10-14 10:39 | 显示全部楼层
可能你没安装ET?
虽然没有EH-SS->List函数也不清楚其功能,所以只能猜测罢了!
只有要求版主重发!

试试另一个函数?请先置顶看看
  1. (defun ss->lst ( s / e)
  2. (if (and s (setq e (ssname s 0))) (cons e (ss->lst (ssdel e s)))))

(setq EH-SS->List   ss->lst)

发表于 2018-10-6 10:38 | 显示全部楼层
fangmin723 发表于 2018-6-4 07:50
缺少自定义函数:EH-SS->List和EH-Make-Lwpolyline

可以上传缺少的自定义函数:EH-SS->List和EH-Make-Lwpolyline吗
发表于 2018-6-4 07:50 | 显示全部楼层
缺少自定义函数:EH-SS->List和EH-Make-Lwpolyline
发表于 2018-10-7 07:38 | 显示全部楼层
预知幸福 发表于 2018-10-6 10:38
可以上传缺少的自定义函数:EH-SS->List和EH-Make-Lwpolyline吗

这个程序不是我写的,这两个函数我没有!
发表于 2018-10-7 10:17 | 显示全部楼层
用不了 可以把完整的代码补全吗
发表于 2018-10-7 10:27 | 显示全部楼层
用不了 可以把完整的代码补全吗
发表于 2018-10-7 10:30 | 显示全部楼层
用不了 可以把代码补全吗
发表于 2018-10-8 16:55 | 显示全部楼层
感觉楼主的代码用建筑模型绘图
发表于 2018-10-11 11:57 | 显示全部楼层
hhh454 发表于 2018-10-8 16:55
感觉楼主的代码用建筑模型绘图

可以用在建筑模型绘图
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-26 15:11 , Processed in 0.596778 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表