BIGAL 发表于 2022-7-5 19:37:41

这是一种不同的方法,使用您预加载的全局库defun,您可以在任何例程中使用它。这是2个问题的示例,以前在别处发布的代码用于1、2或3行输入。它动态创建dcl,因此不需要硬编码。
 
 

; 2 line dcl save as a library function a nd autoload
; sample code (ah:getval2 "line 1" 4 3 "line2" 8 7)

(defun AH:getval2 (title1 width1 limit1 title2 width2 limit2 / fo)
;(setq fname (strcat (getvar "SAVEFILEPATH") "\\getval2.dcl"))
(setq fname (strcat (getenv "TEMP") "\\getval2.dcl"))
(setq fo (open fname "w"))
(write-line "ddgetval2 : dialog {" fo)
(write-line " : column {" fo)
(write-line ": edit_box {" fo)
(write-line (strcat "    key = " (chr 34) "key1" (chr 34) ";") fo)
(write-line(strcat " label = "(chr 34) title1 (chr 34) ";" ) fo)
(write-line (strcat "   edit_width = " (rtos width1 2 0) ";" ) fo)
(write-line (strcat "   edit_limit = " (rtos limit1 2 0) ";" ) fo)
(write-line "   is_enabled = true ;" fo)
(write-line "    }" fo)
(write-line "spacer_1 ;" fo)
(write-line ": edit_box {" fo)
(write-line (strcat "    key = " (chr 34) "key2" (chr 34) ";") fo)
(write-line (strcat " label = "(chr 34) title2 (chr 34) ";") fo)
(write-line (strcat "   edit_width = " (rtos width2 2 0) ";" ) fo)
(write-line (strcat "   edit_limit = " (rtos limit2 2 0) ";" ) fo)
(write-line "   is_enabled = true ;" fo)
(write-line "    }" fo)
(write-line "    }" fo)
(write-line "spacer_1 ;" fo)
(write-line "ok_only;}" fo)
(close fo)

; code part
(setq dcl_id (load_dialogfname))
(if (not (new_dialog "ddgetval2" dcl_id))
(exit))
(mode_tile "key1" 3)
(action_tile "key1" "(setq val1 $value)")
(mode_tile "key2" 3)
(action_tile "key2" "(setq val2 $value)")

(start_dialog)
(done_dialog)
(unload_dialog dcl_id)
; returns the value of val1 and val2 as strings
)

 

(ah:getval2 "MOVE IN X OR Y enter value X or Y" 4 3"ENTER OFFSET VALUE -VE OR +VE <L-R U-D>" 8 7)
(IF (= VAL1 (STRCASE "X"))(c:ptx)(c:pty))

(defun c:PTX ( / Pt)
(setq oldsnap (getvar "osmode'))
(setq pt (getpoint "pick point"))
(setvar "osmode" 0)
(command "point" pt)
(Command "Move" "L" "" (list 0 0 0) (list (rtos val2) 0 0))
(setvar "osmode" oldsnap)
)

(defun c:PTY ( / Pt )
(setq oldsnap (getvar "osmode'))
(setq pt (getpoint "pick point"))
(setvar "osmode" 0)
(command "point" pt)
(Command "Move" "L" "" (list 0 0 0) (list 0 (rtos val2) 0))
(setvar "osmode" oldsnap)
)

EricDevault 发表于 2022-7-5 19:40:30

 
我必须删除
;(vla-regen (vla-get-activedocument (vlax-get-acad-object))
            ;acallviewports
         ; )
;(vl-load-com)
而且我也不知道如何把它改成“mval”除以12。此外,点的旧值是什么,点的新值是什么?
这肯定比我写得好,但剖析它并不容易。
我需要的是,插入点,根据dcl(我们已经涵盖了这两个)在给定的方向和距离上移动点,然后给出从原始插入点到新点的尺寸,最后通过所有点连接一条线。
关于通过所有点连接一条线的最后一部分在后面介绍,可能不可能。

Tharwat 发表于 2022-7-5 19:47:21

举个例子,剩下的你可以做。
 
(/ (read (get_tile \"mval\")) 12.)

BIGAL 发表于 2022-7-5 19:51:04

我有点困惑,你评论说,你想用它来处理多个点,你可以这么简单,按F8这将打开正交,你选择你的起点,然后用鼠标在所需的方向拖动,然后简单地键入所需的距离,你可以继续画正方形。如果使用pline选项,则很容易自动调暗pline。
 

; have a look at this try it with ortho on and dragging mouse typing distance its just so quick 2 lines of code compare to above
(command "_pline")
(while (= (getvar "cmdactive") 1 ) (command pause))

EricDevault 发表于 2022-7-5 19:53:12

 
用户将从一个网格开始,为了简单起见,假设它是一个3x3网格18x36。这是6行12列。点(节点)是每个周长点的布局,因为它穿过网格的垂直线或水平线。为了获得该点的位置,需要从网格的最近顶点到边缘进行测量。因此,用户选择从中测量的顶点,到边缘点的距离,然后选择该点从顶点开始的方向。同样,这只是沿周长布置点的过程的一部分。我已经自动化了网格布局,10次中有9次不是给定大小的简单3x3网格。
页: 1 [2]
查看完整版本: DCL和Lisp插入点a