xy524426071 发表于 2025-6-25 10:18:15

通过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)


嘒彼小星 发表于 2025-6-26 12:34:02

在你的基础上通过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)

xy524426071 发表于 7 天前

嘒彼小星 发表于 2025-6-26 12:34
在你的基础上通过ai修改几次到最终可以用的形式。随机数应该不是很随机。按时间算来的。具体看代码

下载运行还是提示报错   

xy524426071 发表于 7 天前

嘒彼小星 发表于 2025-6-26 12:34
在你的基础上通过ai修改几次到最终可以用的形式。随机数应该不是很随机。按时间算来的。具体看代码

提示   错误: 输入的列表有缺陷


方便将lisp文件发我吗CAD2006用524426071@qq.com

嘒彼小星 发表于 5 天前

xy524426071 发表于 2025-6-27 09:53
提示   错误: 输入的列表有缺陷




点普通浏览。弹出的窗口。全选。复制,
页: [1]
查看完整版本: 通过DeepSeek-R1写了关于自动生成随机高程点的代码,但是无法运行,请教大家帮忙看看