乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 9|回复: 8

[编程交流] (defun c:我需要的LISP)

[复制链接]

23

主题

102

帖子

79

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 09:10:05 | 显示全部楼层 |阅读模式
敬礼
 
在这个线程中,希望会有一个我想要和需要的最后lisp
 
首先,我需要一些测量面积的方法,比如说矩形。
 
  1. (defun c:xxx (/ pt1 pt2 pt3 pt4 ltbay1 bay num_br)
  2. (setq pt1 (getpoint "/nTop:"))
  3. (setq pt2 (getcorner "/nBottom" pt1))
  4. (setq pt3 (list (nth 0 pt2)(nth 1 pt1)))
  5. (setq pt4 (list (nth 0 pt1)(nth 1 pt2)))
  6. (command "_rectang" pt1 pt2)  ;;;; i can live without actually drawing it but at this stage of lisp i want it there
  7. (setq ltbay1 (rtos (- (nth 0 pt3) (nth 0 pt1)) 4 1)) ;; i want to measure distance of one side of rectangle
  8. (setq num_br (1+ (fix (/ ltbay1 (rtos 15 4 1)))))
  9. (print num_br)

 
 
我的错误是通过将一个点的x坐标从另一个点上减去来测量“距离”,我不知道还有其他方法可以获得该距离,当我看到这个问题没有帮助时,我添加了rtos
我还谈到了在xy轴的不同象限中指定矩形的问题
但现在我用最简单的方法
 
我希望有意见和建议
回复

使用道具 举报

22

主题

326

帖子

185

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-6 09:18:16 | 显示全部楼层
您在第1行中将ltbay1设置为字符串,并且字符串不能在数学/第2行中使用
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:24:39 | 显示全部楼层
我不太明白为什么要沿一侧(X轴?)分割线性距离然而,在15之前,有一种方法可以获得绘制的矩形的面积:
 
  1. (defun c:XXX ( / pt1 pt2 recArea)
  2. (princ "\rRECTANGLE + AREA ")
  3. (vl-load-com)
  4. (if (and (setq pt1 (getpoint "\nSpecify start point: "))
  5.    (not (initget 32))
  6.    (setq pt2 (getpoint pt1 "\nSpecify end point: ")))
  7.    (progn
  8.      (entlast)
  9.      (command "._rectang" pt1 pt2)
  10.      (if (setq recArea (vla-get-area (vlax-ename->vla-object (entlast))))
  11.        (prompt (strcat "\nArea = " (rtos recArea 4 1)))))
  12.    (cond (pt1 (prompt "\n** Invalid input: Must specify end point ** "))
  13.        ((prompt "\n** Invalid input: Must specify start point ** "))))
  14. (princ))

 
备注-未经测试,写在我的MacBook上
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:42:52 | 显示全部楼层
 
别担心。。。如果你可以发布其余的代码,或者澄清你需要什么额外的计算,也许我(或者更聪明的人)能够帮助建议一种更有效的方法来做你需要的事情?
回复

使用道具 举报

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 09:44:48 | 显示全部楼层
新手代码。希望有帮助
 
  1. (defun c:test ( / pt1 pt2 x y area)
  2. (if
  3. (and
  4.    (setq pt1 (getpoint "\nPick top corner  :"))
  5. (setq pt2 (getcorner "\nPick bottom corner  :" pt1))
  6. (command "_.rectang" pt1 pt2)
  7. )
  8. (setq x (abs (- (car pt2) (car pt1))))
  9. (setq y (abs (- (cadr pt2) (cadr pt1))))      
  10. (setq area (/ (* x y) 12))
  11. (princ (strcat "\nLenght of x is  : " (rtos x)))
  12. (princ (strcat "\nLenght of y is  : " (rtos y)))
  13. (princ (strcat "\nArea of rec is  : " (rtos area)))
  14. (princ)
  15. )
  16. )
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:56:21 | 显示全部楼层
下面是另一种方法,通过一些注释来帮助解释代码的作用:
 
  1. [color=green];; This is a keyboard shortcut[/color]
  2. (defun c:RECA () (c:RectangleArea))
  3. [color=green];; This is the main function[/color]
  4. (defun c:RectangleArea ( / *error* oldCmdecho pt1 pt2 x y)
  5. [color=green]  ;; This loads the visual lisp library, and makes ActiveX available[/color]
  6. (vl-load-com)
  7. [color=green]  ;; This displays the command name at the command line.[/color]
  8. (princ "\rRECTANGLE+AREA ")
  9. [color=green]  ;; This is an error handler which is only in use during this function.[/color]
  10. (defun *error*  (msg)
  11. [color=green]    ;; In the event of an error, this will restore the original[/color]
  12. [color=green]    ;; system variable setting, *IF* that variable is defined.[/color]
  13.    (and oldCmdecho (setvar 'cmdecho oldCmdecho))
  14.    (cond ((not msg))                             [color=green]                      ; Normal exit[/color]
  15.          ((member msg '("Function cancelled" "quit / exit abort")))[color=green]     ; <esc> or (quit)[/color]
  16.          ((princ (strcat "\n** Error: " msg " ** ")))) [color=green]                ; Fatal error, display it[/color]
  17.    (princ))
  18. [color=green]  ;; This stores the current system variable value, and sets it[/color]
  19. [color=green]  ;; to not echo the command prompts that would normally be shown.[/color]
  20. (and (setq oldCmdecho (getvar 'cmdecho)) (setvar 'cmdecho 0))
  21. (if (and (setq pt1 (getpoint "\nPick top corner  :"))
  22. [color=#008000]           ;; This dashes the selection line from pt1[/color]
  23.           (not (initget 32))
  24.           (setq pt2 (getcorner pt1 "\nPick bottom corner  :"))
  25. [color=green]           ;; vl-cmdf returns T, whereas command returns NIL.[/color]
  26. [color=green]           ;; Using command would prevent your code from completing the[/color]
  27. [color=green]           ;; "AND" statement.[/color]
  28.           (vl-cmdf "_.rectang" pt1 pt2))
  29. [color=green]    ;; Here I've combined several steps into one for simplicity.[/color]
  30.    (princ
  31.      (strcat
  32.        "\nLength of x is  : "
  33.        (rtos (setq x (abs (- (car pt2) (car pt1)))))
  34.        "\nLenght of y is  : "
  35.        (rtos (setq y (abs (- (cadr pt2) (cadr pt1)))))
  36.        "\nArea of rec is  : "
  37.        (rtos (/ (* x y) 12)))))
  38. [color=green];; If the code performs normally, and no errors (or Esc),[/color]
  39. [color=green]  ;; this will restore the original system variable setting.[/color]
  40. (setvar 'cmdecho oldCmdecho)
  41. (princ))

 
希望这有帮助!
回复

使用道具 举报

23

主题

102

帖子

79

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 09:57:44 | 显示全部楼层
这是lisp的主要思想
 
我看到了一个简单的例子
101009w70vs4jqhff4rz8q.jpg
回复

使用道具 举报

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 10:04:25 | 显示全部楼层
为什么不使用DIVIDE或MEASURE命令。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 10:12:00 | 显示全部楼层
“分割和测量”不考虑可能需要的边缘偏移。这是一篇针对同一主题的新帖子,已经得到了广泛的评论。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-7 05:07 , Processed in 0.804604 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表