lisp preform se存在问题
大家好,我正试图让我的lisp例程调用dcl对话框,根据用户选择的幻灯片执行不同的功能。目前,lisp只使用1个修剪长度,而不管我是否尝试让它这样做。我知道我的问题在(action_tile)中,如果我能找到人帮我们纠正这个问题,我将不胜感激。提前谢谢,现在让我们看看代码:
(action_tile "Slide12"
"(progn
(setq Return$ Slide12$)(setq doAction 'T)
(done_dialog)
)"
)
(action_tile
"cancel"
"(done_dialog) (setq doAction nil)")
(start_dialog)
(unload_dialog Dcl_Id%)
(if doAction (SmallVLVInsert))
(princ)
);defun c:Smallvalves
(done_dialog)
(defun SmallVLVInsert ( / ss p2 p3)
(done_dialog)
(command "attreq" "0")
(if (eq 16384 (logand 16384 (getvar "osmode")))
(setvar "OSMODE" (boole 6 (getvar "OSMODE") 16384)))
(command "snap" "0.0625")
(setq insertpt1 (getpoint "\nPick Insertion Point on line: "))
(if (not (tblsearch "layer" "pid"))
(entmake
(list
(cons 0 "Layer")
(cons 100 "AcDbSymbolTableRecord")
(cons 100 "AcDbLayerTableRecord")
(cons 2 "pid")
(cons 70 0)
(cons 62 3)
(cons 6 "Continuous")
)
)
)
(setq Snap (getvar "osmode"))
(setvar "clayer" "pid")
(command "_insert" Return$ insertpt1 "" "" "")
(while (not ss)
(setq ss (entsel "\nSelect line to break: "))
);while
;(while (not p3)
(setvar 'osmode 613)
(setq p3 (getpoint "\nPick valve center:")
p2 (angle p3 (cadr ss))
)
(command "break" ss "f" (polar p3 p2 0.093750)
(polar p3 p2 -0.093750))
(setvar "cmdecho" 1)
(princ)
(setvar "osmode" Snap)
);if
这只是一个小摘录,但我相信它充分说明了我的问题。
如果我想在最后一个右括号下方添加第二个函数“;If”,
然后,例程似乎只看到第一个函数,并将在第一个defun SmallVlvInsert中指定的距离内修剪选定块周围的线。我想添加一个FlanSmlValveInsert,用于修剪。1172而不是SmallVlvInsert中的0.093750,但以相同的方式修剪,因为它工作良好。当然,我们会欣然接受任何升级或错误检查,并将其放入此代码中。
我希望这能奏效。。。。非常感谢。 不清楚为什么您希望调用另一个函数而不添加它。我只看到了调用一个函数(SmallVLVInsert)的地方。如果这是唯一调用过的函数,那么为什么还要调用其他函数呢?正如你所说,添加一个函数而不调用它并不能解决问题。你需要有一些用户选项来改变这种差距。
哦,欢迎来到CADTutor! 我想这就是我要问的-我是否需要为Flangedsmallvalves添加第二个函数,因为当以这种方式测试时,程序仍然会修剪到第一个函数中指定的长度。
我会将代码还原到定义了2个函数的位置,并在autocad中运行它,然后报告结果。
请稍等,谢谢你的帮助。 我将从对话框actions开始,在那里操作块开始。
; Dialog Actions
(action_tile "Slide1"
"(progn
(setq Return$ Slide1$)(setq doAction 'T)
(done_dialog)
)"
)
(action_tile "Slide2"
"(progn
(setq Return$ Slide2$)(setq doAction 'T)
(done_dialog)
)"
)
(action_tile "Slide3"
"(progn
(setq Return$ Slide3$)(setq doAction 'T)
(done_dialog)
)"
)
(action_tile "Slide4"
"(progn
(setq Return$ Slide4$)(setq doAction 'T)
(done_dialog)
)"
)
(action_tile "Slide5"
"(progn
(setq Return$ Slide5$)(setq doAction 'T)
(done_dialog)
)"
)
(action_tile "Slide6"
"(progn
(setq Return$ Slide6$)(setq doAction 'T)
(done_dialog)
)"
)
(action_tile "Slide7"
"(progn
(setq Return$ Slide7$)(setq doAction 'T)
(done_dialog)
)"
)
(action_tile "Slide8"
"(progn
(setq Return$ Slide8$)(setq doAction 'T)
(done_dialog)
)"
)
(action_tile "Slide9"
"(progn
(setq Return$ Slide9$)(setq doAction 'T)
(done_dialog)
)"
)
(action_tile "Slide10"
"(progn
(setq Return$ Slide10$)(setq doAction 'T)
(done_dialog)
)"
)
(action_tile "Slide11"
"(progn
(setq Return$ Slide11$)(setq doAction 'T)
(done_dialog)
)"
)
(action_tile "Slide12"
"(progn
(setq Return$ Slide12$)(setq doAction nil)
(done_dialog)
)"
)
(action_tile
"cancel"
"(done_dialog) (setq doAction nil)")
(start_dialog)
(unload_dialog Dcl_Id%)
(if doAction (SmallVLVInsert)(flansmallInsert))
(princ)
);defun c:Smallvalves
;---------------------------------------------------------------------------------
(done_dialog)
(defun SmallVLVInsert ( / ss p2 p3)
(done_dialog)
(command "attreq" "0")
(if (eq 16384 (logand 16384 (getvar "osmode")))
(setvar "OSMODE" (boole 6 (getvar "OSMODE") 16384)))
(command "snap" "0.0625")
(setq insertpt1 (getpoint "\nPick Insertion Point on line: "))
(if (not (tblsearch "layer" "pid"))
(entmake
(list
(cons 0 "Layer")
(cons 100 "AcDbSymbolTableRecord")
(cons 100 "AcDbLayerTableRecord")
(cons 2 "pid")
(cons 70 0)
(cons 62 3)
(cons 6 "Continuous")
)))
(setq Snap (getvar "osmode"))
(setvar "clayer" "pid")
(command "_insert" Return$ insertpt1 "" "" "")
(while (not ss)
(setq ss (entsel "\nSelect line to break: "))
);while
(setvar 'osmode 613)
(setq p3 (getpoint "\nPick valve center:")
p2 (angle p3 (cadr ss)))
(command "break" ss "f" (polar p3 p2 0.09375)
(polar p3 p2 -0.09375))
(setvar "cmdecho" 1)
(princ)
(setvar "osmode" Snap)
);if
-------------------------------------------------------------------------------
(defun flansmallInsert ( / ss p4 p5)
(done_dialog)
(command "attreq" "0")
(if (eq 16384 (logand 16384 (getvar "osmode")))
(setvar "OSMODE" (boole 6 (getvar "OSMODE") 16384)))
(command "snap" "0.0625")
(setq insertpt1 (getpoint "\nPick Insertion Point on line: "))
(if (not (tblsearch "layer" "pid"))
(entmake
(list
(cons 0 "Layer")
(cons 100 "AcDbSymbolTableRecord")
(cons 100 "AcDbLayerTableRecord")
(cons 2 "pid")
(cons 70 0)
(cons 62 3)
(cons 6 "Continuous")
)))
(setq Snap (getvar "osmode"))
(setvar "clayer" "pid")
(command "_insert" Return$ insertpt1 "" "" "")
(while (not ss)
(setq ss (entsel "\nSelect line to break: "))
);while
(setvar 'osmode 613)
(setq p5 (getpoint "\nPick valve center:")
p4 (angle p5 (cadr ss)))
(command "break" ss "f" (polar p5 p4 0.1172)
(polar p5 p4 -0.1172))
(setvar "cmdecho" 1)
(princ)
(setvar "osmode" Snap)
);if
-----------------------------------------------------------------------------
由于if-then-else语句,正如我所需要的那样,这实际上是可行的;
(if doAction (SmallVLVInsert)(flansmallInsert))
唯一的问题是我的cancel按钮是doaction nil,现在我的cancel按钮正在执行(flanSallinsert)函数!
有没有其他方法可以让我的“取消”按钮在关闭对话框且不插入任何内容的位置正常工作?
再次感谢。。。。
(if doAction ;; true
(progn ;; do
(SmallVLVInsert)
(flansmallInsert)
);; progn
);; if
编辑:如果是doAction,则执行SmallVLVInsert和flansallinsert,如果不是,则不执行任何操作。。。
亨里克 对不起,亨里克,我无法理解你在那里告诉我什么。我看到if语句的编写方式有所不同,但我看不出这将如何修复我的cancel按钮以正确使用if语句。
你能再解释一下吗?
非常感谢您的时间和关注。 对不起,我刚刚编辑了帖子#5,添加评论。
亨里克 好的,这看起来似乎可行,但我如何告诉我的lisp,幻灯片1到幻灯片6是smallvlvinsert,幻灯片7到幻灯片12是flansallinsert,同时保持取消按钮正常工作(这意味着取消将退出函数并关闭例程,并将命令行返回给用户)
我相当确信这将在(action_tile)声明中完成。现在他们读到的是。。
(action_tile "Slide1"
"(progn
(setq Return$ Slide1$)(setq doAction 'T)
(done_dialog)
)"
)
对于幻灯片1到幻灯片12,它们都为doAction分配了一个真值,该值调用SmallVlvInsert。我的问题是强制幻灯片6到幻灯片12执行FlanSmalInsert,其修剪长度与SmallVlvInsert不同。
我如何制作幻灯片6-12,使用flansmalinsert而不是SmallVlvInsert? 使用action\u tile函数不需要progn函数 对不起,我知道如果doAction是真的,你想运行两个rotines。
您需要将另一个变量设置为另一个操作:
(action_tile "Slide1"
"(progn
(setq Return$ Slide1$)(setq doAction 'T);; to slide 1 to 5
(done_dialog)
)"
)
(action_tile "Slide1"
"(progn
(setq Return$ Slide6$)(setq doAction1 'T));; to slide 6 to 12
(done_dialog)
)"
)
(if doAction (SmallVLVInsert));; if doAction T
(if doAction1 (flansmallInsert));; if doAction1 T
亨里克
页:
[1]
2