Bhull1985 发表于 2022-7-6 06:16:20

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,但以相同的方式修剪,因为它工作良好。当然,我们会欣然接受任何升级或错误检查,并将其放入此代码中。
 
 
我希望这能奏效。。。。非常感谢。

neophoible 发表于 2022-7-6 06:21:12

不清楚为什么您希望调用另一个函数而不添加它。我只看到了调用一个函数(SmallVLVInsert)的地方。如果这是唯一调用过的函数,那么为什么还要调用其他函数呢?正如你所说,添加一个函数而不调用它并不能解决问题。你需要有一些用户选项来改变这种差距。
 
哦,欢迎来到CADTutor!

Bhull1985 发表于 2022-7-6 06:25:53

我想这就是我要问的-我是否需要为Flangedsmallvalves添加第二个函数,因为当以这种方式测试时,程序仍然会修剪到第一个函数中指定的长度。
 
我会将代码还原到定义了2个函数的位置,并在autocad中运行它,然后报告结果。
 
请稍等,谢谢你的帮助。

Bhull1985 发表于 2022-7-6 06:32:05

我将从对话框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)函数!
 
有没有其他方法可以让我的“取消”按钮在关闭对话框且不插入任何内容的位置正常工作?
 
再次感谢。。。。

hmsilva 发表于 2022-7-6 06:35:22


(if doAction ;; true
(progn ;; do
(SmallVLVInsert)
(flansmallInsert)
);; progn
);; if

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

Bhull1985 发表于 2022-7-6 06:39:50

对不起,亨里克,我无法理解你在那里告诉我什么。我看到if语句的编写方式有所不同,但我看不出这将如何修复我的cancel按钮以正确使用if语句。
你能再解释一下吗?
非常感谢您的时间和关注。

hmsilva 发表于 2022-7-6 06:40:56

对不起,我刚刚编辑了帖子#5,添加评论。
 
亨里克

Bhull1985 发表于 2022-7-6 06:45:02

好的,这看起来似乎可行,但我如何告诉我的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?

Tharwat 发表于 2022-7-6 06:49:10

使用action\u tile函数不需要progn函数

hmsilva 发表于 2022-7-6 06:52:57

对不起,我知道如果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
查看完整版本: lisp preform se存在问题