woodman78 发表于 2022-7-6 10:09:29

修改块属性Lisp

你好
 
一段时间前,LeeMac为我编写了一个Lisp,用于从文本文件更新块attribs。块属性是项目名称和项目编号。来自文本文件中的同一行,因此该行如下所示:
L4535 Joe Bloggs道路改善方案。因此,TAG1 attrib变为“L4535 Joe Bloggs道路改善方案”,TAG2变为“L4535”。我想修改它,使TAG1在第一个空格之后成为一切,而TAG2保持原样。我不得不自己修改它很多次,但我迷失在其中。
 
如果有人能就此停下来,我将不胜感激。
 
谢谢
 

project_names : dialog { key = "dctitle";
spacer;
: list_box { label = "Choose a project name:"; key = "lst";
            alignment = centered; fixed_height = true;
            fixed_width = true; width = 60; height = 20; }
spacer;
ok_cancel;
}

 

(defun c:project_names (/ *error* _read
                      BLOCKNAME
                      DCFILENAME DCFLAG DCTAG
                      ELST ENT I POS PTR SS STR
                      STRFILENAME STRLST TAGSTRING TAGSTRING1 TAGSTRING2

                  )
(vl-load-com)
;; Lee Mac~01.03.10

(setq dcfilename"project_names.dcl"   ;; DCL Filename
       Strfilename "CCC_NNRDO_Project_Names.txt"   ;; Data Filename
       BlockName   "CCC_Project_Names"    ;; Block Name
       TagString1"TAG1"             ;; Tag String
       TagString2"TAG2"             ;; Tag String
)

(defun *error* (msg)
   (and dcTag (unload_dialog dcTag))
   (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
       (princ (strcat "\n** Error: " msg " **")))
   (princ))

(defun _read (file / ofile lst nl)
   (cond ((setq ofile (open file "r"))
      
            (while (setq nl (read-line ofile))
            (setq lst (cons nl lst)))
            (close ofile)))

   (reverse lst))

(cond ((not (setq i -1 ss (ssget "_X" (list (cons 0 "INSERT")
                                             (cons 2 BlockName) (cons 66 1)))))
          (princ (strcat "\n** No Blocks with Name: " BlockName " Found **")))
       ((not (setq Strfilename (findfile Strfilename)))
          (princ "\n** Data File not Found **"))
       ((not (setq StrLst (_read Strfilename)))
          (princ "\n** Data File Empty **"))
       ((<= (setq dcTag (load_dialog dcfilename)) 0)
          (princ "\n** Dialog Definition Not Found **"))
       ((not (new_dialog "project_names" dcTag))
          (princ "\n** Dialog Could not be Loaded **"))
       (t
          (start_list "lst")
          (mapcar (function add_list) StrLst)
          (end_list)
          (setq ptr (set_tile "lst" "0"))
      
          (action_tile"lst" "(setq ptr $value)")
          (setq dcFlag (start_dialog))
          (setq dcTag (unload_dialog dcTag) TagString1 (strcase TagString1)
                                          TagString2 (strcase TagString2)
                Str   (nth (atoi ptr) StrLst))
          (if (= 1 dcFlag)
            (while (setq ent (ssname ss (setq i (1+ i))))
            (while (not (eq "SEQEND" (cdr (assoc 0 (setq eLst (entget (setq ent (entnext ent))))))))
                (cond ((eq TagString1 (cdr (assoc 2 eLst)))
                     
                         (entupd
                           (cdr (assoc -1 (entmod (subst (cons 1 Str)
                                                         (assoc 1 eLst) eLst))))))
                      ((and (eq TagString2 (cdr (assoc 2 eLst)))
                              (setq pos (vl-string-position 32 Str)))
                         (entupd
                           (cdr (assoc -1 (entmod (subst (cons 1 (substr str 1 pos))
                                                         (assoc 1 eLst) eLst)))))))))
            (princ "\n*Cancel*"))))
(princ))

irneb 发表于 2022-7-6 10:44:35

那么,未经测试的修改现在已经过测试,它的工作处理。谢谢你的帮助,伊尔内布。非常感谢。

woodman78 发表于 2022-7-6 11:07:21

不客气!很高兴我能在脑海里这样做。。。意味着我的大脑还有几年的时间

irneb 发表于 2022-7-6 11:26:43

页: [1]
查看完整版本: 修改块属性Lisp