乐筑天下

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

[编程交流] 帮我解决这个关于DI的Lisp程序的问题

[复制链接]

7

主题

26

帖子

19

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 17:43:08 | 显示全部楼层 |阅读模式
你好
 
谁能帮我让这个Lisp程序的工作。
在*DIM*命令中,lisp应转到您选择的层(按1或2)。
 
放置尺寸后,图层应返回到选择“DIM”命令之前的图层。
 
这是现在的代码。
 
  1. ; AFKORTINGEN VAN DE VARIABELEN
  2. ;  ADDL Automatic dimension layer
  3. ;****************************************************************************
  4. (defun CommandReactor:Start ()
  5. (or *CommandReactor*
  6.      (setq *CommandReactor*
  7.             (vlr-command-reactor
  8.               nil
  9.               '(
  10.                 (:vlr-commandcancelled . CommandReactor:CommandEnded)
  11.                 (:vlr-commandended . CommandReactor:CommandEnded)
  12.                 (:vlr-commandfailed . CommandReactor:CommandEnded)
  13.                 (:vlr-commandwillstart . CommandReactor:CommandWillStart)
  14.                )
  15.             )
  16.      )
  17. )
  18. (prompt "\nCommand reactor loaded. ")
  19. (princ)
  20. )
  21. ;****************************************************************************
  22. (defun CommandReactor:CommandEnded (rea cmd)
  23. (if (and *OldClayer*
  24.           (wcmatch (strcase (car cmd)) "*DIM*")
  25.      )
  26.    (progn
  27.      (setvar 'clayer *OldClayer*)
  28.      (setq *OldClayer* nil)
  29.    )
  30. )
  31. )
  32. ;****************************************************************************
  33. (defun CommandReactor:CommandWillStart (rea cmd)
  34. (if (wcmatch (strcase (car cmd)) "*DIM*")
  35.            (progn
  36.                (setq *OldClayer* (getvar 'clayer))
  37.                (vla-add
  38.         (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
  39.           
  40. ; Kiezen van de DIM layer
  41.         (setq ADDL 0)
  42.                    (while (or (< ADDL 1) (> ADDL 2))
  43.                            (setq ADDL (getint "\nInput the DIM layer: Dim. (1), Dim. front (2): ")))
  44. ) ; end while
  45. ;ADDL = 1, Dimension layer
  46. (if (= ADDL 1)
  47.         (progn
  48.                 (command "_layer" "_m" "S-DIMENSIONS" "_c" "3" "" "")
  49.         ); progn
  50. ); if (=ADDL 1)
  51. ;ADDL = 2, Dimension front layer
  52. (if (= ADDL 2)
  53.         (progn
  54.                 (command "_layer" "_m" "S-DIMENSIONS front" "_c" "3" "" "")
  55.         ); progn
  56. ); if (=ADDL 2)
  57. (setvar 'clayer *OldClayer*)
  58.    )
  59. )
  60. )
  61. ;****************************************************************************
  62. (CommandReactor:Start)
  63. (princ)
  64. ;****************************************************************************
  65. ;****************************************************************************
  66. ;****************************************************************************
  67. ;****************************************************************************

 
请帮忙!
谢谢
回复

使用道具 举报

5

主题

1074

帖子

1088

银币

初来乍到

Rank: 1

铜币
9
发表于 2022-7-5 17:47:41 | 显示全部楼层
欢迎来到CADTutor。
 
你可能会有兴趣看看下面李的gem。
 
http://www.lee-mac.com/layerdirector.html
 
李的精彩网站是我最喜欢的网站之一。
 
谢谢李!
回复

使用道具 举报

7

主题

26

帖子

19

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 17:49:46 | 显示全部楼层
非常感谢。
 
我贴出的Lisp程序与李的Lisp程序原则相同。
我搜索的唯一“额外”是当你激活时,一个DIM命令,你可以选择一个数字,它会给你数字后面的层。
 
如果你加载我发布的LISP,你就会明白我的意思。
唯一的问题是Lisp程序或缺少什么,我不知道是什么。
 
 
我希望有人能在这方面帮助我。
回复

使用道具 举报

7

主题

26

帖子

19

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 17:54:12 | 显示全部楼层
我仍然需要帮助。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:58:09 | 显示全部楼层
在这里,我对其进行了一些修改:
 
希望这是你需要的。。。
M、 R。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 17:59:47 | 显示全部楼层
你好
 
虽然我认为这不是一个好的方式来使用反应堆这样的任务,但这取决于你们。
 
注:
[列表]
  • 最好将表示命令名称的字符串从*DIM*更改为所需的命令名称,因为使用当前字符串,即使调用命令DymStyle,也会触发reactor。
  • 不能对反应堆使用命令调用。
    [/列表]
     
    这是我的修改,以处理我认为的所有事件,当你不再需要反应堆时,用一个函数结束反应堆。
     
    1. (vl-load-com)
    2. ;;        Author: Tharwat Al Shoufi        ;;
    3. ;;        Date: 09.May.2016                ;;
    4. (defun c:CommandReactorStart nil
    5. (or *CommandReactor*
    6.      (setq *CommandReactor*
    7.             (vlr-command-reactor
    8.               nil
    9.               '(
    10.                 (:vlr-commandcancelled . CommandReactor:CommandBroken)
    11.                 (:vlr-commandended . CommandReactor:CommandEnded)
    12.                 (:vlr-commandfailed . CommandReactor:CommandBroken)
    13.                 (:vlr-commandwillstart . CommandReactor:CommandWillStart)
    14.                 )
    15.               )
    16.            )
    17.      )
    18. (prompt "\nCommand reactor Started.")
    19. (princ)
    20. )
    21. ;;                                        ;;
    22. ;;                                        ;;
    23. (defun c:CommandReactorEnd nil
    24. (if *CommandReactor*
    25.    (vlr-remove *CommandReactor*)
    26.    )
    27. (prompt "\nCommand reactor Disabled !")
    28. (princ)
    29. )
    30. ;;                                        ;;
    31. ;;                                        ;;
    32. (defun CommandReactor:CommandEnded (rea cmd)
    33. (if (and *OldClayer*
    34.           (tblsearch "LAYER" *OldClayer*)
    35.           (wcmatch (strcase (car cmd)) "*DIM*")
    36.           )
    37.    (progn
    38.      (setvar 'clayer *OldClayer*)
    39.      (setq *OldClayer* nil)
    40.      )
    41.    )
    42. (princ)
    43. )
    44. ;;                                        ;;
    45. ;;                                        ;;
    46. (defun CommandReactor:CommandBroken (rea cmd)
    47. (if (and *OldClayer*
    48.           (tblsearch "LAYER" *OldClayer*)
    49.           )
    50.    (progn
    51.      (setvar 'clayer *OldClayer*)
    52.      (setq *OldClayer* nil)
    53.      )
    54.    )
    55. (princ)
    56. )
    57. ;;                                        ;;
    58. ;;                                        ;;
    59. (defun CommandReactor:CommandWillStart (rea cmd / lay new name)
    60. (if
    61.    (and (wcmatch (strcase (car cmd)) "*DIM*")
    62.         (setq *OldClayer* (getvar 'clayer))
    63.         (progn
    64.           (while (not (and (setq lay
    65.                                   (getint
    66.                                     "\nInput the DIM layer: Dim. (1), Dim. front (2): "
    67.                                     )
    68.                                  )
    69.                            (< 0 lay 3)
    70.                            )
    71.                       )
    72.             (alert "\nNumber must be (1) or (2):")
    73.             )
    74.           lay
    75.           )
    76.         (setq
    77.           new (vla-add (vla-get-layers
    78.                          (vla-get-activedocument (vlax-get-acad-object))
    79.                          )
    80.                        (if (eq lay 1)
    81.                          (setq name "S-DIMENSIONS")
    82.                          (setq name "S-DIMENSIONS front")
    83.                          )
    84.                        )
    85.           )
    86.         )
    87.     (progn
    88.       (vla-put-color new AcGreen)
    89.       (setvar 'clayer name)
    90.       )
    91.     )
    92. (princ)
    93. )
    94. ;;                                        ;;
    95. (c:CommandReactorStart)
    96. (princ "\nType CommandReactorStart activate the reactor and CommandReactorEnd to Deactivate")
  • 回复

    使用道具 举报

    7

    主题

    26

    帖子

    19

    银币

    初来乍到

    Rank: 1

    铜币
    35
    发表于 2022-7-5 18:04:59 | 显示全部楼层
    @塔瓦特
     
    首先,谢谢你!这正是我想要的。
     
    第二,你说这不是一个好方法是什么意思?
    你还有什么建议?
     
    再次感谢!
     
    @马尔科·里巴
    也谢谢!但在执行连续命令时,有一个小问题。
     
     
    致以诚挚的问候!
    回复

    使用道具 举报

    63

    主题

    6297

    帖子

    6283

    银币

    后起之秀

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

    铜币
    358
    发表于 2022-7-5 18:08:11 | 显示全部楼层
     
    太好了,非常欢迎你。
     
     
    在我看来,最好的选择是让反应堆在没有用户干预的情况下在后台完成工作,但在您的情况下,您正在中断功能,询问用户有关表示层名称的关键字。
     
    因此,您也可以编写一个简单的例程,要求用户指定三个点,如果创建DimLinear或DimAligned,则可以使用与要求用户为层名称指定数字1或2相同的方式,并且根本不需要reactor。
     
    正如您可能知道的那样,命令名:dimstyle有一个短关键字来调用这个命令,它是d,所以运行我上面发布的代码并点击d,反应器将被触发,并要求您指定数字1或2。因此,这是另一个比reactor更简单的例程的问题,除非将完整的命令名修改为reactor的代码。
     
     
    你是在第一篇帖子中写这些代码的人吗?
     
    快乐的编码。
    回复

    使用道具 举报

    7

    主题

    26

    帖子

    19

    银币

    初来乍到

    Rank: 1

    铜币
    35
    发表于 2022-7-5 18:09:43 | 显示全部楼层
    不,我在第一篇文章中没有写代码。
    我在网上的某个地方找到了这个。
     
    我试图理解你在说什么,但我计划参加课程,学习编写LISP或vb。所以我希望我能理解
     
    我可以问你,如果我想添加另一个附加了另一层的数字,我应该怎么做吗?
     
     
    谢谢
    回复

    使用道具 举报

    63

    主题

    6297

    帖子

    6283

    银币

    后起之秀

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

    铜币
    358
    发表于 2022-7-5 18:14:46 | 显示全部楼层
    我可以先问一下你在创建什么样的维度吗?
    添加一个数字并不难,但我计划用另一个简单的例程更改反应堆代码。
     
    当你运行我上面发布的代码时,你是否试图点击d?你收到了什么信息?
    回复

    使用道具 举报

    发表回复

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

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

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

    GMT+8, 2025-3-13 04:58 , Processed in 0.367267 second(s), 72 queries .

    © 2020-2025 乐筑天下

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