实例介绍
【实例简介】
【实例截图】
【核心代码】;;;========================================= ;;; 多段线批量增加高程点插件 for CASS11 ;;;========================================= ;; 安全执行命令函数 (defun command-s (/ cmd) (setq cmd (list)) (while (setq arg (car cmd)) (setq cmd (cdr cmd)) (command arg) ) ) ;; 获取多段线长度的函数 (defun get-polyline-length (ent / ent_type ent_data len) (setq ent_data (entget ent)) (setq ent_type (cdr (assoc 0 ent_data))) (cond ((= ent_type "LWPOLYLINE") (cdr (assoc 2 ent_data))) ((= ent_type "POLYLINE") (vlax-curve-getdistatparam ent (vlax-curve-getendparam ent))) (T nil) ; 非多段线类型 ) ) (defun C:ADDGCD (/ ss1 i ent pline_len dist cnt pt elev base_elev err_handler valid_count) ;; 错误处理函数 (defun err_handler (msg) (if (/= msg "Function cancelled") (princ (strcat "\n错误: " msg)) ) (princ) ) ;; 设置错误陷阱 (setq *error* err_handler) ;; 开始撤销标记 (command "_undo" "_begin") ;; 选择多段线 (princ "\n请选择多段线: ") (setq ss1 (ssget '((0 . "LWPOLYLINE,POLYLINE")))) (if (= ss1 nil) (progn (alert "请先选择多段线!") (command "_undo" "_end") (exit) ) ) ;; 获取点间距 (setq dist (getreal "\n输入点间距(m): ")) (if (or (= dist nil) (<= dist 0.0)) (progn (alert "无效的间距值!") (command "_undo" "_end") (exit) ) ) ;; 获取起点高程 (setq base_elev (getreal "\n输入起点高程(m): ")) (if (= base_elev nil) (progn (alert "无效的高程值!") (command "_undo" "_end") (exit) ) ) (setq elev base_elev) (setq i 0) (setq valid_count 0) ;; 处理每条选中的多段线 (repeat (sslength ss1) (setq ent (ssname ss1 i)) ;; 获取多段线长度 (setq pline_len (get-polyline-length ent)) ;; 验证实体类型和长度 (if (null pline_len) (princ (strcat "\n警告: 对象 " (itoa i) " 不是有效的多段线!")) ;; 检查多段线长度是否有效 (if (<= pline_len 0.0) (progn ;; 尝试获取多段线顶点数 (setq vertex_count (cond ((= (cdr (assoc 0 (entget ent))) "LWPOLYLINE") (cdr (assoc 90 (entget ent)))) (T (length (ssget "_X" (list (cons 0 "VERTEX") (cons 330 ent))))))) (princ (strcat "\n警告: 多段线 " (itoa i) " 长度为零 (顶点数: " (itoa (if vertex_count vertex_count 0)) ")")) ) ;; 有效多段线处理 (progn ;; 计算点数 (setq cnt (fix (/ pline_len dist))) (setq cnt (max 1 cnt)) ; 至少有一个点 ;; 在多段线上按间距创建点 (setq j 0) (repeat cnt (setq pt (vlax-curve-getpointatdist ent (* j dist))) ;; 验证点是否有效 (if (and pt (listp pt) (>= (length pt) 2)) (progn ;; 确保点有Z坐标 (if (= (length pt) 2) (setq pt (list (car pt) (cadr pt) 0.0))) (command "_ddpoint" pt) (command "_entitydata" (entlast) "Z" elev) (setq elev ( elev 0.1)) ; 更新高程 ) (princ (strcat "\n警告: 在距离 " (rtos (* j dist) 2 2) " 处获取点失败")) ) (setq j (1 j)) ) ;; 在多段线终点添加一个点 (setq pt (vlax-curve-getendpoint ent)) (if (and pt (listp pt) (>= (length pt) 2)) (progn ;; 确保点有Z坐标 (if (= (length pt) 2) (setq pt (list (car pt) (cadr pt) 0.0))) (command "_ddpoint" pt) (command "_entitydata" (entlast) "Z" elev) ) (princ "\n警告: 获取终点失败") ) (setq valid_count (1 valid_count)) ) ) ) (setq i (1 i)) ) ;; 结束撤销标记 (command "_undo" "_end") ;; 输出结果统计 (if (> valid_count 0) (princ (strcat "\n成功处理 " (itoa valid_count) " 条多段线,共创建 " (itoa (fix (/ (- elev base_elev) 0.1))) " 个高程点")) (princ "\n未创建任何高程点,所有选中的多段线均无效") ) (princ) ) ;; 注册命令 (princ "\n多段线批量增加高程点插件已加载...") (princ "\n输入 ADDGCD 启动命令...") (princ)
【实例截图】
【核心代码】;;;========================================= ;;; 多段线批量增加高程点插件 for CASS11 ;;;========================================= ;; 安全执行命令函数 (defun command-s (/ cmd) (setq cmd (list)) (while (setq arg (car cmd)) (setq cmd (cdr cmd)) (command arg) ) ) ;; 获取多段线长度的函数 (defun get-polyline-length (ent / ent_type ent_data len) (setq ent_data (entget ent)) (setq ent_type (cdr (assoc 0 ent_data))) (cond ((= ent_type "LWPOLYLINE") (cdr (assoc 2 ent_data))) ((= ent_type "POLYLINE") (vlax-curve-getdistatparam ent (vlax-curve-getendparam ent))) (T nil) ; 非多段线类型 ) ) (defun C:ADDGCD (/ ss1 i ent pline_len dist cnt pt elev base_elev err_handler valid_count) ;; 错误处理函数 (defun err_handler (msg) (if (/= msg "Function cancelled") (princ (strcat "\n错误: " msg)) ) (princ) ) ;; 设置错误陷阱 (setq *error* err_handler) ;; 开始撤销标记 (command "_undo" "_begin") ;; 选择多段线 (princ "\n请选择多段线: ") (setq ss1 (ssget '((0 . "LWPOLYLINE,POLYLINE")))) (if (= ss1 nil) (progn (alert "请先选择多段线!") (command "_undo" "_end") (exit) ) ) ;; 获取点间距 (setq dist (getreal "\n输入点间距(m): ")) (if (or (= dist nil) (<= dist 0.0)) (progn (alert "无效的间距值!") (command "_undo" "_end") (exit) ) ) ;; 获取起点高程 (setq base_elev (getreal "\n输入起点高程(m): ")) (if (= base_elev nil) (progn (alert "无效的高程值!") (command "_undo" "_end") (exit) ) ) (setq elev base_elev) (setq i 0) (setq valid_count 0) ;; 处理每条选中的多段线 (repeat (sslength ss1) (setq ent (ssname ss1 i)) ;; 获取多段线长度 (setq pline_len (get-polyline-length ent)) ;; 验证实体类型和长度 (if (null pline_len) (princ (strcat "\n警告: 对象 " (itoa i) " 不是有效的多段线!")) ;; 检查多段线长度是否有效 (if (<= pline_len 0.0) (progn ;; 尝试获取多段线顶点数 (setq vertex_count (cond ((= (cdr (assoc 0 (entget ent))) "LWPOLYLINE") (cdr (assoc 90 (entget ent)))) (T (length (ssget "_X" (list (cons 0 "VERTEX") (cons 330 ent))))))) (princ (strcat "\n警告: 多段线 " (itoa i) " 长度为零 (顶点数: " (itoa (if vertex_count vertex_count 0)) ")")) ) ;; 有效多段线处理 (progn ;; 计算点数 (setq cnt (fix (/ pline_len dist))) (setq cnt (max 1 cnt)) ; 至少有一个点 ;; 在多段线上按间距创建点 (setq j 0) (repeat cnt (setq pt (vlax-curve-getpointatdist ent (* j dist))) ;; 验证点是否有效 (if (and pt (listp pt) (>= (length pt) 2)) (progn ;; 确保点有Z坐标 (if (= (length pt) 2) (setq pt (list (car pt) (cadr pt) 0.0))) (command "_ddpoint" pt) (command "_entitydata" (entlast) "Z" elev) (setq elev ( elev 0.1)) ; 更新高程 ) (princ (strcat "\n警告: 在距离 " (rtos (* j dist) 2 2) " 处获取点失败")) ) (setq j (1 j)) ) ;; 在多段线终点添加一个点 (setq pt (vlax-curve-getendpoint ent)) (if (and pt (listp pt) (>= (length pt) 2)) (progn ;; 确保点有Z坐标 (if (= (length pt) 2) (setq pt (list (car pt) (cadr pt) 0.0))) (command "_ddpoint" pt) (command "_entitydata" (entlast) "Z" elev) ) (princ "\n警告: 获取终点失败") ) (setq valid_count (1 valid_count)) ) ) ) (setq i (1 i)) ) ;; 结束撤销标记 (command "_undo" "_end") ;; 输出结果统计 (if (> valid_count 0) (princ (strcat "\n成功处理 " (itoa valid_count) " 条多段线,共创建 " (itoa (fix (/ (- elev base_elev) 0.1))) " 个高程点")) (princ "\n未创建任何高程点,所有选中的多段线均无效") ) (princ) ) ;; 注册命令 (princ "\n多段线批量增加高程点插件已加载...") (princ "\n输入 ADDGCD 启动命令...") (princ)
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论