通过DeepSeek-R1写了关于自动生成随机高程点的代码,但是无法运行,请教大家帮忙看看
写一个CAD的LSP插件,要求如下1,在封闭的图形范围内,生成随机高程,如果没有封闭图形,则是用户自己进行位置选择,启动命令:sjgcd2,用户可以自定义随机高程值的范围3,生成完成后以弹窗形式将生成的高程点信息显示在屏幕中 内容包含生成的随机高程个数,最大值,最小值,数值和,高程点的平均数4,弹窗用户进行确认后,提示是否导出高程,若导出,则导出Cass格式,若不导出,则退出以下为代码:
(defun c:sjgcd (/ ss poly min_val max_val count elev_list max_elev min_elev sum_elev avg_elev msg export fname f pt mode);; 初始化随机种子(setq *random-state* (seed (getvar "DATE"))) ;; 选择生成模式(initget "Auto Manual")(setq mode (getkword "\n选择生成模式 <Auto>: "))(if (not mode) (setq mode "Auto")) ;; 自动模式:在封闭图形内生成(if (eq mode "Auto") (progn (while (not ss) (setq ss (ssget ":S" '((0 . "LWPOLYLINE")))) (if (not ss) (alert "请选择一个封闭的多段线或切换为手动模式!"))) (setq poly (ssname ss 0)))) ;; 用户输入验证(while (not min_val) (setq min_val (getreal "\n请输入最小高程值: "))) (while (or (not max_val) (<= max_val min_val)) (setq max_val (getreal (strcat "\n请输入最大高程值(必须大于" (rtos min_val 2 2) "): ")))) (while (not count) (setq count (getint "\n要生成的高程点数量: "))) ;; 生成随机高程列表(setq elev_list nil)(repeat count (if (eq mode "Auto") (setq pt (getpointinpoly poly)) (setq pt (getpoint "\n指定高程点位置: "))) (setq elev_list (cons (list pt (+ min_val (* (random) (- max_val min_val)))) elev_list))) ;; 计算统计信息(setq max_elev (apply 'max (mapcar 'cadr elev_list)) min_elev (apply 'min (mapcar 'cadr elev_list)) sum_elev (apply '+ (mapcar 'cadr elev_list)) avg_elev (/ sum_elev (float count))) ;; 显示结果对话框(setq msg (strcat "高程点统计信息:\n" "生成数量: " (itoa count) "\n" "最大值: " (rtos max_elev 2 3) "\n" "最小值: " (rtos min_elev 2 3) "\n" "数值和: " (rtos sum_elev 2 3) "\n" "平均值: " (rtos avg_elev 2 3))) (alert msg) ;; 导出选项处理(initget "Yes No")(setq export (getkword "\n导出为CASS格式? <No>: ")) (cond ((eq export "Yes") (if (setq fname (getfiled "保存CASS文件" "" "dat" 1)) (progn (setq f (open fname "w")) (foreach item elev_list (write-line (strcat "1," (rtos (car (car item)) 2 3) "," (rtos (cadr (car item)) 2 3) "," (rtos (cadr item) 2 3)) f)) (close f) (alert (strcat "成功导出 " (itoa count) " 个高程点到:\n" fname))))) (t (alert "操作已取消"))) (princ));; 辅助函数:在多段线内生成随机点(defun getpointinpoly (poly / minpt maxpt pt)(vla-getboundingbox (vlax-ename->vla-object poly) 'minpt 'maxpt)(setq minpt (vlax-safearray->list minpt) maxpt (vlax-safearray->list maxpt))(while (not pt) (setq pt (list (+ (car minpt) (* (random) (- (car maxpt) (car minpt)))) (+ (cadr minpt) (* (random) (- (cadr maxpt) (cadr minpt)))))) (if (not (ispointinside poly pt)) (setq pt nil)))pt);; 辅助函数:判断点是否在多段线内(defun ispointinside (poly pt / ray)(setq ray (polar pt (* pi 0.25) 1000))(remq nil (mapcar '(lambda (x) (inters pt ray (car x) (cadr x))) (getpolyedges poly))));; 辅助函数:获取多段线边(defun getpolyedges (poly / pts edges)(setq pts (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget poly))))(setq edges nil)(repeat (1- (length pts)) (setq edges (cons (list (nth (1- (length pts)) pts) (car pts)) edges) pts (cdr pts)))edges)(princ "\n随机高程生成插件已加载,输入sjgcd运行。")(princ)
在你的基础上通过ai修改几次到最终可以用的形式。随机数应该不是很随机。按时间算来的。具体看代码(defun c:sjgcd (/ ss poly min_val max_val count elev_list max_elev min_elev sum_elev avg_elev msg export fname f pt mode)
;; 自定义随机数生成函数
(defun myrandom (/ modulus multiplier increment rand)
(if (not *seed*)
(setq *seed* (getvar "DATE"))
)
(setq modulus 65536
multiplier 25173
increment13849
*seed* (rem (+ (* multiplier *seed*) increment) modulus)
rand (/ *seed* modulus)
)
)
;; 在多段线内生成随机点
(defun getpointinpoly (poly / minpt maxpt pt)
(vla-getboundingbox (vlax-ename->vla-object poly) 'minpt 'maxpt)
(setq minpt (vlax-safearray->list minpt)
maxpt (vlax-safearray->list maxpt))
(while (not pt)
(setq pt (list (+ (car minpt) (* (myrandom) (- (car maxpt) (car minpt))))
(+ (cadr minpt) (* (myrandom) (- (cadr maxpt) (cadr minpt)))))
)
(if (not (ispointinside poly pt)) (setq pt nil))
)
pt
)
;; 判断点是否在多段线内
(defun ispointinside (poly pt / ray intersections)
(setq ray (polar pt (* pi 0.25) 1000))
(setq intersections
(vl-remove-if 'null
(mapcar '(lambda (x) (inters pt ray (car x) (cadr x)))
(getpolyedges poly)
)
)
)
(if (and intersections (= (rem (length intersections) 2) 1)) t nil)
)
;; 获取多段线边
(defun getpolyedges (poly / pts edges)
(setq pts (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget poly))))
(setq edges nil)
(repeat (1- (length pts))
(setq edges (cons (list (nth (1- (length pts)) pts) (car pts)) edges)
pts (cdr pts))
)
edges
)
;; 选择生成模式
(initget "Auto Manual")
(setq mode (getkword "\n选择生成模式 <Auto>: "))
(if (not mode) (setq mode "Auto"))
;; 自动模式:在封闭图形内生成
(if (eq mode "Auto")
(progn
(while (not ss)
(setq ss (ssget ":S" '((0 . "LWPOLYLINE"))))
(if (not ss) (alert "请选择一个封闭的多段线或切换为手动模式!"))
)
(setq poly (ssname ss 0))
)
)
;; 用户输入验证
(while (not min_val)
(setq min_val (getreal "\n请输入最小高程值: "))
)
(while (or (not max_val) (<= max_val min_val))
(setq max_val (getreal (strcat "\n请输入最大高程值(必须大于" (rtos min_val 2 2) "): ")))
)
(while (not count)
(setq count (getint "\n要生成的高程点数量: "))
)
;; 生成随机高程列表
(setq elev_list nil)
(repeat count
(if (eq mode "Auto")
(setq pt (getpointinpoly poly))
(setq pt (getpoint "\n指定高程点位置: "))
)
(setq elev_list (cons (list pt (+ min_val (* (myrandom) (- max_val min_val)))) elev_list))
)
;; 计算统计信息
(setq max_elev (apply 'max (mapcar 'cadr elev_list))
min_elev (apply 'min (mapcar 'cadr elev_list))
sum_elev (apply '+ (mapcar 'cadr elev_list))
avg_elev (/ sum_elev (float count))
)
;; 显示结果对话框
(setq msg (strcat "高程点统计信息:\n"
"生成数量: " (itoa count) "\n"
"最大值: " (rtos max_elev 2 3) "\n"
"最小值: " (rtos min_elev 2 3) "\n"
"数值和: " (rtos sum_elev 2 3) "\n"
"平均值: " (rtos avg_elev 2 3)
)
)
(alert msg)
;; 导出选项处理
(initget "Yes No")
(setq export (getkword "\n导出为CASS格式? <No>: "))
(cond
((eq export "Yes")
(if (setq fname (getfiled "保存CASS文件" "" "dat" 1))
(progn
(setq f (open fname "w"))
(foreach item elev_list
(write-line (strcat "1," (rtos (car (car item)) 2 3) "," (rtos (cadr (car item)) 2 3) "," (rtos (cadr item) 2 3)) f)
)
(close f)
(alert (strcat "成功导出 " (itoa count) " 个高程点到:\n" fname))
)
)
)
(t (alert "操作已取消"))
)
(princ)
)
(princ "\n随机高程生成插件已加载,输入sjgcd运行。")(princ)
嘒彼小星 发表于 2025-6-26 12:34
在你的基础上通过ai修改几次到最终可以用的形式。随机数应该不是很随机。按时间算来的。具体看代码
下载运行还是提示报错 嘒彼小星 发表于 2025-6-26 12:34
在你的基础上通过ai修改几次到最终可以用的形式。随机数应该不是很随机。按时间算来的。具体看代码
提示 错误: 输入的列表有缺陷
方便将lisp文件发我吗CAD2006用524426071@qq.com
xy524426071 发表于 2025-6-27 09:53
提示 错误: 输入的列表有缺陷
点普通浏览。弹出的窗口。全选。复制,
页:
[1]