为什么我用chatgpt写的CAD插件运行都是错的?

周站长 图文教程1 3,8851字数 3748阅读12分29秒阅读模式
CAD自学网会员

Chatgpt最近尤其火爆,那么chatgpt的存在能给用cad绘图的小伙伴们,带来一些什么样的开挂技能呢。

最典型的就是chatgpt可以助力编写lisp插件。在你采用它帮你编写插件之前,你需要了解一下它的编写机制。

Chatgpt是个人工智能型的问答型机器人。换言之,你可以理解成,你在与一个程序员对话,你提出需求,它给你答案。答案的正确与否,需要你不段反馈需求来调试,或者自己根据对方给出的模型,进行验证调试。

以如下需求为例,使用chatgpt反馈一个lisp插件。

需求:编写一个autocadlisp代码,可以测量图形的周长数值,将周长数值通过鼠标插入到图纸。

为什么我用chatgpt写的CAD插件运行都是错的?

反馈的代码如下:

下面是一个可以测量图形周长并插入到图纸中的简单LISP代码:

```lisp

(defun c:measure-perimeter (/ ent sel ss i pl ptlist length)

  (setq ent (car (entsel "\n选择要测量周长的图形:")))

  (if (not ent)

    (prompt "\n未选择有效对象。")

    (progn

      (setq sel (vlax-ename->vla-object ent))

      (setq ss (ssadd))

      (vlax-for i sel

        (setq ptlist (cons (vlax-curve-getstartpoint i) ptlist))

        (setq ptlist (cons (vlax-curve-getendpoint i) ptlist))

      )

      (setq pl (vlax-3d-point (car ptlist)))

      (setq ptlist (cdr ptlist))

      (while ptlist

        (setq pl (vlax-3d-point pl (car ptlist)))

        (setq ptlist (cdr ptlist))

      )

      (setq length (rtos (distance (vlax-variant-value pl) (vlax-curve-getstartpoint (vlax-ename->vla-object ent))) 2))

      (command "._INSERT" "MEASURE" "_M" "_O" ent (list (car (trans (vlax-curve-getstartpoint (vlax-ename->vla-object ent)) 0 1))) 1 1 0 "length=" length)

      (prompt (strcat "\n周长为:" length))

    )

  )

  (princ)

)

```

将上述代码复制到Autocad命令行或者菜单栏的Lisp编辑器中,输入"measure-perimeter"命令即可使用。

将代码复制出,建立lisp文件,在cad中进行运行,这时命令行提示如下内容。

为什么我用chatgpt写的CAD插件运行都是错的?

将提示的错误内容,复制反馈给chatgpt,然后chatgpt反馈出一个修正后的代码。如下。

为什么我用chatgpt写的CAD插件运行都是错的?

参考您提供的错误提示,我猜测之前的代码中使用了一个 `VLA-OBJECT` 类型的集合变量,但实际上需要的是一个单一的 `VLA-OBJECT` 对象。因此,在获取实体对象时,需要使用 `car` 函数将 `ent` 变量转换为单一对象。以下是更新后的代码:

```lisp

(defun c:measure-perimeter (/ ent obj pl length)

  (setq ent (car (entsel "\nSelect an entity:")))

  (if (not ent)

    (prompt "\nNo valid object selected.")

    (progn

      (setq obj (vlax-ename->vla-object ent))

      (setq pl (vlax-invoke obj 'Coordinates))

      (setq pl (append pl (list (car pl))))

      (setq length (rtos (vlax-invoke obj 'Length) 2))

      (command "._INSERT" "MEASURE" "_M" "_O" ent (list (car (trans (vlax-curve-getstartpoint obj) 0 1))) 1 1 0 "length=" length)

      (prompt (strcat "\nPerimeter: " length))

    )

  )

  (princ)

)

```

在这个函数中,我们使用 `vlax-invoke` 函数来获取线条或多边形的坐标,然后用这些坐标来计算周长并将其插入到图纸中。还使用了 `append` 函数来添加起点到点列表的末尾,以计算完整的周长。

请注意,将文本字符串传递给 `command` 函数可能会更加困难。因此在此代码中,我们使用 `_M` 选项(指向自定义测量块)并在该块中包含 `length=` 参数。

