乐筑天下

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

[编程交流] Lisp routin的故障排除

[复制链接]

7

主题

28

帖子

21

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 17:04:49 | 显示全部楼层 |阅读模式
大家好,
 
我的lisp例程代码有一些问题。目标是拾取两个点,并生成一条垂直于点之间角度的连接线,该连接线基于函数内的一些计算进行定位。然而,我得到了一些不稳定的角度,没有真正的一致性。有什么想法吗?
 
  1. (defun c:aspacing () ;define function
  2. (setq a (getpoint "\nFirst Point ")) ;first point
  3. (setq b (getpoint "\nSecond Point ")) ;second point
  4. (setq x (/ (distance a b) 4200)) ;divide distance from a to b by 4200
  5. (setq y (fix (1+ x))) ;round up to next whole number
  6. (setq z1 (/ (distance a b) y))        ;value of S - divide distance a b by y
  7. (setq z2 (/ (/ (distance a b) y) 2))        ;value of half S
  8. (setq ang (* (angle a b) 57.2958))        ;set angle of distance
  9. (setq a1 (polar a ang z2)) ;starting point for xline
  10. (command "xline" a1 (polar a1 (+ ang 90) 100) "") ;xline at 90 degrees to a b angle
  11. ) ;end function
  12. (princ) ;clean loading

 
非常感谢!
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:12:20 | 显示全部楼层
对此不确定,angle*57.2958
 
(+ang 90)Autocad将以弧度为单位工作角度,因此(+ang(/pi 2.0))请注意2.0
 
(setq z2(/(/(距离a b)y)2.0))以确保真正的非整数答案只是良好的内务管理。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:19:16 | 显示全部楼层
我不知道为什么要乘以角度,但以下几点应该会让你走上正确的道路:
  1. (defun c:aspacing ( / a b d )
  2.    (and (setq a (getpoint "\n1st point: "))
  3.         (setq b (getpoint "\n2nd point: " a))
  4.         (setq d (distance a b))
  5.         (entmake
  6.             (list
  7.                '(000 . "XLINE")
  8.                '(100 . "AcDbEntity")
  9.                '(100 . "AcDbXline")
  10.                 (cons 10 (trans (polar a (angle a b) (/ d (fix (1+ (/ d 4200.0))) 2.0)) 1 0))
  11.                 (cons 11 (trans (list (- (cadr a) (cadr b)) (- (car b) (car a))) 1 0 t))
  12.             )
  13.         )
  14.    )
  15.    (princ)
  16. )
回复

使用道具 举报

7

主题

28

帖子

21

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 17:23:45 | 显示全部楼层
 
嘿,比格尔,谢谢你的回复!
 
*57.2958是将弧度转换为度,但是现在,如果我理解正确的话,我发现我不需要这样做,因为代码的其他部分也处理弧度。(+ang(/pi 2.0))是否会使角度增加90度?
 
2.0 for real是一个很好的提示,谢谢。刚开始接触这种编程,学习良好的实践是很有帮助的。谢谢你!
回复

使用道具 举报

7

主题

28

帖子

21

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 17:26:18 | 显示全部楼层
 
嗨,李,
 
我在理解一些代码时有点困难。有没有可能对不同的代码行发表一些评论?
 
我还不太明白和部分是如何工作的。我的理解是,如果所有参数都为真,则返回true。正在测试哪些参数?我也不理解列表或后续代码行。
 
一旦代码变得更通用,我就会迷失方向,因为我仍在努力学习并思考它。
 
非常感谢你迄今为止的帮助!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:31:04 | 显示全部楼层
嗨,迈克尔,
 
