gschmidt 发表于 2022-7-5 20:02:48

检查GetString是否存在

你好
 
我想在用户选择的特定布局上创建一个表
使用getstring获取用户输入。
如何循环浏览布局,如果布局(名称)不存在,
获取新用户输入(getstring),直到用户键入现有输入?
 
这是我目前拥有的,只有当我键入一个存在的布局名称时,它才起作用:
 

(setq acadObj (vlax-get-acad-object))
(setq doc (vla-get-ActiveDocument acadObj))
(setq layouts (vla-get-Layouts doc))
       
(setq tabname (getstring T "\nType Layout Name for Table : "))
               
(vlax-for tabs layouts
(if (= (vla-get-Name tabs) tabname)
        (progn
                (vla-put-activelayout doc tabs)
                (setq pt (vlax-3d-point 312 289 0))
                (setq curspace (vla-get-paperspace doc))
                (setq objtable (vla-addtable curspace pt 11 10 4.652 9.356))
                                       
                (vla-setcelltextheight objtable 1 6 1.25)
                (vla-setcelltextheight objtable 1 7 1.25)
                (vla-setcelltextheight objtable 1 8 1.25)
                (vla-setcelltextheight objtable 1 9 1.25)
        )       
)
)

Lee Mac 发表于 2022-7-5 20:11:23

也许是这样?(未测试并在邮箱中键入!):
(defun c:test ( / lay lst obj )
   (setq lst (mapcar 'strcase (layoutlist)))
   (while
       (not
         (or
               (= "" (setq lay (getstring t "\nEnter layout for table: ")))
               (member (strcase lay) lst)
         )
       )
       (princ (strcat "\nLayout \"" lay "\" doesn't exist."))
   )
   (if (/= "" lay)
       (progn
         (setq obj
               (vla-addtable
                   (vla-get-block (vla-item (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) lay))
                   (vlax-3D-point 312 289)
                   11 10 4.652 9.356
               )
         )
         (foreach col '(6 7 8 9)
               (vla-setcelltextheight obj 1 col 1.25)
         )
       )
   )
   (princ)
)

gschmidt 发表于 2022-7-5 20:13:54

确切地Thanx伙计,我也在玩vla get block,但我从来没能让它工作。
 
从这里可以很容易地包括以下内容:此表仅在选定布局中不存在时创建?让它成为白痴证明

Lee Mac 发表于 2022-7-5 20:24:15

 
不客气!
 
 
除非该表具有一些定义属性,程序可以使用这些属性将其与目标布局中的其他可能表区分开来,例如,如果该表位于其自己的层上。

gschmidt 发表于 2022-7-5 20:29:11

是的,每个表都位于一个唯一的层上,因此我可以用?:
 
(setq table (ssget "x" '((0 . "ACAD_TABLE") (8 . "Layername"))))
 
但是,当我创建一个新表时,将为该表创建/设置一个新层。增量+1时会出现这种情况
e、 g.层名称以“29锚线-1”开始,每次执行LISP时,计数器都会将+1添加到一个新的层名称(如果它已经存在):“29锚线-2”、“29锚线-3”等。
那么我怎么知道用户是否随机选择了一个已经有表的现有布局,表在哪一层?

Lee Mac 发表于 2022-7-5 20:32:17

请尝试以下(未测试)代码:
(defun c:test ( / lay lst obj sel )
   (setq lst (mapcar 'strcase (layoutlist)))
   (while
       (and (/= "" (setq lay (getstring t "\nEnter layout for table: ")))
         (or
               (and
                   (not (member (strcase lay) lst))
                   (princ (strcat "\nLayout \"" lay "\" doesn't exist."))
               )
               (and
                   (setq sel (ssget "_X" (list '(0 . "ACAD_TABLE") '(8 . "29-anchor wires-#*") (cons 410 lay))))
                   (princ
                     (strcat
                           "\nA table already exists on layer \""
                           (cdr (assoc 8 (entget (ssname sel 0))))
                           "\" in layout \"" lay "\"."
                     )
                   )
               )
         )
       )
   )
   (if (/= "" lay)
       (progn
         (setq obj
               (vla-addtable
                   (vla-get-block (vla-item (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) lay))
                   (vlax-3D-point 312 289)
                   11 10 4.652 9.356
               )
         )
         (foreach col '(6 7 8 9)
               (vla-setcelltextheight obj 1 col 1.25)
         )
       )
   )
   (princ)
)

gschmidt 发表于 2022-7-5 20:37:51

嗯,我没有测试过它。
代码创建第一个表,如果布局不存在,则返回消息和新输入。
然而,第二张表并未绘制。。。。;错误:错误的参数类型:stringp nil
甚至在我可以输入布局名称之前,它就崩溃了
 

Lee Mac 发表于 2022-7-5 20:44:51

 
第二张表??

gschmidt 发表于 2022-7-5 20:50:38

附图中是管道安装驳船的一块。
该驳船有10根带锚的锚索,用于在铺设管道期间将驳船固定在其位置。
我们的工程师在XLSX表格中编写的特殊软件中计算锚索的长度和角度。
 
LISP必须根据XLSX表绘制锚索、锚和中线浮标。
并将XLSX值+每条锚索端点的坐标(LISP计算的WCS)放入布局中的表格中。
 
图纸中有多个布局,因为它是驳船多个位置的序列图。
每个位置都有自己的布局和表。
锚-TV-01的黄貂鱼。图纸
锚定。lsp
锚定模式。xlsx公司

Lee Mac 发表于 2022-7-5 20:53:30

所以要确认的是,是你的程序崩溃了,而不是我上面发布的代码。
页: [1] 2
查看完整版本: 检查GetString是否存在