明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 621|回复: 4

通过DeepSeek-R1写了关于自动生成随机高程点的代码,但是无法运行,请教大家帮忙看看

[复制链接]
发表于 2025-6-25 10:18:15 | 显示全部楼层 |阅读模式
10明经币
写一个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(自动在封闭图形内)/Manual(手动选择位置)] <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格式? [Yes/No] <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修改几次到最终可以用的形式。随机数应该不是很随机。按时间算来的。具体看代码
  1. (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)
  2. ;; 自定义随机数生成函数
  3.   (defun myrandom (/ modulus multiplier increment rand)
  4.     (if (not *seed*)
  5.       (setq *seed* (getvar "DATE"))
  6.     )
  7.     (setq modulus    65536
  8.           multiplier 25173
  9.           increment  13849
  10.           *seed*     (rem (+ (* multiplier *seed*) increment) modulus)
  11.           rand       (/ *seed* modulus)
  12.     )
  13.   )
  14. ;; 在多段线内生成随机点
  15.   (defun getpointinpoly (poly / minpt maxpt pt)
  16.     (vla-getboundingbox (vlax-ename->vla-object poly) 'minpt 'maxpt)
  17.     (setq minpt (vlax-safearray->list minpt)
  18.           maxpt (vlax-safearray->list maxpt))
  19.     (while (not pt)
  20.       (setq pt (list (+ (car minpt) (* (myrandom) (- (car maxpt) (car minpt))))
  21.                      (+ (cadr minpt) (* (myrandom) (- (cadr maxpt) (cadr minpt)))))
  22.       )
  23.       (if (not (ispointinside poly pt)) (setq pt nil))
  24.     )
  25.     pt
  26.   )
  27. ;; 判断点是否在多段线内
  28.   (defun ispointinside (poly pt / ray intersections)
  29.     (setq ray (polar pt (* pi 0.25) 1000))
  30.     (setq intersections
  31.       (vl-remove-if 'null
  32.         (mapcar '(lambda (x) (inters pt ray (car x) (cadr x)))
  33.                 (getpolyedges poly)
  34.         )
  35.       )
  36.     )
  37.     (if (and intersections (= (rem (length intersections) 2) 1)) t nil)
  38.   )
  39. ;; 获取多段线边
  40.   (defun getpolyedges (poly / pts edges)
  41.     (setq pts (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget poly))))
  42.     (setq edges nil)
  43.     (repeat (1- (length pts))
  44.       (setq edges (cons (list (nth (1- (length pts)) pts) (car pts)) edges)
  45.             pts (cdr pts))
  46.     )
  47.     edges
  48.   )
  49.   ;; 选择生成模式
  50.   (initget "Auto Manual")
  51.   (setq mode (getkword "\n选择生成模式 [Auto(自动在封闭图形内)/Manual(手动选择位置)] <Auto>: "))
  52.   (if (not mode) (setq mode "Auto"))
  53.   ;; 自动模式:在封闭图形内生成
  54.   (if (eq mode "Auto")
  55.     (progn
  56.       (while (not ss)
  57.         (setq ss (ssget ":S" '((0 . "LWPOLYLINE"))))
  58.         (if (not ss) (alert "请选择一个封闭的多段线或切换为手动模式!"))
  59.       )
  60.       (setq poly (ssname ss 0))
  61.     )
  62.   )
  63.   ;; 用户输入验证
  64.   (while (not min_val)
  65.     (setq min_val (getreal "\n请输入最小高程值: "))
  66.   )
  67.   (while (or (not max_val) (<= max_val min_val))
  68.     (setq max_val (getreal (strcat "\n请输入最大高程值(必须大于" (rtos min_val 2 2) "): ")))
  69.   )
  70.   (while (not count)
  71.     (setq count (getint "\n要生成的高程点数量: "))
  72.   )
  73.   ;; 生成随机高程列表
  74.   (setq elev_list nil)
  75.   (repeat count
  76.     (if (eq mode "Auto")
  77.       (setq pt (getpointinpoly poly))
  78.       (setq pt (getpoint "\n指定高程点位置: "))
  79.     )
  80.     (setq elev_list (cons (list pt (+ min_val (* (myrandom) (- max_val min_val)))) elev_list))
  81.   )
  82.   ;; 计算统计信息
  83.   (setq max_elev (apply 'max (mapcar 'cadr elev_list))
  84.         min_elev (apply 'min (mapcar 'cadr elev_list))
  85.         sum_elev (apply '+ (mapcar 'cadr elev_list))
  86.         avg_elev (/ sum_elev (float count))
  87.   )
  88.   ;; 显示结果对话框
  89.   (setq msg (strcat "高程点统计信息:\n"
  90.                     "生成数量: " (itoa count) "\n"
  91.                     "最大值: " (rtos max_elev 2 3) "\n"
  92.                     "最小值: " (rtos min_elev 2 3) "\n"
  93.                     "数值和: " (rtos sum_elev 2 3) "\n"
  94.                     "平均值: " (rtos avg_elev 2 3)
  95.             )
  96.   )
  97.   (alert msg)
  98.   ;; 导出选项处理
  99.   (initget "Yes No")
  100.   (setq export (getkword "\n导出为CASS格式? [Yes/No] <No>: "))
  101.   (cond
  102.     ((eq export "Yes")
  103.      (if (setq fname (getfiled "保存CASS文件" "" "dat" 1))
  104.        (progn
  105.          (setq f (open fname "w"))
  106.          (foreach item elev_list
  107.            (write-line (strcat "1," (rtos (car (car item)) 2 3) "," (rtos (cadr (car item)) 2 3) "," (rtos (cadr item) 2 3)) f)
  108.          )
  109.          (close f)
  110.          (alert (strcat "成功导出 " (itoa count) " 个高程点到:\n" fname))
  111.        )
  112.      )
  113.     )
  114.     (t (alert "操作已取消"))
  115.   )
  116.   (princ)
  117. )
  118. (princ "\n随机高程生成插件已加载,输入sjgcd运行。")(princ)

回复

使用道具 举报

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

下载运行  还是提示报错   
回复

使用道具 举报

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

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


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

使用道具 举报

发表于 2025-6-29 11:53:45 | 显示全部楼层
xy524426071 发表于 2025-6-27 09:53
提示   错误: 输入的列表有缺陷

点普通浏览。弹出的窗口。全选。复制,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-26 18:41 , Processed in 0.564645 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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