首先,这里是一个完整的评论版本的程序,以帮助您的分析:
  1. [color=GREEN];; Define function and declare local variables[/color]
  2. ([color=BLUE]defun[/color] c:aspacing ( [color=BLUE]/[/color] a b d )
  3.    [color=GREEN];; Evaluate each of the following expressions until[/color]
  4.    [color=GREEN];; an expression returns nil or no expressions remain[/color]
  5.    ([color=BLUE]and[/color]
  6.         [color=GREEN];; Prompt the user for the first point, assign result to local variable 'a'[/color]
  7.         ([color=BLUE]setq[/color] a ([color=BLUE]getpoint[/color] [color=MAROON]"\n1st point: "[/color]))
  8.         [color=GREEN];; Prompt the user for the second point (with rubber band to the first point)[/color]
  9.         [color=GREEN];; Assign result to the local variable 'b'[/color]
  10.         [color=GREEN];; Note that by virtue of the AND function being a Special Form, this expression[/color]
  11.         [color=GREEN];; will not be evaluated in the event that the first point prompt returns nil.[/color]
  12.         ([color=BLUE]setq[/color] b ([color=BLUE]getpoint[/color] [color=MAROON]"\n2nd point: "[/color] a))
  13.         [color=GREEN];; Calculate linear distance between points a & b, assign result of calculation[/color]
  14.         [color=GREEN];; to local variable 'd'[/color]
  15.         ([color=BLUE]setq[/color] d ([color=BLUE]distance[/color] a b))
  16.         [color=GREEN];; Append the following DXF data to the current drawing database[/color]
  17.         ([color=BLUE]entmake[/color]
  18.             [color=GREEN];; Construct a DXF list of dotted pairs to append to the database[/color]
  19.             ([color=BLUE]list[/color]
  20.                 [color=GREEN];; DXF Group 0: Entity Type[/color]
  21.                 [color=GREEN];; Fixed data, so expressed as quoted literal dotted pair -[/color]
  22.                 [color=GREEN];; See http://bit.ly/18ftLyF for more information on this concept[/color]
  23.                '(000 . [color=MAROON]"XLINE"[/color])
  24.                 [color=GREEN];; DXF Group 100: Subclass marker designating object type[/color]
  25.                '(100 . [color=MAROON]"AcDbEntity"[/color])
  26.                 [color=GREEN];; DXF Group 100: Subclass marker designating entity type[/color]
  27.                '(100 . [color=MAROON]"AcDbXline"[/color])
  28.                 [color=GREEN];; Construct a dotted pair from the following atoms:[/color]
  29.                 [color=GREEN];; See http://bit.ly/18ftLyF for more information on why this cannot be quoted as a literal[/color]
  30.                 ([color=BLUE]cons[/color]
  31.                     [color=GREEN];; DXF Group 10: WCS Base point for XLine[/color]
  32.                     10
  33.                     [color=GREEN];; Translate the following point from UCS to WCS[/color]
  34.                     ([color=BLUE]trans[/color]
  35.                         [color=GREEN];; Calculate the position of a point relative to point 'a' based on given calculations[/color]
  36.                         ([color=BLUE]polar[/color] a ([color=BLUE]angle[/color] a b) ([color=BLUE]/[/color] d ([color=BLUE]fix[/color] ([color=BLUE]1+[/color] ([color=BLUE]/[/color] d 4200.0))) 2.0))
  37.                         1 0
  38.                     ) [color=GREEN];; end trans[/color]
  39.                 ) [color=GREEN];; end cons[/color]
  40.                 [color=GREEN];; Construct a dotted pair from the following atoms:[/color]
  41.                 ([color=BLUE]cons[/color]
  42.                     [color=GREEN];; DXF Group 11: WCS vector defining XLine direction[/color]
  43.                     11
  44.                     [color=GREEN];; Translate the following point from UCS to WCS, independent of UCS origin[/color]
  45.                     ([color=BLUE]trans[/color]
  46.                         [color=GREEN];; Calculate a UCS vector perpendicular to a->b[/color]
  47.                         ([color=BLUE]list[/color] ([color=BLUE]-[/color] ([color=BLUE]cadr[/color] a) ([color=BLUE]cadr[/color] b)) ([color=BLUE]-[/color] ([color=BLUE]car[/color] b) ([color=BLUE]car[/color] a)))
  48.                         1 0 [color=BLUE]t[/color]
  49.                     ) [color=GREEN];; end trans[/color]
  50.                 ) [color=GREEN];; end cons[/color]
  51.             ) [color=GREEN];; end list[/color]
  52.         ) [color=GREEN];; end entmake[/color]
  53.    ) [color=GREEN];; end and[/color]
  54.    [color=GREEN];; Suppress the value returned by the last evaluated expression (AND returns t/nil)[/color]
  55.    ([color=BLUE]princ[/color])
  56. ) [color=GREEN];; end defun[/color]

 