在cad中运行后,仍然错误。无法成行。

为什么我用chatgpt写的CAD插件运行都是错的?

再次尝试反馈需求。

为什么我用chatgpt写的CAD插件运行都是错的?

反馈代码如下:

以下是一个测量多段线、圆形和矩形周长的 Autocad Lisp 代码。该代码使用 `entget` 命令来获取实体的属性,以检查实体的类型。如果实体为多段线,则使用 `vlax-curve` 函数计算多段线的周长。如果实体为圆形或矩形,则使用相应的公式计算它的周长。最后,将周长值打印到命令行。

```lisp

(defun c:measure-perimeter (/ selset ss i ent plength)

  (setq selset (ssget ":L" '((0 . "LINE,ARC,CIRCLE,LWPOLYLINE,RECTANG"))))

  (setq ss (sslength selset))

  (if (/= ss 0)

    (progn

      (setq i -1 plength 0.0)

      (repeat ss

        (setq ent (ssname selset (setq i (1+ i))))

        (if (and ent (member (cdr(assoc 0 (entget ent))) '("LINE" "ARC")))

          (setq plength (+ plength (distance (cdr(assoc 10 (entget ent))) (cdr(assoc 11 (entget ent)))))) ;直线、弧线计算公式

          (progn

            (if (equal "CIRCLE" (cdr(assoc 0 (entget ent))))

              (setq plength (+ plength (* pi (cdr(assoc 40 (entget ent))))))   ;圆形计算公式

            )

            (if (equal "LWPOLYLINE" (cdr(assoc 0 (entget ent))))

              (setq plength (+ plength (vlax-curve-getdistatparam (vlax-ename->vla-object ent) (vlax-curve-getendparam (vlax-ename->vla-object ent)))))) ; 多边形计算公式

            (if (equal "RECTANG" (cdr(assoc 0 (entget ent))))

              (setq plength (+ plength (* 2 (- (cdr(assoc 11 (entget ent))) (cdr(assoc 10 (entget ent)))) (+ (cdr(assoc 40 (entget ent))) (cdr(assoc 41 (entget ent))))))) ;矩形计算公式

          )

        )

      )

      (princ (strcat "\nTotal Perimeter : " (rtos plength 2 2)))

    )

    (prompt "\nNo valid objects selected.")

  )

  (princ)

)

```

注意,此代码使用了 `ssget` 函数,它的第二个参数是过滤器列表,用于指定只选择多段线、圆形、矩形和直线等特定类型的实体。如果您希望计算其他类型的对象,可以修改过滤器列表。

此代码还使用了 `rtos` 函数,将计算出的周长值转换为字符串。在这种情况下,我们使用了 `2 2` 参数将结果格式化为两位小数的字符串。

将这段代码在cad中运行。命令行提示列表有缺陷。

为什么我用chatgpt写的CAD插件运行都是错的?

当我们超时反馈问题时(网速限制了我的发挥),对方已经无法根据刚才反馈的代码进行修正反馈。

为什么我用chatgpt写的CAD插件运行都是错的?

以上说明,chatgpt并不总是能够给你反馈出一个符合你预期的答案。但可以给你提供一些思路,如果使用它编写插件,还是需要一定的编程语言基础,在它不能给你反馈问题所在时,你需要自己能看懂并解决代码运行问题。

但是chagpt还在进化,终有一天会更加厉害,多学无害,正如很多人问我,chatgpt让我失业了,我想说的是chatgpt不会让你失业,让你失业的是会使用chatgpt的人。

(完)

CAD自学网公众号
微信扫一扫关注我,每天分享各种免费设计干货小技巧。
weinxin
我的微信
育设学堂服务号
微信扫一扫关注我,各种设计实战全套视频教程在线学。
weinxin
我的公众号
育设学堂建筑学院
周站长
  • 本文由 发表于 2023年3月22日 23:37:59
  • 转载请务必保留本文链接:https://www.cadzxw.com/53060.html
育设学堂CAD课程
    • dsk
      dsk 1

      👍强

    匿名

    发表评论

    匿名网友

    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

    确定