乐筑天下

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

[编程交流] 创建面板-LISP

[复制链接]

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 09:31:49 | 显示全部楼层 |阅读模式
大家好,
我试图编写一个lisp程序,在给定的矩形区域中创建面板。
程序将要求用户提供矩形区域的宽度和高度。然后它询问面板宽度和面板高度。然后,它将提示输入矩形区域的左下角。完成。。。但有什么事让我踌躇不前。循环没有结束,它只会继续创建第一列。
可能有什么问题?
这是代码
  1. (defun c:pn ()
  2. (setq Width (getdist "\nWidth of area to be filled : "));Getting the total Width of the area to fill
  3. (setq Height (getdist "\nHeight of area to be filled : "));Getting the total Height of the area to fill
  4. (setq PanelWidth (getdist "\nWidth of the panel : "));Getting Width of the panel
  5. (setq PanelHeight (getdist "\nHeight of the panel : "));Getting Height of the panel
  6. (setq XNumberOfPanels (fix (/ Width PanelWidth)));Calculating Number of panels in X Direction
  7. (setq YNumberOfPanels (fix (/ Height PanelHeight)));Calculating Number of panels in Y Direction
  8. (setq Gap (/(- Width (* XNumberOfPanels PanelWidth)) (+ XNumberOfPanels 1)));Calculating Gap between the panels
  9. (setq Pnt (getpoint "\nPick the Bottom Left Corner of the area to be filled : "));Getting the insertion Point
  10. (setq YPnt Pnt)
  11. (setq x 0);Counter for X Direction
  12. (setq y 0);Counter for Y Direction
  13. (setq COSMode (getvar 'OSMODE));Storing the value of Current OSMode
  14. (setvar 'OSMODE 0);Switching Off all Object snaps
  15. (setq Pnt (List (+  (car Pnt) Gap) (+ (cadr Pnt) Gap)));Computing the starting point of the first Rectangle, which is away by one Gap distance along X and one Gap distance along Y
  16. (while (<= x XNumberOfPanels)
  17.    (while (<= y YNumberOfPanels)
  18.       (setq Pnt1 (list (car Pnt) (+ (cadr pnt) Gap)))
  19.       (setq Pnt2 (Polar Pnt1 (rad 90) PanelHeight))
  20.       (setq Pnt3 (Polar Pnt2 (rad 0) PanelWidth))
  21.       (setq Pnt4 (Polar Pnt3 (rad 270) PanelHeight))
  22.       (command "PLine" Pnt1 Pnt2 Pnt3 Pnt4 "Close")
  23.       (setq Pnt Pnt2)
  24.       ;(alert (strcat "x is " (itoa x)))
  25.       (setq x (+ x 1))
  26.    );Ending While Loop for Y Direction
  27. (setq Pnt (list (+ (car YPnt) Gap (* PanelWidth y)) (+ (cadr YPnt) Gap)))
  28. (set y (+ y 1))
  29. );Ending While Loop for X Direction
  30. (setvar 'OSMODE COSMode);Setting OSMode back to initial value
  31. (princ);Silent ending
  32. )
  33. ;Function to convert Degrees to Radians
  34. (defun rad (Ang)
  35. (* 0.01745329 Ang)
  36. )
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 09:49:32 | 显示全部楼层
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 10:05:13 | 显示全部楼层
Couple of suggestion you can reduce number of picks to two you have 5 now if your panel is always drawn perpendicular etc
 
Pick Point lower left, pick upper right its easy to work out x dist and y dist and you have your start point also.
 
(setq pt1 (getpoint))   (car pt1) = pt1x   (cadr pt1) =pt1y
(setq pt2 (getpoint))    (car pt2) = pt2x   (cadr pt2) =pt2y
L= (distance pt1x pt2x)
回复

使用道具 举报

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 10:17:03 | 显示全部楼层
It is simple great idea... Thankyou BIGAL and MSASU....
回复

使用道具 举报

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 10:31:56 | 显示全部楼层
Atlast....,
Here is the final code which works like a charm...!!!
 
  1. (defun c:dp () (setvar 'OSMODE 16383) (setq pt1 (getpoint "\nPick lower left corner of fill area : ")) (setq pt1x (car pt1)) (setq pt1y (cadr pt1)) (setq pt2 (getpoint  "\nPick upper right corner of fill area : ")) (setq pt2x (car pt2)) (setq pt2y (cadr pt2)) (setq Width (abs(- pt2x pt1x))) (setq Height (abs(- pt2y pt1y))) (setq pnpt1 (getpoint "\nPick lower left corner of panel : ")) (setq pnpt1x (car pnpt1)) (setq pnpt1y (cadr pnpt1)) (setq pnpt2 (getpoint  "\nPick upper right corner of panel : ")) (setq pnpt2x (car pnpt2)) (setq pnpt2y (cadr pnpt2)) (setq PanelWidth (abs(- pnpt2x pnpt1x))) (setq PanelHeight (abs(- pnpt2y pnpt1y))) (setq XDivisions (fix (/ Width PanelWidth))) (setq xgap (/ (- Width (* XDivisions PanelWidth)) (+ XDivisions 1))) (setq YDivisions (fix (/ Height PanelHeight))) (setq ygap (/ (- Height (* YDivisions PanelHeight)) (+ YDivisions 1))) (setq x 0) (setq y 0) (setvar 'OSMODE 0) (setq IP (List (+ (car pt1) xgap) (+ ygap (cadr pt1)))) (While (< x XDivisions)   (While (< y YDivisions)     (prompt (strcat "\n Number:" (itoa x)))     (setq p1 IP)     (setq p2 (polar p1 (rad 90) PanelHeight))     (setq p3 (polar p2 (rad 0) PanelWidth))     (setq p4 (polar p3 (rad 270) PanelHeight))     (command "PLINE" p1 p2 p3 p4 "CLOSE")     (setq y (+ 1 y))     (setq IP (List (car p2) (+ ygap (cadr p2))))   )   (setq y 0)   (setq x (+ 1 x))   (setq IP (List (+ (car pt1) (+ (* x xgap) xgap) (* x PanelWidth)) (+ ygap (cadr pt1)))) ) (setvar 'OSMODE 16383) (princ));Function to Convert Degrees to Radians(defun rad (Degrees) (* Degrees 0.0174532925))
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 01:48 , Processed in 0.403379 second(s), 62 queries .

© 2020-2025 乐筑天下

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