本例中使用AutoLISP和函数更方便生成简洁的代码,但可能以可读性为代价。该示例也可以使用简单的if语句编写,但是,还必须使用progn函数使多个表达式能够作为单个“then”参数表达式的一部分进行计算:
  1. [color=GREEN];; Define function and declare local variables[/color]
  2. ([color=BLUE]defun[/color] c:aspacing ( [color=BLUE]/[/color] a b d )
  3.    [color=GREEN];; If the following test expression returns a non-nil value[/color]
  4.    ([color=BLUE]if[/color]
  5.        [color=GREEN];; Evaluate each of the following expressions until[/color]
  6.        [color=GREEN];; an expression returns nil or no expressions remain[/color]
  7.        ([color=BLUE]and[/color]
  8.            [color=GREEN];; Prompt the user for the first point, assign result to local variable 'a'[/color]
  9.            ([color=BLUE]setq[/color] a ([color=BLUE]getpoint[/color] [color=MAROON]"\n1st point: "[/color]))
  10.            [color=GREEN];; Prompt the user for the second point (with rubber band to the first point)[/color]
  11.            [color=GREEN];; Assign result to the local variable 'b'[/color]
  12.            [color=GREEN];; Note that by virtue of the AND function being a Special Form, this expression[/color]
  13.            [color=GREEN];; will not be evaluated in the event that the first point prompt returns nil.[/color]
  14.            ([color=BLUE]setq[/color] b ([color=BLUE]getpoint[/color] [color=MAROON]"\n2nd point: "[/color] a))
  15.        ) [color=GREEN];; end and[/color]
  16.        [color=GREEN];; Evaluate the following expressions as a single expression[/color]
  17.        [color=GREEN];; constituting the 'then' argument for the IF function[/color]
  18.        ([color=BLUE]progn[/color]
  19.            [color=GREEN];; Calculate linear distance between points a & b, assign result of calculation[/color]
  20.            [color=GREEN];; to local variable 'd'[/color]
  21.            ([color=BLUE]setq[/color] d ([color=BLUE]distance[/color] a b))
  22.            [color=GREEN];; Append the following DXF data to the current drawing database[/color]
  23.            ([color=BLUE]entmake[/color]
  24.                [color=GREEN];; Construct a DXF list of dotted pairs to append to the database[/color]
  25.                ([color=BLUE]list[/color]
  26.                    [color=GREEN];; DXF Group 0: Entity Type[/color]
  27.                    [color=GREEN];; Fixed data, so expressed as quoted literal dotted pair -[/color]
  28.                    [color=GREEN];; See http://bit.ly/18ftLyF for more information on this concept[/color]
  29.                   '(000 . [color=MAROON]"XLINE"[/color])
  30.                    [color=GREEN];; DXF Group 100: Subclass marker designating object type[/color]
  31.                   '(100 . [color=MAROON]"AcDbEntity"[/color])
  32.                    [color=GREEN];; DXF Group 100: Subclass marker designating entity type[/color]
  33.                   '(100 . [color=MAROON]"AcDbXline"[/color])
  34.                    [color=GREEN];; Construct a dotted pair from the following atoms:[/color]
  35.                    [color=GREEN];; See http://bit.ly/18ftLyF for more information on why this cannot be quoted as a literal[/color]
  36.                    ([color=BLUE]cons[/color]
  37.                        [color=GREEN];; DXF Group 10: WCS Base point for XLine[/color]
  38.                        10
  39.                        [color=GREEN];; Translate the following point from UCS to WCS[/color]
  40.                        ([color=BLUE]trans[/color]
  41.                            [color=GREEN];; Calculate the position of a point relative to point 'a' based on given calculations[/color]
  42.                            ([color=BLUE]polar[/color] a ([color=BLUE]angle[/color] a b) ([color=BLUE]/[/color] d ([color=BLUE]fix[/color] ([color=BLUE]1+[/color] ([color=BLUE]/[/color] d 4200.0))) 2.0))
  43.                            1 0
  44.                        ) [color=GREEN];; end trans[/color]
  45.                    ) [color=GREEN];; end cons[/color]
  46.                    [color=GREEN];; Construct a dotted pair from the following atoms:[/color]
  47.                    ([color=BLUE]cons[/color]
  48.                        [color=GREEN];; DXF Group 11: WCS vector defining XLine direction[/color]
  49.                        11
  50.                        [color=GREEN];; Translate the following point from UCS to WCS, independent of UCS origin[/color]
  51.                        ([color=BLUE]trans[/color]
  52.                            [color=GREEN];; Calculate a UCS vector perpendicular to a->b[/color]
  53.                            ([color=BLUE]list[/color] ([color=BLUE]-[/color] ([color=BLUE]cadr[/color] a) ([color=BLUE]cadr[/color] b)) ([color=BLUE]-[/color] ([color=BLUE]car[/color] b) ([color=BLUE]car[/color] a)))
  54.                            1 0 [color=BLUE]t[/color]
  55.                        ) [color=GREEN];; end trans[/color]
  56.                    ) [color=GREEN];; end cons[/color]
  57.                ) [color=GREEN];; end list[/color]
  58.            ) [color=GREEN];; end entmake[/color]
  59.       ) [color=GREEN];; end progn[/color]
  60.    ) [color=GREEN];; end if[/color]
  61.    [color=GREEN];; Suppress the value returned by the last evaluated expression[/color]
  62.    ([color=BLUE]princ[/color])
  63. ) [color=GREEN];; end defun[/color]

 
