乐筑天下

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

[编程交流] lisp preform se存在问题

[复制链接]

15

主题

243

帖子

228

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 06:16:20 | 显示全部楼层 |阅读模式
大家好,我正试图让我的lisp例程调用dcl对话框,根据用户选择的幻灯片执行不同的功能。
目前,lisp只使用1个修剪长度,而不管我是否尝试让它这样做。我知道我的问题在(action_tile)中,如果我能找到人帮我们纠正这个问题,我将不胜感激。提前谢谢,现在让我们看看代码:
 
 
  1. (action_tile "Slide12"
  2.       "(progn
  3.           (setq Return$ Slide12$)(setq doAction 'T)
  4.           (done_dialog)
  5.        )"
  6.     )
  7. (action_tile
  8.    "cancel"
  9.      "(done_dialog) (setq doAction nil)")
  10.          
  11.   (start_dialog)
  12.   (unload_dialog Dcl_Id%)
  13. (if doAction (SmallVLVInsert))
  14.   (princ)
  15. );defun c:Smallvalves
  16. (done_dialog)
  17. (defun SmallVLVInsert ( / ss p2 p3)
  18. (done_dialog)
  19. (command "attreq" "0")
  20. (if (eq 16384 (logand 16384 (getvar "osmode")))
  21. (setvar "OSMODE" (boole 6 (getvar "OSMODE") 16384)))
  22. (command "snap" "0.0625")
  23. (setq insertpt1 (getpoint "\nPick Insertion Point on line: "))
  24. (if (not (tblsearch "layer" "pid"))
  25. (entmake
  26.    (list
  27.      (cons 0 "Layer")
  28.      (cons 100 "AcDbSymbolTableRecord")
  29.      (cons 100 "AcDbLayerTableRecord")
  30.      (cons 2 "pid")
  31.      (cons 70 0)
  32.      (cons 62 3)
  33.      (cons 6 "Continuous")
  34.    )
  35. )
  36. )
  37. (setq Snap (getvar "osmode"))
  38.      
  39. (setvar "clayer" "pid")
  40. (command "_insert" Return$ insertpt1 "" "" "")
  41. (while (not ss)
  42. (setq ss (entsel "\nSelect line to break: "))
  43. );while
  44. ;(while (not p3)
  45.   (setvar 'osmode 613)
  46.   (setq p3 (getpoint "\nPick valve center:")
  47.         p2 (angle p3 (cadr ss))
  48.   )
  49. (command "break" ss "f" (polar p3 p2 0.093750)
  50.                        (polar p3 p2 -0.093750))
  51. (setvar "cmdecho" 1)
  52. (princ)
  53. (setvar "osmode" Snap)
  54. );if

 
 
 
这只是一个小摘录,但我相信它充分说明了我的问题。
如果我想在最后一个右括号下方添加第二个函数“;If”,
然后,例程似乎只看到第一个函数,并将在第一个defun SmallVlvInsert中指定的距离内修剪选定块周围的线。我想添加一个FlanSmlValveInsert,用于修剪。1172而不是SmallVlvInsert中的0.093750,但以相同的方式修剪,因为它工作良好。当然,我们会欣然接受任何升级或错误检查,并将其放入此代码中。
 
 
我希望这能奏效。。。。非常感谢。
回复

使用道具 举报

2

主题

389

帖子

387

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 06:21:12 | 显示全部楼层
不清楚为什么您希望调用另一个函数而不添加它。我只看到了调用一个函数(SmallVLVInsert)的地方。如果这是唯一调用过的函数,那么为什么还要调用其他函数呢?正如你所说,添加一个函数而不调用它并不能解决问题。你需要有一些用户选项来改变这种差距。
 
哦,欢迎来到CADTutor!
回复

使用道具 举报

15

主题

243

帖子

228

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 06:25:53 | 显示全部楼层
我想这就是我要问的-我是否需要为Flangedsmallvalves添加第二个函数,因为当以这种方式测试时,程序仍然会修剪到第一个函数中指定的长度。
 
我会将代码还原到定义了2个函数的位置,并在autocad中运行它,然后报告结果。
 
请稍等,谢谢你的帮助。
回复

使用道具 举报

15

主题

243

帖子

228

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 06:32:05 | 显示全部楼层
我将从对话框actions开始,在那里操作块开始。
 
  1.     ; Dialog Actions
  2.    (action_tile "Slide1"
  3.       "(progn
  4.           (setq Return$ Slide1$)(setq doAction 'T)
  5.           (done_dialog)
  6.        )"
  7.     )
  8.      (action_tile "Slide2"
  9.       "(progn
  10.           (setq Return$ Slide2$)(setq doAction 'T)
  11.           (done_dialog)
  12.        )"
  13.     )
  14.     (action_tile "Slide3"
  15.       "(progn
  16.           (setq Return$ Slide3$)(setq doAction 'T)
  17.           (done_dialog)
  18.        )"
  19.     )
  20.       (action_tile "Slide4"
  21.       "(progn
  22.           (setq Return$ Slide4$)(setq doAction 'T)
  23.           (done_dialog)
  24.        )"
  25.     )
  26.      (action_tile "Slide5"
  27.       "(progn
  28.           (setq Return$ Slide5$)(setq doAction 'T)
  29.           (done_dialog)
  30.        )"
  31.     )
  32.      (action_tile "Slide6"
  33.       "(progn
  34.           (setq Return$ Slide6$)(setq doAction 'T)
  35.           (done_dialog)
  36.        )"
  37.     )
  38.   (action_tile "Slide7"
  39.       "(progn
  40.           (setq Return$ Slide7$)(setq doAction 'T)
  41.           (done_dialog)
  42.        )"
  43.     )
  44.      (action_tile "Slide8"
  45.       "(progn
  46.           (setq Return$ Slide8$)(setq doAction 'T)
  47.           (done_dialog)
  48.        )"
  49.     )
  50.      (action_tile "Slide9"
  51.       "(progn
  52.           (setq Return$ Slide9$)(setq doAction 'T)
  53.           (done_dialog)
  54.        )"
  55.     )
  56.      (action_tile "Slide10"
  57.       "(progn
  58.           (setq Return$ Slide10$)(setq doAction 'T)
  59.           (done_dialog)
  60.        )"
  61.     )
  62.       (action_tile "Slide11"
  63.       "(progn
  64.           (setq Return$ Slide11$)(setq doAction 'T)
  65.           (done_dialog)
  66.        )"
  67.     )
  68.      (action_tile "Slide12"
  69.       "(progn
  70.           (setq Return$ Slide12$)(setq doAction nil)
  71.           (done_dialog)
  72.        )"
  73.     )
  74. (action_tile
  75.    "cancel"
  76.      "(done_dialog) (setq doAction nil)")
  77.          
  78.   (start_dialog)
  79.   (unload_dialog Dcl_Id%)
  80. (if doAction (SmallVLVInsert)(flansmallInsert))
  81.   (princ)
  82. );defun c:Smallvalves
  83. ;---------------------------------------------------------------------------------
  84. (done_dialog)
  85. (defun SmallVLVInsert ( / ss p2 p3)
  86. (done_dialog)
  87. (command "attreq" "0")
  88. (if (eq 16384 (logand 16384 (getvar "osmode")))
  89. (setvar "OSMODE" (boole 6 (getvar "OSMODE") 16384)))
  90. (command "snap" "0.0625")
  91. (setq insertpt1 (getpoint "\nPick Insertion Point on line: "))
  92. (if (not (tblsearch "layer" "pid"))
  93. (entmake
  94.    (list
  95.      (cons 0 "Layer")
  96.      (cons 100 "AcDbSymbolTableRecord")
  97.      (cons 100 "AcDbLayerTableRecord")
  98.      (cons 2 "pid")
  99.      (cons 70 0)
  100.      (cons 62 3)
  101.     (cons 6 "Continuous")
  102. )))
  103. (setq Snap (getvar "osmode"))     
  104. (setvar "clayer" "pid")
  105. (command "_insert" Return$ insertpt1 "" "" "")
  106. (while (not ss)
  107. (setq ss (entsel "\nSelect line to break: "))
  108. );while
  109.   (setvar 'osmode 613)
  110.   (setq p3 (getpoint "\nPick valve center:")
  111.         p2 (angle p3 (cadr ss)))
  112. (command "break" ss "f" (polar p3 p2 0.09375)
  113.                       (polar p3 p2 -0.09375))
  114. (setvar "cmdecho" 1)
  115. (princ)
  116. (setvar "osmode" Snap)
  117. );if
  118. -------------------------------------------------------------------------------
  119. (defun flansmallInsert ( / ss p4 p5)
  120. (done_dialog)
  121. (command "attreq" "0")
  122. (if (eq 16384 (logand 16384 (getvar "osmode")))
  123. (setvar "OSMODE" (boole 6 (getvar "OSMODE") 16384)))
  124. (command "snap" "0.0625")
  125. (setq insertpt1 (getpoint "\nPick Insertion Point on line: "))
  126. (if (not (tblsearch "layer" "pid"))
  127. (entmake
  128.    (list
  129.      (cons 0 "Layer")
  130.      (cons 100 "AcDbSymbolTableRecord")
  131.      (cons 100 "AcDbLayerTableRecord")
  132.      (cons 2 "pid")
  133.      (cons 70 0)
  134.      (cons 62 3)
  135.      (cons 6 "Continuous")
  136. )))
  137. (setq Snap (getvar "osmode"))
  138.      
  139. (setvar "clayer" "pid")
  140. (command "_insert" Return$ insertpt1 "" "" "")
  141. (while (not ss)
  142. (setq ss (entsel "\nSelect line to break: "))
  143. );while
  144.   (setvar 'osmode 613)
  145.   (setq p5 (getpoint "\nPick valve center:")
  146.         p4 (angle p5 (cadr ss)))
  147. (command "break" ss "f" (polar p5 p4 0.1172)
  148.                        (polar p5 p4 -0.1172))
  149. (setvar "cmdecho" 1)
  150. (princ)
  151. (setvar "osmode" Snap)
  152. );if
  153. -----------------------------------------------------------------------------

 
 
由于if-then-else语句,正如我所需要的那样,这实际上是可行的;
  1. (if doAction (SmallVLVInsert)(flansmallInsert))

 
唯一的问题是我的cancel按钮是doaction nil,现在我的cancel按钮正在执行(flanSallinsert)函数!
 
有没有其他方法可以让我的“取消”按钮在关闭对话框且不插入任何内容的位置正常工作?
 
再次感谢。。。。
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:35:22 | 显示全部楼层
  1. (if doAction ;; true
  2. (progn ;; do
  3. (SmallVLVInsert)
  4. (flansmallInsert)
  5. );; progn
  6. );; if

 
编辑:如果是doAction,则执行SmallVLVInsert和flansallinsert,如果不是,则不执行任何操作。。。
亨里克
回复

使用道具 举报

15

主题

243

帖子

228

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 06:39:50 | 显示全部楼层
对不起,亨里克,我无法理解你在那里告诉我什么。我看到if语句的编写方式有所不同,但我看不出这将如何修复我的cancel按钮以正确使用if语句。
你能再解释一下吗?
非常感谢您的时间和关注。
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:40:56 | 显示全部楼层
对不起,我刚刚编辑了帖子#5,添加评论。
 
亨里克
回复

使用道具 举报

15

主题

243

帖子

228

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 06:45:02 | 显示全部楼层
好的,这看起来似乎可行,但我如何告诉我的lisp,幻灯片1到幻灯片6是smallvlvinsert,幻灯片7到幻灯片12是flansallinsert,同时保持取消按钮正常工作(这意味着取消将退出函数并关闭例程,并将命令行返回给用户)
 
我相当确信这将在(action_tile)声明中完成。现在他们读到的是。。
 
  1. (action_tile "Slide1"
  2.       "(progn
  3.           (setq Return$ Slide1$)(setq doAction 'T)
  4.           (done_dialog)
  5.        )"
  6.     )

 
对于幻灯片1到幻灯片12,它们都为doAction分配了一个真值,该值调用SmallVlvInsert。我的问题是强制幻灯片6到幻灯片12执行FlanSmalInsert,其修剪长度与SmallVlvInsert不同。
 
我如何制作幻灯片6-12,使用flansmalinsert而不是SmallVlvInsert?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 06:49:10 | 显示全部楼层
使用action\u tile函数不需要progn函数
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:52:57 | 显示全部楼层
对不起,我知道如果doAction是真的,你想运行两个rotines。
您需要将另一个变量设置为另一个操作:
 
  1. (action_tile "Slide1"
  2.       "(progn
  3.           (setq Return$ Slide1$)(setq doAction 'T);; to slide 1 to 5
  4.           (done_dialog)
  5.        )"
  6.     )
  7. (action_tile "Slide1"
  8.       "(progn
  9.           (setq Return$ Slide6$)(setq doAction1 'T));; to slide 6 to 12
  10.           (done_dialog)
  11.        )"
  12.     )
  13. (if doAction (SmallVLVInsert));; if doAction T
  14. (if doAction1 (flansmallInsert));; if doAction1 T

 
亨里克
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 18:36 , Processed in 0.702578 second(s), 72 queries .

© 2020-2025 乐筑天下

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