非常欢迎您-如果您对发布的代码还有其他问题,请随时提问。
回复

使用道具 举报

7

主题

28

帖子

21

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 17:35:04 | 显示全部楼层
一旦它进入了代码的entmake和list部分,它就会越过我的大脑。我想我对Lisp编程的这些部分没有足够的理解。我必须去做更多的研究!我会在你的网站上查看教程,还有其他你可以推荐的吗?谢谢你的帮助!
 
继续从代码的实际功能开始-我想向这个命令添加一些东西,但不知道如何进行。我希望第一条xline偏移多次,这样xline的总数=d/4200的四舍五入值。连接线之间的距离必须相等,但端点和所选两点之间的距离必须为该距离的一半。这有意义吗?
 
这可以通过一个简单的偏移命令(同样,我不知道很多基础知识,这是我唯一真正的想法)来实现吗,即从第一个点到第二个点的距离的2倍?
 
我还有更多的事情要补充,但在这个阶段还需要一小步。谢谢你!
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:39:56 | 显示全部楼层
如果你在与entmake作斗争,并且了解dxf代码可能会让人望而却步,那么现在就回到老式。
 
  1. (defun c:aspacing ( / a b d )
  2.    (and (setq a (getpoint "\n1st point: "))
  3.         (setq b (getpoint "\n2nd point: " a))
  4.         (setq d (distance a b))
  5.         (setq pt1 (trans (polar a (angle a b) (/ d (fix (1+ (/ d 4200.0))) 2.0)) 1 0))
  6.         (setq pt2 (trans (list (- (cadr a) (cadr b)) (- (car b) (car a))) 1 0 t))
  7.         (command "XLINE" pt1 pt2 "")
  8.    )
  9.    (princ)
  10. )

 
请张贴您想要的图片或图纸,使其清晰。
回复

使用道具 举报

7

主题

28

帖子

21

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 17:47:32 | 显示全部楼层
嗨,比格尔,
 
你的代码结构似乎与我最初的帖子相似。这似乎更直接(至少对我来说)遵循一种又一种方法。至少在我看来是这样的。谢谢你的回复!
 
我对这个司令部有一个很大的总体规划。下面附上的是我试图实现这一部分命令的图像 180450j3k3fv313qqnlv2w.jpg
 
xline(图像中应该是黄色的,不是很黄)是我希望命令绘制的部分,我不需要任何尺寸、文本、圆或灰线,只需要xline。
 
这对之前的帖子有意义吗?XLine的数量需要
如果这有意义的话。(距离/4200的四舍五入值)
 
谢谢你的帮助!
回复

使用道具 举报

7

主题

28

帖子

21

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 17:50:02 | 显示全部楼层
也许我应该补充一下我对命令其余部分的计划。
 
我希望命令在绘制xline后第二次重复,但方向不同。
 
在第二次运行时,它需要-
获取第二个方向的两点之间的距离(值0)
获取两条现有连接线之间的距离。(值1)
将12000除以值1。(值2)
将值2乘以1000(值3)
将值0除以值3(值4)
将值4四舍五入到最接近的整数(值5)
使用值5作为在第二个方向上间隔的连接线数,在末端保留半个x。
 
基本上,如果我可以在第二个方向重复这个命令,它将允许我创建一个如下图所示的网格,其中网格矩形不超过12平方米。
 
180452z5xnd6kqd565ku5r.jpg
 
我希望这有意义。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 09:40 , Processed in 0.425311 second(s), 85 queries .

© 2020-2025 乐筑天下

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